Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/backend/src/auth/auth.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ describe('AuthService', () => {
const refreshToken = 'refresh-token';

spyOn(jwtService, 'signAsync').mockImplementation(
(payload, options: any) => {
(payload: any, options: any) => {
if (options.secret === 'test-jwt-secret') {
return Promise.resolve(accessToken);
} else if (options.secret === 'test-jwt-refresh-secret') {
Expand Down
22 changes: 14 additions & 8 deletions apps/backend/src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,20 @@ export class AuthService {

public async createJwtPayload(payload: TokenPayload): Promise<Tokens> {
const [accessToken, refreshToken] = await Promise.all([
this.jwtService.signAsync(payload, {
secret: this.JWT_SECRET,
expiresIn: this.JWT_EXPIRES_IN,
}),
this.jwtService.signAsync(payload, {
secret: this.JWT_REFRESH_SECRET,
expiresIn: this.JWT_REFRESH_EXPIRES_IN,
}),
this.jwtService.signAsync(
payload as object,
{
secret: this.JWT_SECRET,
expiresIn: this.JWT_EXPIRES_IN,
} as any,
),
this.jwtService.signAsync(
payload as object,
{
secret: this.JWT_REFRESH_SECRET,
expiresIn: this.JWT_REFRESH_EXPIRES_IN,
} as any,
),
Comment on lines +174 to +187
Copy link

Copilot AI Jan 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The cast payload as object is unnecessary since TokenPayload is already an object type with defined properties. This cast reduces type safety without providing benefit. Similarly, casting the options object to any masks potential type issues with the JWT service configuration. Consider reviewing the JWT service types to ensure proper type compatibility rather than using type assertions.

Copilot uses AI. Check for mistakes.
]);

return {
Expand Down
4 changes: 2 additions & 2 deletions apps/backend/src/auth/strategies/JWT.strategy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ describe('JwtStrategy', () => {
it('should throw an error if JWT_SECRET is not set', () => {
jest.spyOn(configService, 'getOrThrow').mockReturnValue(null);

expect(() => new JwtStrategy(configService)).toThrowError(
expect(() => new JwtStrategy(configService)).toThrow(
'JwtStrategy requires a secret or key',
);
});
Expand Down Expand Up @@ -84,7 +84,7 @@ describe('JwtStrategy', () => {

const payload = { userId: 'test-user-id' };

expect(() => jwtStrategy.validate(req, payload)).toThrowError(
expect(() => jwtStrategy.validate(req, payload)).toThrow(
'No refresh token',
);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ describe('DiscordStrategy', () => {
it('should throw an error if Discord config is missing', () => {
jest.spyOn(configService, 'getOrThrow').mockReturnValueOnce(null);

expect(() => new DiscordStrategy(configService)).toThrowError(
expect(() => new DiscordStrategy(configService)).toThrow(
'OAuth2Strategy requires a clientID option',
);
});
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/auth/strategies/discord.strategy/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class DiscordStrategy extends PassportStrategy(strategy, 'discord') {
callbackUrl: `${SERVER_URL}/v1/auth/discord/callback`,
scope: [DiscordPermissionScope.Email, DiscordPermissionScope.Identify],
fetchScope: true,
prompt: 'none',
prompt: 'none' as const,
};

super(config);
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/auth/strategies/github.strategy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ describe('GithubStrategy', () => {
it('should throw an error if GitHub config is missing', () => {
jest.spyOn(configService, 'getOrThrow').mockReturnValueOnce(null);

expect(() => new GithubStrategy(configService)).toThrowError(
expect(() => new GithubStrategy(configService)).toThrow(
'OAuth2Strategy requires a clientID option',
);
});
Expand Down
4 changes: 2 additions & 2 deletions apps/backend/src/auth/strategies/github.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ export class GithubStrategy extends PassportStrategy(strategy, 'github') {
super({
clientID: GITHUB_CLIENT_ID,
clientSecret: GITHUB_CLIENT_SECRET,
redirect_uri: `${SERVER_URL}/v1/auth/github/callback`,
callbackURL: `${SERVER_URL}/v1/auth/github/callback`,
scope: 'user:read,user:email',
state: false,
});
} as any);
Comment on lines 22 to +28
Copy link

Copilot AI Jan 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change from redirect_uri to callbackURL is correct and fixes a typo in the configuration property name. However, casting the entire configuration object to any masks other potential type issues. Consider checking the passport-github types to ensure all configuration properties are correctly typed rather than bypassing type checking with as any.

Copilot uses AI. Check for mistakes.
}

async validate(accessToken: string, refreshToken: string, profile: any) {
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/auth/strategies/google.strategy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ describe('GoogleStrategy', () => {
it('should throw an error if Google config is missing', () => {
jest.spyOn(configService, 'getOrThrow').mockReturnValueOnce(null);

expect(() => new GoogleStrategy(configService)).toThrowError(
expect(() => new GoogleStrategy(configService)).toThrow(
'OAuth2Strategy requires a clientID option',
);
});
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/lib/GetRequestUser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ describe('validateUser', () => {
});

it('should throw an error if the user does not exist', () => {
expect(() => validateUser(null)).toThrowError(
expect(() => validateUser(null)).toThrow(
new HttpException(
{
error: {
Expand Down
24 changes: 12 additions & 12 deletions apps/backend/src/song/song.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ describe('SongController', () => {
const query: SongListQueryDTO = { page: 1, limit: 10 };
const songList: SongPreviewDto[] = Array(10)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -280,7 +280,7 @@ describe('SongController', () => {
const query: SongListQueryDTO = { page: 1, limit: 10 };
const songList: SongPreviewDto[] = Array(5)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -300,7 +300,7 @@ describe('SongController', () => {
const query: SongListQueryDTO = { page: 3, limit: 10 };
const songList: SongPreviewDto[] = Array(10)
.fill(null)
.map((_, i) => ({ id: `song-${20 + i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${20 + i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -321,7 +321,7 @@ describe('SongController', () => {
const query: SongListQueryDTO = { page: 1, limit: 10, q: 'test search' };
const songList: SongPreviewDto[] = Array(8)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -346,7 +346,7 @@ describe('SongController', () => {
};
const songList: SongPreviewDto[] = Array(3)
.fill(null)
.map((_, i) => ({ id: `rock-song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `rock-song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand Down Expand Up @@ -430,7 +430,7 @@ describe('SongController', () => {
const q = 'test query';
const songList: SongPreviewDto[] = Array(5)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand Down Expand Up @@ -493,7 +493,7 @@ describe('SongController', () => {
const q = 'test search';
const songList: SongPreviewDto[] = Array(10)
.fill(null)
.map((_, i) => ({ id: `song-${10 + i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${10 + i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -516,7 +516,7 @@ describe('SongController', () => {
const q = 'popular song';
const songList: SongPreviewDto[] = Array(50)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -538,7 +538,7 @@ describe('SongController', () => {
const q = 'search term';
const songList: SongPreviewDto[] = Array(3)
.fill(null)
.map((_, i) => ({ id: `song-${40 + i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${40 + i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand Down Expand Up @@ -596,7 +596,7 @@ describe('SongController', () => {
const q = 'test';
const songList: SongPreviewDto[] = Array(25)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -623,7 +623,7 @@ describe('SongController', () => {
const q = 'trending';
const songList: SongPreviewDto[] = Array(10)
.fill(null)
.map((_, i) => ({ id: `song-${i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand All @@ -644,7 +644,7 @@ describe('SongController', () => {
const q = 'search';
const songList: SongPreviewDto[] = Array(20)
.fill(null)
.map((_, i) => ({ id: `song-${40 + i}` } as SongPreviewDto));
.map((_, i) => ({ id: `song-${40 + i}` } as unknown as SongPreviewDto));

mockSongService.querySongs.mockResolvedValueOnce({
content: songList,
Expand Down
4 changes: 3 additions & 1 deletion apps/backend/src/song/song.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,9 @@ export class SongController {
[SongSortType.NOTE_COUNT, 'stats.noteCount'],
]);

const sortField = sortFieldMap.get(query.sort) ?? 'createdAt';
const sortField = query.sort
? sortFieldMap.get(query.sort) ?? 'createdAt'
: 'createdAt';
Comment on lines +135 to +137
Copy link

Copilot AI Jan 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The conditional check query.sort ? sortFieldMap.get(query.sort) ?? 'createdAt' : 'createdAt' is redundant. The original code sortFieldMap.get(query.sort) ?? 'createdAt' already handles the case where query.sort is undefined or null correctly, since Map.get(undefined) returns undefined and the nullish coalescing operator (??) will fall back to 'createdAt'. The added ternary check doesn't add value and makes the code more verbose.

Suggested change
const sortField = query.sort
? sortFieldMap.get(query.sort) ?? 'createdAt'
: 'createdAt';
const sortField = sortFieldMap.get(query.sort) ?? 'createdAt';

Copilot uses AI. Check for mistakes.
const isDescending = query.order ? query.order === 'desc' : true;

// Build PageQueryDTO with the sort field
Expand Down
6 changes: 2 additions & 4 deletions apps/backend/src/song/song.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1225,8 +1225,7 @@ describe('SongService', () => {
exec: jest.fn().mockResolvedValue(songList),
};

mockSongModel.aggregate.mockReturnValue(mockAggregate as any);
mockSongModel.populate.mockResolvedValue(songList);
jest.spyOn(songModel, 'aggregate').mockReturnValue(mockAggregate as any);
Copy link

Copilot AI Jan 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test setup now uses jest.spyOn(songModel, 'aggregate') but the assertions still reference mockSongModel.aggregate and mockSongModel.populate. Since songModel is injected from the mocked mockSongModel, the assertions should be updated to use songModel instead of mockSongModel for consistency, or the spy should be on mockSongModel.

Copilot uses AI. Check for mistakes.

const result = await service.getRandomSongs(count);

Expand All @@ -1253,8 +1252,7 @@ describe('SongService', () => {
exec: jest.fn().mockResolvedValue(songList),
};

mockSongModel.aggregate.mockReturnValue(mockAggregate as any);
mockSongModel.populate.mockResolvedValue(songList);
jest.spyOn(songModel, 'aggregate').mockReturnValue(mockAggregate as any);
Copy link

Copilot AI Jan 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to the previous test, the setup uses jest.spyOn(songModel, 'aggregate') but the assertions reference mockSongModel.aggregate and mockSongModel.populate. The assertions should be updated to use songModel for consistency with the spy setup.

Copilot uses AI. Check for mistakes.

const result = await service.getRandomSongs(count, category);

Expand Down
14 changes: 14 additions & 0 deletions apps/backend/src/types/thumbnail.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
declare module '@nbw/thumbnail/node' {
interface DrawParams {
notes: unknown;
startTick: number;
startLayer: number;
zoomLevel: number;
backgroundColor: string;
imgWidth: number;
imgHeight: number;
}

export function drawToImage(params: DrawParams): Promise<Buffer>;
export function drawNotesOffscreen(params: DrawParams): Promise<unknown>;
}
2 changes: 2 additions & 0 deletions apps/backend/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"noEmit": true,

// Path mapping
"baseUrl": ".",
Expand Down
23 changes: 11 additions & 12 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@
"i": "^0.3.7",
"js-confetti": "^0.13.1",
"lucide-react": "^0.556.0",
"next": "16.0.8",
"next": "16.0.10",
"next-recaptcha-v3": "^1.5.3",
"nextjs-toploader": "^3.9.17",
"npm": "^11.7.0",
Expand Down Expand Up @@ -206,7 +206,6 @@
"name": "@nbw/song",
"dependencies": {
"@encode42/nbs.js": "^5.0.2",
"@nbw/database": "workspace:*",
"@timohausmann/quadtree-ts": "^2.2.2",
"jszip": "^3.10.1",
"unidecode": "^1.1.0",
Expand Down Expand Up @@ -721,27 +720,27 @@

"@nestjs/throttler": ["@nestjs/throttler@6.5.0", "", { "peerDependencies": { "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0" } }, "sha512-9j0ZRfH0QE1qyrj9JjIRDz5gQLPqq9yVC2nHsrosDVAfI5HHw08/aUAWx9DZLSdQf4HDkmhTTEGLrRFHENvchQ=="],

"@next/env": ["@next/env@16.0.8", "", {}, "sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ=="],
"@next/env": ["@next/env@16.0.10", "", {}, "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang=="],

"@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.0.8", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-1miV0qXDcLUaOdHridVPCh4i39ElRIAraseVIbb3BEqyZ5ol9sPyjTP/GNTPV5rBxqxjF6/vv5zQTVbhiNaLqA=="],

"@next/mdx": ["@next/mdx@16.0.8", "", { "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "optionalPeers": ["@mdx-js/loader", "@mdx-js/react"] }, "sha512-GPv0ouRVp6T/qaOZj3LJiiIUFputrHvC/FVgyedbCaIsfbXmfu+Ky24KWWjf6uQSvDWQnQTk3UMSHqHb5UMYLw=="],

"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.0.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA=="],
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.0.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg=="],

"@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.0.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA=="],
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.0.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw=="],

"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.0.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ=="],
"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.0.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw=="],

"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.0.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ=="],
"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.0.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw=="],

"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.0.8", "", { "os": "linux", "cpu": "x64" }, "sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng=="],
"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.0.10", "", { "os": "linux", "cpu": "x64" }, "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA=="],

"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.0.8", "", { "os": "linux", "cpu": "x64" }, "sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA=="],
"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.0.10", "", { "os": "linux", "cpu": "x64" }, "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g=="],

"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.0.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A=="],
"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.0.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg=="],

"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.0.8", "", { "os": "win32", "cpu": "x64" }, "sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA=="],
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.0.10", "", { "os": "win32", "cpu": "x64" }, "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q=="],

"@next/third-parties": ["@next/third-parties@16.0.8", "", { "dependencies": { "third-party-capital": "1.0.20" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" } }, "sha512-F8TNI1GFm7ivZX6HBMDVsDklAXOHlACbtw7w3WFbDk2oFXdVgKZBfdK+ILhjTBK4ibIXzLMWO1Py3bgSETKHYQ=="],

Expand Down Expand Up @@ -2475,7 +2474,7 @@

"neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],

"next": ["next@16.0.8", "", { "dependencies": { "@next/env": "16.0.8", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.8", "@next/swc-darwin-x64": "16.0.8", "@next/swc-linux-arm64-gnu": "16.0.8", "@next/swc-linux-arm64-musl": "16.0.8", "@next/swc-linux-x64-gnu": "16.0.8", "@next/swc-linux-x64-musl": "16.0.8", "@next/swc-win32-arm64-msvc": "16.0.8", "@next/swc-win32-x64-msvc": "16.0.8", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g=="],
"next": ["next@16.0.10", "", { "dependencies": { "@next/env": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.10", "@next/swc-darwin-x64": "16.0.10", "@next/swc-linux-arm64-gnu": "16.0.10", "@next/swc-linux-arm64-musl": "16.0.10", "@next/swc-linux-x64-gnu": "16.0.10", "@next/swc-linux-x64-musl": "16.0.10", "@next/swc-win32-arm64-msvc": "16.0.10", "@next/swc-win32-x64-msvc": "16.0.10", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA=="],

"next-recaptcha-v3": ["next-recaptcha-v3@1.5.3", "", { "peerDependencies": { "next": "^13 || ^14 || ^15 || ^16", "react": "^18 || ^19" } }, "sha512-Osnt1gj0+Mor8rc42NCzpteQrrSbcxskGLOeWLU/T0xdXtJE90y/gFyp87/yN1goIMI+gXs5f0PMymMa29nuLA=="],

Expand Down
Loading