diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 79c6f38cff..bf865d7082 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -99,6 +99,9 @@ repos: - id: check-case-conflict - id: check-executables-have-shebangs - id: check-json + # tsconfig.json uses JSONC (comments). + # Matches frontend/tsconfig.json and frontend/**/tsconfig.json + exclude: ^frontend/(?:[^/]+/)*tsconfig\.json$ - id: check-merge-conflict - id: check-toml - id: check-yaml diff --git a/docker/frontend/Dockerfile.a11y.test b/docker/frontend/Dockerfile.a11y.test index bad96af4a9..8c9707c354 100644 --- a/docker/frontend/Dockerfile.a11y.test +++ b/docker/frontend/Dockerfile.a11y.test @@ -19,7 +19,8 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ COPY __tests__/a11y __tests__/a11y COPY __tests__/mockData __tests__/mockData -COPY .pnpmrc jest.config.ts jest.setup.ts tsconfig.json ./ +COPY __tests__/jest.setup.ts __tests__/jest.setup.ts +COPY .pnpmrc jest.config.ts tsconfig.json ./ COPY public public COPY src src diff --git a/docker/frontend/Dockerfile.unit.test b/docker/frontend/Dockerfile.unit.test index cfd33a7344..266d5cc90a 100644 --- a/docker/frontend/Dockerfile.unit.test +++ b/docker/frontend/Dockerfile.unit.test @@ -19,7 +19,9 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ COPY __tests__/unit __tests__/unit COPY __tests__/mockData __tests__/mockData -COPY .pnpmrc jest.config.ts jest.setup.ts tsconfig.json ./ +COPY __tests__/jest.setup.ts __tests__/jest.setup.ts +COPY __tests__/tsconfig.json __tests__/tsconfig.json +COPY .pnpmrc jest.config.ts tsconfig.json ./ COPY public public COPY src src diff --git a/frontend/__tests__/a11y/components/CardDetailsPage.a11y.test.tsx b/frontend/__tests__/a11y/components/CardDetailsPage.a11y.test.tsx index dc23d3de6e..15bdce59a8 100644 --- a/frontend/__tests__/a11y/components/CardDetailsPage.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/CardDetailsPage.a11y.test.tsx @@ -188,8 +188,8 @@ describe.each([ name: 'Intro to Web', description: 'A beginner friendly module.', experienceLevel: ExperienceLevelEnum.Beginner, - startedAt: 1735689600, // 2025-01-01 - endedAt: 1740787200, // 2025-03-01 + startedAt: '2025-01-01T00:00:00.000Z', + endedAt: '2025-03-01T00:00:00.000Z', mentors: [ { id: 'mentor-mentor1', diff --git a/frontend/__tests__/a11y/components/LeadersList.a11y.test.tsx b/frontend/__tests__/a11y/components/LeadersList.a11y.test.tsx index 8652f3444d..5578defb9d 100644 --- a/frontend/__tests__/a11y/components/LeadersList.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/LeadersList.a11y.test.tsx @@ -41,7 +41,9 @@ describe.each([ document.documentElement.classList.toggle('dark', theme === 'dark') }) it('should not have any accessibility violations', async () => { - const { container } = render() + const { container } = render( + + ) const results = await axe(container) diff --git a/frontend/__tests__/a11y/components/MentorshipPullRequest.a11y.test.tsx b/frontend/__tests__/a11y/components/MentorshipPullRequest.a11y.test.tsx index c76a57fb1f..0b3259d167 100644 --- a/frontend/__tests__/a11y/components/MentorshipPullRequest.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/MentorshipPullRequest.a11y.test.tsx @@ -15,7 +15,7 @@ const mockPR: PullRequest = { avatarUrl: 'https://example.com/avatar.png', key: 'testuser', contributionsCount: 10, - createdAt: 0, + createdAt: '1970-01-01T00:00:00.000Z', followersCount: 5, followingCount: 3, publicRepositoriesCount: 8, diff --git a/frontend/__tests__/a11y/components/ModuleCard.a11y.test.tsx b/frontend/__tests__/a11y/components/ModuleCard.a11y.test.tsx index 7d1a89c381..51b648277a 100644 --- a/frontend/__tests__/a11y/components/ModuleCard.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/ModuleCard.a11y.test.tsx @@ -1,6 +1,7 @@ import { render } from '@testing-library/react' import { axe } from 'jest-axe' import { useTheme } from 'next-themes' +import { ExperienceLevelEnum } from 'types/__generated__/graphql' import ModuleCard from 'components/ModuleCard' jest.mock('@apollo/client/react', () => ({ @@ -12,11 +13,25 @@ const mockModules = [ key: 'module-1', name: 'Intro to Web Security', description: 'A beginner module', - experienceLevel: 'BEGINNER', + experienceLevel: ExperienceLevelEnum.Beginner, startedAt: '2025-01-01', endedAt: '2025-03-01', - mentors: [{ login: 'mentor1', name: 'Mentor One', avatarUrl: 'https://example.com/m1.png' }], - mentees: [{ login: 'mentee1', name: 'Mentee One', avatarUrl: 'https://example.com/me1.png' }], + mentors: [ + { + id: 'm1', + login: 'mentor1', + name: 'Mentor One', + avatarUrl: 'https://example.com/m1.png', + }, + ], + mentees: [ + { + id: 'e1', + login: 'mentee1', + name: 'Mentee One', + avatarUrl: 'https://example.com/me1.png', + }, + ], tags: ['web'], domains: ['security'], }, @@ -33,7 +48,7 @@ describe.each([ it('should have no accessibility violations', async () => { const { container } = render(
- +
) diff --git a/frontend/__tests__/a11y/components/ProgramCard.a11y.test.tsx b/frontend/__tests__/a11y/components/ProgramCard.a11y.test.tsx index d06414cbf9..d6f99f1f4f 100644 --- a/frontend/__tests__/a11y/components/ProgramCard.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/ProgramCard.a11y.test.tsx @@ -15,8 +15,8 @@ const baseMockProgram: Program = { name: 'Test Program', description: 'This is a test program description', status: ProgramStatusEnum.Published, - startedAt: 1704067200, - endedAt: 1735646400, + startedAt: '2024-01-01T00:00:00.000Z', + endedAt: '2024-12-31T00:00:00.000Z', userRole: 'admin', } diff --git a/frontend/__tests__/a11y/components/RecentPullRequests.a11y.test.tsx b/frontend/__tests__/a11y/components/RecentPullRequests.a11y.test.tsx index cb7d1413ee..b612ded452 100644 --- a/frontend/__tests__/a11y/components/RecentPullRequests.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/RecentPullRequests.a11y.test.tsx @@ -54,7 +54,7 @@ const minimalData = [ title: 'Test Pull Request', url: 'https://github.com/test-org/test-repo/pull/1', state: 'open', - mergedAt: 1717329600, + mergedAt: new Date(1717329600 * 1000).toISOString(), }, ] diff --git a/frontend/__tests__/a11y/components/RecentRelease.a11y.test.tsx b/frontend/__tests__/a11y/components/RecentRelease.a11y.test.tsx index 3572210693..d6e17c5d25 100644 --- a/frontend/__tests__/a11y/components/RecentRelease.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/RecentRelease.a11y.test.tsx @@ -3,10 +3,13 @@ import { axe } from 'jest-axe' import { Release } from 'types/release' import RecentReleases from 'components/RecentReleases' +const publishedAtIso = new Date(Date.now()).toISOString() + const mockReleases: Release[] = [ { + id: 'release-a11y-1', name: 'v1.0 The First Release', - publishedAt: Date.now(), + publishedAt: publishedAtIso, repositoryName: 'our-awesome-project', organizationName: 'our-org', tagName: 'v1.0', @@ -25,8 +28,9 @@ const mockReleases: Release[] = [ }, }, { + id: 'release-a11y-2', name: 'v2.0 The Second Release', - publishedAt: Date.now(), + publishedAt: publishedAtIso, repositoryName: 'another-cool-project', organizationName: 'our-org', tagName: 'v2.0', diff --git a/frontend/__tests__/a11y/components/RecentReleases.a11y.test.tsx b/frontend/__tests__/a11y/components/RecentReleases.a11y.test.tsx index 1a24544ea0..364ee48fe9 100644 --- a/frontend/__tests__/a11y/components/RecentReleases.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/RecentReleases.a11y.test.tsx @@ -9,7 +9,7 @@ const mockReleases: ReleaseType[] = [ id: '1', name: 'v1.0.0', tagName: 'v1.0.0', - publishedAt: Date.now(), + publishedAt: new Date(Date.now()).toISOString(), repositoryName: 'test-repo', organizationName: 'test-org', isPreRelease: false, @@ -19,7 +19,7 @@ const mockReleases: ReleaseType[] = [ avatarUrl: 'https://example.com/avatar.png', key: 'testuser', contributionsCount: 10, - createdAt: 0, + createdAt: '1970-01-01T00:00:00.000Z', followersCount: 5, followingCount: 3, publicRepositoriesCount: 8, diff --git a/frontend/__tests__/a11y/components/Release.a11y.test.tsx b/frontend/__tests__/a11y/components/Release.a11y.test.tsx index b3d77c19ac..5c84b394c8 100644 --- a/frontend/__tests__/a11y/components/Release.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/Release.a11y.test.tsx @@ -5,8 +5,9 @@ import type { Release as ReleaseType } from 'types/release' import Release from 'components/Release' const release: ReleaseType = { + id: 'release-a11y-single', name: 'v1.0 The First Release', - publishedAt: Date.now(), + publishedAt: new Date(Date.now()).toISOString(), repositoryName: 'our-awesome-project', organizationName: 'our-org', tagName: 'v1.0', diff --git a/frontend/__tests__/a11y/components/RepositoryCard.a11y.test.tsx b/frontend/__tests__/a11y/components/RepositoryCard.a11y.test.tsx index 8730012deb..427e07caaa 100644 --- a/frontend/__tests__/a11y/components/RepositoryCard.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/RepositoryCard.a11y.test.tsx @@ -1,7 +1,6 @@ import { fireEvent, render, screen } from '@testing-library/react' import { axe } from 'jest-axe' import { useTheme } from 'next-themes' -import { Organization } from 'types/organization' import { RepositoryCardProps } from 'types/project' import RepositoryCard from 'components/RepositoryCard' @@ -22,9 +21,9 @@ const createMockRepository = (index: number): RepositoryCardProps => ({ collaboratorsCount: 10, followersCount: 50, publicRepositoriesCount: 20, - createdAt: Date.now(), - updatedAt: Date.now(), - } as Organization, + createdAt: new Date(Date.now()).toISOString(), + updatedAt: new Date(Date.now()).toISOString(), + }, starsCount: 100 + index, subscribersCount: 20 + index, url: `https://github.com/org-${index}/repo-${index}`, diff --git a/frontend/__tests__/a11y/components/SingleModuleCard.a11y.test.tsx b/frontend/__tests__/a11y/components/SingleModuleCard.a11y.test.tsx index fa2f95bbc5..6a173296de 100644 --- a/frontend/__tests__/a11y/components/SingleModuleCard.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/SingleModuleCard.a11y.test.tsx @@ -58,7 +58,7 @@ const mockModule: Module = { }, ], startedAt: 1704067200, - endedAt: 1735689599, + endedAt: new Date(1735689599 * 1000).toISOString(), domains: ['frontend', 'backend'], tags: ['react', 'nodejs'], labels: ['good first issue', 'bug'], diff --git a/frontend/__tests__/a11y/components/ToggleableList.a11y.test.tsx b/frontend/__tests__/a11y/components/ToggleableList.a11y.test.tsx index cae6733d01..af78a990e2 100644 --- a/frontend/__tests__/a11y/components/ToggleableList.a11y.test.tsx +++ b/frontend/__tests__/a11y/components/ToggleableList.a11y.test.tsx @@ -13,7 +13,9 @@ describe.each([ }) it('should not have any accessibility violations', async () => { const mockItems = Array.from({ length: 15 }, (_, i) => `Item ${i + 1}`) - const { container } = render() + const { container } = render( + + ) const results = await axe(container) diff --git a/frontend/jest.setup.ts b/frontend/__tests__/jest.setup.ts similarity index 100% rename from frontend/jest.setup.ts rename to frontend/__tests__/jest.setup.ts diff --git a/frontend/__tests__/tsconfig.json b/frontend/__tests__/tsconfig.json new file mode 100644 index 0000000000..1a6c0f0823 --- /dev/null +++ b/frontend/__tests__/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + // Do not emit a .tsbuildinfo. + "incremental": false, + "isolatedModules": true, + "noEmit": true, + // Tightening would require typed mocks across many a11y files. + "strict": false, + "types": ["jest", "node"] + }, + "exclude": ["e2e", "node_modules"], + "include": ["**/*.ts", "**/*.tsx", "../jest.config.ts"] +} diff --git a/frontend/__tests__/unit/components/CardDetailsPage.test.tsx b/frontend/__tests__/unit/components/CardDetailsPage.test.tsx index 1e4230c66c..19f2d1c0de 100644 --- a/frontend/__tests__/unit/components/CardDetailsPage.test.tsx +++ b/frontend/__tests__/unit/components/CardDetailsPage.test.tsx @@ -698,7 +698,7 @@ describe('CardDetailsPage', () => { const mockUser = { avatarUrl: 'https://example.com/avatar.jpg', contributionsCount: 100, - createdAt: Date.now() - 31536000000, + createdAt: new Date(Date.now() - 31536000000).toISOString(), followersCount: 50, followingCount: 25, key: 'test-user', @@ -711,7 +711,7 @@ describe('CardDetailsPage', () => { const mockRecentIssues = [ { author: mockUser, - createdAt: Date.now() - 86400000, + createdAt: new Date(Date.now() - 86400000).toISOString(), hint: 'Bug fix needed', labels: ['bug', 'high-priority'], number: '123', @@ -720,7 +720,7 @@ describe('CardDetailsPage', () => { projectUrl: 'https://github.com/test/project', body: 'Issue summary', title: 'Test Issue', - updatedAt: Date.now(), + updatedAt: new Date(Date.now()).toISOString(), url: 'https://github.com/test/project/issues/123', objectID: 'issue-123', }, @@ -759,7 +759,7 @@ describe('CardDetailsPage', () => { author: mockUser, isPreRelease: false, name: 'v1.0.0', - publishedAt: Date.now() - 604800000, + publishedAt: new Date(Date.now() - 604800000).toISOString(), repositoryName: 'test-repo', tagName: 'v1.0.0', url: 'https://github.com/test/repo/releases/tag/v1.0.0', @@ -768,7 +768,7 @@ describe('CardDetailsPage', () => { const mockChapterGeoData = [ { - createdAt: Date.now() - 31536000000, + createdAt: new Date(Date.now() - 31536000000).toISOString(), isActive: true, key: 'test-chapter', leaders: ['John Doe', 'Jane Smith'], @@ -779,7 +779,7 @@ describe('CardDetailsPage', () => { suggestedLocation: 'New York, NY', summary: 'Test chapter summary', topContributors: mockContributors, - updatedAt: Date.now(), + updatedAt: new Date(Date.now()).toISOString(), url: 'https://owasp.org/test-chapter', _geoloc: { lat: 40.7128, lng: -74.006 }, }, @@ -964,7 +964,7 @@ describe('CardDetailsPage', () => { ) @@ -993,7 +993,7 @@ describe('CardDetailsPage', () => { ) @@ -1005,7 +1005,7 @@ describe('CardDetailsPage', () => { @@ -1018,7 +1018,7 @@ describe('CardDetailsPage', () => { { it('renders Leaders with Unknown when value is null', () => { const propsWithNullLeader = { ...defaultProps, - type: 'chapter', + type: 'chapter' as const, details: [{ label: 'Leaders', value: null }], } render() @@ -2269,7 +2269,7 @@ describe('CardDetailsPage', () => { const moduleProps: DetailsCardProps = { ...defaultProps, type: 'module' as const, - pullRequests: manyPRs as unknown as PullRequest[], + pullRequests: manyPRs as PullRequest[], } render() @@ -2290,7 +2290,7 @@ describe('CardDetailsPage', () => { const moduleProps: DetailsCardProps = { ...defaultProps, type: 'module' as const, - pullRequests: manyPRs as unknown as PullRequest[], + pullRequests: manyPRs as PullRequest[], } render() @@ -2309,7 +2309,7 @@ describe('CardDetailsPage', () => { const moduleProps: DetailsCardProps = { ...defaultProps, type: 'module' as const, - pullRequests: manyPRs as unknown as PullRequest[], + pullRequests: manyPRs as PullRequest[], } render() @@ -2328,7 +2328,7 @@ describe('CardDetailsPage', () => { const moduleProps: DetailsCardProps = { ...defaultProps, type: 'module' as const, - pullRequests: fewPRs as unknown as PullRequest[], + pullRequests: fewPRs as PullRequest[], } render() diff --git a/frontend/__tests__/unit/components/ContributionStats.test.tsx b/frontend/__tests__/unit/components/ContributionStats.test.tsx index 06c278ede8..ad5f6d9a35 100644 --- a/frontend/__tests__/unit/components/ContributionStats.test.tsx +++ b/frontend/__tests__/unit/components/ContributionStats.test.tsx @@ -1,4 +1,5 @@ import { render, screen } from '@testing-library/react' +import type { ContributionStats as ContributionStatsData } from 'utils/contributionDataUtils' import ContributionStats from 'components/ContributionStats' describe('ContributionStats', () => { @@ -91,15 +92,8 @@ describe('ContributionStats', () => { expect(screen.getAllByText('0')).toHaveLength(4) // All stats should show 0 }) - it('handles null stats gracefully', () => { - render() - - expect(screen.getByText('Null Stats')).toBeInTheDocument() - expect(screen.getAllByText('0')).toHaveLength(4) // All stats should show 0 - }) - it('handles empty object stats', () => { - render() + render() expect(screen.getByText('Empty Stats')).toBeInTheDocument() expect(screen.getAllByText('0')).toHaveLength(4) // All stats should show 0 @@ -112,7 +106,9 @@ describe('ContributionStats', () => { commits: 100, } - render() + render( + + ) // Verify commits value expect(screen.getByText('100')).toBeInTheDocument() @@ -128,7 +124,9 @@ describe('ContributionStats', () => { total: 75, } - render() + render( + + ) expect(screen.getByText('50')).toBeInTheDocument() // commits expect(screen.getByText('25')).toBeInTheDocument() // issues diff --git a/frontend/__tests__/unit/components/ContributorAvatar.test.tsx b/frontend/__tests__/unit/components/ContributorAvatar.test.tsx index dc169408f7..8411031ef2 100644 --- a/frontend/__tests__/unit/components/ContributorAvatar.test.tsx +++ b/frontend/__tests__/unit/components/ContributorAvatar.test.tsx @@ -252,7 +252,7 @@ describe('ContributorAvatar', () => { projectKey: 'test-key', projectName: 'Test-Project', contributionsCount: 10, - } as unknown as Contributor + } as Contributor // We need to mock the component behavior by providing avatarUrl separately // Since the component always expects avatarUrl, we test the edge case @@ -298,14 +298,14 @@ describe('ContributorAvatar', () => { }) it('handles contributor with null name falling back to login', () => { - const contributorWithNullName: Contributor = { + const contributorWithNullName = { id: 'contributor-null-name', login: 'loginonly', - name: null as unknown as string, + name: null, avatarUrl: 'https://github.com/loginonly.png', contributionsCount: 3, projectKey: 'test-key', - } + } as Contributor render() const tooltip = screen.getByTestId('avatar-tooltip-loginonly-null-name-test') expect(tooltip).toHaveAttribute('title', '3 contributions by loginonly') @@ -350,7 +350,7 @@ describe('ContributorAvatar', () => { projectKey: 'test-key', extraField: 'should be ignored', anotherField: 123, - } as unknown as Contributor + } as Contributor render() expect(screen.getByTestId('contributor-avatar')).toBeInTheDocument() const tooltip = screen.getByTestId('avatar-tooltip-extrauser-extras-test') diff --git a/frontend/__tests__/unit/components/HealthMetrics.test.tsx b/frontend/__tests__/unit/components/HealthMetrics.test.tsx index cedba94af4..cb4dbd009e 100644 --- a/frontend/__tests__/unit/components/HealthMetrics.test.tsx +++ b/frontend/__tests__/unit/components/HealthMetrics.test.tsx @@ -150,7 +150,6 @@ describe('HealthMetrics', () => { projectKey: 'null-project', }, ] - // @ts-expect-error - testing specific edge case with mocked data render() const lineCharts = screen.getAllByTestId('LineChart') diff --git a/frontend/__tests__/unit/components/ItemCardList.test.tsx b/frontend/__tests__/unit/components/ItemCardList.test.tsx index 236211f456..e00b471719 100644 --- a/frontend/__tests__/unit/components/ItemCardList.test.tsx +++ b/frontend/__tests__/unit/components/ItemCardList.test.tsx @@ -630,7 +630,7 @@ describe('ItemCardList Component', () => { it('renders custom renderDetails content', () => { const customRenderDetails = (item: { - createdAt: number + createdAt: string commentsCount: number organizationName: string publishedAt: number @@ -896,7 +896,7 @@ describe('ItemCardList Component', () => { const issueNoLogin = { ...mockIssue, author: authorNoLogin, - } as unknown as Issue + } as Issue render( { ...mockPullRequestOpen.author, login: '', }, - } as unknown as PullRequest + } as PullRequest render() const avatar = screen.getByAltText('Unknown') diff --git a/frontend/__tests__/unit/components/ModuleCard.test.tsx b/frontend/__tests__/unit/components/ModuleCard.test.tsx index 2151056d3d..d5e0d9922f 100644 --- a/frontend/__tests__/unit/components/ModuleCard.test.tsx +++ b/frontend/__tests__/unit/components/ModuleCard.test.tsx @@ -6,6 +6,7 @@ import { render, screen, fireEvent, act, waitFor } from '@testing-library/react' import '@testing-library/jest-dom' import React from 'react' import { ExperienceLevelEnum } from 'types/__generated__/graphql' +import type { Contributor } from 'types/contributor' import type { Module } from 'types/mentorship' import ModuleCard, { getSimpleDuration } from 'components/ModuleCard' @@ -542,8 +543,8 @@ describe('ModuleCard', () => { id: 'id-mentor3', login: 'mentor3', name: 'Mentor 3', - avatarUrl: undefined as unknown as string, - }, // Undefined avatar + avatarUrl: undefined, + } as Contributor, // Undefined avatar URL ] const modules = [createMockModule({ mentors }), createMockModule({ key: 'mod2' })] @@ -683,7 +684,7 @@ describe('ModuleCard', () => { const moduleWithUndefined = createMockModule({ mentors: undefined, mentees: undefined, - } as unknown as Partial) + }) const modules = [moduleWithUndefined, createMockModule({ key: 'mod2' })] diff --git a/frontend/__tests__/unit/components/RecentIssues.test.tsx b/frontend/__tests__/unit/components/RecentIssues.test.tsx index 2d8b69ef97..3741cd7edd 100644 --- a/frontend/__tests__/unit/components/RecentIssues.test.tsx +++ b/frontend/__tests__/unit/components/RecentIssues.test.tsx @@ -188,7 +188,7 @@ describe('', () => { }) it('renders with null data', () => { - render() + render() expect(screen.getByText('Nothing to display.')).toBeInTheDocument() }) diff --git a/frontend/__tests__/unit/components/RecentRelease.test.tsx b/frontend/__tests__/unit/components/RecentRelease.test.tsx index 2d4085b58f..a7e04d76a2 100644 --- a/frontend/__tests__/unit/components/RecentRelease.test.tsx +++ b/frontend/__tests__/unit/components/RecentRelease.test.tsx @@ -64,7 +64,7 @@ jest.mock('next/image', () => ({ }, })) -const now = Date.now() +const now = new Date(Date.now()).toISOString() const mockReleases: Release[] = [ { id: 'release-recent-1', diff --git a/frontend/__tests__/unit/components/Release.test.tsx b/frontend/__tests__/unit/components/Release.test.tsx index 70e25d34fc..0115549ff4 100644 --- a/frontend/__tests__/unit/components/Release.test.tsx +++ b/frontend/__tests__/unit/components/Release.test.tsx @@ -68,7 +68,7 @@ jest.mock('next/image', () => ({ }, })) -const now = Date.now() +const now = new Date(Date.now()).toISOString() const mockReleases: ReleaseType[] = [ { id: 'release-test-1', diff --git a/frontend/__tests__/unit/components/RepositoryCard.test.tsx b/frontend/__tests__/unit/components/RepositoryCard.test.tsx index 57cdd3fc17..a46b483cad 100644 --- a/frontend/__tests__/unit/components/RepositoryCard.test.tsx +++ b/frontend/__tests__/unit/components/RepositoryCard.test.tsx @@ -2,7 +2,6 @@ import { fireEvent, screen } from '@testing-library/react' import { useRouter } from 'next/navigation' import React from 'react' import { render } from 'wrappers/testUtil' -import type { Organization } from 'types/organization' import type { RepositoryCardProps } from 'types/project' import RepositoryCard from 'components/RepositoryCard' @@ -65,9 +64,9 @@ describe('RepositoryCard', () => { collaboratorsCount: 10, followersCount: 50, publicRepositoriesCount: 20, - createdAt: Date.now(), - updatedAt: Date.now(), - } as Organization, + createdAt: new Date(Date.now()).toISOString(), + updatedAt: new Date(Date.now()).toISOString(), + }, starsCount: 100 + index, subscribersCount: 20 + index, url: `https://github.com/org-${index}/repo-${index}`, @@ -79,9 +78,7 @@ describe('RepositoryCard', () => { }) it('returns null when repositories prop is missing', () => { - const { container } = render( - - ) + const { container } = render() expect(container.querySelector('.grid')).toBeNull() }) diff --git a/frontend/__tests__/unit/components/SingleModuleCard.test.tsx b/frontend/__tests__/unit/components/SingleModuleCard.test.tsx index 84106e766b..2b20af2c1a 100644 --- a/frontend/__tests__/unit/components/SingleModuleCard.test.tsx +++ b/frontend/__tests__/unit/components/SingleModuleCard.test.tsx @@ -111,7 +111,7 @@ const mockModule: Module = { }, ], startedAt: 1704067200, - endedAt: 1735689599, + endedAt: new Date(1735689599 * 1000).toISOString(), domains: ['frontend', 'backend'], tags: ['react', 'nodejs'], labels: ['good first issue', 'bug'], diff --git a/frontend/__tests__/unit/components/SnapshotCard.test.tsx b/frontend/__tests__/unit/components/SnapshotCard.test.tsx index d4aaeb315c..6ea0bd585d 100644 --- a/frontend/__tests__/unit/components/SnapshotCard.test.tsx +++ b/frontend/__tests__/unit/components/SnapshotCard.test.tsx @@ -50,11 +50,11 @@ describe('SnapshotCard', () => { }) it('handles missing startAt or endAt (conditional rendering) - timezone safe', () => { - const { rerender } = render() + const { rerender } = render() const onlyEnd = formatDate(defaultProps.endAt) expect(screen.getByText(new RegExp(onlyEnd))).toBeInTheDocument() - rerender() + rerender() const onlyStart = formatDate(defaultProps.startAt) expect(screen.getByText(new RegExp(onlyStart))).toBeInTheDocument() }) diff --git a/frontend/__tests__/unit/utils/getIcsFileUrl.test.ts b/frontend/__tests__/unit/utils/getIcsFileUrl.test.ts index 32b346ae4e..499635eebd 100644 --- a/frontend/__tests__/unit/utils/getIcsFileUrl.test.ts +++ b/frontend/__tests__/unit/utils/getIcsFileUrl.test.ts @@ -40,6 +40,7 @@ describe('getIcsFileUrl', () => { ;(createEvent as jest.Mock).mockImplementation((attr, cb) => cb(null, 'val')) const eventWithTimestamps = { + title: 'Multi-day', startDate: '2025-01-01T00:00:00Z', endDate: '2025-01-03T00:00:00Z', } @@ -59,6 +60,7 @@ describe('getIcsFileUrl', () => { ;(createEvent as jest.Mock).mockImplementation((attr, cb) => cb(null, 'val')) const eventWithTimestamps = { + title: 'Multi-day UTC', startDate: '2025-01-01T00:00:00Z', endDate: '2025-01-03T00:00:00Z', } @@ -78,6 +80,7 @@ describe('getIcsFileUrl', () => { ;(createEvent as jest.Mock).mockImplementation((attr, cb) => cb(null, 'val')) const singleDayEvent = { + title: 'Single day', startDate: '2025-01-01T00:00:00Z', endDate: '2025-01-01T00:00:00Z', } diff --git a/frontend/jest.config.ts b/frontend/jest.config.ts index 91ae292e47..c385148e4a 100644 --- a/frontend/jest.config.ts +++ b/frontend/jest.config.ts @@ -33,12 +33,13 @@ const config: Config = { }, }, globals: {}, - setupFilesAfterEnv: ['/jest.setup.ts'], + setupFilesAfterEnv: ['/__tests__/jest.setup.ts'], testEnvironment: 'jest-environment-jsdom', testPathIgnorePatterns: [ '/__tests__/unit/data/', '/__tests__/e2e/', '/__tests__/mockData/', + '/__tests__/jest.setup.ts', ], transform: { '^.+\\.tsx?$': '@swc/jest', diff --git a/frontend/package.json b/frontend/package.json index d8faa01fb3..2aff06d6cd 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,7 @@ "lint:check": "eslint . --config eslint.config.mjs --max-warnings=0", "start": "next start", "test:a11y": "NODE_OPTIONS='--experimental-vm-modules --no-warnings=DEP0040' jest __tests__/a11y/ --coverage=false", - "test:unit": "tsc --noEmit && NODE_OPTIONS='--experimental-vm-modules --no-warnings=DEP0040' jest" + "test:unit": "tsc --noEmit && tsc --noEmit -p __tests__/tsconfig.json && NODE_OPTIONS='--experimental-vm-modules --no-warnings=DEP0040' jest" }, "dependencies": { "@apollo/client": "^4.1.7", @@ -78,10 +78,12 @@ "@swc/core": "^1.15.21", "@swc/jest": "^0.2.39", "@tailwindcss/postcss": "^4.2.2", + "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/jest": "^30.0.0", + "@types/jest-axe": "^3.5.9", "@types/leaflet": "^1.9.21", "@types/leaflet.markercluster": "^1.5.6", "@types/lodash": "^4.17.24", @@ -91,7 +93,7 @@ "@types/react-dom": "^19.2.3", "@typescript-eslint/eslint-plugin": "^8.58.0", "@typescript-eslint/parser": "^8.58.0", - "eslint": "^10.1.0", + "eslint": "^9.39.4", "eslint-config-next": "^16.2.3", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-alias": "^1.1.2", @@ -113,7 +115,6 @@ "require-in-the-middle": "^8.0.1", "tailwindcss": "^4.2.2", "tailwindcss-animate": "^1.0.7", - "ts-jest": "^29.4.9", "ts-node": "^10.9.2", "typescript": "~6.0.2", "typescript-eslint": "^8.58.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 7f01dc1ebb..ea7c603851 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -192,6 +192,9 @@ importers: '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 + '@testing-library/dom': + specifier: ^10.4.1 + version: 10.4.1 '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -204,6 +207,9 @@ importers: '@types/jest': specifier: ^30.0.0 version: 30.0.0 + '@types/jest-axe': + specifier: ^3.5.9 + version: 3.5.9 '@types/leaflet': specifier: ^1.9.21 version: 1.9.21 @@ -227,40 +233,40 @@ importers: version: 19.2.3(@types/react@19.2.14) '@typescript-eslint/eslint-plugin': specifier: ^8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': specifier: ^8.58.0 - version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + version: 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) eslint: - specifier: ^10.1.0 - version: 10.1.0(jiti@2.6.1) + specifier: ^9.39.4 + version: 9.39.4(jiti@2.6.1) eslint-config-next: specifier: ^16.2.3 - version: 16.2.3(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + version: 16.2.3(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.1.0(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.4(jiti@2.6.1)) eslint-import-resolver-alias: specifier: ^1.1.2 version: 1.1.2(eslint-plugin-import@2.32.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) eslint-plugin-jest: specifier: ^29.15.1 - version: 29.15.1(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2) + version: 29.15.1(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@10.1.0(jiti@2.6.1)) + version: 6.10.2(eslint@9.39.4(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1))(prettier@3.8.1) + version: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@10.1.0(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.4(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) + version: 7.0.1(eslint@9.39.4(jiti@2.6.1)) globals: specifier: ^17.4.0 version: 17.4.0 @@ -297,9 +303,6 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@4.2.2) - ts-jest: - specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2) @@ -308,7 +311,7 @@ importers: version: 6.0.2 typescript-eslint: specifier: ^8.58.0 - version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + version: 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) util: specifier: ^0.12.5 version: 0.12.5 @@ -667,17 +670,17 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.5': resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} @@ -687,13 +690,13 @@ packages: resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.6.1': - resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/bytes@1.15.0': resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} @@ -3453,9 +3456,6 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3471,6 +3471,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/jest-axe@3.5.9': + resolution: {integrity: sha512-z98CzR0yVDalCEuhGXXO4/zN4HHuSebAukXDjTLJyjEAgoUf1H1i+sr7SUB/mz8CRS/03/XChsx0dcLjHkndoQ==} + '@types/jest@30.0.0': resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} @@ -3981,6 +3984,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axe-core@3.5.6: + resolution: {integrity: sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==} + engines: {node: '>=4'} + axe-core@4.10.2: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} @@ -4106,10 +4113,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -4796,9 +4799,9 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -4812,9 +4815,9 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.1.0: - resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -4826,10 +4829,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -5163,11 +5162,6 @@ packages: resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - handlebars@4.7.9: - resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} - engines: {node: '>=0.4.7'} - hasBin: true - harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -5961,9 +5955,6 @@ packages: lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -7351,33 +7342,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.9: - resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 || ^30.0.0 - '@jest/types': ^29.0.0 || ^30.0.0 - babel-jest: ^29.0.0 || ^30.0.0 - esbuild: '*' - jest: ^29.0.0 || ^30.0.0 - jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <7' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - jest-util: - optional: true - ts-log@2.2.7: resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} @@ -7427,10 +7391,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7472,11 +7432,6 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -7684,9 +7639,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -8183,26 +8135,26 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 3.0.5 + '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 10.2.5 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.5': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 - '@eslint/core@1.2.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -8222,11 +8174,11 @@ snapshots: '@eslint/js@9.39.4': {} - '@eslint/object-schema@3.0.5': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.6.1': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 levn: 0.4.1 '@exodus/bytes@1.15.0': {} @@ -12015,8 +11967,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} '@types/geojson@7946.0.16': {} @@ -12031,6 +11981,11 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/jest-axe@3.5.9': + dependencies: + '@types/jest': 30.0.0 + axe-core: 3.5.6 + '@types/jest@30.0.0': dependencies: expect: 30.3.0 @@ -12121,15 +12076,15 @@ snapshots: '@types/node': 25.5.0 optional: true - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.58.0 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.2) @@ -12137,14 +12092,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/scope-manager': 8.58.0 '@typescript-eslint/types': 8.58.0 '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -12167,13 +12122,13 @@ snapshots: dependencies: typescript: 6.0.2 - '@typescript-eslint/type-utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.2) typescript: 6.0.2 transitivePeerDependencies: @@ -12196,13 +12151,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/utils@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.58.0 '@typescript-eslint/types': 8.58.0 '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -12582,6 +12537,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axe-core@3.5.6: {} + axe-core@4.10.2: {} axe-core@4.11.2: {} @@ -12724,10 +12681,6 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.2) - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -13331,18 +13284,18 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@16.2.3(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2): + eslint-config-next@16.2.3(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2): dependencies: '@next/eslint-plugin-next': 16.2.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 7.0.1(eslint@10.1.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.4(jiti@2.6.1)) globals: 16.4.0 - typescript-eslint: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + typescript-eslint: 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) optionalDependencies: typescript: 6.0.2 transitivePeerDependencies: @@ -13351,13 +13304,13 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)): dependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) eslint-import-resolver-node@0.3.9: dependencies: @@ -13367,33 +13320,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@10.1.0(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) get-tsconfig: 4.13.7 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) - eslint: 10.1.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.1.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13402,9 +13355,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@10.1.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13416,24 +13369,24 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@29.15.1(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2): + eslint-plugin-jest@29.15.1(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2): dependencies: - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) - eslint: 10.1.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) + eslint: 9.39.4(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)) typescript: 6.0.2 transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -13443,7 +13396,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -13452,28 +13405,28 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1): dependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@10.1.0(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -13481,7 +13434,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.1 - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -13500,10 +13453,8 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@9.1.2: + eslint-scope@8.4.0: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -13513,25 +13464,28 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.1.0(jiti@2.6.1): + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 ajv: 6.14.0 + chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -13542,7 +13496,8 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -13556,12 +13511,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 - espree@11.2.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 - esprima@4.0.1: {} esquery@1.7.0: @@ -13936,15 +13885,6 @@ snapshots: graphql@16.13.2: {} - handlebars@4.7.9: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} @@ -14995,8 +14935,6 @@ snapshots: lodash-es@4.18.1: {} - lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} @@ -16445,26 +16383,6 @@ snapshots: dependencies: typescript: 6.0.2 - ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)))(typescript@6.0.2): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.4 - type-fest: 4.41.0 - typescript: 6.0.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.29.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0) - jest-util: 30.3.0 - ts-log@2.2.7: {} ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@25.5.0)(typescript@6.0.2): @@ -16512,8 +16430,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.41.0: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -16558,13 +16474,13 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2): + typescript-eslint@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) - eslint: 10.1.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.2) + eslint: 9.39.4(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -16573,9 +16489,6 @@ snapshots: uc.micro@2.1.0: {} - uglify-js@3.19.3: - optional: true - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -16826,8 +16739,6 @@ snapshots: word-wrap@1.2.5: {} - wordwrap@1.0.0: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 2d673b14c6..69c1ace9ea 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -37,7 +37,7 @@ "target": "ES2023", "useDefineForClassFields": true }, - "exclude": ["__tests__/**/*", "jest.setup.ts", "node_modules", "playwright.config.ts"], + "exclude": ["__tests__/**/*", "node_modules", "playwright.config.ts"], "include": [ "**/*.ts", "**/*.tsx",