From ba69f5b371f95598dbee9cc5319a94bcb77248ce Mon Sep 17 00:00:00 2001 From: Matthew Rafuse Date: Thu, 9 Jul 2026 12:48:02 -0400 Subject: [PATCH 01/13] fix(ui): update tsconfig to remove errors --- .../addons/layout/FlexVertical.test.tsx | 18 ++++++++++-- .../addons/layout/vsbox/VSBoxContent.test.tsx | 12 ++++++-- .../routes/home/HomeSettings.test.tsx | 28 +++---------------- ui/src/rest/AxiosClient.test.ts | 15 +++------- ui/tsconfig.json | 2 +- 5 files changed, 34 insertions(+), 41 deletions(-) diff --git a/ui/src/components/elements/addons/layout/FlexVertical.test.tsx b/ui/src/components/elements/addons/layout/FlexVertical.test.tsx index 9e025424e..d66b440f0 100644 --- a/ui/src/components/elements/addons/layout/FlexVertical.test.tsx +++ b/ui/src/components/elements/addons/layout/FlexVertical.test.tsx @@ -5,7 +5,11 @@ import FlexVertical from './FlexVertical'; describe('FlexVertical', () => { it('renders a div with display:flex and flex-direction:column', () => { - const { container } = render(child); + const { container } = render( + + child + + ); const div = container.firstChild as HTMLElement; expect(div).toBeInTheDocument(); expect(div).toHaveStyle({ display: 'flex', flexDirection: 'column' }); @@ -32,13 +36,21 @@ describe('FlexVertical', () => { }); it('applies the default flex value of 1', () => { - const { container } = render(child); + const { container } = render( + + child + + ); const div = container.firstChild as HTMLElement; expect(div).toHaveStyle({ flex: 1 }); }); it('applies a custom flex value when provided', () => { - const { container } = render(child); + const { container } = render( + + child + + ); const div = container.firstChild as HTMLElement; expect(div).toHaveStyle({ flex: 2 }); }); diff --git a/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx b/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx index 1aba7c980..9ea7173e4 100644 --- a/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx +++ b/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx @@ -5,14 +5,22 @@ import VSBoxContent from './VSBoxContent'; describe('VSBoxContent', () => { it('renders children inside a div with data-vsbox-content attribute', () => { - render(hello); + render( + + hello + + ); const el = document.querySelector('[data-vsbox-content]'); expect(el).toBeInTheDocument(); expect(el).toHaveAttribute('data-vsbox-content', 'true'); }); it('renders children correctly', () => { - render(content); + render( + + content + + ); expect(screen.getByTestId('child')).toBeInTheDocument(); }); diff --git a/ui/src/components/routes/home/HomeSettings.test.tsx b/ui/src/components/routes/home/HomeSettings.test.tsx index 25a006370..d40915877 100644 --- a/ui/src/components/routes/home/HomeSettings.test.tsx +++ b/ui/src/components/routes/home/HomeSettings.test.tsx @@ -22,12 +22,7 @@ describe('HomeSettings', () => { it('renders the settings icon button', () => { render( - , + , { wrapper: Wrapper } ); expect(screen.getByRole('button')).toBeInTheDocument(); @@ -36,12 +31,7 @@ describe('HomeSettings', () => { it('opens the settings menu when the icon button is clicked', async () => { const user = userEvent.setup(); render( - , + , { wrapper: Wrapper } ); @@ -53,12 +43,7 @@ describe('HomeSettings', () => { it('calls onEdit when the Edit menu item is clicked', async () => { const user = userEvent.setup(); render( - , + , { wrapper: Wrapper } ); @@ -71,12 +56,7 @@ describe('HomeSettings', () => { it('disables the Edit menu item when isEditing=true', async () => { const user = userEvent.setup(); render( - , + , { wrapper: Wrapper } ); diff --git a/ui/src/rest/AxiosClient.test.ts b/ui/src/rest/AxiosClient.test.ts index 52f72dcd5..d7cffee70 100644 --- a/ui/src/rest/AxiosClient.test.ts +++ b/ui/src/rest/AxiosClient.test.ts @@ -6,20 +6,13 @@ import AxiosClient from './AxiosClient'; // vi.hoisted() ensures these values are available when the vi.mock factories // run (which happens before any module code executes). // --------------------------------------------------------------------------- -const { - mockAxiosInstance, - mockAxiosError, - mockInterceptorResponseUse, - interceptorRef -} = vi.hoisted(() => { +const { mockAxiosInstance, mockAxiosError, mockInterceptorResponseUse, interceptorRef } = vi.hoisted(() => { // Ref object used to capture the response interceptor across test resets const _interceptorRef: { fn: ((res: any) => Promise) | null } = { fn: null }; - const _mockInterceptorResponseUse = vi.fn().mockImplementation( - (onFulfilled: (res: any) => Promise) => { - _interceptorRef.fn = onFulfilled; - } - ); + const _mockInterceptorResponseUse = vi.fn().mockImplementation((onFulfilled: (res: any) => Promise) => { + _interceptorRef.fn = onFulfilled; + }); const _mockAxiosInstance = vi.fn() as any; _mockAxiosInstance.interceptors = { diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 6afa963f3..c94b89579 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -22,7 +22,7 @@ "verbatimModuleSyntax": true, /* for imports. */ - "baseUrl": "./src", + "rootDir": "./src", "paths": {}, "outDir": "dist" From f95b4bafd043e5fa598e0b1f6e49c4f450dccb0e Mon Sep 17 00:00:00 2001 From: Matthew Rafuse Date: Thu, 9 Jul 2026 12:50:43 -0400 Subject: [PATCH 02/13] fix(ui): pin npm version to 11 to bypass sigstore error --- .github/workflows/ui-workflow.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ui-workflow.yml b/.github/workflows/ui-workflow.yml index a2018f0a1..00ed42454 100644 --- a/.github/workflows/ui-workflow.yml +++ b/.github/workflows/ui-workflow.yml @@ -199,8 +199,10 @@ jobs: working-directory: ui/dist - name: Publish Built Package + # Can't use latest currently: https://github.com/npm/cli/issues/9722 + # npm install -g npm@latest run: | - npm install -g npm@latest + npm install -g npm@11 npm publish --access public --tag ${{ steps.version-check.outputs.npm_tag }} working-directory: ui/dist # Publish from the built dist directory From 38ad803857b636befa1188b2170401ea890d2ff7 Mon Sep 17 00:00:00 2001 From: Matthew Rafuse Date: Thu, 9 Jul 2026 13:05:18 -0400 Subject: [PATCH 03/13] chore(ui): update typescript to v7 --- .github/copilot-instructions.md | 2 + docs/RELEASES.md | 4 + ui/package.json | 2 +- ui/pnpm-lock.yaml | 344 +++++++++++++++++++++++++------- ui/src/index.tsx | 2 +- ui/tsconfig.json | 48 ++++- 6 files changed, 327 insertions(+), 75 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 148617b27..0e2bd71d8 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -259,6 +259,8 @@ README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json > **IMPORTANT FOR ALL FUTURE AGENTS**: When you learn something new, encounter a pitfall, or discover a non-obvious convention in this repository, **add a note to this section** before finishing your task. This keeps institutional knowledge available across conversations. +- In `ui/`, `@fontsource/roboto` may fail TypeScript side-effect import resolution at the package root even when the dependency is installed; prefer importing the explicit CSS entry `@fontsource/roboto/index.css` from the app entrypoint. + --- ### Changelog Entries for Bug Fixes diff --git a/docs/RELEASES.md b/docs/RELEASES.md index 3768ec6be..0de064d0d 100644 --- a/docs/RELEASES.md +++ b/docs/RELEASES.md @@ -1,5 +1,9 @@ # Howler Releases +## Howler UI `v2.19.0` + +- **Fontsource Roboto Import Resolution** *(bugfix)*: Fixed the UI entrypoint to import Roboto from the package's explicit CSS entry so TypeScript can resolve the side-effect import correctly. + ## Howler UI `v2.18.0` - **Action Outcome Messages** *(new feature)*: Actions now display an appropriate success or failure message according to the outcome of the operation. diff --git a/ui/package.json b/ui/package.json index 69569a1c5..208b8adc4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -111,7 +111,7 @@ "msw": "^2.14.6", "prettier": "^3.9.4", "prettier-plugin-organize-imports": "^3.2.4", - "typescript": "^5.9.3", + "typescript": "^7.0.2", "vite": "^6.4.3", "vite-plugin-dts": "^4.5.4", "vite-tsconfig-paths": "^4.3.2", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 1211f977d..a086ea984 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 0.49.0 notistack: specifier: ^3.0.2 - version: 3.0.2(csstype@3.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -239,25 +239,25 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) + version: 7.18.0(eslint@8.57.1)(typescript@7.0.2) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.2.7 - version: 3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(yaml@2.8.0)) + version: 3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0)) eslint: specifier: ^8.57.1 version: 8.57.1 eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + version: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: ^18.0.0 - version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) eslint-config-prettier: specifier: ^9.1.2 version: 9.1.2(eslint@8.57.1) @@ -269,7 +269,7 @@ importers: version: 0.4.0 eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@8.57.1) @@ -296,28 +296,28 @@ importers: version: 2.0.10 msw: specifier: ^2.14.6 - version: 2.14.6(@types/node@20.19.43)(typescript@5.9.3) + version: 2.14.6(@types/node@20.19.43)(typescript@7.0.2) prettier: specifier: ^3.9.4 version: 3.9.4 prettier-plugin-organize-imports: specifier: ^3.2.4 - version: 3.2.4(prettier@3.9.4)(typescript@5.9.3) + version: 3.2.4(prettier@3.9.4)(typescript@7.0.2) typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vite: specifier: ^6.4.3 version: 6.4.3(@types/node@20.19.43)(yaml@2.8.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@20.19.43)(rollup@4.61.1)(typescript@5.9.3)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) + version: 4.5.4(@types/node@20.19.43)(rollup@4.61.1)(typescript@7.0.2)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.9.3)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) + version: 4.3.2(typescript@7.0.2)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) vitest: specifier: ^3.2.7 - version: 3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(yaml@2.8.0) + version: 3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0) packages: @@ -2005,6 +2005,126 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -5075,9 +5195,9 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true ua-parser-js@1.0.40: @@ -7133,34 +7253,34 @@ snapshots: dependencies: '@types/node': 20.19.43 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.9.3) + ts-api-utils: 1.4.3(typescript@7.0.2) optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.1 eslint: 8.57.1 optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -7169,21 +7289,21 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@7.0.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) debug: 4.4.3 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.3) + ts-api-utils: 1.4.3(typescript@7.0.2) optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@7.0.2)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -7192,18 +7312,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.9 semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.3) + ts-api-utils: 1.4.3(typescript@7.0.2) optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@7.0.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -7214,6 +7334,66 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + '@ungap/structured-clone@1.3.0': {} '@upsetjs/venn.js@2.0.0': @@ -7229,7 +7409,7 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -7244,7 +7424,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(yaml@2.8.0) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -7256,13 +7436,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.7(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0))': + '@vitest/mocker@3.2.7(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.14.6(@types/node@20.19.43)(typescript@5.9.3) + msw: 2.14.6(@types/node@20.19.43)(typescript@7.0.2) vite: 6.4.3(@types/node@20.19.43)(yaml@2.8.0) '@vitest/pretty-format@3.2.7': @@ -7321,7 +7501,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.9.3)': + '@vue/language-core@2.2.0(typescript@7.0.2)': dependencies: '@volar/language-core': 2.4.23 '@vue/compiler-dom': 3.5.22 @@ -7332,7 +7512,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 '@vue/shared@3.5.22': {} @@ -8243,21 +8423,21 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1) object.assign: 4.1.7 object.entries: 1.1.9 semver: 6.3.1 - eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - eslint-plugin-import @@ -8283,17 +8463,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8304,7 +8484,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8316,7 +8496,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -9930,7 +10110,7 @@ snapshots: ms@2.1.3: {} - msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3): + msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2): dependencies: '@inquirer/confirm': 6.0.13(@types/node@20.19.43) '@mswjs/interceptors': 0.41.9 @@ -9951,7 +10131,7 @@ snapshots: until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - '@types/node' @@ -9980,14 +10160,13 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - notistack@3.0.2(csstype@3.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + notistack@3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 1.2.1 + csstype: 3.2.3 goober: 2.1.16(csstype@3.2.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - csstype object-assign@4.1.1: {} @@ -10188,10 +10367,10 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-organize-imports@3.2.4(prettier@3.9.4)(typescript@5.9.3): + prettier-plugin-organize-imports@3.2.4(prettier@3.9.4)(typescript@7.0.2): dependencies: prettier: 3.9.4 - typescript: 5.9.3 + typescript: 7.0.2 prettier@3.9.4: {} @@ -10991,15 +11170,15 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@5.9.3): + ts-api-utils@1.4.3(typescript@7.0.2): dependencies: - typescript: 5.9.3 + typescript: 7.0.2 ts-dedent@2.3.0: {} - tsconfck@3.1.6(typescript@5.9.3): + tsconfck@3.1.6(typescript@7.0.2): optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 tsconfig-paths@3.15.0: dependencies: @@ -11057,7 +11236,28 @@ snapshots: typescript@5.8.2: {} - typescript@5.9.3: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ua-parser-js@1.0.40: {} @@ -11222,18 +11422,18 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@20.19.43)(rollup@4.61.1)(typescript@5.9.3)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@20.19.43)(rollup@4.61.1)(typescript@7.0.2)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.54.0(@types/node@20.19.43) '@rollup/pluginutils': 5.3.0(rollup@4.61.1) '@volar/typescript': 2.4.23 - '@vue/language-core': 2.2.0(typescript@5.9.3) + '@vue/language-core': 2.2.0(typescript@7.0.2) compare-versions: 6.1.1 debug: 4.4.1 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.9.3 + typescript: 7.0.2 optionalDependencies: vite: 6.4.3(@types/node@20.19.43)(yaml@2.8.0) transitivePeerDependencies: @@ -11241,11 +11441,11 @@ snapshots: - rollup - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.9.3)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)): + vite-tsconfig-paths@4.3.2(typescript@7.0.2)(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) + tsconfck: 3.1.6(typescript@7.0.2) optionalDependencies: vite: 6.4.3(@types/node@20.19.43)(yaml@2.8.0) transitivePeerDependencies: @@ -11265,11 +11465,11 @@ snapshots: fsevents: 2.3.3 yaml: 2.8.0 - vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(yaml@2.8.0): + vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(msw@2.14.6(@types/node@20.19.43)(typescript@5.9.3))(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) + '@vitest/mocker': 3.2.7(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.7 '@vitest/snapshot': 3.2.7 diff --git a/ui/src/index.tsx b/ui/src/index.tsx index e3e86c4be..4afec650f 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -1,4 +1,4 @@ -import '@fontsource/roboto'; +import '@fontsource/roboto/index.css'; import App from 'components/app/App'; import 'i18n'; import 'index.css'; diff --git a/ui/tsconfig.json b/ui/tsconfig.json index c94b89579..cb9bf9051 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -23,7 +23,53 @@ /* for imports. */ "rootDir": "./src", - "paths": {}, + "paths": { + "api": [ + "./src/api/index.ts" + ], + "api/*": [ + "./src/api/*" + ], + "branding/*": [ + "./src/branding/*" + ], + "commons/*": [ + "./src/commons/*" + ], + "components/*": [ + "./src/components/*" + ], + "globals.d.ts": [ + "./src/globals.d.ts" + ], + "i18n": [ + "./src/i18n.ts" + ], + "index.css": [ + "./src/index.css" + ], + "locales/*": [ + "./src/locales/*" + ], + "models/*": [ + "./src/models/*" + ], + "plugins/*": [ + "./src/plugins/*" + ], + "rest": [ + "./src/rest/index.ts" + ], + "rest/*": [ + "./src/rest/*" + ], + "tests/*": [ + "./src/tests/*" + ], + "utils/*": [ + "./src/utils/*" + ] + }, "outDir": "dist" }, From 562e526de6e88dc7699a1569e181ad26d75ec2e5 Mon Sep 17 00:00:00 2001 From: Matthew Rafuse Date: Thu, 9 Jul 2026 14:27:50 -0400 Subject: [PATCH 04/13] chore(ui): move from prettier + eslint to oxlint + oxfmt --- .github/copilot-instructions.md | 86 +- .github/workflows/ui-workflow.yml | 6 +- .pre-commit-config.yaml | 15 +- .prettierignore | 2 - .vscode/extensions.json | 3 +- .vscode/settings.json | 13 +- documentation/docs/developer/frontend.fr.md | 7 +- documentation/docs/developer/frontend.md | 8 +- ui/.eslintrc | 151 - ui/.oxfmtrc.json | 14 + ui/.oxlintrc.json | 159 + ui/.prettierignore | 6 - ui/.prettierrc | 7 - ui/build_scripts/oxfmt.sh | 4 + ui/build_scripts/oxlint.sh | 4 + ui/build_scripts/prettier.sh | 4 - ui/package.json | 20 +- ui/pnpm-lock.yaml | 2557 ++++------------- ui/src/api/dossier/hit.ts | 2 +- ui/src/api/dossier/index.ts | 2 +- ui/src/api/hit/comments/react.ts | 2 +- ui/src/api/index.ts | 1 - ui/src/commons/components/app/AppSkeleton.tsx | 4 +- .../components/app/hooks/useAppSitemap.tsx | 4 +- .../app/providers/AppBreadcrumbsProvider.tsx | 2 +- ui/src/commons/components/display/AppToc.tsx | 2 +- .../components/display/hooks/useAppColor.tsx | 2 +- .../components/leftnav/LeftNavDrawer.tsx | 2 +- .../components/notification/Notification.tsx | 2 +- .../elements/NotificationEndOfPage.tsx | 2 +- .../commons/components/search/AppSearch.tsx | 2 +- .../commons/components/topnav/UserProfile.tsx | 2 +- .../utils/hooks/useFullscreenStatus.tsx | 6 +- ui/src/components/app/App.tsx | 4 +- ui/src/components/app/hooks/useMatchers.tsx | 10 +- .../app/providers/AnalyticProvider.tsx | 2 +- .../app/providers/AvatarProvider.tsx | 2 +- .../app/providers/FavouritesProvider.tsx | 2 +- .../app/providers/GridColumnsProvider.tsx | 2 +- .../components/app/providers/HitProvider.tsx | 2 +- .../app/providers/HitSearchProvider.tsx | 4 +- .../app/providers/LocalStorageProvider.tsx | 2 +- .../app/providers/ModalProvider.tsx | 1 + .../app/providers/OverviewProvider.tsx | 2 +- .../app/providers/ParameterProvider.tsx | 8 +- .../app/providers/SocketProvider.tsx | 6 +- .../components/app/providers/ViewProvider.tsx | 2 +- .../elements/display/ActionButton.tsx | 2 +- .../elements/display/HandlebarsMarkdown.tsx | 4 +- .../elements/display/HowlerAvatar.tsx | 4 +- .../elements/display/ItemManager.tsx | 2 +- .../components/elements/display/Markdown.tsx | 12 +- .../elements/display/handlebars/helpers.tsx | 6 +- .../elements/display/markdownPlugins/tabs.ts | 2 +- .../display/modals/ConfirmDeleteModal.tsx | 1 + .../display/modals/CreateActionModal.tsx | 2 +- ui/src/components/elements/hit/HitActions.tsx | 2 +- ui/src/components/elements/hit/HitBanner.tsx | 2 +- ui/src/components/elements/hit/HitCard.tsx | 2 +- .../components/elements/hit/HitComments.tsx | 4 +- .../elements/hit/HitContextMenu.tsx | 2 +- ui/src/components/elements/hit/HitDetails.tsx | 6 +- .../components/elements/hit/HitNotebooks.tsx | 6 +- ui/src/components/elements/hit/HitOutline.tsx | 2 +- ui/src/components/elements/hit/HitSummary.tsx | 2 +- ui/src/components/elements/hit/HitWorklog.tsx | 4 +- .../elements/hit/ResolvePivotUrl.ts | 2 +- .../elements/hit/aggregate/HitGraph.tsx | 2 +- .../elements/hit/grid/EnhancedCell.tsx | 2 +- .../components/elements/hit/grid/HitTable.tsx | 2 +- .../elements/hit/related/PivotLink.tsx | 10 +- ui/src/components/hooks/useLocalStorage.ts | 2 +- .../hooks/useLocalStorageItem.test.tsx | 2 +- ui/src/components/hooks/useMyApi.tsx | 4 +- ui/src/components/hooks/useMyPreferences.tsx | 422 ++- ui/src/components/hooks/useMySnackbar.tsx | 8 +- .../components/hooks/useMyUserFunctions.tsx | 2 +- ui/src/components/hooks/useMyUserList.tsx | 2 +- ui/src/components/hooks/useParamState.test.ts | 2 +- .../components/hooks/useScrollRestoration.tsx | 2 +- .../routes/action/edit/ActionEditor.tsx | 20 +- .../routes/action/shared/OperationStep.tsx | 4 +- .../routes/action/useMyActionFunctions.tsx | 2 +- .../routes/action/view/ActionDetails.tsx | 2 +- .../routes/action/view/ActionSearch.tsx | 8 +- .../routes/action/view/Integrations.tsx | 2 +- .../routes/admin/users/UserSearch.tsx | 4 +- .../routes/advanced/QueryBuilder.tsx | 2 +- .../routes/advanced/eqlTokenProvider.ts | 2 +- .../routes/advanced/luceneTokenProvider.ts | 2 +- .../routes/analytics/AnalyticComments.tsx | 2 +- .../routes/analytics/AnalyticSearch.tsx | 6 +- .../routes/analytics/widgets/Stacked.tsx | 2 +- .../routes/dossiers/DossierEditor.test.tsx | 2 +- .../routes/dossiers/DossierEditor.tsx | 2 +- .../components/routes/dossiers/Dossiers.tsx | 10 +- .../components/routes/dossiers/LeadForm.tsx | 2 +- .../components/routes/dossiers/PivotForm.tsx | 4 +- .../help/ActionIntroductionDocumentation.tsx | 2 +- .../routes/help/SearchDocumentation.tsx | 6 +- .../routes/hits/search/HitBrowser.tsx | 4 +- .../routes/hits/search/InformationPane.tsx | 8 +- .../routes/hits/search/SearchPane.tsx | 2 +- .../routes/hits/search/shared/CustomSort.tsx | 2 +- .../hits/search/shared/CustomSpan.test.tsx | 5 +- .../routes/hits/search/shared/HitSort.tsx | 2 +- .../routes/hits/search/shared/SearchSpan.tsx | 2 +- .../components/routes/hits/view/HitViewer.tsx | 6 +- ui/src/components/routes/home/ViewCard.tsx | 2 +- .../routes/overviews/OverviewViewer.tsx | 2 +- .../components/routes/overviews/Overviews.tsx | 10 +- .../routes/settings/LocalSection.tsx | 2 +- .../routes/templates/TemplateViewer.tsx | 2 +- .../components/routes/templates/Templates.tsx | 6 +- .../components/routes/views/ViewComposer.tsx | 6 +- ui/src/components/routes/views/Views.tsx | 6 +- ui/src/plugins/HowlerPlugin.ts | 14 +- ui/src/plugins/clue/helpers.tsx | 6 +- ui/src/plugins/clue/setup.ts | 4 +- ui/src/plugins/store.ts | 2 +- ui/src/rest/AxiosClient.ts | 4 +- ui/src/rest/index.ts | 2 +- ui/src/utils/localStorage.ts | 2 +- ui/src/utils/menuUtils.ts | 1 + ui/src/utils/sessionStorage.ts | 2 +- ui/src/utils/utils.ts | 6 +- ui/src/utils/xsrf.ts | 4 +- ui/tsconfig.json | 60 +- 128 files changed, 1307 insertions(+), 2636 deletions(-) delete mode 100644 .prettierignore delete mode 100644 ui/.eslintrc create mode 100644 ui/.oxfmtrc.json create mode 100644 ui/.oxlintrc.json delete mode 100644 ui/.prettierignore delete mode 100644 ui/.prettierrc create mode 100755 ui/build_scripts/oxfmt.sh create mode 100755 ui/build_scripts/oxlint.sh delete mode 100755 ui/build_scripts/prettier.sh diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 0e2bd71d8..d32911cc9 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -14,6 +14,7 @@ - Web-based frontend and REST API backend. **Primary Technologies:** + - Python (51.4%): Backend API (Flask), plugins, orchestration scripts. - TypeScript (48.4%): Web frontend (React, Vite, Vitest, pnpm). - Docker, Docker Compose: Local development, dev/demo, and deployment environments. @@ -43,6 +44,7 @@ Always ensure the correct versions are used. Inconsistent Python versions (<3.12 ### **Backend API (`api/`)** **Setup** + 1. Ensure `/etc/howler/conf`, `/var/cache/howler`, `/var/lib/howler`, `/var/log/howler` exist and are `$USER`-owned. 2. Configure Python (3.12+/venv), Poetry, Docker and Docker Compose as above. 3. Run: @@ -55,35 +57,40 @@ Always ensure the correct versions are used. Inconsistent Python versions (<3.12 ``` **Env Setup** + - Start backing services: ```bash (cd api/dev && docker-compose up) ``` **Run API Server** - ```bash - poetry run server - ``` + +```bash +poetry run server +``` **Test** - ```bash - # install test deps if not already - poetry install --with test - poetry run mitre /etc/howler/lookups - poetry run test - ``` + +```bash +# install test deps if not already +poetry install --with test +poetry run mitre /etc/howler/lookups +poetry run test +``` **Lint/Typecheck** - ```bash - poetry run ruff format howler --diff - poetry run ruff check howler --output-format=github - poetry run type_check - poetry run pyright --level warning - ``` + +```bash +poetry run ruff format howler --diff +poetry run ruff check howler --output-format=github +poetry run type_check +poetry run pyright --level warning +``` ### **Frontend UI (`ui/`)** **Setup** + 1. Install dependencies: ```bash cd ui @@ -91,21 +98,24 @@ Always ensure the correct versions are used. Inconsistent Python versions (<3.12 ``` **Lint/Check** - ```bash - pnpm run lint # Prettier - pnpm eslint src # ESLint - pnpm tsc --noEmit # TypeScript type-check - ``` + +```bash +pnpm run lint # oxfmt + oxlint +pnpm eslint src # ESLint +pnpm tsc --noEmit # TypeScript type-check +``` **Test** - ```bash - pnpm test - ``` + +```bash +pnpm test +``` **Dev Server** - ```bash - pnpm start # (or consult vite/README) - ``` + +```bash +pnpm start # (or consult vite/README) +``` #### **Client (`client/`)** @@ -141,6 +151,7 @@ poetry run test ### **Monorepo Root** Key directories: + - `.github/`: GitHub Actions workflows, dependabot, API tokens/GraphQL. - `api/`: Python backend API (Flask), builds, plugins, test infra. - `ui/`: TypeScript React frontend (Vite project). @@ -150,17 +161,20 @@ Key directories: - Build assets and configs, e.g., Helm charts in `howler-helm/`, Ansible in `ansible/`. **Root files:** + ``` README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json ``` **API Directory (`api/`):** + - `howler/`: main source - `build_scripts/`: utility/test/typecheck/generate scripts - `dev/`: Docker Compose, Keycloak, Elastic, Redis for local dev - `test/`: test suite **UI Directory (`ui/`):** + - `src/`: main TypeScript source (React) - `build_scripts/`: e.g., lint_staged.sh - `public/` @@ -169,10 +183,11 @@ README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json **Plugins structure:** Follows Python package/plugin conventions. ### **Configuration & Linting** + - **Pre-commit** via `.pre-commit-config.yaml` (Ruff, formatters, commit message, poetry lock check). - **Type checks** for Python (Ruff, mypy, pyright). - **Type checks** for frontend (TypeScript). -- **Formatting**: Prettier for UI, Ruff for Python. +- **Formatting**: oxfmt and oxlint for UI, Ruff for Python. ### **Frontend UI Unit Tests** @@ -186,10 +201,15 @@ README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json - `setupLocalStorageMock()` — replaces `window.localStorage` with a `MockLocalStorage` instance whose `getItem`/`setItem`/`removeItem`/`clear` methods are Vitest spies. Call `mockLocalStorage.clear()` and clear the spies in `beforeEach`. - `setupContextSelectorMock()` — re-wires `use-context-selector` to use React's native context so providers work without the full library in tests. - `setupReactRouterMock()` — stubs `react-router-dom` (location, params, navigate, etc.). -- **`MockLocalStorage` caveat**: `setItem` stores values as strings (`this[key] = \`${val}\``). The key `'key'` is a reserved property name on the object and is read-only — **do not use `'key'` as a storage key in tests**; use descriptive names like `'testkey'`. +- **`MockLocalStorage` caveat**: `setItem` stores values as strings (`this[key] = \`${val}\``). The key `'key'`is a reserved property name on the object and is read-only — **do not use`'key'`as a storage key in tests**; use descriptive names like`'testkey'`. - **Cross-tab events**: jsdom does not propagate `StorageEvent` automatically. Dispatch them manually: ```ts - window.dispatchEvent(new StorageEvent('storage', { key: 'mykey', newValue: JSON.stringify(value) })); + window.dispatchEvent( + new StorageEvent("storage", { + key: "mykey", + newValue: JSON.stringify(value), + }), + ); ``` The `key` field of the event **must exactly match** the key string the hook was initialized with. - **Hook state updates** must be wrapped in `act()`; assertions go after the `act()` call. @@ -204,9 +224,10 @@ README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json - `.github/workflows/sentinel-plugin-workflow.yml` **Checks include:** + - Install deps (with lockfile validation). - Typecheck (Ruff/mypy/pyright for Python, tsc for TypeScript). -- Lint/format (Ruff, Prettier, ESLint). +- Lint/format (Ruff, oxfmt, oxlint). - Complete test suite. - PR title validation (.github/workflows/pr-title-check.yml). - All jobs **must pass** for UI/API/plugins—PRs will be blocked otherwise. @@ -266,13 +287,14 @@ README.md, LICENSE, .gitignore, .pre-commit-config.yaml, pyrightconfig.json ### Changelog Entries for Bug Fixes When both of the following are true: + 1. The agent is relatively confident in a bug fix (i.e. root cause identified, fix verified by tests), AND 2. The current branch is a trunk branch (`develop`, `main`) or a patch/RC branch (e.g. `patch/*`, `rc/*`) ...then a changelog entry **must** be added to `docs/RELEASES.md` under the appropriate version heading before finishing the task. Follow the existing format: ```markdown -- **Short Title** *(bugfix)*: One-sentence description of what was broken and what was fixed. +- **Short Title** _(bugfix)_: One-sentence description of what was broken and what was fixed. ``` --- @@ -290,6 +312,7 @@ function myFn(arg: T): T { ... } ``` For overloaded functions, express overload signatures as a typed `const`: + ```ts const myFn: { (key: string, list?: false): Scalar; @@ -304,6 +327,7 @@ const myFn: { **This repository's VS Code settings suppress terminal output from being returned to the agent.** Running commands via the terminal tool will yield no output — the terminal appears to complete with exit code 0 but all stdout/stderr is suppressed. **Workaround**: Ask the user to run the command and paste the result back. Phrase it clearly: + > "I can't read terminal output due to repository settings. Please run `` and share the result." The correct test command for the API is `poetry run test ` (not `pytest` directly), run from the `api/` directory. diff --git a/.github/workflows/ui-workflow.yml b/.github/workflows/ui-workflow.yml index 00ed42454..16511d780 100644 --- a/.github/workflows/ui-workflow.yml +++ b/.github/workflows/ui-workflow.yml @@ -90,11 +90,11 @@ jobs: - name: Run type checking run: pnpm tsc --noEmit - - name: Run prettier formatting checks - run: pnpm run lint + - name: Run oxfmt checks + run: pnpm oxfmt src --check - name: Run eslint linter checks - run: pnpm eslint src + run: pnpm oxlint src - name: Run Unit Tests run: pnpm test diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e215cb994..f4d075d24 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,6 +19,15 @@ repos: # hooks: # - id: conventional-pre-commit # stages: [commit-msg] + - repo: https://github.com/oxc-project/mirrors-oxfmt + rev: v0.58.0 # Replace with your current oxfmt version + hooks: + - id: oxfmt + - repo: https://github.com/oxc-project/mirrors-oxlint + rev: v1.73.0 # Replace with the latest oxlint release tag + hooks: + - id: oxlint + args: [--fix] # Auto-fixes rules like removing unused imports - repo: local hooks: - id: poetry-check-api @@ -49,12 +58,6 @@ repos: language: script stages: [pre-commit] files: ^plugins/sentinel/.*\.(toml|lock) - - id: prettier - name: prettier - entry: ui/build_scripts/prettier.sh - language: script - stages: [pre-commit] - files: ^ui/.* - id: bad-ui-imports name: Check for bad UI imports entry: ui/build_scripts/find_bad_imports.py diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index e7f5aa9a5..000000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -ui/src/locales/**/*.json -ui/src/plugins/clue/locales/*.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json index a33f54b51..c338f1a25 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,7 +6,6 @@ "ms-python.vscode-pylance", "charliermarsh.ruff", "github.vscode-github-actions", - "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint" + "oxc.oxc-vscode", ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 50fabec16..c045e2265 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,10 +6,10 @@ "typescriptreact" ], "[css]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[json]": { "editor.defaultFormatter": "vscode.json-language-features" @@ -18,16 +18,16 @@ "editor.defaultFormatter": "vscode.json-language-features" }, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[javascriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[yaml]": { "editor.insertSpaces": true, @@ -97,7 +97,6 @@ "eslint.workingDirectories": [ { "directory": "./ui", "changeProcessCWD": true } ], - "prettier.configPath": "ui/.prettierrc", "search.exclude": { "**/node_modules": true, "**/bower_components": true, diff --git a/documentation/docs/developer/frontend.fr.md b/documentation/docs/developer/frontend.fr.md index 1db1e738d..7fd689589 100644 --- a/documentation/docs/developer/frontend.fr.md +++ b/documentation/docs/developer/frontend.fr.md @@ -28,7 +28,7 @@ L'interface utilisateur fournit plusieurs scripts npm pour le développement : - `pnpm dev` ou `pnpm start` - Démarrer le serveur de développement Vite - `pnpm build` - Construire l'application pour la production (exécute le compilateur TypeScript et la construction Vite) - `pnpm serve` - Prévisualiser la construction de production localement -- `pnpm lint` - Formater le code en utilisant Prettier +- `pnpm lint` - Formater le code en utilisant oxfmt et oxlint - `pnpm test` - Exécuter les tests avec couverture en utilisant Vitest - `pnpm test-ui` - Exécuter les tests avec interface et couverture @@ -67,10 +67,9 @@ L'interface utilisateur Howler est construite avec des technologies web modernes ### Outils de développement - **Vitest** - Framework de tests unitaires rapide (natif Vite) -- **ESLint** - Linting de code avec intégration TypeScript, React et Prettier -- **Prettier** - Formatage de code +- **oxfmt et oxlint** - Formatage et Linting de code avec intégration TypeScript, React ## Visual Studio Code Si vous développez dans VS Code, il est recommandé d'installer les extensions recommandées de l'espace de travail pour -le support intégré de Prettier et ESLint. Celles-ci se trouvent dans le fichier `.vscode/extensions.json`. +le support intégré de oxfmt et oxlint. Celles-ci se trouvent dans le fichier `.vscode/extensions.json`. diff --git a/documentation/docs/developer/frontend.md b/documentation/docs/developer/frontend.md index b519d9648..448a043f9 100644 --- a/documentation/docs/developer/frontend.md +++ b/documentation/docs/developer/frontend.md @@ -28,7 +28,7 @@ The UI provides several npm scripts for development: - `pnpm dev` or `pnpm start` - Start the Vite development server - `pnpm build` - Build the application for production (runs TypeScript compiler and Vite build) - `pnpm serve` - Preview the production build locally -- `pnpm lint` - Format code using Prettier +- `pnpm lint` - Format code using oxfmt and oxlint - `pnpm test` - Run tests with coverage using Vitest - `pnpm test-ui` - Run tests with UI and coverage @@ -67,10 +67,8 @@ The Howler UI is built with modern web technologies: ### Development Tools - **Vitest** - Fast unit testing framework (Vite-native) -- **ESLint** - Code linting with TypeScript, React, and Prettier integration -- **Prettier** - Code formatting +- **oxfmt and oxlint** - Code linting and formatting with TypeScript, React integration ## Visual Studio Code -If developing in VS Code, it is recommended to install the workspace's recommended extensions for built-in Prettier and -ESLint support. These can be found in the `.vscode/extensions.json` file. +If developing in VS Code, it is recommended to install the workspace's recommended extensions for built-in oxfmt and oxlint support. These can be found in the `.vscode/extensions.json` file. diff --git a/ui/.eslintrc b/ui/.eslintrc deleted file mode 100644 index 525de19c5..000000000 --- a/ui/.eslintrc +++ /dev/null @@ -1,151 +0,0 @@ -{ - "extends": ["airbnb-typescript", "prettier", "plugin:import/recommended", "plugin:react/recommended"], - "parser": "@typescript-eslint/parser", - "ignorePatterns": ["vite.config.ts", "src/commons/**"], - "parserOptions": { - "project": "tsconfig.json" - }, - "plugins": ["@typescript-eslint", "prettier", "react-hooks", "import", "jsx-a11y", "prefer-arrow"], - "env": { - "browser": true, - "es6": true, - "mocha": true, - "node": true - }, - "settings": { - // Needed to help eslint understand absolute imports, at least for intellij. - "import/resolver": { - "node": { - "paths": ["src"] - } - }, - "react": { "version": "detect" } - }, - "overrides": [ - { - "files": ["src/models/entities/generated/**"], - "rules": { "@typescript-eslint/ban-types": "off" } - }, - - { - "files": ["src/**/*.test.tsx"], - "rules": { "import/imports-first": "off", "react-hooks/rules-of-hooks": "off", "react/jsx-no-literals": "off" } - } - ], - "rules": { - "import/no-unresolved": [ - "error", - { - "ignore": [ - "uuid" - ] - } - ], - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/space-before-function-paren": "off", - "@typescript-eslint/lines-between-class-members": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/naming-convention": [ - "error", - // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables (23.10) - { - "selector": "variable", - "format": ["camelCase", "PascalCase", "UPPER_CASE"], - "leadingUnderscore": "allow" - }, - // Allow camelCase functions (23.2), and PascalCase functions (23.8) - { - "selector": "function", - "format": ["camelCase", "PascalCase"], - "leadingUnderscore": "allow" - }, - // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make TypeScript recommendations, we are assuming this rule would similarly apply to anything "type like", including interfaces, type aliases, and enums - { - "selector": "typeLike", - "format": ["PascalCase"] - } - ], - "arrow-parens": ["error", "as-needed"], - "import/no-extraneous-dependencies": ["error", { "packageDir": "./" }], - "import/imports-first": ["error", "absolute-first"], - "import/newline-after-import": "error", - "import/no-cycle": "warn", - "jsx-a11y/anchor-is-valid": [ - "error", - { - "components": ["Link"], - "specialLink": ["to", "hrefLeft", "hrefRight"], - "aspects": ["noHref", "invalidHref", "preferButton"] - } - ], - "jsx-a11y/control-has-associated-label": "off", - "jsx-a11y/label-has-associated-control": "off", - "linebreak-style": "off", - "max-len": [ - "off", - { - "code": 120, - "ignoreRegExpLiterals": true, - "tabWidth": 2, - "ignoreComments": true - } - ], - "no-console": [1], - "no-nested-ternary": "off", - "no-plusplus": "off", - "no-underscore-dangle": "off", - "radix": "off", - "react/jsx-filename-extension": [ - 1, - { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - ], - "react/jsx-curly-newline": "off", - "react/jsx-one-expression-per-line": ["off", { "allow": "literal" }], - "react/jsx-props-no-spreading": "off", - "react/jsx-wrap-multilines": "off", - "react/no-array-index-key": "warn", - "react/prop-types": "off", - "react-hooks/rules-of-hooks": "error", // Checks rules of Hooks - "react-hooks/exhaustive-deps": "warn", // Checks effect dependencies - "semi": "error", - "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off", - "react/display-name": "off", - "react/jsx-no-literals": [ - "warn", - { - "noStrings": false, - "allowedStrings": ["/", ":", "(", ")", ": ", "-", "."], - "ignoreProps": false, - "noAttributeStrings": false - } - ], - "prefer-arrow/prefer-arrow-functions": [ - "warn", - { - "disallowPrototype": true, - "singleReturnOnly": false, - "classPropertiesAllowed": false - } - ], - "react/function-component-definition": ["error", { "namedComponents": "arrow-function" }], - "prefer-arrow-callback": ["warn", { "allowNamedFunctions": true }], - "func-style": ["warn", "expression", { "allowArrowFunctions": true }] - }, - "globals": { - "window": true, - "document": true, - "localStorage": true, - "FormData": true, - "FileReader": true, - "Blob": true, - "navigator": true, - "Headers": true, - "Request": true, - "fetch": true - } -} diff --git a/ui/.oxfmtrc.json b/ui/.oxfmtrc.json new file mode 100644 index 000000000..7f1ac5fde --- /dev/null +++ b/ui/.oxfmtrc.json @@ -0,0 +1,14 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "arrowParens": "avoid", + "printWidth": 120, + "singleQuote": true, + "trailingComma": "none", + "sortPackageJson": false, + "ignorePatterns": [ + "src/models/entities/generated", + "src/locales/en/**/*.json", + "src/locales/fr/**/*.json", + "src/plugins/clue/locales/*.json" + ] +} diff --git a/ui/.oxlintrc.json b/ui/.oxlintrc.json new file mode 100644 index 000000000..8c3dfd513 --- /dev/null +++ b/ui/.oxlintrc.json @@ -0,0 +1,159 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": [ + "unicorn", + "import", + "react", + "typescript", + "jsx-a11y" + ], + "categories": { + "correctness": "off" + }, + "env": { + "builtin": true, + "es2018": true, + "commonjs": true, + "mocha": true + }, + "ignorePatterns": [ + "vite.config.ts", + "src/commons/**", + "src/commons_deprecated/**", + "build/**", + "src/react-app-env.d.ts", + "src/serviceWorker.ts", + "src/config-overrides.js" + ], + "rules": { + "import/namespace": "error", + "import/default": "error", + "import/no-named-as-default": "warn", + "import/no-named-as-default-member": "warn", + "import/no-duplicates": "warn", + "react/jsx-key": "error", + "react/jsx-no-comment-textnodes": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-target-blank": "error", + "react/jsx-no-undef": "error", + "react/no-children-prop": "error", + "react/no-danger-with-children": "error", + "react/no-direct-mutation-state": "error", + "react/no-find-dom-node": "error", + "react/no-is-mounted": "error", + "react/no-render-return-value": "error", + "react/no-string-refs": "error", + "react/no-unescaped-entities": "error", + "react/no-unknown-property": "error", + "import/newline-after-import": "error", + "import/no-cycle": "warn", + "jsx-a11y/anchor-is-valid": [ + "error", + { + "components": [ + "Link" + ], + "specialLink": [ + "to", + "hrefLeft", + "hrefRight" + ], + "aspects": [ + "noHref", + "invalidHref", + "preferButton" + ] + } + ], + "no-console": [ + "warn" + ], + "react/jsx-filename-extension": [ + "warn", + { + "extensions": [ + ".js", + ".jsx", + ".ts", + ".tsx" + ] + } + ], + "react/no-array-index-key": "warn", + "react/jsx-no-literals": [ + "warn", + { + "noStrings": false, + "allowedStrings": [ + "/", + ":", + "(", + ")", + ": ", + "-", + "." + ], + "ignoreProps": false, + "noAttributeStrings": false + } + ], + "eslint/prefer-arrow-callback": "warn", + "prefer-arrow-callback": [ + "warn", + { + "allowNamedFunctions": true + } + ], + "func-style": [ + "warn", + "expression", + { + "allowArrowFunctions": true + } + ], + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_" + } + ], + "react/rules-of-hooks": "error", + "react/exhaustive-deps": "warn", + "typescript/consistent-type-imports": "error" + }, + "overrides": [ + { + "files": [ + "src/components/routes/help/SearchDocumentation.tsx" + ], + "rules": { + "react/jsx-no-literals": "off" + } + }, + { + "files": [ + "src/models/entities/generated/**" + ], + "rules": { + "typescript/ban-types": "off" + } + }, + { + "files": [ + "src/**/*.test.tsx" + ], + "rules": { + "react/jsx-no-literals": "off", + "react/rules-of-hooks": "off" + } + }, + { + "files": [ + "src/api/**/*.ts" + ], + "rules": { + "import/no-cycle": "off", + } + } + ] +} diff --git a/ui/.prettierignore b/ui/.prettierignore deleted file mode 100644 index 82afe3e59..000000000 --- a/ui/.prettierignore +++ /dev/null @@ -1,6 +0,0 @@ -# Ignore autogenerated code -src/models/entities/generated - -src/locales/en/**/*.json -src/locales/fr/**/*.json -src/plugins/clue/locales/*.json diff --git a/ui/.prettierrc b/ui/.prettierrc deleted file mode 100644 index 0c621f82f..000000000 --- a/ui/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "arrowParens": "avoid", - "printWidth": 120, - "singleQuote": true, - "trailingComma": "none", - "plugins": ["prettier-plugin-organize-imports"] -} diff --git a/ui/build_scripts/oxfmt.sh b/ui/build_scripts/oxfmt.sh new file mode 100755 index 000000000..1b2f28fa7 --- /dev/null +++ b/ui/build_scripts/oxfmt.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd $(dirname $(dirname $0)) +pwd +pnpx oxfmt src diff --git a/ui/build_scripts/oxlint.sh b/ui/build_scripts/oxlint.sh new file mode 100755 index 000000000..1491e49c8 --- /dev/null +++ b/ui/build_scripts/oxlint.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd $(dirname $(dirname $0)) +pwd +pnpx oxlint --fix src diff --git a/ui/build_scripts/prettier.sh b/ui/build_scripts/prettier.sh deleted file mode 100755 index c942203e3..000000000 --- a/ui/build_scripts/prettier.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -cd $(dirname $(dirname $0)) -pwd -npx prettier -c -w src --cache --cache-strategy metadata diff --git a/ui/package.json b/ui/package.json index 208b8adc4..9b0a7118b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -89,28 +89,14 @@ "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", "@types/uuid": "^9.0.8", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", "@vitejs/plugin-react-swc": "^3.11.0", "@vitest/coverage-v8": "^3.2.7", - "eslint": "^8.57.1", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-prettier": "^9.1.2", - "eslint-config-react": "^1.1.7", - "eslint-import-resolver-node": "^0.4.0", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-prettier": "^5.5.6", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.5.3", "glob": "^11.1.0", "http-proxy-middleware": "^2.0.10", "msw": "^2.14.6", - "prettier": "^3.9.4", - "prettier-plugin-organize-imports": "^3.2.4", + "oxfmt": "^0.58.0", + "oxlint": "^1.73.0", "typescript": "^7.0.2", "vite": "^6.4.3", "vite-plugin-dts": "^4.5.4", @@ -143,7 +129,7 @@ "build": "tsc && vite build", "build-lib": "tsc && python build_scripts/prep_for_publish.py", "dev": "vite -l info", - "lint": "prettier -w --config .prettierrc src", + "lint": "oxlint --fix && oxfmt src", "preinstall": "npx only-allow pnpm", "serve": "vite preview", "start": "vite -l info", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index a086ea984..cd42be78e 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -237,57 +237,15 @@ importers: '@types/uuid': specifier: ^9.0.8 version: 9.0.8 - '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2) - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@7.0.2) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.4.3(@types/node@20.19.43)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.2.7 version: 3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(jsdom@28.1.0)(msw@2.14.6(@types/node@20.19.43)(typescript@7.0.2))(yaml@2.8.0)) - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-config-airbnb-base: - specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-config-airbnb-typescript: - specifier: ^18.0.0 - version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-config-prettier: - specifier: ^9.1.2 - version: 9.1.2(eslint@8.57.1) - eslint-config-react: - specifier: ^1.1.7 - version: 1.1.7 - eslint-import-resolver-node: - specifier: ^0.4.0 - version: 0.4.0 - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1) - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@8.57.1) eslint-plugin-prefer-arrow: specifier: ^1.2.3 - version: 1.2.3(eslint@8.57.1) - eslint-plugin-prettier: - specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.9.4) - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.5.3 - version: 0.5.3(eslint@8.57.1) + version: 1.2.3(eslint@10.6.0) glob: specifier: ^11.1.0 version: 11.1.0 @@ -297,12 +255,12 @@ importers: msw: specifier: ^2.14.6 version: 2.14.6(@types/node@20.19.43)(typescript@7.0.2) - prettier: - specifier: ^3.9.4 - version: 3.9.4 - prettier-plugin-organize-imports: - specifier: ^3.2.4 - version: 3.2.4(prettier@3.9.4)(typescript@7.0.2) + oxfmt: + specifier: ^0.58.0 + version: 0.58.0 + oxlint: + specifier: ^1.73.0 + version: 1.73.0 typescript: specifier: ^7.0.2 version: 7.0.2 @@ -718,23 +676,35 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.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/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@exodus/bytes@1.15.0': resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} @@ -982,18 +952,25 @@ packages: engines: {node: '>=6'} hasBin: true - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@iconify/icons-logos@1.2.36': resolution: {integrity: sha512-RVdZE9figuWmd8HeVmM8oQvOdv/4YzXV6lZ+G9QJgzCB/VBLV0inPltZxOt939oj4GbKbr7PF6J4bADMua/GPw==} @@ -1322,18 +1299,6 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -1346,14 +1311,254 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@oxfmt/binding-android-arm-eabi@0.58.0': + resolution: {integrity: sha512-Uz62sHduGGPftXtILGyxdSW4PX82rUg+rfdNqhsgxe881g4rIoXlIqmZQ6HVKcF4f+F8qMhdD03Bx5u7gmeTdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.58.0': + resolution: {integrity: sha512-rD0lRaJp1b+9vw6X4A2dJWKukd6X8yxiicN4JxXcXayolmUypRZxk+lKR+fVOu5q/iYc0fh5fR4bgmfOfVlbaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.58.0': + resolution: {integrity: sha512-uzbPPk7O6M+w2K65vcQ1woga3wgP8zghjL1KOG5b6qJ8dvYHZJ1VShaslg2KOK6yQIwCQtcMCXqLBM6sqXUNTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.58.0': + resolution: {integrity: sha512-L0nKYDxU32oxeQqJj21W9SlIMnf81VZEhyah6iDvFhf5q0oynq498Fopth7blErUJVBpVtxQ98RMCfMPqpJX6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.58.0': + resolution: {integrity: sha512-woNwfD58dC5PGS9LSLSD5JYfo/EFK5iG9vhDWkcCg3q78ag7KC8bpDqgvPHrMoXpx83OLXxoSOhu6z8FsVTHlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.58.0': + resolution: {integrity: sha512-Sqs8nMLxuQpY21NKJ1u4stPDmO5hskBCNNh2E3AdCfI1QqWtf4m+Qn4mGEIUO4KGmuq3SWc/SZ80uy5IiwTCDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.58.0': + resolution: {integrity: sha512-Vd4exzBI5B5hB9m22JiTQzIL23WvHo/Pe+sNXPNeBLXSP9swCBPKCEBRwKpmpQzYhlgYaCgfPcGXPKAJBRIiZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.58.0': + resolution: {integrity: sha512-bUWi5mHV+4Vi56RLHE1h6q/HHfwAIT3XoB9vJAVeRzfu5NriXM8y6eeJu0vlKa0C9kq2rq1sOWRClhdLHPocrg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.58.0': + resolution: {integrity: sha512-2ZHxemzgHcjtktAuVUwSoyXmGo/t+aF5tS1ciPpPei4rhSyrz3JOqDosXXrmhN/yLUSzJjtuW7ToTWqfQpCj2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.58.0': + resolution: {integrity: sha512-AwKkVwjVmFQ3bcO7j0McGYAqCKH2a326fswfofng/E8VewCT/raeeGQr4huVhY704deK8AWASSTlxzMj0eZc6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.58.0': + resolution: {integrity: sha512-xsRpTxfUnJF8D3AUKko/qyWdjw4GZVHlCVFuGlzSCTeewLmykKINW8em1+wx+axsDVtJJcMtvsiaXggXxrlHgw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.58.0': + resolution: {integrity: sha512-Z4AYOTcy7nYEIiXwD62PlerimyYRcfJOgUbQAEBjXz098kxKuERBlRntofGy69HHhe9E0TLVNMl1yspVNu+efw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.58.0': + resolution: {integrity: sha512-A3nhhtZPC/TKVWOPj9q/H3p2znJDCcHWYlJBhWL8hGq/bFmBaNBHC8Np6E581yVq1w9Mi3rMDNzDalWvtUfJtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.58.0': + resolution: {integrity: sha512-2g+tVkgwqphw8R4hgo+kF4oz8+P5RwVOtr9+irsC7uwEp0e9j7Crw8kDGKL20uYlLPD7g02DqA61mC/UNYx98A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.58.0': + resolution: {integrity: sha512-rc15P6AbyyB7426aN8AakLd02Trb3a6ML/mmfAQeVHJEfVofWLcWIrBdy6zDEY+DIaL/s8E4GGPboVw+oP3+EA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.58.0': + resolution: {integrity: sha512-ZWoTM27/HYPOh9iq86DAbhPu9nXb8qKvvGU/h8OfliyVUFAMMNTLDkGsWDKKnDqIkqvZ9+dXlgUOsH1LYO3O7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.58.0': + resolution: {integrity: sha512-LHZnqFXe2dEfkRI4XdZS/57nEOT/I4UCRX5IyM9v4GYW9XwQCjGe1IUK59SuKw3POwvcgWQ4pme2cYXmNqTNPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.58.0': + resolution: {integrity: sha512-mZKpg20TpheCJym1rarcZCUJeW1sSruw8zAAaCYWvuVfwIUDN1CXdrPU/JgCWReXTCTrEfCB8Wyo3hh9jSZ2EA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.58.0': + resolution: {integrity: sha512-N/wUU4N5PZ2orBtI+Ko7MnMfYLfE7K91UrGMY/c/pYyHR3lA9kwst1XugkZx+92YcRh/Eo+iv2eTESSWXfiZPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.73.0': + resolution: {integrity: sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.73.0': + resolution: {integrity: sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.73.0': + resolution: {integrity: sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.73.0': + resolution: {integrity: sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.73.0': + resolution: {integrity: sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': + resolution: {integrity: sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.73.0': + resolution: {integrity: sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.73.0': + resolution: {integrity: sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.73.0': + resolution: {integrity: sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.73.0': + resolution: {integrity: sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.73.0': + resolution: {integrity: sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.73.0': + resolution: {integrity: sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.73.0': + resolution: {integrity: sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.73.0': + resolution: {integrity: sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.73.0': + resolution: {integrity: sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.73.0': + resolution: {integrity: sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.73.0': + resolution: {integrity: sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.73.0': + resolution: {integrity: sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.73.0': + resolution: {integrity: sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.3.6': - resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} - engines: {node: ^14.18.0 || >=16.0.0} - '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -1541,9 +1746,6 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/node-core-library@5.18.0': resolution: {integrity: sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==} peerDependencies: @@ -1805,12 +2007,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -1847,9 +2049,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} @@ -1947,64 +2146,6 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -2213,13 +2354,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -2304,9 +2440,6 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2314,45 +2447,9 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - array-push-at-sort-position@4.0.1: resolution: {integrity: sha512-KdtdxZmp+j6n+jiekMbBRO/TOVP7oEadrJ+M4jB0Oe1VHZHS1Uwzx5lsvFN4juNZtHNA1l1fvcEs/SDmdoXL3w==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - as-typed@1.3.2: resolution: {integrity: sha512-94ezeKlKB97OJUyMaU7dQUAB+Cmjlgr4T9/cxCoKaLM4F2HAmuIHm3Q5ClGCsX5PvRwCQehCzAa/6foRFXRbqA==} @@ -2360,16 +2457,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-v8-to-istanbul@0.3.12: resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2377,20 +2467,12 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - axios-retry@3.9.1: resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} axios@1.18.1: resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -2415,14 +2497,11 @@ packages: resolution: {integrity: sha512-Pu9LnLdNIpUI6nSSTSJW1IlmTmPVMCJHqr/atIigdeJYTDAI/198AvnAbxuSrCxiJLoTCNiPBzdpHEJMjOZiAQ==} engines: {node: '>=16'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.1.2: + resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -2447,10 +2526,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bind@1.0.9: resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} @@ -2470,10 +2545,6 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -2581,18 +2652,12 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2796,25 +2861,10 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - dayjs@1.10.7: resolution: {integrity: sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==} @@ -2824,14 +2874,6 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -2874,10 +2916,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} @@ -2899,18 +2937,6 @@ packages: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -2954,10 +2980,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -2966,29 +2988,17 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - es-toolkit@1.49.0: resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} @@ -3009,132 +3019,43 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-airbnb-base@15.0.0: - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} + eslint-plugin-prefer-arrow@1.2.3: + resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 + eslint: '>=2.0.0' - eslint-config-airbnb-typescript@18.0.0: - resolution: {integrity: sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^7.0.0 - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: - eslint: '>=7.0.0' - - eslint-config-react@1.1.7: - resolution: {integrity: sha512-P4Z6u68wf0BvIvZNu+U8uQsk3DcZ1CcCI1XpUkJlG6vOa+iVcSQLgE01f2DB2kXlKRcT8/3dsH+wveLgvEgbkQ==} - - eslint-import-resolver-node@0.3.10: - resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - - eslint-import-resolver-node@0.4.0: - resolution: {integrity: sha512-wV22NewD4lwrMp94THds3/MjW7qPYupLj3wxLZCYkKrSLfVslRS/7lcbogiEwn9oT4cunDDCsTiBo/V16WlEUQ==} - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-prefer-arrow@1.2.3: - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' - - eslint-plugin-prettier@5.5.6: - resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-refresh@0.5.3: - resolution: {integrity: sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==} - peerDependencies: - eslint: ^9 || ^10 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -3178,13 +3099,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -3203,9 +3117,6 @@ packages: fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} @@ -3222,9 +3133,9 @@ packages: picomatch: optional: true - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -3240,9 +3151,9 @@ packages: firebase@11.10.0: resolution: {integrity: sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flat@6.0.1: resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} @@ -3281,9 +3192,6 @@ packages: resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3292,13 +3200,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fuse.js@7.4.2: resolution: {integrity: sha512-LVbzjD4WA6UP5B1UnP8wuaXJiLnqMdM/E4fiJXTJ5haJ5b/MBNsK29h2fm6swEoQaVQjvYFWKLE2RanyZIoRVQ==} engines: {node: '>=10'} @@ -3332,14 +3233,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -3355,22 +3248,6 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -3386,9 +3263,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-ws@5.16.2: resolution: {integrity: sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==} engines: {node: '>=10'} @@ -3420,10 +3294,6 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3431,10 +3301,6 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -3443,14 +3309,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} - engines: {node: '>= 0.4'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -3590,20 +3448,12 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -3627,28 +3477,12 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.4: resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -3656,22 +3490,10 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} @@ -3682,10 +3504,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -3704,35 +3522,19 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - is-my-ip-valid@1.0.1: resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} is-my-json-valid@2.20.6: resolution: {integrity: sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -3755,41 +3557,10 @@ packages: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3818,10 +3589,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -3844,10 +3611,6 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - jsdom@28.1.0: resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -3880,10 +3643,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -3894,10 +3653,6 @@ packages: jsonschema-key-compression@1.7.0: resolution: {integrity: sha512-l3RxhqT+IIp7He/BQ6Ao9PvK2rOa0sJse1ZoaJIKpiY1RC9Sy4GRhweDtxRGnQe8kuPOedTIE5Dq36fSYCFwnA==} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true @@ -3911,13 +3666,6 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -3953,9 +3701,6 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -4086,10 +3831,6 @@ packages: memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - mermaid@11.16.0: resolution: {integrity: sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==} @@ -4210,9 +3951,6 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -4313,10 +4051,6 @@ packages: resolution: {integrity: sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg==} engines: {node: '>=10.0.0'} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} - notistack@3.0.2: resolution: {integrity: sha512-0R+/arLYbK5Hh7mEfR2adt0tyXJcCC9KkA2hc56FeWik2QN6Bm/S4uW+BjzDARsJth5u06nTjelSw/VSnB1YEA==} engines: {node: '>=12.0.0', npm: '>=6.0.0'} @@ -4328,34 +4062,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - oblivious-set@1.4.0: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} @@ -4364,9 +4070,6 @@ packages: resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==} engines: {node: '>=16'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4374,9 +4077,31 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + oxfmt@0.58.0: + resolution: {integrity: sha512-8feG/7NVEHDVwc1OUpP6Pks+TnaDFUw2jLLFIMi5bcmmwxAX2wBQvjSzj62RRTYBf2Op1Wt8xbkmagmPTR5ETg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.73.0: + resolution: {integrity: sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.24.0' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -4434,10 +4159,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4506,28 +4227,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - - prettier-plugin-organize-imports@3.2.4: - resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} - peerDependencies: - '@volar/vue-language-plugin-pug': ^1.0.4 - '@volar/vue-typescript': ^1.0.4 - prettier: '>=2.0' - typescript: '>=2.9' - peerDependenciesMeta: - '@volar/vue-language-plugin-pug': - optional: true - '@volar/vue-typescript': - optional: true - - prettier@3.9.4: - resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} - engines: {node: '>=14'} - hasBin: true - pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4701,17 +4400,9 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - rehype-mathjax@7.1.0: resolution: {integrity: sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==} @@ -4759,27 +4450,9 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - resolve@2.0.0-next.7: - resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} - engines: {node: '>= 0.4'} - hasBin: true - rettime@0.11.11: resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} @@ -4791,9 +4464,6 @@ packages: roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -4806,17 +4476,9 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -4837,10 +4499,6 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -4863,14 +4521,6 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4879,30 +4529,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -4916,10 +4542,6 @@ packages: simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -4961,10 +4583,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -4980,29 +4598,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -5017,10 +4612,6 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -5059,10 +4650,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.13: - resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} - engines: {node: ^14.18.0 || >=16.0.0} - tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -5071,9 +4658,6 @@ packages: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -5095,6 +4679,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -5132,12 +4720,6 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-dedent@2.3.0: resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} engines: {node: '>=6.10'} @@ -5153,9 +4735,6 @@ packages: typescript: optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5166,30 +4745,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@5.6.0: resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} @@ -5215,10 +4774,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -5464,30 +5019,18 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} @@ -5512,9 +5055,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5958,28 +5498,35 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0)': dependencies: - eslint: 8.57.1 + eslint: 10.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.23.5': dependencies: - ajv: 6.15.0 - debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 '@exodus/bytes@1.15.0': {} @@ -6332,17 +5879,21 @@ snapshots: protobufjs: 7.5.8 yargs: 17.7.2 - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.2': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@iconify/icons-logos@1.2.36': dependencies: @@ -6690,18 +6241,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - '@open-draft/deferred-promise@2.2.0': {} '@open-draft/deferred-promise@3.0.0': {} @@ -6713,10 +6252,122 @@ snapshots: '@open-draft/until@2.1.0': {} - '@pkgjs/parseargs@0.11.0': + '@oxfmt/binding-android-arm-eabi@0.58.0': + optional: true + + '@oxfmt/binding-android-arm64@0.58.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.58.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.58.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.58.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.58.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.58.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.58.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.58.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.58.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.58.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.58.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.58.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.58.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.58.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.58.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.58.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.58.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.58.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.73.0': optional: true - '@pkgr/core@0.3.6': {} + '@oxlint/binding-android-arm64@1.73.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.73.0': + optional: true + + '@oxlint/binding-darwin-x64@1.73.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.73.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.73.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.73.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.73.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.73.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.73.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.73.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.73.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.73.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.73.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.73.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.73.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.73.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.73.0': + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true '@popperjs/core@2.11.8': {} @@ -6749,7 +6400,7 @@ snapshots: '@rollup/pluginutils@5.3.0(rollup@4.61.1)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.5 optionalDependencies: @@ -6830,8 +6481,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.61.1': optional: true - '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.18.0(@types/node@20.19.43)': dependencies: ajv: 8.13.0 @@ -7106,11 +6755,11 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.8 - - '@types/estree@1.0.8': {} + '@types/estree': 1.0.9 '@types/estree@1.0.9': {} @@ -7151,8 +6800,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/katex@0.16.8': {} '@types/lodash-es@4.17.12': @@ -7253,87 +6900,6 @@ snapshots: dependencies: '@types/node': 20.19.43 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@7.0.2) - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1 - eslint: 8.57.1 - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@7.0.2)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@7.0.2) - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@7.18.0': {} - - '@typescript-eslint/typescript-estree@7.18.0(typescript@7.0.2)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.9 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@7.0.2) - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@7.0.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@7.0.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -7518,13 +7084,11 @@ snapshots: '@xmldom/xmldom@0.9.10': {} - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} agent-base@6.0.2: dependencies: @@ -7609,107 +7173,30 @@ snapshots: dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} - aria-query@5.3.0: dependencies: dequal: 2.0.3 aria-query@5.3.2: {} - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - array-push-at-sort-position@4.0.1: {} - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - as-typed@1.3.2: {} assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-v8-to-istanbul@0.3.12: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 - async-function@1.0.0: {} - asynckit@0.4.0: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.10.3: {} - axios-retry@3.9.1: dependencies: '@babel/runtime': 7.28.2 @@ -7725,8 +7212,6 @@ snapshots: - debug - supports-color - axobject-query@4.1.0: {} - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.28.2 @@ -7747,16 +7232,11 @@ snapshots: binary-decision-diagram@3.2.0: {} - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.2: + brace-expansion@2.1.2: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.6: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -7785,13 +7265,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7816,11 +7289,6 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - character-entities-html4@2.1.0: {} character-entities-legacy@1.1.4: {} @@ -7903,14 +7371,10 @@ snapshots: compare-versions@6.1.1: {} - concat-map@0.0.1: {} - confbox@0.1.8: {} confbox@0.2.2: {} - confusing-browser-globals@1.0.11: {} - convert-source-map@1.9.0: {} cookie@1.1.1: {} @@ -8145,8 +7609,6 @@ snapshots: d3: 7.9.0 lodash-es: 4.18.1 - damerau-levenshtein@1.0.8: {} - data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 @@ -8154,34 +7616,12 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dayjs@1.10.7: {} dayjs@1.11.21: {} de-indent@1.0.2: {} - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.4.1: dependencies: ms: 2.1.3 @@ -8212,12 +7652,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delaunator@5.1.0: dependencies: robust-predicates: 3.0.3 @@ -8234,18 +7668,6 @@ snapshots: diff@8.0.3: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -8283,89 +7705,13 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -8376,16 +7722,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - es-toolkit@1.49.0: {} esbuild@0.25.12: @@ -8423,206 +7759,65 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1): - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1) - object.assign: 4.1.7 - object.entries: 1.1.9 - semver: 6.3.1 - - eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1): - dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1)(typescript@7.0.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1))(eslint@8.57.1) - transitivePeerDependencies: - - eslint-plugin-import - - eslint-config-prettier@9.1.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-config-react@1.1.7: {} - - eslint-import-resolver-node@0.3.10: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 2.0.0-next.7 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-node@0.4.0: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.2 - resolve: 2.0.0-next.7 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.10 - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@7.0.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + eslint-plugin-prefer-arrow@1.2.3(eslint@10.6.0): dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 + eslint: 10.6.0 - eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-prettier@5.5.6(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.9.4): - dependencies: - eslint: 8.57.1 - prettier: 3.9.4 - prettier-linter-helpers: 1.0.1 - synckit: 0.11.13 - optionalDependencies: - eslint-config-prettier: 9.1.2(eslint@8.57.1) - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-refresh@0.5.3(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.5(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-scope@7.2.2: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.6.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 ajv: 6.15.0 - chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 - doctrine: 3.0.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color esm@3.2.25: {} - espree@9.6.1: + espree@11.2.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -8657,16 +7852,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -8683,10 +7868,6 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - fault@1.0.4: dependencies: format: 0.2.2 @@ -8703,9 +7884,9 @@ snapshots: optionalDependencies: picomatch: 4.0.5 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -8751,11 +7932,10 @@ snapshots: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.4.2 keyv: 4.5.4 - rimraf: 3.0.2 flat@6.0.1: {} @@ -8788,24 +7968,11 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - fuse.js@7.4.2: {} generate-function@2.3.1: @@ -8834,28 +8001,18 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 + es-object-atoms: 1.1.2 glob-parent@6.0.2: dependencies: @@ -8879,33 +8036,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globrex@0.1.2: {} goober@2.1.16(csstype@3.2.3): @@ -8916,8 +8046,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - graphql-ws@5.16.2(graphql@16.12.0): dependencies: graphql: 16.12.0 @@ -8943,32 +8071,18 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - has-bigints@1.1.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hasown@2.0.3: - dependencies: - function-bind: 1.1.2 - hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -9026,7 +8140,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -9184,21 +8298,10 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} inline-style-parser@0.2.4: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.1 - internmap@1.0.1: {} internmap@2.0.3: {} @@ -9207,70 +8310,32 @@ snapshots: is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.4: {} - - is-async-function@2.1.1: + is-alphanumerical@1.0.4: dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 - is-bigint@1.1.0: + is-alphanumerical@2.0.1: dependencies: - has-bigints: 1.1.0 + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 - is-boolean-object@1.2.2: + is-arguments@1.2.0: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-arrayish@0.2.1: {} + + is-arrayish@0.3.4: {} + is-buffer@1.1.6: {} is-callable@1.2.7: {} - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - is-core-module@2.16.2: dependencies: - hasown: 2.0.3 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + hasown: 2.0.4 is-decimal@1.0.4: {} @@ -9278,10 +8343,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.2: @@ -9300,8 +8361,6 @@ snapshots: is-hexadecimal@2.0.1: {} - is-map@2.0.3: {} - is-my-ip-valid@1.0.1: {} is-my-json-valid@2.20.6: @@ -9312,19 +8371,10 @@ snapshots: jsonpointer: 5.0.1 xtend: 4.0.2 - is-negative-zero@2.0.3: {} - is-node-process@1.2.0: {} - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -9338,43 +8388,13 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 is-retry-allowed@2.2.0: {} - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - isarray@2.0.5: {} + which-typed-array: 1.1.22 isexe@2.0.0: {} @@ -9412,15 +8432,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -9441,10 +8452,6 @@ snapshots: js-tokens@9.0.1: {} - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - jsdom@28.1.0: dependencies: '@acemir/cssom': 0.9.31 @@ -9486,10 +8493,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -9500,13 +8503,6 @@ snapshots: jsonschema-key-compression@1.7.0: {} - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - katex@0.16.47: dependencies: commander: 8.3.0 @@ -9519,12 +8515,6 @@ snapshots: kolorist@1.8.0: {} - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -9554,8 +8544,6 @@ snapshots: lodash.isequal@4.5.0: {} - lodash.merge@4.6.2: {} - lodash@4.17.23: {} lodash@4.18.1: {} @@ -9810,8 +8798,6 @@ snapshots: memory-pager@1.5.0: {} - merge2@1.4.1: {} - mermaid@11.16.0: dependencies: '@braintree/sanitize-url': 7.1.2 @@ -10060,15 +9046,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.6 - - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.7 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.2 minimist@1.2.8: {} @@ -10080,14 +9062,14 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.15.0 + acorn: 8.17.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.1 mlly@1.8.2: dependencies: - acorn: 8.16.0 + acorn: 8.17.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -10153,13 +9135,6 @@ snapshots: dependencies: tweetnacl: 1.0.3 - node-exports-info@1.6.0: - dependencies: - array.prototype.flatmap: 1.3.3 - es-errors: 1.3.0 - object.entries: 1.1.9 - semver: 6.3.1 - notistack@3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 1.2.1 @@ -10170,54 +9145,10 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - oblivious-set@1.4.0: {} oblivious-set@2.0.0: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -10229,11 +9160,51 @@ snapshots: outvariant@1.4.3: {} - own-keys@1.0.1: + oxfmt@0.58.0: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.58.0 + '@oxfmt/binding-android-arm64': 0.58.0 + '@oxfmt/binding-darwin-arm64': 0.58.0 + '@oxfmt/binding-darwin-x64': 0.58.0 + '@oxfmt/binding-freebsd-x64': 0.58.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.58.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.58.0 + '@oxfmt/binding-linux-arm64-gnu': 0.58.0 + '@oxfmt/binding-linux-arm64-musl': 0.58.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.58.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.58.0 + '@oxfmt/binding-linux-riscv64-musl': 0.58.0 + '@oxfmt/binding-linux-s390x-gnu': 0.58.0 + '@oxfmt/binding-linux-x64-gnu': 0.58.0 + '@oxfmt/binding-linux-x64-musl': 0.58.0 + '@oxfmt/binding-openharmony-arm64': 0.58.0 + '@oxfmt/binding-win32-arm64-msvc': 0.58.0 + '@oxfmt/binding-win32-ia32-msvc': 0.58.0 + '@oxfmt/binding-win32-x64-msvc': 0.58.0 + + oxlint@1.73.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.73.0 + '@oxlint/binding-android-arm64': 1.73.0 + '@oxlint/binding-darwin-arm64': 1.73.0 + '@oxlint/binding-darwin-x64': 1.73.0 + '@oxlint/binding-freebsd-x64': 1.73.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.73.0 + '@oxlint/binding-linux-arm-musleabihf': 1.73.0 + '@oxlint/binding-linux-arm64-gnu': 1.73.0 + '@oxlint/binding-linux-arm64-musl': 1.73.0 + '@oxlint/binding-linux-ppc64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-musl': 1.73.0 + '@oxlint/binding-linux-s390x-gnu': 1.73.0 + '@oxlint/binding-linux-x64-gnu': 1.73.0 + '@oxlint/binding-linux-x64-musl': 1.73.0 + '@oxlint/binding-openharmony-arm64': 1.73.0 + '@oxlint/binding-win32-arm64-msvc': 1.73.0 + '@oxlint/binding-win32-ia32-msvc': 1.73.0 + '@oxlint/binding-win32-x64-msvc': 1.73.0 p-finally@1.0.0: {} @@ -10302,8 +9273,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -10363,17 +9332,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - - prettier-plugin-organize-imports@3.2.4(prettier@3.9.4)(typescript@7.0.2): - dependencies: - prettier: 3.9.4 - typescript: 7.0.2 - - prettier@3.9.4: {} - pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -10582,32 +9540,12 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - refractor@3.6.0: dependencies: hastscript: 6.0.0 parse-entities: 2.0.0 prismjs: 1.27.0 - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - rehype-mathjax@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -10698,29 +9636,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.7: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - node-exports-info: 1.6.0 - object-keys: 1.1.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - rettime@0.11.11: {} - reusify@1.1.0: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - robust-predicates@3.0.3: {} rollup@4.61.1: @@ -10761,10 +9678,6 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - rw@1.3.3: {} rxdb@16.21.1(rxjs@7.8.2): @@ -10819,21 +9732,8 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -10854,8 +9754,6 @@ snapshots: scheduler@0.27.0: {} - semver@6.3.1: {} - semver@7.5.4: dependencies: lru-cache: 6.0.0 @@ -10875,66 +9773,12 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - side-channel@1.1.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -10955,8 +9799,6 @@ snapshots: dependencies: is-arrayish: 0.3.4 - slash@3.0.0: {} - source-map-js@1.2.1: {} source-map@0.5.7: {} @@ -10987,11 +9829,6 @@ snapshots: std-env@3.10.0: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - strict-event-emitter@0.5.1: {} string-argv@0.3.2: {} @@ -11008,56 +9845,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -11075,8 +9862,6 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -11111,10 +9896,6 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.13: - dependencies: - '@pkgr/core': 0.3.6 - tagged-tag@1.0.0: {} test-exclude@7.0.2: @@ -11123,8 +9904,6 @@ snapshots: glob: 10.5.0 minimatch: 10.2.5 - text-table@0.2.0: {} - tinybench@2.9.0: {} tinycolor2@1.6.0: {} @@ -11140,6 +9919,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.4: {} @@ -11170,23 +9951,12 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@7.0.2): - dependencies: - typescript: 7.0.2 - ts-dedent@2.3.0: {} tsconfck@3.1.6(typescript@7.0.2): optionalDependencies: typescript: 7.0.2 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} tweetnacl@1.0.3: {} @@ -11195,45 +9965,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - typescript@5.8.2: {} typescript@7.0.2: @@ -11268,13 +10003,6 @@ snapshots: uglify-js@3.19.3: optional: true - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} undici@7.25.0: {} @@ -11547,48 +10275,17 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -11625,8 +10322,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.2 - wrappy@1.0.2: {} - ws@8.18.3: {} xml-name-validator@5.0.0: {} diff --git a/ui/src/api/dossier/hit.ts b/ui/src/api/dossier/hit.ts index 3dcb44058..a458fc106 100644 --- a/ui/src/api/dossier/hit.ts +++ b/ui/src/api/dossier/hit.ts @@ -1,4 +1,4 @@ -/* eslint-disable import/no-cycle */ +/* oxlint-disable import/no-cycle */ import { hget, joinAllUri } from 'api'; import type { Dossier } from 'models/entities/generated/Dossier'; import { uri as parentUri } from '.'; diff --git a/ui/src/api/dossier/index.ts b/ui/src/api/dossier/index.ts index 24252d0a2..e6faadf7d 100644 --- a/ui/src/api/dossier/index.ts +++ b/ui/src/api/dossier/index.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line import/no-cycle +// oxlint-disable-next-line import/no-cycle import { hdelete, hget, hpost, hput, joinAllUri, joinUri, uri as parentUri, type HowlerRefreshParam } from 'api'; import type { Dossier } from 'models/entities/generated/Dossier'; import * as hit from './hit'; diff --git a/ui/src/api/hit/comments/react.ts b/ui/src/api/hit/comments/react.ts index f93bf0451..27e3d1841 100644 --- a/ui/src/api/hit/comments/react.ts +++ b/ui/src/api/hit/comments/react.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line import/no-cycle +// oxlint-disable-next-line import/no-cycle import { hdelete, hput, joinUri } from 'api'; import { uri as parentUri } from 'api/hit/comments'; diff --git a/ui/src/api/index.ts b/ui/src/api/index.ts index acf24e289..370881cc2 100644 --- a/ui/src/api/index.ts +++ b/ui/src/api/index.ts @@ -31,7 +31,6 @@ const client = new AxiosClient(); /** * Defining the default export exposing all children routes of '/api/v1/'. */ -// prettier-ignore const api = { action, analytic, diff --git a/ui/src/commons/components/app/AppSkeleton.tsx b/ui/src/commons/components/app/AppSkeleton.tsx index 7a5edcc1a..3393fa711 100644 --- a/ui/src/commons/components/app/AppSkeleton.tsx +++ b/ui/src/commons/components/app/AppSkeleton.tsx @@ -19,14 +19,14 @@ import { AppUserAvatar } from 'commons/components/topnav/UserProfile'; * @param props */ interface LeftNavElementsSkeletonProps { - // eslint-disable-next-line react/require-default-props + // oxlint-disable-next-line react/require-default-props withText?: boolean; elements: AppLeftNavElement[]; } interface ButtonSkeletonProps { style: { [styleAttr: string]: any }; - // eslint-disable-next-line react/require-default-props + // oxlint-disable-next-line react/require-default-props withText?: boolean; [propName: string]: any; } diff --git a/ui/src/commons/components/app/hooks/useAppSitemap.tsx b/ui/src/commons/components/app/hooks/useAppSitemap.tsx index 015ec2667..3615686f2 100644 --- a/ui/src/commons/components/app/hooks/useAppSitemap.tsx +++ b/ui/src/commons/components/app/hooks/useAppSitemap.tsx @@ -20,7 +20,7 @@ export const getRoute = (route: string, siteMap: AppSiteMapRoute[]): BreadcrumbI // hopefully, we only have a single match. if (matched && matched.length > 1) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn(`Found more than one sitemap route match for: ${route}`); } return matched && matched[0] ? matched[0] : { route: { path: route, title: TITLE_404 }, matcher: null }; @@ -39,7 +39,7 @@ const appendRoute = (breadcrumbs: BreadcrumbItem[], breadcrumb: BreadcrumbItem): } // If the last element of bread is a leaf, then we remove it. if (breadcrumbs[breadcrumbs.length - 1].route.isLeaf) { - // eslint-disable-next-line no-param-reassign + // oxlint-disable-next-line no-param-reassign breadcrumbs = breadcrumbs.slice(0, breadcrumbs.length - 1); } // See if the route is already in the breadcrumbs. diff --git a/ui/src/commons/components/app/providers/AppBreadcrumbsProvider.tsx b/ui/src/commons/components/app/providers/AppBreadcrumbsProvider.tsx index f03e79b28..7c20dd707 100644 --- a/ui/src/commons/components/app/providers/AppBreadcrumbsProvider.tsx +++ b/ui/src/commons/components/app/providers/AppBreadcrumbsProvider.tsx @@ -27,7 +27,7 @@ export default function AppBreadcrumbsProvider({ children }: AppBreadcrumbsProvi // Reset the breadcrumbs if the user ready state changes. useEffect(() => { setItems(appendRoute([getRoute('/', sitemap.routes)], getRoute(pathname, sitemap.routes))); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [isUserReady]); // The return callback will ensure the event handler deregisters when component diff --git a/ui/src/commons/components/display/AppToc.tsx b/ui/src/commons/components/display/AppToc.tsx index c4f7b00bf..1e57cfa3c 100644 --- a/ui/src/commons/components/display/AppToc.tsx +++ b/ui/src/commons/components/display/AppToc.tsx @@ -124,7 +124,7 @@ const AppToc = ({ children, translation, items, titleI18nKey = 'toc', topI18nKey // If element exists already, use native scrollIntoView. scrollElement.scrollIntoView(true); } else { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.log('[WARN] Trying to scroll to unknown ID:', location.hash); } } diff --git a/ui/src/commons/components/display/hooks/useAppColor.tsx b/ui/src/commons/components/display/hooks/useAppColor.tsx index e91d01290..ecd529646 100644 --- a/ui/src/commons/components/display/hooks/useAppColor.tsx +++ b/ui/src/commons/components/display/hooks/useAppColor.tsx @@ -15,7 +15,7 @@ export default function useAppColor( ) { const { isDark } = useAppTheme(); return useMemo(() => { - // eslint-disable-next-line import/namespace + // oxlint-disable-next-line import/namespace return (colors[color] as MuiColor)[isDark ? darkVariant : lightVariant]; }, [isDark, color, lightVariant, darkVariant]); } diff --git a/ui/src/commons/components/leftnav/LeftNavDrawer.tsx b/ui/src/commons/components/leftnav/LeftNavDrawer.tsx index 79e7dffc3..99ad1289e 100644 --- a/ui/src/commons/components/leftnav/LeftNavDrawer.tsx +++ b/ui/src/commons/components/leftnav/LeftNavDrawer.tsx @@ -1,4 +1,4 @@ -/* eslint-disable jsx-a11y/no-static-element-interactions */ +/* oxlint-disable jsx-a11y/no-static-element-interactions */ import { ChevronLeft as ChevronLeftIcon, ChevronRight as ChevronRightIcon } from '@mui/icons-material'; import { Box, diff --git a/ui/src/commons/components/notification/Notification.tsx b/ui/src/commons/components/notification/Notification.tsx index bc751bbe3..791cebf29 100644 --- a/ui/src/commons/components/notification/Notification.tsx +++ b/ui/src/commons/components/notification/Notification.tsx @@ -55,7 +55,7 @@ export const Notification: FC = memo( (url: string = ''): Promise => new Promise(async resolve => { const response: Response = (await fetch(url, { method: 'GET' }).catch(err => - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Notification Area: error caused by URL "${err}`) )) as Response; diff --git a/ui/src/commons/components/notification/elements/NotificationEndOfPage.tsx b/ui/src/commons/components/notification/elements/NotificationEndOfPage.tsx index be4cc6bee..54e77f101 100644 --- a/ui/src/commons/components/notification/elements/NotificationEndOfPage.tsx +++ b/ui/src/commons/components/notification/elements/NotificationEndOfPage.tsx @@ -23,7 +23,7 @@ function useOnScreen(ref: RefObject, rootMargin = '0px') { observer.unobserve(observerRef); } }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); // Empty array ensures that effect is only run on mount and unmount return isIntersecting; } diff --git a/ui/src/commons/components/search/AppSearch.tsx b/ui/src/commons/components/search/AppSearch.tsx index 02e9d3cff..4441211fb 100644 --- a/ui/src/commons/components/search/AppSearch.tsx +++ b/ui/src/commons/components/search/AppSearch.tsx @@ -73,7 +73,7 @@ export default function AppSearch() { if (service.onMounted) { service.onMounted(setValue, state); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); // keyboard[window] handler. diff --git a/ui/src/commons/components/topnav/UserProfile.tsx b/ui/src/commons/components/topnav/UserProfile.tsx index bd7168152..0ae6c4680 100644 --- a/ui/src/commons/components/topnav/UserProfile.tsx +++ b/ui/src/commons/components/topnav/UserProfile.tsx @@ -102,7 +102,7 @@ const UserProfile = () => { if (open) { setOpen(false); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [location.pathname]); return ( diff --git a/ui/src/commons/components/utils/hooks/useFullscreenStatus.tsx b/ui/src/commons/components/utils/hooks/useFullscreenStatus.tsx index f5e5df948..a20c39904 100644 --- a/ui/src/commons/components/utils/hooks/useFullscreenStatus.tsx +++ b/ui/src/commons/components/utils/hooks/useFullscreenStatus.tsx @@ -4,15 +4,15 @@ const getBrowserFullscreenElementProp = () => { if (typeof document.fullscreenElement !== 'undefined') { return 'fullscreenElement'; } - // eslint-disable-next-line @typescript-eslint/dot-notation + // oxlint-disable-next-line @typescript-eslint/dot-notation if (typeof document['mozFullScreenElement'] !== 'undefined') { return 'mozFullScreenElement'; } - // eslint-disable-next-line @typescript-eslint/dot-notation + // oxlint-disable-next-line @typescript-eslint/dot-notation if (typeof document['msFullscreenElement'] !== 'undefined') { return 'msFullscreenElement'; } - // eslint-disable-next-line @typescript-eslint/dot-notation + // oxlint-disable-next-line @typescript-eslint/dot-notation if (typeof document['webkitFullscreenElement'] !== 'undefined') { return 'webkitFullscreenElement'; } diff --git a/ui/src/components/app/App.tsx b/ui/src/components/app/App.tsx index e9c74f72e..e9f0cc1ee 100644 --- a/ui/src/components/app/App.tsx +++ b/ui/src/components/app/App.tsx @@ -147,7 +147,7 @@ const MyApp: FC = () => { } getUser(); - // eslint-disable-next-line + // oxlint-disable-next-line }, []); useEffect(() => { @@ -163,7 +163,7 @@ const MyApp: FC = () => { navigate('/login'); } } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [appUser.isReady()]); for (const plugin of howlerPluginStore.plugins) { diff --git a/ui/src/components/app/hooks/useMatchers.tsx b/ui/src/components/app/hooks/useMatchers.tsx index 4fbf7f153..bcc8eca1b 100644 --- a/ui/src/components/app/hooks/useMatchers.tsx +++ b/ui/src/components/app/hooks/useMatchers.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import { has } from 'lodash-es'; import type { Hit } from 'models/entities/generated/Hit'; import type { WithMetadata } from 'models/WithMetadata'; @@ -23,7 +23,7 @@ const useMatchers = () => { // should also exist try { return (await getHit(hit.howler.id, true)).__template; - } catch (e) { + } catch { return null; } }, @@ -44,7 +44,7 @@ const useMatchers = () => { // should also exist try { return (await getHit(hit.howler.id, true)).__overview; - } catch (e) { + } catch { return null; } }, @@ -65,7 +65,7 @@ const useMatchers = () => { // should also exist try { return (await getHit(hit.howler.id, true)).__dossiers ?? []; - } catch (e) { + } catch { return []; } }, @@ -85,7 +85,7 @@ const useMatchers = () => { // This is a fallback in case metadata is not included. try { return (await getHit(hit.howler.id, true)).__analytic; - } catch (e) { + } catch { return null; } }, diff --git a/ui/src/components/app/providers/AnalyticProvider.tsx b/ui/src/components/app/providers/AnalyticProvider.tsx index 52daa0e0b..0206c540e 100644 --- a/ui/src/components/app/providers/AnalyticProvider.tsx +++ b/ui/src/components/app/providers/AnalyticProvider.tsx @@ -70,7 +70,7 @@ const AnalyticProvider: FC = ({ children }) => { return analytic; } } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(e); } diff --git a/ui/src/components/app/providers/AvatarProvider.tsx b/ui/src/components/app/providers/AvatarProvider.tsx index af13703f6..eb3f5cd60 100644 --- a/ui/src/components/app/providers/AvatarProvider.tsx +++ b/ui/src/components/app/providers/AvatarProvider.tsx @@ -32,7 +32,7 @@ const AvatarProvider: FC = ({ children }) => { promises[id] = dispatchApi(api.user.avatar.get(id), { logError: false, showError: false, throwError: false }); return promises[id]; - } catch (e) { + } catch { promises[id] = api.user.get(id).then(user => user.name); return promises[id]; diff --git a/ui/src/components/app/providers/FavouritesProvider.tsx b/ui/src/components/app/providers/FavouritesProvider.tsx index 6c102a685..2c47c822b 100644 --- a/ui/src/components/app/providers/FavouritesProvider.tsx +++ b/ui/src/components/app/providers/FavouritesProvider.tsx @@ -144,7 +144,7 @@ const FavouriteProvider: FC = ({ children }) => { leftNav.setElements(newElements); })(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analytics.ready, appUser]); return {children}; diff --git a/ui/src/components/app/providers/GridColumnsProvider.tsx b/ui/src/components/app/providers/GridColumnsProvider.tsx index 6c5916c7e..1de6724b1 100644 --- a/ui/src/components/app/providers/GridColumnsProvider.tsx +++ b/ui/src/components/app/providers/GridColumnsProvider.tsx @@ -197,7 +197,7 @@ const GridColumnsProvider = ({ setIsReady(true); }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [viewIds, hasViews, getCurrentViews, localStorageColumns, setDisplayType]); const setColumns = useCallback( diff --git a/ui/src/components/app/providers/HitProvider.tsx b/ui/src/components/app/providers/HitProvider.tsx index dbc8ca648..6690d23d6 100644 --- a/ui/src/components/app/providers/HitProvider.tsx +++ b/ui/src/components/app/providers/HitProvider.tsx @@ -50,7 +50,7 @@ const HitProvider: FC = ({ children }) => { const handler = useMemo( () => (data: RecievedDataType) => { if (data.hit) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug('Received websocket update for hit', data.hit.howler.id); hitRequests.current[data.hit.howler.id] = Promise.resolve(data.hit); diff --git a/ui/src/components/app/providers/HitSearchProvider.tsx b/ui/src/components/app/providers/HitSearchProvider.tsx index 942892f66..0c1e0c8c0 100644 --- a/ui/src/components/app/providers/HitSearchProvider.tsx +++ b/ui/src/components/app/providers/HitSearchProvider.tsx @@ -99,7 +99,7 @@ const HitSearchProvider: FC = ({ children }) => { const filterQueryTime = dayjs().subtract(1, 'month').toISOString(); setQueryHistory(Object.fromEntries(Object.entries(queryHistory).filter(([_, value]) => value > filterQueryTime))); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); // Inject default view into URL when no views present @@ -234,7 +234,7 @@ const HitSearchProvider: FC = ({ children }) => { setResponse(null); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset, pageCount, sort, span, bundleId, location.pathname, startDate, endDate, filters, query, views]); return ( diff --git a/ui/src/components/app/providers/LocalStorageProvider.tsx b/ui/src/components/app/providers/LocalStorageProvider.tsx index 0f62d61bd..46906c2fe 100644 --- a/ui/src/components/app/providers/LocalStorageProvider.tsx +++ b/ui/src/components/app/providers/LocalStorageProvider.tsx @@ -33,7 +33,7 @@ const LocalStorageProvider: FC = ({ children }) => { ...newData }; }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [getStored]); const set: LocalStorageContextType['set'] = useCallback( diff --git a/ui/src/components/app/providers/ModalProvider.tsx b/ui/src/components/app/providers/ModalProvider.tsx index 18de26390..dab88b08e 100644 --- a/ui/src/components/app/providers/ModalProvider.tsx +++ b/ui/src/components/app/providers/ModalProvider.tsx @@ -1,3 +1,4 @@ +// oxlint-disable-next-line import/no-cycle import ConfirmDeleteModal from 'components/elements/display/modals/ConfirmDeleteModal'; import type { FC, PropsWithChildren, ReactNode } from 'react'; import { createContext, useCallback, useEffect, useState } from 'react'; diff --git a/ui/src/components/app/providers/OverviewProvider.tsx b/ui/src/components/app/providers/OverviewProvider.tsx index a3242c77a..034a1eed8 100644 --- a/ui/src/components/app/providers/OverviewProvider.tsx +++ b/ui/src/components/app/providers/OverviewProvider.tsx @@ -69,7 +69,7 @@ const OverviewProvider: FC = ({ children }) => { const refresh = useCallback(() => { setLoaded(false); getOverviews(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/ui/src/components/app/providers/ParameterProvider.tsx b/ui/src/components/app/providers/ParameterProvider.tsx index 8b862e371..32b084a43 100644 --- a/ui/src/components/app/providers/ParameterProvider.tsx +++ b/ui/src/components/app/providers/ParameterProvider.tsx @@ -128,13 +128,13 @@ const ParameterProvider: FC = ({ children }) => { useCallback( key => value => { if ((key as string) === 'filters') { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error('Cannot use set() for filters. Use addFilter/removeFilter/clearFilters instead.'); return; } if ((key as string) === 'views') { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error('Cannot use set() for views. Use addView/removeView/clearViews instead.'); return; } @@ -406,7 +406,7 @@ const ParameterProvider: FC = ({ children }) => { }, { replace: !changes.query && !Object.keys(changes).includes('offset') } ); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [values]); useEffect(() => { @@ -420,7 +420,7 @@ const ParameterProvider: FC = ({ children }) => { ..._current, ...changes })); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [location.search, location.pathname, routeParams.id]); return ( diff --git a/ui/src/components/app/providers/SocketProvider.tsx b/ui/src/components/app/providers/SocketProvider.tsx index 7b87ec478..f66071961 100644 --- a/ui/src/components/app/providers/SocketProvider.tsx +++ b/ui/src/components/app/providers/SocketProvider.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import api from 'api'; import useMyLocalStorage from 'components/hooks/useMyLocalStorage'; import type { PropsWithChildren } from 'react'; @@ -121,7 +121,7 @@ const SocketProvider: React.FC = ({ children }) => { console.error(data); setRetry(false); } - } catch (err) { + } catch { // There's no useful data, or the refresh attempt failed. // Either way, we can't really do anything } @@ -157,7 +157,7 @@ const SocketProvider: React.FC = ({ children }) => { if (data?.error || data?.status >= 400) { console.warn(data?.message || 'Websocket Error'); } - } catch (err) { + } catch { console.warn('Websocket Error'); } }, []); diff --git a/ui/src/components/app/providers/ViewProvider.tsx b/ui/src/components/app/providers/ViewProvider.tsx index 21a75cf64..362ce938d 100644 --- a/ui/src/components/app/providers/ViewProvider.tsx +++ b/ui/src/components/app/providers/ViewProvider.tsx @@ -71,7 +71,7 @@ const ViewProvider: FC = ({ children }) => { return ids.map(id => views[id] ?? newViews[id]); } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn(e); return []; diff --git a/ui/src/components/elements/display/ActionButton.tsx b/ui/src/components/elements/display/ActionButton.tsx index 8866c1483..a5c7c38dc 100644 --- a/ui/src/components/elements/display/ActionButton.tsx +++ b/ui/src/components/elements/display/ActionButton.tsx @@ -29,7 +29,7 @@ const ActionButton: FC<{ actionId: string; hitId: string; label: string } & Butt return ( {t('markdown.error')} - {/* eslint-disable-next-line react/jsx-no-literals */} + {/* oxlint-disable-next-line react/jsx-no-literals */} {t('markdown.actionbutton.error')} ); diff --git a/ui/src/components/elements/display/HandlebarsMarkdown.tsx b/ui/src/components/elements/display/HandlebarsMarkdown.tsx index 3ca92ad27..cb4318178 100644 --- a/ui/src/components/elements/display/HandlebarsMarkdown.tsx +++ b/ui/src/components/elements/display/HandlebarsMarkdown.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import Handlebars, { type Exception } from 'handlebars'; import asyncHelpers from 'handlebars-async-helpers'; import type { FC, ReactElement } from 'react'; @@ -97,7 +97,7 @@ const HandlebarsMarkdown: FC = ({ md, object = {}, disa return; } - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(err); setRendered(` diff --git a/ui/src/components/elements/display/HowlerAvatar.tsx b/ui/src/components/elements/display/HowlerAvatar.tsx index 757a60384..bb5efd74c 100644 --- a/ui/src/components/elements/display/HowlerAvatar.tsx +++ b/ui/src/components/elements/display/HowlerAvatar.tsx @@ -41,14 +41,14 @@ const HowlerAvatar: FC = ({ userId, ...avatarProps }) => { av && !av.startsWith('http') && !av.startsWith('data:') ? setProps(stringAvatar(av)) : setProps({ src: av }) ) .catch(e => { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug(e); setProps({ src: null }); }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [userId]); if (userId) { diff --git a/ui/src/components/elements/display/ItemManager.tsx b/ui/src/components/elements/display/ItemManager.tsx index 0fbd40105..1c7dac6a0 100644 --- a/ui/src/components/elements/display/ItemManager.tsx +++ b/ui/src/components/elements/display/ItemManager.tsx @@ -33,7 +33,7 @@ interface ItemManagerProps { createIcon?: ReactNode; } -// eslint-disable-next-line comma-spacing +// oxlint-disable-next-line comma-spacing const ItemManager: FC = ({ aboveSearch, afterSearch, diff --git a/ui/src/components/elements/display/Markdown.tsx b/ui/src/components/elements/display/Markdown.tsx index fc30b6720..8865e7d37 100644 --- a/ui/src/components/elements/display/Markdown.tsx +++ b/ui/src/components/elements/display/Markdown.tsx @@ -1,4 +1,4 @@ -/* eslint-disable prefer-arrow/prefer-arrow-functions */ +/* oxlint-disable prefer-arrow/prefer-arrow-functions */ import { Alert, Box, @@ -110,14 +110,14 @@ const Markdown: FC = ({ md, components = {}, disableLinks = false if (match?.[1] === 'json') { try { return ; - } catch (e) { + } catch { return {t('markdown.json.invalid')}; } } return match ? ( = ({ md, components = {}, disableLinks = false blockquote({ children }) { return {children}; }, - // eslint-disable-next-line @typescript-eslint/no-unused-vars + // oxlint-disable-next-line @typescript-eslint/no-unused-vars img({ node, ...props }) { - // eslint-disable-next-line jsx-a11y/alt-text + // oxlint-disable-next-line jsx-a11y/alt-text return ; }, table({ children }) { @@ -182,7 +182,7 @@ const Markdown: FC = ({ md, components = {}, disableLinks = false try { parsed = new URL(props.href); } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn('error when parsing URL:', e); } diff --git a/ui/src/components/elements/display/handlebars/helpers.tsx b/ui/src/components/elements/display/handlebars/helpers.tsx index dd8bbe51b..7a36eda0f 100644 --- a/ui/src/components/elements/display/handlebars/helpers.tsx +++ b/ui/src/components/elements/display/handlebars/helpers.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import { Paper, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; import AppListEmpty from 'commons/components/display/AppListEmpty'; import HitCard from 'components/elements/hit/HitCard'; @@ -118,7 +118,7 @@ export const useHelpers = (opts = { async: true, components: true }): HowlerHelp const json = await FETCH_RESULTS[url]; return flatten(json)[key]; - } catch (e) { + } catch { return ''; } } @@ -194,7 +194,7 @@ export const useHelpers = (opts = { async: true, components: true }): HowlerHelp callback: (data, key) => { try { return get(data, key); - } catch (e) { + } catch { return ''; } } diff --git a/ui/src/components/elements/display/markdownPlugins/tabs.ts b/ui/src/components/elements/display/markdownPlugins/tabs.ts index d97e9d1a0..ab7d5a1c3 100644 --- a/ui/src/components/elements/display/markdownPlugins/tabs.ts +++ b/ui/src/components/elements/display/markdownPlugins/tabs.ts @@ -17,7 +17,7 @@ const findTabs = (index, parent) => { if (!metaString) break; const [tabtitle] = metaString.match(/(?<=tab=("|'))(.*?)(?=("|'))/) ?? ['']; if (!tabtitle) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn('Failed to parse tab title.'); break; } diff --git a/ui/src/components/elements/display/modals/ConfirmDeleteModal.tsx b/ui/src/components/elements/display/modals/ConfirmDeleteModal.tsx index c0c7d4dfd..1b5987337 100644 --- a/ui/src/components/elements/display/modals/ConfirmDeleteModal.tsx +++ b/ui/src/components/elements/display/modals/ConfirmDeleteModal.tsx @@ -1,4 +1,5 @@ import { Button, Stack, Typography } from '@mui/material'; +// oxlint-disable-next-line import/no-cycle import { ModalContext } from 'components/app/providers/ModalProvider'; import type { FC } from 'react'; import { useCallback, useContext } from 'react'; diff --git a/ui/src/components/elements/display/modals/CreateActionModal.tsx b/ui/src/components/elements/display/modals/CreateActionModal.tsx index 5ea94e79f..13d79c1b7 100644 --- a/ui/src/components/elements/display/modals/CreateActionModal.tsx +++ b/ui/src/components/elements/display/modals/CreateActionModal.tsx @@ -42,7 +42,7 @@ const CreateActionModal: FC<{ onSubmit: (rationale: string) => void }> = ({ onSu setActionName(e.target.value)} diff --git a/ui/src/components/elements/hit/HitActions.tsx b/ui/src/components/elements/hit/HitActions.tsx index 7fbc8ba54..d2e082475 100644 --- a/ui/src/components/elements/hit/HitActions.tsx +++ b/ui/src/components/elements/hit/HitActions.tsx @@ -166,7 +166,7 @@ const HitActions: FC<{ useEffect(() => { getMatchingAnalytic(hit).then(setAnalytic); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit?.howler.analytic]); const handleOpenSetting = useCallback((e: React.MouseEvent) => setOpenSetting(e.currentTarget), []); diff --git a/ui/src/components/elements/hit/HitBanner.tsx b/ui/src/components/elements/hit/HitBanner.tsx index 3ee5078b2..e35fd2f35 100644 --- a/ui/src/components/elements/hit/HitBanner.tsx +++ b/ui/src/components/elements/hit/HitBanner.tsx @@ -61,7 +61,7 @@ const HitBanner: FC = ({ hit, layout = HitLayout.NORMAL, showAss } getMatchingAnalytic(hit).then(analytic => setAnalyticId(analytic?.analytic_id)); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit?.howler.analytic]); const providerColor = useMemo( diff --git a/ui/src/components/elements/hit/HitCard.tsx b/ui/src/components/elements/hit/HitCard.tsx index 4226a5362..f564c6bca 100644 --- a/ui/src/components/elements/hit/HitCard.tsx +++ b/ui/src/components/elements/hit/HitCard.tsx @@ -17,7 +17,7 @@ const HitCard: FC<{ id?: string; layout: HitLayout; readOnly?: boolean }> = ({ i if (!hit) { getHit(id); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [id]); if (!hit) { diff --git a/ui/src/components/elements/hit/HitComments.tsx b/ui/src/components/elements/hit/HitComments.tsx index d15df5c55..4e2c7f77e 100644 --- a/ui/src/components/elements/hit/HitComments.tsx +++ b/ui/src/components/elements/hit/HitComments.tsx @@ -86,7 +86,7 @@ const HitComments: FC = ({ hit, users }) => { addListener('hitComments', handler); return () => removeListener('hitComments'); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [handler]); useEffect(() => { @@ -96,7 +96,7 @@ const HitComments: FC = ({ hit, users }) => { setAnalyticComments(sortByTimestamp(analytic?.comment ?? [])); }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [getMatchingAnalytic, hit?.howler?.analytic]); const onSubmit = useCallback(async () => { diff --git a/ui/src/components/elements/hit/HitContextMenu.tsx b/ui/src/components/elements/hit/HitContextMenu.tsx index 4b1d8787c..701406a77 100644 --- a/ui/src/components/elements/hit/HitContextMenu.tsx +++ b/ui/src/components/elements/hit/HitContextMenu.tsx @@ -256,7 +256,7 @@ const HitContextMenu: FC> = ({ children, getMatchingAnalytic(hit).then(setAnalytic); getMatchingTemplate(hit).then(setTemplate); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit]); // Reset menu state when context menu is closed diff --git a/ui/src/components/elements/hit/HitDetails.tsx b/ui/src/components/elements/hit/HitDetails.tsx index 472fb652f..022c7957b 100644 --- a/ui/src/components/elements/hit/HitDetails.tsx +++ b/ui/src/components/elements/hit/HitDetails.tsx @@ -1,5 +1,5 @@ -/* eslint-disable react/no-array-index-key */ -/* eslint-disable @typescript-eslint/no-use-before-define */ +/* oxlint-disable react/no-array-index-key */ +/* oxlint-disable @typescript-eslint/no-use-before-define */ import { ArrowDropDown, InfoOutlined } from '@mui/icons-material'; import { Accordion, @@ -123,7 +123,7 @@ const ListRenderer: FC<{ > {entry} - {/* eslint-disable-next-line react/jsx-no-literals */} + {/* oxlint-disable-next-line react/jsx-no-literals */} {allPrimitives && index < uniqueEntries.length - 1 && ,} ); diff --git a/ui/src/components/elements/hit/HitNotebooks.tsx b/ui/src/components/elements/hit/HitNotebooks.tsx index 2e76018ac..d90aecf0b 100644 --- a/ui/src/components/elements/hit/HitNotebooks.tsx +++ b/ui/src/components/elements/hit/HitNotebooks.tsx @@ -79,7 +79,7 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi window.open(`${envs[0].url}lab/tree/${filename}`, '_blank'); setOpen(false); - } catch (e) { + } catch { showErrorMessage(t('hit.notebook.error.failToPost')); } }, @@ -106,7 +106,7 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi } else { goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); } - } catch (e) { + } catch { // error means notebook doesn't exist, we can proceed with posting goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); } @@ -160,7 +160,7 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi name: '' }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [open]); return ( diff --git a/ui/src/components/elements/hit/HitOutline.tsx b/ui/src/components/elements/hit/HitOutline.tsx index d75278b85..e9935f588 100644 --- a/ui/src/components/elements/hit/HitOutline.tsx +++ b/ui/src/components/elements/hit/HitOutline.tsx @@ -50,7 +50,7 @@ const HitOutline: FC<{ hit: WithMetadata; layout: HitLayout; forceAllFields fields: DEFAULT_FIELDS }); } - }, [hit, layout, template, templateFieldCount]); + }, [hit, layout, template, templateFieldCount, forceAllFields]); return ( diff --git a/ui/src/components/elements/hit/HitSummary.tsx b/ui/src/components/elements/hit/HitSummary.tsx index ca5247c60..886c6c865 100644 --- a/ui/src/components/elements/hit/HitSummary.tsx +++ b/ui/src/components/elements/hit/HitSummary.tsx @@ -181,7 +181,7 @@ const HitSummary: FC<{ } performAggregation(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [query, views, searching, error]); return ( diff --git a/ui/src/components/elements/hit/HitWorklog.tsx b/ui/src/components/elements/hit/HitWorklog.tsx index 014191c14..17a56fff0 100644 --- a/ui/src/components/elements/hit/HitWorklog.tsx +++ b/ui/src/components/elements/hit/HitWorklog.tsx @@ -74,7 +74,7 @@ const HitWorklog: FC<{ hit: Hit; users: { [id: string]: HowlerUser } }> = ({ hit return acc; }, [] as Log[][]); }, - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps [hit?.howler?.log] ); @@ -88,7 +88,7 @@ const HitWorklog: FC<{ hit: Hit; users: { [id: string]: HowlerUser } }> = ({ hit }); } }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); // We now render the actual HTML from our grouped worklog items diff --git a/ui/src/components/elements/hit/ResolvePivotUrl.ts b/ui/src/components/elements/hit/ResolvePivotUrl.ts index d6f248bd3..347042034 100644 --- a/ui/src/components/elements/hit/ResolvePivotUrl.ts +++ b/ui/src/components/elements/hit/ResolvePivotUrl.ts @@ -22,7 +22,7 @@ const resolvePivotUrl = (pivot: NonNullable[number], currentH try { return Handlebars.compile(pivot.value)(templateObject); } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Failed to compile pivot template for value "${pivot.value}":`, e); return pivot.value; } diff --git a/ui/src/components/elements/hit/aggregate/HitGraph.tsx b/ui/src/components/elements/hit/aggregate/HitGraph.tsx index be0152e5f..af33f5b21 100644 --- a/ui/src/components/elements/hit/aggregate/HitGraph.tsx +++ b/ui/src/components/elements/hit/aggregate/HitGraph.tsx @@ -152,7 +152,7 @@ const HitGraph: FC = () => { } performQuery(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [query, views, error, span, response, escalationFilter, filterField]); const options: ChartOptions<'scatter'> = useMemo(() => { diff --git a/ui/src/components/elements/hit/grid/EnhancedCell.tsx b/ui/src/components/elements/hit/grid/EnhancedCell.tsx index 648ca819a..6115cdb0b 100644 --- a/ui/src/components/elements/hit/grid/EnhancedCell.tsx +++ b/ui/src/components/elements/hit/grid/EnhancedCell.tsx @@ -1,4 +1,4 @@ -/* eslint-disable react/no-array-index-key */ +/* oxlint-disable react/no-array-index-key */ import { Stack, TableCell, type SxProps } from '@mui/material'; import PluginTypography from 'components/elements/PluginTypography'; import type { Hit } from 'models/entities/generated/Hit'; diff --git a/ui/src/components/elements/hit/grid/HitTable.tsx b/ui/src/components/elements/hit/grid/HitTable.tsx index b826352ab..f545cdf83 100644 --- a/ui/src/components/elements/hit/grid/HitTable.tsx +++ b/ui/src/components/elements/hit/grid/HitTable.tsx @@ -57,7 +57,7 @@ const HitTable = ({ }); } }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analyticIds, items]); const onMouseMove = useCallback((event: MouseEvent) => { diff --git a/ui/src/components/elements/hit/related/PivotLink.tsx b/ui/src/components/elements/hit/related/PivotLink.tsx index f8c6ce4d2..13c997f02 100644 --- a/ui/src/components/elements/hit/related/PivotLink.tsx +++ b/ui/src/components/elements/hit/related/PivotLink.tsx @@ -61,7 +61,7 @@ const PivotLink: FC = ({ pivot, hit, compact = false, dossier, r } handlebars.registerHelper(helper.keyword, (...args: any[]) => { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug(`Running helper ${helper.keyword}`); return helper.callback(...args); @@ -71,7 +71,7 @@ const PivotLink: FC = ({ pivot, hit, compact = false, dossier, r try { return handlebars.compile(pivot.value)(templateObject); } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Failed to compile pivot template for value "${pivot.value}":`, e); return pivot.value; } @@ -92,17 +92,17 @@ const PivotLink: FC = ({ pivot, hit, compact = false, dossier, r } // Hide a relatively useless console error, we'll show a UI component instead - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console const oldError = console.error; let pluginPivot: React.ReactElement = null; try { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error = () => {}; pluginPivot = pluginStore.executeFunction(`pivot.${pivot.format}`, { pivot, hit, compact }); } finally { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error = oldError; } diff --git a/ui/src/components/hooks/useLocalStorage.ts b/ui/src/components/hooks/useLocalStorage.ts index 99d60d615..f4a036c18 100644 --- a/ui/src/components/hooks/useLocalStorage.ts +++ b/ui/src/components/hooks/useLocalStorage.ts @@ -11,7 +11,7 @@ const useLocalStorage = (prefix?: string) => { (key: string): T => { try { return JSON.parse(localStorage.getItem(_buildKey(key))); - } catch (e) { + } catch { return null; } }, diff --git a/ui/src/components/hooks/useLocalStorageItem.test.tsx b/ui/src/components/hooks/useLocalStorageItem.test.tsx index b503e727c..c6bbaf3a8 100644 --- a/ui/src/components/hooks/useLocalStorageItem.test.tsx +++ b/ui/src/components/hooks/useLocalStorageItem.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ +/* oxlint-disable @typescript-eslint/no-unused-vars */ /// import { act, renderHook } from '@testing-library/react'; import { setupLocalStorageMock } from 'tests/mocks'; diff --git a/ui/src/components/hooks/useMyApi.tsx b/ui/src/components/hooks/useMyApi.tsx index 5261de649..5bce50877 100644 --- a/ui/src/components/hooks/useMyApi.tsx +++ b/ui/src/components/hooks/useMyApi.tsx @@ -20,7 +20,7 @@ const useMyApi = () => { const { showErrorMessage } = useMySnackbar(); const dispatchApi = useCallback( - // eslint-disable-next-line comma-spacing + // oxlint-disable-next-line comma-spacing async (apiCall: Promise, config: DispatchApiConfig = DEFAULT_CONFIG): Promise => { const { throwError, logError, showError, onConflict } = { ...DEFAULT_CONFIG, ...config }; try { @@ -38,7 +38,7 @@ const useMyApi = () => { } if (logError) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(error); } diff --git a/ui/src/components/hooks/useMyPreferences.tsx b/ui/src/components/hooks/useMyPreferences.tsx index fc2be0d97..63661ff58 100644 --- a/ui/src/components/hooks/useMyPreferences.tsx +++ b/ui/src/components/hooks/useMyPreferences.tsx @@ -39,222 +39,218 @@ const useMyPreferences = (): AppPreferenceConfigs => { const { leftItems, rightItems } = useContext(AppBarContext); // The following menu items will show up in the Left Navigation Drawer - const MENU_ITEMS = useMemo( - () => { - let defaultMenu: AppLeftNavElement[] = [ - { - type: 'item', - element: { - id: 'dashboard', - i18nKey: 'route.home', - route: '/', - icon: - } - }, - { - type: 'group', - element: { - id: 'views', - i18nKey: 'route.views.saved', - icon: , - items: [] - } - }, - { - type: 'group', - element: { - id: 'analytics', - i18nKey: 'route.analytics.pinned', - icon: , - items: [] - } - }, - { - type: 'divider', - element: null - }, - { - type: 'item', - element: { - id: 'search.hit', - i18nKey: 'route.search', - route: '/search', - icon: - } - }, - { - type: 'item', - element: { - id: 'advanced', - i18nKey: 'route.advanced', - route: '/advanced', - icon: - } - }, - { - type: 'divider', - element: null - }, - { - type: 'item', - element: { - id: 'manage.views', - i18nKey: 'route.views', - icon: , - route: '/views' - } - }, - { - type: 'item', - element: { - id: 'manage.analytics', - i18nKey: 'route.analytics', - icon: , - route: '/analytics' - } - }, - { - type: 'item', - element: { - id: 'manage.templates', - i18nKey: 'route.templates', - icon: , - route: '/templates' - } - }, - { - type: 'item', - element: { - id: 'manage.overviews', - i18nKey: 'route.overviews', - icon:
, - route: '/overviews' - } - }, - { - type: 'item', - element: { - id: 'manage.dossiers', - i18nKey: 'route.dossiers', - icon: , - route: '/dossiers' - } - }, - { - type: 'item', - element: { - id: 'manage.actions', - i18nKey: 'route.actions', - icon: , - route: '/action', - userPropValidators: [ - { prop: 'roles', value: 'automation_basic' }, - { prop: 'roles', value: 'automation_advanced' }, - { prop: 'roles', value: 'actionrunner_basic' }, - { prop: 'roles', value: 'actionrunner_advanced' } - ] - } - }, - { - type: 'item', - element: { - id: 'action.integrations', - i18nKey: 'route.integrations', - icon: , - route: '/action/integrations', - userPropValidators: [{ prop: 'roles', value: 'automation_basic' }] - } - }, - { - type: 'divider', - element: null - }, - { - type: 'group', - element: { - id: 'help', - i18nKey: 'page.help', - icon: , - items: [ - { - id: 'help.main', - i18nKey: 'route.help.main', - route: '/help', - nested: true, - icon: - }, - { - id: 'help.client', - i18nKey: 'route.help.client', - route: '/help/client', - nested: true, - icon: - }, - { id: 'help.hit', i18nKey: 'route.help.hit', route: '/help/hit', nested: true, icon: }, - { - id: 'help.search', - i18nKey: 'route.help.search', - route: '/help/search', - nested: true, - icon: - }, - { - id: 'help.views', - i18nKey: 'route.help.views', - route: '/help/views', - nested: true, - icon: - }, - { - id: 'help.templates', - i18nKey: 'route.help.templates', - route: '/help/templates', - nested: true, - icon: - }, - { - id: 'help.overview', - i18nKey: 'route.help.overviews', - route: '/help/overviews', - nested: true, - icon:
- }, - { id: 'help.auth', i18nKey: 'route.help.auth', route: '/help/auth', nested: true, icon: }, - { - id: 'help.actions', - i18nKey: 'route.help.actions', - route: '/help/actions', - nested: true, - icon: - }, - { - id: 'help.notebook', - i18nKey: 'route.help.notebook', - route: '/help/notebook', - nested: true, - icon: - }, - { id: 'help.api', i18nKey: 'route.help.api', route: '/help/api', nested: true, icon: }, - { - id: 'help.retention', - i18nKey: 'route.help.retention', - route: '/help/retention', - nested: true, - icon: - } - ] - } + const MENU_ITEMS = useMemo(() => { + let defaultMenu: AppLeftNavElement[] = [ + { + type: 'item', + element: { + id: 'dashboard', + i18nKey: 'route.home', + route: '/', + icon: + } + }, + { + type: 'group', + element: { + id: 'views', + i18nKey: 'route.views.saved', + icon: , + items: [] + } + }, + { + type: 'group', + element: { + id: 'analytics', + i18nKey: 'route.analytics.pinned', + icon: , + items: [] + } + }, + { + type: 'divider', + element: null + }, + { + type: 'item', + element: { + id: 'search.hit', + i18nKey: 'route.search', + route: '/search', + icon: } - ]; + }, + { + type: 'item', + element: { + id: 'advanced', + i18nKey: 'route.advanced', + route: '/advanced', + icon: + } + }, + { + type: 'divider', + element: null + }, + { + type: 'item', + element: { + id: 'manage.views', + i18nKey: 'route.views', + icon: , + route: '/views' + } + }, + { + type: 'item', + element: { + id: 'manage.analytics', + i18nKey: 'route.analytics', + icon: , + route: '/analytics' + } + }, + { + type: 'item', + element: { + id: 'manage.templates', + i18nKey: 'route.templates', + icon: , + route: '/templates' + } + }, + { + type: 'item', + element: { + id: 'manage.overviews', + i18nKey: 'route.overviews', + icon:
, + route: '/overviews' + } + }, + { + type: 'item', + element: { + id: 'manage.dossiers', + i18nKey: 'route.dossiers', + icon: , + route: '/dossiers' + } + }, + { + type: 'item', + element: { + id: 'manage.actions', + i18nKey: 'route.actions', + icon: , + route: '/action', + userPropValidators: [ + { prop: 'roles', value: 'automation_basic' }, + { prop: 'roles', value: 'automation_advanced' }, + { prop: 'roles', value: 'actionrunner_basic' }, + { prop: 'roles', value: 'actionrunner_advanced' } + ] + } + }, + { + type: 'item', + element: { + id: 'action.integrations', + i18nKey: 'route.integrations', + icon: , + route: '/action/integrations', + userPropValidators: [{ prop: 'roles', value: 'automation_basic' }] + } + }, + { + type: 'divider', + element: null + }, + { + type: 'group', + element: { + id: 'help', + i18nKey: 'page.help', + icon: , + items: [ + { + id: 'help.main', + i18nKey: 'route.help.main', + route: '/help', + nested: true, + icon: + }, + { + id: 'help.client', + i18nKey: 'route.help.client', + route: '/help/client', + nested: true, + icon: + }, + { id: 'help.hit', i18nKey: 'route.help.hit', route: '/help/hit', nested: true, icon: }, + { + id: 'help.search', + i18nKey: 'route.help.search', + route: '/help/search', + nested: true, + icon: + }, + { + id: 'help.views', + i18nKey: 'route.help.views', + route: '/help/views', + nested: true, + icon: + }, + { + id: 'help.templates', + i18nKey: 'route.help.templates', + route: '/help/templates', + nested: true, + icon: + }, + { + id: 'help.overview', + i18nKey: 'route.help.overviews', + route: '/help/overviews', + nested: true, + icon:
+ }, + { id: 'help.auth', i18nKey: 'route.help.auth', route: '/help/auth', nested: true, icon: }, + { + id: 'help.actions', + i18nKey: 'route.help.actions', + route: '/help/actions', + nested: true, + icon: + }, + { + id: 'help.notebook', + i18nKey: 'route.help.notebook', + route: '/help/notebook', + nested: true, + icon: + }, + { id: 'help.api', i18nKey: 'route.help.api', route: '/help/api', nested: true, icon: }, + { + id: 'help.retention', + i18nKey: 'route.help.retention', + route: '/help/retention', + nested: true, + icon: + } + ] + } + } + ]; - const appMenuBuilder = new AppMenuBuilder(defaultMenu); - appMenuBuilder.applyOperations(howlerPluginStore.mainMenuOperations); + const appMenuBuilder = new AppMenuBuilder(defaultMenu); + appMenuBuilder.applyOperations(howlerPluginStore.mainMenuOperations); - return appMenuBuilder.menu; - }, - // prettier-ignore - [] - ); + return appMenuBuilder.menu; + }, []); // This is the basic user menu, it is a menu that shows up in account avatar popover. const USER_MENU_ITEMS = useMemo(() => { diff --git a/ui/src/components/hooks/useMySnackbar.tsx b/ui/src/components/hooks/useMySnackbar.tsx index 4bb2ab5b3..a527431d3 100644 --- a/ui/src/components/hooks/useMySnackbar.tsx +++ b/ui/src/components/hooks/useMySnackbar.tsx @@ -41,16 +41,16 @@ const useMySnackbar = () => { [enqueueSnackbar, snackBarOptions] ); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps const showErrorMessage = useCallback(enqueue('error'), [enqueue]); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps const showWarningMessage = useCallback(enqueue('warning'), [enqueue]); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps const showSuccessMessage = useCallback(enqueue('success'), [enqueue]); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps const showInfoMessage = useCallback(enqueue('info'), [enqueue]); return useMemo( diff --git a/ui/src/components/hooks/useMyUserFunctions.tsx b/ui/src/components/hooks/useMyUserFunctions.tsx index 2183984c1..70eb20005 100644 --- a/ui/src/components/hooks/useMyUserFunctions.tsx +++ b/ui/src/components/hooks/useMyUserFunctions.tsx @@ -38,7 +38,7 @@ const useMyUserFunctions = () => { editQuota: useCallback( async (user: HowlerUser, quota: string) => { - // eslint-disable-next-line @typescript-eslint/naming-convention + // oxlint-disable-next-line @typescript-eslint/naming-convention const api_quota = parseInt(quota); await dispatchApi(api.user.put(user.username, { api_quota }), { throwError: true }); diff --git a/ui/src/components/hooks/useMyUserList.tsx b/ui/src/components/hooks/useMyUserList.tsx index fc79ead93..062332cdd 100644 --- a/ui/src/components/hooks/useMyUserList.tsx +++ b/ui/src/components/hooks/useMyUserList.tsx @@ -6,7 +6,7 @@ const useMyUserList = (ids: Set) => { useEffect(() => { fetchUsers(ids); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [ids]); return users; diff --git a/ui/src/components/hooks/useParamState.test.ts b/ui/src/components/hooks/useParamState.test.ts index c937db3c4..f342dfe48 100644 --- a/ui/src/components/hooks/useParamState.test.ts +++ b/ui/src/components/hooks/useParamState.test.ts @@ -7,7 +7,7 @@ import useParamState from './useParamState'; // Creates a MemoryRouter wrapper using createElement to avoid JSX in a .ts file const makeWrapper = (search = ''): FC => { - // eslint-disable-next-line react/function-component-definition + // oxlint-disable-next-line react/function-component-definition return ({ children }) => createElement(MemoryRouter, { initialEntries: [search ? `/?${search}` : '/'] }, children); }; diff --git a/ui/src/components/hooks/useScrollRestoration.tsx b/ui/src/components/hooks/useScrollRestoration.tsx index 3d1372da1..4c147eff3 100644 --- a/ui/src/components/hooks/useScrollRestoration.tsx +++ b/ui/src/components/hooks/useScrollRestoration.tsx @@ -17,7 +17,7 @@ const setScrollPosition = (key: string, pos: number) => { try { window.sessionStorage.setItem(key, pos.toString()); } catch { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.log('Session storage full, can not save the scroll position'); } }; diff --git a/ui/src/components/routes/action/edit/ActionEditor.tsx b/ui/src/components/routes/action/edit/ActionEditor.tsx index 4a81e733f..5aa67709c 100644 --- a/ui/src/components/routes/action/edit/ActionEditor.tsx +++ b/ui/src/components/routes/action/edit/ActionEditor.tsx @@ -114,7 +114,7 @@ const ActionEditor: FC = () => { if (responseQuery) { onSearch(responseQuery); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [dispatchApi, getHitFields]); useEffect(() => { @@ -149,7 +149,7 @@ const ActionEditor: FC = () => { onSearch(existingAction.query); }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [dispatchApi, params.id]); return ( @@ -174,13 +174,7 @@ const ActionEditor: FC = () => { !name || loading || userOperations.length < 1 || - userOperations.some( - a => - !operationReady( - a?.data_json, - operations.find(_a => _a.id === a.operation_id) - ) - ) + userOperations.some(a => !operationReady(a?.data_json, operations.find(_a => _a.id === a.operation_id))) } onClick={() => saveAction(name, responseQuery, userOperations, triggers)} > @@ -336,13 +330,7 @@ const ActionEditor: FC = () => { !response || loading || userOperations.length < 1 || - userOperations.some( - a => - !operationReady( - a?.data_json, - operations.find(_a => _a.id === a.operation_id) - ) - ) + userOperations.some(a => !operationReady(a?.data_json, operations.find(_a => _a.id === a.operation_id))) } onClick={_submitAction} > diff --git a/ui/src/components/routes/action/shared/OperationStep.tsx b/ui/src/components/routes/action/shared/OperationStep.tsx index 13f75f580..022103bcf 100644 --- a/ui/src/components/routes/action/shared/OperationStep.tsx +++ b/ui/src/components/routes/action/shared/OperationStep.tsx @@ -112,7 +112,7 @@ const OperationStep: FC<{ } finally { setValidating(false); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [step.validation?.error, step.validation?.warn, dispatchApi, query, substitute]); useEffect(() => { @@ -121,7 +121,7 @@ const OperationStep: FC<{ } THROTTLER.debounce(validate); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [filled, validate, query, values]); return ( diff --git a/ui/src/components/routes/action/useMyActionFunctions.tsx b/ui/src/components/routes/action/useMyActionFunctions.tsx index cee7047a7..c486e70b3 100644 --- a/ui/src/components/routes/action/useMyActionFunctions.tsx +++ b/ui/src/components/routes/action/useMyActionFunctions.tsx @@ -61,7 +61,7 @@ const useMyActionFunctions = () => { addListener<{ processed: number; total: number }>('action', handler); return () => removeListener('action'); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [handler]); return { diff --git a/ui/src/components/routes/action/view/ActionDetails.tsx b/ui/src/components/routes/action/view/ActionDetails.tsx index 05bb89ce6..dc431ea1d 100644 --- a/ui/src/components/routes/action/view/ActionDetails.tsx +++ b/ui/src/components/routes/action/view/ActionDetails.tsx @@ -97,7 +97,7 @@ const ActionDetails = () => { if (action?.query) { onSearch(action?.query); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [action?.query]); const editRoles = user.roles.includes('automation_basic') || user.roles.includes('automation_advanced'); diff --git a/ui/src/components/routes/action/view/ActionSearch.tsx b/ui/src/components/routes/action/view/ActionSearch.tsx index 031d7976a..6a69d6a66 100644 --- a/ui/src/components/routes/action/view/ActionSearch.tsx +++ b/ui/src/components/routes/action/view/ActionSearch.tsx @@ -80,7 +80,7 @@ const ActionSearch: FC = () => { rows: pageCount, offset }); - } catch (e) { + } catch { setHasError(true); } finally { setSearching(false); @@ -128,7 +128,7 @@ const ActionSearch: FC = () => { setSearchParams(searchParams, { replace: true }); } }, - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -144,12 +144,12 @@ const ActionSearch: FC = () => { if (!searching) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); useEffect(() => { onSearch(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [searchModifiers]); const editRoles = user.roles.includes('automation_basic') || user.roles.includes('automation_advanced'); diff --git a/ui/src/components/routes/action/view/Integrations.tsx b/ui/src/components/routes/action/view/Integrations.tsx index c41769049..0b6af9972 100644 --- a/ui/src/components/routes/action/view/Integrations.tsx +++ b/ui/src/components/routes/action/view/Integrations.tsx @@ -31,7 +31,7 @@ const Integrations: FC = () => { useEffect(() => { searchParams.set('tab', tab); setSearchParams(searchParams); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [tab]); const tabData = useMemo(() => { diff --git a/ui/src/components/routes/admin/users/UserSearch.tsx b/ui/src/components/routes/admin/users/UserSearch.tsx index f4dd70d03..fd6f2129b 100644 --- a/ui/src/components/routes/admin/users/UserSearch.tsx +++ b/ui/src/components/routes/admin/users/UserSearch.tsx @@ -103,7 +103,7 @@ const UserSearch: FC = () => { setSearchParams(searchParams); } }, - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -119,7 +119,7 @@ const UserSearch: FC = () => { if (!searching) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); // TuiTable cell renderer diff --git a/ui/src/components/routes/advanced/QueryBuilder.tsx b/ui/src/components/routes/advanced/QueryBuilder.tsx index bc3ab3763..b25e042e8 100644 --- a/ui/src/components/routes/advanced/QueryBuilder.tsx +++ b/ui/src/components/routes/advanced/QueryBuilder.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-useless-escape */ +/* oxlint-disable no-useless-escape */ import { useMonaco } from '@monaco-editor/react'; import { OpenInNew, PlayArrowOutlined, SsidChart } from '@mui/icons-material'; import { diff --git a/ui/src/components/routes/advanced/eqlTokenProvider.ts b/ui/src/components/routes/advanced/eqlTokenProvider.ts index 80c39d083..23fabf502 100644 --- a/ui/src/components/routes/advanced/eqlTokenProvider.ts +++ b/ui/src/components/routes/advanced/eqlTokenProvider.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-useless-escape */ +/* oxlint-disable no-useless-escape */ import type { languages } from 'monaco-editor'; /** diff --git a/ui/src/components/routes/advanced/luceneTokenProvider.ts b/ui/src/components/routes/advanced/luceneTokenProvider.ts index a2994e7d4..9bc68bf02 100644 --- a/ui/src/components/routes/advanced/luceneTokenProvider.ts +++ b/ui/src/components/routes/advanced/luceneTokenProvider.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-useless-escape */ +/* oxlint-disable no-useless-escape */ import type { languages } from 'monaco-editor'; /** diff --git a/ui/src/components/routes/analytics/AnalyticComments.tsx b/ui/src/components/routes/analytics/AnalyticComments.tsx index fb22ffce1..9b17e8596 100644 --- a/ui/src/components/routes/analytics/AnalyticComments.tsx +++ b/ui/src/components/routes/analytics/AnalyticComments.tsx @@ -145,7 +145,7 @@ const AnalyticComments: FC<{ analytic: Analytic; setAnalytic: (a: Analytic) => v useEffect(() => { setUserIds(new Set(analytic?.comment.map(c => c.user))); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analytic?.analytic_id]); const comments = useMemo( diff --git a/ui/src/components/routes/analytics/AnalyticSearch.tsx b/ui/src/components/routes/analytics/AnalyticSearch.tsx index 4b8fd5cf0..8fa38580f 100644 --- a/ui/src/components/routes/analytics/AnalyticSearch.tsx +++ b/ui/src/components/routes/analytics/AnalyticSearch.tsx @@ -102,7 +102,7 @@ const AnalyticSearchBase: FC = () => { offset }); load(_response.items.map(u => ({ id: u.analytic_id, item: u }))); - } catch (e) { + } catch { setHasError(true); } finally { setSearching(false); @@ -144,7 +144,7 @@ const AnalyticSearchBase: FC = () => { setSearchParams(searchParams, { replace: true }); } }, - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps [onlyRules] ); @@ -160,7 +160,7 @@ const AnalyticSearchBase: FC = () => { if (!searching) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); // Search result list item renderer. diff --git a/ui/src/components/routes/analytics/widgets/Stacked.tsx b/ui/src/components/routes/analytics/widgets/Stacked.tsx index e7b19bbc1..33aff67c3 100644 --- a/ui/src/components/routes/analytics/widgets/Stacked.tsx +++ b/ui/src/components/routes/analytics/widgets/Stacked.tsx @@ -66,7 +66,7 @@ const Stacked = forwardRef< } finally { setLoading(false); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analytic?.name, color, field]); useEffect(() => { diff --git a/ui/src/components/routes/dossiers/DossierEditor.test.tsx b/ui/src/components/routes/dossiers/DossierEditor.test.tsx index 2ddece6d8..0bf439942 100644 --- a/ui/src/components/routes/dossiers/DossierEditor.test.tsx +++ b/ui/src/components/routes/dossiers/DossierEditor.test.tsx @@ -117,7 +117,7 @@ import DossierEditor from './DossierEditor'; const mockUseParams = vi.mocked(useParams); const mockUseSearchParams = vi.mocked(useSearchParams); -// eslint-disable-next-line react-hooks/rules-of-hooks +// oxlint-disable-next-line react-hooks/rules-of-hooks const mockNavigate = vi.mocked(useNavigate()); // Mock ParameterContext diff --git a/ui/src/components/routes/dossiers/DossierEditor.tsx b/ui/src/components/routes/dossiers/DossierEditor.tsx index 3ba70315e..d045eddf3 100644 --- a/ui/src/components/routes/dossiers/DossierEditor.tsx +++ b/ui/src/components/routes/dossiers/DossierEditor.tsx @@ -225,7 +225,7 @@ const DossierEditor: FC = () => { } setSearchParams(searchParams, { replace: true }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [setSearchParams, tab]); return ( diff --git a/ui/src/components/routes/dossiers/Dossiers.tsx b/ui/src/components/routes/dossiers/Dossiers.tsx index 66f2cdd88..865b9721f 100644 --- a/ui/src/components/routes/dossiers/Dossiers.tsx +++ b/ui/src/components/routes/dossiers/Dossiers.tsx @@ -57,7 +57,7 @@ const DossiersBase: FC = () => { rows: pageCount, offset }); - } catch (e) { + } catch { setHasError(true); } finally { setLoading(false); @@ -77,7 +77,7 @@ const DossiersBase: FC = () => { })) ); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [response, load]); const onPageChange = useCallback( @@ -103,7 +103,7 @@ const DossiersBase: FC = () => { remove(id); showSuccessMessage(t('route.dossiers.manager.delete.success')); } catch (_err) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn(_err); } }); @@ -118,7 +118,7 @@ const DossiersBase: FC = () => { searchParams.set('offset', '0'); setSearchParams(searchParams, { replace: true }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -133,7 +133,7 @@ const DossiersBase: FC = () => { if (!loading) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); const renderer = useCallback( diff --git a/ui/src/components/routes/dossiers/LeadForm.tsx b/ui/src/components/routes/dossiers/LeadForm.tsx index 9598114de..897f335b5 100644 --- a/ui/src/components/routes/dossiers/LeadForm.tsx +++ b/ui/src/components/routes/dossiers/LeadForm.tsx @@ -26,7 +26,7 @@ const LeadForm: FC<{ dossier: Dossier; setDossier: Dispatch = ({ pivot, update }) => { {t('route.dossiers.manager.pivot.mappings')} {pivot?.mappings?.map((_mapping, index) => ( - // eslint-disable-next-line react/no-array-index-key + // oxlint-disable-next-line react/no-array-index-key { .get() .then(_operations => _operations.filter(a => difference(a.roles, user.roles).length < a.roles.length)) .then(setOperations) - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console .catch(console.debug); }, [user.roles]); diff --git a/ui/src/components/routes/help/SearchDocumentation.tsx b/ui/src/components/routes/help/SearchDocumentation.tsx index e65da1e91..fbb6dc54a 100644 --- a/ui/src/components/routes/help/SearchDocumentation.tsx +++ b/ui/src/components/routes/help/SearchDocumentation.tsx @@ -267,7 +267,7 @@ const SearchDocumentation: FC = () => { https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/keyword @@ -296,7 +296,7 @@ const SearchDocumentation: FC = () => { https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/text @@ -307,7 +307,7 @@ const SearchDocumentation: FC = () => { https://www.elastic.co/blog/strings-are-dead-long-live-strings diff --git a/ui/src/components/routes/hits/search/HitBrowser.tsx b/ui/src/components/routes/hits/search/HitBrowser.tsx index 1468c8df3..e0e3d8625 100644 --- a/ui/src/components/routes/hits/search/HitBrowser.tsx +++ b/ui/src/components/routes/hits/search/HitBrowser.tsx @@ -101,7 +101,7 @@ const HitBrowser: FC = () => { useEffect(() => { fetchViews(selectedViews); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [location.pathname, location.search]); const onClose = useCallback(() => { @@ -125,7 +125,7 @@ const HitBrowser: FC = () => { if (selected && !selectedHits.some(_hit => _hit?.howler.id === selected)) { addHitToSelection(selected); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [addHitToSelection, location.pathname, removeHitFromSelection, response, routeParams.id, selected, setSelected]); return ( diff --git a/ui/src/components/routes/hits/search/InformationPane.tsx b/ui/src/components/routes/hits/search/InformationPane.tsx index 7b5e74a10..f76e16923 100644 --- a/ui/src/components/routes/hits/search/InformationPane.tsx +++ b/ui/src/components/routes/hits/search/InformationPane.tsx @@ -86,7 +86,7 @@ const InformationPane: FC<{ onClose?: () => void }> = ({ onClose }) => { setUserIds(getUserList(hit)); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [getHit, selected]); useEffect(() => { @@ -142,7 +142,7 @@ const InformationPane: FC<{ onClose?: () => void }> = ({ onClose }) => { } else if (!hasOverview && tab === 'overview') { setTab('details'); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hasOverview]); /** @@ -311,7 +311,7 @@ const InformationPane: FC<{ onClose?: () => void }> = ({ onClose }) => { setTab('details')} /> {hit?.howler.dossier?.map((lead, index) => ( @@ -326,7 +326,7 @@ const InformationPane: FC<{ onClose?: () => void }> = ({ onClose }) => { {dossiers.flatMap((_dossier, dossierIndex) => (_dossier.leads ?? []).map((_lead, leadIndex) => ( diff --git a/ui/src/components/routes/hits/search/SearchPane.tsx b/ui/src/components/routes/hits/search/SearchPane.tsx index 996080a63..61f9e2fee 100644 --- a/ui/src/components/routes/hits/search/SearchPane.tsx +++ b/ui/src/components/routes/hits/search/SearchPane.tsx @@ -139,7 +139,7 @@ const SearchPane: FC = () => { if (location.pathname.startsWith('/bundles')) { getHit(routeParams.id); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [location.pathname, routeParams.id]); return ( diff --git a/ui/src/components/routes/hits/search/shared/CustomSort.tsx b/ui/src/components/routes/hits/search/shared/CustomSort.tsx index 9431906f7..c3c2a68c5 100644 --- a/ui/src/components/routes/hits/search/shared/CustomSort.tsx +++ b/ui/src/components/routes/hits/search/shared/CustomSort.tsx @@ -38,7 +38,7 @@ const CustomSort: FC = () => { } setSavedSort(uniqBy([...sortEntries, `${field} ${sort}`], entry => entry.replace(/ .+/, '')).join(',')); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [field]); return ( diff --git a/ui/src/components/routes/hits/search/shared/CustomSpan.test.tsx b/ui/src/components/routes/hits/search/shared/CustomSpan.test.tsx index cd62b2156..3b97162cc 100644 --- a/ui/src/components/routes/hits/search/shared/CustomSpan.test.tsx +++ b/ui/src/components/routes/hits/search/shared/CustomSpan.test.tsx @@ -35,8 +35,9 @@ const defaultCtx: Partial = { setCustomSpan: mockSetCustomSpan }; -const makeWrapper = (ctx: Partial) => - function ({ children }: PropsWithChildren) { +const makeWrapper = + (ctx: Partial) => + ({ children }: PropsWithChildren) => { return ( {children} diff --git a/ui/src/components/routes/hits/search/shared/HitSort.tsx b/ui/src/components/routes/hits/search/shared/HitSort.tsx index 614294b68..125690681 100644 --- a/ui/src/components/routes/hits/search/shared/HitSort.tsx +++ b/ui/src/components/routes/hits/search/shared/HitSort.tsx @@ -81,7 +81,7 @@ const HitSort: FC<{ size?: 'small' | 'medium' }> = ({ size = 'small' }) => { setSavedSort(selectedViewSort); } })(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [getCurrentViews, views]); return ( diff --git a/ui/src/components/routes/hits/search/shared/SearchSpan.tsx b/ui/src/components/routes/hits/search/shared/SearchSpan.tsx index 093d1ce35..99f55c3fd 100644 --- a/ui/src/components/routes/hits/search/shared/SearchSpan.tsx +++ b/ui/src/components/routes/hits/search/shared/SearchSpan.tsx @@ -60,7 +60,7 @@ const SearchSpan: FC<{ setSpan(selectedViewSpan); } })(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [getCurrentViews, views]); return ( diff --git a/ui/src/components/routes/hits/view/HitViewer.tsx b/ui/src/components/routes/hits/view/HitViewer.tsx index 4a31828ef..2b032400c 100644 --- a/ui/src/components/routes/hits/view/HitViewer.tsx +++ b/ui/src/components/routes/hits/view/HitViewer.tsx @@ -113,7 +113,7 @@ const HitViewer: FC = () => { } else if (!hasOverview && tab === 'overview') { setTab('details'); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hasOverview]); const tabContent = useMemo(() => { @@ -242,7 +242,7 @@ const HitViewer: FC = () => { {hit?.howler.dossier?.map((lead, index) => ( @@ -258,7 +258,7 @@ const HitViewer: FC = () => { {dossiers.flatMap((_dossier, dossierIndex) => (_dossier.leads ?? []).map((_lead, leadIndex) => ( diff --git a/ui/src/components/routes/home/ViewCard.tsx b/ui/src/components/routes/home/ViewCard.tsx index 7028b4770..ab6d11292 100644 --- a/ui/src/components/routes/home/ViewCard.tsx +++ b/ui/src/components/routes/home/ViewCard.tsx @@ -136,7 +136,7 @@ const ViewCard: FC = ({ viewId, limit, refreshTick, onRefreshCompl if (refreshTick) { refreshView(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [refreshTick]); useEffect(() => { diff --git a/ui/src/components/routes/overviews/OverviewViewer.tsx b/ui/src/components/routes/overviews/OverviewViewer.tsx index c9ff1e2cc..a97e5f687 100644 --- a/ui/src/components/routes/overviews/OverviewViewer.tsx +++ b/ui/src/components/routes/overviews/OverviewViewer.tsx @@ -93,7 +93,7 @@ const OverviewViewer = () => { } })(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analytic, dispatchApi]); useEffect(() => { diff --git a/ui/src/components/routes/overviews/Overviews.tsx b/ui/src/components/routes/overviews/Overviews.tsx index f15142ef3..380965496 100644 --- a/ui/src/components/routes/overviews/Overviews.tsx +++ b/ui/src/components/routes/overviews/Overviews.tsx @@ -57,7 +57,7 @@ const OverviewsBase: FC = () => { rows: pageCount, offset }); - } catch (e) { + } catch { setHasError(true); } finally { setLoading(false); @@ -77,7 +77,7 @@ const OverviewsBase: FC = () => { })) ); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [response, load]); const onPageChange = useCallback( @@ -103,7 +103,7 @@ const OverviewsBase: FC = () => { remove(id); showSuccessMessage(t('route.overviews.manager.delete.success')); } catch (_err) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn(_err); } }); @@ -118,7 +118,7 @@ const OverviewsBase: FC = () => { searchParams.set('offset', '0'); setSearchParams(searchParams, { replace: true }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -133,7 +133,7 @@ const OverviewsBase: FC = () => { if (!loading) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); const renderer = useCallback( diff --git a/ui/src/components/routes/settings/LocalSection.tsx b/ui/src/components/routes/settings/LocalSection.tsx index 7aa363896..dff3744ba 100644 --- a/ui/src/components/routes/settings/LocalSection.tsx +++ b/ui/src/components/routes/settings/LocalSection.tsx @@ -1,4 +1,4 @@ -/* eslint-disable react/jsx-no-literals */ +/* oxlint-disable react/jsx-no-literals */ import { List, TableChart, ViewComfy, ViewCompact, ViewModule } from '@mui/icons-material'; import { MenuItem, diff --git a/ui/src/components/routes/templates/TemplateViewer.tsx b/ui/src/components/routes/templates/TemplateViewer.tsx index 41c47bdc5..4ae33017c 100644 --- a/ui/src/components/routes/templates/TemplateViewer.tsx +++ b/ui/src/components/routes/templates/TemplateViewer.tsx @@ -71,7 +71,7 @@ const TemplateViewer = () => { }); dispatchApi(api.template.get()).then(setTemplateList); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [analytic, dispatchApi]); useEffect(() => { diff --git a/ui/src/components/routes/templates/Templates.tsx b/ui/src/components/routes/templates/Templates.tsx index 080c44b43..bfafdfdb4 100644 --- a/ui/src/components/routes/templates/Templates.tsx +++ b/ui/src/components/routes/templates/Templates.tsx @@ -63,7 +63,7 @@ const TemplatesBase: FC = () => { rows: pageCount, offset }); - } catch (e) { + } catch { setHasError(true); } finally { setSearching(false); @@ -111,7 +111,7 @@ const TemplatesBase: FC = () => { searchParams.set('offset', '0'); setSearchParams(searchParams, { replace: true }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [dispatchApi, types]); useEffect(() => { @@ -126,7 +126,7 @@ const TemplatesBase: FC = () => { if (!searching) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset]); const removeTemplate = useCallback( diff --git a/ui/src/components/routes/views/ViewComposer.tsx b/ui/src/components/routes/views/ViewComposer.tsx index d395de0db..a71a448b1 100644 --- a/ui/src/components/routes/views/ViewComposer.tsx +++ b/ui/src/components/routes/views/ViewComposer.tsx @@ -186,7 +186,7 @@ const ViewComposer: FC = () => { useEffect(() => { search(query || DEFAULT_QUERY); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); // We only run this when ancillary properties (i.e. filters, sorting) change @@ -194,7 +194,7 @@ const ViewComposer: FC = () => { if (query) { search(query); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [sort, span]); useEffect(() => { @@ -226,7 +226,7 @@ const ViewComposer: FC = () => { setSpan(viewToEdit.span); } })(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [routeParams.id]); return ( diff --git a/ui/src/components/routes/views/Views.tsx b/ui/src/components/routes/views/Views.tsx index 9533acb11..6ac629b0d 100644 --- a/ui/src/components/routes/views/Views.tsx +++ b/ui/src/components/routes/views/Views.tsx @@ -96,7 +96,7 @@ const ViewsBase: FC = () => { rows: pageCount, offset }); - } catch (e) { + } catch { setHasError(true); } finally { setSearching(false); @@ -127,7 +127,7 @@ const ViewsBase: FC = () => { })) ); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [response, load]); const onPageChange = useCallback( @@ -228,7 +228,7 @@ const ViewsBase: FC = () => { if (!searching) { onSearch(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [offset, favouritesOnly, type]); return ( diff --git a/ui/src/plugins/HowlerPlugin.ts b/ui/src/plugins/HowlerPlugin.ts index 975529479..d3ea7d4f4 100644 --- a/ui/src/plugins/HowlerPlugin.ts +++ b/ui/src/plugins/HowlerPlugin.ts @@ -82,7 +82,7 @@ abstract class HowlerPlugin implements IPlugin { renderer: (content: string, metadata: any, hit?: Hit) => React.ReactNode ) { if (!howlerPluginStore.addLead(format)) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Lead format ${format} already configured, not enabling for plugin ${this.getPluginName()}`); return; } @@ -93,7 +93,7 @@ abstract class HowlerPlugin implements IPlugin { this.pluginStore.addFunction(`lead.${format}.form`, form); this.functionsToRemove.push(`lead.${format}.form`); - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug(`Lead format ${format} enabled for plugin ${this.getPluginName()}`); } @@ -103,7 +103,7 @@ abstract class HowlerPlugin implements IPlugin { renderer: (props: PivotLinkProps) => React.ReactNode ) { if (!howlerPluginStore.addPivot(format)) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Pivot format ${format} already configured, not enabling for plugin ${this.getPluginName()}`); return; } @@ -114,7 +114,7 @@ abstract class HowlerPlugin implements IPlugin { this.pluginStore.addFunction(`pivot.${format}.form`, form); this.functionsToRemove.push(`pivot.${format}.form`); - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug(`Pivot format ${format} enabled for plugin ${this.getPluginName()}`); } @@ -196,7 +196,7 @@ abstract class HowlerPlugin implements IPlugin { if (isRoot) { if (breadcrumbs != null) { breadcrumbs = null; - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn(`Sitemap '${path}' with isRoot should not contain breadcrumbs and have been removed`); } } @@ -309,7 +309,7 @@ abstract class HowlerPlugin implements IPlugin { documentation: PluginDocumentation ) { if (!howlerPluginStore.addOperation(format)) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.error(`Operation ${format} already configured, not enabling for plugin ${this.getPluginName()}`); return; } @@ -320,7 +320,7 @@ abstract class HowlerPlugin implements IPlugin { this.pluginStore.addFunction(`operation.${format}.documentation`, () => documentation); this.functionsToRemove.push(`operation.${format}.documentation`); - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug(`Operation ${format} enabled for plugin ${this.getPluginName()}`); } diff --git a/ui/src/plugins/clue/helpers.tsx b/ui/src/plugins/clue/helpers.tsx index c33250555..d5f60b9be 100644 --- a/ui/src/plugins/clue/helpers.tsx +++ b/ui/src/plugins/clue/helpers.tsx @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import EnrichedTypography, { type EnrichedTypographyProps } from '@cccsaurora/clue-ui/components/EnrichedTypography'; import Fetcher from '@cccsaurora/clue-ui/components/fetchers/Fetcher'; import Entry from '@cccsaurora/clue-ui/components/group/Entry'; @@ -73,7 +73,7 @@ const ClueGroup: FC> = pr return ( {i18nInstance.t('markdown.error')} - {/* eslint-disable-next-line react/jsx-no-literals */} + {/* oxlint-disable-next-line react/jsx-no-literals */} {i18nInstance.t('markdown.props.missing')}: type ); @@ -120,7 +120,7 @@ const HELPERS: HowlerHelper[] = [ return ( {i18nInstance.t('markdown.error')} - {/* eslint-disable-next-line react/jsx-no-literals */} + {/* oxlint-disable-next-line react/jsx-no-literals */} {i18nInstance.t('markdown.helpers.clue.arguments')} ); diff --git a/ui/src/plugins/clue/setup.ts b/ui/src/plugins/clue/setup.ts index 523872c7b..5844061d6 100644 --- a/ui/src/plugins/clue/setup.ts +++ b/ui/src/plugins/clue/setup.ts @@ -16,7 +16,7 @@ const useSetup = () => { const features: { [index: string]: boolean } = config.configuration?.features ?? {}; useEffect(() => { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.debug('Initializing clue snackbar event handler'); const handleMessage = (event: CustomEvent) => { @@ -47,7 +47,7 @@ const useSetup = () => { if (features.borealis || features.clue) { clue.setReady(true); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react-hooks/exhaustive-deps }, [features, appUser.isReady()]); }; diff --git a/ui/src/plugins/store.ts b/ui/src/plugins/store.ts index 688b6df5d..57a12ab62 100644 --- a/ui/src/plugins/store.ts +++ b/ui/src/plugins/store.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ +/* oxlint-disable no-console */ import type { Hit } from 'models/entities/generated/Hit'; import { createPluginStore, Event } from 'react-pluggable'; import type { AppLeftNavElement } from '../commons/components/app/AppConfigs'; diff --git a/ui/src/rest/AxiosClient.ts b/ui/src/rest/AxiosClient.ts index dc0398662..232221045 100644 --- a/ui/src/rest/AxiosClient.ts +++ b/ui/src/rest/AxiosClient.ts @@ -1,6 +1,6 @@ import type { HowlerResponse } from 'api'; import type { AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders } from 'axios'; -import axios, { AxiosError } from 'axios'; +import { AxiosError, create } from 'axios'; import axiosRetry, { exponentialDelay, isNetworkError } from 'axios-retry'; import type RestClient from 'rest'; import { getAxiosCache, setAxiosCache } from 'utils/sessionStorage'; @@ -33,7 +33,7 @@ export default class AxiosClient implements RestClient { private client: AxiosInstance; constructor() { - this.client = axios.create({ + this.client = create({ validateStatus: status => (status >= 200 && status < 300) || status === 304 }); diff --git a/ui/src/rest/index.ts b/ui/src/rest/index.ts index 384d68220..f3b0ad118 100644 --- a/ui/src/rest/index.ts +++ b/ui/src/rest/index.ts @@ -8,5 +8,5 @@ export default interface RestClient { params?: URLSearchParams, headers?: HeadersInit ): Promise<[HowlerResponse, number, { [index: string]: any }]>; - // eslint-disable-next-line semi + // oxlint-disable-next-line semi } diff --git a/ui/src/utils/localStorage.ts b/ui/src/utils/localStorage.ts index de0261781..a3b14b607 100644 --- a/ui/src/utils/localStorage.ts +++ b/ui/src/utils/localStorage.ts @@ -29,7 +29,7 @@ export const setStored = (name: StorageKey, item: any) => { export const getStored = (name?: StorageKey): T => { try { return JSON.parse(localStorage.getItem(buildName(name))) as T; - } catch (e) { + } catch { // Migrating from the old system, some values were not JSON encoded. Decoding them will cause an exception. // Obviously, this is not optimal, but it's the only way to get Typescript to play nice. // When this is called, T will be type string. diff --git a/ui/src/utils/menuUtils.ts b/ui/src/utils/menuUtils.ts index b8068158b..0cd888a77 100644 --- a/ui/src/utils/menuUtils.ts +++ b/ui/src/utils/menuUtils.ts @@ -1,3 +1,4 @@ +// oxlint-disable no-console import { isNil } from 'lodash-es'; import type { AppLeftNavElement, AppLeftNavGroup, AppLeftNavItem } from '../commons/components/app/AppConfigs'; import { MainMenuInsertOperation } from '../plugins/store'; diff --git a/ui/src/utils/sessionStorage.ts b/ui/src/utils/sessionStorage.ts index 629177bb8..a16f3954c 100644 --- a/ui/src/utils/sessionStorage.ts +++ b/ui/src/utils/sessionStorage.ts @@ -34,7 +34,7 @@ const { try { sessionStorage.setItem(_name, JSON.stringify(data)); } catch (e) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console console.warn('Quota Error when saving to sessionStorage', e); } }); diff --git a/ui/src/utils/utils.ts b/ui/src/utils/utils.ts index 6e34814d4..fc1fd2af6 100644 --- a/ui/src/utils/utils.ts +++ b/ui/src/utils/utils.ts @@ -67,7 +67,7 @@ export const stringToColor = (string: string) => { const colorKeys = Object.keys(colors).filter(key => key !== 'common'); const colorKey = colorKeys[number % colorKeys.length]; - // eslint-disable-next-line import/namespace + // oxlint-disable-next-line import/namespace const color = colors[colorKey] as { [shade: string]: string }; const shade = Math.max(Math.floor((number / 1000) % 10), 1) * 100; @@ -137,7 +137,7 @@ export const searchObject = (o: any, query: string, returnFlat = false) => { Object.fromEntries(Object.entries(flatten(o)).filter(([k, v]) => regex.test(k) || regex.test(v))) ?? {}; return returnFlat ? filteredData : unflatten(filteredData); - } catch (e) { + } catch { return returnFlat ? flatten(o) : o; } }; @@ -182,7 +182,7 @@ export const convertLuceneToDate = (lucene: string) => { export const tryParse = (json: string) => { try { return JSON.parse(json); - } catch (e) { + } catch { return json; } }; diff --git a/ui/src/utils/xsrf.ts b/ui/src/utils/xsrf.ts index 2b866a07f..af657af76 100644 --- a/ui/src/utils/xsrf.ts +++ b/ui/src/utils/xsrf.ts @@ -1,12 +1,12 @@ const getXSRFCookie = () => { if (document.cookie !== undefined) { try { - // eslint-disable-next-line prefer-destructuring + // oxlint-disable-next-line prefer-destructuring return document.cookie .split('; ') .find(row => row.startsWith('XSRF-TOKEN')) .split('=')[1]; - } catch (ex) { + } catch { // Ignore... we will return null } } diff --git a/ui/tsconfig.json b/ui/tsconfig.json index cb9bf9051..79d7b2a6f 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -24,51 +24,21 @@ /* for imports. */ "rootDir": "./src", "paths": { - "api": [ - "./src/api/index.ts" - ], - "api/*": [ - "./src/api/*" - ], - "branding/*": [ - "./src/branding/*" - ], - "commons/*": [ - "./src/commons/*" - ], - "components/*": [ - "./src/components/*" - ], - "globals.d.ts": [ - "./src/globals.d.ts" - ], - "i18n": [ - "./src/i18n.ts" - ], - "index.css": [ - "./src/index.css" - ], - "locales/*": [ - "./src/locales/*" - ], - "models/*": [ - "./src/models/*" - ], - "plugins/*": [ - "./src/plugins/*" - ], - "rest": [ - "./src/rest/index.ts" - ], - "rest/*": [ - "./src/rest/*" - ], - "tests/*": [ - "./src/tests/*" - ], - "utils/*": [ - "./src/utils/*" - ] + "api": ["./src/api/index.ts"], + "api/*": ["./src/api/*"], + "branding/*": ["./src/branding/*"], + "commons/*": ["./src/commons/*"], + "components/*": ["./src/components/*"], + "globals.d.ts": ["./src/globals.d.ts"], + "i18n": ["./src/i18n.ts"], + "index.css": ["./src/index.css"], + "locales/*": ["./src/locales/*"], + "models/*": ["./src/models/*"], + "plugins/*": ["./src/plugins/*"], + "rest": ["./src/rest/index.ts"], + "rest/*": ["./src/rest/*"], + "tests/*": ["./src/tests/*"], + "utils/*": ["./src/utils/*"] }, "outDir": "dist" From 1d95ac3d5982f1226c01e605898d9919382a5bd6 Mon Sep 17 00:00:00 2001 From: Matthew Rafuse Date: Thu, 9 Jul 2026 14:40:31 -0400 Subject: [PATCH 05/13] working on test fixes --- .pre-commit-config.yaml | 14 ++-- ui/.oxlintrc.json | 6 +- ui/build_scripts/oxfmt.sh | 4 -- ui/build_scripts/oxlint.sh | 25 ++++++- ui/package.json | 3 +- ui/pnpm-lock.yaml | 69 ++++++++++++++++++- ui/src/api/search/action.ts | 2 +- ui/src/api/search/analytic.ts | 2 +- ui/src/api/search/count/hit.ts | 2 +- ui/src/api/search/dossier.ts | 2 +- ui/src/api/search/eql/hit.ts | 2 +- ui/src/api/search/explain/hit.ts | 2 +- ui/src/api/search/facet/hit.ts | 2 +- ui/src/api/search/grouped/hit.ts | 2 +- ui/src/api/search/grouped/user.ts | 2 +- ui/src/api/search/histogram/hit.ts | 2 +- ui/src/api/search/hit.ts | 2 +- ui/src/api/search/overview.ts | 2 +- ui/src/api/search/sigma/hit.ts | 2 +- ui/src/api/search/template.ts | 2 +- ui/src/api/search/user.ts | 2 +- ui/src/api/search/view.ts | 2 +- ui/src/components/app/App.tsx | 4 +- ui/src/components/app/hooks/useTitle.tsx | 2 +- .../app/providers/AnalyticProvider.tsx | 2 +- .../app/providers/FavouritesProvider.tsx | 2 +- .../app/providers/GridColumnsProvider.tsx | 2 +- .../components/app/providers/HitProvider.tsx | 4 +- .../app/providers/HitSearchProvider.test.tsx | 3 +- .../app/providers/HitSearchProvider.tsx | 4 +- .../app/providers/OverviewProvider.tsx | 2 +- .../app/providers/SearchResponseProvider.tsx | 6 +- .../app/providers/SocketProvider.tsx | 2 +- .../components/app/providers/ViewProvider.tsx | 6 +- ui/src/components/elements/Comment.tsx | 2 +- ui/src/components/elements/EditRow.tsx | 6 +- .../addons/buttons/CustomButton.test.tsx | 1 - .../addons/buttons/CustomIconButton.test.tsx | 1 - .../elements/addons/layout/FlexOne.test.tsx | 1 - .../addons/layout/FlexVertical.test.tsx | 1 - .../addons/layout/vsbox/VSBoxContent.test.tsx | 1 - .../elements/addons/lists/TuiListMenu.tsx | 2 +- .../addons/search/SearchPagination.test.tsx | 1 - .../addons/search/SearchTotal.test.tsx | 1 - .../elements/addons/search/phrase/Phrase.tsx | 2 +- .../addons/search/phrase/WordLexer.test.ts | 1 - .../elements/display/ActionButton.tsx | 2 +- .../elements/display/ChipPopper.test.tsx | 1 - .../display/DocumentationButton.test.tsx | 2 - .../elements/display/DynamicTabs.test.tsx | 1 - .../elements/display/HandlebarsMarkdown.tsx | 6 +- .../elements/display/HowlerAvatar.tsx | 4 +- .../elements/display/HowlerCard.test.tsx | 1 - .../elements/display/Image.test.tsx | 1 - ui/src/components/elements/display/Image.tsx | 4 +- .../components/elements/display/Markdown.tsx | 2 +- .../elements/display/QueryResultText.test.tsx | 1 - .../elements/display/TextDivider.test.tsx | 1 - .../elements/display/TypingIndicator.test.tsx | 1 - .../elements/display/json/JSONViewer.tsx | 4 +- .../display/modals/RationaleModal.test.tsx | 3 +- .../display/modals/RationaleModal.tsx | 2 +- ui/src/components/elements/hit/HitActions.tsx | 2 +- ui/src/components/elements/hit/HitBanner.tsx | 2 +- ui/src/components/elements/hit/HitCard.tsx | 2 +- .../components/elements/hit/HitComments.tsx | 10 ++- .../elements/hit/HitContextMenu.test.tsx | 4 +- .../elements/hit/HitContextMenu.tsx | 4 +- ui/src/components/elements/hit/HitLabels.tsx | 2 +- .../components/elements/hit/HitNotebooks.tsx | 12 ++-- ui/src/components/elements/hit/HitOutline.tsx | 2 +- .../components/elements/hit/HitOverview.tsx | 2 +- ui/src/components/elements/hit/HitSummary.tsx | 2 +- .../elements/hit/aggregate/HitGraph.tsx | 2 +- .../elements/hit/grid/AddColumnModal.tsx | 2 +- .../elements/hit/grid/ColumnHeader.tsx | 2 +- .../components/elements/hit/grid/HitTable.tsx | 2 +- ui/src/components/hooks/useHitActions.tsx | 2 +- .../components/hooks/useLocalStorage.test.ts | 1 - .../hooks/useLocalStorageItem.test.tsx | 6 +- ui/src/components/hooks/useMyPreferences.tsx | 2 - ui/src/components/hooks/useMySnackbar.tsx | 2 +- ui/src/components/hooks/useMyTheme.test.ts | 1 - ui/src/components/hooks/useParamState.test.ts | 1 - ui/src/components/hooks/useParamState.ts | 2 +- ui/src/components/logins/auth/OAuthLogin.tsx | 2 +- ui/src/components/logins/hooks/useLogin.tsx | 4 +- ui/src/components/routes/403.test.tsx | 1 - ui/src/components/routes/404.test.tsx | 1 - .../components/routes/ErrorBoundary.test.tsx | 1 - .../components/routes/ErrorOccured.test.tsx | 1 - ui/src/components/routes/Logout.test.tsx | 1 - .../routes/action/edit/ActionEditor.tsx | 8 +-- .../routes/action/useMyActionFunctions.tsx | 2 +- .../routes/action/view/ActionDetails.tsx | 4 +- .../routes/action/view/ActionSearch.tsx | 6 +- .../routes/admin/users/UserEditor.tsx | 2 +- .../routes/admin/users/UserSearch.tsx | 8 +-- .../routes/advanced/QueryBuilder.tsx | 4 +- .../components/routes/advanced/RuleModal.tsx | 2 +- .../routes/advanced/eqlTokenProvider.test.ts | 1 - .../advanced/luceneCompletionProvider.ts | 2 +- .../advanced/luceneTokenProvider.test.ts | 1 - .../routes/analytics/AnalyticComments.tsx | 8 +-- .../routes/analytics/AnalyticDetails.tsx | 2 +- .../routes/analytics/AnalyticHitComments.tsx | 2 +- .../routes/analytics/AnalyticOverview.tsx | 2 +- .../routes/analytics/AnalyticOverviews.tsx | 2 +- .../routes/analytics/AnalyticSearch.tsx | 4 +- .../routes/analytics/AnalyticTemplates.tsx | 2 +- .../routes/analytics/TriageSettings.tsx | 4 +- .../routes/analytics/widgets/Assessment.tsx | 2 +- .../routes/analytics/widgets/Created.tsx | 2 +- .../routes/analytics/widgets/Escalation.tsx | 2 +- .../routes/analytics/widgets/Stacked.tsx | 2 +- .../routes/dossiers/DossierCard.test.tsx | 1 - .../routes/dossiers/DossierEditor.test.tsx | 2 +- .../routes/dossiers/DossierEditor.tsx | 4 +- .../components/routes/dossiers/Dossiers.tsx | 4 +- .../routes/help/ApiDocumentation.tsx | 2 +- .../routes/help/RetentionDocumentation.tsx | 2 +- .../routes/hits/search/HitBrowser.tsx | 2 +- .../routes/hits/search/InformationPane.tsx | 8 +-- .../routes/hits/search/SearchPane.tsx | 2 +- .../routes/hits/search/ViewLink.test.tsx | 1 - .../routes/hits/search/ViewLink.tsx | 2 +- .../hits/search/shared/BundleParentMenu.tsx | 2 +- .../routes/hits/search/shared/CustomSort.tsx | 2 +- .../routes/hits/search/shared/HitSort.tsx | 2 +- .../routes/hits/search/shared/SearchSpan.tsx | 2 +- .../components/routes/hits/view/HitViewer.tsx | 6 +- .../routes/home/AddNewCard.test.tsx | 1 - ui/src/components/routes/home/AddNewCard.tsx | 2 +- .../components/routes/home/AnalyticCard.tsx | 2 +- .../routes/home/HomeSettings.test.tsx | 1 - ui/src/components/routes/home/ViewCard.tsx | 8 +-- .../routes/home/ViewRefresh.test.tsx | 1 - ui/src/components/routes/home/index.tsx | 4 +- .../routes/overviews/OverviewCard.test.tsx | 1 - .../routes/overviews/OverviewViewer.tsx | 6 +- .../components/routes/overviews/Overviews.tsx | 4 +- .../markdownExtendedTokenProvider.test.ts | 1 - .../markdownExtendedTokenProvider.ts | 30 ++++---- .../routes/settings/ProfileSection.tsx | 2 +- .../routes/settings/SettingsSection.test.tsx | 1 - .../routes/templates/TemplateCard.test.tsx | 1 - .../routes/templates/TemplateEditor.tsx | 2 +- .../routes/templates/TemplateViewer.tsx | 6 +- .../components/routes/templates/Templates.tsx | 4 +- .../components/routes/views/ViewComposer.tsx | 6 +- ui/src/components/routes/views/Views.tsx | 2 +- ui/src/i18n.ts | 2 +- .../plugins/clue/components/CluePivotForm.tsx | 2 +- ui/src/plugins/clue/helpers.tsx | 6 +- ui/src/rest/AxiosClient.test.ts | 1 - ui/src/rest/FetchClient.test.ts | 1 - ui/src/setupTests.ts | 1 - ui/src/utils/Throttler.test.ts | 5 +- ui/src/utils/actionUtils.test.ts | 1 - ui/src/utils/hitFunctions.test.ts | 1 - ui/src/utils/localStorage.test.ts | 1 - ui/src/utils/menuUtils.test.ts | 1 - ui/src/utils/sessionStorage.test.ts | 1 - ui/src/utils/socketUtils.test.ts | 1 - ui/src/utils/stringUtils.test.ts | 3 +- ui/src/utils/utils.test.ts | 3 +- ui/src/utils/viewUtils.test.ts | 1 - ui/src/utils/xsrf.test.ts | 1 - 168 files changed, 295 insertions(+), 268 deletions(-) delete mode 100755 ui/build_scripts/oxfmt.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f4d075d24..a9dbad93f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,14 +20,10 @@ repos: # - id: conventional-pre-commit # stages: [commit-msg] - repo: https://github.com/oxc-project/mirrors-oxfmt - rev: v0.58.0 # Replace with your current oxfmt version + rev: v0.58.0 hooks: - id: oxfmt - - repo: https://github.com/oxc-project/mirrors-oxlint - rev: v1.73.0 # Replace with the latest oxlint release tag - hooks: - - id: oxlint - args: [--fix] # Auto-fixes rules like removing unused imports + name: Run oxfmt - repo: local hooks: - id: poetry-check-api @@ -58,6 +54,12 @@ repos: language: script stages: [pre-commit] files: ^plugins/sentinel/.*\.(toml|lock) + - id: oxlint + name: Run oxlint + entry: ui/build_scripts/oxlint.sh + language: script + stages: [pre-commit] + files: ^ui/.* - id: bad-ui-imports name: Check for bad UI imports entry: ui/build_scripts/find_bad_imports.py diff --git a/ui/.oxlintrc.json b/ui/.oxlintrc.json index 8c3dfd513..97d54d14e 100644 --- a/ui/.oxlintrc.json +++ b/ui/.oxlintrc.json @@ -1,5 +1,9 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", + "options": { + "typeAware": true, + "typeCheck": true + }, "plugins": [ "unicorn", "import", @@ -8,7 +12,7 @@ "jsx-a11y" ], "categories": { - "correctness": "off" + "correctness": "warn" }, "env": { "builtin": true, diff --git a/ui/build_scripts/oxfmt.sh b/ui/build_scripts/oxfmt.sh deleted file mode 100755 index 1b2f28fa7..000000000 --- a/ui/build_scripts/oxfmt.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -cd $(dirname $(dirname $0)) -pwd -pnpx oxfmt src diff --git a/ui/build_scripts/oxlint.sh b/ui/build_scripts/oxlint.sh index 1491e49c8..36b6e7290 100755 --- a/ui/build_scripts/oxlint.sh +++ b/ui/build_scripts/oxlint.sh @@ -1,4 +1,23 @@ #!/bin/bash -cd $(dirname $(dirname $0)) -pwd -pnpx oxlint --fix src +set -euo pipefail + +cd "$(dirname "$(dirname "$0")")" + +lintable_files=() + +for file in "$@"; do + # pre-commit passes repo-root-relative paths (for example: ui/src/foo.ts) + if [[ "$file" == ui/src/* ]]; then + relative_path="${file#ui/}" + if [[ "$relative_path" =~ \.(js|jsx|ts|tsx|mjs|cjs)$ ]] && [[ -f "$relative_path" ]]; then + lintable_files+=("$relative_path") + fi + fi +done + +if [[ ${#lintable_files[@]} -eq 0 ]]; then + echo "No changed lintable files in ui/src; skipping oxlint." + exit 0 +fi + +pnpx oxlint --fix "${lintable_files[@]}" diff --git a/ui/package.json b/ui/package.json index 9b0a7118b..a7a6558ca 100644 --- a/ui/package.json +++ b/ui/package.json @@ -97,6 +97,7 @@ "msw": "^2.14.6", "oxfmt": "^0.58.0", "oxlint": "^1.73.0", + "oxlint-tsgolint": "^0.24.0", "typescript": "^7.0.2", "vite": "^6.4.3", "vite-plugin-dts": "^4.5.4", @@ -129,7 +130,7 @@ "build": "tsc && vite build", "build-lib": "tsc && python build_scripts/prep_for_publish.py", "dev": "vite -l info", - "lint": "oxlint --fix && oxfmt src", + "lint": "oxlint --fix --fix-suggestions && oxfmt src", "preinstall": "npx only-allow pnpm", "serve": "vite preview", "start": "vite -l info", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index cd42be78e..0889bb8d3 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -260,7 +260,10 @@ importers: version: 0.58.0 oxlint: specifier: ^1.73.0 - version: 1.73.0 + version: 1.73.0(oxlint-tsgolint@0.24.0) + oxlint-tsgolint: + specifier: ^0.24.0 + version: 0.24.0 typescript: specifier: ^7.0.2 version: 7.0.2 @@ -1433,6 +1436,36 @@ packages: cpu: [x64] os: [win32] + '@oxlint-tsgolint/darwin-arm64@0.24.0': + resolution: {integrity: sha512-C2uMmwK5Bc4ri4ysZ6sA8Rcu+A5zBQTp6ml2u0CLLbRZp4kMFPV3yWk8B5DK9Aw7y9bbjogIm75tUwGLFzlsYQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.24.0': + resolution: {integrity: sha512-Wgvt/1lRbDxmoNqWQKKcL+UIiqLmdJ+EWLpQa1qzoNVAfNB0PJpa82/8dH1twT/3rSs4zrP5TXPWl4juB71WuQ==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.24.0': + resolution: {integrity: sha512-PB1rxII7KV83+ASY4sSkXtqvpij6ME66+QCRL49uksi/ofs2Rf/UVboYr095n0Rkbl2wgvlsHGl6DHC361jQUQ==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.24.0': + resolution: {integrity: sha512-xcz3CxKmjTQLREtE/UShh+ruWmm9nAb7UM9zKcD65BStiuYgOakAKkPHl4YS5DztpVcDrE0+HqbOolTlRKYWmw==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.24.0': + resolution: {integrity: sha512-A2i6ZGBec3i20S7RaxkgHc6r3HYtD5Mn7j/mb22NkTz14u0JuudvTu6JggAnbGMcv8+dBKQI//EasxSPJLD8pw==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.24.0': + resolution: {integrity: sha512-0ZbGd9qRB6zs82moekaKdEvncRANq49EAwfNX62JpTS46feXUhKAuoyVDvZMj6Rywejylrmmu79Wo6faYCo4Ew==} + cpu: [x64] + os: [win32] + '@oxlint/binding-android-arm-eabi@1.73.0': resolution: {integrity: sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4090,6 +4123,10 @@ packages: vite-plus: optional: true + oxlint-tsgolint@0.24.0: + resolution: {integrity: sha512-giCk5sEvG02d5tzPmFMX3hem8ndzEEu1xvGYS5OwNfO2WGl6ZVxt5LjE0yiMDoz94INI7XkXwgFAQiydPvVHDw==} + hasBin: true + oxlint@1.73.0: resolution: {integrity: sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6309,6 +6346,24 @@ snapshots: '@oxfmt/binding-win32-x64-msvc@0.58.0': optional: true + '@oxlint-tsgolint/darwin-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.24.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.24.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.24.0': + optional: true + '@oxlint/binding-android-arm-eabi@1.73.0': optional: true @@ -9184,7 +9239,16 @@ snapshots: '@oxfmt/binding-win32-ia32-msvc': 0.58.0 '@oxfmt/binding-win32-x64-msvc': 0.58.0 - oxlint@1.73.0: + oxlint-tsgolint@0.24.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.24.0 + '@oxlint-tsgolint/darwin-x64': 0.24.0 + '@oxlint-tsgolint/linux-arm64': 0.24.0 + '@oxlint-tsgolint/linux-x64': 0.24.0 + '@oxlint-tsgolint/win32-arm64': 0.24.0 + '@oxlint-tsgolint/win32-x64': 0.24.0 + + oxlint@1.73.0(oxlint-tsgolint@0.24.0): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.73.0 '@oxlint/binding-android-arm64': 1.73.0 @@ -9205,6 +9269,7 @@ snapshots: '@oxlint/binding-win32-arm64-msvc': 1.73.0 '@oxlint/binding-win32-ia32-msvc': 1.73.0 '@oxlint/binding-win32-x64-msvc': 1.73.0 + oxlint-tsgolint: 0.24.0 p-finally@1.0.0: {} diff --git a/ui/src/api/search/action.ts b/ui/src/api/search/action.ts index 9e7b145c6..84548cec7 100644 --- a/ui/src/api/search/action.ts +++ b/ui/src/api/search/action.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'action_id:*' }); + return hpost(uri(), { ...request, query: request?.query || 'action_id:*' }); }; diff --git a/ui/src/api/search/analytic.ts b/ui/src/api/search/analytic.ts index 01b99939f..d6c0077a2 100644 --- a/ui/src/api/search/analytic.ts +++ b/ui/src/api/search/analytic.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'analytic_id:*' }); + return hpost(uri(), { ...request, query: request?.query || 'analytic_id:*' }); }; diff --git a/ui/src/api/search/count/hit.ts b/ui/src/api/search/count/hit.ts index b68993e70..19b9424b0 100644 --- a/ui/src/api/search/count/hit.ts +++ b/ui/src/api/search/count/hit.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerCountSearchRequest): Promise => { - return hpost(uri(), { ...(request || {}), query: request?.query || DEFAULT_QUERY }); + return hpost(uri(), { ...request, query: request?.query || DEFAULT_QUERY }); }; diff --git a/ui/src/api/search/dossier.ts b/ui/src/api/search/dossier.ts index dcb1d03a4..66343065c 100644 --- a/ui/src/api/search/dossier.ts +++ b/ui/src/api/search/dossier.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'title:*' }); + return hpost(uri(), { ...request, query: request?.query || 'title:*' }); }; diff --git a/ui/src/api/search/eql/hit.ts b/ui/src/api/search/eql/hit.ts index 09f6b0b6c..9db28afa4 100644 --- a/ui/src/api/search/eql/hit.ts +++ b/ui/src/api/search/eql/hit.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerEQLSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), eql_query: request?.eql_query || 'any where true' }); + return hpost(uri(), { ...request, eql_query: request?.eql_query || 'any where true' }); }; diff --git a/ui/src/api/search/explain/hit.ts b/ui/src/api/search/explain/hit.ts index 440d851ff..bef9e13de 100644 --- a/ui/src/api/search/explain/hit.ts +++ b/ui/src/api/search/explain/hit.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerExplainSearchRequest): Promise => { - return hpost(uri(), { ...(request || {}), eql_query: request?.query || DEFAULT_QUERY }); + return hpost(uri(), { ...request, eql_query: request?.query || DEFAULT_QUERY }); }; diff --git a/ui/src/api/search/facet/hit.ts b/ui/src/api/search/facet/hit.ts index 8b9c954cb..7d4f0e4c2 100644 --- a/ui/src/api/search/facet/hit.ts +++ b/ui/src/api/search/facet/hit.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerFacetSearchRequest): Promise<{ [index: string]: HowlerFacetSearchResponse }> => { - return hpost(uri(), { ...(request || {}), query: request?.query || DEFAULT_QUERY }); + return hpost(uri(), { ...request, query: request?.query || DEFAULT_QUERY }); }; diff --git a/ui/src/api/search/grouped/hit.ts b/ui/src/api/search/grouped/hit.ts index 19c085ac6..8176bea64 100644 --- a/ui/src/api/search/grouped/hit.ts +++ b/ui/src/api/search/grouped/hit.ts @@ -12,5 +12,5 @@ export const post = ( field: string, request?: HowlerGroupedSearchRequest ): Promise> => { - return hpost(uri(field), { ...(request || {}), query: request?.query || DEFAULT_QUERY }); + return hpost(uri(field), { ...request, query: request?.query || DEFAULT_QUERY }); }; diff --git a/ui/src/api/search/grouped/user.ts b/ui/src/api/search/grouped/user.ts index be9becd11..90a53af52 100644 --- a/ui/src/api/search/grouped/user.ts +++ b/ui/src/api/search/grouped/user.ts @@ -14,7 +14,7 @@ export const post = async ( body?: HowlerGroupedSearchRequest ): Promise> => { const response = await hpost>(uri(field), { - ...(body || {}), + ...body, query: body?.query || 'uname:*' }); return { diff --git a/ui/src/api/search/histogram/hit.ts b/ui/src/api/search/histogram/hit.ts index c9609361f..056c31c1b 100644 --- a/ui/src/api/search/histogram/hit.ts +++ b/ui/src/api/search/histogram/hit.ts @@ -8,5 +8,5 @@ export const uri = (field: string) => { }; export const post = (field: string, request?: HowlerHistogramSearchRequest): Promise => { - return hpost(uri(field), { ...(request || {}), query: request?.query || DEFAULT_QUERY }); + return hpost(uri(field), { ...request, query: request?.query || DEFAULT_QUERY }); }; diff --git a/ui/src/api/search/hit.ts b/ui/src/api/search/hit.ts index d7635f1a9..ad7893af5 100644 --- a/ui/src/api/search/hit.ts +++ b/ui/src/api/search/hit.ts @@ -12,7 +12,7 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || DEFAULT_QUERY }); + return hpost(uri(), { ...request, query: request?.query || DEFAULT_QUERY }); }; export { eql, explain, sigma }; diff --git a/ui/src/api/search/overview.ts b/ui/src/api/search/overview.ts index 0e70cf76c..ea2140ca5 100644 --- a/ui/src/api/search/overview.ts +++ b/ui/src/api/search/overview.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'overview_id:*' }); + return hpost(uri(), { ...request, query: request?.query || 'overview_id:*' }); }; diff --git a/ui/src/api/search/sigma/hit.ts b/ui/src/api/search/sigma/hit.ts index 5ac111666..3525f6cdb 100644 --- a/ui/src/api/search/sigma/hit.ts +++ b/ui/src/api/search/sigma/hit.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSigmaSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), sigma: request?.sigma || '' }); + return hpost(uri(), { ...request, sigma: request?.sigma || '' }); }; diff --git a/ui/src/api/search/template.ts b/ui/src/api/search/template.ts index 7324a0b75..db9a0ed7a 100644 --- a/ui/src/api/search/template.ts +++ b/ui/src/api/search/template.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'template_id:*' }); + return hpost(uri(), { ...request, query: request?.query || 'template_id:*' }); }; diff --git a/ui/src/api/search/user.ts b/ui/src/api/search/user.ts index 50944a881..1a71b926d 100644 --- a/ui/src/api/search/user.ts +++ b/ui/src/api/search/user.ts @@ -11,7 +11,7 @@ export const uri = () => { export const post = async (request?: HowlerSearchRequest): Promise> => { const response = await hpost>(uri(), { - ...(request || {}), + ...request, query: request?.query || 'name:*' }); return { diff --git a/ui/src/api/search/view.ts b/ui/src/api/search/view.ts index 18f7dbe04..7b90bb13a 100644 --- a/ui/src/api/search/view.ts +++ b/ui/src/api/search/view.ts @@ -8,5 +8,5 @@ export const uri = () => { }; export const post = (request?: HowlerSearchRequest): Promise> => { - return hpost(uri(), { ...(request || {}), query: request?.query || 'title:*' }); + return hpost(uri(), { ...request, query: request?.query || 'title:*' }); }; diff --git a/ui/src/components/app/App.tsx b/ui/src/components/app/App.tsx index e9f0cc1ee..9742ed491 100644 --- a/ui/src/components/app/App.tsx +++ b/ui/src/components/app/App.tsx @@ -134,7 +134,7 @@ const MyApp: FC = () => { // Simulate app loading time... // e.g. fetching initial app data, etc. useEffect(() => { - dispatchApi(api.configs.get()).then(data => { + void dispatchApi(api.configs.get()).then(data => { apiConfig.setConfig(data); if (data?.configuration?.ui?.apps) { @@ -146,7 +146,7 @@ const MyApp: FC = () => { return; } - getUser(); + void getUser(); // oxlint-disable-next-line }, []); diff --git a/ui/src/components/app/hooks/useTitle.tsx b/ui/src/components/app/hooks/useTitle.tsx index e5797e383..5a212f534 100644 --- a/ui/src/components/app/hooks/useTitle.tsx +++ b/ui/src/components/app/hooks/useTitle.tsx @@ -74,7 +74,7 @@ const useTitle = () => { }, [location.pathname, params.id, searchParams, getAnalyticFromId, setTitle, t, hits, getHit, sitemap.routes]); useEffect(() => { - runChecks(); + void runChecks(); }, [runChecks]); }; diff --git a/ui/src/components/app/providers/AnalyticProvider.tsx b/ui/src/components/app/providers/AnalyticProvider.tsx index 0206c540e..25e74bc72 100644 --- a/ui/src/components/app/providers/AnalyticProvider.tsx +++ b/ui/src/components/app/providers/AnalyticProvider.tsx @@ -42,7 +42,7 @@ const AnalyticProvider: FC = ({ children }) => { useEffect(() => { if (!ready && appUser.isReady()) { - fetchAnalytics(); + void fetchAnalytics(); } }, [ready, appUser, fetchAnalytics]); diff --git a/ui/src/components/app/providers/FavouritesProvider.tsx b/ui/src/components/app/providers/FavouritesProvider.tsx index 2c47c822b..e49522842 100644 --- a/ui/src/components/app/providers/FavouritesProvider.tsx +++ b/ui/src/components/app/providers/FavouritesProvider.tsx @@ -131,7 +131,7 @@ const FavouriteProvider: FC = ({ children }) => { .filter(el => !['views', 'analytics'].includes(el.element?.id as any)) .filter(el => !!el); - (async () => { + void (async () => { const analyticElement = processAnalyticElement(); if (analyticElement) { newElements.splice(1, 0, analyticElement); diff --git a/ui/src/components/app/providers/GridColumnsProvider.tsx b/ui/src/components/app/providers/GridColumnsProvider.tsx index 1de6724b1..2d81b1404 100644 --- a/ui/src/components/app/providers/GridColumnsProvider.tsx +++ b/ui/src/components/app/providers/GridColumnsProvider.tsx @@ -137,7 +137,7 @@ const GridColumnsProvider = ({ setIsReady(false); - getCurrentViews({ views: viewIds }).then(_views => { + void getCurrentViews({ views: viewIds }).then(_views => { // Discard stale results: either the user already made a manual edit, or viewIds changed. if (currentLoadRef.current.hasLocalEdits) { setIsReady(true); diff --git a/ui/src/components/app/providers/HitProvider.tsx b/ui/src/components/app/providers/HitProvider.tsx index 6690d23d6..c235148da 100644 --- a/ui/src/components/app/providers/HitProvider.tsx +++ b/ui/src/components/app/providers/HitProvider.tsx @@ -120,7 +120,7 @@ const HitProvider: FC = ({ children }) => { }, []); const clearSelectedHits: HitContextType['clearSelectedHits'] = useCallback((except: string) => { - setSelectedHitIds(!!except ? [except] : []); + setSelectedHitIds(except ? [except] : []); }, []); const selectedHits = useMemo(() => selectedHitIds.map(id => hits[id]).filter(hit => !!hit), [hits, selectedHitIds]); @@ -128,7 +128,7 @@ const HitProvider: FC = ({ children }) => { useEffect(() => { selectedHitIds.forEach(id => { if (!hitRequests.current[id]) { - getHit(id); + void getHit(id); } }); }, [getHit, selectedHitIds]); diff --git a/ui/src/components/app/providers/HitSearchProvider.test.tsx b/ui/src/components/app/providers/HitSearchProvider.test.tsx index ec715aa6f..933102238 100644 --- a/ui/src/components/app/providers/HitSearchProvider.test.tsx +++ b/ui/src/components/app/providers/HitSearchProvider.test.tsx @@ -21,8 +21,7 @@ const mockParams = vi.mocked(useParams); const mockLocation = vi.mocked(useLocation()); const mockViewContext: Partial = { - getCurrentViews: ({ views } = {}) => - Promise.resolve([{ view_id: views?.[0] || 'test_view_id', query: 'howler.id:*' }]) + getCurrentViews: ({ views }) => Promise.resolve([{ view_id: views?.[0] || 'test_view_id', query: 'howler.id:*' }]) }; let mockParameterContext: Partial = { filters: [], diff --git a/ui/src/components/app/providers/HitSearchProvider.tsx b/ui/src/components/app/providers/HitSearchProvider.tsx index 0c1e0c8c0..32565fc96 100644 --- a/ui/src/components/app/providers/HitSearchProvider.tsx +++ b/ui/src/components/app/providers/HitSearchProvider.tsx @@ -143,7 +143,7 @@ const HitSearchProvider: FC = ({ children }) => { async (_query?: string, appendResults?: boolean) => { THROTTLER.debounce(async () => { if (_query === 'woof!') { - i18n.changeLanguage('woof'); + void i18n.changeLanguage('woof'); return; } @@ -229,7 +229,7 @@ const HitSearchProvider: FC = ({ children }) => { } if (views.length > 0 || bundleId || (query && query !== DEFAULT_QUERY) || offset > 0 || filters.length > 0) { - search(query); + void search(query); } else { setResponse(null); } diff --git a/ui/src/components/app/providers/OverviewProvider.tsx b/ui/src/components/app/providers/OverviewProvider.tsx index 034a1eed8..3218b88aa 100644 --- a/ui/src/components/app/providers/OverviewProvider.tsx +++ b/ui/src/components/app/providers/OverviewProvider.tsx @@ -68,7 +68,7 @@ const OverviewProvider: FC = ({ children }) => { const refresh = useCallback(() => { setLoaded(false); - getOverviews(); + void getOverviews(); // oxlint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/ui/src/components/app/providers/SearchResponseProvider.tsx b/ui/src/components/app/providers/SearchResponseProvider.tsx index 03535513d..a0c86f227 100644 --- a/ui/src/components/app/providers/SearchResponseProvider.tsx +++ b/ui/src/components/app/providers/SearchResponseProvider.tsx @@ -27,11 +27,7 @@ type SearchResponseProviderProps = PropsWithChildren<{ initialResponse?: SearchResponseState; }>; -const SearchResponseProvider = ({ - children, - idField: idField, - initialResponse = null -}: SearchResponseProviderProps) => { +const SearchResponseProvider = ({ children, idField, initialResponse = null }: SearchResponseProviderProps) => { const { dispatchApi } = useMyApi(); const [response, setResponse] = useState | null>(initialResponse); diff --git a/ui/src/components/app/providers/SocketProvider.tsx b/ui/src/components/app/providers/SocketProvider.tsx index f66071961..8172d1bf5 100644 --- a/ui/src/components/app/providers/SocketProvider.tsx +++ b/ui/src/components/app/providers/SocketProvider.tsx @@ -116,7 +116,7 @@ const SocketProvider: React.FC = ({ children }) => { // If we are unauthorized, we can update the token through the usual process and tell // the connection to retry with the new token if (data.status === 401) { - api.user.whoami.get().then(() => setRetry(true)); + void api.user.whoami.get().then(() => setRetry(true)); } else { console.error(data); setRetry(false); diff --git a/ui/src/components/app/providers/ViewProvider.tsx b/ui/src/components/app/providers/ViewProvider.tsx index 362ce938d..61169a498 100644 --- a/ui/src/components/app/providers/ViewProvider.tsx +++ b/ui/src/components/app/providers/ViewProvider.tsx @@ -85,7 +85,7 @@ const ViewProvider: FC = ({ children }) => { return; } - (async () => { + void (async () => { const result = await fetchViews([defaultView]); if (!result.length) { @@ -124,7 +124,7 @@ const ViewProvider: FC = ({ children }) => { setViews(_views => ({ ..._views, - [id]: { ...(_views[id] ?? {}), ...partialView } + [id]: { ..._views[id], ...partialView } })); return result; @@ -150,7 +150,7 @@ const ViewProvider: FC = ({ children }) => { setViews(_views => ({ ..._views, [newView.view_id]: newView })); - addFavourite(newView.view_id); + void addFavourite(newView.view_id); return newView; }, diff --git a/ui/src/components/elements/Comment.tsx b/ui/src/components/elements/Comment.tsx index 0db31ab97..b8430aa99 100644 --- a/ui/src/components/elements/Comment.tsx +++ b/ui/src/components/elements/Comment.tsx @@ -110,7 +110,7 @@ const Comment: FC<{ e.stopPropagation(); if (e.ctrlKey && e.key === 'Enter' && !loading) { - onEdit(); + void onEdit(); } else if (e.key === 'Escape') { setEditing(false); } diff --git a/ui/src/components/elements/EditRow.tsx b/ui/src/components/elements/EditRow.tsx index 9b1f235ca..6df12041d 100644 --- a/ui/src/components/elements/EditRow.tsx +++ b/ui/src/components/elements/EditRow.tsx @@ -95,7 +95,7 @@ const EditRow = ({ if (type !== 'checkbox') { setEditValue(_value); } else { - onEdit(_value.toString()); + void onEdit(_value.toString()); } }, [failOnValidate, max, min, onEdit, type, validate] @@ -125,7 +125,7 @@ const EditRow = ({ const checkForActions: KeyboardEventHandler = useCallback( e => { if (e.ctrlKey && e.key === 'Enter' && !loading) { - onSubmit(); + void onSubmit(); } if (e.key === 'Escape') { @@ -232,7 +232,7 @@ const EditRow = ({ { setEditing(false); - onEdit(null); + void onEdit(null); }} disabled={loading} > diff --git a/ui/src/components/elements/addons/buttons/CustomButton.test.tsx b/ui/src/components/elements/addons/buttons/CustomButton.test.tsx index 93cbef0fd..129380882 100644 --- a/ui/src/components/elements/addons/buttons/CustomButton.test.tsx +++ b/ui/src/components/elements/addons/buttons/CustomButton.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import { setupReactRouterMock } from 'tests/mocks'; import { vi } from 'vitest'; diff --git a/ui/src/components/elements/addons/buttons/CustomIconButton.test.tsx b/ui/src/components/elements/addons/buttons/CustomIconButton.test.tsx index 2fbe64846..e382042ba 100644 --- a/ui/src/components/elements/addons/buttons/CustomIconButton.test.tsx +++ b/ui/src/components/elements/addons/buttons/CustomIconButton.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import { setupReactRouterMock } from 'tests/mocks'; import { vi } from 'vitest'; diff --git a/ui/src/components/elements/addons/layout/FlexOne.test.tsx b/ui/src/components/elements/addons/layout/FlexOne.test.tsx index f66a9c881..10502027a 100644 --- a/ui/src/components/elements/addons/layout/FlexOne.test.tsx +++ b/ui/src/components/elements/addons/layout/FlexOne.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import FlexOne from './FlexOne'; diff --git a/ui/src/components/elements/addons/layout/FlexVertical.test.tsx b/ui/src/components/elements/addons/layout/FlexVertical.test.tsx index d66b440f0..c724c6082 100644 --- a/ui/src/components/elements/addons/layout/FlexVertical.test.tsx +++ b/ui/src/components/elements/addons/layout/FlexVertical.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import { describe, expect, it } from 'vitest'; import FlexVertical from './FlexVertical'; diff --git a/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx b/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx index 9ea7173e4..6b78c959d 100644 --- a/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx +++ b/ui/src/components/elements/addons/layout/vsbox/VSBoxContent.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import { describe, expect, it } from 'vitest'; import VSBoxContent from './VSBoxContent'; diff --git a/ui/src/components/elements/addons/lists/TuiListMenu.tsx b/ui/src/components/elements/addons/lists/TuiListMenu.tsx index 36c8971bb..b9fdb7fb6 100644 --- a/ui/src/components/elements/addons/lists/TuiListMenu.tsx +++ b/ui/src/components/elements/addons/lists/TuiListMenu.tsx @@ -29,7 +29,7 @@ const TuiListMenuRoot = styled('div', { shouldForwardProp: prop => !MY_PROPS.inc }>(({ theme, permanent, placement }) => { const position = PLACEMENTS[placement]; return { - ...(position || {}), + ...position, zIndex: position ? 100 : null, display: permanent ? 'flex' : 'none', position: position ? 'absolute' : 'inherit', diff --git a/ui/src/components/elements/addons/search/SearchPagination.test.tsx b/ui/src/components/elements/addons/search/SearchPagination.test.tsx index 230cde64d..6bdb4167f 100644 --- a/ui/src/components/elements/addons/search/SearchPagination.test.tsx +++ b/ui/src/components/elements/addons/search/SearchPagination.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SearchPagination from './SearchPagination'; diff --git a/ui/src/components/elements/addons/search/SearchTotal.test.tsx b/ui/src/components/elements/addons/search/SearchTotal.test.tsx index 46698a091..65008e357 100644 --- a/ui/src/components/elements/addons/search/SearchTotal.test.tsx +++ b/ui/src/components/elements/addons/search/SearchTotal.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import i18n from 'i18n'; import { I18nextProvider } from 'react-i18next'; diff --git a/ui/src/components/elements/addons/search/phrase/Phrase.tsx b/ui/src/components/elements/addons/search/phrase/Phrase.tsx index ade8f5ebc..34ddc0866 100644 --- a/ui/src/components/elements/addons/search/phrase/Phrase.tsx +++ b/ui/src/components/elements/addons/search/phrase/Phrase.tsx @@ -30,7 +30,7 @@ export type PhraseProps = Omit import { describe, expect, it } from 'vitest'; import WordLexer from './word/WordLexer'; diff --git a/ui/src/components/elements/display/ActionButton.tsx b/ui/src/components/elements/display/ActionButton.tsx index a5c7c38dc..fe7ca65c9 100644 --- a/ui/src/components/elements/display/ActionButton.tsx +++ b/ui/src/components/elements/display/ActionButton.tsx @@ -20,7 +20,7 @@ const ActionButton: FC<{ actionId: string; hitId: string; label: string } & Butt const [action, setAction] = useState(null); useEffect(() => { - dispatchApi(api.search.action.post({ query: `action_id:${actionId}`, rows: 1 })).then(result => + void dispatchApi(api.search.action.post({ query: `action_id:${actionId}`, rows: 1 })).then(result => setAction(result.items[0]) ); }, [actionId, dispatchApi]); diff --git a/ui/src/components/elements/display/ChipPopper.test.tsx b/ui/src/components/elements/display/ChipPopper.test.tsx index ad35e155c..b6dd80b0f 100644 --- a/ui/src/components/elements/display/ChipPopper.test.tsx +++ b/ui/src/components/elements/display/ChipPopper.test.tsx @@ -1,4 +1,3 @@ -/// import { Info } from '@mui/icons-material'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent, { type UserEvent } from '@testing-library/user-event'; diff --git a/ui/src/components/elements/display/DocumentationButton.test.tsx b/ui/src/components/elements/display/DocumentationButton.test.tsx index 14eeeb3cf..ab164de3d 100644 --- a/ui/src/components/elements/display/DocumentationButton.test.tsx +++ b/ui/src/components/elements/display/DocumentationButton.test.tsx @@ -1,5 +1,3 @@ -/// - vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key }) })); diff --git a/ui/src/components/elements/display/DynamicTabs.test.tsx b/ui/src/components/elements/display/DynamicTabs.test.tsx index aa09e14f7..8c109a792 100644 --- a/ui/src/components/elements/display/DynamicTabs.test.tsx +++ b/ui/src/components/elements/display/DynamicTabs.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import DynamicTabs from './DynamicTabs'; diff --git a/ui/src/components/elements/display/HandlebarsMarkdown.tsx b/ui/src/components/elements/display/HandlebarsMarkdown.tsx index cb4318178..cfb6f905e 100644 --- a/ui/src/components/elements/display/HandlebarsMarkdown.tsx +++ b/ui/src/components/elements/display/HandlebarsMarkdown.tsx @@ -63,7 +63,7 @@ const HandlebarsMarkdown: FC = ({ md, object = {}, disa const result = helper.componentCallback(...args); if (result instanceof Promise) { - result.then(_result => setMdComponents(_components => ({ ..._components, [id]: _result }))); + void result.then(_result => setMdComponents(_components => ({ ..._components, [id]: _result }))); } else { setMdComponents(_components => ({ ..._components, [id]: result })); } @@ -81,7 +81,7 @@ const HandlebarsMarkdown: FC = ({ md, object = {}, disa THROTTLER.debounce(async () => { const compiled = handlebars.compile(md || ''); try { - setRendered(await compiled(object)); + setRendered(compiled(object)); } catch (err) { if ((err as Exception).message?.startsWith('Missing helper')) { const missingHelper = (err as Exception).message.replace(/.+"(.+)"/, '$1'); @@ -93,7 +93,7 @@ const HandlebarsMarkdown: FC = ({ md, object = {}, disa ) ); - setRendered(await compiled(object)); + setRendered(compiled(object)); return; } diff --git a/ui/src/components/elements/display/HowlerAvatar.tsx b/ui/src/components/elements/display/HowlerAvatar.tsx index bb5efd74c..435d580a2 100644 --- a/ui/src/components/elements/display/HowlerAvatar.tsx +++ b/ui/src/components/elements/display/HowlerAvatar.tsx @@ -58,7 +58,7 @@ const HowlerAvatar: FC = ({ userId, ...avatarProps }) => { aria-label={displayId} {...avatarProps} {...props} - sx={{ ...(avatarProps?.sx || {}), ...(props?.sx || {}) } as SxProps} + sx={{ ...avatarProps?.sx, ...props?.sx } as SxProps} /> ); @@ -68,7 +68,7 @@ const HowlerAvatar: FC = ({ userId, ...avatarProps }) => { aria-label={t('unknown')} {...avatarProps} {...props} - sx={{ ...(avatarProps?.sx || {}), ...(props?.sx || {}) } as SxProps} + sx={{ ...avatarProps?.sx, ...props?.sx } as SxProps} /> ); } diff --git a/ui/src/components/elements/display/HowlerCard.test.tsx b/ui/src/components/elements/display/HowlerCard.test.tsx index 7e0e484b7..bc3841795 100644 --- a/ui/src/components/elements/display/HowlerCard.test.tsx +++ b/ui/src/components/elements/display/HowlerCard.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import HowlerCard from './HowlerCard'; diff --git a/ui/src/components/elements/display/Image.test.tsx b/ui/src/components/elements/display/Image.test.tsx index eacc4ebe6..0a14c81b1 100644 --- a/ui/src/components/elements/display/Image.test.tsx +++ b/ui/src/components/elements/display/Image.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen, waitFor } from '@testing-library/react'; import userEvent, { type UserEvent } from '@testing-library/user-event'; import Image from './Image'; diff --git a/ui/src/components/elements/display/Image.tsx b/ui/src/components/elements/display/Image.tsx index e488adcaa..73052500c 100644 --- a/ui/src/components/elements/display/Image.tsx +++ b/ui/src/components/elements/display/Image.tsx @@ -7,7 +7,7 @@ const Image: FC, HTMLImage return ( <> - setShowModal(true)} /> + setShowModal(true)} /> setShowModal(false)}> , HTMLImage > - + diff --git a/ui/src/components/elements/display/Markdown.tsx b/ui/src/components/elements/display/Markdown.tsx index 8865e7d37..c10504b11 100644 --- a/ui/src/components/elements/display/Markdown.tsx +++ b/ui/src/components/elements/display/Markdown.tsx @@ -79,7 +79,7 @@ const Markdown: FC = ({ md, components = {}, disableLinks = false }, [isDark, theme]); useEffect(() => { - mermaid.run(); + void mermaid.run(); }); return ( diff --git a/ui/src/components/elements/display/QueryResultText.test.tsx b/ui/src/components/elements/display/QueryResultText.test.tsx index f70134e87..034d9d40b 100644 --- a/ui/src/components/elements/display/QueryResultText.test.tsx +++ b/ui/src/components/elements/display/QueryResultText.test.tsx @@ -1,4 +1,3 @@ -/// import { render, screen } from '@testing-library/react'; import { setupReactRouterMock } from 'tests/mocks'; import { vi } from 'vitest'; diff --git a/ui/src/components/elements/display/TextDivider.test.tsx b/ui/src/components/elements/display/TextDivider.test.tsx index e5b001053..2a1f7591f 100644 --- a/ui/src/components/elements/display/TextDivider.test.tsx +++ b/ui/src/components/elements/display/TextDivider.test.tsx @@ -1,4 +1,3 @@ -/// import { render } from '@testing-library/react'; import i18n from 'i18n'; import { I18nextProvider } from 'react-i18next'; diff --git a/ui/src/components/elements/display/TypingIndicator.test.tsx b/ui/src/components/elements/display/TypingIndicator.test.tsx index 2066ce098..c9ee33293 100644 --- a/ui/src/components/elements/display/TypingIndicator.test.tsx +++ b/ui/src/components/elements/display/TypingIndicator.test.tsx @@ -1,4 +1,3 @@ -/// import { render } from '@testing-library/react'; import TypingIndicator from './TypingIndicator'; diff --git a/ui/src/components/elements/display/json/JSONViewer.tsx b/ui/src/components/elements/display/json/JSONViewer.tsx index 61c608eec..79a86d578 100644 --- a/ui/src/components/elements/display/json/JSONViewer.tsx +++ b/ui/src/components/elements/display/json/JSONViewer.tsx @@ -57,9 +57,9 @@ const JSONViewer: FC<{ data: object; collapse?: boolean; hideSearch?: boolean; f style={{ flex: 1, overflow: 'auto', height: '100%', fontSize: compact ? 'small' : 'smaller' }} enableClipboard={_data => { if (typeof _data.src === 'string') { - navigator.clipboard.writeText(_data.src); + void navigator.clipboard.writeText(_data.src); } else { - navigator.clipboard.writeText(JSON.stringify(_data.src)); + void navigator.clipboard.writeText(JSON.stringify(_data.src)); } }} {...({ diff --git a/ui/src/components/elements/display/modals/RationaleModal.test.tsx b/ui/src/components/elements/display/modals/RationaleModal.test.tsx index 81020f4a6..eb9f0164e 100644 --- a/ui/src/components/elements/display/modals/RationaleModal.test.tsx +++ b/ui/src/components/elements/display/modals/RationaleModal.test.tsx @@ -1,4 +1,3 @@ -/// import { act, render, screen, waitFor } from '@testing-library/react'; import userEvent, { type UserEvent } from '@testing-library/user-event'; import { ModalContext } from 'components/app/providers/ModalProvider'; @@ -544,7 +543,7 @@ describe('RationaleModal', () => { const specialText = 'Test <>&"\'{}[]()'; const input = screen.getByLabelText(i18n.t('modal.rationale.label')); - await user.type(input, specialText.replace(/([{\[])/g, '$1$1')); + await user.type(input, specialText.replace(/([{[])/g, '$1$1')); const submitButton = screen.getByText(i18n.t('submit')); await user.click(submitButton); diff --git a/ui/src/components/elements/display/modals/RationaleModal.tsx b/ui/src/components/elements/display/modals/RationaleModal.tsx index 48e3f948d..022307fed 100644 --- a/ui/src/components/elements/display/modals/RationaleModal.tsx +++ b/ui/src/components/elements/display/modals/RationaleModal.tsx @@ -100,7 +100,7 @@ const RationaleModal: FC<{ hits: Hit[]; onSubmit: (rationale: string) => void }> }, [hits, getMatchingAnalytic]); useEffect(() => { - (async () => { + void (async () => { setLoading(true); try { diff --git a/ui/src/components/elements/hit/HitActions.tsx b/ui/src/components/elements/hit/HitActions.tsx index d2e082475..d142201bf 100644 --- a/ui/src/components/elements/hit/HitActions.tsx +++ b/ui/src/components/elements/hit/HitActions.tsx @@ -165,7 +165,7 @@ const HitActions: FC<{ }, [keyboardDownHandler]); useEffect(() => { - getMatchingAnalytic(hit).then(setAnalytic); + void getMatchingAnalytic(hit).then(setAnalytic); // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit?.howler.analytic]); diff --git a/ui/src/components/elements/hit/HitBanner.tsx b/ui/src/components/elements/hit/HitBanner.tsx index e35fd2f35..aa10449a2 100644 --- a/ui/src/components/elements/hit/HitBanner.tsx +++ b/ui/src/components/elements/hit/HitBanner.tsx @@ -60,7 +60,7 @@ const HitBanner: FC = ({ hit, layout = HitLayout.NORMAL, showAss return; } - getMatchingAnalytic(hit).then(analytic => setAnalyticId(analytic?.analytic_id)); + void getMatchingAnalytic(hit).then(analytic => setAnalyticId(analytic?.analytic_id)); // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit?.howler.analytic]); diff --git a/ui/src/components/elements/hit/HitCard.tsx b/ui/src/components/elements/hit/HitCard.tsx index f564c6bca..85cb52472 100644 --- a/ui/src/components/elements/hit/HitCard.tsx +++ b/ui/src/components/elements/hit/HitCard.tsx @@ -15,7 +15,7 @@ const HitCard: FC<{ id?: string; layout: HitLayout; readOnly?: boolean }> = ({ i useEffect(() => { if (!hit) { - getHit(id); + void getHit(id); } // oxlint-disable-next-line react-hooks/exhaustive-deps }, [id]); diff --git a/ui/src/components/elements/hit/HitComments.tsx b/ui/src/components/elements/hit/HitComments.tsx index 4e2c7f77e..f0c2f27a9 100644 --- a/ui/src/components/elements/hit/HitComments.tsx +++ b/ui/src/components/elements/hit/HitComments.tsx @@ -91,7 +91,7 @@ const HitComments: FC = ({ hit, users }) => { useEffect(() => { if (hit?.howler?.analytic) { - getMatchingAnalytic(hit).then(analytic => { + void getMatchingAnalytic(hit).then(analytic => { setAnalyticId(analytic?.analytic_id); setAnalyticComments(sortByTimestamp(analytic?.comment ?? [])); }); @@ -159,7 +159,7 @@ const HitComments: FC = ({ hit, users }) => { } if (e.ctrlKey && e.key === 'Enter' && !loading) { - onSubmit(); + void onSubmit(); } }, [loading, onSubmit] @@ -210,7 +210,7 @@ const HitComments: FC = ({ hit, users }) => { setComments( comments.map(cmt => - cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...(cmt?.reactions ?? {}), [user.username]: type } } + cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: type } } ) ); } else { @@ -218,9 +218,7 @@ const HitComments: FC = ({ hit, users }) => { setComments( comments.map(cmt => - cmt.id !== commentId - ? cmt - : { ...cmt, reactions: { ...(cmt?.reactions ?? {}), [user.username]: undefined } } + cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: undefined } } ) ); } diff --git a/ui/src/components/elements/hit/HitContextMenu.test.tsx b/ui/src/components/elements/hit/HitContextMenu.test.tsx index ed172158d..c2c7585e2 100644 --- a/ui/src/components/elements/hit/HitContextMenu.test.tsx +++ b/ui/src/components/elements/hit/HitContextMenu.test.tsx @@ -108,6 +108,7 @@ vi.mock('@mui/material', async () => { Menu: ({ children, open, onClose, ...props }) => open ? (
{ const Component = component || 'div'; return ( { act(() => { const menu = screen.getByRole('menu'); - user.click(menu); + void user.click(menu); }); await waitFor(() => { diff --git a/ui/src/components/elements/hit/HitContextMenu.tsx b/ui/src/components/elements/hit/HitContextMenu.tsx index 701406a77..b1634baab 100644 --- a/ui/src/components/elements/hit/HitContextMenu.tsx +++ b/ui/src/components/elements/hit/HitContextMenu.tsx @@ -254,8 +254,8 @@ const HitContextMenu: FC> = ({ children, return; } - getMatchingAnalytic(hit).then(setAnalytic); - getMatchingTemplate(hit).then(setTemplate); + void getMatchingAnalytic(hit).then(setAnalytic); + void getMatchingTemplate(hit).then(setTemplate); // oxlint-disable-next-line react-hooks/exhaustive-deps }, [hit]); diff --git a/ui/src/components/elements/hit/HitLabels.tsx b/ui/src/components/elements/hit/HitLabels.tsx index c7cda14ae..e383cc0d9 100644 --- a/ui/src/components/elements/hit/HitLabels.tsx +++ b/ui/src/components/elements/hit/HitLabels.tsx @@ -89,7 +89,7 @@ const NewLabelForm: FC<{ handleSubmit: (label: LabelState) => Promise }> = onChange={e => setLabel(e.currentTarget.value)} onKeyDown={e => { if (e.key === 'Enter') { - handleAdd(); + void handleAdd(); } else if (error) { setError(''); } diff --git a/ui/src/components/elements/hit/HitNotebooks.tsx b/ui/src/components/elements/hit/HitNotebooks.tsx index d90aecf0b..56b71f4ed 100644 --- a/ui/src/components/elements/hit/HitNotebooks.tsx +++ b/ui/src/components/elements/hit/HitNotebooks.tsx @@ -99,16 +99,16 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi showModal( { - goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); + void goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); }} /> ); } else { - goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); + void goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); } } catch { // error means notebook doesn't exist, we can proceed with posting - goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); + void goToJupyhub(nbFileName, `${envs[0].url}post/${nbFileName}`); } setLoading(false); @@ -150,9 +150,9 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi useEffect(() => { if (open) { - fetchEnvs(); //retrieve env info from howler-api/nbgallery + void fetchEnvs(); //retrieve env info from howler-api/nbgallery if (selectedNotebook) { - fetchNb(); + void fetchNb(); } } else { setLoadedNotebook({ @@ -185,7 +185,7 @@ const HitNotebooks: FC<{ analytic: Analytic; selectedNotebook?: string; hit?: Hi label="Notebook" select onChange={e => { - fetchNb(e.target.value); + void fetchNb(e.target.value); }} SelectProps={{ MenuProps: { diff --git a/ui/src/components/elements/hit/HitOutline.tsx b/ui/src/components/elements/hit/HitOutline.tsx index e9935f588..c81cf495e 100644 --- a/ui/src/components/elements/hit/HitOutline.tsx +++ b/ui/src/components/elements/hit/HitOutline.tsx @@ -28,7 +28,7 @@ const HitOutline: FC<{ hit: WithMetadata; layout: HitLayout; forceAllFields const [template, setTemplate] = useState