ShieldX commited on
Commit
3c21989
·
verified ·
1 Parent(s): 8e4f759

Upload 11 files

Browse files
.gitignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ node_modules
2
+ # Keep environment variables out of version control
3
+ .env
4
+
5
+ /generated/prisma
Dockerfile ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:22
2
+ WORKDIR /app
3
+ COPY package*.json ./
4
+ RUN npm install
5
+ COPY . .
6
+ # Generate Prisma Client
7
+ RUN npx prisma generate
8
+ EXPOSE 7860
9
+ CMD ["node", "src/server.js"]
package-lock.json ADDED
@@ -0,0 +1,1643 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "scraping-bootcamp-backend",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "scraping-bootcamp-backend",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@prisma/client": "^6.19.2",
13
+ "bcrypt": "^6.0.0",
14
+ "cloudinary": "^1.41.3",
15
+ "cors": "^2.8.6",
16
+ "dotenv": "^17.3.1",
17
+ "express": "^5.2.1",
18
+ "jsonwebtoken": "^9.0.3",
19
+ "multer": "^2.1.1",
20
+ "multer-storage-cloudinary": "^4.0.0",
21
+ "nodemailer": "^8.0.2",
22
+ "prisma": "^6.19.2"
23
+ }
24
+ },
25
+ "node_modules/@prisma/client": {
26
+ "version": "6.19.2",
27
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.2.tgz",
28
+ "integrity": "sha512-gR2EMvfK/aTxsuooaDA32D8v+us/8AAet+C3J1cc04SW35FPdZYgLF+iN4NDLUgAaUGTKdAB0CYenu1TAgGdMg==",
29
+ "hasInstallScript": true,
30
+ "license": "Apache-2.0",
31
+ "engines": {
32
+ "node": ">=18.18"
33
+ },
34
+ "peerDependencies": {
35
+ "prisma": "*",
36
+ "typescript": ">=5.1.0"
37
+ },
38
+ "peerDependenciesMeta": {
39
+ "prisma": {
40
+ "optional": true
41
+ },
42
+ "typescript": {
43
+ "optional": true
44
+ }
45
+ }
46
+ },
47
+ "node_modules/@prisma/config": {
48
+ "version": "6.19.2",
49
+ "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.2.tgz",
50
+ "integrity": "sha512-kadBGDl+aUswv/zZMk9Mx0C8UZs1kjao8H9/JpI4Wh4SHZaM7zkTwiKn/iFLfRg+XtOAo/Z/c6pAYhijKl0nzQ==",
51
+ "license": "Apache-2.0",
52
+ "dependencies": {
53
+ "c12": "3.1.0",
54
+ "deepmerge-ts": "7.1.5",
55
+ "effect": "3.18.4",
56
+ "empathic": "2.0.0"
57
+ }
58
+ },
59
+ "node_modules/@prisma/debug": {
60
+ "version": "6.19.2",
61
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.2.tgz",
62
+ "integrity": "sha512-lFnEZsLdFLmEVCVNdskLDCL8Uup41GDfU0LUfquw+ercJC8ODTuL0WNKgOKmYxCJVvFwf0OuZBzW99DuWmoH2A==",
63
+ "license": "Apache-2.0"
64
+ },
65
+ "node_modules/@prisma/engines": {
66
+ "version": "6.19.2",
67
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.2.tgz",
68
+ "integrity": "sha512-TTkJ8r+uk/uqczX40wb+ODG0E0icVsMgwCTyTHXehaEfb0uo80M9g1aW1tEJrxmFHeOZFXdI2sTA1j1AgcHi4A==",
69
+ "hasInstallScript": true,
70
+ "license": "Apache-2.0",
71
+ "dependencies": {
72
+ "@prisma/debug": "6.19.2",
73
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
74
+ "@prisma/fetch-engine": "6.19.2",
75
+ "@prisma/get-platform": "6.19.2"
76
+ }
77
+ },
78
+ "node_modules/@prisma/engines-version": {
79
+ "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
80
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz",
81
+ "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==",
82
+ "license": "Apache-2.0"
83
+ },
84
+ "node_modules/@prisma/fetch-engine": {
85
+ "version": "6.19.2",
86
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.2.tgz",
87
+ "integrity": "sha512-h4Ff4Pho+SR1S8XerMCC12X//oY2bG3Iug/fUnudfcXEUnIeRiBdXHFdGlGOgQ3HqKgosTEhkZMvGM9tWtYC+Q==",
88
+ "license": "Apache-2.0",
89
+ "dependencies": {
90
+ "@prisma/debug": "6.19.2",
91
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
92
+ "@prisma/get-platform": "6.19.2"
93
+ }
94
+ },
95
+ "node_modules/@prisma/get-platform": {
96
+ "version": "6.19.2",
97
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.2.tgz",
98
+ "integrity": "sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA==",
99
+ "license": "Apache-2.0",
100
+ "dependencies": {
101
+ "@prisma/debug": "6.19.2"
102
+ }
103
+ },
104
+ "node_modules/@standard-schema/spec": {
105
+ "version": "1.1.0",
106
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
107
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
108
+ "license": "MIT"
109
+ },
110
+ "node_modules/accepts": {
111
+ "version": "2.0.0",
112
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
113
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
114
+ "license": "MIT",
115
+ "dependencies": {
116
+ "mime-types": "^3.0.0",
117
+ "negotiator": "^1.0.0"
118
+ },
119
+ "engines": {
120
+ "node": ">= 0.6"
121
+ }
122
+ },
123
+ "node_modules/append-field": {
124
+ "version": "1.0.0",
125
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
126
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
127
+ "license": "MIT"
128
+ },
129
+ "node_modules/bcrypt": {
130
+ "version": "6.0.0",
131
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz",
132
+ "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==",
133
+ "hasInstallScript": true,
134
+ "license": "MIT",
135
+ "dependencies": {
136
+ "node-addon-api": "^8.3.0",
137
+ "node-gyp-build": "^4.8.4"
138
+ },
139
+ "engines": {
140
+ "node": ">= 18"
141
+ }
142
+ },
143
+ "node_modules/body-parser": {
144
+ "version": "2.2.2",
145
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
146
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
147
+ "license": "MIT",
148
+ "dependencies": {
149
+ "bytes": "^3.1.2",
150
+ "content-type": "^1.0.5",
151
+ "debug": "^4.4.3",
152
+ "http-errors": "^2.0.0",
153
+ "iconv-lite": "^0.7.0",
154
+ "on-finished": "^2.4.1",
155
+ "qs": "^6.14.1",
156
+ "raw-body": "^3.0.1",
157
+ "type-is": "^2.0.1"
158
+ },
159
+ "engines": {
160
+ "node": ">=18"
161
+ },
162
+ "funding": {
163
+ "type": "opencollective",
164
+ "url": "https://opencollective.com/express"
165
+ }
166
+ },
167
+ "node_modules/buffer-equal-constant-time": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
170
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
171
+ "license": "BSD-3-Clause"
172
+ },
173
+ "node_modules/buffer-from": {
174
+ "version": "1.1.2",
175
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
176
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
177
+ "license": "MIT"
178
+ },
179
+ "node_modules/busboy": {
180
+ "version": "1.6.0",
181
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
182
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
183
+ "dependencies": {
184
+ "streamsearch": "^1.1.0"
185
+ },
186
+ "engines": {
187
+ "node": ">=10.16.0"
188
+ }
189
+ },
190
+ "node_modules/bytes": {
191
+ "version": "3.1.2",
192
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
193
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
194
+ "license": "MIT",
195
+ "engines": {
196
+ "node": ">= 0.8"
197
+ }
198
+ },
199
+ "node_modules/c12": {
200
+ "version": "3.1.0",
201
+ "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz",
202
+ "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==",
203
+ "license": "MIT",
204
+ "dependencies": {
205
+ "chokidar": "^4.0.3",
206
+ "confbox": "^0.2.2",
207
+ "defu": "^6.1.4",
208
+ "dotenv": "^16.6.1",
209
+ "exsolve": "^1.0.7",
210
+ "giget": "^2.0.0",
211
+ "jiti": "^2.4.2",
212
+ "ohash": "^2.0.11",
213
+ "pathe": "^2.0.3",
214
+ "perfect-debounce": "^1.0.0",
215
+ "pkg-types": "^2.2.0",
216
+ "rc9": "^2.1.2"
217
+ },
218
+ "peerDependencies": {
219
+ "magicast": "^0.3.5"
220
+ },
221
+ "peerDependenciesMeta": {
222
+ "magicast": {
223
+ "optional": true
224
+ }
225
+ }
226
+ },
227
+ "node_modules/c12/node_modules/dotenv": {
228
+ "version": "16.6.1",
229
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
230
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
231
+ "license": "BSD-2-Clause",
232
+ "engines": {
233
+ "node": ">=12"
234
+ },
235
+ "funding": {
236
+ "url": "https://dotenvx.com"
237
+ }
238
+ },
239
+ "node_modules/call-bind-apply-helpers": {
240
+ "version": "1.0.2",
241
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
242
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
243
+ "license": "MIT",
244
+ "dependencies": {
245
+ "es-errors": "^1.3.0",
246
+ "function-bind": "^1.1.2"
247
+ },
248
+ "engines": {
249
+ "node": ">= 0.4"
250
+ }
251
+ },
252
+ "node_modules/call-bound": {
253
+ "version": "1.0.4",
254
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
255
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
256
+ "license": "MIT",
257
+ "dependencies": {
258
+ "call-bind-apply-helpers": "^1.0.2",
259
+ "get-intrinsic": "^1.3.0"
260
+ },
261
+ "engines": {
262
+ "node": ">= 0.4"
263
+ },
264
+ "funding": {
265
+ "url": "https://github.com/sponsors/ljharb"
266
+ }
267
+ },
268
+ "node_modules/chokidar": {
269
+ "version": "4.0.3",
270
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
271
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
272
+ "license": "MIT",
273
+ "dependencies": {
274
+ "readdirp": "^4.0.1"
275
+ },
276
+ "engines": {
277
+ "node": ">= 14.16.0"
278
+ },
279
+ "funding": {
280
+ "url": "https://paulmillr.com/funding/"
281
+ }
282
+ },
283
+ "node_modules/citty": {
284
+ "version": "0.1.6",
285
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
286
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
287
+ "license": "MIT",
288
+ "dependencies": {
289
+ "consola": "^3.2.3"
290
+ }
291
+ },
292
+ "node_modules/cloudinary": {
293
+ "version": "1.41.3",
294
+ "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.3.tgz",
295
+ "integrity": "sha512-4o84y+E7dbif3lMns+p3UW6w6hLHEifbX/7zBJvaih1E9QNMZITENQ14GPYJC4JmhygYXsuuBb9bRA3xWEoOfg==",
296
+ "license": "MIT",
297
+ "dependencies": {
298
+ "cloudinary-core": "^2.13.0",
299
+ "core-js": "^3.30.1",
300
+ "lodash": "^4.17.21",
301
+ "q": "^1.5.1"
302
+ },
303
+ "engines": {
304
+ "node": ">=0.6"
305
+ }
306
+ },
307
+ "node_modules/cloudinary-core": {
308
+ "version": "2.14.1",
309
+ "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.14.1.tgz",
310
+ "integrity": "sha512-57rgZSQD2cJsz1rga6M7jIDQuEAzkwvq63vTvs3/I8rNpGLyHMoKoIvBkNS0Guv5RZ9KDReJhI2LmElk4D9U1g==",
311
+ "license": "MIT",
312
+ "peerDependencies": {
313
+ "lodash": ">=4.0"
314
+ }
315
+ },
316
+ "node_modules/concat-stream": {
317
+ "version": "2.0.0",
318
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
319
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
320
+ "engines": [
321
+ "node >= 6.0"
322
+ ],
323
+ "license": "MIT",
324
+ "dependencies": {
325
+ "buffer-from": "^1.0.0",
326
+ "inherits": "^2.0.3",
327
+ "readable-stream": "^3.0.2",
328
+ "typedarray": "^0.0.6"
329
+ }
330
+ },
331
+ "node_modules/confbox": {
332
+ "version": "0.2.4",
333
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
334
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
335
+ "license": "MIT"
336
+ },
337
+ "node_modules/consola": {
338
+ "version": "3.4.2",
339
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
340
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
341
+ "license": "MIT",
342
+ "engines": {
343
+ "node": "^14.18.0 || >=16.10.0"
344
+ }
345
+ },
346
+ "node_modules/content-disposition": {
347
+ "version": "1.0.1",
348
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
349
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
350
+ "license": "MIT",
351
+ "engines": {
352
+ "node": ">=18"
353
+ },
354
+ "funding": {
355
+ "type": "opencollective",
356
+ "url": "https://opencollective.com/express"
357
+ }
358
+ },
359
+ "node_modules/content-type": {
360
+ "version": "1.0.5",
361
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
362
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
363
+ "license": "MIT",
364
+ "engines": {
365
+ "node": ">= 0.6"
366
+ }
367
+ },
368
+ "node_modules/cookie": {
369
+ "version": "0.7.2",
370
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
371
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
372
+ "license": "MIT",
373
+ "engines": {
374
+ "node": ">= 0.6"
375
+ }
376
+ },
377
+ "node_modules/cookie-signature": {
378
+ "version": "1.2.2",
379
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
380
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
381
+ "license": "MIT",
382
+ "engines": {
383
+ "node": ">=6.6.0"
384
+ }
385
+ },
386
+ "node_modules/core-js": {
387
+ "version": "3.48.0",
388
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz",
389
+ "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==",
390
+ "hasInstallScript": true,
391
+ "license": "MIT",
392
+ "funding": {
393
+ "type": "opencollective",
394
+ "url": "https://opencollective.com/core-js"
395
+ }
396
+ },
397
+ "node_modules/cors": {
398
+ "version": "2.8.6",
399
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
400
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
401
+ "license": "MIT",
402
+ "dependencies": {
403
+ "object-assign": "^4",
404
+ "vary": "^1"
405
+ },
406
+ "engines": {
407
+ "node": ">= 0.10"
408
+ },
409
+ "funding": {
410
+ "type": "opencollective",
411
+ "url": "https://opencollective.com/express"
412
+ }
413
+ },
414
+ "node_modules/debug": {
415
+ "version": "4.4.3",
416
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
417
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
418
+ "license": "MIT",
419
+ "dependencies": {
420
+ "ms": "^2.1.3"
421
+ },
422
+ "engines": {
423
+ "node": ">=6.0"
424
+ },
425
+ "peerDependenciesMeta": {
426
+ "supports-color": {
427
+ "optional": true
428
+ }
429
+ }
430
+ },
431
+ "node_modules/deepmerge-ts": {
432
+ "version": "7.1.5",
433
+ "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz",
434
+ "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==",
435
+ "license": "BSD-3-Clause",
436
+ "engines": {
437
+ "node": ">=16.0.0"
438
+ }
439
+ },
440
+ "node_modules/defu": {
441
+ "version": "6.1.4",
442
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
443
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
444
+ "license": "MIT"
445
+ },
446
+ "node_modules/depd": {
447
+ "version": "2.0.0",
448
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
449
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
450
+ "license": "MIT",
451
+ "engines": {
452
+ "node": ">= 0.8"
453
+ }
454
+ },
455
+ "node_modules/destr": {
456
+ "version": "2.0.5",
457
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
458
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
459
+ "license": "MIT"
460
+ },
461
+ "node_modules/dotenv": {
462
+ "version": "17.3.1",
463
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz",
464
+ "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==",
465
+ "license": "BSD-2-Clause",
466
+ "engines": {
467
+ "node": ">=12"
468
+ },
469
+ "funding": {
470
+ "url": "https://dotenvx.com"
471
+ }
472
+ },
473
+ "node_modules/dunder-proto": {
474
+ "version": "1.0.1",
475
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
476
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
477
+ "license": "MIT",
478
+ "dependencies": {
479
+ "call-bind-apply-helpers": "^1.0.1",
480
+ "es-errors": "^1.3.0",
481
+ "gopd": "^1.2.0"
482
+ },
483
+ "engines": {
484
+ "node": ">= 0.4"
485
+ }
486
+ },
487
+ "node_modules/ecdsa-sig-formatter": {
488
+ "version": "1.0.11",
489
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
490
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
491
+ "license": "Apache-2.0",
492
+ "dependencies": {
493
+ "safe-buffer": "^5.0.1"
494
+ }
495
+ },
496
+ "node_modules/ee-first": {
497
+ "version": "1.1.1",
498
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
499
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
500
+ "license": "MIT"
501
+ },
502
+ "node_modules/effect": {
503
+ "version": "3.18.4",
504
+ "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz",
505
+ "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==",
506
+ "license": "MIT",
507
+ "dependencies": {
508
+ "@standard-schema/spec": "^1.0.0",
509
+ "fast-check": "^3.23.1"
510
+ }
511
+ },
512
+ "node_modules/empathic": {
513
+ "version": "2.0.0",
514
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
515
+ "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
516
+ "license": "MIT",
517
+ "engines": {
518
+ "node": ">=14"
519
+ }
520
+ },
521
+ "node_modules/encodeurl": {
522
+ "version": "2.0.0",
523
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
524
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
525
+ "license": "MIT",
526
+ "engines": {
527
+ "node": ">= 0.8"
528
+ }
529
+ },
530
+ "node_modules/es-define-property": {
531
+ "version": "1.0.1",
532
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
533
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
534
+ "license": "MIT",
535
+ "engines": {
536
+ "node": ">= 0.4"
537
+ }
538
+ },
539
+ "node_modules/es-errors": {
540
+ "version": "1.3.0",
541
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
542
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
543
+ "license": "MIT",
544
+ "engines": {
545
+ "node": ">= 0.4"
546
+ }
547
+ },
548
+ "node_modules/es-object-atoms": {
549
+ "version": "1.1.1",
550
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
551
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
552
+ "license": "MIT",
553
+ "dependencies": {
554
+ "es-errors": "^1.3.0"
555
+ },
556
+ "engines": {
557
+ "node": ">= 0.4"
558
+ }
559
+ },
560
+ "node_modules/escape-html": {
561
+ "version": "1.0.3",
562
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
563
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
564
+ "license": "MIT"
565
+ },
566
+ "node_modules/etag": {
567
+ "version": "1.8.1",
568
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
569
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
570
+ "license": "MIT",
571
+ "engines": {
572
+ "node": ">= 0.6"
573
+ }
574
+ },
575
+ "node_modules/express": {
576
+ "version": "5.2.1",
577
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
578
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
579
+ "license": "MIT",
580
+ "dependencies": {
581
+ "accepts": "^2.0.0",
582
+ "body-parser": "^2.2.1",
583
+ "content-disposition": "^1.0.0",
584
+ "content-type": "^1.0.5",
585
+ "cookie": "^0.7.1",
586
+ "cookie-signature": "^1.2.1",
587
+ "debug": "^4.4.0",
588
+ "depd": "^2.0.0",
589
+ "encodeurl": "^2.0.0",
590
+ "escape-html": "^1.0.3",
591
+ "etag": "^1.8.1",
592
+ "finalhandler": "^2.1.0",
593
+ "fresh": "^2.0.0",
594
+ "http-errors": "^2.0.0",
595
+ "merge-descriptors": "^2.0.0",
596
+ "mime-types": "^3.0.0",
597
+ "on-finished": "^2.4.1",
598
+ "once": "^1.4.0",
599
+ "parseurl": "^1.3.3",
600
+ "proxy-addr": "^2.0.7",
601
+ "qs": "^6.14.0",
602
+ "range-parser": "^1.2.1",
603
+ "router": "^2.2.0",
604
+ "send": "^1.1.0",
605
+ "serve-static": "^2.2.0",
606
+ "statuses": "^2.0.1",
607
+ "type-is": "^2.0.1",
608
+ "vary": "^1.1.2"
609
+ },
610
+ "engines": {
611
+ "node": ">= 18"
612
+ },
613
+ "funding": {
614
+ "type": "opencollective",
615
+ "url": "https://opencollective.com/express"
616
+ }
617
+ },
618
+ "node_modules/exsolve": {
619
+ "version": "1.0.8",
620
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
621
+ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
622
+ "license": "MIT"
623
+ },
624
+ "node_modules/fast-check": {
625
+ "version": "3.23.2",
626
+ "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz",
627
+ "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==",
628
+ "funding": [
629
+ {
630
+ "type": "individual",
631
+ "url": "https://github.com/sponsors/dubzzz"
632
+ },
633
+ {
634
+ "type": "opencollective",
635
+ "url": "https://opencollective.com/fast-check"
636
+ }
637
+ ],
638
+ "license": "MIT",
639
+ "dependencies": {
640
+ "pure-rand": "^6.1.0"
641
+ },
642
+ "engines": {
643
+ "node": ">=8.0.0"
644
+ }
645
+ },
646
+ "node_modules/finalhandler": {
647
+ "version": "2.1.1",
648
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
649
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
650
+ "license": "MIT",
651
+ "dependencies": {
652
+ "debug": "^4.4.0",
653
+ "encodeurl": "^2.0.0",
654
+ "escape-html": "^1.0.3",
655
+ "on-finished": "^2.4.1",
656
+ "parseurl": "^1.3.3",
657
+ "statuses": "^2.0.1"
658
+ },
659
+ "engines": {
660
+ "node": ">= 18.0.0"
661
+ },
662
+ "funding": {
663
+ "type": "opencollective",
664
+ "url": "https://opencollective.com/express"
665
+ }
666
+ },
667
+ "node_modules/forwarded": {
668
+ "version": "0.2.0",
669
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
670
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
671
+ "license": "MIT",
672
+ "engines": {
673
+ "node": ">= 0.6"
674
+ }
675
+ },
676
+ "node_modules/fresh": {
677
+ "version": "2.0.0",
678
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
679
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
680
+ "license": "MIT",
681
+ "engines": {
682
+ "node": ">= 0.8"
683
+ }
684
+ },
685
+ "node_modules/function-bind": {
686
+ "version": "1.1.2",
687
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
688
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
689
+ "license": "MIT",
690
+ "funding": {
691
+ "url": "https://github.com/sponsors/ljharb"
692
+ }
693
+ },
694
+ "node_modules/get-intrinsic": {
695
+ "version": "1.3.0",
696
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
697
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
698
+ "license": "MIT",
699
+ "dependencies": {
700
+ "call-bind-apply-helpers": "^1.0.2",
701
+ "es-define-property": "^1.0.1",
702
+ "es-errors": "^1.3.0",
703
+ "es-object-atoms": "^1.1.1",
704
+ "function-bind": "^1.1.2",
705
+ "get-proto": "^1.0.1",
706
+ "gopd": "^1.2.0",
707
+ "has-symbols": "^1.1.0",
708
+ "hasown": "^2.0.2",
709
+ "math-intrinsics": "^1.1.0"
710
+ },
711
+ "engines": {
712
+ "node": ">= 0.4"
713
+ },
714
+ "funding": {
715
+ "url": "https://github.com/sponsors/ljharb"
716
+ }
717
+ },
718
+ "node_modules/get-proto": {
719
+ "version": "1.0.1",
720
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
721
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
722
+ "license": "MIT",
723
+ "dependencies": {
724
+ "dunder-proto": "^1.0.1",
725
+ "es-object-atoms": "^1.0.0"
726
+ },
727
+ "engines": {
728
+ "node": ">= 0.4"
729
+ }
730
+ },
731
+ "node_modules/giget": {
732
+ "version": "2.0.0",
733
+ "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
734
+ "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
735
+ "license": "MIT",
736
+ "dependencies": {
737
+ "citty": "^0.1.6",
738
+ "consola": "^3.4.0",
739
+ "defu": "^6.1.4",
740
+ "node-fetch-native": "^1.6.6",
741
+ "nypm": "^0.6.0",
742
+ "pathe": "^2.0.3"
743
+ },
744
+ "bin": {
745
+ "giget": "dist/cli.mjs"
746
+ }
747
+ },
748
+ "node_modules/gopd": {
749
+ "version": "1.2.0",
750
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
751
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
752
+ "license": "MIT",
753
+ "engines": {
754
+ "node": ">= 0.4"
755
+ },
756
+ "funding": {
757
+ "url": "https://github.com/sponsors/ljharb"
758
+ }
759
+ },
760
+ "node_modules/has-symbols": {
761
+ "version": "1.1.0",
762
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
763
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
764
+ "license": "MIT",
765
+ "engines": {
766
+ "node": ">= 0.4"
767
+ },
768
+ "funding": {
769
+ "url": "https://github.com/sponsors/ljharb"
770
+ }
771
+ },
772
+ "node_modules/hasown": {
773
+ "version": "2.0.2",
774
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
775
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
776
+ "license": "MIT",
777
+ "dependencies": {
778
+ "function-bind": "^1.1.2"
779
+ },
780
+ "engines": {
781
+ "node": ">= 0.4"
782
+ }
783
+ },
784
+ "node_modules/http-errors": {
785
+ "version": "2.0.1",
786
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
787
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
788
+ "license": "MIT",
789
+ "dependencies": {
790
+ "depd": "~2.0.0",
791
+ "inherits": "~2.0.4",
792
+ "setprototypeof": "~1.2.0",
793
+ "statuses": "~2.0.2",
794
+ "toidentifier": "~1.0.1"
795
+ },
796
+ "engines": {
797
+ "node": ">= 0.8"
798
+ },
799
+ "funding": {
800
+ "type": "opencollective",
801
+ "url": "https://opencollective.com/express"
802
+ }
803
+ },
804
+ "node_modules/iconv-lite": {
805
+ "version": "0.7.2",
806
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
807
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
808
+ "license": "MIT",
809
+ "dependencies": {
810
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
811
+ },
812
+ "engines": {
813
+ "node": ">=0.10.0"
814
+ },
815
+ "funding": {
816
+ "type": "opencollective",
817
+ "url": "https://opencollective.com/express"
818
+ }
819
+ },
820
+ "node_modules/inherits": {
821
+ "version": "2.0.4",
822
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
823
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
824
+ "license": "ISC"
825
+ },
826
+ "node_modules/ipaddr.js": {
827
+ "version": "1.9.1",
828
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
829
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
830
+ "license": "MIT",
831
+ "engines": {
832
+ "node": ">= 0.10"
833
+ }
834
+ },
835
+ "node_modules/is-promise": {
836
+ "version": "4.0.0",
837
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
838
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
839
+ "license": "MIT"
840
+ },
841
+ "node_modules/jiti": {
842
+ "version": "2.6.1",
843
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
844
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
845
+ "license": "MIT",
846
+ "bin": {
847
+ "jiti": "lib/jiti-cli.mjs"
848
+ }
849
+ },
850
+ "node_modules/jsonwebtoken": {
851
+ "version": "9.0.3",
852
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
853
+ "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
854
+ "license": "MIT",
855
+ "dependencies": {
856
+ "jws": "^4.0.1",
857
+ "lodash.includes": "^4.3.0",
858
+ "lodash.isboolean": "^3.0.3",
859
+ "lodash.isinteger": "^4.0.4",
860
+ "lodash.isnumber": "^3.0.3",
861
+ "lodash.isplainobject": "^4.0.6",
862
+ "lodash.isstring": "^4.0.1",
863
+ "lodash.once": "^4.0.0",
864
+ "ms": "^2.1.1",
865
+ "semver": "^7.5.4"
866
+ },
867
+ "engines": {
868
+ "node": ">=12",
869
+ "npm": ">=6"
870
+ }
871
+ },
872
+ "node_modules/jwa": {
873
+ "version": "2.0.1",
874
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
875
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
876
+ "license": "MIT",
877
+ "dependencies": {
878
+ "buffer-equal-constant-time": "^1.0.1",
879
+ "ecdsa-sig-formatter": "1.0.11",
880
+ "safe-buffer": "^5.0.1"
881
+ }
882
+ },
883
+ "node_modules/jws": {
884
+ "version": "4.0.1",
885
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
886
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
887
+ "license": "MIT",
888
+ "dependencies": {
889
+ "jwa": "^2.0.1",
890
+ "safe-buffer": "^5.0.1"
891
+ }
892
+ },
893
+ "node_modules/lodash": {
894
+ "version": "4.17.23",
895
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
896
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
897
+ "license": "MIT"
898
+ },
899
+ "node_modules/lodash.includes": {
900
+ "version": "4.3.0",
901
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
902
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
903
+ "license": "MIT"
904
+ },
905
+ "node_modules/lodash.isboolean": {
906
+ "version": "3.0.3",
907
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
908
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
909
+ "license": "MIT"
910
+ },
911
+ "node_modules/lodash.isinteger": {
912
+ "version": "4.0.4",
913
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
914
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
915
+ "license": "MIT"
916
+ },
917
+ "node_modules/lodash.isnumber": {
918
+ "version": "3.0.3",
919
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
920
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
921
+ "license": "MIT"
922
+ },
923
+ "node_modules/lodash.isplainobject": {
924
+ "version": "4.0.6",
925
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
926
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
927
+ "license": "MIT"
928
+ },
929
+ "node_modules/lodash.isstring": {
930
+ "version": "4.0.1",
931
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
932
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
933
+ "license": "MIT"
934
+ },
935
+ "node_modules/lodash.once": {
936
+ "version": "4.1.1",
937
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
938
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
939
+ "license": "MIT"
940
+ },
941
+ "node_modules/math-intrinsics": {
942
+ "version": "1.1.0",
943
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
944
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
945
+ "license": "MIT",
946
+ "engines": {
947
+ "node": ">= 0.4"
948
+ }
949
+ },
950
+ "node_modules/media-typer": {
951
+ "version": "1.1.0",
952
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
953
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
954
+ "license": "MIT",
955
+ "engines": {
956
+ "node": ">= 0.8"
957
+ }
958
+ },
959
+ "node_modules/merge-descriptors": {
960
+ "version": "2.0.0",
961
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
962
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
963
+ "license": "MIT",
964
+ "engines": {
965
+ "node": ">=18"
966
+ },
967
+ "funding": {
968
+ "url": "https://github.com/sponsors/sindresorhus"
969
+ }
970
+ },
971
+ "node_modules/mime-db": {
972
+ "version": "1.54.0",
973
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
974
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
975
+ "license": "MIT",
976
+ "engines": {
977
+ "node": ">= 0.6"
978
+ }
979
+ },
980
+ "node_modules/mime-types": {
981
+ "version": "3.0.2",
982
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
983
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
984
+ "license": "MIT",
985
+ "dependencies": {
986
+ "mime-db": "^1.54.0"
987
+ },
988
+ "engines": {
989
+ "node": ">=18"
990
+ },
991
+ "funding": {
992
+ "type": "opencollective",
993
+ "url": "https://opencollective.com/express"
994
+ }
995
+ },
996
+ "node_modules/ms": {
997
+ "version": "2.1.3",
998
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
999
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1000
+ "license": "MIT"
1001
+ },
1002
+ "node_modules/multer": {
1003
+ "version": "2.1.1",
1004
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz",
1005
+ "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==",
1006
+ "license": "MIT",
1007
+ "dependencies": {
1008
+ "append-field": "^1.0.0",
1009
+ "busboy": "^1.6.0",
1010
+ "concat-stream": "^2.0.0",
1011
+ "type-is": "^1.6.18"
1012
+ },
1013
+ "engines": {
1014
+ "node": ">= 10.16.0"
1015
+ },
1016
+ "funding": {
1017
+ "type": "opencollective",
1018
+ "url": "https://opencollective.com/express"
1019
+ }
1020
+ },
1021
+ "node_modules/multer-storage-cloudinary": {
1022
+ "version": "4.0.0",
1023
+ "resolved": "https://registry.npmjs.org/multer-storage-cloudinary/-/multer-storage-cloudinary-4.0.0.tgz",
1024
+ "integrity": "sha512-25lm9R6o5dWrHLqLvygNX+kBOxprzpmZdnVKH4+r68WcfCt8XV6xfQaMuAg+kUE5Xmr8mJNA4gE0AcBj9FJyWA==",
1025
+ "license": "MIT",
1026
+ "peerDependencies": {
1027
+ "cloudinary": "^1.21.0"
1028
+ }
1029
+ },
1030
+ "node_modules/multer/node_modules/media-typer": {
1031
+ "version": "0.3.0",
1032
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1033
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1034
+ "license": "MIT",
1035
+ "engines": {
1036
+ "node": ">= 0.6"
1037
+ }
1038
+ },
1039
+ "node_modules/multer/node_modules/mime-db": {
1040
+ "version": "1.52.0",
1041
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1042
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1043
+ "license": "MIT",
1044
+ "engines": {
1045
+ "node": ">= 0.6"
1046
+ }
1047
+ },
1048
+ "node_modules/multer/node_modules/mime-types": {
1049
+ "version": "2.1.35",
1050
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1051
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1052
+ "license": "MIT",
1053
+ "dependencies": {
1054
+ "mime-db": "1.52.0"
1055
+ },
1056
+ "engines": {
1057
+ "node": ">= 0.6"
1058
+ }
1059
+ },
1060
+ "node_modules/multer/node_modules/type-is": {
1061
+ "version": "1.6.18",
1062
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1063
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1064
+ "license": "MIT",
1065
+ "dependencies": {
1066
+ "media-typer": "0.3.0",
1067
+ "mime-types": "~2.1.24"
1068
+ },
1069
+ "engines": {
1070
+ "node": ">= 0.6"
1071
+ }
1072
+ },
1073
+ "node_modules/negotiator": {
1074
+ "version": "1.0.0",
1075
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
1076
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
1077
+ "license": "MIT",
1078
+ "engines": {
1079
+ "node": ">= 0.6"
1080
+ }
1081
+ },
1082
+ "node_modules/node-addon-api": {
1083
+ "version": "8.6.0",
1084
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz",
1085
+ "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==",
1086
+ "license": "MIT",
1087
+ "engines": {
1088
+ "node": "^18 || ^20 || >= 21"
1089
+ }
1090
+ },
1091
+ "node_modules/node-fetch-native": {
1092
+ "version": "1.6.7",
1093
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
1094
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
1095
+ "license": "MIT"
1096
+ },
1097
+ "node_modules/node-gyp-build": {
1098
+ "version": "4.8.4",
1099
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
1100
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
1101
+ "license": "MIT",
1102
+ "bin": {
1103
+ "node-gyp-build": "bin.js",
1104
+ "node-gyp-build-optional": "optional.js",
1105
+ "node-gyp-build-test": "build-test.js"
1106
+ }
1107
+ },
1108
+ "node_modules/nodemailer": {
1109
+ "version": "8.0.2",
1110
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.2.tgz",
1111
+ "integrity": "sha512-zbj002pZAIkWQFxyAaqoxvn+zoIwRnS40hgjqTXudKOOJkiFFgBeNqjgD3/YCR12sZnrghWYBY+yP1ZucdDRpw==",
1112
+ "license": "MIT-0",
1113
+ "engines": {
1114
+ "node": ">=6.0.0"
1115
+ }
1116
+ },
1117
+ "node_modules/nypm": {
1118
+ "version": "0.6.5",
1119
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz",
1120
+ "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==",
1121
+ "license": "MIT",
1122
+ "dependencies": {
1123
+ "citty": "^0.2.0",
1124
+ "pathe": "^2.0.3",
1125
+ "tinyexec": "^1.0.2"
1126
+ },
1127
+ "bin": {
1128
+ "nypm": "dist/cli.mjs"
1129
+ },
1130
+ "engines": {
1131
+ "node": ">=18"
1132
+ }
1133
+ },
1134
+ "node_modules/nypm/node_modules/citty": {
1135
+ "version": "0.2.1",
1136
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz",
1137
+ "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==",
1138
+ "license": "MIT"
1139
+ },
1140
+ "node_modules/object-assign": {
1141
+ "version": "4.1.1",
1142
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1143
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1144
+ "license": "MIT",
1145
+ "engines": {
1146
+ "node": ">=0.10.0"
1147
+ }
1148
+ },
1149
+ "node_modules/object-inspect": {
1150
+ "version": "1.13.4",
1151
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1152
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1153
+ "license": "MIT",
1154
+ "engines": {
1155
+ "node": ">= 0.4"
1156
+ },
1157
+ "funding": {
1158
+ "url": "https://github.com/sponsors/ljharb"
1159
+ }
1160
+ },
1161
+ "node_modules/ohash": {
1162
+ "version": "2.0.11",
1163
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
1164
+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
1165
+ "license": "MIT"
1166
+ },
1167
+ "node_modules/on-finished": {
1168
+ "version": "2.4.1",
1169
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1170
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1171
+ "license": "MIT",
1172
+ "dependencies": {
1173
+ "ee-first": "1.1.1"
1174
+ },
1175
+ "engines": {
1176
+ "node": ">= 0.8"
1177
+ }
1178
+ },
1179
+ "node_modules/once": {
1180
+ "version": "1.4.0",
1181
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1182
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1183
+ "license": "ISC",
1184
+ "dependencies": {
1185
+ "wrappy": "1"
1186
+ }
1187
+ },
1188
+ "node_modules/parseurl": {
1189
+ "version": "1.3.3",
1190
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1191
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1192
+ "license": "MIT",
1193
+ "engines": {
1194
+ "node": ">= 0.8"
1195
+ }
1196
+ },
1197
+ "node_modules/path-to-regexp": {
1198
+ "version": "8.3.0",
1199
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
1200
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
1201
+ "license": "MIT",
1202
+ "funding": {
1203
+ "type": "opencollective",
1204
+ "url": "https://opencollective.com/express"
1205
+ }
1206
+ },
1207
+ "node_modules/pathe": {
1208
+ "version": "2.0.3",
1209
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1210
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1211
+ "license": "MIT"
1212
+ },
1213
+ "node_modules/perfect-debounce": {
1214
+ "version": "1.0.0",
1215
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
1216
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
1217
+ "license": "MIT"
1218
+ },
1219
+ "node_modules/pkg-types": {
1220
+ "version": "2.3.0",
1221
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
1222
+ "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
1223
+ "license": "MIT",
1224
+ "dependencies": {
1225
+ "confbox": "^0.2.2",
1226
+ "exsolve": "^1.0.7",
1227
+ "pathe": "^2.0.3"
1228
+ }
1229
+ },
1230
+ "node_modules/prisma": {
1231
+ "version": "6.19.2",
1232
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.2.tgz",
1233
+ "integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==",
1234
+ "hasInstallScript": true,
1235
+ "license": "Apache-2.0",
1236
+ "dependencies": {
1237
+ "@prisma/config": "6.19.2",
1238
+ "@prisma/engines": "6.19.2"
1239
+ },
1240
+ "bin": {
1241
+ "prisma": "build/index.js"
1242
+ },
1243
+ "engines": {
1244
+ "node": ">=18.18"
1245
+ },
1246
+ "peerDependencies": {
1247
+ "typescript": ">=5.1.0"
1248
+ },
1249
+ "peerDependenciesMeta": {
1250
+ "typescript": {
1251
+ "optional": true
1252
+ }
1253
+ }
1254
+ },
1255
+ "node_modules/proxy-addr": {
1256
+ "version": "2.0.7",
1257
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1258
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1259
+ "license": "MIT",
1260
+ "dependencies": {
1261
+ "forwarded": "0.2.0",
1262
+ "ipaddr.js": "1.9.1"
1263
+ },
1264
+ "engines": {
1265
+ "node": ">= 0.10"
1266
+ }
1267
+ },
1268
+ "node_modules/pure-rand": {
1269
+ "version": "6.1.0",
1270
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
1271
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
1272
+ "funding": [
1273
+ {
1274
+ "type": "individual",
1275
+ "url": "https://github.com/sponsors/dubzzz"
1276
+ },
1277
+ {
1278
+ "type": "opencollective",
1279
+ "url": "https://opencollective.com/fast-check"
1280
+ }
1281
+ ],
1282
+ "license": "MIT"
1283
+ },
1284
+ "node_modules/q": {
1285
+ "version": "1.5.1",
1286
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1287
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
1288
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
1289
+ "license": "MIT",
1290
+ "engines": {
1291
+ "node": ">=0.6.0",
1292
+ "teleport": ">=0.2.0"
1293
+ }
1294
+ },
1295
+ "node_modules/qs": {
1296
+ "version": "6.15.0",
1297
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
1298
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
1299
+ "license": "BSD-3-Clause",
1300
+ "dependencies": {
1301
+ "side-channel": "^1.1.0"
1302
+ },
1303
+ "engines": {
1304
+ "node": ">=0.6"
1305
+ },
1306
+ "funding": {
1307
+ "url": "https://github.com/sponsors/ljharb"
1308
+ }
1309
+ },
1310
+ "node_modules/range-parser": {
1311
+ "version": "1.2.1",
1312
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1313
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1314
+ "license": "MIT",
1315
+ "engines": {
1316
+ "node": ">= 0.6"
1317
+ }
1318
+ },
1319
+ "node_modules/raw-body": {
1320
+ "version": "3.0.2",
1321
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
1322
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
1323
+ "license": "MIT",
1324
+ "dependencies": {
1325
+ "bytes": "~3.1.2",
1326
+ "http-errors": "~2.0.1",
1327
+ "iconv-lite": "~0.7.0",
1328
+ "unpipe": "~1.0.0"
1329
+ },
1330
+ "engines": {
1331
+ "node": ">= 0.10"
1332
+ }
1333
+ },
1334
+ "node_modules/rc9": {
1335
+ "version": "2.1.2",
1336
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
1337
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
1338
+ "license": "MIT",
1339
+ "dependencies": {
1340
+ "defu": "^6.1.4",
1341
+ "destr": "^2.0.3"
1342
+ }
1343
+ },
1344
+ "node_modules/readable-stream": {
1345
+ "version": "3.6.2",
1346
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1347
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1348
+ "license": "MIT",
1349
+ "dependencies": {
1350
+ "inherits": "^2.0.3",
1351
+ "string_decoder": "^1.1.1",
1352
+ "util-deprecate": "^1.0.1"
1353
+ },
1354
+ "engines": {
1355
+ "node": ">= 6"
1356
+ }
1357
+ },
1358
+ "node_modules/readdirp": {
1359
+ "version": "4.1.2",
1360
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
1361
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
1362
+ "license": "MIT",
1363
+ "engines": {
1364
+ "node": ">= 14.18.0"
1365
+ },
1366
+ "funding": {
1367
+ "type": "individual",
1368
+ "url": "https://paulmillr.com/funding/"
1369
+ }
1370
+ },
1371
+ "node_modules/router": {
1372
+ "version": "2.2.0",
1373
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1374
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1375
+ "license": "MIT",
1376
+ "dependencies": {
1377
+ "debug": "^4.4.0",
1378
+ "depd": "^2.0.0",
1379
+ "is-promise": "^4.0.0",
1380
+ "parseurl": "^1.3.3",
1381
+ "path-to-regexp": "^8.0.0"
1382
+ },
1383
+ "engines": {
1384
+ "node": ">= 18"
1385
+ }
1386
+ },
1387
+ "node_modules/safe-buffer": {
1388
+ "version": "5.2.1",
1389
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1390
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1391
+ "funding": [
1392
+ {
1393
+ "type": "github",
1394
+ "url": "https://github.com/sponsors/feross"
1395
+ },
1396
+ {
1397
+ "type": "patreon",
1398
+ "url": "https://www.patreon.com/feross"
1399
+ },
1400
+ {
1401
+ "type": "consulting",
1402
+ "url": "https://feross.org/support"
1403
+ }
1404
+ ],
1405
+ "license": "MIT"
1406
+ },
1407
+ "node_modules/safer-buffer": {
1408
+ "version": "2.1.2",
1409
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1410
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1411
+ "license": "MIT"
1412
+ },
1413
+ "node_modules/semver": {
1414
+ "version": "7.7.4",
1415
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
1416
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
1417
+ "license": "ISC",
1418
+ "bin": {
1419
+ "semver": "bin/semver.js"
1420
+ },
1421
+ "engines": {
1422
+ "node": ">=10"
1423
+ }
1424
+ },
1425
+ "node_modules/send": {
1426
+ "version": "1.2.1",
1427
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
1428
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
1429
+ "license": "MIT",
1430
+ "dependencies": {
1431
+ "debug": "^4.4.3",
1432
+ "encodeurl": "^2.0.0",
1433
+ "escape-html": "^1.0.3",
1434
+ "etag": "^1.8.1",
1435
+ "fresh": "^2.0.0",
1436
+ "http-errors": "^2.0.1",
1437
+ "mime-types": "^3.0.2",
1438
+ "ms": "^2.1.3",
1439
+ "on-finished": "^2.4.1",
1440
+ "range-parser": "^1.2.1",
1441
+ "statuses": "^2.0.2"
1442
+ },
1443
+ "engines": {
1444
+ "node": ">= 18"
1445
+ },
1446
+ "funding": {
1447
+ "type": "opencollective",
1448
+ "url": "https://opencollective.com/express"
1449
+ }
1450
+ },
1451
+ "node_modules/serve-static": {
1452
+ "version": "2.2.1",
1453
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
1454
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
1455
+ "license": "MIT",
1456
+ "dependencies": {
1457
+ "encodeurl": "^2.0.0",
1458
+ "escape-html": "^1.0.3",
1459
+ "parseurl": "^1.3.3",
1460
+ "send": "^1.2.0"
1461
+ },
1462
+ "engines": {
1463
+ "node": ">= 18"
1464
+ },
1465
+ "funding": {
1466
+ "type": "opencollective",
1467
+ "url": "https://opencollective.com/express"
1468
+ }
1469
+ },
1470
+ "node_modules/setprototypeof": {
1471
+ "version": "1.2.0",
1472
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1473
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1474
+ "license": "ISC"
1475
+ },
1476
+ "node_modules/side-channel": {
1477
+ "version": "1.1.0",
1478
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1479
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1480
+ "license": "MIT",
1481
+ "dependencies": {
1482
+ "es-errors": "^1.3.0",
1483
+ "object-inspect": "^1.13.3",
1484
+ "side-channel-list": "^1.0.0",
1485
+ "side-channel-map": "^1.0.1",
1486
+ "side-channel-weakmap": "^1.0.2"
1487
+ },
1488
+ "engines": {
1489
+ "node": ">= 0.4"
1490
+ },
1491
+ "funding": {
1492
+ "url": "https://github.com/sponsors/ljharb"
1493
+ }
1494
+ },
1495
+ "node_modules/side-channel-list": {
1496
+ "version": "1.0.0",
1497
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1498
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1499
+ "license": "MIT",
1500
+ "dependencies": {
1501
+ "es-errors": "^1.3.0",
1502
+ "object-inspect": "^1.13.3"
1503
+ },
1504
+ "engines": {
1505
+ "node": ">= 0.4"
1506
+ },
1507
+ "funding": {
1508
+ "url": "https://github.com/sponsors/ljharb"
1509
+ }
1510
+ },
1511
+ "node_modules/side-channel-map": {
1512
+ "version": "1.0.1",
1513
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1514
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1515
+ "license": "MIT",
1516
+ "dependencies": {
1517
+ "call-bound": "^1.0.2",
1518
+ "es-errors": "^1.3.0",
1519
+ "get-intrinsic": "^1.2.5",
1520
+ "object-inspect": "^1.13.3"
1521
+ },
1522
+ "engines": {
1523
+ "node": ">= 0.4"
1524
+ },
1525
+ "funding": {
1526
+ "url": "https://github.com/sponsors/ljharb"
1527
+ }
1528
+ },
1529
+ "node_modules/side-channel-weakmap": {
1530
+ "version": "1.0.2",
1531
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1532
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1533
+ "license": "MIT",
1534
+ "dependencies": {
1535
+ "call-bound": "^1.0.2",
1536
+ "es-errors": "^1.3.0",
1537
+ "get-intrinsic": "^1.2.5",
1538
+ "object-inspect": "^1.13.3",
1539
+ "side-channel-map": "^1.0.1"
1540
+ },
1541
+ "engines": {
1542
+ "node": ">= 0.4"
1543
+ },
1544
+ "funding": {
1545
+ "url": "https://github.com/sponsors/ljharb"
1546
+ }
1547
+ },
1548
+ "node_modules/statuses": {
1549
+ "version": "2.0.2",
1550
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1551
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1552
+ "license": "MIT",
1553
+ "engines": {
1554
+ "node": ">= 0.8"
1555
+ }
1556
+ },
1557
+ "node_modules/streamsearch": {
1558
+ "version": "1.1.0",
1559
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1560
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1561
+ "engines": {
1562
+ "node": ">=10.0.0"
1563
+ }
1564
+ },
1565
+ "node_modules/string_decoder": {
1566
+ "version": "1.3.0",
1567
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1568
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1569
+ "license": "MIT",
1570
+ "dependencies": {
1571
+ "safe-buffer": "~5.2.0"
1572
+ }
1573
+ },
1574
+ "node_modules/tinyexec": {
1575
+ "version": "1.0.2",
1576
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
1577
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
1578
+ "license": "MIT",
1579
+ "engines": {
1580
+ "node": ">=18"
1581
+ }
1582
+ },
1583
+ "node_modules/toidentifier": {
1584
+ "version": "1.0.1",
1585
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1586
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1587
+ "license": "MIT",
1588
+ "engines": {
1589
+ "node": ">=0.6"
1590
+ }
1591
+ },
1592
+ "node_modules/type-is": {
1593
+ "version": "2.0.1",
1594
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1595
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1596
+ "license": "MIT",
1597
+ "dependencies": {
1598
+ "content-type": "^1.0.5",
1599
+ "media-typer": "^1.1.0",
1600
+ "mime-types": "^3.0.0"
1601
+ },
1602
+ "engines": {
1603
+ "node": ">= 0.6"
1604
+ }
1605
+ },
1606
+ "node_modules/typedarray": {
1607
+ "version": "0.0.6",
1608
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1609
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1610
+ "license": "MIT"
1611
+ },
1612
+ "node_modules/unpipe": {
1613
+ "version": "1.0.0",
1614
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1615
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1616
+ "license": "MIT",
1617
+ "engines": {
1618
+ "node": ">= 0.8"
1619
+ }
1620
+ },
1621
+ "node_modules/util-deprecate": {
1622
+ "version": "1.0.2",
1623
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1624
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1625
+ "license": "MIT"
1626
+ },
1627
+ "node_modules/vary": {
1628
+ "version": "1.1.2",
1629
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1630
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1631
+ "license": "MIT",
1632
+ "engines": {
1633
+ "node": ">= 0.8"
1634
+ }
1635
+ },
1636
+ "node_modules/wrappy": {
1637
+ "version": "1.0.2",
1638
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1639
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1640
+ "license": "ISC"
1641
+ }
1642
+ }
1643
+ }
package.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "scraping-bootcamp-backend",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "keywords": [],
9
+ "author": "",
10
+ "license": "ISC",
11
+ "description": "",
12
+ "dependencies": {
13
+ "@prisma/client": "^6.19.2",
14
+ "bcrypt": "^6.0.0",
15
+ "cloudinary": "^1.41.3",
16
+ "cors": "^2.8.6",
17
+ "dotenv": "^17.3.1",
18
+ "express": "^5.2.1",
19
+ "jsonwebtoken": "^9.0.3",
20
+ "multer": "^2.1.1",
21
+ "multer-storage-cloudinary": "^4.0.0",
22
+ "nodemailer": "^8.0.2",
23
+ "prisma": "^6.19.2"
24
+ }
25
+ }
prisma/schema.prisma ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL") // This will be your Aiven Postgres URL
8
+ }
9
+
10
+ enum Role {
11
+ USER
12
+ ADMIN
13
+ }
14
+
15
+ enum VerificationStatus {
16
+ PENDING
17
+ APPROVED
18
+ REJECTED
19
+ }
20
+
21
+ model User {
22
+ id String @id @default(uuid())
23
+ name String
24
+ email String @unique
25
+ whatsappNumber String
26
+ password String // Hashed password for dashboard login
27
+
28
+ // Demographics
29
+ isStudent Boolean
30
+ college String? // Nullable if not a student
31
+ course String?
32
+ semester String?
33
+ profession String? // Nullable if student
34
+
35
+ // Verification & Status
36
+ role Role @default(USER)
37
+ accountStatus VerificationStatus @default(PENDING)
38
+
39
+ // Relations
40
+ payment Payment?
41
+ discountClaim DiscountClaim?
42
+
43
+ createdAt DateTime @default(now())
44
+ }
45
+
46
+ model Payment {
47
+ id String @id @default(uuid())
48
+ userId String @unique
49
+ user User @relation(fields: [userId], references: [id])
50
+
51
+ amount Int // 399 or 199
52
+ upiReference String @unique
53
+ screenshotUrl String // Cloudinary URL
54
+
55
+ createdAt DateTime @default(now())
56
+ }
57
+
58
+ model DiscountClaim {
59
+ id String @id @default(uuid())
60
+ userId String @unique
61
+ user User @relation(fields: [userId], references: [id])
62
+
63
+ platform String // 'Instagram' or 'LinkedIn'
64
+ postedAt DateTime // Date and time they claim to have posted
65
+ screenshotUrl String // Cloudinary URL
66
+ }
67
+
68
+ model WorkshopClass {
69
+ id Int @id @default(autoincrement())
70
+ dayNumber Int @unique // 1 through 6
71
+ title String
72
+ meetingLink String? // Admin can update this later
73
+ date DateTime? // Scheduled date of the class
74
+ }
src/config/cloudinary.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const cloudinary = require('cloudinary').v2;
2
+ const { CloudinaryStorage } = require('multer-storage-cloudinary');
3
+ const multer = require('multer');
4
+ require('dotenv').config();
5
+
6
+ cloudinary.config({
7
+ cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
8
+ api_key: process.env.CLOUDINARY_API_KEY,
9
+ api_secret: process.env.CLOUDINARY_API_SECRET
10
+ });
11
+
12
+ const storage = new CloudinaryStorage({
13
+ cloudinary: cloudinary,
14
+ params: {
15
+ folder: 'bootcamp_registrations',
16
+ allowedFormats: ['jpeg', 'png', 'jpg'],
17
+ },
18
+ });
19
+
20
+ const upload = multer({ storage: storage });
21
+ module.exports = upload;
src/config/email.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const nodemailer = require('nodemailer');
2
+ require('dotenv').config();
3
+
4
+ const transporter = nodemailer.createTransport({
5
+ service: 'gmail',
6
+ auth: {
7
+ user: process.env.EMAIL_USER,
8
+ pass: process.env.EMAIL_PASS
9
+ }
10
+ });
11
+
12
+ const sendRegistrationEmail = async (userEmail, userName) => {
13
+ const mailOptions = {
14
+ from: `"Bootcamp Admin" <${process.env.EMAIL_USER}>`,
15
+ to: userEmail,
16
+ subject: 'Registration Received - Web Scraping Bootcamp',
17
+ text: `Hi ${userName},\n\nWe have received your registration and payment details for the Industry-Level Web Scraping Bootcamp! \n\nOur team is currently verifying your payment (and your 24-hour social media story, if you claimed the discount). We will send you another email once your dashboard is activated.\n\nGet ready to code!\n- The Bootcamp Team`
18
+ };
19
+ await transporter.sendMail(mailOptions);
20
+ };
21
+
22
+ module.exports = { sendRegistrationEmail };
src/middleware/auth.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const jwt = require('jsonwebtoken');
2
+
3
+ const verifyToken = (req, res, next) => {
4
+ const token = req.headers.authorization?.split(' ')[1];
5
+
6
+ if (!token) {
7
+ return res.status(403).json({ error: 'A token is required for authentication' });
8
+ }
9
+
10
+ try {
11
+ const decoded = jwt.verify(token, process.env.JWT_SECRET);
12
+ req.user = decoded; // Contains { userId, role }
13
+ } catch (err) {
14
+ return res.status(401).json({ error: 'Invalid Token' });
15
+ }
16
+ return next();
17
+ };
18
+
19
+ const isAdmin = (req, res, next) => {
20
+ if (req.user.role !== 'ADMIN') {
21
+ return res.status(403).json({ error: 'Admin access required' });
22
+ }
23
+ return next();
24
+ };
25
+
26
+ module.exports = { verifyToken, isAdmin };
src/routes/apiRoutes.js ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const express = require('express');
2
+ const router = express.Router();
3
+ const { PrismaClient } = require('@prisma/client');
4
+ const { verifyToken, isAdmin } = require('../middleware/auth');
5
+ // const { sendApprovalEmail } = require('../config/email'); // We can add this later!
6
+
7
+ const prisma = new PrismaClient();
8
+
9
+ // ==========================================
10
+ // USER ROUTES
11
+ // ==========================================
12
+
13
+ // Get total approved seats for the landing page
14
+ router.get('/stats', async (req, res) => {
15
+ try {
16
+ const approvedCount = await prisma.user.count({
17
+ where: { accountStatus: 'APPROVED' }
18
+ });
19
+ res.json({ approvedCount, totalSeats: 100 });
20
+ } catch (error) {
21
+ res.status(500).json({ error: 'Error fetching stats' });
22
+ }
23
+ });
24
+
25
+ // Get user dashboard data
26
+ router.get('/dashboard', verifyToken, async (req, res) => {
27
+ try {
28
+ const user = await prisma.user.findUnique({
29
+ where: { id: req.user.userId },
30
+ select: { name: true, accountStatus: true, role: true }
31
+ });
32
+
33
+ let classes = [];
34
+ // Only show class links if they are approved
35
+ if (user.accountStatus === 'APPROVED') {
36
+ classes = await prisma.workshopClass.findMany({
37
+ orderBy: { dayNumber: 'asc' }
38
+ });
39
+ }
40
+
41
+ res.json({ user, classes });
42
+ } catch (error) {
43
+ res.status(500).json({ error: 'Error fetching dashboard' });
44
+ }
45
+ });
46
+
47
+ // ==========================================
48
+ // ADMIN ROUTES
49
+ // ==========================================
50
+
51
+ // Get all registrations for admin review
52
+ router.get('/admin/users', verifyToken, isAdmin, async (req, res) => {
53
+ try {
54
+ const users = await prisma.user.findMany({
55
+ include: { payment: true, discountClaim: true },
56
+ orderBy: { createdAt: 'desc' }
57
+ });
58
+ res.json(users);
59
+ } catch (error) {
60
+ res.status(500).json({ error: 'Error fetching users' });
61
+ }
62
+ });
63
+
64
+ // Bulk approve/reject users
65
+ router.put('/admin/verify-bulk', verifyToken, isAdmin, async (req, res) => {
66
+ try {
67
+ const { userIds, status } = req.body;
68
+
69
+ await prisma.user.updateMany({
70
+ where: { id: { in: userIds } },
71
+ data: { accountStatus: status }
72
+ });
73
+
74
+ res.json({ message: `${userIds.length} users updated to ${status}` });
75
+ } catch (error) {
76
+ res.status(500).json({ error: 'Bulk update failed' });
77
+ }
78
+ });
79
+
80
+ // Approve or Reject a user
81
+ router.put('/admin/verify/:userId', verifyToken, isAdmin, async (req, res) => {
82
+ try {
83
+ const { status } = req.body; // 'APPROVED' or 'REJECTED'
84
+
85
+ const updatedUser = await prisma.user.update({
86
+ where: { id: req.params.userId },
87
+ data: { accountStatus: status }
88
+ });
89
+
90
+ // Optional: Trigger an email here letting them know they are approved!
91
+
92
+ res.json({ message: `User status updated to ${status}`, user: updatedUser });
93
+ } catch (error) {
94
+ res.status(500).json({ error: 'Error updating user status' });
95
+ }
96
+ });
97
+
98
+ // Update daily class links (Zoom/GMeet)
99
+ router.put('/admin/class/:dayNumber', verifyToken, isAdmin, async (req, res) => {
100
+ try {
101
+ const { title, meetingLink, date } = req.body;
102
+
103
+ const workshopClass = await prisma.workshopClass.upsert({
104
+ where: { dayNumber: parseInt(req.params.dayNumber) },
105
+ update: { title, meetingLink, date: new Date(date) },
106
+ create: { dayNumber: parseInt(req.params.dayNumber), title, meetingLink, date: new Date(date) }
107
+ });
108
+
109
+ res.json({ message: 'Class updated successfully', workshopClass });
110
+ } catch (error) {
111
+ res.status(500).json({ error: 'Error updating class' });
112
+ }
113
+ });
114
+
115
+ module.exports = router;
src/routes/authRoutes.js ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const jwt = require('jsonwebtoken');
2
+ const express = require('express');
3
+ const router = express.Router();
4
+ const bcrypt = require('bcrypt');
5
+ const { PrismaClient } = require('@prisma/client');
6
+ const upload = require('../config/cloudinary');
7
+ const { sendRegistrationEmail } = require('../config/email');
8
+
9
+ const prisma = new PrismaClient();
10
+
11
+ // Handle multiple image uploads
12
+ const registrationUploads = upload.fields([
13
+ { name: 'paymentScreenshot', maxCount: 1 },
14
+ { name: 'socialScreenshot', maxCount: 1 } // Optional
15
+ ]);
16
+
17
+ router.post('/register', registrationUploads, async (req, res) => {
18
+ try {
19
+ const {
20
+ name, email, whatsappNumber, password, isStudent,
21
+ college, course, semester, profession,
22
+ amount, upiReference, platform, postedAt
23
+ } = req.body;
24
+
25
+ // 1. Check if user already exists
26
+ const existingUser = await prisma.user.findUnique({ where: { email } });
27
+ if (existingUser) return res.status(400).json({ error: 'Email already registered' });
28
+
29
+ // 2. Hash their dashboard password
30
+ const hashedPassword = await bcrypt.hash(password, 10);
31
+
32
+ // 3. Get uploaded Cloudinary URLs
33
+ const paymentScreenshotUrl = req.files['paymentScreenshot'] ? req.files['paymentScreenshot'][0].path : null;
34
+ const socialScreenshotUrl = req.files['socialScreenshot'] ? req.files['socialScreenshot'][0].path : null;
35
+
36
+ if (!paymentScreenshotUrl) {
37
+ return res.status(400).json({ error: 'Payment screenshot is required' });
38
+ }
39
+
40
+ // 4. Save everything to the database in one go using Prisma
41
+ const newUser = await prisma.user.create({
42
+ data: {
43
+ name,
44
+ email,
45
+ whatsappNumber,
46
+ password: hashedPassword,
47
+ isStudent: isStudent === 'true', // Convert string to boolean
48
+ college,
49
+ course,
50
+ semester,
51
+ profession,
52
+ payment: {
53
+ create: {
54
+ amount: parseInt(amount),
55
+ upiReference,
56
+ screenshotUrl: paymentScreenshotUrl
57
+ }
58
+ },
59
+ // Only create discount record if they uploaded a social screenshot
60
+ ...(socialScreenshotUrl && {
61
+ discountClaim: {
62
+ create: {
63
+ platform,
64
+ postedAt: new Date(postedAt),
65
+ screenshotUrl: socialScreenshotUrl
66
+ }
67
+ }
68
+ })
69
+ }
70
+ });
71
+
72
+ // 5. Send confirmation email
73
+ await sendRegistrationEmail(email, name);
74
+
75
+ res.status(201).json({
76
+ message: 'Registration successful! Verification pending.',
77
+ userId: newUser.id
78
+ });
79
+
80
+ } catch (error) {
81
+ console.error('Registration Error:', error);
82
+ res.status(500).json({ error: 'Internal Server Error' });
83
+ }
84
+ });
85
+
86
+ router.post('/login', async (req, res) => {
87
+ try {
88
+ const { email, password } = req.body;
89
+
90
+ // 1. Find user
91
+ const user = await prisma.user.findUnique({ where: { email } });
92
+ if (!user) {
93
+ return res.status(400).json({ error: 'Invalid credentials' });
94
+ }
95
+
96
+ // 2. Check password
97
+ const isPasswordValid = await bcrypt.compare(password, user.password);
98
+ if (!isPasswordValid) {
99
+ return res.status(400).json({ error: 'Invalid credentials' });
100
+ }
101
+
102
+ // 3. Generate JWT Token
103
+ const token = jwt.sign(
104
+ { userId: user.id, role: user.role },
105
+ process.env.JWT_SECRET,
106
+ { expiresIn: '7d' } // Token lasts for 7 days
107
+ );
108
+
109
+ res.status(200).json({
110
+ message: 'Login successful',
111
+ token,
112
+ user: {
113
+ id: user.id,
114
+ name: user.name,
115
+ role: user.role,
116
+ status: user.accountStatus
117
+ }
118
+ });
119
+
120
+ } catch (error) {
121
+ console.error('Login Error:', error);
122
+ res.status(500).json({ error: 'Internal Server Error' });
123
+ }
124
+ });
125
+
126
+ module.exports = router;
src/server.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { PrismaClient } = require('@prisma/client');
2
+ const express = require('express');
3
+ const cors = require('cors');
4
+ require('dotenv').config();
5
+
6
+ const prisma = new PrismaClient();
7
+
8
+ const authRoutes = require('./routes/authRoutes');
9
+ const apiRoutes = require('./routes/apiRoutes');
10
+
11
+ const app = express();
12
+ const PORT = process.env.PORT || 7860;
13
+
14
+ // Middleware
15
+ app.use(cors());
16
+ app.use(express.json());
17
+ app.use(express.urlencoded({ extended: true }));
18
+
19
+ // Routes
20
+ app.use('/api/auth', authRoutes);
21
+ app.use('/api', apiRoutes);
22
+
23
+ app.get('/', async (req, res) => {
24
+ try {
25
+ await prisma.$queryRaw`SELECT 1`;
26
+ res.status(200).send('API and Database are awake!');
27
+ } catch (err) {
28
+ console.error("DB Ping failed", err);
29
+ res.status(500).send('API is awake, but DB failed.');
30
+ }
31
+ });
32
+
33
+ app.listen(PORT, () => {
34
+ console.log(`🚀 Server running on port ${PORT}`);
35
+ });