Skip to content

Commit 03b6e6b

Browse files
authored
chore: Remove Unused Dependencies 🧹 (danny-avila#939)
* chore: cleanup client depend 🧹 * chore: replace joi with zod and remove unused user validator * chore: move dep from root to api, cleanup other unused api deps * chore: remove unused dev dep * chore: update bun lockfile * fix: bun scripts * chore: add bun flag to update script * chore: remove legacy webpack + babel dev deps * chore: add back dev deps needed for frontend unit testing * fix(validators): make schemas as expected and more robust with a full test suite of edge cases * chore: remove axios from root package, remove path from api, update bun
1 parent 90bf5a2 commit 03b6e6b

File tree

12 files changed

+8273
-11276
lines changed

12 files changed

+8273
-11276
lines changed

api/models/User.js

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
const mongoose = require('mongoose');
22
const bcrypt = require('bcryptjs');
33
const jwt = require('jsonwebtoken');
4-
const Joi = require('joi');
5-
const DebugControl = require('../utils/debug.js');
64
const userSchema = require('./schema/userSchema.js');
75
const { SESSION_EXPIRY } = process.env ?? {};
86
const expires = eval(SESSION_EXPIRY) ?? 1000 * 60 * 15;
97

10-
function log({ title, parameters }) {
11-
DebugControl.log.functionName(title);
12-
DebugControl.log.parameters(parameters);
13-
}
14-
158
userSchema.methods.toJSON = function () {
169
return {
1710
id: this._id,
@@ -65,26 +58,6 @@ module.exports.hashPassword = async (password) => {
6558
return hashedPassword;
6659
};
6760

68-
module.exports.validateUser = (user) => {
69-
log({
70-
title: 'Validate User',
71-
parameters: [{ name: 'Validate User', value: user }],
72-
});
73-
const schema = {
74-
avatar: Joi.any(),
75-
name: Joi.string().min(3).max(80).required(),
76-
username: Joi.string()
77-
.trim()
78-
.allow('')
79-
.min(2)
80-
.max(80)
81-
.regex(/^[a-zA-Z0-9_.-@#$%&*() ]+$/),
82-
password: Joi.string().min(8).max(128).allow('').allow(null),
83-
};
84-
85-
return schema.validate(user);
86-
};
87-
8861
const User = mongoose.model('User', userSchema);
8962

9063
module.exports = User;

api/package.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,22 @@
2424
"@anthropic-ai/sdk": "^0.5.4",
2525
"@azure/search-documents": "^11.3.2",
2626
"@dqbd/tiktoken": "^1.0.7",
27-
"@fortaine/fetch-event-source": "^3.0.6",
2827
"@keyv/mongo": "^2.1.8",
2928
"@waylaidwanderer/chatgpt-api": "^1.37.2",
3029
"axios": "^1.3.4",
3130
"bcryptjs": "^2.4.3",
3231
"cheerio": "^1.0.0-rc.12",
3332
"cohere-ai": "^5.0.2",
3433
"cookie": "^0.5.0",
35-
"cookie-parser": "^1.4.6",
3634
"cors": "^2.8.5",
3735
"dotenv": "^16.0.3",
38-
"eslint": "^8.41.0",
3936
"express": "^4.18.2",
4037
"express-mongo-sanitize": "^2.2.0",
4138
"express-rate-limit": "^6.9.0",
4239
"express-session": "^1.17.3",
4340
"googleapis": "^118.0.0",
4441
"handlebars": "^4.7.7",
4542
"html": "^1.0.0",
46-
"joi": "^17.9.2",
4743
"js-yaml": "^4.1.0",
4844
"jsonwebtoken": "^9.0.0",
4945
"keyv": "^4.5.3",
@@ -63,15 +59,13 @@
6359
"passport-jwt": "^4.0.1",
6460
"passport-local": "^1.0.0",
6561
"pino": "^8.12.1",
66-
"sanitize": "^2.1.2",
6762
"sharp": "^0.32.5",
6863
"ua-parser-js": "^1.0.36",
6964
"zod": "^3.22.2"
7065
},
7166
"devDependencies": {
7267
"jest": "^29.5.0",
7368
"nodemon": "^3.0.1",
74-
"path": "^0.12.7",
7569
"supertest": "^6.3.3"
7670
}
7771
}

api/server/services/AuthService.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const bcrypt = require('bcryptjs');
33
const User = require('../../models/User');
44
const Session = require('../../models/Session');
55
const Token = require('../../models/schema/tokenSchema');
6-
const { registerSchema } = require('../../strategies/validators');
6+
const { registerSchema, errorsToString } = require('../../strategies/validators');
77
const config = require('../../../config/loader');
88
const { sendEmail } = require('../utils');
99
const domains = config.domains;
@@ -44,15 +44,16 @@ const logoutUser = async (userId, refreshToken) => {
4444
* @returns
4545
*/
4646
const registerUser = async (user) => {
47-
const { error } = registerSchema.validate(user);
47+
const { error } = registerSchema.safeParse(user);
4848
if (error) {
49+
const errorMessage = errorsToString(error.errors);
4950
console.info(
50-
'Route: register - Joi Validation Error',
51+
'Route: register - Validation Error',
5152
{ name: 'Request params:', value: user },
52-
{ name: 'Validation error:', value: error.details },
53+
{ name: 'Validation error:', value: errorMessage },
5354
);
5455

55-
return { status: 422, message: error.details[0].message };
56+
return { status: 422, message: errorMessage };
5657
}
5758

5859
const { email, password, name, username } = user;

api/strategies/localStrategy.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
const { Strategy: PassportLocalStrategy } = require('passport-local');
22
const User = require('../models/User');
3-
const { loginSchema } = require('./validators');
3+
const { loginSchema, errorsToString } = require('./validators');
44
const DebugControl = require('../utils/debug.js');
55

66
async function validateLoginRequest(req) {
7-
const { error } = loginSchema.validate(req.body);
8-
return error ? error.details[0].message : null;
7+
const { error } = loginSchema.safeParse(req.body);
8+
return error ? errorsToString(error.errors) : null;
99
}
1010

1111
async function findUserByEmail(email) {

api/strategies/validators.js

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,69 @@
1-
const Joi = require('joi');
1+
const { z } = require('zod');
22

3-
const loginSchema = Joi.object().keys({
4-
email: Joi.string().trim().email().required(),
5-
password: Joi.string().trim().min(8).max(128).required(),
6-
});
3+
function errorsToString(errors) {
4+
return errors
5+
.map((error) => {
6+
let field = error.path.join('.');
7+
let message = error.message;
8+
9+
return `${field}: ${message}`;
10+
})
11+
.join(' ');
12+
}
713

8-
const registerSchema = Joi.object().keys({
9-
name: Joi.string().trim().min(3).max(80).required(),
10-
username: Joi.string()
11-
.trim()
12-
.allow('')
13-
.min(2)
14-
.max(80)
15-
.regex(/^[a-zA-Z0-9_.-@#$%&*() ]+$/),
16-
email: Joi.string().trim().email().required(),
17-
password: Joi.string().trim().min(8).max(128).required(),
18-
confirm_password: Joi.string().trim().min(8).max(128).required(),
14+
const loginSchema = z.object({
15+
email: z.string().email(),
16+
password: z
17+
.string()
18+
.min(8)
19+
.max(128)
20+
.refine((value) => value.trim().length > 0, {
21+
message: 'Password cannot be only spaces',
22+
}),
1923
});
2024

25+
const registerSchema = z
26+
.object({
27+
name: z.string().min(3).max(80),
28+
username: z
29+
.union([
30+
z.literal(''),
31+
z
32+
.string()
33+
.min(2)
34+
.max(80)
35+
.regex(/^[a-zA-Z0-9_.-@#$%&*() ]+$/),
36+
])
37+
.transform((value) => (value === '' ? null : value))
38+
.optional()
39+
.nullable(),
40+
email: z.string().email(),
41+
password: z
42+
.string()
43+
.min(8)
44+
.max(128)
45+
.refine((value) => value.trim().length > 0, {
46+
message: 'Password cannot be only spaces',
47+
}),
48+
confirm_password: z
49+
.string()
50+
.min(8)
51+
.max(128)
52+
.refine((value) => value.trim().length > 0, {
53+
message: 'Password cannot be only spaces',
54+
}),
55+
})
56+
.superRefine(({ confirm_password, password }, ctx) => {
57+
if (confirm_password !== password) {
58+
ctx.addIssue({
59+
code: 'custom',
60+
message: 'The passwords did not match',
61+
});
62+
}
63+
});
64+
2165
module.exports = {
2266
loginSchema,
2367
registerSchema,
68+
errorsToString,
2469
};

0 commit comments

Comments
 (0)