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 (
+
+ )
+}
+
+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 (
)
}
-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 (
+
+
+ )
+}
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 (
+
+
+ )
+}
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 (
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 }) => {