diff --git a/package-lock.json b/package-lock.json index 2b07f1e4..e92d6fc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "@uiw/react-markdown-preview": "^5.1.1", "@uiw/react-md-editor": "^4.0.4", "@vercel/speed-insights": "^1.0.10", + "apis": "^0.1.2", "aws-sdk": "^2.1613.0", "aws4": "^1.12.0", "axios": "^1.6.8", @@ -38,6 +39,8 @@ "clerk": "^0.8.3", "date-fns": "^3.3.1", "framer-motion": "^11.0.3", + "google": "^2.1.0", + "googleapis": "^144.0.0", "i": "^0.3.7", "ical.js": "^2.0.1", "mongodb": "^6.5.0", @@ -4820,6 +4823,23 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ain2": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ain2/-/ain2-1.5.3.tgz", + "integrity": "sha512-c30Hes7riAXU/Q8RvSazrRXup6nzRzmUDAexAan8eSWtDKBDU3a7M/cayrg3iCPz39FcvtZheqjIb45aVDVEqA==", + "optionalDependencies": { + "unix-dgram": "0.2.2" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4875,6 +4895,39 @@ "node": ">= 8" } }, + "node_modules/apis": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/apis/-/apis-0.1.2.tgz", + "integrity": "sha512-xMZxsH76HU0d2jc+AL1Ln78TbIq680daW3PCT2etIcQkF5bivGc94OBIWz6gO+OZHfkAupsTsFHBu/myb46Edg==", + "dependencies": { + "ain2": "~1.5.2", + "authen": "~0.0.2", + "cookie": "~0.2.0", + "express": "~2.5.11", + "hyperquest": "~1.2.0", + "inherits": "~2.0.1", + "marked_types": "~0.0.1", + "nerr": "~0.1.0", + "ops": "~0.0.1", + "send": "~0.13.0", + "trun": "~0.0.1", + "units": "~0.0.1", + "valid": "~0.1.0", + "ws": "^0.8.0" + }, + "bin": { + "apis": "bin/apis" + } + }, + "node_modules/apis/node_modules/cookie": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz", + "integrity": "sha512-wQLxYCPiulwnfcvEZHF8YVj6cxvkpOBFgN1nL3Ukgh+D1+4A1SUKHdxR7h+T9kcuC54mFWoeZdnLT7ZeIC9Emw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5106,6 +5159,37 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/authen": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/authen/-/authen-0.0.2.tgz", + "integrity": "sha512-gqP6oJVaaI2JNCH/NxpV1lwA3p+XbFTPFRLIpbxomHjVCAYdG7Xl3s9TZFic5xJgwjPy2efrglEBcljm3nC/Ng==", + "dependencies": { + "async": "~0.1.17", + "cookie": "~0.0.4", + "marked_types": "~0.0.1", + "ncbt": "~0.0.1", + "ops": "~0.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/authen/node_modules/async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "engines": { + "node": "*" + } + }, + "node_modules/authen/node_modules/cookie": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.6.tgz", + "integrity": "sha512-f8pdZ++OJo3HtU2lBP0f56fVN7Lgq/ICviGy2XrGDgC0v3wd/2mke5fGr0LM3PEOz2AyHlQ1CAb2i/PxDRlIsQ==", + "engines": { + "node": "*" + } + }, "node_modules/autoprefixer": { "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", @@ -5306,6 +5390,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -5317,6 +5410,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bindings": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.1.1.tgz", + "integrity": "sha512-+6gA5uZCJPG/Mug3wkXopGaJ2I1WoYl8WYOhLh6WqCRIMcuutoXiOEpAN5UT+U9pySUyziTasnb0ESjbFixtfg==", + "optional": true + }, "node_modules/bl": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", @@ -5463,6 +5562,31 @@ "ieee754": "^1.1.4" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bufferutil": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", + "integrity": "sha512-rtE2s2JHFmfaldMwWFSUaPTxfxq6Um3xw9PEUK5bAfW83UTXp3WQpE7slnD2bd9GUgb0BA7JC/7ZxeBrIq+8Dw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bindings": "1.2.x", + "nan": "^2.0.5" + } + }, + "node_modules/bufferutil/node_modules/bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==", + "license": "MIT", + "optional": true + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -5492,6 +5616,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5641,6 +5794,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==", + "license": "MIT", + "dependencies": { + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "license": "BSD-2-Clause" + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5864,6 +6039,26 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/connect": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-1.9.2.tgz", + "integrity": "sha512-6Z9RPjQOHjaI47gK385djHVv7SEkRm1Y9AAvBhiI7gSXpO5sFktTkAD+dkbcaiEo2xaNlS1KIJU3XRxqbPLx6w==", + "deprecated": "connect 1.x series is deprecated", + "dependencies": { + "formidable": "1.0.x", + "mime": ">= 0.0.1", + "qs": ">= 0.4.0" + } + }, + "node_modules/connect/node_modules/formidable": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "integrity": "sha512-95MFT5qipMvUiesmuvGP1BI4hh5XWCzyTapiNJ/k8JBQda7rPy7UCWYItz2uZEdTgGNy1eInjzlL9Wx1O9fedg==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/constructs": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", @@ -5965,6 +6160,27 @@ "node": ">=4" } }, + "node_modules/css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==", + "license": "BSD-like", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" + } + }, + "node_modules/css-select/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, "node_modules/css-selector-parser": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.5.tgz", @@ -5990,6 +6206,15 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==", + "license": "BSD-like", + "engines": { + "node": "*" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -6155,6 +6380,15 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -6163,6 +6397,12 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "license": "MIT" + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -6235,6 +6475,44 @@ "csstype": "^3.0.2" } }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "license": "BSD-2-Clause" + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==", + "dependencies": { + "domelementtype": "1" + } + }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -6252,11 +6530,61 @@ "node": ">=10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.4.768", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.768.tgz", @@ -6366,12 +6694,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6413,7 +6739,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -6470,6 +6795,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -6966,6 +7297,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -6974,6 +7314,37 @@ "node": ">=0.8.x" } }, + "node_modules/express": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", + "integrity": "sha512-gc3jJ0P3Bh1Zjkxe0ICSNmjhDvYWKiXfQIdDWuRPr8S4IZAZexzJHjrzNz56LsRKHTL0OiXQq602GfwZjZ8xPQ==", + "deprecated": "express 2.x series is deprecated", + "dependencies": { + "connect": "1.x", + "mime": "1.2.4", + "mkdirp": "0.3.0", + "qs": "0.4.x" + }, + "bin": { + "express": "bin/express" + } + }, + "node_modules/express/node_modules/mime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz", + "integrity": "sha512-u4y8WFj7SnfbHxyzCMSV2nL/GKbfZ+lidPf1V4/XUKCJ49N6ttQWp/xnqpbMQEx3naBSt93i2qtPLFj/mjPDaA==", + "engines": { + "node": "*" + } + }, + "node_modules/express/node_modules/qs": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.4.2.tgz", + "integrity": "sha512-VAtfWeUtlBOnGiWFok2vOIMmwumiLmpqXDcXQcAEIQmLYgDbjrkHrcFBfth+YVDeRsz7jX44dhJr7IBJR0t/FQ==", + "engines": { + "node": "*" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -7284,6 +7655,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, + "node_modules/fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7338,6 +7718,83 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -7355,15 +7812,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7380,6 +7843,19 @@ "node": ">=6" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -7501,12 +7977,108 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/google": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/google/-/google-2.1.0.tgz", + "integrity": "sha512-z1lOESyokyPB+nVIZ96LyW6Hw3u3AWSSQAZD0L9IrncRSCqCU12wOK6CH8AKsmZe6+6rSX+lJgIRq8LdRiVAUg==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "cheerio": "^0.19.0", + "request": "^2.54.0" + } + }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-auth-library/node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis": { + "version": "144.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-144.0.0.tgz", + "integrity": "sha512-ELcWOXtJxjPX4vsKMh+7V+jZvgPwYMlEhQFiu2sa9Qmt5veX8nwXPksOWGGN6Zk4xCiLygUyaz7xGtcMO+Onxw==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", + "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7523,6 +8095,19 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/har-validator": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", @@ -7651,6 +8236,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -7659,9 +8245,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7977,13 +8564,66 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "license": "MIT", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "license": "BSD-like" + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/http-signature": { @@ -7999,6 +8639,29 @@ "node": ">=0.8" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyperquest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-1.2.0.tgz", + "integrity": "sha512-N6QwIYr/ENmsE3+0aNA/x8M+jHF0wedvc9ZiGAhg7KK6TxwtJTSR95b0invqaLFPqUrsngYUrc4LVmLtrl7kvw==", + "license": "MIT", + "dependencies": { + "duplexer2": "~0.0.2", + "through2": "~0.6.3" + } + }, "node_modules/i": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", @@ -8471,6 +9134,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -8653,6 +9328,15 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8724,6 +9408,27 @@ "node": ">=4.0" } }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kareem": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", @@ -8800,6 +9505,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -8872,6 +9583,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked_types": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/marked_types/-/marked_types-0.0.1.tgz", + "integrity": "sha512-AKsFS92tMWrQs5SL80CzugPA9jiPNrHHieuwNCj9G9O5Xe+kEn+3l3uKTS5ACD27ouy10Wy65Jpwgu9GDZ1jnA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -9770,6 +10498,16 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, "node_modules/mongodb": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.1.tgz", @@ -9973,6 +10711,13 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz", + "integrity": "sha512-n/DwWW228mhTWvHPMbewAgQadftYbZxrvC674Vv/rnpptpLxpOFL65wBrndtm+cpYs06OjqVCM76iIS0PDWfzA==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -9996,6 +10741,25 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/ncbt": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ncbt/-/ncbt-0.0.1.tgz", + "integrity": "sha512-Ov+NO2TnA0510vf4pOP85OMxHz1NjLhVbc7WQaqbfsBnDIhhSFhicQ6VR8l/JpywP2PadWSTrO5d1ZSq2XnYCw==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nerr": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/nerr/-/nerr-0.1.0.tgz", + "integrity": "sha512-BVXU9M52+Q90z1M28LUqAlA/SgWF+bocCwWlquRsS2LCXBnbi8SVo8FH1RLUmnl+f5BatRpezwr9Jr3cMBTwsQ==", + "dependencies": { + "inherits": "~2.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/next": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", @@ -10081,6 +10845,48 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -12578,9 +13384,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12692,6 +13502,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12701,6 +13523,14 @@ "wrappy": "1" } }, + "node_modules/ops": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ops/-/ops-0.0.1.tgz", + "integrity": "sha512-JvbqwBqfjohHDSzkPPXeJYaSHEhAcaj9FfiHxHeCbxDFMnemrd+CqRVdhyjI69utrZw81g9PxTh2u+7EX2L3Ug==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -12718,6 +13548,14 @@ "node": ">= 0.8.0" } }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -13191,6 +14029,15 @@ } ] }, + "node_modules/range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -14074,6 +14921,51 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg==", + "license": "MIT", + "dependencies": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "license": "MIT", + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -14130,14 +15022,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14284,6 +15231,12 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, + "node_modules/statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg==", + "license": "MIT" + }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", @@ -14887,6 +15840,16 @@ "node": ">=0.8" } }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -14959,6 +15922,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trun": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trun/-/trun-0.0.1.tgz", + "integrity": "sha512-AmsfxDRmq3hsH1puWXkn4mMxk/dDx1ebkTBjddD7FhJuvir2ZH3fwvWF0kCK6+EumOCSnnMsNKd6E58V3EbL8w==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -15111,6 +16082,12 @@ "node": ">=14.17" } }, + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==", + "license": "MIT" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -15235,6 +16212,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/units": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/units/-/units-0.0.2.tgz", + "integrity": "sha512-ZDqTe7H1V8O6zU5nar5AF1RS76P2jIsy04LhTYLkncg9Dv47MsK17H7wjvBP9womy9HpSO38stpmmeubhN8wzw==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -15243,6 +16228,21 @@ "node": ">= 4.0.0" } }, + "node_modules/unix-dgram": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-0.2.2.tgz", + "integrity": "sha512-4ILhAx4u5IZawNyh+ehSKzaNj+dCTapuQI4otvwPBJcKneFifnhD/NDnEZAG/4+cGGpHJjX3rsN57gcqEPriIA==", + "hasInstallScript": true, + "license": "ISC", + "optional": true, + "dependencies": { + "bindings": "~1.1.1", + "nan": "~2.0.8" + }, + "engines": { + "node": ">=0.7.9" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -15300,6 +16300,12 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "license": "BSD" + }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -15367,6 +16373,32 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/utf-8-validate": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.2.tgz", + "integrity": "sha512-CcV1z1L/e1wFAZwl8T6o1MmxIsg/ClZ4nmUolyIhb3ZJKbD/ZQTZXstCf6BiRcvaThSJVI8SqWLodWq/hnWDxQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bindings": "~1.2.1", + "nan": "~2.4.0" + } + }, + "node_modules/utf-8-validate/node_modules/bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==", + "license": "MIT", + "optional": true + }, + "node_modules/utf-8-validate/node_modules/nan": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", + "integrity": "sha512-Ym8Mn5u8D8Fwo7fHWhD7xEyKe/y/J8Epkxp6iJfZhtgnRva+GN+dQddiWGE2cksWCV92K/HzdHlJWo7aZJDlFw==", + "license": "MIT", + "optional": true + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -15396,6 +16428,18 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/valid": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/valid/-/valid-0.1.1.tgz", + "integrity": "sha512-EHEvGOJAhIM34qMBs6gnWTfp60nYIp1nkNzllPhP3lkpnYpre69Oj5J5JPqBwCYIOLYO7e6OVXkncxV02/U6vg==", + "dependencies": { + "marked_types": "~0.0.1", + "ops": "~0.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/vfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", @@ -15665,6 +16709,20 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/ws": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.1.tgz", + "integrity": "sha512-nDxDQDUMPnPqHYO4sWI9ln+ssUz1gxXCAFpczkv3LPQMmbC5vpfX1VZid6hqAaqNfI9bEvctLFNdZJBQPtdYCQ==", + "license": "MIT", + "dependencies": { + "options": ">=0.0.5", + "ultron": "1.0.x" + }, + "optionalDependencies": { + "bufferutil": "1.2.x", + "utf-8-validate": "1.2.x" + } + }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", diff --git a/package.json b/package.json index bf9ebe26..11369844 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@uiw/react-markdown-preview": "^5.1.1", "@uiw/react-md-editor": "^4.0.4", "@vercel/speed-insights": "^1.0.10", + "apis": "^0.1.2", "aws-sdk": "^2.1613.0", "aws4": "^1.12.0", "axios": "^1.6.8", @@ -43,6 +44,8 @@ "clerk": "^0.8.3", "date-fns": "^3.3.1", "framer-motion": "^11.0.3", + "google": "^2.1.0", + "googleapis": "^144.0.0", "i": "^0.3.7", "ical.js": "^2.0.1", "mongodb": "^6.5.0", diff --git a/src/app/admin/events/create/page.tsx b/src/app/admin/events/create/page.tsx index 7cc30061..a36f3dc8 100644 --- a/src/app/admin/events/create/page.tsx +++ b/src/app/admin/events/create/page.tsx @@ -22,6 +22,7 @@ import { } from "@chakra-ui/react"; import { AddIcon, ChevronDownIcon } from "@chakra-ui/icons"; import MiniCalendar from "../../../components/calendar/MiniCalendar"; +import GoogleCalendarPicker from "../../../components/calendar/GoogleCalendarPicker"; import { formatISO, parse } from "date-fns"; import { useRouter } from "next/navigation"; import { uploadFileS3Bucket } from "app/lib/clientActions"; @@ -41,7 +42,6 @@ type Group = { group_name: string; }; - export default function Page() { const { mutate } = useEventsAscending(); const toast = useToast(); @@ -157,11 +157,31 @@ export default function Page() { setCoverImage(file); } }; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + interface RecurringOptions { + startDate: string; + endDate: string; + daysOfWeek: string[]; + frequency: string; + } + + const [recurringOptions, setRecurringOptions] = useState({ + startDate: "", + endDate: "", + daysOfWeek: [], // initialize as empty string array + frequency: "weekly", + }); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Throw a Toast when event details are not complete and makes a post request to create event if details are complete const handleCreateEvent = async () => { debugger; // Form validation before submission + console.log("recurringOptions:", recurringOptions); + console.log("startDate:", recurringOptions.startDate); + console.log("endDate:", recurringOptions.endDate); + if ( !eventName || !eventType || @@ -177,19 +197,40 @@ export default function Page() { isClosable: true, }); return; - } else if (eventStart === "" || eventEnd === "" || activeDate === "") { + } + + // Validate dates + if (!recurringOptions.startDate || !recurringOptions.endDate) { toast({ title: "Error", - description: "Event date and time are not set", + description: "Event start and end dates are not set", status: "error", duration: 2500, isClosable: true, }); return; - } else if (eventEnd < eventStart) { + } + + if (recurringOptions.endDate < recurringOptions.startDate) { toast({ title: "Error", - description: "End time is before start time", + description: "End date cannot be before start date", + status: "error", + duration: 2500, + isClosable: true, + }); + return; + } + + // Validate weekly recurrence + if ( + recurringOptions.frequency === "weekly" && + recurringOptions.daysOfWeek.length === 0 + ) { + toast({ + title: "Error", + description: + "Please select at least one day for weekly recurring events", status: "error", duration: 2500, isClosable: true, @@ -229,13 +270,117 @@ export default function Page() { description, wheelchairAccessible: accessibilityAccommodation === "Yes", spanishSpeakingAccommodation: language === "Yes", - startTime: eventStart, - endTime: eventEnd, + startTime: recurringOptions.startDate, + endTime: recurringOptions.endDate, volunteerEvent: eventType === "Volunteer", groupsAllowed: groupsSelected.map((group) => group._id as string), groupsOnly: onlyGroups, + ...(recurringOptions.frequency && { + recurring: { + frequency: recurringOptions.frequency, + daysOfWeek: recurringOptions.daysOfWeek, + endDate: recurringOptions.endDate, + }, + }), }; + const createGoogleCalendarEvent = async (eventData: any) => { + try { + // Parse the start date and times + const startDate = new Date(eventData.startTime); + const [startHours, startMinutes] = eventData.startTime + .split("T")[1] + .split(":"); + const [endHours, endMinutes] = eventData.endTime + .split("T")[1] + .split(":"); + + // For both recurring and non-recurring events, end time should be on the same day as start time + const eventStartDateTime = new Date(startDate); + eventStartDateTime.setHours( + parseInt(startHours), + parseInt(startMinutes), + 0 + ); + + const eventEndDateTime = new Date(startDate); // Use start date for end time + eventEndDateTime.setHours(parseInt(endHours), parseInt(endMinutes), 0); + + let calendarEventData = { + summary: eventData.eventName, + location: eventData.location, + description: eventData.description, + start: { + dateTime: eventStartDateTime.toISOString(), + timeZone: "America/Los_Angeles", + }, + end: { + dateTime: eventEndDateTime.toISOString(), + timeZone: "America/Los_Angeles", + }, + } as { + summary: string; + location: string; + description: string; + start: { dateTime: string; timeZone: string }; + end: { dateTime: string; timeZone: string }; + recurrence?: string[]; + }; + + // Add recurrence rule only if it's a recurring event + if (eventData.recurring && eventData.recurring.frequency) { + const untilDate = new Date(eventData.recurring.endDate); + untilDate.setHours(23, 59, 59); + const untilDateString = + untilDate.toISOString().replace(/[:-]/g, "").split(".")[0] + "Z"; + + let recurrenceRule = `FREQ=${eventData.recurring.frequency.toUpperCase()};UNTIL=${untilDateString}`; + + if ( + eventData.recurring.frequency === "weekly" && + eventData.recurring.daysOfWeek.length > 0 + ) { + const selectedDays = eventData.recurring.daysOfWeek.filter( + (day) => day + ); + if (selectedDays.length > 0) { + recurrenceRule += `;BYDAY=${selectedDays.join(",")}`; + } + } else if (eventData.recurring.frequency === "monthly") { + const dayOfWeek = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"][ + startDate.getDay() + ]; + const weekOfMonth = Math.ceil(startDate.getDate() / 7); + recurrenceRule += `;BYDAY=${weekOfMonth}${dayOfWeek}`; + } + + calendarEventData.recurrence = [`RRULE:${recurrenceRule}`]; + } + + console.log("Sending to Google Calendar:", calendarEventData); + + const response = await fetch("/api/google-calendar", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(calendarEventData), + }); + + if (!response.ok) { + const errorData = await response.json(); + console.error("Google Calendar API Error:", errorData); + throw new Error( + errorData.details || "Failed to create Google Calendar event" + ); + } + + return await response.json(); + } catch (error) { + console.error("Error creating Google Calendar event:", error); + throw error; + } + }; // Attempt to create event via API and handle response try { const response = await fetch("/api/events", { @@ -251,6 +396,22 @@ export default function Page() { } const event: IEvent = await response.json(); + + // Create Google Calendar event + try { + await createGoogleCalendarEvent(eventData); + } catch (calendarError) { + console.error("Failed to create Google Calendar event:", calendarError); + // Optionally show a warning toast but continue with the flow + toast({ + title: "Warning", + description: "Event created but failed to sync with Google Calendar", + status: "warning", + duration: 5000, + isClosable: true, + }); + } + // send confirmation email if button was checked if (sendEmailInvitees) { const res = await fetch( @@ -532,7 +693,7 @@ export default function Page() { /> - + Spanish Speaking Accommodation @@ -553,7 +714,7 @@ export default function Page() { > - + Accessibility Accommodation @@ -576,7 +737,7 @@ export default function Page() { /> - + Only Available to Selected Groups @@ -598,7 +759,9 @@ export default function Page() { }} /> - {onlyGroups && groups && ( + {/* {onlyGroups && groups && ( #remove the comments on this line and + the brackets below have the button be hidden again, just in case we + want it hidden in the guture*/}
- )} + {/* )} */} - - Date/Time - {/* MiniCalendar */} - + {/* handleTimeChange(start, end)} onDateChange={(date) => handleDateChangeFromCalendar(date)} /> - + */} + + + + Date/Time + + { + setEventStart(start); + setEventEnd(end); + }} + onRecurringOptionsChange={(options: RecurringOptions) => { + setRecurringOptions(options); + }} + /> + + + diff --git a/src/app/api/google-calendar/route.ts b/src/app/api/google-calendar/route.ts new file mode 100644 index 00000000..2a40be52 --- /dev/null +++ b/src/app/api/google-calendar/route.ts @@ -0,0 +1,78 @@ +import { NextResponse } from 'next/server'; +import { google } from 'googleapis'; + +export async function POST(request: Request) { + try { + const body = await request.json(); + console.log('Received request body:', body); + + // Log environment variables (remove sensitive info in production) + console.log('Environment check:', { + hasClientEmail: !!process.env.GOOGLE_CLIENT_EMAIL, + hasPrivateKey: !!process.env.GOOGLE_PRIVATE_KEY, + hasCalendarId: !!process.env.GOOGLE_CALENDAR_ID, + }); + + // Make sure we have all required environment variables + if (!process.env.GOOGLE_CLIENT_EMAIL || !process.env.GOOGLE_PRIVATE_KEY || !process.env.GOOGLE_CALENDAR_ID) { + throw new Error('Missing required environment variables'); + } + + const auth = new google.auth.GoogleAuth({ + credentials: { + client_email: process.env.GOOGLE_CLIENT_EMAIL, + private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'), + }, + scopes: ['https://www.googleapis.com/auth/calendar'], + }); + + const calendar = google.calendar({ version: 'v3', auth }); + + // Log the event data we're about to send + console.log('Creating event with data:', { + calendarId: process.env.GOOGLE_CALENDAR_ID, + summary: body.summary, + start: body.start, + end: body.end, + }); + + const event = await calendar.events.insert({ + calendarId: process.env.GOOGLE_CALENDAR_ID, + requestBody: { + summary: body.summary, + location: body.location, + description: body.description, + start: body.start, + end: body.end, + recurrence: body.recurrence, + }, + }); + + console.log('Event created successfully:', event.data); + return NextResponse.json(event.data); + } catch (error: any) { + console.error('Detailed API error:', { + message: error.message, + stack: error.stack, + response: error.response?.data, + env: { + hasClientEmail: !!process.env.GOOGLE_CLIENT_EMAIL, + hasPrivateKey: !!process.env.GOOGLE_PRIVATE_KEY, + hasCalendarId: !!process.env.GOOGLE_CALENDAR_ID, + } + }); + + return NextResponse.json( + { + error: 'Failed to create calendar event', + details: error.message, + env: { + hasClientEmail: !!process.env.GOOGLE_CLIENT_EMAIL, + hasPrivateKey: !!process.env.GOOGLE_PRIVATE_KEY, + hasCalendarId: !!process.env.GOOGLE_CALENDAR_ID, + } + }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/src/app/components/calendar/GoogleCalendarPicker.tsx b/src/app/components/calendar/GoogleCalendarPicker.tsx new file mode 100644 index 00000000..eb4c8f9d --- /dev/null +++ b/src/app/components/calendar/GoogleCalendarPicker.tsx @@ -0,0 +1,244 @@ +"use client"; + +import React, { useState } from "react"; +import { + Box, + VStack, + HStack, + Checkbox, + Text, + Input, + FormControl, + FormLabel, + Stack, + Select, + Switch, +} from "@chakra-ui/react"; + +interface DayOfWeek { + label: string; + value: string; +} + +interface GoogleCalendarPickerProps { + onDateTimeSelect: (startTime: string, endTime: string) => void; + onRecurringOptionsChange: (recurringOptions: { + isRecurring: boolean; + startDate: string; + endDate: string; + daysOfWeek: string[]; + frequency: string; + }) => void; +} + +const GoogleCalendarPicker: React.FC = ({ + onDateTimeSelect, + onRecurringOptionsChange, +}) => { + const calendarId = encodeURIComponent( + process.env.NEXT_PUBLIC_GOOGLE_CALENDAR_ID || "" + ); + const [isRecurring, setIsRecurring] = useState(false); + const [startDate, setStartDate] = useState(""); + const [endDate, setEndDate] = useState(""); + const [startTime, setStartTime] = useState(""); + const [endTime, setEndTime] = useState(""); + const [selectedDays, setSelectedDays] = useState([]); + const [frequency, setFrequency] = useState("weekly"); + + const daysOfWeek: DayOfWeek[] = [ + { label: "Sunday", value: "SU" }, + { label: "Monday", value: "MO" }, + { label: "Tuesday", value: "TU" }, + { label: "Wednesday", value: "WE" }, + { label: "Thursday", value: "TH" }, + { label: "Friday", value: "FR" }, + { label: "Saturday", value: "SA" }, + ]; + + const handleDateTimeChange = () => { + const fullStartDateTime = `${startDate}T${startTime}:00`; + const fullEndDateTime = `${isRecurring ? endDate : startDate}T${endTime}:00`; + onDateTimeSelect(fullStartDateTime, fullEndDateTime); + }; + + const updateRecurringOptions = () => { + console.log("Current values:", { + startDate, + startTime, + endDate, + endTime, + }); + + if (startDate) { + const fullStartDate = startTime ? `${startDate}T${startTime}` : startDate; + const fullEndDate = + endDate && endTime ? `${endDate}T${endTime}` : endDate || startDate; + + console.log("Updating with dates:", { + fullStartDate, + fullEndDate, + }); + + onRecurringOptionsChange({ + isRecurring, + startDate: fullStartDate, + endDate: fullEndDate, + daysOfWeek: selectedDays, + frequency: isRecurring ? frequency : "", + }); + } + }; + + return ( + + + + + Recurring Event? + + { + setIsRecurring(e.target.checked); + if (!e.target.checked) { + setSelectedDays([]); + setFrequency("weekly"); + updateRecurringOptions(); + } + if (!e.target.checked) { + setEndDate(startDate); + } + updateRecurringOptions(); + }} + /> + + + + {/* Date Selection */} + + + Start Date + { + console.log("Start date changed:", e.target.value); + setStartDate(e.target.value); + if (!isRecurring) { + setEndDate(e.target.value); + } + updateRecurringOptions(); + }} + /> + + + + End Date + { + setEndDate(e.target.value); + handleDateTimeChange(); + updateRecurringOptions(); + }} + isDisabled={!isRecurring} + opacity={isRecurring ? 1 : 0.5} + _disabled={{ + cursor: "not-allowed", + opacity: 0.5, + }} + /> + + + + {/* Time Selection */} + + + Start Time + { + console.log("Start time changed:", e.target.value); + setStartTime(e.target.value); + updateRecurringOptions(); + }} + /> + + + + End Time + { + console.log("End time changed:", e.target.value); + setEndTime(e.target.value); + updateRecurringOptions(); + }} + /> + + + + {isRecurring && ( + <> + + Repeat + + + + {frequency === "weekly" && ( + + Repeat on + + {daysOfWeek.map((day: DayOfWeek) => ( + { + const newDays = selectedDays.includes(day.value) + ? selectedDays.filter((d) => d !== day.value) + : [...selectedDays, day.value]; + setSelectedDays(newDays); + updateRecurringOptions(); + }} + > + {day.label} + + ))} + + + )} + + )} + + + + ); +}; + +export default GoogleCalendarPicker;