diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 70572145b..000000000 --- a/.eslintignore +++ /dev/null @@ -1,20 +0,0 @@ -build/ -dist/ -frontend/src/components/_dsfr/ -frontend/jest.polyfills.js -node_modules/ -public/ -tools/ - -README.md -bin -Procfile -jest.config.js -.eslintrc.json -package.json -package-lock.json -yarn.lock -cron.json - -*.css -*.hbs diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 4fbb11aaa..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "root": true, - "env": { - "es2021": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint", "import"], - "rules": { - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": "off", - "import/no-commonjs": "error", - "eqeqeq": ["error", "always"], - "semi": ["error", "always"] - }, - "overrides": [ - { - "files": ["frontend/src/**/*.ts?(x)"], - "extends": [ - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "plugin:react-hooks/recommended" - ], - "settings": { - "react": { - "version": "detect" - } - }, - "rules": { - "no-irregular-whitespace": ["error", { "skipJSXText": true }] - }, - "overrides": [ - { - "files": ["frontend/src/**/*.test.ts?(x)"], - "extends": [ - "plugin:jest/recommended", - "plugin:testing-library/react" - ], - "rules": { - "jest/expect-expect": "off", - "react/display-name": "off" - } - } - ] - } - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..55c606a16 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,86 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import _import from "eslint-plugin-import"; +import { fixupPluginRules, fixupConfigRules } from "@eslint/compat"; +import globals from "globals"; +import tsParser from "@typescript-eslint/parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [{ + ignores: [ + "**/build/", + "**/dist/", + "frontend/src/components/_dsfr/", + "frontend/jest.polyfills.js", + "**/node_modules/", + "**/public/", + "**/tools/", + "**/README.md", + "**/bin", + "**/Procfile", + "**/jest.config.js", + "**/.eslintrc.json", + "**/package.json", + "**/package-lock.json", + "**/yarn.lock", + "**/cron.json", + "**/*.css", + "**/*.hbs", + "server/jest.config.ts", + "frontend/jest.config.ts", + ], +}, ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"), { + plugins: { + "@typescript-eslint": typescriptEslint, + import: fixupPluginRules(_import), + }, + + languageOptions: { + globals: { + ...globals.node, + }, + + parser: tsParser, + ecmaVersion: 2023, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-var-requires": "off", + "import/no-commonjs": "error", + eqeqeq: ["error", "always"], + semi: ["error", "always"], + }, +}, ...fixupConfigRules(compat.extends( + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", +)).map(config => ({ + ...config, + files: ["frontend/src/**/*.ts?(x)"], +})), { + files: ["frontend/src/**/*.ts?(x)"], + + settings: { + react: { + version: "detect", + }, + }, + + rules: { + "no-irregular-whitespace": ["error", { + skipJSXText: true, + }], + }, +}]; diff --git a/frontend/src/components/Auth/RequireAuth.tsx b/frontend/src/components/Auth/RequireAuth.tsx index 0d47b78cb..327377e97 100644 --- a/frontend/src/components/Auth/RequireAuth.tsx +++ b/frontend/src/components/Auth/RequireAuth.tsx @@ -4,6 +4,7 @@ import { Navigate, useLocation } from 'react-router-dom'; import { useUser } from '../../hooks/useUser'; import { useFetchInterceptor } from '../../hooks/useFetchInterceptor'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type interface RequireAuthProps {} function RequireAuth(props: PropsWithChildren) { diff --git a/frontend/src/components/Auth/RequireGuest.tsx b/frontend/src/components/Auth/RequireGuest.tsx index 9f79301d8..dd8f8b4b3 100644 --- a/frontend/src/components/Auth/RequireGuest.tsx +++ b/frontend/src/components/Auth/RequireGuest.tsx @@ -3,6 +3,7 @@ import { PropsWithChildren } from 'react'; import { useUser } from '../../hooks/useUser'; import { Navigate } from 'react-router-dom'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type interface RequireGuestProps {} function RequireGuest(props: PropsWithChildren) { diff --git a/frontend/src/components/Draft/PreviewButton.tsx b/frontend/src/components/Draft/PreviewButton.tsx index 16109e72d..6b2c40115 100644 --- a/frontend/src/components/Draft/PreviewButton.tsx +++ b/frontend/src/components/Draft/PreviewButton.tsx @@ -87,7 +87,7 @@ function PreviewButton(props: Readonly) { setIsSuccess(true); } } - } catch (error) { + } catch { setIsError(true); } finally { setIsLoading(false); diff --git a/frontend/src/components/Image/Image.tsx b/frontend/src/components/Image/Image.tsx index 19a8be96f..3ce04edcf 100644 --- a/frontend/src/components/Image/Image.tsx +++ b/frontend/src/components/Image/Image.tsx @@ -2,16 +2,7 @@ import { fr } from '@codegouvfr/react-dsfr'; import styled from '@emotion/styled'; import classNames from 'classnames'; -const responsiveValues = [ - '1x1', - '2x3', - '3x2', - '3x4', - '4x3', - '16x9', - '32x9' -] as const; -type Responsive = (typeof responsiveValues)[number]; +type Responsive = '1x1' | '2x3' | '3x2' | '3x4' | '4x3' | '16x9' | '32x9'; interface Props { alt: string; diff --git a/frontend/src/components/_app/AppInfo/AppInfo.tsx b/frontend/src/components/_app/AppInfo/AppInfo.tsx index b1a18e349..726d70a5e 100644 --- a/frontend/src/components/_app/AppInfo/AppInfo.tsx +++ b/frontend/src/components/_app/AppInfo/AppInfo.tsx @@ -4,6 +4,7 @@ import { PropsWithChildren } from 'react'; import styles from './app-info.module.scss'; import { fr } from '@codegouvfr/react-dsfr'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type interface Props {} function AppInfo(props: PropsWithChildren) { diff --git a/frontend/src/components/modals/HousingCreationModal/FillLocalId.tsx b/frontend/src/components/modals/HousingCreationModal/FillLocalId.tsx index 17a6656bd..3306450b5 100644 --- a/frontend/src/components/modals/HousingCreationModal/FillLocalId.tsx +++ b/frontend/src/components/modals/HousingCreationModal/FillLocalId.tsx @@ -55,7 +55,7 @@ const FillLocalId = forwardRef((props: StepProps, ref) => { ]); dispatch(changeCreator({ localId })); return 'review-housing'; - } catch (error) { + } catch { return null; } } diff --git a/frontend/src/components/modals/ModalStepper/ModalStepper.test.tsx b/frontend/src/components/modals/ModalStepper/ModalStepper.test.tsx index 203815797..af21d47be 100644 --- a/frontend/src/components/modals/ModalStepper/ModalStepper.test.tsx +++ b/frontend/src/components/modals/ModalStepper/ModalStepper.test.tsx @@ -13,11 +13,11 @@ describe('Modal stepper', () => { const steps: Step[] = [ { title: 'Title 1', - Component: forwardRef(() =>

Step 1

), + Component: forwardRef(function Step1() { return

Step 1

; }), }, { title: 'Title 2', - Component: forwardRef(() =>

Step 2

), + Component: forwardRef(function Step2() { return

Step 2

; }), }, ]; diff --git a/frontend/src/components/modals/ModalStepper/ModalStepper.tsx b/frontend/src/components/modals/ModalStepper/ModalStepper.tsx index d4e9b1c33..9efffd8f6 100644 --- a/frontend/src/components/modals/ModalStepper/ModalStepper.tsx +++ b/frontend/src/components/modals/ModalStepper/ModalStepper.tsx @@ -68,7 +68,11 @@ function ModalStepper(props: Props) { onClick: async () => { const next = (await ref.current?.onNext?.()) ?? true; if (next) { - stepper.isOver() ? modal.close() : stepper.next(); + if (stepper.isOver()) { + modal.close(); + } else { + stepper.next(); + } } }, }, diff --git a/frontend/src/hooks/useClipboard.tsx b/frontend/src/hooks/useClipboard.tsx index 4c1ff5d3e..8f0227caa 100644 --- a/frontend/src/hooks/useClipboard.tsx +++ b/frontend/src/hooks/useClipboard.tsx @@ -16,9 +16,11 @@ export function useClipboard(opts?: ClipboardOptions) { const [copied, setCopied] = useState(false); async function copy(data: ClipboardItems | string) { - typeof data === 'string' - ? await navigator.clipboard.writeText(data) - : await navigator.clipboard.write(data); + if (typeof data === 'string') { + await navigator.clipboard.writeText(data); + } else { + await navigator.clipboard.write(data); + } setCopied(true); delay(() => setCopied(false), options.timeout); diff --git a/frontend/src/hooks/useUnsavedChanges.tsx b/frontend/src/hooks/useUnsavedChanges.tsx index 305f91b8f..911659c4d 100644 --- a/frontend/src/hooks/useUnsavedChanges.tsx +++ b/frontend/src/hooks/useUnsavedChanges.tsx @@ -15,7 +15,11 @@ function useUnsavedChanges(props: Readonly) { useEffect(() => { if (blocker.state === 'blocked') { - window.confirm(message) ? blocker.proceed() : blocker.reset(); + if (window.confirm(message)) { + blocker.proceed(); + } else { + blocker.reset(); + } } }, [blocker, message]); } diff --git a/frontend/src/models/Draft.tsx b/frontend/src/models/Draft.tsx index 1a05270fb..68398f690 100644 --- a/frontend/src/models/Draft.tsx +++ b/frontend/src/models/Draft.tsx @@ -7,6 +7,7 @@ import { import { SenderPayload } from './Sender'; import { DeepNonNullable } from 'ts-essentials'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface Draft extends DraftDTO {} export interface DraftCreationPayload diff --git a/frontend/src/models/GroupFilters.tsx b/frontend/src/models/GroupFilters.tsx index 03ea46ef1..b6e72bffe 100644 --- a/frontend/src/models/GroupFilters.tsx +++ b/frontend/src/models/GroupFilters.tsx @@ -1 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface GroupFilters {} diff --git a/frontend/src/models/HousingFilters.tsx b/frontend/src/models/HousingFilters.tsx index 24c21cb83..96ba4cd74 100644 --- a/frontend/src/models/HousingFilters.tsx +++ b/frontend/src/models/HousingFilters.tsx @@ -24,6 +24,7 @@ import { LocalityKindLabels, LocalityKinds } from './Locality'; import EnergyConsumptionOption from '../components/_app/AppMultiSelect/EnergyConsumptionOption'; import { VacancyYear } from './VacancyYear'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface HousingFilters extends HousingFiltersDTO {} export const allOccupancyOptions: SelectOption[] = [ diff --git a/frontend/src/views/Housing/test/HousingView.test.tsx b/frontend/src/views/Housing/test/HousingView.test.tsx index 4ebe2d2e5..31f0b80b5 100644 --- a/frontend/src/views/Housing/test/HousingView.test.tsx +++ b/frontend/src/views/Housing/test/HousingView.test.tsx @@ -73,7 +73,6 @@ describe('Housing view', () => { const vacancyStartYear = await screen .findByText(/^Dans cette situation depuis/) - // eslint-disable-next-line testing-library/no-node-access .then((label) => label.nextElementSibling); expect(vacancyStartYear).toHaveTextContent('Inconnu'); }); @@ -86,7 +85,6 @@ describe('Housing view', () => { const vacancyStartYear = await screen .findByText(/^Dans cette situation depuis/) - // eslint-disable-next-line testing-library/no-node-access .then((label) => label.nextElementSibling); expect(vacancyStartYear).toHaveTextContent('Moins d’un an'); }); @@ -100,7 +98,6 @@ describe('Housing view', () => { const source = await screen .findByText(/^Source/) - // eslint-disable-next-line testing-library/no-node-access .then((label) => label.nextElementSibling); expect(source).toHaveTextContent('Fichiers fonciers (2023)'); }); diff --git a/package.json b/package.json index 437c2a524..1ff7a90cd 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,12 @@ "author": "", "license": "MIT", "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.17.0", "@types/node": "^20.16.10", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", + "@typescript-eslint/eslint-plugin": "^8.18.1", + "@typescript-eslint/parser": "^8.18.1", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.30.0", @@ -36,6 +39,7 @@ "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-testing-library": "^6.3.0", + "globals": "^15.14.0", "husky": "^9.1.6", "is-ci": "^3.0.1", "jest": "^29.7.0", diff --git a/packages/draft/src/pdf.ts b/packages/draft/src/pdf.ts index 05511d2d9..f4046d012 100644 --- a/packages/draft/src/pdf.ts +++ b/packages/draft/src/pdf.ts @@ -165,7 +165,7 @@ function createTransformer(opts: TransformerOptions) { const binaryString = atob(content); const len = binaryString.length; const bytes = new Uint8Array(len); - + for (let i = 0; i < len; i++) { bytes[i] = binaryString.charCodeAt(i); } diff --git a/server/src/controllers/fileRepository.ts b/server/src/controllers/fileRepository.ts index c14515ffd..5c27ecf62 100644 --- a/server/src/controllers/fileRepository.ts +++ b/server/src/controllers/fileRepository.ts @@ -27,7 +27,7 @@ export async function download(logo: string): Promise { url: logo, type: response.ContentType ?? 'base64' }; - } catch (error) { + } catch { throw new FileMissingError(); } } diff --git a/server/src/infra/database/migrations/095-create-indexes-import-datafoncier.ts b/server/src/infra/database/migrations/095-create-indexes-import-datafoncier.ts index d1cd715c1..e19120077 100644 --- a/server/src/infra/database/migrations/095-create-indexes-import-datafoncier.ts +++ b/server/src/infra/database/migrations/095-create-indexes-import-datafoncier.ts @@ -3,16 +3,16 @@ import { Knex } from 'knex'; export async function up(knex: Knex): Promise { await knex.schema.table('owner_matches', function (table) { table.index('owner_id', 'idx_owner_id'); - }), + }); await knex.schema.table('owners_housing', function (table) { table.index('end_date', 'idx_end_date'); - }), + }); await knex.schema.table('ban_addresses', function (table) { table.index('address_kind', 'idx_ban_addresses'); - }), + }); await knex.schema.table('fast_housing', function (table) { table.index('plot_id', 'idx_housing_plot_id'); - }), + }); await knex.schema.table('fast_housing', function (table) { table.index('geo_code', 'idx_housing_geo_code'); }); @@ -21,16 +21,16 @@ export async function up(knex: Knex): Promise { export async function down(knex: Knex): Promise { await knex.schema.table('owner_matches', function (table) { table.dropIndex('owner_id', 'idx_owner_id'); - }), + }); await knex.schema.table('owners_housing', function (table) { table.dropIndex('end_date', 'idx_end_date'); - }), + }); await knex.schema.table('ban_addresses', function (table) { table.dropIndex('address_kind', 'idx_ban_addresses'); - }), + }); await knex.schema.table('fast_housing', function (table) { table.dropIndex('plot_id', 'idx_housing_plot_id'); - }), + }); await knex.schema.table('fast_housing', function (table) { table.dropIndex('geo_code', 'idx_housing_geo_code'); }); diff --git a/server/src/repositories/draftRepository.ts b/server/src/repositories/draftRepository.ts index 92a60d34c..a5dc3317a 100644 --- a/server/src/repositories/draftRepository.ts +++ b/server/src/repositories/draftRepository.ts @@ -141,7 +141,7 @@ export const parseDraftApi = async (draft: DraftDBO): Promise => { if (Array.isArray(draft.logo)) { try { logo = await Promise.all(draft.logo.map(download)); - } catch (error) { + } catch { logo = null; } } diff --git a/server/src/repositories/housingRepository.ts b/server/src/repositories/housingRepository.ts index 683bd3e78..ce9268a9e 100644 --- a/server/src/repositories/housingRepository.ts +++ b/server/src/repositories/housingRepository.ts @@ -136,7 +136,7 @@ async function count(filters: HousingFiltersApi): Promise { const [allowedGeoCodes, intercommunalities] = await Promise.all([ fetchGeoCodes(filters.establishmentIds ?? []), - fetchGeoCodes(filters.intercommunalities ?? []) + fetchGeoCodes(Array.isArray(filters.intercommunalities) ? filters.intercommunalities : []) ]); const localities = filters.localities ?? []; const geoCodes = Set(allowedGeoCodes) @@ -199,9 +199,11 @@ async function findOne(opts: FindOneOptions): Promise { .where(whereOptions(opts)) .modify((query) => { if (opts.geoCode) { - Array.isArray(opts.geoCode) - ? query.whereIn(`${housingTable}.geo_code`, opts.geoCode) - : query.where(`${housingTable}.geo_code`, opts.geoCode); + if (Array.isArray(opts.geoCode)) { + query.whereIn(`${housingTable}.geo_code`, opts.geoCode); + } else { + query.where(`${housingTable}.geo_code`, opts.geoCode); + } } }) .modify(include(opts.includes ?? [])) diff --git a/server/src/repositories/senderRepository.ts b/server/src/repositories/senderRepository.ts index f98947d97..51953850b 100644 --- a/server/src/repositories/senderRepository.ts +++ b/server/src/repositories/senderRepository.ts @@ -103,14 +103,14 @@ export const parseSenderApi = async ( let signatory_one_file; try { signatory_one_file = sender.signatory_one_file ? await download(sender.signatory_one_file) : null; - } catch (error) { + } catch { signatory_one_file = null; } let signatory_two_file; try { signatory_two_file = sender.signatory_two_file ? await download(sender.signatory_two_file) : null; - } catch (error) { + } catch { signatory_two_file = null; } diff --git a/server/src/scripts/import-datafoncier-to-zlv/fix-geo.ts b/server/src/scripts/import-datafoncier-to-zlv/fix-geo.ts index 88a19c6d7..1e6201549 100644 --- a/server/src/scripts/import-datafoncier-to-zlv/fix-geo.ts +++ b/server/src/scripts/import-datafoncier-to-zlv/fix-geo.ts @@ -3,6 +3,7 @@ import { parse } from 'csv-parse'; import { Map } from 'immutable'; import { execSync } from 'node:child_process'; import fs from 'node:fs'; +import stream from 'node:stream'; import db from '~/infra/database'; import { logger } from '~/infra/logger'; @@ -43,7 +44,7 @@ function transform(transformFunction: { (arg0: any, arg1: any): void; }) { let isFirstCol = true; - return require('stream').Transform({ + return new stream.Transform({ objectMode: true, transform: function ( row: any, diff --git a/server/src/scripts/import-datafoncier-to-zlv/index.ts b/server/src/scripts/import-datafoncier-to-zlv/index.ts index f9dc4aa69..b843e8a1c 100644 --- a/server/src/scripts/import-datafoncier-to-zlv/index.ts +++ b/server/src/scripts/import-datafoncier-to-zlv/index.ts @@ -37,7 +37,7 @@ const processRow = async (dfHousing: any) => { owner = toOwnerApi(dfOwner.rows[0]); try { await ownerRepository.save(owner); - } catch (e) { + } catch { return; } } @@ -53,7 +53,7 @@ const processRow = async (dfHousing: any) => { housing_geo_code: housing.geoCode, rank: 1 }); - } catch (e: any) { + } catch { return; } } diff --git a/server/src/scripts/link-dpe/loader.ts b/server/src/scripts/link-dpe/loader.ts index 615efc71d..9273ee0f4 100644 --- a/server/src/scripts/link-dpe/loader.ts +++ b/server/src/scripts/link-dpe/loader.ts @@ -1,5 +1,6 @@ import path from 'path'; import { logger } from '~/infra/logger'; +import { exec } from 'child_process'; import db from '~/infra/database/'; import { housingTable } from '~/repositories/housingRepository'; import downloader from './downloader'; @@ -22,7 +23,6 @@ const loadSchema = async (department: string): Promise => { downloader.getArchiveDir(department), 'bdnb.sql', )}`; - const exec = require('child_process').exec; return new Promise((resolve) => { exec(cmd, async (error: any, stdout: any, stderr: any) => { diff --git a/yarn.lock b/yarn.lock index cb589d62d..651112b77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3562,6 +3562,18 @@ __metadata: languageName: node linkType: hard +"@eslint/compat@npm:^1.2.4": + version: 1.2.4 + resolution: "@eslint/compat@npm:1.2.4" + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/afea54435f0ae6b05f1b732132ae4a9d95ff106be0fc9988ac19f31037eb89b2a0e968212be4d2fbf757ff16923031825a27739d94a365559089dfd8269331e3 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -3579,6 +3591,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/43867a07ff9884d895d9855edba41acf325ef7664a8df41d957135a81a477ff4df4196f5f74dc3382627e5cc8b7ad6b815c2cea1b58f04a75aced7c43414ab8b + languageName: node + linkType: hard + "@eslint/js@npm:8.57.1": version: 8.57.1 resolution: "@eslint/js@npm:8.57.1" @@ -3586,6 +3615,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:^9.17.0": + version: 9.17.0 + resolution: "@eslint/js@npm:9.17.0" + checksum: 10c0/a0fda8657a01c60aa540f95397754267ba640ffb126e011b97fd65c322a94969d161beeaef57c1441c495da2f31167c34bd38209f7c146c7225072378c3a933d + languageName: node + linkType: hard + "@faker-js/faker@npm:^8.4.1": version: 8.4.1 resolution: "@faker-js/faker@npm:8.4.1" @@ -9728,26 +9764,24 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" +"@typescript-eslint/eslint-plugin@npm:^8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.18.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/type-utils": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.18.1" + "@typescript-eslint/type-utils": "npm:8.18.1" + "@typescript-eslint/utils": "npm:8.18.1" + "@typescript-eslint/visitor-keys": "npm:8.18.1" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/2b37948fa1b0dab77138909dabef242a4d49ab93e4019d4ef930626f0a7d96b03e696cd027fa0087881c20e73be7be77c942606b4a76fa599e6b37f6985304c3 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/7994d323228f3fc3ec124291cd02761251bcd9a5a6356001d2cb8f68abdb400c3cfbeb343d6941d8e6b6c8d2d616a278bbb3b6d9ed839ba5148a05f60a1f67b4 languageName: node linkType: hard @@ -9779,21 +9813,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/parser@npm:7.18.0" +"@typescript-eslint/parser@npm:^8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/parser@npm:8.18.1" dependencies: - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.18.1" + "@typescript-eslint/types": "npm:8.18.1" + "@typescript-eslint/typescript-estree": "npm:8.18.1" + "@typescript-eslint/visitor-keys": "npm:8.18.1" debug: "npm:^4.3.4" peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/370e73fca4278091bc1b657f85e7d74cd52b24257ea20c927a8e17546107ce04fbf313fec99aed0cc2a145ddbae1d3b12e9cc2c1320117636dc1281bcfd08059 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/23ab30b3f00b86108137e7df03710a088046ead3582595b0f8e17d5062770365e24e0a1ae3398bb3a1c29aa0f05a0de30887e2e0f6fb86163e878dd0eed1b25c languageName: node linkType: hard @@ -9807,13 +9839,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/scope-manager@npm:7.18.0" +"@typescript-eslint/scope-manager@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/scope-manager@npm:8.18.1" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - checksum: 10c0/038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e + "@typescript-eslint/types": "npm:8.18.1" + "@typescript-eslint/visitor-keys": "npm:8.18.1" + checksum: 10c0/97c503b2ece79b6c99ca8e6a5f1f40855cf72f17fbf05e42e62d19c2666e7e6f5df9bf71f13dbc4720c5ee0397670ba8052482a90441fbffa901da5f2e739565 languageName: node linkType: hard @@ -9844,20 +9876,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/type-utils@npm:7.18.0" +"@typescript-eslint/type-utils@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/type-utils@npm:8.18.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:8.18.1" + "@typescript-eslint/utils": "npm:8.18.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/ad92a38007be620f3f7036f10e234abdc2fdc518787b5a7227e55fd12896dacf56e8b34578723fbf9bea8128df2510ba8eb6739439a3879eda9519476d5783fd + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/cfe5362a22fa5e18a2662928904da024e42c84cb58a46238b9b61edafcd046f53c9505637176c8cd1c386165c6a6ed15a2b51700495cad6c20e0e33499d483a1 languageName: node linkType: hard @@ -9868,10 +9898,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/types@npm:7.18.0" - checksum: 10c0/eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 +"@typescript-eslint/types@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/types@npm:8.18.1" + checksum: 10c0/0a2ca5f7cdebcc844b6bc1e5afc5d83b563f55917d20e3fea3a17ed39c54b003178e26b5ec535113f45c93c569b46628d9a67defa70c01cbdfa801573fed69a2 languageName: node linkType: hard @@ -9900,22 +9930,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" +"@typescript-eslint/typescript-estree@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.18.1" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/types": "npm:8.18.1" + "@typescript-eslint/visitor-keys": "npm:8.18.1" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 + peerDependencies: + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/7ecb061dc63c729b23f4f15db5736ca93b1ae633108400e6c31cf8af782494912f25c3683f9f952dbfd10cb96031caba247a1ad406abf5d163639a00ac3ce5a3 languageName: node linkType: hard @@ -9956,17 +9985,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/utils@npm:7.18.0" +"@typescript-eslint/utils@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/utils@npm:8.18.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.18.1" + "@typescript-eslint/types": "npm:8.18.1" + "@typescript-eslint/typescript-estree": "npm:8.18.1" peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/1e29408bd8fbda9f3386dabdb2b7471dacff28342d5bd6521ca3b7932df0cae100030d2eac75d946a82cbefa33f78000eed4ce789128fdea069ffeabd4429d80 languageName: node linkType: hard @@ -9994,13 +10024,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" +"@typescript-eslint/visitor-keys@npm:8.18.1": + version: 8.18.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.18.1" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 + "@typescript-eslint/types": "npm:8.18.1" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/68651ae1825dbd660ea39b4e1d1618f6ad0026fa3a04aecec296750977cab316564e3e2ace8edbebf1ae86bd17d86acc98cac7b6e9aad4e1c666bd26f18706ad languageName: node linkType: hard @@ -10864,6 +10894,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + "add-stream@npm:^1.0.0": version: 1.0.0 resolution: "add-stream@npm:1.0.0" @@ -15566,6 +15605,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + "eslint-webpack-plugin@npm:^3.1.1": version: 3.2.0 resolution: "eslint-webpack-plugin@npm:3.2.0" @@ -15649,6 +15695,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^10.0.1": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -17226,6 +17283,20 @@ __metadata: languageName: node linkType: hard +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^15.14.0": + version: 15.14.0 + resolution: "globals@npm:15.14.0" + checksum: 10c0/039deb8648bd373b7940c15df9f96ab7508fe92b31bbd39cbd1c1a740bd26db12457aa3e5d211553b234f30e9b1db2fee3683012f543a01a6942c9062857facb + languageName: node + linkType: hard + "globalthis@npm:^1.0.3": version: 1.0.4 resolution: "globalthis@npm:1.0.4" @@ -30619,9 +30690,12 @@ __metadata: version: 0.0.0-use.local resolution: "zero-logement-vacant@workspace:." dependencies: + "@eslint/compat": "npm:^1.2.4" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:^9.17.0" "@types/node": "npm:^20.16.10" - "@typescript-eslint/eslint-plugin": "npm:^7.18.0" - "@typescript-eslint/parser": "npm:^7.18.0" + "@typescript-eslint/eslint-plugin": "npm:^8.18.1" + "@typescript-eslint/parser": "npm:^8.18.1" eslint: "npm:^8.57.1" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-import: "npm:^2.30.0" @@ -30630,6 +30704,7 @@ __metadata: eslint-plugin-react: "npm:^7.37.0" eslint-plugin-react-hooks: "npm:^4.6.2" eslint-plugin-testing-library: "npm:^6.3.0" + globals: "npm:^15.14.0" husky: "npm:^9.1.6" is-ci: "npm:^3.0.1" jest: "npm:^29.7.0"