diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 7751fce28f..ea30faccbf 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -13,24 +13,16 @@ const config = { "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended", "prettier", - "plugin:prettier/recommended", - "plugin:import/recommended", - "plugin:import/typescript" + "plugin:prettier/recommended" ], settings: { - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"] - }, react: { version: "detect" // React version. "detect" automatically picks the version you have installed. } }, rules: { - "react/prop-types": "off", "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off", - "import/no-unresolved": "off", - "import/namespace": "off", + "react/prop-types": "off", "prettier/prettier": "warn", "no-console": "warn", "@typescript-eslint/no-unused-vars": "off", diff --git a/package.json b/package.json index de511086e5..a9f7313fdc 100644 --- a/package.json +++ b/package.json @@ -139,6 +139,7 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.34.2", "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-require-extensions": "^0.1.3", "eslint-plugin-testing-library": "^6.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f52f4d762..9cf9128cbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,6 +77,9 @@ importers: eslint-plugin-react-hooks: specifier: ^4.6.2 version: 4.6.2(eslint@8.57.0) + eslint-plugin-require-extensions: + specifier: ^0.1.3 + version: 0.1.3(eslint@8.57.0) eslint-plugin-testing-library: specifier: ^6.2.2 version: 6.2.2(eslint@8.57.0)(typescript@5.4.5) @@ -3271,6 +3274,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-require-extensions@0.1.3: + resolution: {integrity: sha512-T3c1PZ9PIdI3hjV8LdunfYI8gj017UQjzAnCrxuo3wAjneDbTPHdE3oNWInOjMA+z/aBkUtlW5vC0YepYMZIug==} + engines: {node: '>=16'} + peerDependencies: + eslint: '*' + eslint-plugin-testing-library@6.2.2: resolution: {integrity: sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -10846,6 +10855,10 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.11 + eslint-plugin-require-extensions@0.1.3(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-plugin-testing-library@6.2.2(eslint@8.57.0)(typescript@5.4.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) diff --git a/src/.eslintrc.cjs b/src/.eslintrc.cjs new file mode 100644 index 0000000000..1f6be8ce8e --- /dev/null +++ b/src/.eslintrc.cjs @@ -0,0 +1,27 @@ +/* eslint-env node */ +// @ts-check + +/** @type {import("eslint").Linter.Config} */ +const config = { + plugins: ["require-extensions"], + extends: ["../.eslintrc.cjs", "plugin:require-extensions/recommended"], + overrides: [ + { + files: ["**/?(*.)+(spec|test).[jt]s?(x)"], + env: { + jest: true + }, + extends: ["plugin:jest/recommended", "plugin:testing-library/react"], + rules: { + "testing-library/no-render-in-setup": "off", + "testing-library/no-node-access": "off", + "testing-library/render-result-naming-convention": "off", + "testing-library/no-render-in-lifecycle": "off", + "require-extensions/require-index": "off", + "require-extensions/require-extensions": "off" + } + } + ] +}; + +module.exports = config; diff --git a/src/contexts/providers.tsx b/src/contexts/providers.tsx index 4a22dd60a1..b6560e9798 100644 --- a/src/contexts/providers.tsx +++ b/src/contexts/providers.tsx @@ -11,7 +11,7 @@ import type { PropsMulti, PropsRange, PropsSingle -} from "../types"; +} from "../types/index.js"; import { CalendarContextProvider } from "./useCalendar.js"; import { FocusContextProvider } from "./useFocus.js"; diff --git a/src/contexts/useModifiers.tsx b/src/contexts/useModifiers.tsx index 3502f8971d..c570c95476 100644 --- a/src/contexts/useModifiers.tsx +++ b/src/contexts/useModifiers.tsx @@ -10,7 +10,7 @@ import type { DayFlags, Modifiers, SelectionStates -} from "../types"; +} from "../types/index.js"; import { dateMatchModifiers } from "../utils/dateMatchModifiers.js"; import { isDateInRange } from "../utils/index.js"; diff --git a/src/contexts/useProps.tsx b/src/contexts/useProps.tsx index 3d45bfac51..07acfd2217 100644 --- a/src/contexts/useProps.tsx +++ b/src/contexts/useProps.tsx @@ -16,7 +16,7 @@ import type { Mode, DayPickerProps, DateLib -} from "../types"; +} from "../types/index.js"; const PropsContext = React.createContext( undefined diff --git a/src/types/props.ts b/src/types/props.ts index 1d34454697..dac97c0fcc 100644 --- a/src/types/props.ts +++ b/src/types/props.ts @@ -18,7 +18,7 @@ import type { DateRange, Mode, DateLib -} from "./shared"; +} from "./shared.js"; /** * The props for the `` component. diff --git a/src/types/shared.ts b/src/types/shared.ts index 27f59e7d30..9fe8483c2a 100644 --- a/src/types/shared.ts +++ b/src/types/shared.ts @@ -8,7 +8,7 @@ import { ChevronFlag, WeekNumberFlag, SelectionState -} from "../UI"; +} from "../UI.js"; import * as components from "../components/custom-components.js"; import { formatCaption, @@ -19,7 +19,7 @@ import { formatWeekNumber, formatYearCaption, formatYearDropdown -} from "../formatters"; +} from "../formatters/index.js"; import { labelDay, labelCaption, @@ -30,7 +30,7 @@ import { labelWeekNumber, labelWeekNumberHeader, labelYearDropdown -} from "../labels"; +} from "../labels/index.js"; import { dateLib } from "../lib/index.js"; /** diff --git a/src/utils/typeguards.ts b/src/utils/typeguards.ts index e2d637ee96..b48ae5e5de 100644 --- a/src/utils/typeguards.ts +++ b/src/utils/typeguards.ts @@ -8,7 +8,7 @@ import type { PropsMulti, PropsRange, PropsSingle -} from "../types"; +} from "../types/index.js"; /** * Returns true if `matcher` is of type `DateInterval`. diff --git a/website/.eslintrc.cjs b/website/.eslintrc.cjs new file mode 100644 index 0000000000..f33f1eef58 --- /dev/null +++ b/website/.eslintrc.cjs @@ -0,0 +1,11 @@ +/* eslint-env node */ +// @ts-check + +/** @type {import("eslint").Linter.Config} */ +const config = { + rules: { + "react/react-in-jsx-scope": "off" + } +}; + +module.exports = config; diff --git a/website/examples-v8/react-day-picker-v8.tsx b/website/examples-v8/react-day-picker-v8.tsx index db6d1835ce..8eadf61e90 100644 --- a/website/examples-v8/react-day-picker-v8.tsx +++ b/website/examples-v8/react-day-picker-v8.tsx @@ -1,4 +1,3 @@ -/* eslint-disable import/export */ import { DayPicker as DayPickerV8, type DayPickerProps