diff --git a/package.json b/package.json index a567fa39a5..6c9c33c504 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "dependencies": { "@floating-ui/react": "^0.27.0", "clsx": "^2.1.1", - "date-fns": "^4.1.0" + "date-fns": "^3.6.0" }, "scripts": { "eslint": "eslint --ext .js,.jsx,.ts,.tsx ./src", diff --git a/rollup.config.mjs b/rollup.config.mjs index 8022465547..6b631e86e8 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -24,6 +24,25 @@ const banner = `/*! Released under the ${pkg.license} License. */`; +// it's important to mark all subpackages of data-fns as externals +// see https://github.com/Hacker0x01/react-datepicker/issues/1606 +// We're relying on date-fn's package.json `exports` field to +// determine the list of directories to include. +const dateFnsPackageJson = JSON.parse( + fs + .readFileSync( + path.join( + path.dirname(fileURLToPath(import.meta.url)), + "node_modules/date-fns/package.json", + ), + ) + .toString(), +); +const dateFnsSubpackages = Object.keys(dateFnsPackageJson.exports) + .map((key) => key.replace("./", "")) + .filter((key) => key !== "." && key !== "package.json") + .map((key) => `date-fns/${key}`); + const globals = { react: "React", "prop-types": "PropTypes", @@ -90,6 +109,7 @@ const config = { external: [ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {}), + ...dateFnsSubpackages, ], }; diff --git a/src/date_utils.ts b/src/date_utils.ts index f74ddc8299..3ab13719e5 100644 --- a/src/date_utils.ts +++ b/src/date_utils.ts @@ -1,67 +1,64 @@ -import { - addDays, - addHours, - addMinutes, - addMonths, - addQuarters, - addSeconds, - addWeeks, - addYears, - isEqual as dfIsEqual, - isSameDay as dfIsSameDay, - isSameMonth as dfIsSameMonth, - isSameQuarter as dfIsSameQuarter, - isSameYear as dfIsSameYear, - differenceInCalendarDays, - differenceInCalendarMonths, - differenceInCalendarQuarters, - differenceInCalendarYears, - endOfDay, - endOfMonth, - endOfWeek, - endOfYear, - format, - getDate, - getDay, - getHours, - getISOWeek, - getMinutes, - getMonth, - getQuarter, - getSeconds, - getTime, - getYear, - isAfter, - isBefore, - isDate, - isValid as isValidDate, - isWithinInterval, - longFormatters, - max, - min, - parse, - parseISO, - set, - setHours, - setMinutes, - setMonth, - setQuarter, - setSeconds, - setYear, - startOfDay, - startOfMonth, - startOfQuarter, - startOfWeek, - startOfYear, - subDays, - subMonths, - subQuarters, - subWeeks, - subYears, - toDate, -} from "date-fns"; - -import type { Locale as DateFnsLocale, Day } from "date-fns"; +import { addDays } from "date-fns/addDays"; +import { addHours } from "date-fns/addHours"; +import { addMinutes } from "date-fns/addMinutes"; +import { addMonths } from "date-fns/addMonths"; +import { addQuarters } from "date-fns/addQuarters"; +import { addSeconds } from "date-fns/addSeconds"; +import { addWeeks } from "date-fns/addWeeks"; +import { addYears } from "date-fns/addYears"; +import { differenceInCalendarDays } from "date-fns/differenceInCalendarDays"; +import { differenceInCalendarMonths } from "date-fns/differenceInCalendarMonths"; +import { differenceInCalendarQuarters } from "date-fns/differenceInCalendarQuarters"; +import { differenceInCalendarYears } from "date-fns/differenceInCalendarYears"; +import { endOfDay } from "date-fns/endOfDay"; +import { endOfMonth } from "date-fns/endOfMonth"; +import { endOfWeek } from "date-fns/endOfWeek"; +import { endOfYear } from "date-fns/endOfYear"; +import { format, longFormatters } from "date-fns/format"; +import { getDate } from "date-fns/getDate"; +import { getDay } from "date-fns/getDay"; +import { getHours } from "date-fns/getHours"; +import { getISOWeek } from "date-fns/getISOWeek"; +import { getMinutes } from "date-fns/getMinutes"; +import { getMonth } from "date-fns/getMonth"; +import { getQuarter } from "date-fns/getQuarter"; +import { getSeconds } from "date-fns/getSeconds"; +import { getTime } from "date-fns/getTime"; +import { getYear } from "date-fns/getYear"; +import { isAfter } from "date-fns/isAfter"; +import { isBefore } from "date-fns/isBefore"; +import { isDate } from "date-fns/isDate"; +import { isEqual as dfIsEqual } from "date-fns/isEqual"; +import { isSameDay as dfIsSameDay } from "date-fns/isSameDay"; +import { isSameMonth as dfIsSameMonth } from "date-fns/isSameMonth"; +import { isSameQuarter as dfIsSameQuarter } from "date-fns/isSameQuarter"; +import { isSameYear as dfIsSameYear } from "date-fns/isSameYear"; +import { isValid as isValidDate } from "date-fns/isValid"; +import { isWithinInterval } from "date-fns/isWithinInterval"; +import { max } from "date-fns/max"; +import { min } from "date-fns/min"; +import { parse } from "date-fns/parse"; +import { parseISO } from "date-fns/parseISO"; +import { set } from "date-fns/set"; +import { setHours } from "date-fns/setHours"; +import { setMinutes } from "date-fns/setMinutes"; +import { setMonth } from "date-fns/setMonth"; +import { setQuarter } from "date-fns/setQuarter"; +import { setSeconds } from "date-fns/setSeconds"; +import { setYear } from "date-fns/setYear"; +import { startOfDay } from "date-fns/startOfDay"; +import { startOfMonth } from "date-fns/startOfMonth"; +import { startOfQuarter } from "date-fns/startOfQuarter"; +import { startOfWeek } from "date-fns/startOfWeek"; +import { startOfYear } from "date-fns/startOfYear"; +import { subDays } from "date-fns/subDays"; +import { subMonths } from "date-fns/subMonths"; +import { subQuarters } from "date-fns/subQuarters"; +import { subWeeks } from "date-fns/subWeeks"; +import { subYears } from "date-fns/subYears"; +import { toDate } from "date-fns/toDate"; + +import type { Day, Locale as DateFnsLocale } from "date-fns"; export type DateNumberType = Day; interface LocaleObj @@ -343,21 +340,21 @@ export function setTime( return setHours(setMinutes(setSeconds(date, second), minute), hour); } -export { setHours, setMinutes, setMonth, setQuarter, setYear }; +export { setMinutes, setHours, setMonth, setQuarter, setYear }; // ** Date Getters ** // getDay Returns day of week, getDate returns day of month export { - getDate, - getDay, - getHours, + getSeconds, getMinutes, + getHours, getMonth, getQuarter, - getSeconds, - getTime, getYear, + getDay, + getDate, + getTime, }; /** @@ -490,22 +487,22 @@ export function getEndOfMonth(date: Date): Date { // *** Addition *** export { - addDays, + addSeconds, addMinutes, + addDays, + addWeeks, addMonths, addQuarters, - addSeconds, - addWeeks, addYears, }; // *** Subtraction *** -export { addHours, subDays, subMonths, subQuarters, subWeeks, subYears }; +export { addHours, subDays, subWeeks, subMonths, subQuarters, subYears }; // ** Date Comparison ** -export { isAfter, isBefore }; +export { isBefore, isAfter }; /** * Checks if two dates are in the same year. diff --git a/src/test/calendar_test.test.tsx b/src/test/calendar_test.test.tsx index 5c31b3700a..5669aa6c60 100644 --- a/src/test/calendar_test.test.tsx +++ b/src/test/calendar_test.test.tsx @@ -3,14 +3,9 @@ */ import { render, fireEvent, act, waitFor } from "@testing-library/react"; -import { - setDate, - startOfMonth, - eachDayOfInterval, - endOfMonth, - endOfYear, - isSunday, -} from "date-fns"; +import { setDate, startOfMonth, eachDayOfInterval, endOfMonth } from "date-fns"; +import { endOfYear } from "date-fns/endOfYear"; +import { isSunday } from "date-fns/isSunday"; import { eo } from "date-fns/locale/eo"; import { fi } from "date-fns/locale/fi"; import React from "react"; diff --git a/src/test/date_utils_test.test.ts b/src/test/date_utils_test.test.ts index 19d504e74a..a3d5c25117 100644 --- a/src/test/date_utils_test.test.ts +++ b/src/test/date_utils_test.test.ts @@ -1,11 +1,8 @@ -import { - addYears, - setSeconds, - addQuarters, - setHours, - setMinutes, -} from "date-fns"; +import { addYears, setSeconds } from "date-fns"; +import { addQuarters } from "date-fns/addQuarters"; import { ptBR } from "date-fns/locale/pt-BR"; +import { setHours } from "date-fns/setHours"; +import { setMinutes } from "date-fns/setMinutes"; import { newDate, diff --git a/src/test/month_test.test.tsx b/src/test/month_test.test.tsx index fba4b839ec..22bc184aa1 100644 --- a/src/test/month_test.test.tsx +++ b/src/test/month_test.test.tsx @@ -1,6 +1,6 @@ /* eslint jest/expect-expect: ["error", { "assertFunctionNames": ["expect", "assertDateRangeInclusive", "runAxe"] }] */ import { render, fireEvent } from "@testing-library/react"; -import { es } from "date-fns/locale/es"; +import { es } from "date-fns/locale"; import React from "react"; import DatePicker from "../"; diff --git a/yarn.lock b/yarn.lock index 3d2ca9bb78..be3d5e453a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4178,10 +4178,10 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^4.1.0": - version: 4.1.0 - resolution: "date-fns@npm:4.1.0" - checksum: 10c0/b79ff32830e6b7faa009590af6ae0fb8c3fd9ffad46d930548fbb5acf473773b4712ae887e156ba91a7b3dc30591ce0f517d69fd83bd9c38650fdc03b4e0bac8 +"date-fns@npm:^3.6.0": + version: 3.6.0 + resolution: "date-fns@npm:3.6.0" + checksum: 10c0/0b5fb981590ef2f8e5a3ba6cd6d77faece0ea7f7158948f2eaae7bbb7c80a8f63ae30b01236c2923cf89bb3719c33aeb150c715ea4fe4e86e37dcf06bed42fb6 languageName: node linkType: hard @@ -8413,7 +8413,7 @@ __metadata: babel-plugin-transform-react-remove-prop-types: "npm:^0.4.24" clsx: "npm:^2.1.1" core-js: "npm:^3.38.1" - date-fns: "npm:^4.1.0" + date-fns: "npm:^3.6.0" eslint: "npm:^8.57.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-import: "npm:^2.29.1"