Skip to content

Commit 7054623

Browse files
committed
chore(dependencies): update TypeScript ESLint and Vitest to latest versions
- Bump @typescript-eslint packages to 8.23.0 - Update Vitest and related packages to 2.1.9 - Minor version upgrades for ts-api-utils and other related dependencies
1 parent ec4e43d commit 7054623

File tree

10 files changed

+274
-176
lines changed

10 files changed

+274
-176
lines changed

apps/client/src/providers/locale.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type Props = {
1515
};
1616

1717
export const LocaleProvider = ({ children }: Props) => {
18-
const userLocale = useAuthStore((state) => state.user?.locale);
18+
const userLocale = useAuthStore((state) => state.user?.locale ?? defaultLocale);
1919

2020
useEffect(() => {
2121
const detectedLocale =

apps/client/src/router/index.tsx

+46-44
Original file line numberDiff line numberDiff line change
@@ -23,66 +23,68 @@ import { GuestGuard } from "./guards/guest";
2323
import { authLoader } from "./loaders/auth";
2424

2525
export const routes = createRoutesFromElements(
26-
<Route element={<Providers />} errorElement={<ErrorPage />}>
27-
<Route element={<HomeLayout />}>
28-
<Route path="/" element={<HomePage />} />
29-
</Route>
26+
<Route element={<Providers />}>
27+
<Route errorElement={<ErrorPage />}>
28+
<Route element={<HomeLayout />}>
29+
<Route path="/" element={<HomePage />} />
30+
</Route>
3031

31-
<Route path="auth">
32-
<Route element={<AuthLayout />}>
33-
<Route element={<GuestGuard />}>
34-
<Route path="login" element={<LoginPage />} />
35-
<Route path="register" element={<RegisterPage />} />
36-
</Route>
32+
<Route path="auth">
33+
<Route element={<AuthLayout />}>
34+
<Route element={<GuestGuard />}>
35+
<Route path="login" element={<LoginPage />} />
36+
<Route path="register" element={<RegisterPage />} />
37+
</Route>
3738

38-
{/* Password Recovery */}
39-
<Route element={<GuestGuard />}>
40-
<Route path="forgot-password" element={<ForgotPasswordPage />} />
41-
<Route path="reset-password" element={<ResetPasswordPage />} />
42-
</Route>
39+
{/* Password Recovery */}
40+
<Route element={<GuestGuard />}>
41+
<Route path="forgot-password" element={<ForgotPasswordPage />} />
42+
<Route path="reset-password" element={<ResetPasswordPage />} />
43+
</Route>
4344

44-
{/* Two-Factor Authentication */}
45-
<Route element={<GuestGuard />}>
46-
<Route path="verify-otp" element={<VerifyOtpPage />} />
47-
<Route path="backup-otp" element={<BackupOtpPage />} />
48-
</Route>
45+
{/* Two-Factor Authentication */}
46+
<Route element={<GuestGuard />}>
47+
<Route path="verify-otp" element={<VerifyOtpPage />} />
48+
<Route path="backup-otp" element={<BackupOtpPage />} />
49+
</Route>
4950

50-
{/* Email Verification */}
51-
<Route element={<AuthGuard />}>
52-
<Route path="verify-email" element={<VerifyEmailPage />} />
51+
{/* Email Verification */}
52+
<Route element={<AuthGuard />}>
53+
<Route path="verify-email" element={<VerifyEmailPage />} />
54+
</Route>
55+
56+
{/* OAuth Callback */}
57+
<Route path="callback" loader={authLoader} element={<div />} />
5358
</Route>
5459

55-
{/* OAuth Callback */}
56-
<Route path="callback" loader={authLoader} />
60+
<Route index element={<Navigate replace to="/auth/login" />} />
5761
</Route>
5862

59-
<Route index element={<Navigate replace to="/auth/login" />} />
60-
</Route>
61-
62-
<Route path="dashboard">
63-
<Route element={<AuthGuard />}>
64-
<Route element={<DashboardLayout />}>
65-
<Route path="resumes" element={<ResumesPage />} />
66-
<Route path="settings" element={<SettingsPage />} />
63+
<Route path="dashboard">
64+
<Route element={<AuthGuard />}>
65+
<Route element={<DashboardLayout />}>
66+
<Route path="resumes" element={<ResumesPage />} />
67+
<Route path="settings" element={<SettingsPage />} />
6768

68-
<Route index element={<Navigate replace to="/dashboard/resumes" />} />
69+
<Route index element={<Navigate replace to="/dashboard/resumes" />} />
70+
</Route>
6971
</Route>
7072
</Route>
71-
</Route>
7273

73-
<Route path="builder">
74-
<Route element={<AuthGuard />}>
75-
<Route element={<BuilderLayout />}>
76-
<Route path=":id" loader={builderLoader} element={<BuilderPage />} />
74+
<Route path="builder">
75+
<Route element={<AuthGuard />}>
76+
<Route element={<BuilderLayout />}>
77+
<Route path=":id" loader={builderLoader} element={<BuilderPage />} />
7778

78-
<Route index element={<Navigate replace to="/dashboard/resumes" />} />
79+
<Route index element={<Navigate replace to="/dashboard/resumes" />} />
80+
</Route>
7981
</Route>
8082
</Route>
81-
</Route>
8283

83-
{/* Public Routes */}
84-
<Route path=":username">
85-
<Route path=":slug" loader={publicLoader} element={<PublicResumePage />} />
84+
{/* Public Routes */}
85+
<Route path=":username">
86+
<Route path=":slug" loader={publicLoader} element={<PublicResumePage />} />
87+
</Route>
8688
</Route>
8789
</Route>,
8890
);

apps/server/src/auth/strategy/github.strategy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class GitHubStrategy extends PassportStrategy(Strategy, "github") {
2626
) {
2727
const { displayName, emails, photos, username } = profile;
2828

29-
const email = emails?.[0].value ?? `${username}@github.com`;
29+
const email = (emails?.[0].value ?? `${username}@github.com`).toLocaleLowerCase();
3030
const picture = photos?.[0].value;
3131

3232
let user: User | null = null;

apps/server/src/auth/strategy/google.strategy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, "google") {
2626
) {
2727
const { displayName, emails, photos, username } = profile;
2828

29-
const email = emails?.[0].value ?? `${username}@google.com`;
29+
const email = (emails?.[0].value ?? `${username}@google.com`).toLocaleLowerCase();
3030
const picture = photos?.[0].value;
3131

3232
let user: User | null = null;

apps/server/src/auth/strategy/openid.strategy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class OpenIDStrategy extends PassportStrategy(Strategy, "openid") {
3939
const { displayName, emails, photos, username } = profile;
4040

4141
const uniqueId = generateRandomName({ length: 2, style: "lowerCase", separator: "-" });
42-
const email = emails?.[0].value ?? `${username ?? uniqueId}@openid.com`;
42+
const email = (emails?.[0].value ?? `${username ?? uniqueId}@openid.com`).toLocaleLowerCase();
4343
const picture = photos?.[0].value;
4444

4545
let user: User | null = null;

apps/server/src/storage/storage.service.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,24 @@ export class StorageService implements OnModuleInit {
9999
}
100100
}
101101

102-
async bucketExists() {
102+
async bucketExists(): Promise<true> {
103103
const exists = await this.client.bucketExists(this.bucketName);
104104

105105
if (!exists) {
106106
throw new InternalServerErrorException(
107107
"There was an error while checking if the storage bucket exists.",
108108
);
109109
}
110+
111+
return exists;
110112
}
111113

112114
async uploadObject(
113115
userId: string,
114116
type: UploadType,
115117
buffer: Buffer,
116118
filename: string = createId(),
117-
) {
119+
): Promise<string> {
118120
const extension = type === "resumes" ? "pdf" : "jpg";
119121
const storageUrl = this.configService.getOrThrow<string>("STORAGE_URL");
120122

@@ -149,23 +151,21 @@ export class StorageService implements OnModuleInit {
149151
}
150152
}
151153

152-
async deleteObject(userId: string, type: UploadType, filename: string) {
154+
async deleteObject(userId: string, type: UploadType, filename: string): Promise<void> {
153155
const extension = type === "resumes" ? "pdf" : "jpg";
154156
const path = `${userId}/${type}/${filename}.${extension}`;
155157

156158
try {
157159
await this.client.removeObject(this.bucketName, path);
158-
return;
159160
} catch {
160161
throw new InternalServerErrorException(
161162
`There was an error while deleting the document at the specified path: ${path}.`,
162163
);
163164
}
164165
}
165166

166-
async deleteFolder(prefix: string) {
167+
async deleteFolder(prefix: string): Promise<void> {
167168
const objectsList = [];
168-
169169
const objectsStream = this.client.listObjectsV2(this.bucketName, prefix, true);
170170

171171
for await (const object of objectsStream) {
@@ -174,7 +174,6 @@ export class StorageService implements OnModuleInit {
174174

175175
try {
176176
await this.client.removeObjects(this.bucketName, objectsList);
177-
return;
178177
} catch {
179178
throw new InternalServerErrorException(
180179
`There was an error while deleting the folder at the specified path: ${this.bucketName}/${prefix}.`,

apps/server/src/user/user.service.ts

+16-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable, InternalServerErrorException } from "@nestjs/common";
2-
import { Prisma } from "@prisma/client";
2+
import { Prisma, User } from "@prisma/client";
3+
import { UserWithSecrets } from "@reactive-resume/dto";
34
import { ErrorMessage } from "@reactive-resume/utils";
45
import { PrismaService } from "nestjs-prisma";
56

@@ -12,7 +13,7 @@ export class UserService {
1213
private readonly storageService: StorageService,
1314
) {}
1415

15-
async findOneById(id: string) {
16+
async findOneById(id: string): Promise<UserWithSecrets> {
1617
const user = await this.prisma.user.findUniqueOrThrow({
1718
where: { id },
1819
include: { secrets: true },
@@ -25,7 +26,7 @@ export class UserService {
2526
return user;
2627
}
2728

28-
async findOneByIdentifier(identifier: string) {
29+
async findOneByIdentifier(identifier: string): Promise<UserWithSecrets | null> {
2930
const user = await (async (identifier: string) => {
3031
// First, find the user by email
3132
const user = await this.prisma.user.findUnique({
@@ -47,7 +48,7 @@ export class UserService {
4748
return user;
4849
}
4950

50-
async findOneByIdentifierOrThrow(identifier: string) {
51+
async findOneByIdentifierOrThrow(identifier: string): Promise<UserWithSecrets> {
5152
const user = await (async (identifier: string) => {
5253
// First, find the user by email
5354
const user = await this.prisma.user.findUnique({
@@ -69,21 +70,25 @@ export class UserService {
6970
return user;
7071
}
7172

72-
create(data: Prisma.UserCreateInput) {
73+
create(data: Prisma.UserCreateInput): Promise<UserWithSecrets> {
7374
return this.prisma.user.create({ data, include: { secrets: true } });
7475
}
7576

76-
updateByEmail(email: string, data: Prisma.UserUpdateArgs["data"]) {
77+
updateByEmail(email: string, data: Prisma.UserUpdateArgs["data"]): Promise<User> {
7778
return this.prisma.user.update({ where: { email }, data });
7879
}
7980

80-
async updateByResetToken(resetToken: string, data: Prisma.SecretsUpdateArgs["data"]) {
81+
async updateByResetToken(
82+
resetToken: string,
83+
data: Prisma.SecretsUpdateArgs["data"],
84+
): Promise<void> {
8185
await this.prisma.secrets.update({ where: { resetToken }, data });
8286
}
8387

84-
async deleteOneById(id: string) {
85-
await this.storageService.deleteFolder(id);
86-
87-
return this.prisma.user.delete({ where: { id } });
88+
async deleteOneById(id: string): Promise<void> {
89+
await Promise.all([
90+
this.storageService.deleteFolder(id),
91+
this.prisma.user.delete({ where: { id } }),
92+
]);
8893
}
8994
}

libs/dto/src/user/user.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export const userSchema = z.object({
3333

3434
export class UserDto extends createZodDto(userSchema) {}
3535

36-
export const userWithSecretsSchema = userSchema.merge(z.object({ secrets: secretsSchema }));
36+
export const userWithSecretsSchema = userSchema.merge(
37+
z.object({ secrets: secretsSchema.nullable().default(null) }),
38+
);
3739

3840
export class UserWithSecrets extends createZodDto(userWithSecretsSchema) {}

package.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@reactive-resume/source",
33
"description": "A free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume.",
4-
"version": "4.4.5",
4+
"version": "4.4.6",
55
"license": "MIT",
66
"private": true,
77
"author": {
@@ -85,12 +85,12 @@
8585
"@types/retry": "^0.12.5",
8686
"@types/sanitize-html": "^2.13.0",
8787
"@types/webfontloader": "^1.6.38",
88-
"@typescript-eslint/eslint-plugin": "^8.22.0",
89-
"@typescript-eslint/parser": "^8.22.0",
88+
"@typescript-eslint/eslint-plugin": "^8.23.0",
89+
"@typescript-eslint/parser": "^8.23.0",
9090
"@vitejs/plugin-react": "^4.3.4",
9191
"@vitejs/plugin-react-swc": "^3.7.2",
92-
"@vitest/coverage-v8": "^2.1.8",
93-
"@vitest/ui": "^2.1.8",
92+
"@vitest/coverage-v8": "^2.1.9",
93+
"@vitest/ui": "^2.1.9",
9494
"autoprefixer": "^10.4.20",
9595
"babel-plugin-macros": "^3.1.0",
9696
"eslint": "^8.57.1",
@@ -121,7 +121,7 @@
121121
"typescript": "^5.7.3",
122122
"vite": "^5.4.14",
123123
"vite-plugin-dts": "^4.5.0",
124-
"vitest": "^2.1.8"
124+
"vitest": "^2.1.9"
125125
},
126126
"dependencies": {
127127
"@dnd-kit/core": "^6.3.1",

0 commit comments

Comments
 (0)