diff --git a/client/.tool-versions b/client/.tool-versions new file mode 100644 index 00000000..f6efb75c --- /dev/null +++ b/client/.tool-versions @@ -0,0 +1 @@ +nodejs 18.17.1 diff --git a/client/next.config.js b/client/next.config.js index c8ea7154..f11bb573 100644 --- a/client/next.config.js +++ b/client/next.config.js @@ -10,6 +10,12 @@ const nextConfig = { { hostname: "oaidalleapiprodscus.blob.core.windows.net", }, + { + hostname: "replicate.delivery", + }, + { + hostname: "pbxt.replicate.delivery", + }, ], }, }; @@ -44,5 +50,5 @@ module.exports = withSentryConfig( // Automatically tree-shake Sentry logger statements to reduce bundle size disableLogger: true, - } + }, ); diff --git a/client/package.json b/client/package.json index 017fbd89..35b0df43 100644 --- a/client/package.json +++ b/client/package.json @@ -10,41 +10,41 @@ "test:e2e": "playwright test" }, "dependencies": { - "@sentry/nextjs": "^7.63.0", - "@tanstack/react-query": "^4.32.6", + "@sentry/nextjs": "^7.65.0", + "@tanstack/react-query": "^4.33.0", "@upstash/ratelimit": "^0.4.3", "@vercel/analytics": "^1.0.2", "@vercel/kv": "^0.2.2", "@xstate/react": "^3.2.2", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.15", "clsx": "^2.0.0", - "eslint": "8.47.0", - "eslint-config-next": "^13.4.13", - "framer-motion": "^10.15.1", - "next": "^13.4.13", - "openai-edge": "^1.2.2", - "postcss": "8.4.27", + "eslint": "8.48.0", + "eslint-config-next": "^13.4.19", + "framer-motion": "^10.16.1", + "next": "^13.4.19", + "openai": "^4.3.1", + "postcss": "8.4.29", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hot-toast": "^2.4.1", "react-icons": "^4.10.1", - "sharp": "^0.32.4", + "sharp": "^0.32.5", "socket.io-client": "^4.7.2", "tailwind-merge": "^1.14.0", "tailwindcss": "^3.3.3", - "typescript": "5.1.6", + "typescript": "5.2.2", "xstate": "^4.38.2", "zustand": "^4.4.1" }, "devDependencies": { - "@playwright/test": "^1.37.0", + "@playwright/test": "^1.37.1", "@tailwindcss/typography": "^0.5.9", - "@types/node": "^20.4.10", - "@types/react": "^18.2.20", + "@types/node": "^20.5.7", + "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "eslint-config-prettier": "^9.0.0", - "prettier": "^3.0.1", - "prettier-plugin-tailwindcss": "^0.5.2" + "prettier": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.3" }, "engines": { "node": "18" diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 03272ca1..ab5b85b4 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -6,11 +6,11 @@ settings: dependencies: '@sentry/nextjs': - specifier: ^7.63.0 - version: 7.63.0(next@13.4.13)(react@18.2.0) + specifier: ^7.65.0 + version: 7.65.0(next@13.4.19)(react@18.2.0) '@tanstack/react-query': - specifier: ^4.32.6 - version: 4.32.6(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.33.0 + version: 4.33.0(react-dom@18.2.0)(react@18.2.0) '@upstash/ratelimit': specifier: ^0.4.3 version: 0.4.3 @@ -22,31 +22,31 @@ dependencies: version: 0.2.2 '@xstate/react': specifier: ^3.2.2 - version: 3.2.2(@types/react@18.2.20)(react@18.2.0)(xstate@4.38.2) + version: 3.2.2(@types/react@18.2.21)(react@18.2.0)(xstate@4.38.2) autoprefixer: - specifier: 10.4.14 - version: 10.4.14(postcss@8.4.27) + specifier: 10.4.15 + version: 10.4.15(postcss@8.4.29) clsx: specifier: ^2.0.0 version: 2.0.0 eslint: - specifier: 8.47.0 - version: 8.47.0 + specifier: 8.48.0 + version: 8.48.0 eslint-config-next: - specifier: ^13.4.13 - version: 13.4.13(eslint@8.47.0)(typescript@5.1.6) + specifier: ^13.4.19 + version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) framer-motion: - specifier: ^10.15.1 - version: 10.15.1(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.1 + version: 10.16.1(react-dom@18.2.0)(react@18.2.0) next: - specifier: ^13.4.13 - version: 13.4.13(react-dom@18.2.0)(react@18.2.0) - openai-edge: - specifier: ^1.2.2 - version: 1.2.2 + specifier: ^13.4.19 + version: 13.4.19(react-dom@18.2.0)(react@18.2.0) + openai: + specifier: ^4.3.1 + version: 4.3.1 postcss: - specifier: 8.4.27 - version: 8.4.27 + specifier: 8.4.29 + version: 8.4.29 react: specifier: ^18.2.0 version: 18.2.0 @@ -60,8 +60,8 @@ dependencies: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) sharp: - specifier: ^0.32.4 - version: 0.32.4 + specifier: ^0.32.5 + version: 0.32.5 socket.io-client: specifier: ^4.7.2 version: 4.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) @@ -72,14 +72,14 @@ dependencies: specifier: ^3.3.3 version: 3.3.3 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 xstate: specifier: ^4.38.2 version: 4.38.2 zustand: specifier: ^4.4.1 - version: 4.4.1(@types/react@18.2.20)(react@18.2.0) + version: 4.4.1(@types/react@18.2.21)(react@18.2.0) optionalDependencies: bufferutil: @@ -91,29 +91,29 @@ optionalDependencies: devDependencies: '@playwright/test': - specifier: ^1.37.0 - version: 1.37.0 + specifier: ^1.37.1 + version: 1.37.1 '@tailwindcss/typography': specifier: ^0.5.9 version: 0.5.9(tailwindcss@3.3.3) '@types/node': - specifier: ^20.4.10 - version: 20.4.10 + specifier: ^20.5.7 + version: 20.5.7 '@types/react': - specifier: ^18.2.20 - version: 18.2.20 + specifier: ^18.2.21 + version: 18.2.21 '@types/react-dom': specifier: ^18.2.7 version: 18.2.7 eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.47.0) + version: 9.0.0(eslint@8.48.0) prettier: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.0.3 + version: 3.0.3 prettier-plugin-tailwindcss: - specifier: ^0.5.2 - version: 0.5.2(prettier@3.0.1) + specifier: ^0.5.3 + version: 0.5.3(prettier@3.0.3) packages: @@ -125,8 +125,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - /@babel/runtime@7.22.10: - resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + /@babel/runtime@7.22.11: + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -146,17 +146,17 @@ packages: dev: false optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} /@eslint/eslintrc@2.1.2: @@ -175,12 +175,12 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -221,18 +221,18 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@next/env@13.4.13: - resolution: {integrity: sha512-fwz2QgVg08v7ZL7KmbQBLF2PubR/6zQdKBgmHEl3BCyWTEDsAQEijjw2gbFhI1tcKfLdOOJUXntz5vZ4S0Polg==} + /@next/env@13.4.19: + resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==} dev: false - /@next/eslint-plugin-next@13.4.13: - resolution: {integrity: sha512-RpZeXlPxQ9FLeYN84XHDqRN20XxmVNclYCraLYdifRsmibtcWUWdwE/ANp2C8kgesFRsvwfsw6eOkYNl9sLJ3A==} + /@next/eslint-plugin-next@13.4.19: + resolution: {integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==} dependencies: glob: 7.1.7 dev: false - /@next/swc-darwin-arm64@13.4.13: - resolution: {integrity: sha512-ZptVhHjzUuivnXMNCJ6lER33HN7lC+rZ01z+PM10Ows21NHFYMvGhi5iXkGtBDk6VmtzsbqnAjnx4Oz5um0FjA==} + /@next/swc-darwin-arm64@13.4.19: + resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -240,8 +240,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.13: - resolution: {integrity: sha512-t9nTiWCLApw8W4G1kqJyYP7y6/7lyal3PftmRturIxAIBlZss9wrtVN8nci50StDHmIlIDxfguYIEGVr9DbFTg==} + /@next/swc-darwin-x64@13.4.19: + resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -249,8 +249,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.13: - resolution: {integrity: sha512-xEHUqC8eqR5DHe8SOmMnDU1K3ggrJ28uIKltrQAwqFSSSmzjnN/XMocZkcVhuncuxYrpbri0iMQstRyRVdQVWg==} + /@next/swc-linux-arm64-gnu@13.4.19: + resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -258,8 +258,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.13: - resolution: {integrity: sha512-sNf3MnLAm8rquSSAoeD9nVcdaDeRYOeey4stOWOyWIgbBDtP+C93amSgH/LPTDoUV7gNiU6f+ghepTjTjRgIUQ==} + /@next/swc-linux-arm64-musl@13.4.19: + resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -267,8 +267,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.13: - resolution: {integrity: sha512-WhcRaJJSHyx9OWmKjjz+OWHumiPZWRqmM/09Bt7Up4UqUJFFhGExeztR4trtv3rflvULatu9IH/nTV8fUUgaMA==} + /@next/swc-linux-x64-gnu@13.4.19: + resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -276,8 +276,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.13: - resolution: {integrity: sha512-+Y4LLhOWWZQIDKVwr2R17lq2KSN0F1c30QVgGIWfnjjHpH8nrIWHEndhqYU+iFuW8It78CiJjQKTw4f51HD7jA==} + /@next/swc-linux-x64-musl@13.4.19: + resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -285,8 +285,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.13: - resolution: {integrity: sha512-rWurdOR20uxjfqd1X9vDAgv0Jb26KjyL8akF9CBeFqX8rVaBAnW/Wf6A2gYEwyYY4Bai3T7p1kro6DFrsvBAAw==} + /@next/swc-win32-arm64-msvc@13.4.19: + resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -294,8 +294,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.13: - resolution: {integrity: sha512-E8bSPwRuY5ibJ3CzLQmJEt8qaWrPYuUTwnrwygPUEWoLzD5YRx9SD37oXRdU81TgGwDzCxpl7z5Nqlfk50xAog==} + /@next/swc-win32-ia32-msvc@13.4.19: + resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -303,8 +303,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.13: - resolution: {integrity: sha512-4KlyC6jWRubPnppgfYsNTPeWfGCxtWLh5vaOAW/kdzAk9widqho8Qb5S4K2vHmal1tsURi7Onk2MMCV1phvyqA==} + /@next/swc-win32-x64-msvc@13.4.19: + resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -330,13 +330,13 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@playwright/test@1.37.0: - resolution: {integrity: sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==} + /@playwright/test@1.37.1: + resolution: {integrity: sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==} engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.4.10 - playwright-core: 1.37.0 + '@types/node': 20.5.7 + playwright-core: 1.37.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -350,7 +350,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@2.78.0) + '@rollup/pluginutils': 5.0.4(rollup@2.78.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 @@ -359,8 +359,8 @@ packages: rollup: 2.78.0 dev: false - /@rollup/pluginutils@5.0.2(rollup@2.78.0): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + /@rollup/pluginutils@5.0.4(rollup@2.78.0): + resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0 @@ -378,26 +378,26 @@ packages: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} dev: false - /@sentry-internal/tracing@7.63.0: - resolution: {integrity: sha512-Fxpc53p6NGvLSURg3iRvZA0k10K9yfeVhtczvJnpX30POBuV41wxpkLHkb68fjksirjEma1K3Ut1iLOEEDpPQg==} + /@sentry-internal/tracing@7.65.0: + resolution: {integrity: sha512-TEYkiq5vKr1Y79YIu+UYr1sO3vEMttQOBsOZLziDbqiC7TvKUARBR4W5XWfb9qBVDeon87EFNKluW0/+7rzYWw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.63.0 - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 - tslib: 2.6.1 + '@sentry/core': 7.65.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 + tslib: 2.6.2 dev: false - /@sentry/browser@7.63.0: - resolution: {integrity: sha512-P1Iw/2281C/7CUCRsN4jgXvjMNKnrwKqxRg7JqN8eVeCDPMpOeEPHNJ6YatEXdVLTKVn0JB7L63Q1prhFr8+SQ==} + /@sentry/browser@7.65.0: + resolution: {integrity: sha512-TUzZPAXNJ/Y1yakFODYhsEtdDpLdkgjTfrx5i9MOnXQLrcRR0C4TC1KitqbP6Tv7Xha9WiR0TDZkh7gS/9RxEA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.63.0 - '@sentry/core': 7.63.0 - '@sentry/replay': 7.63.0 - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 - tslib: 2.6.1 + '@sentry-internal/tracing': 7.65.0 + '@sentry/core': 7.65.0 + '@sentry/replay': 7.65.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 + tslib: 2.6.2 dev: false /@sentry/cli@1.75.2: @@ -408,7 +408,7 @@ packages: dependencies: https-proxy-agent: 5.0.1 mkdirp: 0.5.6 - node-fetch: 2.6.12 + node-fetch: 2.7.0 progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -417,27 +417,27 @@ packages: - supports-color dev: false - /@sentry/core@7.63.0: - resolution: {integrity: sha512-13Ljiq8hv6ieCkO+Am99/PljYJO5ynKT/hRQrWgGy9IIEgUr8sV3fW+1W6K4/3MCeOJou0HsiGBjOD1mASItVg==} + /@sentry/core@7.65.0: + resolution: {integrity: sha512-EwZABW8CtAbRGXV69FqeCqcNApA+Jbq308dko0W+MFdFe+9t2RGubUkpPxpJcbWy/dN2j4LiuENu1T7nWn0ZAQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 - tslib: 2.6.1 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 + tslib: 2.6.2 dev: false - /@sentry/integrations@7.63.0: - resolution: {integrity: sha512-+P8GNqFZNH/yS/KPbvUfUDERneoRNUrqp9ayvvp8aq4cTtrBdM72CYgI21oG6cti42SSM1VDLYZomTV3ElPzSg==} + /@sentry/integrations@7.65.0: + resolution: {integrity: sha512-9b54p0UrkWe9+RAWWTObJQ2k/uStqaUj7BkNFyuaxfKQ4IZViqc4Sa7d7zX2X1oynGNL3ic7iqcgVTh7NvNsAQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 localforage: 1.10.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@sentry/nextjs@7.63.0(next@13.4.13)(react@18.2.0): - resolution: {integrity: sha512-pf1kEt2oqxe84+DdmGkI6BEe1KMUcUFU4PZKg5GRFY7e2ZqHoS8hTJF5rBkScqVlQoXDTiGpfI+vU8Ie3snUcQ==} + /@sentry/nextjs@7.65.0(next@13.4.19)(react@18.2.0): + resolution: {integrity: sha512-/Pyuf+UKyIA3GXnqRiLv6qZIT0lsN0BHAB67Is/GaQlYA+0zsqSYX24HGqAJ6U3bz+6d9W0dX5AmyVwobH9Vdg==} engines: {node: '>=8'} peerDependencies: next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 @@ -448,74 +448,74 @@ packages: optional: true dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.63.0 - '@sentry/integrations': 7.63.0 - '@sentry/node': 7.63.0 - '@sentry/react': 7.63.0(react@18.2.0) - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 + '@sentry/core': 7.65.0 + '@sentry/integrations': 7.65.0 + '@sentry/node': 7.65.0 + '@sentry/react': 7.65.0(react@18.2.0) + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 13.4.13(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 rollup: 2.78.0 stacktrace-parser: 0.1.10 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - encoding - supports-color dev: false - /@sentry/node@7.63.0: - resolution: {integrity: sha512-tSMyfQNbfjX1w8vJDZtvWeaD4QQ/Z4zVW/TLXfL/JZFIIksPgDZmqLdF+NJS4bSGTU5JiHiUh4pYhME4mHgNBQ==} + /@sentry/node@7.65.0: + resolution: {integrity: sha512-zRCHOO7vIQukgFdEib3X7nP7HA9Uyc/o4QMtBnAREaYKzERGRnArvaB3Na0bXsuLVCOELoCAlrzFH3apmgxBQw==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.63.0 - '@sentry/core': 7.63.0 - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 + '@sentry-internal/tracing': 7.65.0 + '@sentry/core': 7.65.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 cookie: 0.4.2 https-proxy-agent: 5.0.1 lru_map: 0.3.3 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: false - /@sentry/react@7.63.0(react@18.2.0): - resolution: {integrity: sha512-KFRjgADVE4aMI7gJmGnoSz65ZErQlz9xRB3vETWSyNOLprWXuQLPPtcDEn39BROtsDG4pLyYFaSDiD7o0+DyjQ==} + /@sentry/react@7.65.0(react@18.2.0): + resolution: {integrity: sha512-1ABxHwEHw5J4avUr8TBch3l7UszbNIroWergwiLPSy+EJU8WuB3Fdx0zSU+hS4Sujf8HNcRgu1JyWThZFTnIMA==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.63.0 - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 + '@sentry/browser': 7.65.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@sentry/replay@7.63.0: - resolution: {integrity: sha512-ikeFVojuP9oDF103blZcj0Vvb4S50dV54BESMrMW2lYBoMMjvOd7AdL+iDHjn1OL05/mv1C6Oc8MovmvdjILVA==} + /@sentry/replay@7.65.0: + resolution: {integrity: sha512-vhlk5F9RrhMQ+gOjNlLoWXamAPLNIT6wNII1O9ae+DRhZFmiUYirP5ag6dH5lljvNZndKl+xw+lJGJ3YdjXKlQ==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.63.0 - '@sentry/types': 7.63.0 - '@sentry/utils': 7.63.0 + '@sentry/core': 7.65.0 + '@sentry/types': 7.65.0 + '@sentry/utils': 7.65.0 dev: false - /@sentry/types@7.63.0: - resolution: {integrity: sha512-pZNwJVW7RqNLGuTUAhoygt0c9zmc0js10eANAz0MstygJRhQI1tqPDuiELVdujPrbeL+IFKF+7NvRDAydR2Niw==} + /@sentry/types@7.65.0: + resolution: {integrity: sha512-YYq7IDLLhpSBTmHoyWFtq/5ZDaEJ01r7xGuhB0aSIq33cm2I7im/B3ipzoOP/ukGZSIhuYVW9t531xZEO0+6og==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.63.0: - resolution: {integrity: sha512-7FQv1RYAwnuTuarruP+1+Jd6YQuN7i/Y7KltwPMVEwU7j5mzYQaexLr/Jz1XIdR2KYVdkbXQyP8jj8BmA6u9Jw==} + /@sentry/utils@7.65.0: + resolution: {integrity: sha512-2JEBf4jzRSClhp+LJpX/E3QgHEeKvXqFMeNhmwQ07qqd6szhfH2ckYFj4gXk6YiGGY4Act3C6oxLfdZovG71bw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.63.0 - tslib: 2.6.1 + '@sentry/types': 7.65.0 + tslib: 2.6.2 dev: false /@sentry/webpack-plugin@1.20.0: @@ -536,7 +536,7 @@ packages: /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@tailwindcss/typography@0.5.9(tailwindcss@3.3.3): @@ -551,12 +551,12 @@ packages: tailwindcss: 3.3.3 dev: true - /@tanstack/query-core@4.32.6: - resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + /@tanstack/query-core@4.33.0: + resolution: {integrity: sha512-qYu73ptvnzRh6se2nyBIDHGBQvPY1XXl3yR769B7B6mIDD7s+EZhdlWHQ67JI6UOTFRaI7wupnTnwJ3gE0Mr/g==} dev: false - /@tanstack/react-query@4.32.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==} + /@tanstack/react-query@4.33.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-97nGbmDK0/m0B86BdiXzx3EW9RcDYKpnyL2+WwyuLHEgpfThYAnXFaMMmnTDuAO4bQJXEhflumIEUfKmP7ESGA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -567,7 +567,7 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.32.6 + '@tanstack/query-core': 4.33.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) @@ -581,9 +581,19 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false - /@types/node@20.4.10: - resolution: {integrity: sha512-vwzFiiy8Rn6E0MtA13/Cxxgpan/N6UeNYR9oUu6kuJWxu6zCk98trcDp8CBhbtaeuq9SykCmXkFr2lWLoPcvLg==} - dev: true + /@types/node-fetch@2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.5.7 + form-data: 3.0.1 + dev: false + + /@types/node@18.17.12: + resolution: {integrity: sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==} + dev: false + + /@types/node@20.5.7: + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -591,11 +601,11 @@ packages: /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - '@types/react': 18.2.20 + '@types/react': 18.2.21 dev: true - /@types/react@18.2.20: - resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + /@types/react@18.2.21: + resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -604,8 +614,8 @@ packages: /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - /@typescript-eslint/parser@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -614,32 +624,32 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 + eslint: 8.48.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.3.0: - resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} + /@typescript-eslint/scope-manager@6.5.0: + resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 dev: false - /@typescript-eslint/types@6.3.0: - resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + /@typescript-eslint/types@6.5.0: + resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): - resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -647,23 +657,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/visitor-keys@6.3.0: - resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} + /@typescript-eslint/visitor-keys@6.5.0: + resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/types': 6.5.0 eslint-visitor-keys: 3.4.3 dev: false @@ -713,7 +723,7 @@ packages: - encoding dev: false - /@xstate/react@3.2.2(@types/react@18.2.20)(react@18.2.0)(xstate@4.38.2): + /@xstate/react@3.2.2(@types/react@18.2.21)(react@18.2.0)(xstate@4.38.2): resolution: {integrity: sha512-feghXWLedyq8JeL13yda3XnHPZKwYDN5HPBLykpLeuNpr9178tQd2/3d0NrH6gSd0sG5mLuLeuD+ck830fgzLQ==} peerDependencies: '@xstate/fsm': ^2.0.0 @@ -726,13 +736,20 @@ packages: optional: true dependencies: react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.20)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.21)(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) xstate: 4.38.2 transitivePeerDependencies: - '@types/react' dev: false + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -754,6 +771,13 @@ packages: - supports-color dev: false + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -874,19 +898,29 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false - /autoprefixer@10.4.14(postcss@8.4.27): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /autoprefixer@10.4.15(postcss@8.4.29): + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: browserslist: 4.21.10 - caniuse-lite: 1.0.30001519 - fraction.js: 4.2.0 + caniuse-lite: 1.0.30001524 + fraction.js: 4.3.1 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.27 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: false @@ -913,6 +947,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-64@0.1.0: + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false @@ -952,8 +990,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.490 + caniuse-lite: 1.0.30001524 + electron-to-chromium: 1.4.505 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: false @@ -970,7 +1008,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.6.0 + node-gyp-build: 4.6.1 dev: false /busboy@1.6.0: @@ -995,8 +1033,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001519: - resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + /caniuse-lite@1.0.30001524: + resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} dev: false /chalk@3.0.0: @@ -1014,6 +1052,10 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1026,7 +1068,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1065,6 +1107,13 @@ packages: color-string: 1.9.1 dev: false + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1089,6 +1138,10 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1146,6 +1199,11 @@ packages: object-keys: 1.1.1 dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1159,6 +1217,13 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + /digest-fetch@1.3.0: + resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} + dependencies: + base-64: 0.1.0 + md5: 2.3.0 + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1182,8 +1247,8 @@ packages: dependencies: esutils: 2.0.3 - /electron-to-chromium@1.4.490: - resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} + /electron-to-chromium@1.4.505: + resolution: {integrity: sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ==} dev: false /emoji-regex@9.2.2: @@ -1233,7 +1298,7 @@ packages: call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 @@ -1268,6 +1333,25 @@ packages: which-typed-array: 1.1.11 dev: false + /es-iterator-helpers@1.0.14: + resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.0 + safe-array-concat: 1.0.0 + dev: false + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -1301,8 +1385,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next@13.4.13(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-EXAh5h1yG/YTNa5YdskzaSZncBjKjvFe2zclMCi2KXyTsXha22wB6MPs/U7idB6a2qjpBdbZcruQY1TWjfNMZw==} + /eslint-config-next@13.4.19(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -1310,29 +1394,29 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.4.13 + '@next/eslint-plugin-next': 13.4.19 '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - eslint: 8.47.0 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.47.0) - eslint-plugin-react: 7.33.1(eslint@8.47.0) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.47.0) - typescript: 5.1.6 + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) + typescript: 5.2.2 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: false - /eslint-config-prettier@9.0.0(eslint@8.47.0): + /eslint-config-prettier@9.0.0(eslint@8.48.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.47.0 + eslint: 8.48.0 dev: true /eslint-import-resolver-node@0.3.9: @@ -1345,7 +1429,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0): + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0): resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1354,9 +1438,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 - eslint: 8.47.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + eslint: 8.48.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) fast-glob: 3.3.1 get-tsconfig: 4.7.0 is-core-module: 2.13.0 @@ -1368,7 +1452,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -1389,17 +1473,17 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.47.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0): - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1408,24 +1492,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.47.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - resolve: 1.22.4 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -1434,13 +1517,13 @@ packages: - supports-color dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.22.11 aria-query: 5.3.0 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -1449,27 +1532,27 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.47.0 + eslint: 8.48.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 + object.entries: 1.1.7 + object.fromentries: 2.0.7 semver: 6.3.1 dev: false - /eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.47.0): - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} + /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 dev: false - /eslint-plugin-react@7.33.1(eslint@8.47.0): - resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} + /eslint-plugin-react@7.33.2(eslint@8.48.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -1478,18 +1561,19 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.47.0 + es-iterator-helpers: 1.0.14 + eslint: 8.48.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 prop-types: 15.8.1 resolve: 2.0.0-next.4 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.9 dev: false /eslint-scope@7.2.2: @@ -1503,16 +1587,16 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -1580,6 +1664,11 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1588,8 +1677,8 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-fifo@1.3.0: - resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: false /fast-glob@3.3.1: @@ -1617,7 +1706,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.0 /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -1632,11 +1721,12 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} dependencies: flatted: 3.2.7 + keyv: 4.5.3 rimraf: 3.0.2 /flatted@3.2.7: @@ -1648,12 +1738,33 @@ packages: is-callable: 1.2.7 dev: false - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + + /fraction.js@4.3.1: + resolution: {integrity: sha512-nx0cki48JBA6ThPeUpeKCNpdhEl/9bRS+dAEYnRUod+Z1jhFfC3K/mBLorZZntqHM+GTH3/dkkpfoT3QITYe7g==} dev: false - /framer-motion@10.15.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6avJj/Uftblw0fMmo6jDHkKRH4TBdkMX/FiyR3G/hFe3hQHE4BUNJCqlMPKg9EzfI5jyqDOwO5oDnU+bW5y0eg==} + /framer-motion@10.16.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-K6TXr5mZtitC/dxQCBdg7xzdN0d5IAIrlaqCPKtIQVdzVPGC0qBuJKXggHX1vjnP5gPOFwB1KbCCTWcnFc3kWg==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -1665,7 +1776,7 @@ packages: dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false @@ -1682,13 +1793,21 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true optional: true /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -1885,6 +2004,12 @@ packages: - supports-color dev: false + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -1942,6 +2067,13 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -1962,6 +2094,10 @@ packages: has-tostringtag: 1.0.0 dev: false + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -1983,12 +2119,29 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -2023,6 +2176,10 @@ packages: has-tostringtag: 1.0.0 dev: false + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -2050,12 +2207,23 @@ packages: which-typed-array: 1.1.11 dev: false + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: false + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: false + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: false @@ -2066,14 +2234,24 @@ packages: /isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: - node-fetch: 2.6.12 - whatwg-fetch: 3.6.17 + node-fetch: 2.7.0 + whatwg-fetch: 3.6.18 transitivePeerDependencies: - encoding dev: false - /jiti@1.19.1: - resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + /iterator.prototype@1.1.0: + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + dependencies: + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + has-tostringtag: 1.0.0 + reflect.getprototypeof: 1.0.3 + dev: false + + /jiti@1.19.3: + resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} hasBin: true /js-tokens@4.0.0: @@ -2086,6 +2264,9 @@ packages: dependencies: argparse: 2.0.1 + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2106,9 +2287,14 @@ packages: array-includes: 3.1.6 array.prototype.flat: 1.3.1 object.assign: 4.1.4 - object.values: 1.1.6 + object.values: 1.1.7 dev: false + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: false @@ -2187,6 +2373,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2198,6 +2392,18 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -2256,8 +2462,8 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /next@13.4.13(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-A3YVbVDNeXLhWsZ8Nf6IkxmNlmTNz0yVg186NJ97tGZqPDdPzTrHotJ+A1cuJm2XfuWPrKOUZILl5iBQkIf8Jw==} + /next@13.4.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} engines: {node: '>=16.8.0'} hasBin: true peerDependencies: @@ -2271,10 +2477,10 @@ packages: sass: optional: true dependencies: - '@next/env': 13.4.13 + '@next/env': 13.4.19 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001519 + caniuse-lite: 1.0.30001524 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2282,22 +2488,22 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.13 - '@next/swc-darwin-x64': 13.4.13 - '@next/swc-linux-arm64-gnu': 13.4.13 - '@next/swc-linux-arm64-musl': 13.4.13 - '@next/swc-linux-x64-gnu': 13.4.13 - '@next/swc-linux-x64-musl': 13.4.13 - '@next/swc-win32-arm64-msvc': 13.4.13 - '@next/swc-win32-ia32-msvc': 13.4.13 - '@next/swc-win32-x64-msvc': 13.4.13 + '@next/swc-darwin-arm64': 13.4.19 + '@next/swc-darwin-x64': 13.4.19 + '@next/swc-linux-arm64-gnu': 13.4.19 + '@next/swc-linux-arm64-musl': 13.4.19 + '@next/swc-linux-x64-gnu': 13.4.19 + '@next/swc-linux-x64-musl': 13.4.19 + '@next/swc-win32-arm64-msvc': 13.4.19 + '@next/swc-win32-ia32-msvc': 13.4.19 + '@next/swc-win32-x64-msvc': 13.4.19 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} engines: {node: '>=10'} dependencies: semver: 7.5.4 @@ -2307,8 +2513,13 @@ packages: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} dev: false - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -2319,8 +2530,8 @@ packages: whatwg-url: 5.0.0 dev: false - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + /node-gyp-build@4.6.1: + resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true requiresBuild: true dev: false @@ -2365,8 +2576,8 @@ packages: object-keys: 1.1.1 dev: false - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2374,8 +2585,8 @@ packages: es-abstract: 1.22.1 dev: false - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2383,8 +2594,8 @@ packages: es-abstract: 1.22.1 dev: false - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2392,15 +2603,15 @@ packages: get-intrinsic: 1.2.1 dev: false - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 dev: false - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2413,9 +2624,20 @@ packages: dependencies: wrappy: 1.0.2 - /openai-edge@1.2.2: - resolution: {integrity: sha512-C3/Ao9Hkx5uBPv9YFBpX/x59XMPgPUU4dyGg/0J2sOJ7O9D98kD+lfdOc7v/60oYo5xzMGct80uFkYLH+X2qgw==} - engines: {node: '>=18'} + /openai@4.3.1: + resolution: {integrity: sha512-64iI2LbJLk0Ss4Nv5IrdGFe6ALNnKlMuXoGuH525bJYxdupJfDCAtra/Jigex1z8it0U82M87tR2TMGU+HYeFQ==} + hasBin: true + dependencies: + '@types/node': 18.17.12 + '@types/node-fetch': 2.6.4 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + digest-fetch: 1.3.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding dev: false /optionator@0.9.3: @@ -2482,33 +2704,33 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - /playwright-core@1.37.0: - resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} + /playwright-core@1.37.1: + resolution: {integrity: sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==} engines: {node: '>=16'} hasBin: true dev: true - /postcss-import@15.1.0(postcss@8.4.27): + /postcss-import@15.1.0(postcss@8.4.29): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.29 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.4 - /postcss-js@4.0.1(postcss@8.4.27): + /postcss-js@4.0.1(postcss@8.4.29): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.27 + postcss: 8.4.29 - /postcss-load-config@4.0.1(postcss@8.4.27): + /postcss-load-config@4.0.1(postcss@8.4.29): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -2521,16 +2743,16 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.27 - yaml: 2.3.1 + postcss: 8.4.29 + yaml: 2.3.2 - /postcss-nested@6.0.1(postcss@8.4.27): + /postcss-nested@6.0.1(postcss@8.4.29): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.27 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 /postcss-selector-parser@6.0.10: @@ -2560,8 +2782,8 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -2579,7 +2801,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.45.0 + node-abi: 3.47.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -2591,8 +2813,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier-plugin-tailwindcss@0.5.2(prettier@3.0.1): - resolution: {integrity: sha512-i4swJk4f8YWK99BRPX3DdDNwMr6U1X8y9rvxGeX5zf090+SsHpPSVjgOb041Hh6/nZJWPi/JYno9UgBDm+/RxA==} + /prettier-plugin-tailwindcss@0.5.3(prettier@3.0.3): + resolution: {integrity: sha512-M5K80V21yM+CTm/FEFYRv9/9LyInYbCSXpIoPAKMm8zy89IOwdiA2e4JVbcO7tvRtAQWz32zdj7/WKcsmFyAVg==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -2643,11 +2865,11 @@ packages: prettier-plugin-twig-melody: optional: true dependencies: - prettier: 3.0.1 + prettier: 3.0.3 dev: true - /prettier@3.0.1: - resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} hasBin: true dev: true @@ -2760,6 +2982,18 @@ packages: dependencies: picomatch: 2.3.1 + /reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: false + /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false @@ -2813,7 +3047,7 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false /run-parallel@1.2.0: @@ -2862,8 +3096,8 @@ packages: lru-cache: 6.0.0 dev: false - /sharp@0.32.4: - resolution: {integrity: sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==} + /sharp@0.32.5: + resolution: {integrity: sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==} engines: {node: '>=14.15.0'} requiresBuild: true dependencies: @@ -2961,12 +3195,12 @@ packages: /streamx@2.15.1: resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} dependencies: - fast-fifo: 1.3.0 + fast-fifo: 1.3.2 queue-tick: 1.0.1 dev: false - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall@4.0.9: + resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -3086,17 +3320,17 @@ packages: fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.19.1 + jiti: 1.19.3 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.27 - postcss-import: 15.1.0(postcss@8.4.27) - postcss-js: 4.0.1(postcss@8.4.27) - postcss-load-config: 4.0.1(postcss@8.4.27) - postcss-nested: 6.0.1(postcss@8.4.27) + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29) + postcss-nested: 6.0.1(postcss@8.4.29) postcss-selector-parser: 6.0.13 resolve: 1.22.4 sucrase: 3.34.0 @@ -3140,7 +3374,7 @@ packages: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} dependencies: b4a: 1.6.4 - fast-fifo: 1.3.0 + fast-fifo: 1.3.2 streamx: 2.15.1 dev: false @@ -3168,13 +3402,13 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-api-utils@1.0.1(typescript@5.1.6): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + /ts-api-utils@1.0.2(typescript@5.2.2): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: false /ts-interface-checker@0.1.13: @@ -3189,8 +3423,8 @@ packages: strip-bom: 3.0.0 dev: false - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false /tunnel-agent@0.6.0: @@ -3252,8 +3486,8 @@ packages: is-typed-array: 1.1.12 dev: false - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true dev: false @@ -3283,7 +3517,7 @@ packages: dependencies: punycode: 2.3.0 - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.20)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -3292,7 +3526,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.20 + '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -3309,7 +3543,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.6.0 + node-gyp-build: 4.6.1 dev: false /util-deprecate@1.0.2: @@ -3323,6 +3557,11 @@ packages: graceful-fs: 4.2.11 dev: false + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -3332,8 +3571,8 @@ packages: engines: {node: '>=10.13.0'} dev: false - /whatwg-fetch@3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} + /whatwg-fetch@3.6.18: + resolution: {integrity: sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==} dev: false /whatwg-url@5.0.0: @@ -3353,6 +3592,33 @@ packages: is-symbol: 1.0.4 dev: false + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: false + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: false + /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} @@ -3403,8 +3669,8 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + /yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} engines: {node: '>= 14'} /yocto-queue@0.1.0: @@ -3415,7 +3681,7 @@ packages: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zustand@4.4.1(@types/react@18.2.20)(react@18.2.0): + /zustand@4.4.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -3430,7 +3696,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.20 + '@types/react': 18.2.21 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/client/src/app/api/generate/route.ts b/client/src/app/api/generate/route.ts index 8d3edc2a..cdf078c9 100644 --- a/client/src/app/api/generate/route.ts +++ b/client/src/app/api/generate/route.ts @@ -1,16 +1,14 @@ import { NextResponse } from "next/server"; -import { Configuration, OpenAIApi, ResponseTypes } from "openai-edge"; +import OpenAI from "openai"; import { kv } from "@vercel/kv"; import { Ratelimit } from "@upstash/ratelimit"; export const runtime = "edge"; -const configuration = new Configuration({ - apiKey: process.env.OPENAI_API_KEY, +const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY ?? "", }); -const openai = new OpenAIApi(configuration); - export async function POST(req: Request) { if (process.env.KV_REST_API_URL && process.env.KV_REST_API_TOKEN) { const ip = req.headers.get("x-forwarded-for"); @@ -21,7 +19,7 @@ export async function POST(req: Request) { }); const { success, limit, reset, remaining } = await ratelimit.limit( - `ratelimit_${ip}` + `ratelimit_${ip}`, ); if (!success) { @@ -36,13 +34,13 @@ export async function POST(req: Request) { } } else { console.log( - "KV_REST_API_URL and KV_REST_API_TOKEN env vars not found, not rate limiting..." + "KV_REST_API_URL and KV_REST_API_TOKEN env vars not found, not rate limiting...", ); } const body = await req.json(); - if (!configuration.apiKey) { + if (!process.env.OPENAI_API_KEY) { return new Response("API Key is not defined", { status: 500, }); @@ -56,14 +54,12 @@ export async function POST(req: Request) { } try { - const imagesResponse = await openai.createImage({ + const images = await openai.images.generate({ prompt, n: 2, size: "1024x1024", }); - const images: ResponseTypes["createImage"] = await imagesResponse.json(); - return NextResponse.json({ result: images.data }); } catch (error) { if (error instanceof Error) { diff --git a/client/src/app/api/replicate/route.ts b/client/src/app/api/replicate/route.ts new file mode 100644 index 00000000..bf8b876b --- /dev/null +++ b/client/src/app/api/replicate/route.ts @@ -0,0 +1,144 @@ +import { Ratelimit } from "@upstash/ratelimit"; +import { kv } from "@vercel/kv"; +import { NextResponse } from "next/server"; + +export const runtime = "edge"; + +export async function POST(req: Request) { + if (process.env.KV_REST_API_URL && process.env.KV_REST_API_TOKEN) { + const ip = req.headers.get("x-forwarded-for"); + const ratelimit = new Ratelimit({ + redis: kv, + // rate limit to 5 requests per 10 seconds + limiter: Ratelimit.slidingWindow(5, "10s"), + }); + + const { success, limit, reset, remaining } = await ratelimit.limit( + `ratelimit_${ip}`, + ); + + if (!success) { + return new Response("You have reached your request limit for the day.", { + status: 429, + headers: { + "X-RateLimit-Limit": limit.toString(), + "X-RateLimit-Remaining": remaining.toString(), + "X-RateLimit-Reset": reset.toString(), + }, + }); + } + } else { + console.log( + "KV_REST_API_URL and KV_REST_API_TOKEN env vars not found, not rate limiting...", + ); + } + + const body = await req.json(); + + const prompt = body.prompt || ""; + if (prompt.trim().length === 0) { + return new Response("Please enter a valid prompt", { + status: 400, + }); + } + + try { + const startResponse = await fetch( + "https://api.replicate.com/v1/predictions", + { + method: "POST", + headers: { + Authorization: `Token ${process.env.REPLICATE_API_TOKEN}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + // Pinned to a specific version of Stable Diffusion + // See https://replicate.com/stability-ai/sdxl + version: + "2b017d9b67edd2ee1401238df49d75da53c523f36e363881e057f5dc3ed3c5b2", + + // This is the text prompt that will be submitted by a form on the frontend + input: { prompt, num_outputs: 2 }, + }), + }, + ); + + const startResponseJSON: unknown = await startResponse.json(); + + if ( + typeof startResponseJSON !== "object" || + !startResponseJSON || + !("urls" in startResponseJSON) || + typeof startResponseJSON.urls !== "object" || + !startResponseJSON.urls || + !("get" in startResponseJSON.urls) || + typeof startResponseJSON.urls.get !== "string" + ) { + throw new Error("Was unable to retrieve Replicate AI endpoint URL"); + } + + const endpointURL = startResponseJSON.urls.get; + + let imageGenerations: string[] | null = null; + + while (!imageGenerations) { + console.log("polling for result..."); + const finalResponse = await fetch(endpointURL, { + method: "GET", + headers: { + Authorization: `Token ${process.env.REPLICATE_API_TOKEN}`, + "Content-Type": "application/json", + }, + }); + const finalResponseJSON: unknown = await finalResponse.json(); + + if ( + typeof finalResponseJSON !== "object" || + !finalResponseJSON || + !("status" in finalResponseJSON) || + !finalResponseJSON.status || + typeof finalResponseJSON.status !== "string" + ) { + throw new Error("Unable to retrieve Replicate AI status"); + } + + if ( + finalResponseJSON.status === "succeeded" && + "output" in finalResponseJSON && + typeof finalResponseJSON.output === "object" && + Array.isArray(finalResponseJSON.output) + ) { + imageGenerations = finalResponseJSON.output; + } else if (finalResponseJSON.status === "failed") { + throw new Error( + `Unable to generate image${ + "error" in finalResponseJSON && + typeof finalResponseJSON.error === "string" + ? `, message: ${finalResponseJSON.error}` + : `` + }`, + ); + } else { + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + + if (imageGenerations) { + console.log("Received images:", imageGenerations); + } + + return NextResponse.json({ + result: imageGenerations ? imageGenerations : "Failed to generate images", + }); + } catch (error) { + if (error instanceof Error) { + console.error(error.message); + return new Response(error.message, { + status: 500, + }); + } + return new Response("An error occured during your request", { + status: 500, + }); + } +} diff --git a/client/src/app/room/[code]/game/game.tsx b/client/src/app/room/[code]/game/game.tsx index 78dbe365..0ce82d6e 100644 --- a/client/src/app/room/[code]/game/game.tsx +++ b/client/src/app/room/[code]/game/game.tsx @@ -80,14 +80,17 @@ export default function Game({ roomCode, gameInfo }: GameProps) { // Send updated state to server const handleStateChange = useCallback(() => { - socket.emit("clientEvent", { - state: JSON.stringify(state), - gameId: gameInfo.game.id, - round: state.context.round, - completedAt: state.matches("leaderboard") - ? new Date().toISOString() - : undefined, - }); + // Don't send state change to backend if it is a `promptSubmitted` state + if (!state.matches("promptSubmitted")) { + socket.emit("clientEvent", { + state: JSON.stringify(state), + gameId: gameInfo.game.id, + round: state.context.round, + completedAt: state.matches("leaderboard") + ? new Date().toISOString() + : undefined, + }); + } }, [gameInfo.game.id, socket, state]); // Receive state changes from server diff --git a/client/src/app/room/[code]/invite-link.tsx b/client/src/app/room/[code]/invite-link.tsx index 3f1af0ae..02fde898 100644 --- a/client/src/app/room/[code]/invite-link.tsx +++ b/client/src/app/room/[code]/invite-link.tsx @@ -5,8 +5,15 @@ import toast from "react-hot-toast"; import { FiCheckSquare, FiCopy } from "react-icons/fi"; import useLinkShare from "@ai/utils/hooks/use-link-share"; +import { cn } from "@ai/utils/cn"; -const InviteLink = ({ code }: { code: string }) => { +const InviteLink = ({ + code, + roomIsFull, +}: { + code: string; + roomIsFull: boolean; +}) => { const { link, copying, setCopying, onClick } = useLinkShare({ title: "Join My Artificial Unintelligence Room", slug: `/invite/${code}`, @@ -24,11 +31,15 @@ const InviteLink = ({ code }: { code: string }) => { return ( ); }; diff --git a/client/src/app/room/[code]/lobby.tsx b/client/src/app/room/[code]/lobby.tsx index 2efd0dde..73bb353e 100644 --- a/client/src/app/room/[code]/lobby.tsx +++ b/client/src/app/room/[code]/lobby.tsx @@ -21,6 +21,8 @@ export default function Lobby({ roomInfo }: { roomInfo: RoomInfo }) { const socket = useContext(SocketContext); + const roomIsFull = players.length >= 8; + const handleRoomState = (roomInfo: RoomInfo) => { console.log("[ROOM INFO]", roomInfo); setHostId(roomInfo.hostId); @@ -57,10 +59,12 @@ export default function Lobby({ roomInfo }: { roomInfo: RoomInfo }) { return (
-

- Your Invite Link is -

- + {!roomIsFull && ( +

+ Your Invite Link is +

+ )} +
@@ -71,6 +75,7 @@ export default function Lobby({ roomInfo }: { roomInfo: RoomInfo }) { hostId={hostId} onStartGame={initiateStartGame} loading={startGameLoading} + roomIsFull={roomIsFull} />
diff --git a/client/src/app/room/[code]/start-game.tsx b/client/src/app/room/[code]/start-game.tsx index 3b0aabb2..ed7740e1 100644 --- a/client/src/app/room/[code]/start-game.tsx +++ b/client/src/app/room/[code]/start-game.tsx @@ -16,12 +16,14 @@ const StartGame = ({ hostId, onStartGame, loading, + roomIsFull, }: { players: User[]; code: string; hostId: number | null; onStartGame: () => void; loading: boolean; + roomIsFull: boolean; }) => { const { user } = useStore(); const [isMounted, setIsMounted] = useState(false); @@ -59,7 +61,11 @@ const StartGame = ({ )} )} - + Invite Players {copying ? : } diff --git a/client/src/app/server-actions.ts b/client/src/app/server-actions.ts index ae93ea25..e1cb4729 100644 --- a/client/src/app/server-actions.ts +++ b/client/src/app/server-actions.ts @@ -31,6 +31,7 @@ export type Generation = { userId: number; questionId: number; gameId: number; + selected: boolean; createdAt: string; }; export type Question = { @@ -52,11 +53,26 @@ export type Vote = { export type UserVote = { vote: Vote; user: User }; +export type GameRoundGeneration = { + generation: Generation; + question: { + id: number; + text: string; + round: number; + gameId: number; + player1: number; + player2: number; + createdAt: Date; + }; + user: User; +}; + export type GameInfo = { hostId: number | null; game: Game; players: User[]; questions: Question[]; + gameRoundGenerations: GameRoundGeneration[]; submittedPlayers: number[]; votedPlayers: UserVote[]; }; @@ -89,6 +105,10 @@ export async function createHost(nickname: string) { }), }); + if (!response.ok) { + throw new Error("Failed to create host and room"); + } + const data: CreateHostResponse = await response.json(); return data; @@ -109,6 +129,10 @@ export async function existingHost(userId: number) { }), }); + if (!response.ok) { + throw new Error("Failed to create room for existing host"); + } + const data: ExistingHostResponse = await response.json(); return data; @@ -132,6 +156,13 @@ export async function joinRoom(nickname: string, code: string) { }), }); + if (!response.ok) { + if (response.status === 400) { + throw new Error("Room is full"); + } + throw new Error("Failed to join room"); + } + const data: JoinRoomResponse = await response.json(); return data; @@ -142,6 +173,10 @@ export type GetRoomInfoResponse = RoomInfo | ErrorResponse; export async function getRoomInfo(code: string) { const response = await fetch(`${URL}/room/${code}`, { cache: "no-store" }); + if (!response.ok) { + throw new Error("Failed to obtain room info"); + } + const data: GetRoomInfoResponse = await response.json(); return data; @@ -154,6 +189,10 @@ export type GetGameInfoResponse = GameInfo | ErrorResponse; export async function getGameInfo(code: string) { const response = await fetch(`${URL}/game/${code}`, { cache: "no-store" }); + if (!response.ok) { + throw new Error("Failed to obtain game info"); + } + const data: GetGameInfoResponse = await response.json(); return data; @@ -170,64 +209,47 @@ export async function getLeaderboardById({ gameId }: { gameId: number }) { cache: "no-store", }); + if (!response.ok) { + throw new Error("Failed to obtain leaderboard"); + } + const data: GetGameLeaderboardResponse = await response.json(); return data; } -export type GetRegenerationCountResponse = { count: number }; - -export async function getRegenerationCount({ - gameId, - userId, -}: { - gameId: number; - userId: number; -}) { - const response = await fetch( - `${URL}/game/${gameId}/regenerations/${userId}`, - { - cache: "no-store", - } - ); - - const data: GetRegenerationCountResponse = await response.json(); - - return data; -} +// ! ----------> GENERATIONS <---------- -export type incrementUserRegenerationCountResponse = { - room: Room; -}; +export type CreateGenerationsResponse = Generation[]; -export async function incrementUserRegenerationCount({ - gameId, +export async function createGenerations({ userId, + gameId, + questionId, + images, }: { - gameId: number; userId: number; + gameId: number; + questionId: number; + images: { text: string; imageUrl: string }[]; }) { - const response = await fetch( - `${URL}/game/${gameId}/regenerations/${userId}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - userId, - gameId, - }), - } - ); + const response = await fetch(`${URL}/generations`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ userId, gameId, questionId, images }), + }); + + if (!response.ok) { + throw new Error("Failed to create generations"); + } - const data: incrementUserRegenerationCountResponse = await response.json(); + const data: CreateGenerationsResponse = await response.json(); return data; } -// ! ----------> GENERATIONS <---------- - export type GetFaceOffsResponse = QuestionGenerations[]; export async function getFaceOffs({ @@ -239,9 +261,13 @@ export async function getFaceOffs({ }) { const response = await fetch( `${URL}/generations/gameId/${gameId}/round/${round}`, - { cache: "no-store" } + { cache: "no-store" }, ); + if (!response.ok) { + throw new Error("Failed to obtain face-offs"); + } + const data: GetFaceOffsResponse = await response.json(); return data; diff --git a/client/src/components/game/prompt.tsx b/client/src/components/game/prompt.tsx index 05faa19f..bb5ca34c 100644 --- a/client/src/components/game/prompt.tsx +++ b/client/src/components/game/prompt.tsx @@ -1,21 +1,23 @@ "use client"; -import { ChangeEvent, FormEvent, useContext, useMemo, useState } from "react"; +import { + FormEvent, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from "react"; import { AnimatePresence, motion } from "framer-motion"; import { EventFrom, StateFrom } from "xstate"; import toast from "react-hot-toast"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { FiHelpCircle, FiX } from "react-icons/fi"; import Button, { SecondaryButton } from "@ai/components/button"; -import { generateImage } from "@ai/utils/query"; +import { generateOpenAIImage, generateSDXLImage } from "@ai/utils/query"; import Ellipsis from "@ai/components/ellipsis"; import ImageChoice, { ImageOption } from "./image-choice"; -import Timer from "./timer"; -import { - GameInfo, - getRegenerationCount, - incrementUserRegenerationCount, -} from "@ai/app/server-actions"; +import { GameInfo, createGenerations } from "@ai/app/server-actions"; import { gameMachine } from "./game-machine"; import { useStore } from "@ai/utils/store"; import { SocketContext } from "@ai/utils/socket-provider"; @@ -39,154 +41,149 @@ const Prompt = ({ }) => { const { user } = useStore(); const socket = useContext(SocketContext); - - const queryClient = useQueryClient(); + const dialogRef = useRef(null); const gameId = gameInfo.game.id; const userId = user?.id; - const regenerationCountQueryKey = [ - "regenerationCount", - "gameId", - gameId, - "userId", - userId, - ]; - - const { data: regenerationCount, isLoading: regenerationCountLoading } = - useQuery( - regenerationCountQueryKey, - () => - getRegenerationCount({ - gameId: gameId, - userId: userId ?? 0, - }), - { - enabled: !!gameId && !!userId, - }, - ); - - const incrementRegenerationCountMutation = useMutation({ - mutationFn: ({ gameId, userId }: { gameId: number; userId: number }) => { - return incrementUserRegenerationCount({ gameId, userId }); - }, - onSettled: () => { - queryClient.invalidateQueries({ queryKey: regenerationCountQueryKey }); - }, - }); + const userGameRoundGenerations = gameInfo.gameRoundGenerations.filter( + (generation) => generation.user.id === userId, + ); + const currRound = state.context.round; const maxRegenerations = 3; - const outOfRegenerations = - !regenerationCountLoading && regenerationCount !== undefined - ? regenerationCount.count >= maxRegenerations - : true; - const currRound = state.context.round; + const isSecondStage = + userGameRoundGenerations.length > 1 && + (userGameRoundGenerations[0].generation.selected || + userGameRoundGenerations[1].generation.selected); + const shouldShowGenerations = + userGameRoundGenerations.length > 1 && + !userGameRoundGenerations[0].generation.selected && + !userGameRoundGenerations[1].generation.selected; - const questions = useMemo(() => { - return gameInfo.questions.filter((question) => { - return ( - question.round === currRound && - (question.player1 === user?.id || question.player2 === user?.id) - ); - }); - }, [currRound, gameInfo.questions, user?.id]); - - // State to handle the two questions of the current round - const [stage, setStage] = useState<"FIRST" | "SECOND">("FIRST"); + const [numGenerations, setNumGenerations] = useState( + userGameRoundGenerations.length, + ); - const currQuestion = stage === "FIRST" ? questions[0] : questions[1]; + const remainingImageGenerations = maxRegenerations - (numGenerations - 2) / 2; + const outOfRegenerations = remainingImageGenerations === 0; + const [stage, setStage] = useState<"FIRST" | "SECOND">( + isSecondStage ? "SECOND" : "FIRST", + ); const [loading, setLoading] = useState(false); const [imagePrompt, setImagePrompt] = useState( - window.localStorage.getItem("prompt") ?? "", + shouldShowGenerations ? userGameRoundGenerations[0].generation.text : "", ); const [imageOption1, setImageOption1] = useState( - window.localStorage.getItem("image1") ?? "", + shouldShowGenerations ? userGameRoundGenerations[0].generation : undefined, ); const [imageOption2, setImageOption2] = useState( - window.localStorage.getItem("image2") ?? "", + shouldShowGenerations ? userGameRoundGenerations[1].generation : undefined, ); const [selectedImage, setSelectedImage] = useState(); const imagesLoaded = imageOption1 && imageOption2; + const questions = useMemo(() => { + return gameInfo.questions.filter((question) => { + return ( + question.round === currRound && + (question.player1 === user?.id || question.player2 === user?.id) + ); + }); + }, [currRound, gameInfo.questions, user?.id]); + const currQuestion = stage === "FIRST" ? questions[0] : questions[1]; + const onPromptSubmit = async (e: FormEvent) => { e.preventDefault(); setLoading(true); const formPrompt = e.currentTarget.elements.prompt.value; - const images = await generateImage(formPrompt); + console.time("Execution Time"); + + const images = await generateSDXLImage(formPrompt); + + console.timeEnd("Execution Time"); if (!images) { console.error("Images were unable to be generated"); toast.error("I'm afraid I don't know how to process such a request."); } else { - setImageOption1(images[0].url ?? ""); - setImageOption2(images[1].url ?? ""); setImagePrompt(formPrompt); - window.localStorage.setItem("prompt", formPrompt ?? ""); - window.localStorage.setItem("image1", images[0].url ?? ""); - window.localStorage.setItem("image2", images[1].url ?? ""); + if (userId) { + const generations = await createGenerations({ + userId, + gameId, + questionId: currQuestion.id, + images: images?.map((image) => { + return { + text: formPrompt, + imageUrl: image, + }; + }), + }); + + setImageOption1(generations[0]); + setImageOption2(generations[1]); + + setNumGenerations(numGenerations + generations.length); + } } setLoading(false); }; - const resetPrompt = () => { - setImagePrompt(""); - window.localStorage.removeItem("prompt"); - }; - const resetImage = () => { - setImageOption1(""); - setImageOption2(""); + setImageOption1(undefined); + setImageOption2(undefined); setSelectedImage(undefined); - window.localStorage.removeItem("image1"); - window.localStorage.removeItem("image2"); }; const onTryAnotherPrompt = () => { - if (userId !== undefined) { - resetImage(); - incrementRegenerationCountMutation.mutate({ gameId, userId }); - return; - } - console.error("User was not defined when trying to use another prompt"); - toast.error("Oops, unable to try another prompt."); + resetImage(); }; const onImageSubmit = async () => { setLoading(true); - if (user) { + if (user && imageOption1 && imageOption2) { socket.emit("generationSubmitted", { - gameId: gameInfo.game.id, + generationId: selectedImage === 1 ? imageOption1?.id : imageOption2?.id, + gameId: gameId, round: currRound, - imageUrl: selectedImage === 1 ? imageOption1 : imageOption2, - questionId: currQuestion.id, - text: imagePrompt, - userId: user?.id, }); } else { console.error("User was not defined when trying to submit a generation"); toast.error("Oops, we can't submit your generation."); + setLoading(false); + return; } if (stage === "FIRST") { setStage("SECOND"); - resetPrompt(); + setImagePrompt(""); resetImage(); } else { - window.localStorage.removeItem("prompt"); - window.localStorage.removeItem("image1"); - window.localStorage.removeItem("image2"); send({ type: "SUBMIT" }); } setLoading(false); }; + useEffect(() => { + // Redirect to prompt submitted page if the player already has two images submitted for the round + const alreadySubmittedImages = + userGameRoundGenerations.filter( + (generation) => generation.generation.selected, + ).length >= 2; + + if (alreadySubmittedImages) { + send({ type: "SUBMIT" }); + } + }, [send, userGameRoundGenerations]); + return ( {/* */} @@ -205,11 +202,11 @@ const Prompt = ({ {!imagesLoaded && ( - -
-