From 1bc3141390d69a098ffa90ff8047874c4c2c7231 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 12:41:02 +0000 Subject: [PATCH 01/51] chore(deps): update mongo docker tag to v6 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 65e38b5..44486b7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: mongodb: - image: mongo:5.0.25-focal + image: mongo:6.0.4-focal container_name: database env_file: - .env From dc003c08610982e67377f7f0ec6b36cc7b44fb76 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Fri, 29 Mar 2024 16:17:03 +0100 Subject: [PATCH 02/51] chore(): create user model and schema --- src/features/users/models/User.js | 5 +++++ src/features/users/models/index.js | 1 + src/features/users/schemas/User.js | 15 +++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 src/features/users/models/User.js create mode 100644 src/features/users/models/index.js create mode 100644 src/features/users/schemas/User.js diff --git a/src/features/users/models/User.js b/src/features/users/models/User.js new file mode 100644 index 0000000..c85c555 --- /dev/null +++ b/src/features/users/models/User.js @@ -0,0 +1,5 @@ +import { UserSchema } from "@/features/places/schemas" +import mongoose from "mongoose" + +export const PlaceModel = + mongoose.models.Place || mongoose.model("User", UserSchema, "Users") diff --git a/src/features/users/models/index.js b/src/features/users/models/index.js new file mode 100644 index 0000000..9ba6248 --- /dev/null +++ b/src/features/users/models/index.js @@ -0,0 +1 @@ +export * from "./User" diff --git a/src/features/users/schemas/User.js b/src/features/users/schemas/User.js new file mode 100644 index 0000000..0fe9bd3 --- /dev/null +++ b/src/features/users/schemas/User.js @@ -0,0 +1,15 @@ +import { requiredArgSchema } from "@/utils/functions" +import { Schema } from "mongoose" + +export const UserSchema = new Schema( + { + username: requiredArgSchema(String), + email: requiredArgSchema(String), + password: requiredArgSchema(String), + verified: { + type: Boolean, + default: false, + }, + }, + { timestamps: true }, +) From f4c405f38186e30b2b4dff865db1733a91261833 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 17:47:12 +0000 Subject: [PATCH 03/51] chore(deps): update dependency autoprefixer to v10.4.19 --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c063bdd..5d218e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5302,9 +5302,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -5322,7 +5322,7 @@ ], "dependencies": { "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", From 6fc11242911b968311b50c725236ba8b5fd1e77e Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 27 Apr 2024 12:21:24 +0200 Subject: [PATCH 04/51] chore(): remove version docker compose (deprecated) and update name collection user --- docker-compose.yml | 2 -- src/features/users/models/User.js | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 71f4e84..18d75ee 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.7" - services: mongodb: image: mongo:5.0.25-focal diff --git a/src/features/users/models/User.js b/src/features/users/models/User.js index c85c555..79b8198 100644 --- a/src/features/users/models/User.js +++ b/src/features/users/models/User.js @@ -2,4 +2,4 @@ import { UserSchema } from "@/features/places/schemas" import mongoose from "mongoose" export const PlaceModel = - mongoose.models.Place || mongoose.model("User", UserSchema, "Users") + mongoose.models.Place || mongoose.model("User", UserSchema, "users") From 4a25fbec268fe86dc1e78b2218b01ee422c4b3df Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:57:11 +0200 Subject: [PATCH 05/51] chore(): install bcrypt and jose --- package-lock.json | 381 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 + 2 files changed, 372 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index c063bdd..815982c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,9 +24,11 @@ "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-query": "^5.25.0", "@tanstack/react-table": "^8.13.2", + "bcrypt": "^5.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "ioredis": "^5.3.2", + "jose": "^5.2.4", "lucide-react": "^0.350.0", "mongodb": "^6.4.0", "mongoose": "^8.2.1", @@ -2638,6 +2640,48 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", @@ -4904,6 +4948,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "peer": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -5008,7 +5057,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5046,6 +5094,23 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5437,6 +5502,19 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5688,6 +5766,14 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -5839,6 +5925,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5878,6 +5972,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -6264,6 +6363,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -6281,6 +6385,14 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -7352,6 +7464,28 @@ "node": ">= 10.0.0" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7403,6 +7537,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7706,6 +7882,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -8073,7 +8254,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -8450,6 +8630,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.4.tgz", + "integrity": "sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8976,6 +9164,40 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", @@ -9367,11 +9589,68 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9417,6 +9696,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", @@ -10426,6 +10716,19 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10642,7 +10945,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -10657,7 +10959,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10841,7 +11142,6 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10856,7 +11156,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10872,6 +11171,11 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -11067,6 +11371,14 @@ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -11211,7 +11523,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11442,6 +11753,30 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -12001,8 +12336,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { "version": "5.2.6", @@ -12416,6 +12750,32 @@ "node": ">=8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/workbox-background-sync": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", @@ -12993,8 +13353,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "2.4.1", diff --git a/package.json b/package.json index 7540994..c26ffd0 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,11 @@ "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-query": "^5.25.0", "@tanstack/react-table": "^8.13.2", + "bcrypt": "^5.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "ioredis": "^5.3.2", + "jose": "^5.2.4", "lucide-react": "^0.350.0", "mongodb": "^6.4.0", "mongoose": "^8.2.1", From 48efcbde68400247692c77f6eae828a8b794d9dc Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:57:34 +0200 Subject: [PATCH 06/51] chore(): update env --- .env.example | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 7a37eb9..94228ca 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,4 @@ DATABASE_URL="mongodb://USERNAME:PASSWORD@HOST:PORT/DATABASE" -NEXT_PUBLIC_API_MOCKING= #enabled \ No newline at end of file +NEXT_PUBLIC_API_MOCKING= #enabled +PASSWORD_SALT=10 +JWT_SECRET_KEY="" \ No newline at end of file From 875f57c5bc7f72a09aa0691bec16c5b6ea5e2d16 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 27 Apr 2024 20:15:58 +0200 Subject: [PATCH 07/51] chore(): add jsdoc and moove database models and schemas to database folder --- .../components/forms/buildings/BarForm.jsx | 2 +- .../components/forms/buildings/MuseumForm.jsx | 2 +- .../components/forms/buildings/ParkForm.jsx | 2 +- .../forms/buildings/RestaurantForm.jsx | 2 +- .../components/forms/create/DefaultForm.jsx | 2 +- .../components/forms/update/UpdateForm.jsx | 5 +- src/features/places/controllers/place.js | 33 +++++++++++- src/features/places/controllers/places.js | 18 ++++++- .../places/{ => database}/models/Place.js | 2 +- .../places/{ => database}/models/index.js | 0 src/features/places/database/schemas/Bar.js | 10 ++++ .../places/database/schemas/Museum.js | 18 +++++++ src/features/places/database/schemas/Park.js | 14 ++++++ src/features/places/database/schemas/Place.js | 44 ++++++++++++++++ .../places/database/schemas/Restaurant.js | 12 +++++ src/features/places/database/schemas/index.js | 5 ++ src/features/places/schemas/Bar.js | 9 ---- src/features/places/schemas/Museum.js | 13 ----- src/features/places/schemas/Park.js | 13 ----- src/features/places/schemas/Place.js | 50 +++---------------- src/features/places/schemas/Restaurant.js | 11 ---- src/features/places/schemas/index.js | 6 ++- 22 files changed, 174 insertions(+), 99 deletions(-) rename src/features/places/{ => database}/models/Place.js (67%) rename src/features/places/{ => database}/models/index.js (100%) create mode 100644 src/features/places/database/schemas/Bar.js create mode 100644 src/features/places/database/schemas/Museum.js create mode 100644 src/features/places/database/schemas/Park.js create mode 100644 src/features/places/database/schemas/Place.js create mode 100644 src/features/places/database/schemas/Restaurant.js create mode 100644 src/features/places/database/schemas/index.js diff --git a/src/features/places/components/forms/buildings/BarForm.jsx b/src/features/places/components/forms/buildings/BarForm.jsx index 8d5f28a..fd910ec 100644 --- a/src/features/places/components/forms/buildings/BarForm.jsx +++ b/src/features/places/components/forms/buildings/BarForm.jsx @@ -1,6 +1,6 @@ import { Form, FormField } from "@/components/ui/form" import { MenuForm } from "@/features/places/components/forms/create" -import { barSchema } from "@/features/places/schemas/Bar" +import { barSchema } from "@/features/places/database/schemas/Bar" import { barFormFields } from "@/features/places/utils/fields" import { useMultiStepsForm } from "@/hooks/forms" diff --git a/src/features/places/components/forms/buildings/MuseumForm.jsx b/src/features/places/components/forms/buildings/MuseumForm.jsx index e213b7d..7b84b1a 100644 --- a/src/features/places/components/forms/buildings/MuseumForm.jsx +++ b/src/features/places/components/forms/buildings/MuseumForm.jsx @@ -1,6 +1,6 @@ import { Form, FormField } from "@/components/ui/form" import { MenuForm } from "@/features/places/components/forms/create" -import { museumSchema } from "@/features/places/schemas/Museum" +import { museumSchema } from "@/features/places/database/schemas/Museum" import { museumFormFields } from "@/features/places/utils/fields" import { useMultiStepsForm } from "@/hooks/forms" import { zodResolver } from "@hookform/resolvers/zod" diff --git a/src/features/places/components/forms/buildings/ParkForm.jsx b/src/features/places/components/forms/buildings/ParkForm.jsx index a2208ec..5718a9d 100644 --- a/src/features/places/components/forms/buildings/ParkForm.jsx +++ b/src/features/places/components/forms/buildings/ParkForm.jsx @@ -1,6 +1,6 @@ import { Form, FormField } from "@/components/ui/form" import { MenuForm } from "@/features/places/components/forms/create" -import { parkSchema } from "@/features/places/schemas/Park" +import { parkSchema } from "@/features/places/database/schemas/Park" import { parkFormFields } from "@/features/places/utils/fields" import { useMultiStepsForm } from "@/hooks/forms" import { zodResolver } from "@hookform/resolvers/zod" diff --git a/src/features/places/components/forms/buildings/RestaurantForm.jsx b/src/features/places/components/forms/buildings/RestaurantForm.jsx index 106a59d..0c5c9e6 100644 --- a/src/features/places/components/forms/buildings/RestaurantForm.jsx +++ b/src/features/places/components/forms/buildings/RestaurantForm.jsx @@ -1,6 +1,6 @@ import { Form, FormField } from "@/components/ui/form" import { MenuForm } from "@/features/places/components/forms/create" -import { restaurantSchema } from "@/features/places/schemas/Restaurant" +import { restaurantSchema } from "@/features/places/database/schemas/Restaurant" import { restaurantFormFields } from "@/features/places/utils/fields" import { useMultiStepsForm } from "@/hooks/forms" import { zodResolver } from "@hookform/resolvers/zod" diff --git a/src/features/places/components/forms/create/DefaultForm.jsx b/src/features/places/components/forms/create/DefaultForm.jsx index ba90794..b3aa1ff 100644 --- a/src/features/places/components/forms/create/DefaultForm.jsx +++ b/src/features/places/components/forms/create/DefaultForm.jsx @@ -1,4 +1,4 @@ -import { placeSchema } from "@/features/places/schemas" +import { placeSchema } from "@/features/places/database/schemas" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" diff --git a/src/features/places/components/forms/update/UpdateForm.jsx b/src/features/places/components/forms/update/UpdateForm.jsx index fb087ea..a87f970 100644 --- a/src/features/places/components/forms/update/UpdateForm.jsx +++ b/src/features/places/components/forms/update/UpdateForm.jsx @@ -1,7 +1,10 @@ import { Button } from "@/components/ui/button" import { Form, FormField } from "@/components/ui/form" +import { + updatePlaceSchema, + updateSubSchemas, +} from "@/features/places/database/schemas" import { usePlace } from "@/features/places/hooks" -import { updatePlaceSchema, updateSubSchemas } from "@/features/places/schemas" import { requestPutPlace } from "@/features/places/utils/api" import { barFormFields, diff --git a/src/features/places/controllers/place.js b/src/features/places/controllers/place.js index 130b4cc..6b4e3c6 100644 --- a/src/features/places/controllers/place.js +++ b/src/features/places/controllers/place.js @@ -1,7 +1,15 @@ -import { PlaceModel } from "@/features/places/models" +import { PlaceModel } from "@/features/places/database/models" import { updatePlaceSchema, updateSubSchemas } from "@/features/places/schemas" export class PlaceController { + /** + * + * @param {string} placeId + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns + */ + static async checkId(placeId, res, redisClient) { if (!(await redisClient.get(`places:${placeId}`))) { const place = await PlaceModel.findById(placeId) @@ -19,6 +27,13 @@ export class PlaceController { return JSON.parse(await redisClient.get(`places:${placeId}`)) } + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ static async GET(req, res, redisClient) { const { placeId } = req.query const place = await PlaceController.checkId(placeId, res, redisClient) @@ -26,6 +41,14 @@ export class PlaceController { return res.json(place) } + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + static async PUT(req, res, redisClient) { const { placeId } = req.query const place = await PlaceController.checkId(placeId, res, redisClient) @@ -71,6 +94,14 @@ export class PlaceController { return res.json(newPlace) } + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + static async DELETE(req, res, redisClient) { const { placeId } = req.query const place = await PlaceModel.findById(placeId) diff --git a/src/features/places/controllers/places.js b/src/features/places/controllers/places.js index 4c45c7f..9db9a12 100644 --- a/src/features/places/controllers/places.js +++ b/src/features/places/controllers/places.js @@ -1,7 +1,15 @@ -import { PlaceModel } from "@/features/places/models" +import { PlaceModel } from "@/features/places/database/models" import { filterQueryPlace } from "@/features/places/schemas" export class PlacesController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + static async GET(req, res) { const { q, limit, page, ...query } = req.query const places = q @@ -24,6 +32,14 @@ export class PlacesController { return res.json(await places) } + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + static async POST(req, res, redisClient) { const { info, details } = req.body const newPlace = new PlaceModel({ diff --git a/src/features/places/models/Place.js b/src/features/places/database/models/Place.js similarity index 67% rename from src/features/places/models/Place.js rename to src/features/places/database/models/Place.js index 369b4e3..40ec763 100644 --- a/src/features/places/models/Place.js +++ b/src/features/places/database/models/Place.js @@ -1,4 +1,4 @@ -import { PlaceSchema } from "@/features/places/schemas" +import { PlaceSchema } from "@/features/places/database/schemas" import mongoose from "mongoose" export const PlaceModel = diff --git a/src/features/places/models/index.js b/src/features/places/database/models/index.js similarity index 100% rename from src/features/places/models/index.js rename to src/features/places/database/models/index.js diff --git a/src/features/places/database/schemas/Bar.js b/src/features/places/database/schemas/Bar.js new file mode 100644 index 0000000..1dc9ae1 --- /dev/null +++ b/src/features/places/database/schemas/Bar.js @@ -0,0 +1,10 @@ +import { typesOfBuilding } from "@/features/places/utils/constants" +import { enumSchema, generateArray } from "@/utils/functions" +import { Schema } from "mongoose" + +const averageCost = generateArray(5) + +export const BarSchema = new Schema({ + typeOf: enumSchema(String, typesOfBuilding.bar), + averageCost: enumSchema(Number, averageCost), +}) diff --git a/src/features/places/database/schemas/Museum.js b/src/features/places/database/schemas/Museum.js new file mode 100644 index 0000000..55a4da5 --- /dev/null +++ b/src/features/places/database/schemas/Museum.js @@ -0,0 +1,18 @@ +import { + artisticMovements, + freeOrPay, + typesOfBuilding, +} from "@/features/places/utils/constants" +import { enumSchema } from "@/utils/functions" +import { Schema } from "mongoose" + +export const MuseumSchema = new Schema({ + artisticMovement: enumSchema(String, artisticMovements), + typeOf: enumSchema(String, typesOfBuilding.museum), + freeOrPay: enumSchema(String, freeOrPay), + price: { + type: Number, + // eslint-disable-next-line no-invalid-this + required: () => this?.freeOrPay === "pay", + }, +}) diff --git a/src/features/places/database/schemas/Park.js b/src/features/places/database/schemas/Park.js new file mode 100644 index 0000000..2a8a9ec --- /dev/null +++ b/src/features/places/database/schemas/Park.js @@ -0,0 +1,14 @@ +import { freeOrPay, typesOfBuilding } from "@/features/places/utils/constants" +import { enumSchema } from "@/utils/functions" +import { Schema } from "mongoose" + +export const ParkSchema = new Schema({ + typeOf: enumSchema(String, typesOfBuilding.park), + public: Boolean, + freeOrPay: enumSchema(String, freeOrPay), + price: { + type: Number, + // eslint-disable-next-line no-invalid-this + required: () => this?.freeOrPay === "pay", + }, +}) diff --git a/src/features/places/database/schemas/Place.js b/src/features/places/database/schemas/Place.js new file mode 100644 index 0000000..244cc91 --- /dev/null +++ b/src/features/places/database/schemas/Place.js @@ -0,0 +1,44 @@ +import { BarSchema } from "@/features/places/database/schemas/Bar" +import { MuseumSchema } from "@/features/places/database/schemas/Museum" +import { ParkSchema } from "@/features/places/database/schemas/Park" +import { RestaurantSchema } from "@/features/places/database/schemas/Restaurant" +import { listOfBuildings } from "@/features/places/utils/constants" +import { requiredArgSchema } from "@/utils/functions" +/* eslint-disable no-invalid-this */ +import { Schema } from "mongoose" + +export const PlaceSchema = new Schema( + { + building: { + type: String, + enum: listOfBuildings, + }, + name: { + ...requiredArgSchema(String), + unique: true, + index: true, + }, + city: requiredArgSchema(String), + zipcode: requiredArgSchema(Number), + country: requiredArgSchema(String), + museum: { + type: MuseumSchema, + required: () => this?.building === "museum", + }, + park: { + type: ParkSchema, + required: () => this?.building === "park", + }, + bar: { + type: BarSchema, + required: () => this?.building === "bar", + }, + restaurant: { + type: RestaurantSchema, + required: () => this?.building === "restaurant", + }, + }, + { + timestamps: true, + }, +) diff --git a/src/features/places/database/schemas/Restaurant.js b/src/features/places/database/schemas/Restaurant.js new file mode 100644 index 0000000..10b2662 --- /dev/null +++ b/src/features/places/database/schemas/Restaurant.js @@ -0,0 +1,12 @@ +import { typesOfBuilding } from "@/features/places/utils/constants" +import { enumSchema, generateArray } from "@/utils/functions" +import { Schema } from "mongoose" + +const stars = generateArray(3) +const averageCost = generateArray(5) + +export const RestaurantSchema = new Schema({ + typeOf: enumSchema(String, typesOfBuilding.restaurant), + stars: enumSchema(Number, stars), + averageCost: enumSchema(Number, averageCost), +}) diff --git a/src/features/places/database/schemas/index.js b/src/features/places/database/schemas/index.js new file mode 100644 index 0000000..4220cec --- /dev/null +++ b/src/features/places/database/schemas/index.js @@ -0,0 +1,5 @@ +export * from "./Bar" +export * from "./Museum" +export * from "./Park" +export * from "./Place" +export * from "./Restaurant" diff --git a/src/features/places/schemas/Bar.js b/src/features/places/schemas/Bar.js index f2de6cb..3e8df8f 100644 --- a/src/features/places/schemas/Bar.js +++ b/src/features/places/schemas/Bar.js @@ -1,15 +1,6 @@ import { typesOfBuilding } from "@/features/places/utils/constants" -import { enumSchema, generateArray } from "@/utils/functions" -import { Schema } from "mongoose" import { z } from "zod" -const averageCost = generateArray(5) - -export const BarSchema = new Schema({ - typeOf: enumSchema(String, typesOfBuilding.bar), - averageCost: enumSchema(Number, averageCost), -}) - export const barSchema = z.object({ typeOf: z.enum(typesOfBuilding.bar), averageCost: z diff --git a/src/features/places/schemas/Museum.js b/src/features/places/schemas/Museum.js index c47a8ce..ecd9496 100644 --- a/src/features/places/schemas/Museum.js +++ b/src/features/places/schemas/Museum.js @@ -3,21 +3,8 @@ import { freeOrPay, typesOfBuilding, } from "@/features/places/utils/constants" -import { enumSchema } from "@/utils/functions" -import { Schema } from "mongoose" import { z } from "zod" -export const MuseumSchema = new Schema({ - artisticMovement: enumSchema(String, artisticMovements), - typeOf: enumSchema(String, typesOfBuilding.museum), - freeOrPay: enumSchema(String, freeOrPay), - price: { - type: Number, - // eslint-disable-next-line no-invalid-this - required: () => this?.freeOrPay === "pay", - }, -}) - export const museumSchema = z.object({ typeOf: z.enum(typesOfBuilding.museum), artisticMovements: z.enum(artisticMovements), diff --git a/src/features/places/schemas/Park.js b/src/features/places/schemas/Park.js index ee445c7..1a8dcec 100644 --- a/src/features/places/schemas/Park.js +++ b/src/features/places/schemas/Park.js @@ -1,19 +1,6 @@ import { freeOrPay, typesOfBuilding } from "@/features/places/utils/constants" -import { enumSchema } from "@/utils/functions" -import { Schema } from "mongoose" import { z } from "zod" -export const ParkSchema = new Schema({ - typeOf: enumSchema(String, typesOfBuilding.park), - public: Boolean, - freeOrPay: enumSchema(String, freeOrPay), - price: { - type: Number, - // eslint-disable-next-line no-invalid-this - required: () => this?.freeOrPay === "pay", - }, -}) - export const parkSchema = z.object({ typeOf: z.enum(typesOfBuilding.park), public: z.boolean(), diff --git a/src/features/places/schemas/Place.js b/src/features/places/schemas/Place.js index 9985775..4b1261f 100644 --- a/src/features/places/schemas/Place.js +++ b/src/features/places/schemas/Place.js @@ -1,48 +1,12 @@ -import { requiredArgSchema } from "@/utils/functions" -/* eslint-disable no-invalid-this */ -import { listOfBuildings } from "@/features/places/utils/constants.js" -import { Schema } from "mongoose" +import { + updateBarSchema, + updateMuseumSchema, + updateParkSchema, + updateRestaurantSchema, +} from "@/features/places/schemas" +import { listOfBuildings } from "@/features/places/utils/constants" import { z } from "zod" -import { BarSchema, updateBarSchema } from "./Bar.js" -import { MuseumSchema, updateMuseumSchema } from "./Museum.js" -import { ParkSchema, updateParkSchema } from "./Park.js" -import { RestaurantSchema, updateRestaurantSchema } from "./Restaurant.js" -export const PlaceSchema = new Schema( - { - building: { - type: String, - enum: listOfBuildings, - }, - name: { - ...requiredArgSchema(String), - unique: true, - index: true, - }, - city: requiredArgSchema(String), - zipcode: requiredArgSchema(Number), - country: requiredArgSchema(String), - museum: { - type: MuseumSchema, - required: () => this?.building === "museum", - }, - park: { - type: ParkSchema, - required: () => this?.building === "park", - }, - bar: { - type: BarSchema, - required: () => this?.building === "bar", - }, - restaurant: { - type: RestaurantSchema, - required: () => this?.building === "restaurant", - }, - }, - { - timestamps: true, - }, -) const baseSchema = { building: z.enum(listOfBuildings), city: z.string().min(3), diff --git a/src/features/places/schemas/Restaurant.js b/src/features/places/schemas/Restaurant.js index 58d78ef..71312d4 100644 --- a/src/features/places/schemas/Restaurant.js +++ b/src/features/places/schemas/Restaurant.js @@ -1,17 +1,6 @@ import { typesOfBuilding } from "@/features/places/utils/constants" -import { enumSchema, generateArray } from "@/utils/functions" -import { Schema } from "mongoose" import { z } from "zod" -const stars = generateArray(3) -const averageCost = generateArray(5) - -export const RestaurantSchema = new Schema({ - typeOf: enumSchema(String, typesOfBuilding.restaurant), - stars: enumSchema(Number, stars), - averageCost: enumSchema(Number, averageCost), -}) - export const restaurantSchema = z.object({ typeOf: z.enum(typesOfBuilding.restaurant), stars: z diff --git a/src/features/places/schemas/index.js b/src/features/places/schemas/index.js index e28828e..f8075c5 100644 --- a/src/features/places/schemas/index.js +++ b/src/features/places/schemas/index.js @@ -1 +1,5 @@ -export * from "./Place" +export * from "./bar" +export * from "./museum" +export * from "./park" +export * from "./place" +export * from "./restaurant" From 2be88db06c0ab2e595dcec7642658e697a4fdc80 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:04:43 +0200 Subject: [PATCH 08/51] chore(): create api auth controller --- src/features/auth/controllers/index.js | 3 ++ src/features/auth/controllers/login.js | 43 +++++++++++++++++ src/features/auth/controllers/logout.js | 30 ++++++++++++ src/features/auth/controllers/register.js | 57 +++++++++++++++++++++++ src/pages/api/auth/login.js | 4 ++ src/pages/api/auth/logout.js | 4 ++ src/pages/api/auth/register.js | 4 ++ 7 files changed, 145 insertions(+) create mode 100644 src/features/auth/controllers/index.js create mode 100644 src/features/auth/controllers/login.js create mode 100644 src/features/auth/controllers/logout.js create mode 100644 src/features/auth/controllers/register.js create mode 100644 src/pages/api/auth/login.js create mode 100644 src/pages/api/auth/logout.js create mode 100644 src/pages/api/auth/register.js diff --git a/src/features/auth/controllers/index.js b/src/features/auth/controllers/index.js new file mode 100644 index 0000000..0bda331 --- /dev/null +++ b/src/features/auth/controllers/index.js @@ -0,0 +1,3 @@ +export * from "./login" +export * from "./logout" +export * from "./register" diff --git a/src/features/auth/controllers/login.js b/src/features/auth/controllers/login.js new file mode 100644 index 0000000..6ab68ae --- /dev/null +++ b/src/features/auth/controllers/login.js @@ -0,0 +1,43 @@ +import { loginSchema } from "@/features/auth/schemas/login" +import { AuthService } from "@/features/auth/services" +import { encrypt } from "@/features/auth/utils/jwt" +import { serialize } from "cookie" + +export class LoginController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + + static async POST(req, res, redisClient) { + try { + const time = 60 * 60 * 24 + const data = await loginSchema.parseAsync(req.body) + const user = await AuthService.check(data) + const expires = new Date(Date.now() + time * 1000) + const session = await encrypt({ user, expires }) + + await redisClient.set(`sessions:${user._id}`, session) + + res.setHeader( + "Set-Cookie", + serialize("session", session, { + httpOnly: true, + maxAge: time, + secure: true, + path: "/", + }), + ) + + res.status(200).json({ login: true }) + } catch (error) { + res.status(500).json({ + login: false, + error: error.message, + }) + } + } +} diff --git a/src/features/auth/controllers/logout.js b/src/features/auth/controllers/logout.js new file mode 100644 index 0000000..b70a8ae --- /dev/null +++ b/src/features/auth/controllers/logout.js @@ -0,0 +1,30 @@ +import { wrongs } from "@/utils/errors" +import { serialize } from "cookie" + +export class LogoutController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + static async DELETE(req, res, redisClient) { + try { + await redisClient.del(`sessions:${req.cookies.session}`) + res.setHeader( + "Set-Cookie", + serialize("session", "", { + httpOnly: true, + maxAge: 0, + secure: true, + path: "/", + }), + ) + + return res.status(200).json({ logout: true }) + } catch (error) { + return res.status(500).json({ created: false, error: wrongs.something }) + } + } +} diff --git a/src/features/auth/controllers/register.js b/src/features/auth/controllers/register.js new file mode 100644 index 0000000..8d5487c --- /dev/null +++ b/src/features/auth/controllers/register.js @@ -0,0 +1,57 @@ +import { registerSchema } from "@/features/auth/schemas/register" +import { UserModel } from "@/features/users/database/models" +import { UserService } from "@/features/users/services" +import { matchs, wrongs } from "@/utils/errors" + +export class RegisterController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + + static async POST(req, res, redisClient) { + try { + if (!req.body) { + return res.status(400).json({ + created: false, + error: "Request body empty", + }) + } + + const { username, email } = await registerSchema.parseAsync(req.body) + const usernameExists = await UserModel.exists({ username }) + + if (usernameExists) { + return res.status(400).json({ + created: false, + error: "Account already exists with this username", + }) + } + + const emailExists = await UserModel.exists({ email }) + + if (emailExists) { + return res.status(400).json({ + created: false, + error: "Account already exists with this email", + }) + } + + await UserService.create(redisClient, req.body) + + return res.status(201).json({ created: true }) + } catch (error) { + if (JSON.parse(error.message)[0].message === matchs.passwords) { + return res.status(400).json({ + created: false, + error: matchs.passwords, + }) + } + + return res.status(500).json({ created: false, error: wrongs.something }) + } + } +} diff --git a/src/pages/api/auth/login.js b/src/pages/api/auth/login.js new file mode 100644 index 0000000..a10900b --- /dev/null +++ b/src/pages/api/auth/login.js @@ -0,0 +1,4 @@ +import { LoginController } from "@/features/auth/controllers" +import { handlerApi } from "@/utils/functions.server" + +export default handlerApi(LoginController) diff --git a/src/pages/api/auth/logout.js b/src/pages/api/auth/logout.js new file mode 100644 index 0000000..018a8db --- /dev/null +++ b/src/pages/api/auth/logout.js @@ -0,0 +1,4 @@ +import { LogoutController } from "@/features/auth/controllers" +import { handlerApi } from "@/utils/functions.server" + +export default handlerApi(LogoutController) diff --git a/src/pages/api/auth/register.js b/src/pages/api/auth/register.js new file mode 100644 index 0000000..7edcfa3 --- /dev/null +++ b/src/pages/api/auth/register.js @@ -0,0 +1,4 @@ +import { RegisterController } from "@/features/auth/controllers" +import { handlerApi } from "@/utils/functions.server" + +export default handlerApi(RegisterController) From e549059fe87e92963cf5f2c6af33c9a35c04ae5f Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:05:27 +0200 Subject: [PATCH 09/51] chore(): create and update global and auth utils functions --- src/features/auth/utils/api.js | 22 ++++++++++++++++++++++ src/features/auth/utils/jwt.js | 19 +++++++++++++++++++ src/utils/constants.js | 6 ++++++ src/utils/errors.js | 13 +++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 src/features/auth/utils/api.js create mode 100644 src/features/auth/utils/jwt.js create mode 100644 src/utils/errors.js diff --git a/src/features/auth/utils/api.js b/src/features/auth/utils/api.js new file mode 100644 index 0000000..76c4cb9 --- /dev/null +++ b/src/features/auth/utils/api.js @@ -0,0 +1,22 @@ +import { defaultOptions } from "@/utils/constants" +import { requestAPI } from "@/utils/functions" + +export const requestPostAuthLogin = async body => + await requestAPI(false, "/auth/login", { + method: "POST", + body: JSON.stringify(body), + ...defaultOptions, + }) + +export const requestPostAuthRegister = async body => + await requestAPI(false, "/auth/register", { + method: "POST", + body: JSON.stringify(body), + ...defaultOptions, + }) + +export const requestDeleteAuthLogout = async () => + await requestAPI(false, "/auth/logout", { + method: "DELETE", + ...defaultOptions, + }) diff --git a/src/features/auth/utils/jwt.js b/src/features/auth/utils/jwt.js new file mode 100644 index 0000000..8f88a6c --- /dev/null +++ b/src/features/auth/utils/jwt.js @@ -0,0 +1,19 @@ +import { jwtVerify, SignJWT } from "jose" + +const key = new TextEncoder().encode(process.env.JWT_SECRET_KEY) +const alg = "HS256" + +export const encrypt = async payload => + await new SignJWT(payload) + .setProtectedHeader({ alg }) + .setIssuedAt() + .setExpirationTime("24 hours") + .sign(key) + +export const decrypt = async token => { + const { payload } = await jwtVerify(token, key, { + algorithms: [alg], + }) + + return payload +} diff --git a/src/utils/constants.js b/src/utils/constants.js index 116cf57..a707a71 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -10,3 +10,9 @@ export const langs = { en: "English", fr: "Français", } + +export const defaultOptions = { + headers: { + "Content-Type": "application/json", + }, +} diff --git a/src/utils/errors.js b/src/utils/errors.js new file mode 100644 index 0000000..cec4dbb --- /dev/null +++ b/src/utils/errors.js @@ -0,0 +1,13 @@ +export const wrongs = { + password: "Wrong password", + something: "Something went wrong", +} + +export const unknowns = { + account: "Unknown account", + user: "Unknown user", +} + +export const matchs = { + passwords: "Passwords do not match", +} From 116679808e216092b1f82f3624a1c2a1a9fb05e1 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:06:20 +0200 Subject: [PATCH 10/51] chore(): create zod schemas for auth --- src/features/auth/schemas/login.js | 7 +++++++ src/features/auth/schemas/register.js | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/features/auth/schemas/login.js create mode 100644 src/features/auth/schemas/register.js diff --git a/src/features/auth/schemas/login.js b/src/features/auth/schemas/login.js new file mode 100644 index 0000000..a33bce1 --- /dev/null +++ b/src/features/auth/schemas/login.js @@ -0,0 +1,7 @@ +import { checkPassword } from "@/features/auth/utils/schemas" +import { z } from "zod" + +export const loginSchema = z.object({ + email: z.string().email(), + password: checkPassword, +}) diff --git a/src/features/auth/schemas/register.js b/src/features/auth/schemas/register.js new file mode 100644 index 0000000..b22934f --- /dev/null +++ b/src/features/auth/schemas/register.js @@ -0,0 +1,15 @@ +import { checkPassword } from "@/features/auth/utils/schemas" +import { matchs } from "@/utils/errors" +import { z } from "zod" + +export const registerSchema = z + .object({ + username: z.string(), + email: z.string().email(), + password: checkPassword, + confirmPassword: checkPassword, + }) + .refine(data => data.password === data.confirmPassword, { + message: matchs.passwords, + path: ["confirmPassword"], + }) From f90d6a59411aabebe2798ccb920612c5117385c2 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:07:43 +0200 Subject: [PATCH 11/51] chore(): moove user models and schema to an subfolder database --- src/features/users/database/models/User.js | 5 +++++ src/features/users/{ => database}/models/index.js | 0 src/features/users/{ => database}/schemas/User.js | 0 src/features/users/database/schemas/index.js | 1 + src/features/users/models/User.js | 5 ----- 5 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 src/features/users/database/models/User.js rename src/features/users/{ => database}/models/index.js (100%) rename src/features/users/{ => database}/schemas/User.js (100%) create mode 100644 src/features/users/database/schemas/index.js delete mode 100644 src/features/users/models/User.js diff --git a/src/features/users/database/models/User.js b/src/features/users/database/models/User.js new file mode 100644 index 0000000..d173c1a --- /dev/null +++ b/src/features/users/database/models/User.js @@ -0,0 +1,5 @@ +import { UserSchema } from "@/features/users/database/schemas" +import mongoose from "mongoose" + +export const UserModel = + mongoose.models.User || mongoose.model("User", UserSchema, "users") diff --git a/src/features/users/models/index.js b/src/features/users/database/models/index.js similarity index 100% rename from src/features/users/models/index.js rename to src/features/users/database/models/index.js diff --git a/src/features/users/schemas/User.js b/src/features/users/database/schemas/User.js similarity index 100% rename from src/features/users/schemas/User.js rename to src/features/users/database/schemas/User.js diff --git a/src/features/users/database/schemas/index.js b/src/features/users/database/schemas/index.js new file mode 100644 index 0000000..9ba6248 --- /dev/null +++ b/src/features/users/database/schemas/index.js @@ -0,0 +1 @@ +export * from "./User" diff --git a/src/features/users/models/User.js b/src/features/users/models/User.js deleted file mode 100644 index 79b8198..0000000 --- a/src/features/users/models/User.js +++ /dev/null @@ -1,5 +0,0 @@ -import { UserSchema } from "@/features/places/schemas" -import mongoose from "mongoose" - -export const PlaceModel = - mongoose.models.Place || mongoose.model("User", UserSchema, "users") From 4a877cdcb082d566e406fa7c2515dca86402d648 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:08:01 +0200 Subject: [PATCH 12/51] chore(): create a useUser hook --- src/features/users/hooks/index.js | 1 + src/features/users/hooks/useUser.js | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/features/users/hooks/index.js create mode 100644 src/features/users/hooks/useUser.js diff --git a/src/features/users/hooks/index.js b/src/features/users/hooks/index.js new file mode 100644 index 0000000..0dc9be2 --- /dev/null +++ b/src/features/users/hooks/index.js @@ -0,0 +1 @@ +export * from "./useUser" diff --git a/src/features/users/hooks/useUser.js b/src/features/users/hooks/useUser.js new file mode 100644 index 0000000..bd3f3c7 --- /dev/null +++ b/src/features/users/hooks/useUser.js @@ -0,0 +1,8 @@ +import { requestGetUser } from "@/features/users/utils/api" +import { useQuery } from "@tanstack/react-query" + +export const useUser = () => + useQuery({ + queryKey: ["users", "me"], + queryFn: () => requestGetUser(), + }) From ec66049cb068119ad4a76e6263c166db80f4cb3e Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:08:41 +0200 Subject: [PATCH 13/51] chore(): update import of defaultOptions fetch --- src/features/places/utils/api.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/features/places/utils/api.js b/src/features/places/utils/api.js index e867405..dc791ae 100644 --- a/src/features/places/utils/api.js +++ b/src/features/places/utils/api.js @@ -1,11 +1,6 @@ +import { defaultOptions } from "@/utils/constants" import { requestAPI } from "@/utils/functions" -const defaultOptions = { - headers: { - "Content-Type": "application/json", - }, -} - export const requestServerGetPlace = async placeId => await requestAPI(true, `/places/${placeId}`, defaultOptions) From 505317988d7169af62a4bd8972a2ef82cba4e081 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:08:57 +0200 Subject: [PATCH 14/51] chore(): create a dialog add component --- src/components/layouts/DialogAdd.jsx | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/components/layouts/DialogAdd.jsx diff --git a/src/components/layouts/DialogAdd.jsx b/src/components/layouts/DialogAdd.jsx new file mode 100644 index 0000000..0e546ac --- /dev/null +++ b/src/components/layouts/DialogAdd.jsx @@ -0,0 +1,45 @@ +import { Button } from "@/components/ui/button" +import { + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog" +import { CreatePlacesForm } from "@/features/places/components/forms/create" +import { EnterFullScreenIcon } from "@radix-ui/react-icons" +import { useTranslations } from "next-intl" +import Link from "next/link" + +export const DialogAdd = () => { + const t = useTranslations("DialogAdd") + const tUtils = useTranslations("Utils") + + return ( + + + + + + + {t("dialog.title")} + + + + + + + + ) +} + +DialogAdd.messages = ["DialogAdd", "Utils", ...CreatePlacesForm.messages] From 873f9959e3831144e239f52ab8f2b51b961872e8 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:09:36 +0200 Subject: [PATCH 15/51] chore(): create a auth service and a passwordSchema constant --- src/features/auth/services/auth.js | 31 +++++++++++++++++++++++++++++ src/features/auth/services/index.js | 1 + src/features/auth/utils/schemas.js | 8 ++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/features/auth/services/auth.js create mode 100644 src/features/auth/services/index.js create mode 100644 src/features/auth/utils/schemas.js diff --git a/src/features/auth/services/auth.js b/src/features/auth/services/auth.js new file mode 100644 index 0000000..41c0e55 --- /dev/null +++ b/src/features/auth/services/auth.js @@ -0,0 +1,31 @@ +import { UserService } from "@/features/users/services" +import { unknowns, wrongs } from "@/utils/errors" +import * as bcrypt from "bcrypt" + +export class AuthService { + static async check({ email, password }) { + try { + const { + password: userPassword, + // eslint-disable-next-line no-unused-vars + __v, + ...user + } = await UserService.findOne({ + email, + }) + const checkPassword = await bcrypt.compare(password, userPassword) + + if (!checkPassword) { + return Promise.reject(new Error(wrongs.password)) + } + + return user + } catch (error) { + if (error.message === unknowns.user) { + throw new Error(unknowns.account) + } + + throw new Error(wrongs.something) + } + } +} diff --git a/src/features/auth/services/index.js b/src/features/auth/services/index.js new file mode 100644 index 0000000..306751a --- /dev/null +++ b/src/features/auth/services/index.js @@ -0,0 +1 @@ +export * from "./auth" diff --git a/src/features/auth/utils/schemas.js b/src/features/auth/utils/schemas.js new file mode 100644 index 0000000..84b758e --- /dev/null +++ b/src/features/auth/utils/schemas.js @@ -0,0 +1,8 @@ +import { z } from "zod" + +export const checkPassword = z + .string() + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/u, + "Minimum eight characters, at least one uppercase letter, one lowercase letter, one number and one special character", + ) From 474189d051c4082250c37d3a51e9b219b4a7e2b2 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:10:26 +0200 Subject: [PATCH 16/51] chore(): update input component --- src/components/ui/forms/input.jsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/ui/forms/input.jsx b/src/components/ui/forms/input.jsx index cdd1c27..9ce618a 100644 --- a/src/components/ui/forms/input.jsx +++ b/src/components/ui/forms/input.jsx @@ -6,11 +6,16 @@ import { } from "@/components/ui/form" import { Input } from "@/components/ui/input" -export const FormFieldInput = ({ placeholder, field, label }) => ( +export const FormFieldInput = ({ + placeholder, + field, + label, + type = "text", +}) => ( {label} - + From e3c557f423690ad46c0a548cf24f09afecacb362 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:10:56 +0200 Subject: [PATCH 17/51] chore(): create user controller, service and utils api function --- src/features/users/controllers/index.js | 1 + src/features/users/controllers/me.js | 23 +++++++++ src/features/users/services/index.js | 1 + src/features/users/services/users.js | 69 +++++++++++++++++++++++++ src/features/users/utils/api.js | 5 ++ src/pages/api/users/me.js | 4 ++ 6 files changed, 103 insertions(+) create mode 100644 src/features/users/controllers/index.js create mode 100644 src/features/users/controllers/me.js create mode 100644 src/features/users/services/index.js create mode 100644 src/features/users/services/users.js create mode 100644 src/features/users/utils/api.js create mode 100644 src/pages/api/users/me.js diff --git a/src/features/users/controllers/index.js b/src/features/users/controllers/index.js new file mode 100644 index 0000000..6e0c1b5 --- /dev/null +++ b/src/features/users/controllers/index.js @@ -0,0 +1 @@ +export * from "./me" diff --git a/src/features/users/controllers/me.js b/src/features/users/controllers/me.js new file mode 100644 index 0000000..a68a143 --- /dev/null +++ b/src/features/users/controllers/me.js @@ -0,0 +1,23 @@ +import { decrypt } from "@/features/auth/utils/jwt" + +export class UserMeController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + + static async GET(req, res) { + const cookie = req.cookies.session + + if (!cookie) { + return res.status(403).json({ error: "Unauthorized" }) + } + + const { user } = await decrypt(cookie) + + return res.json(user) + } +} diff --git a/src/features/users/services/index.js b/src/features/users/services/index.js new file mode 100644 index 0000000..056d6e5 --- /dev/null +++ b/src/features/users/services/index.js @@ -0,0 +1 @@ +export * from "./users" diff --git a/src/features/users/services/users.js b/src/features/users/services/users.js new file mode 100644 index 0000000..5e3e34c --- /dev/null +++ b/src/features/users/services/users.js @@ -0,0 +1,69 @@ +import { UserModel } from "@/features/users/database/models" +import { unknowns } from "@/utils/errors" +import * as bcrypt from "bcrypt" + +export class UserService { + /** + * + * @param {import("ioredis").Redis} redisClient + * @param {string} id + */ + + static async get(redisClient, id) { + if (!(await redisClient.get(`users:${id}`))) { + const user = await UserModel.findById(id) + + if (!user) { + throw new Error(unknowns.user) + } + + await this.redisClient.set( + `users:${user._id}`, + JSON.stringify(user.toJSON()), + ) + } + + return JSON.parse(await this.redisClient.get(`users:${id}`)) + } + + /** + * + * @param {object} filter + * @returns {Promise} + */ + + static async findOne(filter) { + const user = await UserModel.findOne(filter) + + if (!user) { + throw new Error(unknowns.user) + } + + return user.toJSON() + } + + /** + * + * @param {import("ioredis").Redis} redisClient + * @param {{ username: string, password: string, email: string }} body + * @returns {Promise} + */ + static async create(redisClient, { password, username, email }) { + const hashPassword = await bcrypt.hash( + password, + parseInt(process.env.PASSWORD_SALT, 10), + ) + const newUser = new UserModel({ + username, + email, + password: hashPassword, + }) + + await newUser.save() + + await redisClient.set( + `users:${newUser._id}`, + JSON.stringify(newUser.toJSON()), + ) + } +} diff --git a/src/features/users/utils/api.js b/src/features/users/utils/api.js new file mode 100644 index 0000000..a1bd9c7 --- /dev/null +++ b/src/features/users/utils/api.js @@ -0,0 +1,5 @@ +import { defaultOptions } from "@/utils/constants" +import { requestAPI } from "@/utils/functions" + +export const requestGetUser = async () => + await requestAPI(false, "/users/me", defaultOptions) diff --git a/src/pages/api/users/me.js b/src/pages/api/users/me.js new file mode 100644 index 0000000..d5a6639 --- /dev/null +++ b/src/pages/api/users/me.js @@ -0,0 +1,4 @@ +import { UserMeController } from "@/features/users/controllers" +import { handlerApi } from "@/utils/functions.server" + +export default handlerApi(UserMeController) From 8701b465e5d8f91adf5f6ce96e4185970369f716 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:11:32 +0200 Subject: [PATCH 18/51] fix(): update import database schema places mock --- src/mocks/handlers/places.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mocks/handlers/places.js b/src/mocks/handlers/places.js index d98f429..72eb183 100644 --- a/src/mocks/handlers/places.js +++ b/src/mocks/handlers/places.js @@ -1,4 +1,7 @@ -import { updatePlaceSchema, updateSubSchemas } from "@/features/places/schemas" +import { + updatePlaceSchema, + updateSubSchemas, +} from "@/features/places/database/schemas" import { http, HttpResponse } from "msw" if (typeof window !== "undefined" && !localStorage.getItem("places")) { From 2da518b986ea4a2d7f34fa6dd2814f3c6472c45e Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:11:40 +0200 Subject: [PATCH 19/51] chore(): update header component --- src/components/layouts/header.jsx | 80 +++++++++++++++---------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/components/layouts/header.jsx b/src/components/layouts/header.jsx index 7fb5f0d..3cfa345 100644 --- a/src/components/layouts/header.jsx +++ b/src/components/layouts/header.jsx @@ -1,24 +1,36 @@ import { Logo } from "@/components/layouts" +import { DialogAdd } from "@/components/layouts/DialogAdd" import { LanguageSwitcher } from "@/components/layouts/LanguageSwitcher" import { MenuTheme } from "@/components/layouts/MenuTheme" import { Button } from "@/components/ui/button" -import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog" import { Link } from "@/components/ui/link" -import { CreatePlacesForm } from "@/features/places/components/forms/create" -import { EnterFullScreenIcon } from "@radix-ui/react-icons" +import { requestDeleteAuthLogout } from "@/features/auth/utils/api" +import { useUser } from "@/features/users/hooks" +import { useQueryClient } from "@tanstack/react-query" import { useTranslations } from "next-intl" +const navRightItems = tUtils => [ + { + href: "/login", + children: tUtils("login"), + }, + { + href: "/register", + children: tUtils("register"), + }, +] + export const Header = () => { - const t = useTranslations("Header") + const queryClient = useQueryClient() const tUtils = useTranslations("Utils") + const { data } = useUser() + const logout = () => async () => { + await requestDeleteAuthLogout() + await queryClient.refetchQueries({ + queryKey: ["users", "me"], + exact: true, + }) + } return (
@@ -27,38 +39,26 @@ export const Header = () => {
- - - - - - - {t("dialog.title")} - - - - - - - + + )) + ) : ( + <> + + + + )}
) } -Header.messages = [ - "Header", - ...MenuTheme.messages, - ...CreatePlacesForm.messages, -] +Header.messages = [...MenuTheme.messages, ...DialogAdd.messages] From 5889785fecc0683d8c0f9f717709dc10718dcbce Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:12:12 +0200 Subject: [PATCH 20/51] chore(): add a refetch queries when a place is created --- src/features/places/components/forms/create/FinalStep.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/features/places/components/forms/create/FinalStep.jsx b/src/features/places/components/forms/create/FinalStep.jsx index dd85759..e7fed2d 100644 --- a/src/features/places/components/forms/create/FinalStep.jsx +++ b/src/features/places/components/forms/create/FinalStep.jsx @@ -4,6 +4,7 @@ import { ScrollArea } from "@/components/ui/scroll-area" import { requestPostPlace } from "@/features/places/utils/api" import { useMultiStepsForm } from "@/hooks/forms" import { capitalize } from "@/utils/functions" +import { useQueryClient } from "@tanstack/react-query" import { useTranslations } from "next-intl" import { useRouter } from "next/router" import { useEffect, useState } from "react" @@ -13,6 +14,7 @@ const finalStepCards = ["info", "details"] // eslint-disable-next-line max-lines-per-function export const FinalStep = () => { const router = useRouter() + const queryClient = useQueryClient() const t = useTranslations("CreatePlace") const tUtils = useTranslations("Utils") const { back, formsData } = useMultiStepsForm() @@ -23,6 +25,10 @@ export const FinalStep = () => { } await requestPostPlace(body) + await queryClient.refetchQueries({ + queryKey: ["places"], + exact: true, + }) router.push("/") } From 8f33e20cd997d8138a0608281cb6850b17d62753 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:12:30 +0200 Subject: [PATCH 21/51] chore(): create the login page --- src/features/auth/components/login/form.jsx | 73 +++++++++++++++++++++ src/features/auth/components/login/index.js | 1 + src/pages/login.jsx | 24 +++++++ 3 files changed, 98 insertions(+) create mode 100644 src/features/auth/components/login/form.jsx create mode 100644 src/features/auth/components/login/index.js create mode 100644 src/pages/login.jsx diff --git a/src/features/auth/components/login/form.jsx b/src/features/auth/components/login/form.jsx new file mode 100644 index 0000000..88319f7 --- /dev/null +++ b/src/features/auth/components/login/form.jsx @@ -0,0 +1,73 @@ +import { generateFormFieldInput } from "@/components/functions" +import { Button } from "@/components/ui/button" +import { Form, FormField } from "@/components/ui/form" +import { ToastAction } from "@/components/ui/toast" +import { loginSchema } from "@/features/auth/schemas/login" +import { requestPostAuthLogin } from "@/features/auth/utils/api" +import { useToast } from "@/hooks/ui" +import { zodResolver } from "@hookform/resolvers/zod" +import { useQueryClient } from "@tanstack/react-query" +import { useTranslations } from "next-intl" +import { useRouter } from "next/router" +import { useForm } from "react-hook-form" + +const fields = t => [ + generateFormFieldInput({ + name: "email", + placeholder: t("form.email.placeholder"), + label: t("form.email.label"), + type: "email", + }), + generateFormFieldInput({ + name: "password", + placeholder: t("form.password.placeholder"), + label: t("form.password.label"), + type: "password", + }), +] + +export const LoginForm = () => { + const queryClient = useQueryClient() + const tPage = useTranslations("LoginPage") + const tUtils = useTranslations("Utils") + const router = useRouter() + const { toast } = useToast() + const form = useForm({ + resolver: zodResolver(loginSchema), + defaultValues: { + email: "", + password: "", + }, + }) + const onSubmit = async values => { + try { + await requestPostAuthLogin(values) + await queryClient.refetchQueries({ + queryKey: ["users", "me"], + exact: true, + }) + router.push("/") + } catch (error) { + toast({ + variant: "destructive", + title: "Uh oh! Something went wrong.", + description: "There was a problem with your request.", + action: Try again, + }) + } + } + + return ( +
+ + {fields(tPage).map(field => ( + + ))} + + + + ) +} diff --git a/src/features/auth/components/login/index.js b/src/features/auth/components/login/index.js new file mode 100644 index 0000000..4b457f4 --- /dev/null +++ b/src/features/auth/components/login/index.js @@ -0,0 +1 @@ +export * from "./form" diff --git a/src/pages/login.jsx b/src/pages/login.jsx new file mode 100644 index 0000000..ba90025 --- /dev/null +++ b/src/pages/login.jsx @@ -0,0 +1,24 @@ +import { Head } from "@/components/layouts" +import { LoginForm } from "@/features/auth/components/login" +import { MainLayout } from "@/layouts/Main" +import { serverTranslation } from "@/utils/functions.server" +import { useTranslations } from "next-intl" + +export const LoginPage = () => { + const tPage = useTranslations("LoginPage") + + return ( + <> + + + + ) +} + +LoginPage.messages = ["LoginPage", ...MainLayout.messages] + +export default LoginPage + +export const getServerSideProps = async ({ locale }) => ({ + props: await serverTranslation(locale, LoginPage), +}) From de5bf8279737272438b6516fc7c207f8b0e4eeba Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:12:47 +0200 Subject: [PATCH 22/51] chore(): create the register page --- .../auth/components/register/form.jsx | 80 +++++++++++++++++++ .../auth/components/register/index.js | 1 + src/pages/register.jsx | 24 ++++++ 3 files changed, 105 insertions(+) create mode 100644 src/features/auth/components/register/form.jsx create mode 100644 src/features/auth/components/register/index.js create mode 100644 src/pages/register.jsx diff --git a/src/features/auth/components/register/form.jsx b/src/features/auth/components/register/form.jsx new file mode 100644 index 0000000..93272d1 --- /dev/null +++ b/src/features/auth/components/register/form.jsx @@ -0,0 +1,80 @@ +import { generateFormFieldInput } from "@/components/functions" +import { Button } from "@/components/ui/button" +import { Form, FormField } from "@/components/ui/form" +import { ToastAction } from "@/components/ui/toast" +import { registerSchema } from "@/features/auth/schemas/register" +import { requestPostAuthRegister } from "@/features/auth/utils/api" +import { useToast } from "@/hooks/ui" +import { zodResolver } from "@hookform/resolvers/zod" +import { useTranslations } from "next-intl" +import { useRouter } from "next/router" +import { useForm } from "react-hook-form" + +const fields = t => [ + generateFormFieldInput({ + name: "username", + placeholder: t("form.username.placeholder"), + label: t("form.username.label"), + }), + generateFormFieldInput({ + name: "email", + placeholder: t("form.email.placeholder"), + label: t("form.email.label"), + type: "email", + }), + generateFormFieldInput({ + name: "password", + placeholder: t("form.password.placeholder"), + label: t("form.password.label"), + type: "password", + }), + generateFormFieldInput({ + name: "confirmPassword", + placeholder: t("form.confirmPassword.placeholder"), + label: t("form.confirmPassword.label"), + type: "password", + }), +] + +export const RegisterForm = () => { + const tPage = useTranslations("RegisterPage") + const tUtils = useTranslations("Utils") + const router = useRouter() + const { toast } = useToast() + const form = useForm({ + resolver: zodResolver(registerSchema), + defaultValues: { + username: "", + email: "", + password: "", + confirmPassword: "", + }, + }) + const onSubmit = async values => { + try { + await requestPostAuthRegister(values) + router.push("/") + } catch (error) { + toast({ + variant: "destructive", + title: "Uh oh! Something went wrong.", + description: "There was a problem with your request.", + action: Try again, + }) + } + } + + return ( +
+ + {fields(tPage).map(field => ( + + ))} + + + + ) +} diff --git a/src/features/auth/components/register/index.js b/src/features/auth/components/register/index.js new file mode 100644 index 0000000..4b457f4 --- /dev/null +++ b/src/features/auth/components/register/index.js @@ -0,0 +1 @@ +export * from "./form" diff --git a/src/pages/register.jsx b/src/pages/register.jsx new file mode 100644 index 0000000..f8e27fd --- /dev/null +++ b/src/pages/register.jsx @@ -0,0 +1,24 @@ +import { Head } from "@/components/layouts" +import { RegisterForm } from "@/features/auth/components/register" +import { MainLayout } from "@/layouts/Main" +import { serverTranslation } from "@/utils/functions.server" +import { useTranslations } from "next-intl" + +export const RegisterPage = () => { + const tPage = useTranslations("RegisterPage") + + return ( + <> + + + + ) +} + +RegisterPage.messages = ["RegisterPage", ...MainLayout.messages] + +export default RegisterPage + +export const getServerSideProps = async ({ locale }) => ({ + props: await serverTranslation(locale, RegisterPage), +}) From abc70f9af38b8cfd8e5ea28b7cfc8472a963a6ce Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:12:54 +0200 Subject: [PATCH 23/51] chore(): update languages --- src/languages/en.json | 41 ++++++++++++++++++++++++++++++++++++++++- src/languages/fr.json | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/languages/en.json b/src/languages/en.json index 9b601a3..80f3826 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -7,6 +7,9 @@ "finish": "Finish", "fullScreenMode": "Full screen mode", "languages": "Languages", + "login": "Login", + "register": "Register", + "logout": "Logout", "place": { "form": { "building": "Building", @@ -207,7 +210,7 @@ } } }, - "Header": { + "DialogAdd": { "add_button": "Add", "dialog": { "title": "Create a place" @@ -268,5 +271,41 @@ } } } + }, + "LoginPage": { + "title": "Login - chooseyourplace", + "description": "Login to your account", + "form": { + "email": { + "placeholder": "Email...", + "label": "Your email" + }, + "password": { + "placeholder": "Password...", + "label": "Your password" + } + } + }, + "RegisterPage": { + "title": "Register - chooseyourplace", + "description": "Create an account", + "form": { + "username": { + "placeholder": "Username...", + "label": "Your username" + }, + "email": { + "placeholder": "Email...", + "label": "Your email" + }, + "password": { + "placeholder": "Password...", + "label": "Your password" + }, + "confirmPassword": { + "placeholder": "Repeat the same password...", + "label": "Confirm your password" + } + } } } diff --git a/src/languages/fr.json b/src/languages/fr.json index cdcdb4b..364996e 100644 --- a/src/languages/fr.json +++ b/src/languages/fr.json @@ -7,6 +7,9 @@ "finish": "Terminer", "fullScreenMode": "Mode plein écran", "languages": "Langues", + "login": "Connexion", + "register": "S'inscrire", + "logout": "Déconnexion", "place": { "form": { "building": "Bâtiment", @@ -271,5 +274,41 @@ } } } + }, + "LoginPage": { + "title": "Connexion - chooseyourplace", + "description": "Connectez-vous à votre compte", + "form": { + "email": { + "placeholder": "Email...", + "label": "Votre email" + }, + "password": { + "placeholder": "Mot de passe...", + "label": "Votre mot de passe" + } + } + }, + "RegisterPage": { + "title": "Inscription - chooseyourplace", + "description": "Créé votre compte", + "form": { + "username": { + "placeholder": "Nom d'utilisateur...", + "label": "Votre nom d'utilisateur" + }, + "email": { + "placeholder": "Email...", + "label": "Votre email" + }, + "password": { + "placeholder": "Mot de passe...", + "label": "Votre mot de passe" + }, + "confirmPassword": { + "placeholder": "Répéter le même que précédemment mot de passe...", + "label": "Confirmer votre mot de passe" + } + } } } From 9430de0da1cca59b8dba13806c4a1f057c24469a Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:12:43 +0200 Subject: [PATCH 24/51] chore(): install resend and react-email, update dev script and create email script --- .env.example | 3 +- package-lock.json | 2847 +++++++++++++++++++++++++++++++++++++++++---- package.json | 8 +- 3 files changed, 2610 insertions(+), 248 deletions(-) diff --git a/.env.example b/.env.example index 94228ca..67bac7c 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,5 @@ DATABASE_URL="mongodb://USERNAME:PASSWORD@HOST:PORT/DATABASE" NEXT_PUBLIC_API_MOCKING= #enabled PASSWORD_SALT=10 -JWT_SECRET_KEY="" \ No newline at end of file +JWT_SECRET_KEY="" +RESEND_KEY="" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 815982c..e62a382 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", + "@react-email/components": "^0.0.16", "@tanstack/react-query": "^5.25.0", "@tanstack/react-table": "^8.13.2", "bcrypt": "^5.1.1", @@ -38,7 +39,9 @@ "next-themes": "^0.2.1", "react": "^18", "react-dom": "^18", + "react-email": "^2.1.1", "react-hook-form": "^7.51.0", + "resend": "^3.2.0", "zod": "^3.22.4" }, "devDependencies": { @@ -71,7 +74,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -86,7 +88,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -1845,6 +1846,21 @@ "statuses": "^2.0.1" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -2217,7 +2233,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2232,7 +2247,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2241,7 +2255,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2264,7 +2277,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2417,7 +2429,6 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2431,7 +2442,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -2443,8 +2453,7 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, "node_modules/@inquirer/confirm": { "version": "3.1.0", @@ -2536,7 +2545,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2553,7 +2561,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -2565,7 +2572,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2897,6 +2903,11 @@ "node": ">= 8" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" + }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", @@ -2923,7 +2934,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -2989,6 +2999,11 @@ "@prisma/debug": "5.11.0" } }, + "node_modules/@radix-ui/colors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-1.0.1.tgz", + "integrity": "sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==" + }, "node_modules/@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", @@ -3082,6 +3097,36 @@ } } }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", @@ -3382,6 +3427,43 @@ } } }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", @@ -3703,6 +3785,60 @@ } } }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", + "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", + "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-toggle": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", @@ -3891,6 +4027,268 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@react-email/body": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.7.tgz", + "integrity": "sha512-vjJ5P1MUNWV0KNivaEWA6MGj/I3c764qQJMsKjCHlW6mkFJ4SXbm2OlQFtKAb++Bj8LDqBlnE6oW77bWcMc0NA==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/button": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.14.tgz", + "integrity": "sha512-SMk40moGcAvkHIALX4XercQlK0PNeeEIam6OXHw68ea9WtzzqVwiK4pzLY0iiMI9B4xWHcaS2lCPf3cKbQBf1Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/code-block": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.3.tgz", + "integrity": "sha512-nxhl7WjjM2cOYtl0boBZfSObTrUCz2LbarcMyHkTVAsA9rbjbtWAQF7jmlefXJusk3Uol5l2c8hTh2lHLlHTRQ==", + "dependencies": { + "prismjs": "1.29.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/code-inline": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.1.tgz", + "integrity": "sha512-SeZKTB9Q4+TUafzeUm/8tGK3dFgywUHb1od/BrAiJCo/im65aT+oJfggJLjK2jCdSsus8odcK2kReeM3/FCNTQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/column": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.9.tgz", + "integrity": "sha512-1ekqNBgmbS6m97/sUFOnVvQtLYljUWamw8Y44VId95v6SjiJ4ca+hMcdOteHWBH67xkRofEOWTvqDRea5SBV8w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/components": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.16.tgz", + "integrity": "sha512-1WATpMSH03cRvhfNjGl/Up3seZJOzN9KLzlk3Q9g/cqNhZEJ7HYxoZM4AQKAI0V3ttXzzxKv8Oj+AZQLHDiICA==", + "dependencies": { + "@react-email/body": "0.0.7", + "@react-email/button": "0.0.14", + "@react-email/code-block": "0.0.3", + "@react-email/code-inline": "0.0.1", + "@react-email/column": "0.0.9", + "@react-email/container": "0.0.11", + "@react-email/font": "0.0.5", + "@react-email/head": "0.0.7", + "@react-email/heading": "0.0.11", + "@react-email/hr": "0.0.7", + "@react-email/html": "0.0.7", + "@react-email/img": "0.0.7", + "@react-email/link": "0.0.7", + "@react-email/markdown": "0.0.9", + "@react-email/preview": "0.0.8", + "@react-email/render": "0.0.12", + "@react-email/row": "0.0.7", + "@react-email/section": "0.0.11", + "@react-email/tailwind": "0.0.15", + "@react-email/text": "0.0.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/container": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.11.tgz", + "integrity": "sha512-jzl/EHs0ClXIRFamfH+NR/cqv4GsJJscqRhdYtnWYuRAsWpKBM1muycrrPqIVhWvWi6sFHInWTt07jX+bDc3SQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/font": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.5.tgz", + "integrity": "sha512-if/qKYmH3rJ2egQJoKbV8SfKCPavu+ikUq/naT/UkCr8Q0lkk309tRA0x7fXG/WeIrmcipjMzFRGTm2TxTecDw==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/head": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.7.tgz", + "integrity": "sha512-IcXL4jc0H1qzAXJCD9ajcRFBQdbUHkjKJyiUeogpaYSVZSq6cVDWQuGaI23TA9k+pI2TFeQimogUFb3Kgeeudw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/heading": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.11.tgz", + "integrity": "sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==", + "dependencies": { + "@radix-ui/react-slot": "1.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/hr": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.7.tgz", + "integrity": "sha512-8suK0M/deXHt0DBSeKhSC4bnCBCBm37xk6KJh9M0/FIKlvdltQBem52YUiuqVl1XLB87Y6v6tvspn3SZ9fuxEA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.7.tgz", + "integrity": "sha512-oy7OoRtoOKApVI/5Lz1OZptMKmMYJu9Xn6+lOmdBQchAuSdQtWJqxhrSj/iI/mm8HZWo6MZEQ6SFpfOuf8/P6Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/img": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.7.tgz", + "integrity": "sha512-up9tM2/dJ24u/CFjcvioKbyGuPw1yeJg605QA7VkrygEhd0CoQEjjgumfugpJ+VJgIt4ZjT9xMVCK5QWTIWoaA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/link": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.7.tgz", + "integrity": "sha512-hXPChT3ZMyKnUSA60BLEMD2maEgyB2A37yg5bASbLMrXmsExHi6/IS1h2XiUPLDK4KqH5KFaFxi2cdNo1JOKwA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/markdown": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.9.tgz", + "integrity": "sha512-t//19Zz+W5svKqrSrqoOLpf6dq70jbwYxX8Z+NEMi4LqylklccOaYAyKrkYyulfZwhW7KDH9d2wjVk5jfUABxQ==", + "dependencies": { + "md-to-react-email": "5.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/preview": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.8.tgz", + "integrity": "sha512-Jm0KUYBZQd2w0s2QRMQy0zfHdo3Ns+9bYSE1OybjknlvhANirjuZw9E5KfWgdzO7PyrRtB1OBOQD8//Obc4uIQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/render": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.12.tgz", + "integrity": "sha512-S8WRv/PqECEi6x0QJBj0asnAb5GFtJaHlnByxLETLkgJjc76cxMYDH4r9wdbuJ4sjkcbpwP3LPnVzwS+aIjT7g==", + "dependencies": { + "html-to-text": "9.0.5", + "js-beautify": "^1.14.11", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@react-email/row": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.7.tgz", + "integrity": "sha512-h7pwrLVGk5CIx7Ai/oPxBgCCAGY7BEpCUQ7FCzi4+eThcs5IdjSwDPefLEkwaFS8KZc56UNwTAH92kNq5B7blg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/section": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.11.tgz", + "integrity": "sha512-3bZ/DuvX1julATI7oqYza6pOtWZgLJDBaa62LFFEvYjisyN+k6lrP2KOucPsDKu2DOkUzlQgK0FOm6VQJX+C0w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/tailwind": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.15.tgz", + "integrity": "sha512-TE3NQ7VKhhvv3Zv0Z1NtoV6AF7aOWiG4juVezMZw1hZCG0mkN6iXC63u23vPQi12y6xCp20ZUHfg67kQeDSP/g==", + "dependencies": { + "react": "18.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/text": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.7.tgz", + "integrity": "sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", @@ -4066,12 +4464,29 @@ "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", "dev": true }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -4102,14 +4517,214 @@ "sourcemap-codec": "^1.4.8" } }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "node_modules/@swc/core": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.101.tgz", + "integrity": "sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A==", + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.101", + "@swc/core-darwin-x64": "1.3.101", + "@swc/core-linux-arm-gnueabihf": "1.3.101", + "@swc/core-linux-arm64-gnu": "1.3.101", + "@swc/core-linux-arm64-musl": "1.3.101", + "@swc/core-linux-x64-gnu": "1.3.101", + "@swc/core-linux-x64-musl": "1.3.101", + "@swc/core-win32-arm64-msvc": "1.3.101", + "@swc/core-win32-ia32-msvc": "1.3.101", + "@swc/core-win32-x64-msvc": "1.3.101" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.101.tgz", + "integrity": "sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.101.tgz", + "integrity": "sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.101.tgz", + "integrity": "sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.101.tgz", + "integrity": "sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.101.tgz", + "integrity": "sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.101.tgz", + "integrity": "sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.101.tgz", + "integrity": "sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.101.tgz", + "integrity": "sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.101.tgz", + "integrity": "sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.101", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.101.tgz", + "integrity": "sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@swc/types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tanstack/query-core": { "version": "5.28.4", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.4.tgz", @@ -4341,11 +4956,18 @@ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4355,7 +4977,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -4408,17 +5029,20 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { "version": "18.2.69", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.69.tgz", "integrity": "sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==", - "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4429,7 +5053,6 @@ "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", - "devOptional": true, "dependencies": { "@types/react": "*" } @@ -4445,8 +5068,7 @@ "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/statuses": { "version": "2.0.5", @@ -4464,6 +5086,16 @@ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, + "node_modules/@types/webpack": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, "node_modules/@types/whatwg-url": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", @@ -4608,8 +5240,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-react": { "version": "4.2.1", @@ -4794,7 +5425,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4803,26 +5433,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "peer": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "peer": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "peer": true + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4832,14 +5458,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "peer": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -4851,7 +5475,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4860,7 +5483,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -4868,14 +5490,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "peer": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -4891,7 +5511,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4904,7 +5523,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -4916,7 +5534,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4930,7 +5547,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" @@ -4939,20 +5555,30 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -4968,7 +5594,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peer": true, "peerDependencies": { "acorn": "^8" } @@ -4977,7 +5602,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5078,14 +5702,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5114,14 +5736,12 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { "version": "1.2.3", @@ -5497,11 +6117,49 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-walk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0.tgz", + "integrity": "sha512-fdRxJkQ9MUSEi4jH2DcV3FAPFktk0wefilxrwNyUuWpoWawQGN7G7cB+fOYTtFfI6XNkFgwqJ/D3G18BoJJ/jg==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", @@ -5527,7 +6185,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -5535,6 +6192,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5594,6 +6261,29 @@ "node": ">=16.20.1" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5652,7 +6342,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -5661,7 +6350,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -5778,7 +6466,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "peer": true, "engines": { "node": ">=6.0" } @@ -5816,11 +6503,21 @@ "webpack": ">=4.0.0 <6.0.0" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, "engines": { "node": ">=6" }, @@ -5893,6 +6590,14 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", @@ -5949,7 +6654,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -5972,6 +6676,15 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -6003,11 +6716,22 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6035,7 +6759,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6058,8 +6781,7 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -6153,13 +6875,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, + "node_modules/debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", + "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { "node": ">=6.0" }, @@ -6222,8 +6955,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -6233,6 +6965,17 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -6401,8 +7144,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -6427,14 +7169,12 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6448,11 +7188,116 @@ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "dev": true }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/ejs": { "version": "3.1.9", @@ -6476,8 +7321,7 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -6487,6 +7331,99 @@ "node": ">= 4" } }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", @@ -6503,7 +7440,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -6643,8 +7579,7 @@ "node_modules/es-module-lexer": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.2.tgz", - "integrity": "sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==", - "peer": true + "integrity": "sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -6745,7 +7680,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -6757,7 +7691,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6846,6 +7779,17 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-config-turbo": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.12.tgz", + "integrity": "sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==", + "dependencies": { + "eslint-plugin-turbo": "1.10.12" + }, + "peerDependencies": { + "eslint": ">6.6.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -7090,11 +8034,21 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-turbo": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.12.tgz", + "integrity": "sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==", + "dependencies": { + "dotenv": "16.0.3" + }, + "peerDependencies": { + "eslint": ">6.6.0" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7110,7 +8064,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7122,7 +8075,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -7139,7 +8091,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -7187,7 +8138,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -7254,8 +8204,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastq": { "version": "1.17.1", @@ -7293,7 +8242,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -7359,7 +8307,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7375,7 +8322,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -7388,8 +8334,7 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/for-each": { "version": "0.3.3", @@ -7403,7 +8348,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -7433,7 +8377,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, "engines": { "node": "*" }, @@ -7442,6 +8385,29 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "10.17.4", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.17.4.tgz", + "integrity": "sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -7680,7 +8646,6 @@ "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -7702,7 +8667,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -7713,14 +8677,12 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -7729,7 +8691,6 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7744,7 +8705,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -7807,8 +8767,7 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/graphql": { "version": "16.8.1", @@ -7916,6 +8875,39 @@ "node": ">=18" } }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -7968,6 +8960,25 @@ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -7980,7 +8991,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7996,7 +9006,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -8024,6 +9033,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -8037,6 +9051,14 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/intl-messageformat": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz", @@ -8157,7 +9179,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -8284,6 +9305,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8382,7 +9411,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -8496,6 +9524,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -8543,8 +9582,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/iterator.prototype": { "version": "1.1.2", @@ -8563,7 +9601,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -8625,7 +9662,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -8638,23 +9674,72 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/js-beautify": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", "dependencies": { - "argparse": "^2.0.1" + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsdom": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", @@ -8734,14 +9819,12 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "peer": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -8756,8 +9839,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "1.0.2", @@ -8831,7 +9913,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -8854,6 +9935,14 @@ "node": ">=0.10" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -8866,7 +9955,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8879,7 +9967,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -8887,14 +9974,12 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, "engines": { "node": ">=6.11.5" } @@ -8943,7 +10028,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8977,14 +10061,28 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9009,7 +10107,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, "engines": { "node": "14 || >=16.14" } @@ -9065,6 +10162,28 @@ "semver": "bin/semver.js" } }, + "node_modules/marked": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz", + "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/md-to-react-email": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/md-to-react-email/-/md-to-react-email-5.0.2.tgz", + "integrity": "sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==", + "dependencies": { + "marked": "7.0.4" + }, + "peerDependencies": { + "react": "18.x" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -9159,7 +10278,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -9427,7 +10545,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -9454,8 +10571,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "0.6.3", @@ -9468,8 +10584,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next": { "version": "14.1.3", @@ -9655,7 +10770,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9664,7 +10778,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9725,7 +10838,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -9880,7 +10992,6 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -9893,6 +11004,28 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/outvariant": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.2.tgz", @@ -9903,7 +11036,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9918,7 +11050,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9949,7 +11080,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -9969,6 +11099,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9994,7 +11136,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -10008,7 +11149,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -10049,6 +11189,14 @@ "node": "*" } }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -10069,7 +11217,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10097,7 +11244,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -10228,7 +11374,6 @@ "version": "8.4.36", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.36.tgz", "integrity": "sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -10256,7 +11401,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -10273,7 +11417,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -10292,7 +11435,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -10327,7 +11469,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, "engines": { "node": ">=14" }, @@ -10339,7 +11480,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -10358,7 +11498,6 @@ "version": "6.0.16", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10370,14 +11509,12 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -10513,6 +11650,26 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/prism-react-renderer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.1.0.tgz", + "integrity": "sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prism-react-renderer/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/prisma": { "version": "5.11.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.11.0.tgz", @@ -10529,6 +11686,14 @@ "node": ">=16.13" } }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -10540,6 +11705,11 @@ "react-is": "^16.13.1" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -10574,40 +11744,1032 @@ "url": "https://www.patreon.com/feross" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-email": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-2.1.1.tgz", + "integrity": "sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==", + "dependencies": { + "@babel/parser": "7.24.1", + "@radix-ui/colors": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-popover": "1.0.7", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-toggle-group": "1.0.4", + "@radix-ui/react-tooltip": "1.0.6", + "@react-email/components": "0.0.16", + "@react-email/render": "0.0.12", + "@swc/core": "1.3.101", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@types/webpack": "5.28.5", + "autoprefixer": "10.4.14", + "babel-walk": "3.0.0", + "chalk": "4.1.2", + "chokidar": "3.5.3", + "clsx": "2.1.0", + "commander": "11.1.0", + "debounce": "2.0.0", + "esbuild": "0.19.11", + "eslint-config-prettier": "9.0.0", + "eslint-config-turbo": "1.10.12", + "framer-motion": "10.17.4", + "glob": "10.3.4", + "log-symbols": "4.1.0", + "mime-types": "2.1.35", + "next": "14.1.0", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "postcss": "8.4.35", + "prism-react-renderer": "2.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "shelljs": "0.8.5", + "socket.io": "4.7.3", + "socket.io-client": "4.7.3", + "sonner": "1.3.1", + "source-map-js": "1.0.2", + "stacktrace-parser": "0.1.10", + "tailwind-merge": "2.2.0", + "tailwindcss": "3.4.0", + "typescript": "5.1.6" + }, + "bin": { + "email": "cli/index.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/react-email/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/react-email/node_modules/@next/env": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", + "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" + }, + "node_modules/react-email/node_modules/@next/swc-darwin-arm64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", + "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-darwin-x64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", + "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", + "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-linux-arm64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", + "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", + "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", + "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", + "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", + "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@next/swc-win32-x64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", + "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-email/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-email/node_modules/@radix-ui/react-popper": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", + "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-email/node_modules/@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-email/node_modules/@radix-ui/react-tooltip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz", + "integrity": "sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.2", + "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-email/node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/react-email/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/react-email/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/react-email/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-email/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/react-email/node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/react-email/node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/react-email/node_modules/glob": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", + "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==", + "dependencies": { + "@next/env": "14.1.0", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.1.0", + "@next/swc-darwin-x64": "14.1.0", + "@next/swc-linux-arm64-gnu": "14.1.0", + "@next/swc-linux-arm64-musl": "14.1.0", + "@next/swc-linux-x64-gnu": "14.1.0", + "@next/swc-linux-x64-musl": "14.1.0", + "@next/swc-win32-arm64-msvc": "14.1.0", + "@next/swc-win32-ia32-msvc": "14.1.0", + "@next/swc-win32-x64-msvc": "14.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/react-email/node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react-email/node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/react-email/node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-email/node_modules/tailwind-merge": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.0.tgz", + "integrity": "sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==", "dependencies": { - "safe-buffer": "^5.1.0" + "@babel/runtime": "^7.23.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "node_modules/react-email/node_modules/tailwindcss": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", + "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", "dependencies": { - "loose-envify": "^1.1.0" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "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.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "node_modules/react-email/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "react": "^18.2.0" + "engines": { + "node": ">=14.17" } }, "node_modules/react-hook-form": { @@ -10711,7 +12873,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -10733,7 +12894,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -10741,6 +12901,17 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -10898,6 +13069,17 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resend": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/resend/-/resend-3.2.0.tgz", + "integrity": "sha512-lDHhexiFYPoLXy7zRlJ8D5eKxoXy6Tr9/elN3+Vv7PkUoYuSSD1fpiIfa/JYXEWyiyN2UczkCTLpkT8dDPJ4Pg==", + "dependencies": { + "@react-email/render": "0.0.12" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -10918,7 +13100,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -10932,6 +13113,45 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11138,6 +13358,17 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -11210,7 +13441,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11222,11 +13452,45 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -11259,7 +13523,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -11275,6 +13538,87 @@ "node": ">=8" } }, + "node_modules/socket.io": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz", + "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", + "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sonner": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.3.1.tgz", + "integrity": "sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -11325,6 +13669,25 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -11383,7 +13746,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -11401,7 +13763,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11414,14 +13775,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -11433,7 +13792,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -11535,7 +13893,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11588,7 +13945,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -11640,7 +13996,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -11899,14 +14254,12 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -11915,7 +14268,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -12007,8 +14359,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "3.15.0", @@ -12031,7 +14382,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -12052,7 +14402,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -12338,6 +14687,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", @@ -12496,7 +14853,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12505,6 +14861,14 @@ "node": ">=10.13.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -12517,7 +14881,6 @@ "version": "5.91.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -12564,7 +14927,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -12573,7 +14935,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12586,7 +14947,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, "engines": { "node": ">=4.0" } @@ -12595,7 +14955,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -12646,7 +15005,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13210,7 +15568,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -13228,7 +15585,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13244,14 +15600,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13265,7 +15619,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -13277,7 +15630,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -13289,7 +15641,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -13341,6 +15692,14 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13359,7 +15718,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, "bin": { "yaml": "bin.mjs" }, @@ -13418,7 +15776,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index c26ffd0..af48994 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "dev": "next dev", + "dev": "docker-compose up -d && next dev", "build": "next build", "start": "next start", "lint": "next lint", @@ -14,7 +14,8 @@ "test": "vitest run", "test:watch": "vitest", "test:e2e": "playwright test -c ./playwright.config.cjs", - "test:e2e:ui": "playwright test -c ./playwright.config.cjs --ui" + "test:e2e:ui": "playwright test -c ./playwright.config.cjs --ui", + "email": "email dev --dir src/components/emails --port 3001" }, "dependencies": { "@hookform/resolvers": "^3.3.4", @@ -31,6 +32,7 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", + "@react-email/components": "^0.0.16", "@tanstack/react-query": "^5.25.0", "@tanstack/react-table": "^8.13.2", "bcrypt": "^5.1.1", @@ -47,7 +49,9 @@ "next-themes": "^0.2.1", "react": "^18", "react-dom": "^18", + "react-email": "^2.1.1", "react-hook-form": "^7.51.0", + "resend": "^3.2.0", "zod": "^3.22.4" }, "devDependencies": { From 713c90116f40cc8ba4b24c7c8ee02d752a11c7da Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:12:56 +0200 Subject: [PATCH 25/51] chore(): create an email template --- src/components/emails/RegisterAccount.jsx | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/components/emails/RegisterAccount.jsx diff --git a/src/components/emails/RegisterAccount.jsx b/src/components/emails/RegisterAccount.jsx new file mode 100644 index 0000000..a745560 --- /dev/null +++ b/src/components/emails/RegisterAccount.jsx @@ -0,0 +1,38 @@ +import { + Body, + Container, + Head, + Html, + Link, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components" + +export const RegisterAccountEmail = ({ generatedLink, username = "Test" }) => ( + + + Verified your account + + + +
+ + Hello {username}, please click to the button in the button to + verify your email + + + Verify my email + +
+
+ +
+ +) + +export default RegisterAccountEmail From 0494b1914c83c2bffb7a8085bc29af8c40d702d6 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:14:31 +0200 Subject: [PATCH 26/51] fix(): moove jwt to lib folder --- src/features/users/controllers/me.js | 2 +- src/{features/auth/utils => lib}/jwt.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{features/auth/utils => lib}/jwt.js (100%) diff --git a/src/features/users/controllers/me.js b/src/features/users/controllers/me.js index a68a143..6fdbc1b 100644 --- a/src/features/users/controllers/me.js +++ b/src/features/users/controllers/me.js @@ -1,4 +1,4 @@ -import { decrypt } from "@/features/auth/utils/jwt" +import { decrypt } from "@/lib/jwt" export class UserMeController { /** diff --git a/src/features/auth/utils/jwt.js b/src/lib/jwt.js similarity index 100% rename from src/features/auth/utils/jwt.js rename to src/lib/jwt.js From e4db85c9dc452802b3dc0fbd6227baf68fd944fe Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:14:50 +0200 Subject: [PATCH 27/51] chore(): create middleware to secure with authentification --- src/middleware.js | 36 ++++++++++++++++++++++++++++++++++++ src/utils/constants.js | 7 +++++++ 2 files changed, 43 insertions(+) create mode 100644 src/middleware.js diff --git a/src/middleware.js b/src/middleware.js new file mode 100644 index 0000000..b8853ab --- /dev/null +++ b/src/middleware.js @@ -0,0 +1,36 @@ +import { loginRequiredPaths } from "@/utils/constants" +import { NextResponse } from "next/server" + +/** + * + * @param {import("next/server").NextRequest} req + * @returns + */ +const middleware = req => { + if (loginRequiredPaths.find(path => path === req.nextUrl.pathname)) { + const sessionToken = req.cookies.get("session")?.value + + if (!sessionToken) { + return NextResponse.rewrite(new URL("/login", req.url)) + } + + return NextResponse.next() + } + + if ( + req.nextUrl.pathname.startsWith("/places") && + req.nextUrl.pathname.endsWith("/update") + ) { + const sessionToken = req.cookies.get("session")?.value + + if (!sessionToken) { + return NextResponse.rewrite(new URL("/login", req.url)) + } + + return NextResponse.next() + } + + return NextResponse.next() +} + +export default middleware diff --git a/src/utils/constants.js b/src/utils/constants.js index a707a71..4d1f8bd 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -16,3 +16,10 @@ export const defaultOptions = { "Content-Type": "application/json", }, } + +export const domainName = + process.env.NODE_ENV === "development" + ? "http://localhost:3000" + : process.env.DOMAIN_NAME + +export const loginRequiredPaths = ["/places/create"] From 1d9d5e86c911be2bf4ac74cedbad9c3b918c5577 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:15:32 +0200 Subject: [PATCH 28/51] chore(): add jsdoc for the formatTitle function --- src/utils/functions.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/functions.js b/src/utils/functions.js index b82f716..9a58496 100644 --- a/src/utils/functions.js +++ b/src/utils/functions.js @@ -92,5 +92,9 @@ export const pick = (object, keys) => return obj }, {}) - +/** + * + * @param {string} title + * @returns {string} + */ export const formatTitle = title => title.split("-")[0].trim() From 18473327a0e15c0cd787c59c12bb339d7d051efa Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:19:08 +0200 Subject: [PATCH 29/51] chore(): create a card place details component, --- .../components/info/CardPlaceDetails.jsx | 38 ++++++++++++++ .../places/components/info/details.jsx | 3 ++ src/features/places/components/info/index.js | 1 + src/pages/places/[placeId]/index.jsx | 51 ++++++++----------- 4 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 src/features/places/components/info/CardPlaceDetails.jsx diff --git a/src/features/places/components/info/CardPlaceDetails.jsx b/src/features/places/components/info/CardPlaceDetails.jsx new file mode 100644 index 0000000..b829f87 --- /dev/null +++ b/src/features/places/components/info/CardPlaceDetails.jsx @@ -0,0 +1,38 @@ +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { ScrollArea } from "@/components/ui/scroll-area" +import { PlaceDetails } from "@/features/places/components/info/details" +import { usePlace } from "@/features/places/hooks" +import { useTranslations } from "next-intl" +import { useRouter } from "next/router" +import { useMemo } from "react" + +export const CardPlaceDetails = () => { + const t = useTranslations("PlaceDetailsPage") + const router = useRouter() + const placeId = useMemo(() => router.query.placeId, [router.query.placeId]) + const { data } = usePlace(placeId) + + return ( + + + + + {t.rich("content.title", { + name: data.name, + nameComponent: chunks => ( + {chunks} + ), + })} + + + + + + + + + + ) +} + +CardPlaceDetails.messages = ["PlaceDetailsPage", ...PlaceDetails.messages] diff --git a/src/features/places/components/info/details.jsx b/src/features/places/components/info/details.jsx index 3fcd4b4..6ece1d3 100644 --- a/src/features/places/components/info/details.jsx +++ b/src/features/places/components/info/details.jsx @@ -89,6 +89,9 @@ export const PlaceDetails = ({ place }) => { ) } + +PlaceDetails.messages = ["Utils"] + const PlaceTitleDetails = ({ className, ...props }) => (
{ const router = useRouter() const placeId = useMemo(() => router.query.placeId, [router.query.placeId]) const { data, isLoading, isError } = usePlace(placeId) + const { data: userData } = useUser() return ( @@ -29,33 +29,22 @@ const PlaceDetailsPage = () => { description={t("description", { name: data.name })} />
- - - - - {t.rich("content.title", { - name: data.name, - nameComponent: chunks => ( - {chunks} - ), - })} - - - - - - - - - - - - - + + {userData?.username && ( + <> + + + + + + )}
@@ -65,7 +54,7 @@ const PlaceDetailsPage = () => { PlaceDetailsPage.messages = [ "PlaceDetailsPage", "Utils", - "PlaceDetails", + ...CardPlaceDetails.messages, ...MainLayout.messages, ...Loading.messages, ...ErrorHandler.messages, From 5d69fef4e9c3126fb8ee4dd5efb83e0835d90078 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:19:14 +0200 Subject: [PATCH 30/51] chore(): when login the user is able to have the delete button --- .../places/components/info/dialogActionColumn.jsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/features/places/components/info/dialogActionColumn.jsx b/src/features/places/components/info/dialogActionColumn.jsx index 71ad7f4..130f414 100644 --- a/src/features/places/components/info/dialogActionColumn.jsx +++ b/src/features/places/components/info/dialogActionColumn.jsx @@ -10,6 +10,7 @@ import { import { Link } from "@/components/ui/link" import { DeleteDialogValidation } from "@/features/places/components/delete/dialogValidation" import { PlaceDetails } from "@/features/places/components/info" +import { useUser } from "@/features/users/hooks" import { DialogTrigger } from "@radix-ui/react-dialog" import { DotsHorizontalIcon, EnterFullScreenIcon } from "@radix-ui/react-icons" import { useTranslations } from "next-intl" @@ -17,6 +18,7 @@ import { useTranslations } from "next-intl" export const DialogActionColumn = ({ place }) => { const t = useTranslations("HomePage") const tUtils = useTranslations("Utils") + const { data: userData } = useUser() return ( @@ -45,9 +47,11 @@ export const DialogActionColumn = ({ place }) => { - - - + {userData?.username && ( + + + + )} From c8f0103138f0259f7c9b70448c44719ce6f9d69d Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:19:30 +0200 Subject: [PATCH 31/51] chore(): create email lib --- src/lib/email.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/lib/email.js diff --git a/src/lib/email.js b/src/lib/email.js new file mode 100644 index 0000000..c0bf8e0 --- /dev/null +++ b/src/lib/email.js @@ -0,0 +1,19 @@ +import { Resend } from "resend" + +/** + * + * @param {string} to + * @param {string} subject + * @param {import("react").ReactElement} react + */ + +export const sendEmail = (to, subject, react) => { + const resend = new Resend(process.env.RESEND_KEY) + + resend.emails.send({ + from: "onboarding@resend.dev", + to, + subject, + react, + }) +} From b57a90839225fd57c08b1993f2680dac6824b8d6 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:19:44 +0200 Subject: [PATCH 32/51] chore(): update users service and user schema --- src/features/users/database/schemas/User.js | 11 +++++++++-- src/features/users/services/users.js | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/features/users/database/schemas/User.js b/src/features/users/database/schemas/User.js index 0fe9bd3..8e6380c 100644 --- a/src/features/users/database/schemas/User.js +++ b/src/features/users/database/schemas/User.js @@ -7,8 +7,15 @@ export const UserSchema = new Schema( email: requiredArgSchema(String), password: requiredArgSchema(String), verified: { - type: Boolean, - default: false, + state: { + type: Boolean, + default: false, + }, + token: { + type: String, + // eslint-disable-next-line no-invalid-this + required: () => this?.verified.state === false, + }, }, }, { timestamps: true }, diff --git a/src/features/users/services/users.js b/src/features/users/services/users.js index 5e3e34c..3cfb65f 100644 --- a/src/features/users/services/users.js +++ b/src/features/users/services/users.js @@ -39,7 +39,7 @@ export class UserService { throw new Error(unknowns.user) } - return user.toJSON() + return user } /** @@ -48,7 +48,7 @@ export class UserService { * @param {{ username: string, password: string, email: string }} body * @returns {Promise} */ - static async create(redisClient, { password, username, email }) { + static async create(redisClient, { password, username, email, token }) { const hashPassword = await bcrypt.hash( password, parseInt(process.env.PASSWORD_SALT, 10), @@ -57,6 +57,10 @@ export class UserService { username, email, password: hashPassword, + verified: { + state: false, + token, + }, }) await newUser.save() @@ -66,4 +70,14 @@ export class UserService { JSON.stringify(newUser.toJSON()), ) } + + /** + * + * @param {object} filter + * @returns {Promise} + */ + + static async exists(filter) { + return Boolean(await UserModel.exists(filter)) + } } From 34df8b122a270d2f6eaf40b238e65ff98b91e617 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:20:35 +0200 Subject: [PATCH 33/51] chore(): add a toast after register account and add feature send email after register --- src/features/auth/components/register/form.jsx | 4 ++++ src/features/auth/controllers/register.js | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/features/auth/components/register/form.jsx b/src/features/auth/components/register/form.jsx index 93272d1..e536fd0 100644 --- a/src/features/auth/components/register/form.jsx +++ b/src/features/auth/components/register/form.jsx @@ -54,6 +54,10 @@ export const RegisterForm = () => { try { await requestPostAuthRegister(values) router.push("/") + toast({ + title: "Check your email", + description: "An email was send to verify your account", + }) } catch (error) { toast({ variant: "destructive", diff --git a/src/features/auth/controllers/register.js b/src/features/auth/controllers/register.js index 8d5487c..538d5e0 100644 --- a/src/features/auth/controllers/register.js +++ b/src/features/auth/controllers/register.js @@ -1,7 +1,12 @@ +import { RegisterAccountEmail } from "@/components/emails/RegisterAccount" import { registerSchema } from "@/features/auth/schemas/register" +import { generateEmailVerificationToken } from "@/features/auth/utils/functions" import { UserModel } from "@/features/users/database/models" import { UserService } from "@/features/users/services" +import { sendEmail } from "@/lib/email" +import { domainName } from "@/utils/constants" import { matchs, wrongs } from "@/utils/errors" +import React from "react" export class RegisterController { /** @@ -40,7 +45,18 @@ export class RegisterController { }) } - await UserService.create(redisClient, req.body) + const token = generateEmailVerificationToken() + + await UserService.create(redisClient, { token, ...req.body }) + + sendEmail( + email, + "Verify your account", + React.createElement(RegisterAccountEmail, { + generatedLink: `${domainName}/verify?token=${token}`, + username, + }), + ) return res.status(201).json({ created: true }) } catch (error) { From 6ac5773c38c24e2c1326fdb5111305efd427631d Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:21:21 +0200 Subject: [PATCH 34/51] chore(): create verify api controller and a generateEmailVerificationToken function --- src/features/auth/controllers/index.js | 1 + src/features/auth/controllers/verify.js | 41 +++++++++++++++++++++++++ src/features/auth/schemas/verify.js | 5 +++ src/features/auth/services/auth.js | 8 +++-- src/features/auth/utils/functions.js | 8 +++++ src/pages/api/auth/verify.js | 4 +++ 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/features/auth/controllers/verify.js create mode 100644 src/features/auth/schemas/verify.js create mode 100644 src/features/auth/utils/functions.js create mode 100644 src/pages/api/auth/verify.js diff --git a/src/features/auth/controllers/index.js b/src/features/auth/controllers/index.js index 0bda331..a820b3e 100644 --- a/src/features/auth/controllers/index.js +++ b/src/features/auth/controllers/index.js @@ -1,3 +1,4 @@ export * from "./login" export * from "./logout" export * from "./register" +export * from "./verify" diff --git a/src/features/auth/controllers/verify.js b/src/features/auth/controllers/verify.js new file mode 100644 index 0000000..f0606ba --- /dev/null +++ b/src/features/auth/controllers/verify.js @@ -0,0 +1,41 @@ +import { verifyQuerySchema } from "@/features/auth/schemas/verify" +import { UserService } from "@/features/users/services" + +export class VerifyController { + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + + static async GET(req, res) { + const { token } = await verifyQuerySchema.parseAsync(req.query) + + if (!(await UserService.exists({ "verified.token": token }))) { + return res.status(404).json({ exists: false, error: "Not found" }) + } + + return res.json({ exists: true }) + } + + /** + * + * @param {import("next").NextApiRequest} req + * @param {import("next").NextApiResponse} res + * @param {import("ioredis").Redis} redisClient + * @returns {void} + */ + + static async PATCH(req, res) { + const { token } = await verifyQuerySchema.parseAsync(req.query) + const user = await UserService.findOne({ "verified.token": token }) + + user.verified.token = "" + user.verified.state = true + await user.save() + + res.json({ verified: true }) + } +} diff --git a/src/features/auth/schemas/verify.js b/src/features/auth/schemas/verify.js new file mode 100644 index 0000000..8f6454e --- /dev/null +++ b/src/features/auth/schemas/verify.js @@ -0,0 +1,5 @@ +import { z } from "zod" + +export const verifyQuerySchema = z.object({ + token: z.string(), +}) diff --git a/src/features/auth/services/auth.js b/src/features/auth/services/auth.js index 41c0e55..5c26ead 100644 --- a/src/features/auth/services/auth.js +++ b/src/features/auth/services/auth.js @@ -10,9 +10,11 @@ export class AuthService { // eslint-disable-next-line no-unused-vars __v, ...user - } = await UserService.findOne({ - email, - }) + } = ( + await UserService.findOne({ + email, + }) + ).toJSON() const checkPassword = await bcrypt.compare(password, userPassword) if (!checkPassword) { diff --git a/src/features/auth/utils/functions.js b/src/features/auth/utils/functions.js new file mode 100644 index 0000000..fc9c42a --- /dev/null +++ b/src/features/auth/utils/functions.js @@ -0,0 +1,8 @@ +import { randomBytes } from "crypto" + +/** + * + * @returns {string} + */ +export const generateEmailVerificationToken = () => + randomBytes(32).toString("hex") diff --git a/src/pages/api/auth/verify.js b/src/pages/api/auth/verify.js new file mode 100644 index 0000000..ecdfa0c --- /dev/null +++ b/src/pages/api/auth/verify.js @@ -0,0 +1,4 @@ +import { VerifyController } from "@/features/auth/controllers" +import { handlerApi } from "@/utils/functions.server" + +export default handlerApi(VerifyController) From 2fd54b4a0a16674af1f922b378e555a06a514505 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:22:42 +0200 Subject: [PATCH 35/51] chore(): add request for verify api endpoint --- src/features/auth/utils/api.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/features/auth/utils/api.js b/src/features/auth/utils/api.js index 76c4cb9..1ec9ffe 100644 --- a/src/features/auth/utils/api.js +++ b/src/features/auth/utils/api.js @@ -20,3 +20,22 @@ export const requestDeleteAuthLogout = async () => method: "DELETE", ...defaultOptions, }) + +/** + * + * @param {string} token + * @returns + */ +export const requestGetVerifyToken = async token => + await requestAPI(true, `/auth/verify?token=${token}`, defaultOptions) + +/** + * + * @param {string} token + * @returns + */ +export const requestPatchVerifyToken = async token => + await requestAPI(false, `/auth/verify?token=${token}`, { + method: "PATCH", + ...defaultOptions, + }) From e2a97524420e568b77cfec06fcc1130f2de75061 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:23:04 +0200 Subject: [PATCH 36/51] chore(): change import jwt for login controller --- src/features/auth/controllers/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/auth/controllers/login.js b/src/features/auth/controllers/login.js index 6ab68ae..76b4e05 100644 --- a/src/features/auth/controllers/login.js +++ b/src/features/auth/controllers/login.js @@ -1,6 +1,6 @@ import { loginSchema } from "@/features/auth/schemas/login" import { AuthService } from "@/features/auth/services" -import { encrypt } from "@/features/auth/utils/jwt" +import { encrypt } from "@/lib/jwt" import { serialize } from "cookie" export class LoginController { From 6e495671983d8b2c268f99837825c75507e931e7 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:23:17 +0200 Subject: [PATCH 37/51] chore(): create verify page --- .../auth/components/verify/Content.jsx | 29 +++++++++++++ src/features/auth/components/verify/index.js | 1 + src/languages/en.json | 9 ++++ src/languages/fr.json | 9 ++++ src/pages/verify.jsx | 43 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 src/features/auth/components/verify/Content.jsx create mode 100644 src/features/auth/components/verify/index.js create mode 100644 src/pages/verify.jsx diff --git a/src/features/auth/components/verify/Content.jsx b/src/features/auth/components/verify/Content.jsx new file mode 100644 index 0000000..67ac197 --- /dev/null +++ b/src/features/auth/components/verify/Content.jsx @@ -0,0 +1,29 @@ +import { Button } from "@/components/ui/button" +import { requestPatchVerifyToken } from "@/features/auth/utils/api" +import { useTranslations } from "next-intl" +import { useRouter } from "next/router" +import { useState } from "react" + +export const ContentVerify = () => { + const tPage = useTranslations("VerifyPage") + const router = useRouter() + const [visible, setVisible] = useState(false) + const verifyHandle = () => async () => { + await requestPatchVerifyToken(router.query.token) + setVisible(true) + setTimeout(() => { + router.push("/login") + }, 5000) + } + + return ( +
+

{tPage("content.title")}

+ {visible ? ( + tPage("content.redirection") + ) : ( + + )} +
+ ) +} diff --git a/src/features/auth/components/verify/index.js b/src/features/auth/components/verify/index.js new file mode 100644 index 0000000..08d3aa4 --- /dev/null +++ b/src/features/auth/components/verify/index.js @@ -0,0 +1 @@ +export * from "./Content" diff --git a/src/languages/en.json b/src/languages/en.json index 80f3826..3069df3 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -307,5 +307,14 @@ "label": "Confirm your password" } } + }, + "VerifyPage": { + "title": "Verification - chooseyourplace", + "description": "Verification of your account", + "content": { + "title": "Click on the button to verify your account", + "redirection": "Redirection in 5 seconds...", + "button": "Verify my email" + } } } diff --git a/src/languages/fr.json b/src/languages/fr.json index 364996e..0deedce 100644 --- a/src/languages/fr.json +++ b/src/languages/fr.json @@ -310,5 +310,14 @@ "label": "Confirmer votre mot de passe" } } + }, + "VerifyPage": { + "title": "Vérification - chooseyourplace", + "description": "Vérification de votre compte", + "content": { + "title": "Cliquez sur le bouton pour vérifier votre compte", + "redirection": "Redirection dans 5 secondes...", + "button": "Vérifier mon email" + } } } diff --git a/src/pages/verify.jsx b/src/pages/verify.jsx new file mode 100644 index 0000000..8d6ab57 --- /dev/null +++ b/src/pages/verify.jsx @@ -0,0 +1,43 @@ +import { Head } from "@/components/layouts" +import { ContentVerify } from "@/features/auth/components/verify" +import { verifyQuerySchema } from "@/features/auth/schemas/verify" +import { requestGetVerifyToken } from "@/features/auth/utils/api" +import { MainLayout } from "@/layouts/Main" +import { serverTranslation } from "@/utils/functions.server" +import { useTranslations } from "next-intl" + +export const VerifyPage = ({ exists }) => { + const tPage = useTranslations("VerifyPage") + + return ( + <> + + {exists ? : <>Unknown token} + + ) +} + +VerifyPage.messages = ["VerifyPage", ...MainLayout.messages] + +export default VerifyPage + +export const getServerSideProps = async ({ query, locale }) => { + try { + const { token } = await verifyQuerySchema.parseAsync(query) + const { exists } = await requestGetVerifyToken(token) + + return { + props: { + exists, + ...(await serverTranslation(locale, VerifyPage)), + }, + } + } catch (error) { + return { + props: { + exists: false, + ...(await serverTranslation(locale, VerifyPage)), + }, + } + } +} From 120bd53d62b763a82eb9013d700baeb1fe09d59e Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:34:35 +0200 Subject: [PATCH 38/51] chore(): update middleware and secure api --- src/features/places/controllers/place.js | 22 ++++++++++++++++++++++ src/features/places/controllers/places.js | 12 ++++++++++++ src/middleware.js | 21 ++++++++++----------- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/features/places/controllers/place.js b/src/features/places/controllers/place.js index 6b4e3c6..d2f32d9 100644 --- a/src/features/places/controllers/place.js +++ b/src/features/places/controllers/place.js @@ -1,5 +1,7 @@ import { PlaceModel } from "@/features/places/database/models" import { updatePlaceSchema, updateSubSchemas } from "@/features/places/schemas" +import { UserService } from "@/features/users/services" +import { decrypt } from "@/lib/jwt" export class PlaceController { /** @@ -50,6 +52,16 @@ export class PlaceController { */ static async PUT(req, res, redisClient) { + if (!req.cookies.session) { + return res.status(403).send("Unauthorized") + } + + const { user } = await decrypt(req.cookies.session) + + if (!(await UserService.exists({ username: user.username }))) { + return res.status(403).send("Unauthorized") + } + const { placeId } = req.query const place = await PlaceController.checkId(placeId, res, redisClient) const { name, building, city, zipcode, country, ...buildings } = req.body @@ -103,6 +115,16 @@ export class PlaceController { */ static async DELETE(req, res, redisClient) { + if (!req.cookies.session) { + return res.status(403).send("Unauthorized") + } + + const { user } = await decrypt(req.cookies.session) + + if (!(await UserService.exists({ username: user.username }))) { + return res.status(403).send("Unauthorized") + } + const { placeId } = req.query const place = await PlaceModel.findById(placeId) diff --git a/src/features/places/controllers/places.js b/src/features/places/controllers/places.js index 9db9a12..e2a5f5e 100644 --- a/src/features/places/controllers/places.js +++ b/src/features/places/controllers/places.js @@ -1,5 +1,7 @@ import { PlaceModel } from "@/features/places/database/models" import { filterQueryPlace } from "@/features/places/schemas" +import { UserService } from "@/features/users/services" +import { decrypt } from "@/lib/jwt" export class PlacesController { /** @@ -41,6 +43,16 @@ export class PlacesController { */ static async POST(req, res, redisClient) { + if (!req.cookies.session) { + return res.status(403).send("Unauthorized") + } + + const { user } = await decrypt(req.cookies.session) + + if (!(await UserService.exists({ username: user.username }))) { + return res.status(403).send("Unauthorized") + } + const { info, details } = req.body const newPlace = new PlaceModel({ ...info, diff --git a/src/middleware.js b/src/middleware.js index b8853ab..990b86c 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -1,3 +1,5 @@ +import { UserService } from "@/features/users/services" +import { decrypt } from "@/lib/jwt" import { loginRequiredPaths } from "@/utils/constants" import { NextResponse } from "next/server" @@ -6,24 +8,21 @@ import { NextResponse } from "next/server" * @param {import("next/server").NextRequest} req * @returns */ -const middleware = req => { - if (loginRequiredPaths.find(path => path === req.nextUrl.pathname)) { +const middleware = async req => { + if ( + loginRequiredPaths.find(path => path === req.nextUrl.pathname) || + (req.nextUrl.pathname.startsWith("/places") && + req.nextUrl.pathname.endsWith("/update")) + ) { const sessionToken = req.cookies.get("session")?.value if (!sessionToken) { return NextResponse.rewrite(new URL("/login", req.url)) } - return NextResponse.next() - } + const { user } = await decrypt(sessionToken) - if ( - req.nextUrl.pathname.startsWith("/places") && - req.nextUrl.pathname.endsWith("/update") - ) { - const sessionToken = req.cookies.get("session")?.value - - if (!sessionToken) { + if (!(await UserService.exists({ username: user.username }))) { return NextResponse.rewrite(new URL("/login", req.url)) } From 6f3a5c97da4436f19ba81a8af5f62b673d0fdd6b Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 19:19:49 +0200 Subject: [PATCH 39/51] fix(): middleware --- src/middleware.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/middleware.js b/src/middleware.js index 990b86c..41a4acc 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -1,4 +1,3 @@ -import { UserService } from "@/features/users/services" import { decrypt } from "@/lib/jwt" import { loginRequiredPaths } from "@/utils/constants" import { NextResponse } from "next/server" @@ -8,7 +7,7 @@ import { NextResponse } from "next/server" * @param {import("next/server").NextRequest} req * @returns */ -const middleware = async req => { +export const middleware = async req => { if ( loginRequiredPaths.find(path => path === req.nextUrl.pathname) || (req.nextUrl.pathname.startsWith("/places") && @@ -22,7 +21,7 @@ const middleware = async req => { const { user } = await decrypt(sessionToken) - if (!(await UserService.exists({ username: user.username }))) { + if (!user?.username) { return NextResponse.rewrite(new URL("/login", req.url)) } @@ -31,5 +30,3 @@ const middleware = async req => { return NextResponse.next() } - -export default middleware From 9d3dc2129ed984085ec7993b39c007034d8ac35f Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sun, 28 Apr 2024 22:49:48 +0200 Subject: [PATCH 40/51] chore(): create a docker file --- Dockerfile | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3097a04 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +FROM node:20-alpine AS base + +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production + +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +RUN mkdir .next +RUN chown nextjs:nodejs .next + +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 + +CMD HOSTNAME="0.0.0.0" node server.js \ No newline at end of file From 5e97ff4f4d0ec39666b689214314f7d7dfdd7f46 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:35:14 +0200 Subject: [PATCH 41/51] fix(): imports --- src/features/places/schemas/index.js | 10 +++++----- src/mocks/handlers/places.js | 5 +---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/features/places/schemas/index.js b/src/features/places/schemas/index.js index f8075c5..4220cec 100644 --- a/src/features/places/schemas/index.js +++ b/src/features/places/schemas/index.js @@ -1,5 +1,5 @@ -export * from "./bar" -export * from "./museum" -export * from "./park" -export * from "./place" -export * from "./restaurant" +export * from "./Bar" +export * from "./Museum" +export * from "./Park" +export * from "./Place" +export * from "./Restaurant" diff --git a/src/mocks/handlers/places.js b/src/mocks/handlers/places.js index 72eb183..d98f429 100644 --- a/src/mocks/handlers/places.js +++ b/src/mocks/handlers/places.js @@ -1,7 +1,4 @@ -import { - updatePlaceSchema, - updateSubSchemas, -} from "@/features/places/database/schemas" +import { updatePlaceSchema, updateSubSchemas } from "@/features/places/schemas" import { http, HttpResponse } from "msw" if (typeof window !== "undefined" && !localStorage.getItem("places")) { From ab4b49c8828355bfe37b8ddcd769054d037e07b0 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:35:23 +0200 Subject: [PATCH 42/51] chore(): update next config --- next.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/next.config.mjs b/next.config.mjs index e4367e8..8853fc5 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -7,6 +7,7 @@ const withPwa = nextPwa({ disable: process.env.NODE_ENV === "development", }) const nextConfig = withPwa({ + output: "standalone", reactStrictMode: true, i18n: { locales: ["en", "fr"], From 3bfc43564c24801d2260b9c8fa969132816ddc9e Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:35:30 +0200 Subject: [PATCH 43/51] chore(): update dockerfile --- Dockerfile | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3097a04..6de9a2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,12 +6,7 @@ WORKDIR /app # Install dependencies based on the preferred package manager COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ -RUN \ - if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ - elif [ -f package-lock.json ]; then npm ci; \ - elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ - else echo "Lockfile not found." && exit 1; \ - fi +RUN npm ci FROM base AS builder @@ -21,12 +16,9 @@ COPY . . ENV NEXT_TELEMETRY_DISABLED 1 -RUN \ - if [ -f yarn.lock ]; then yarn run build; \ - elif [ -f package-lock.json ]; then npm run build; \ - elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ - else echo "Lockfile not found." && exit 1; \ - fi +RUN npm run format + +RUN npm run build FROM base AS runner WORKDIR /app From 47d40ba282c692cafea6ecdde4613e4f3f0376cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:36:25 +0000 Subject: [PATCH 44/51] fix(deps): update dependency mongoose to v8.3.3 --- package-lock.json | 63 +++++++---------------------------------------- 1 file changed, 9 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index c063bdd..80d4a43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8632,9 +8632,9 @@ } }, "node_modules/kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", "engines": { "node": ">=12.0.0" } @@ -9043,13 +9043,13 @@ } }, "node_modules/mongoose": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.2.2.tgz", - "integrity": "sha512-6sMxe1d3k/dBjiOX4ExNTNOP0g1x0iq8eXyg+ttgIXM3HLnQ0IUyXRwVVAPFFY6O4/8uYN5dB0Ec72FrexbPpw==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.3.tgz", + "integrity": "sha512-3kSk0db9DM2tLttCdS6WNRqewPleamFEa4Vz/Qldc0dB4Zow/FiZxb9GExHTJjBZQ9T2xiGleQ3GzRrES3hhsA==", "dependencies": { - "bson": "^6.2.0", - "kareem": "2.5.1", - "mongodb": "6.3.0", + "bson": "^6.5.0", + "kareem": "2.6.3", + "mongodb": "6.5.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -9063,51 +9063,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", - "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^6.2.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", From 5d1953c4ac486b14abe85aba73f9718f4ae16c07 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Tue, 30 Apr 2024 19:31:45 +0200 Subject: [PATCH 45/51] fix(): remove deprecated e2e tests --- tests/home.spec.js | 23 ------- tests/places/create.spec.js | 121 ------------------------------------ 2 files changed, 144 deletions(-) delete mode 100644 tests/places/create.spec.js diff --git a/tests/home.spec.js b/tests/home.spec.js index 1b0e053..c88b23f 100644 --- a/tests/home.spec.js +++ b/tests/home.spec.js @@ -17,29 +17,6 @@ test("Theme", async ({ page }) => { await page.getByRole("menuitem", { name: "System" }).click() }) -test("Create place with dialog", async ({ page }) => { - await page.getByRole("button", { name: "Add" }).click() - await page.getByLabel("Building").click() - await page.getByLabel("Bar").click() - await page.getByPlaceholder("Name of the building....").click() - await page.getByPlaceholder("Name of the building....").fill("Random Name") - await page.getByPlaceholder("Name of the building....").press("Tab") - await page - .getByPlaceholder("Which city are the building ?") - .fill("Random City") - await page.getByPlaceholder("Which city are the building ?").press("Tab") - await page.getByPlaceholder("What is the zipcode ?").fill("12345") - await page.getByPlaceholder("What is the zipcode ?").press("Tab") - await page.getByPlaceholder("Which country are the").fill("Random Country") - await page.getByRole("button", { name: "Next" }).click() - await page.getByLabel("Bar").click() - await page.getByLabel("Cocktail").getByText("Cocktail").click() - - await page.getByRole("button", { name: "Next" }).click() - await page.getByLabel("Create a place").getByText("Bar").click() - await page.getByRole("button", { name: "Finish" }).click() -}) - test("Pagination", async ({ page }) => { await expect(page.getByRole("button", { name: "Previous" })).toBeDisabled() await page.getByRole("button", { name: "Next" }).click() diff --git a/tests/places/create.spec.js b/tests/places/create.spec.js deleted file mode 100644 index 49e5dbb..0000000 --- a/tests/places/create.spec.js +++ /dev/null @@ -1,121 +0,0 @@ -import { test } from "@playwright/test" - -test.beforeEach(async ({ page }) => { - await page.goto("/places/create", { waitUntil: "networkidle" }) -}) - -test("Create a bar place", async ({ page }) => { - await page.getByLabel("Building").click() - await page.getByLabel("Bar").click() - await page.getByPlaceholder("Name of the building....").click() - await page.getByPlaceholder("Name of the building....").fill("Random bar") - await page.getByPlaceholder("Which city are the building ?").click() - await page - .getByPlaceholder("Which city are the building ?") - .fill("Random City") - await page.getByPlaceholder("Which city are the building ?").press("Tab") - await page.getByPlaceholder("What is the zipcode ?").fill("12345") - await page.getByPlaceholder("What is the zipcode ?").press("Tab") - await page.getByPlaceholder("Which country are the").fill("Random Country") - await page.getByRole("button", { name: "Next" }).click() - await page.getByLabel("Bar").click() - await page.getByLabel("Cocktail").click() - await page.getByLabel("Average Cost").click() - await page.getByLabel("1").click() - await page.getByRole("button", { name: "Next" }).click() - await page.getByRole("button", { name: "Finish" }).click() - await page.getByRole("heading", { name: "List of places" }).isVisible() - await page.getByPlaceholder("Search by name...").click() - await page.getByPlaceholder("Search by name...").fill("Random bar") - await page.getByRole("cell", { name: "Random bar" }).click() -}) - -test("Create a museum place", async ({ page }) => { - await page.getByLabel("Building").click() - await page.getByLabel("Museum").click() - await page.getByPlaceholder("Name of the building....").click() - await page.getByPlaceholder("Name of the building....").fill("Random Museum") - await page.getByPlaceholder("Name of the building....").press("Tab") - await page - .getByPlaceholder("Which city are the building ?") - .fill("Random City") - await page.getByPlaceholder("Which city are the building ?").press("Tab") - await page.getByPlaceholder("What is the zipcode ?").fill("12345") - await page.getByPlaceholder("What is the zipcode ?").press("Tab") - await page.getByPlaceholder("Which country are the").fill("Random Country") - await page.getByPlaceholder("Which country are the").press("Enter") - await page.getByLabel("Museum").click() - await page.getByLabel("Art", { exact: true }).click() - await page.getByLabel("Artistic movements").click() - await page.getByLabel("Renaissance").click() - await page.getByLabel("Free or Pay ?").click() - await page.getByLabel("Free", { exact: true }).click() - await page.getByRole("button", { name: "Next" }).click() - await page.getByPlaceholder("Give the price of the museum").fill("") - await page.getByRole("button", { name: "Next" }).click() - await page.getByRole("button", { name: "Finish" }).click() - await page.getByRole("heading", { name: "List of places" }).isVisible() - await page.getByPlaceholder("Search by name...").click() - await page.getByPlaceholder("Search by name...").fill("Random Museum") - await page.getByRole("cell", { name: "Random Museum" }).click() -}) - -test("Create a restaurant place", async ({ page }) => { - await page.getByLabel("Building").click() - await page.getByLabel("Restaurant").click() - await page.getByPlaceholder("Name of the building....").click() - await page - .getByPlaceholder("Name of the building....") - .fill("Random Restaurant") - await page.getByPlaceholder("Name of the building....").press("Tab") - await page - .getByPlaceholder("Which city are the building ?") - .fill("Random City") - await page.getByPlaceholder("Which city are the building ?").press("Tab") - await page.getByPlaceholder("What is the zipcode ?").fill("12345") - await page.getByPlaceholder("What is the zipcode ?").press("Tab") - await page.getByPlaceholder("Which country are the").fill("Random Country") - await page.getByPlaceholder("Which country are the").press("Enter") - await page.getByLabel("Restaurant").click() - await page.getByLabel("Italian").click() - await page.getByLabel("Stars").click() - await page.getByLabel("1").click() - await page.getByLabel("Average Cost").click() - await page.getByLabel("1").click() - await page.getByRole("button", { name: "Next" }).click() - await page.getByRole("button", { name: "Finish" }).click() - await page.getByRole("heading", { name: "List of places" }).isVisible() - await page.getByPlaceholder("Search by name...").click() - await page.getByPlaceholder("Search by name...").fill("Random Restaurant") - await page.getByRole("cell", { name: "Random Restaurant" }).click() -}) - -test("Create a park place", async ({ page }) => { - await page.locator("form").click() - await page.getByLabel("Building").click() - await page.getByLabel("Park").click() - await page.getByPlaceholder("Name of the building....").click() - await page.getByPlaceholder("Name of the building....").fill("Random Park") - await page.getByPlaceholder("Name of the building....").press("Tab") - await page - .getByPlaceholder("Which city are the building ?") - .fill("Random City") - await page.getByPlaceholder("Which city are the building ?").press("Tab") - await page.getByPlaceholder("What is the zipcode ?").fill("12345") - await page.getByPlaceholder("What is the zipcode ?").press("Tab") - await page.getByPlaceholder("Which country are the").fill("Random Country") - await page.getByPlaceholder("Which country are the").press("Enter") - await page.getByLabel("Park").click() - await page.getByLabel("City").click() - await page.getByLabel("Free or Pay ?").click() - await page.getByLabel("Free", { exact: true }).click() - await page.getByLabel("Public ?").click() - await page.getByRole("button", { name: "Next" }).click() - await page.getByPlaceholder("Give the price of the park").fill("") - await page.getByRole("button", { name: "Next" }).click() - await page.getByRole("button", { name: "Finish" }).click() - await page.getByRole("heading", { name: "List of places" }).isVisible() - await page.getByPlaceholder("Search by name...").click() - await page.getByPlaceholder("Search by name...").fill("Random park") - await page.getByRole("cell", { name: "Random Park" }).click() -}) From 041c2b8e9ff200c47895c525574604d9d4663aea Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Wed, 1 May 2024 22:38:25 +0200 Subject: [PATCH 46/51] chore(): install nuqs dep --- package-lock.json | 23 ++++++++++++++++++++--- package.json | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e62a382..7a2aa58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "next-intl": "^3.9.5", "next-pwa": "^5.6.0", "next-themes": "^0.2.1", + "nuqs": "^1.17.1", "react": "^18", "react-dom": "^18", "react-email": "^2.1.1", @@ -7300,9 +7301,9 @@ } }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -10305,6 +10306,11 @@ "node": ">=8" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -10820,6 +10826,17 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nuqs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-1.17.1.tgz", + "integrity": "sha512-zJPisj8L+SzKzt57c5s3fJW0ikksPr+PyeLyNwvx0i5ggTr5XR5uFhCoX/T+Mkmb6X5UxHB/0nnuZyFiQsh0cA==", + "dependencies": { + "mitt": "^3.0.1" + }, + "peerDependencies": { + "next": ">=13.4 <14.0.2 || ^14.0.3" + } + }, "node_modules/nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", diff --git a/package.json b/package.json index af48994..e539d7e 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "next-intl": "^3.9.5", "next-pwa": "^5.6.0", "next-themes": "^0.2.1", + "nuqs": "^1.17.1", "react": "^18", "react-dom": "^18", "react-email": "^2.1.1", From c8d664c6d2f7a508d6712126c2b69edb82e029ec Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Wed, 1 May 2024 22:38:49 +0200 Subject: [PATCH 47/51] chore(): query filter in search bar and pagination --- src/components/ui/data-table.jsx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/components/ui/data-table.jsx b/src/components/ui/data-table.jsx index e71952b..2e3dfec 100644 --- a/src/components/ui/data-table.jsx +++ b/src/components/ui/data-table.jsx @@ -26,7 +26,8 @@ import { useReactTable, } from "@tanstack/react-table" import { useTranslations } from "next-intl" -import { useState } from "react" +import { parseAsInteger, parseAsString, useQueryState } from "nuqs" +import { useEffect, useState } from "react" // eslint-disable-next-line max-lines-per-function export const DataTable = ({ columns, data, filterInput }) => { @@ -34,6 +35,9 @@ export const DataTable = ({ columns, data, filterInput }) => { const tUtils = useTranslations("Utils") const [sorting, setSorting] = useState([]) const [columnFilters, setColumnFilters] = useState([]) + const [size, setSize] = useQueryState("size", parseAsInteger.withDefault(10)) + const [page, setPage] = useQueryState("page", parseAsInteger.withDefault(0)) + const [search, setSearch] = useQueryState("search", parseAsString) const table = useReactTable({ data, columns, @@ -43,21 +47,31 @@ export const DataTable = ({ columns, data, filterInput }) => { onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), + onPaginationChange: value => { + setPage(value.pageIndex) + setSize(value.pageSize) + }, state: { sorting, columnFilters, + pagination: { + pageIndex: page, + pageSize: size, + }, }, }) + useEffect(() => { + table.getColumn(filterInput)?.setFilterValue(search) + }, [search]) + return ( <>
- table.getColumn(filterInput)?.setFilterValue(event.target.value) - } + onChange={event => setSearch(event.target.value)} className="max-w-sm" />
From c525ed98dc4b3982cc5ce454abec013cf30bece7 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 4 May 2024 12:56:18 +0200 Subject: [PATCH 48/51] fix(): update version deps --- package-lock.json | 548 +++++++++++++++++++++++++++--------- package.json | 8 +- public/mockServiceWorker.js | 2 +- 3 files changed, 427 insertions(+), 131 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a2aa58..af2c534 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,9 +22,9 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", - "@react-email/components": "^0.0.16", + "@react-email/components": "0.0.17", "@tanstack/react-query": "^5.25.0", - "@tanstack/react-table": "^8.13.2", + "@tanstack/react-table": "^8.16.0", "bcrypt": "^5.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", @@ -38,8 +38,8 @@ "next-pwa": "^5.6.0", "next-themes": "^0.2.1", "nuqs": "^1.17.1", - "react": "^18", - "react-dom": "^18", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-email": "^2.1.1", "react-hook-form": "^7.51.0", "resend": "^3.2.0", @@ -4029,28 +4029,28 @@ } }, "node_modules/@react-email/body": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.7.tgz", - "integrity": "sha512-vjJ5P1MUNWV0KNivaEWA6MGj/I3c764qQJMsKjCHlW6mkFJ4SXbm2OlQFtKAb++Bj8LDqBlnE6oW77bWcMc0NA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.8.tgz", + "integrity": "sha512-gqdkNYlIaIw0OdpWu8KjIcQSIFvx7t2bZpXVxMMvBS859Ia1+1X3b5RNbjI3S1ZqLddUf7owOHkO4MiXGE+nxg==", "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/button": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.14.tgz", - "integrity": "sha512-SMk40moGcAvkHIALX4XercQlK0PNeeEIam6OXHw68ea9WtzzqVwiK4pzLY0iiMI9B4xWHcaS2lCPf3cKbQBf1Q==", + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.15.tgz", + "integrity": "sha512-9Zi6SO3E8PoHYDfcJTecImiHLyitYWmIRs0HE3Ogra60ZzlWP2EXu+AZqwQnhXuq+9pbgwBWNWxB5YPetNPTNA==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/code-block": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.3.tgz", - "integrity": "sha512-nxhl7WjjM2cOYtl0boBZfSObTrUCz2LbarcMyHkTVAsA9rbjbtWAQF7jmlefXJusk3Uol5l2c8hTh2lHLlHTRQ==", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.4.tgz", + "integrity": "sha512-xjVLi/9dFNJ70N7hYme+21eQWa3b9/kgp4V+FKQJkQCuIMobxPRCIGM5jKD/0Vo2OqrE5chYv/dkg/aP8a8sPg==", "dependencies": { "prismjs": "1.29.0" }, @@ -4058,98 +4058,112 @@ "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/code-inline": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.1.tgz", - "integrity": "sha512-SeZKTB9Q4+TUafzeUm/8tGK3dFgywUHb1od/BrAiJCo/im65aT+oJfggJLjK2jCdSsus8odcK2kReeM3/FCNTQ==", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.2.tgz", + "integrity": "sha512-0cmgbbibFeOJl0q04K9jJlPDuJ+SEiX/OG6m3Ko7UOkG3TqjRD8Dtvkij6jNDVfUh/zESpqJCP2CxrCLLMUjdA==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/column": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.9.tgz", - "integrity": "sha512-1ekqNBgmbS6m97/sUFOnVvQtLYljUWamw8Y44VId95v6SjiJ4ca+hMcdOteHWBH67xkRofEOWTvqDRea5SBV8w==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.10.tgz", + "integrity": "sha512-MnP8Mnwipr0X3XtdD6jMLckb0sI5/IlS6Kl/2F6/rsSWBJy5Gg6nizlekTdkwDmy0kNSe3/1nGU0Zqo98pl63Q==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/components": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.16.tgz", - "integrity": "sha512-1WATpMSH03cRvhfNjGl/Up3seZJOzN9KLzlk3Q9g/cqNhZEJ7HYxoZM4AQKAI0V3ttXzzxKv8Oj+AZQLHDiICA==", - "dependencies": { - "@react-email/body": "0.0.7", - "@react-email/button": "0.0.14", - "@react-email/code-block": "0.0.3", - "@react-email/code-inline": "0.0.1", - "@react-email/column": "0.0.9", - "@react-email/container": "0.0.11", - "@react-email/font": "0.0.5", - "@react-email/head": "0.0.7", - "@react-email/heading": "0.0.11", - "@react-email/hr": "0.0.7", - "@react-email/html": "0.0.7", - "@react-email/img": "0.0.7", - "@react-email/link": "0.0.7", - "@react-email/markdown": "0.0.9", - "@react-email/preview": "0.0.8", - "@react-email/render": "0.0.12", - "@react-email/row": "0.0.7", - "@react-email/section": "0.0.11", - "@react-email/tailwind": "0.0.15", - "@react-email/text": "0.0.7" + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.17.tgz", + "integrity": "sha512-x5gGQaK0QchbwHvUrCBVnE8GCWdO5osTVuTSA54Fwzels6ZDeNTHEYRx9gI3Nwcf/dkoVYkVH4rzWST0SF0MLA==", + "dependencies": { + "@react-email/body": "0.0.8", + "@react-email/button": "0.0.15", + "@react-email/code-block": "0.0.4", + "@react-email/code-inline": "0.0.2", + "@react-email/column": "0.0.10", + "@react-email/container": "0.0.12", + "@react-email/font": "0.0.6", + "@react-email/head": "0.0.8", + "@react-email/heading": "0.0.12", + "@react-email/hr": "0.0.8", + "@react-email/html": "0.0.8", + "@react-email/img": "0.0.8", + "@react-email/link": "0.0.8", + "@react-email/markdown": "0.0.10", + "@react-email/preview": "0.0.9", + "@react-email/render": "0.0.13", + "@react-email/row": "0.0.8", + "@react-email/section": "0.0.12", + "@react-email/tailwind": "0.0.16", + "@react-email/text": "0.0.8" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" + } + }, + "node_modules/@react-email/components/node_modules/@react-email/render": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.13.tgz", + "integrity": "sha512-lmBizrV+rQeSa3GjiL8/kPU0gENqO/wv+4xrlWANabp9UY3lTLXzy7HMRSE8YFBES9AbxP5VX1iRKuEnsoBDew==", + "dependencies": { + "html-to-text": "9.0.5", + "js-beautify": "^1.14.11", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@react-email/container": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.11.tgz", - "integrity": "sha512-jzl/EHs0ClXIRFamfH+NR/cqv4GsJJscqRhdYtnWYuRAsWpKBM1muycrrPqIVhWvWi6sFHInWTt07jX+bDc3SQ==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.12.tgz", + "integrity": "sha512-HFu8Pu5COPFfeZxSL+wKv/TV5uO/sp4zQ0XkRCdnGkj/xoq0lqOHVDL4yC2Pu6fxXF/9C3PHDA++5uEYV5WVJw==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/font": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.5.tgz", - "integrity": "sha512-if/qKYmH3rJ2egQJoKbV8SfKCPavu+ikUq/naT/UkCr8Q0lkk309tRA0x7fXG/WeIrmcipjMzFRGTm2TxTecDw==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.6.tgz", + "integrity": "sha512-sZZFvEZ4U3vNCAZ8wXqIO3DuGJR2qE/8m2fEH+tdqwa532zGO3zW+UlCTg0b9455wkJSzEBeaWik0IkNvjXzxw==", "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/head": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.7.tgz", - "integrity": "sha512-IcXL4jc0H1qzAXJCD9ajcRFBQdbUHkjKJyiUeogpaYSVZSq6cVDWQuGaI23TA9k+pI2TFeQimogUFb3Kgeeudw==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.8.tgz", + "integrity": "sha512-8/NI0gtQmLIilAe6rebK1TWw3IXHxtrR02rInkQq8yQ7zKbYbzx7Q/FhmsJgAk+uYh2Er/KhgYJ0sHZyDhfMTQ==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/heading": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.11.tgz", - "integrity": "sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.12.tgz", + "integrity": "sha512-eB7mpnAvDmwvQLoPuwEiPRH4fPXWe6ltz6Ptbry2BlI88F0a2k11Ghb4+sZHBqg7vVw/MKbqEgtLqr3QJ/KfCQ==", "dependencies": { "@radix-ui/react-slot": "1.0.2" }, @@ -4157,57 +4171,57 @@ "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/hr": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.7.tgz", - "integrity": "sha512-8suK0M/deXHt0DBSeKhSC4bnCBCBm37xk6KJh9M0/FIKlvdltQBem52YUiuqVl1XLB87Y6v6tvspn3SZ9fuxEA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.8.tgz", + "integrity": "sha512-JLVvpCg2wYKEB+n/PGCggWG9fRU5e4lxsGdpK5SDLsCL0ic3OLKSpHMfeE+ZSuw0GixAVVQN7F64PVJHQkd4MQ==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.7.tgz", - "integrity": "sha512-oy7OoRtoOKApVI/5Lz1OZptMKmMYJu9Xn6+lOmdBQchAuSdQtWJqxhrSj/iI/mm8HZWo6MZEQ6SFpfOuf8/P6Q==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.8.tgz", + "integrity": "sha512-arII3wBNLpeJtwyIJXPaILm5BPKhA+nvdC1F9QkuKcOBJv2zXctn8XzPqyGqDfdplV692ulNJP7XY55YqbKp6w==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/img": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.7.tgz", - "integrity": "sha512-up9tM2/dJ24u/CFjcvioKbyGuPw1yeJg605QA7VkrygEhd0CoQEjjgumfugpJ+VJgIt4ZjT9xMVCK5QWTIWoaA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.8.tgz", + "integrity": "sha512-jx/rPuKo31tV18fu7P5rRqelaH5wkhg83Dq7uLwJpfqhbi4KFBGeBfD0Y3PiLPPoh+WvYf+Adv9W2ghNW8nOMQ==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/link": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.7.tgz", - "integrity": "sha512-hXPChT3ZMyKnUSA60BLEMD2maEgyB2A37yg5bASbLMrXmsExHi6/IS1h2XiUPLDK4KqH5KFaFxi2cdNo1JOKwA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.8.tgz", + "integrity": "sha512-nVikuTi8WJHa6Baad4VuRUbUCa/7EtZ1Qy73TRejaCHn+vhetc39XGqHzKLNh+Z/JFL8Hv9g+4AgG16o2R0ogQ==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/markdown": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.9.tgz", - "integrity": "sha512-t//19Zz+W5svKqrSrqoOLpf6dq70jbwYxX8Z+NEMi4LqylklccOaYAyKrkYyulfZwhW7KDH9d2wjVk5jfUABxQ==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.10.tgz", + "integrity": "sha512-MH0xO+NJ4IuJcx9nyxbgGKAMXyudFjCZ0A2GQvuWajemW9qy2hgnJ3mW3/z5lwcenG+JPn7JyO/iZpizQ7u1tA==", "dependencies": { "md-to-react-email": "5.0.2" }, @@ -4215,18 +4229,18 @@ "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/preview": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.8.tgz", - "integrity": "sha512-Jm0KUYBZQd2w0s2QRMQy0zfHdo3Ns+9bYSE1OybjknlvhANirjuZw9E5KfWgdzO7PyrRtB1OBOQD8//Obc4uIQ==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.9.tgz", + "integrity": "sha512-2fyAA/zzZYfYmxfyn3p2YOIU30klyA6Dq4ytyWq4nfzQWWglt5hNDE0cMhObvRtfjM9ghMSVtoELAb0MWiF/kw==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/render": { @@ -4243,51 +4257,74 @@ "node": ">=18.0.0" } }, + "node_modules/@react-email/render/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-email/render/node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/@react-email/row": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.7.tgz", - "integrity": "sha512-h7pwrLVGk5CIx7Ai/oPxBgCCAGY7BEpCUQ7FCzi4+eThcs5IdjSwDPefLEkwaFS8KZc56UNwTAH92kNq5B7blg==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.8.tgz", + "integrity": "sha512-JsB6pxs/ZyjYpEML3nbwJRGAerjcN/Pa/QG48XUwnT/MioDWrUuyQuefw+CwCrSUZ2P1IDrv2tUD3/E3xzcoKw==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/section": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.11.tgz", - "integrity": "sha512-3bZ/DuvX1julATI7oqYza6pOtWZgLJDBaa62LFFEvYjisyN+k6lrP2KOucPsDKu2DOkUzlQgK0FOm6VQJX+C0w==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.12.tgz", + "integrity": "sha512-UCD/N/BeOTN4h3VZBUaFdiSem6HnpuxD1Q51TdBFnqeNqS5hBomp8LWJJ9s4gzwHWk1XPdNfLA3I/fJwulJshg==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/tailwind": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.15.tgz", - "integrity": "sha512-TE3NQ7VKhhvv3Zv0Z1NtoV6AF7aOWiG4juVezMZw1hZCG0mkN6iXC63u23vPQi12y6xCp20ZUHfg67kQeDSP/g==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.16.tgz", + "integrity": "sha512-uMifPxCEHaHLhpS1kVCMGyTeEL+aMYzHT4bgj8CkgCiBoF9wNNfIVMUlHGzHUTv4ZTEPaMfZgC/Hi8RqzL/Ogw==", "dependencies": { - "react": "18.2.0" + "react": "^18.2.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@react-email/text": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.7.tgz", - "integrity": "sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.8.tgz", + "integrity": "sha512-uvN2TNWMrfC9wv/LLmMLbbEN1GrMWZb9dBK14eYxHHAEHCeyvGb5ePZZ2MPyzO7Y5yTC+vFEnCEr76V+hWMxCQ==", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "react": "18.2.0" + "react": "^18.2.0" } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -4751,11 +4788,11 @@ } }, "node_modules/@tanstack/react-table": { - "version": "8.13.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.13.2.tgz", - "integrity": "sha512-b6mR3mYkjRtJ443QZh9sc7CvGTce81J35F/XMr0OoWbx0KIM7TTTdyNP2XKObvkLpYnLpCrYDwI3CZnLezWvpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.16.0.tgz", + "integrity": "sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg==", "dependencies": { - "@tanstack/table-core": "8.13.2" + "@tanstack/table-core": "8.16.0" }, "engines": { "node": ">=12" @@ -4765,14 +4802,14 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" + "react": ">=16.8", + "react-dom": ">=16.8" } }, "node_modules/@tanstack/table-core": { - "version": "8.13.2", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.13.2.tgz", - "integrity": "sha512-/2saD1lWBUV6/uNAwrsg2tw58uvMJ07bO2F1IWMxjFRkJiXKQRuc3Oq2aufeobD3873+4oIM/DRySIw7+QsPPw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.16.0.tgz", + "integrity": "sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg==", "engines": { "node": ">=12" }, @@ -11775,9 +11812,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -11786,15 +11823,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-email": { @@ -12454,6 +12491,254 @@ } } }, + "node_modules/react-email/node_modules/@react-email/body": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.7.tgz", + "integrity": "sha512-vjJ5P1MUNWV0KNivaEWA6MGj/I3c764qQJMsKjCHlW6mkFJ4SXbm2OlQFtKAb++Bj8LDqBlnE6oW77bWcMc0NA==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/button": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.14.tgz", + "integrity": "sha512-SMk40moGcAvkHIALX4XercQlK0PNeeEIam6OXHw68ea9WtzzqVwiK4pzLY0iiMI9B4xWHcaS2lCPf3cKbQBf1Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/code-block": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.3.tgz", + "integrity": "sha512-nxhl7WjjM2cOYtl0boBZfSObTrUCz2LbarcMyHkTVAsA9rbjbtWAQF7jmlefXJusk3Uol5l2c8hTh2lHLlHTRQ==", + "dependencies": { + "prismjs": "1.29.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/code-inline": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.1.tgz", + "integrity": "sha512-SeZKTB9Q4+TUafzeUm/8tGK3dFgywUHb1od/BrAiJCo/im65aT+oJfggJLjK2jCdSsus8odcK2kReeM3/FCNTQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/column": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.9.tgz", + "integrity": "sha512-1ekqNBgmbS6m97/sUFOnVvQtLYljUWamw8Y44VId95v6SjiJ4ca+hMcdOteHWBH67xkRofEOWTvqDRea5SBV8w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/components": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.16.tgz", + "integrity": "sha512-1WATpMSH03cRvhfNjGl/Up3seZJOzN9KLzlk3Q9g/cqNhZEJ7HYxoZM4AQKAI0V3ttXzzxKv8Oj+AZQLHDiICA==", + "dependencies": { + "@react-email/body": "0.0.7", + "@react-email/button": "0.0.14", + "@react-email/code-block": "0.0.3", + "@react-email/code-inline": "0.0.1", + "@react-email/column": "0.0.9", + "@react-email/container": "0.0.11", + "@react-email/font": "0.0.5", + "@react-email/head": "0.0.7", + "@react-email/heading": "0.0.11", + "@react-email/hr": "0.0.7", + "@react-email/html": "0.0.7", + "@react-email/img": "0.0.7", + "@react-email/link": "0.0.7", + "@react-email/markdown": "0.0.9", + "@react-email/preview": "0.0.8", + "@react-email/render": "0.0.12", + "@react-email/row": "0.0.7", + "@react-email/section": "0.0.11", + "@react-email/tailwind": "0.0.15", + "@react-email/text": "0.0.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/container": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.11.tgz", + "integrity": "sha512-jzl/EHs0ClXIRFamfH+NR/cqv4GsJJscqRhdYtnWYuRAsWpKBM1muycrrPqIVhWvWi6sFHInWTt07jX+bDc3SQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/font": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.5.tgz", + "integrity": "sha512-if/qKYmH3rJ2egQJoKbV8SfKCPavu+ikUq/naT/UkCr8Q0lkk309tRA0x7fXG/WeIrmcipjMzFRGTm2TxTecDw==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/head": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.7.tgz", + "integrity": "sha512-IcXL4jc0H1qzAXJCD9ajcRFBQdbUHkjKJyiUeogpaYSVZSq6cVDWQuGaI23TA9k+pI2TFeQimogUFb3Kgeeudw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/heading": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.11.tgz", + "integrity": "sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==", + "dependencies": { + "@radix-ui/react-slot": "1.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/hr": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.7.tgz", + "integrity": "sha512-8suK0M/deXHt0DBSeKhSC4bnCBCBm37xk6KJh9M0/FIKlvdltQBem52YUiuqVl1XLB87Y6v6tvspn3SZ9fuxEA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.7.tgz", + "integrity": "sha512-oy7OoRtoOKApVI/5Lz1OZptMKmMYJu9Xn6+lOmdBQchAuSdQtWJqxhrSj/iI/mm8HZWo6MZEQ6SFpfOuf8/P6Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/img": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.7.tgz", + "integrity": "sha512-up9tM2/dJ24u/CFjcvioKbyGuPw1yeJg605QA7VkrygEhd0CoQEjjgumfugpJ+VJgIt4ZjT9xMVCK5QWTIWoaA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/link": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.7.tgz", + "integrity": "sha512-hXPChT3ZMyKnUSA60BLEMD2maEgyB2A37yg5bASbLMrXmsExHi6/IS1h2XiUPLDK4KqH5KFaFxi2cdNo1JOKwA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/markdown": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.9.tgz", + "integrity": "sha512-t//19Zz+W5svKqrSrqoOLpf6dq70jbwYxX8Z+NEMi4LqylklccOaYAyKrkYyulfZwhW7KDH9d2wjVk5jfUABxQ==", + "dependencies": { + "md-to-react-email": "5.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/preview": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.8.tgz", + "integrity": "sha512-Jm0KUYBZQd2w0s2QRMQy0zfHdo3Ns+9bYSE1OybjknlvhANirjuZw9E5KfWgdzO7PyrRtB1OBOQD8//Obc4uIQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/row": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.7.tgz", + "integrity": "sha512-h7pwrLVGk5CIx7Ai/oPxBgCCAGY7BEpCUQ7FCzi4+eThcs5IdjSwDPefLEkwaFS8KZc56UNwTAH92kNq5B7blg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/section": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.11.tgz", + "integrity": "sha512-3bZ/DuvX1julATI7oqYza6pOtWZgLJDBaa62LFFEvYjisyN+k6lrP2KOucPsDKu2DOkUzlQgK0FOm6VQJX+C0w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/tailwind": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.15.tgz", + "integrity": "sha512-TE3NQ7VKhhvv3Zv0Z1NtoV6AF7aOWiG4juVezMZw1hZCG0mkN6iXC63u23vPQi12y6xCp20ZUHfg67kQeDSP/g==", + "dependencies": { + "react": "18.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-email/node_modules/@react-email/text": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.7.tgz", + "integrity": "sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, "node_modules/react-email/node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -12721,6 +13006,17 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/react-email/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-email/node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -13351,9 +13647,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } diff --git a/package.json b/package.json index e539d7e..1ad7c26 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,9 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", - "@react-email/components": "^0.0.16", + "@react-email/components": "0.0.17", "@tanstack/react-query": "^5.25.0", - "@tanstack/react-table": "^8.13.2", + "@tanstack/react-table": "^8.16.0", "bcrypt": "^5.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", @@ -48,8 +48,8 @@ "next-pwa": "^5.6.0", "next-themes": "^0.2.1", "nuqs": "^1.17.1", - "react": "^18", - "react-dom": "^18", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-email": "^2.1.1", "react-hook-form": "^7.51.0", "resend": "^3.2.0", diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js index 3a2c243..e891a68 100644 --- a/public/mockServiceWorker.js +++ b/public/mockServiceWorker.js @@ -8,7 +8,7 @@ * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.2.10' +const PACKAGE_VERSION = '2.2.14' const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() From 68a6d1665a243666e6a85c08ede8ba22c23ae3a6 Mon Sep 17 00:00:00 2001 From: Limerio <44976231+Limerio@users.noreply.github.com> Date: Sat, 4 May 2024 12:58:13 +0200 Subject: [PATCH 49/51] fix(): query params works --- src/components/ui/data-table.jsx | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/ui/data-table.jsx b/src/components/ui/data-table.jsx index 2e3dfec..2f7fcf8 100644 --- a/src/components/ui/data-table.jsx +++ b/src/components/ui/data-table.jsx @@ -1,3 +1,4 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { @@ -35,8 +36,14 @@ export const DataTable = ({ columns, data, filterInput }) => { const tUtils = useTranslations("Utils") const [sorting, setSorting] = useState([]) const [columnFilters, setColumnFilters] = useState([]) - const [size, setSize] = useQueryState("size", parseAsInteger.withDefault(10)) - const [page, setPage] = useQueryState("page", parseAsInteger.withDefault(0)) + const [size, setSize] = useQueryState( + "size", + parseAsInteger.withOptions({ clearOnDefault: true }).withDefault(10), + ) + const [page, setPage] = useQueryState( + "page", + parseAsInteger.withOptions({ clearOnDefault: true }).withDefault(1), + ) const [search, setSearch] = useQueryState("search", parseAsString) const table = useReactTable({ data, @@ -47,15 +54,11 @@ export const DataTable = ({ columns, data, filterInput }) => { onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), - onPaginationChange: value => { - setPage(value.pageIndex) - setSize(value.pageSize) - }, state: { sorting, columnFilters, pagination: { - pageIndex: page, + pageIndex: page - 1, pageSize: size, }, }, @@ -124,7 +127,7 @@ export const DataTable = ({ columns, data, filterInput }) => { - setSize(value)}> From 85206483f8d5a693ef4ed53733c20e19eaa71ad4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 10:59:10 +0000 Subject: [PATCH 50/51] fix(deps): update dependency lucide-react to ^0.378.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e62a382..fc0515f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "clsx": "^2.1.0", "ioredis": "^5.3.2", "jose": "^5.2.4", - "lucide-react": "^0.350.0", + "lucide-react": "^0.378.0", "mongodb": "^6.4.0", "mongoose": "^8.2.1", "next": "14.1.3", @@ -10112,9 +10112,9 @@ } }, "node_modules/lucide-react": { - "version": "0.350.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.350.0.tgz", - "integrity": "sha512-5IZVKsxxG8Nn81gpsz4XLNgCAXkppCh0Y0P0GLO39h5iVD2WEaB9of6cPkLtzys1GuSfxJxmwsDh487y7LAf/g==", + "version": "0.378.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.378.0.tgz", + "integrity": "sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } diff --git a/package.json b/package.json index af48994..5c2cfd5 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "clsx": "^2.1.0", "ioredis": "^5.3.2", "jose": "^5.2.4", - "lucide-react": "^0.350.0", + "lucide-react": "^0.378.0", "mongodb": "^6.4.0", "mongoose": "^8.2.1", "next": "14.1.3", From fc93bb50eea118b3506f3fbe656a3b9ae7d8b46b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 11:12:39 +0000 Subject: [PATCH 51/51] chore(deps): update dependency msw to v2.2.14 --- package-lock.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index e62a382..a747a19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2706,9 +2706,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.25.16", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.16.tgz", - "integrity": "sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==", + "version": "0.26.15", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.26.15.tgz", + "integrity": "sha512-HM47Lu1YFmnYHKMBynFfjCp0U/yRskHj/8QEJW0CBEPOlw8Gkmjfll+S9b8M7V5CNDw2/ciRxjjnWeaCiblSIQ==", "dev": true, "dependencies": { "@open-draft/deferred-promise": "^2.2.0", @@ -10478,9 +10478,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msw": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.2.10.tgz", - "integrity": "sha512-OQhHBocUsI8j+czCTRouGCGYE8pk6hq8HQ0HFg9mYQg7KCzqVpUSbMikmRbRXGoid28FFvYqjbxB3/UWw50VZQ==", + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.2.14.tgz", + "integrity": "sha512-64i8rNCa1xzDK8ZYsTrVMli05D687jty8+Th+PU5VTbJ2/4P7fkQFVyDQ6ZFT5FrNR8z2BHhbY47fKNvfHrumA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -10488,7 +10488,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@inquirer/confirm": "^3.0.0", "@mswjs/cookies": "^1.1.0", - "@mswjs/interceptors": "^0.25.16", + "@mswjs/interceptors": "^0.26.14", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", @@ -10521,9 +10521,9 @@ } }, "node_modules/msw/node_modules/type-fest": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.13.1.tgz", - "integrity": "sha512-ASMgM+Vf2cLwDMt1KXSkMUDSYCxtckDJs8zsaVF/mYteIsiARKCVtyXtcK38mIKbLTctZP8v6GMqdNaeI3fo7g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.1.tgz", + "integrity": "sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==", "dev": true, "engines": { "node": ">=16"