@simplybusiness/mobius-datepicker 9.0.2 → 9.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export declare function mockMatchMedia(matches: boolean): void;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplybusiness/mobius-datepicker",
3
3
  "license": "UNLICENSED",
4
- "version": "9.0.2",
4
+ "version": "9.0.3",
5
5
  "description": "Mobius date picker component",
6
6
  "repository": {
7
7
  "type": "git",
@@ -49,8 +49,8 @@
49
49
  "build:types": "tsc --emitDeclarationOnly --project tsconfig.build.json",
50
50
  "lint": "eslint",
51
51
  "lint:fix": "eslint --fix",
52
- "test": "NODE_OPTIONS=--experimental-vm-modules jest",
53
- "test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --collect-coverage",
52
+ "test": "vitest run",
53
+ "test:coverage": "vitest run --coverage",
54
54
  "check-types": "tsc --noEmit --pretty",
55
55
  "lint:css": "lint-css",
56
56
  "lint:css:fix": "lint-css --fix"
@@ -62,17 +62,15 @@
62
62
  "@eslint/js": "^9.39.2",
63
63
  "@simplybusiness/build-scripts": "^2.0.1",
64
64
  "@simplybusiness/eslint-config": "^2.0.1",
65
- "@swc/core": "^1.12.5",
66
- "@swc/jest": "^0.2.39",
67
65
  "@testing-library/dom": "^10.4.1",
68
66
  "@testing-library/jest-dom": "6.9.1",
69
67
  "@testing-library/react": "^16.3.2",
70
68
  "@testing-library/user-event": "^14.6.1",
71
- "@types/jest": "^30.0.0",
72
69
  "@types/react": "^19.2.11",
73
70
  "@types/react-dom": "^19.2.3",
74
71
  "@typescript-eslint/eslint-plugin": "^8.54.0",
75
72
  "@typescript-eslint/parser": "^8.54.0",
73
+ "@vitest/coverage-v8": "^4.0.18",
76
74
  "eslint": "^9.39.2",
77
75
  "eslint-config-prettier": "^10.1.8",
78
76
  "eslint-import-resolver-typescript": "^4.4.4",
@@ -83,15 +81,12 @@
83
81
  "eslint-plugin-react-hooks": "^7.0.1",
84
82
  "eslint-plugin-ssr-friendly": "^1.3.0",
85
83
  "eslint-plugin-testing-library": "^7.15.4",
86
- "identity-obj-proxy": "^3.0.0",
87
- "jest": "^30.2.0",
88
- "jest-config": "^30.2.0",
89
- "jest-environment-jsdom": "^30.2.0",
90
84
  "prettier": "^3.8.1",
91
85
  "react": "^19.2.4",
92
86
  "react-dom": "^19.2.4",
93
87
  "tslib": "^2.8.1",
94
- "typescript": "^5.9.3"
88
+ "typescript": "^5.9.3",
89
+ "vitest": "^4.0.18"
95
90
  },
96
91
  "peerDependencies": {
97
92
  "react": "^19.2.0",
@@ -99,7 +94,8 @@
99
94
  },
100
95
  "dependencies": {
101
96
  "@simplybusiness/icons": "^5.0.2",
102
- "@simplybusiness/mobius": "^8.0.2",
97
+ "@simplybusiness/mobius": "^9.0.0",
98
+ "@simplybusiness/mobius-hooks": "^0.1.0",
103
99
  "classnames": "^2.5.1",
104
100
  "date-fns": "^4.1.0",
105
101
  "react-day-picker": "^9.13.0"
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryObj } from "@storybook/react-webpack5";
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
2
  import { add, format } from "date-fns";
3
3
  import { excludeControls } from "../../utils";
4
4
  import { StoryContainer } from "../../utils/StoryContainer";
@@ -1,9 +1,13 @@
1
1
  import { fireEvent, render, screen, waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
3
  import { DatePicker } from ".";
4
- import { jestMockMatchMedia } from "../../utils/jestMockMatchMedia";
4
+ import { mockMatchMedia } from "../../utils/mockMatchMedia";
5
5
  import { DEFAULT_AFTER_MAX, DEFAULT_BEFORE_MIN } from "./utils";
6
6
 
7
+ // Eagerly resolve DatePickerModal so React.lazy gets an instant cache hit
8
+ // Without this, the dynamic import can take too long on slow CI runners
9
+ vi.mock("./DatePickerModal", async importOriginal => importOriginal());
10
+
7
11
  const DISABLED_CLASS_NAME = "--is-disabled";
8
12
  const TOUCH_DEVICE_CLASS_NAME = "--is-touch-device";
9
13
  const VALID_CLASS_NAME = "--is-valid";
@@ -17,7 +21,7 @@ const DEVICES = [
17
21
  describe("DatePicker", () => {
18
22
  describe.each(DEVICES)(`given it is a %s`, (deviceLabel, isTouchDevice) => {
19
23
  beforeEach(() => {
20
- jestMockMatchMedia(isTouchDevice as boolean);
24
+ mockMatchMedia(isTouchDevice as boolean);
21
25
  });
22
26
 
23
27
  it("should render without errors", () => {
@@ -110,7 +114,7 @@ describe("DatePicker", () => {
110
114
  it("triggers onChange", async () => {
111
115
  const labelText = "Start date";
112
116
  const testId = "date-picker";
113
- const onChange = jest.fn();
117
+ const onChange = vi.fn();
114
118
 
115
119
  render(
116
120
  <DatePicker
@@ -216,26 +220,35 @@ describe("DatePicker", () => {
216
220
  });
217
221
 
218
222
  describe("when TextField is clicked", () => {
219
- it(`should ${(isTouchDevice && "not") || ""} open the date picker modal`, async () => {
220
- const labelText = "Start date";
221
- const testId = "date-picker";
222
-
223
- render(<DatePicker label={labelText} data-testid={testId} />);
224
-
225
- const inputField = screen.getByTestId(testId);
226
-
227
- await userEvent.click(inputField);
228
-
229
- await waitFor(() => {
230
- if (isTouchDevice) {
231
- expect(
232
- screen.queryByTestId("modal-container"),
233
- ).not.toBeInTheDocument();
234
- } else {
235
- expect(screen.getByTestId("modal-container")).toBeInTheDocument();
236
- }
237
- });
238
- }, 10000);
223
+ it(
224
+ `should ${(isTouchDevice && "not") || ""} open the date picker modal`,
225
+ { retry: 2, timeout: 10000 },
226
+ async () => {
227
+ const labelText = "Start date";
228
+ const testId = "date-picker";
229
+
230
+ render(<DatePicker label={labelText} data-testid={testId} />);
231
+
232
+ const inputField = screen.getByTestId(testId);
233
+
234
+ await userEvent.click(inputField);
235
+
236
+ await waitFor(
237
+ () => {
238
+ if (isTouchDevice) {
239
+ expect(
240
+ screen.queryByTestId("modal-container"),
241
+ ).not.toBeInTheDocument();
242
+ } else {
243
+ expect(
244
+ screen.getByTestId("modal-container"),
245
+ ).toBeInTheDocument();
246
+ }
247
+ },
248
+ { timeout: 10000 },
249
+ );
250
+ },
251
+ );
239
252
  });
240
253
  });
241
254
  });
@@ -73,7 +73,7 @@ describe("DatePickerModal", () => {
73
73
  });
74
74
 
75
75
  it("calls onSelected when a day is picked", async () => {
76
- const onSelected = jest.fn();
76
+ const onSelected = vi.fn();
77
77
 
78
78
  render(<DatePickerModal isOpen top={30} onSelected={onSelected} />);
79
79
 
@@ -142,7 +142,7 @@ describe("DatePickerModal", () => {
142
142
  it.todo("traps focus when opened"); // Move to e2e test with Playwright
143
143
 
144
144
  it("should disable dates before min and after max value", () => {
145
- const onSelected = jest.fn();
145
+ const onSelected = vi.fn();
146
146
  const date = "2025-01-07";
147
147
  const min = "2025-01-05";
148
148
  const max = "2025-01-10";
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
- import { VisuallyHidden, useOnClickOutside } from "@simplybusiness/mobius";
3
+ import { useOnClickOutside } from "@simplybusiness/mobius-hooks";
4
+ import { VisuallyHidden } from "@simplybusiness/mobius";
4
5
  import classNames from "classnames/dedupe";
5
6
  import { parseISO } from "date-fns";
6
7
  import { useId, useRef } from "react";
@@ -3,8 +3,8 @@ import { getStartWeekday } from "./getStartWeekday";
3
3
 
4
4
  describe("getStartWeekday", () => {
5
5
  beforeEach(() => {
6
- jest.spyOn(navigator, "languages", "get").mockReturnValue([]);
7
- jest.spyOn(navigator, "language", "get").mockImplementation(() => "en-GB");
6
+ vi.spyOn(navigator, "languages", "get").mockReturnValue([]);
7
+ vi.spyOn(navigator, "language", "get").mockImplementation(() => "en-GB");
8
8
  });
9
9
 
10
10
  it("assumes default of en-GB (Monday) when no args supplied", () => {
@@ -0,0 +1,36 @@
1
+ import { type MockedFunction } from "vitest";
2
+
3
+ export function mockMatchMedia(matches: boolean) {
4
+ const addListenerMock: MockedFunction<MediaQueryList["addListener"]> =
5
+ vi.fn();
6
+ const removeListenerMock: MockedFunction<MediaQueryList["removeListener"]> =
7
+ vi.fn();
8
+ const addEventListenerMock: MockedFunction<
9
+ MediaQueryList["addEventListener"]
10
+ > = vi.fn();
11
+ const removeEventListenerMock: MockedFunction<
12
+ MediaQueryList["removeEventListener"]
13
+ > = vi.fn();
14
+ const dispatchEventMock: MockedFunction<MediaQueryList["dispatchEvent"]> =
15
+ vi.fn();
16
+
17
+ const matchMediaMock: MockedFunction<typeof window.matchMedia> = vi.fn(
18
+ (query: string) =>
19
+ ({
20
+ matches,
21
+ media: query,
22
+ onchange: null,
23
+ addListener: addListenerMock,
24
+ removeListener: removeListenerMock,
25
+ addEventListener: addEventListenerMock,
26
+ removeEventListener: removeEventListenerMock,
27
+ dispatchEvent: dispatchEventMock,
28
+ }) satisfies MediaQueryList,
29
+ );
30
+
31
+ Object.defineProperty(window, "matchMedia", {
32
+ writable: true,
33
+ configurable: true,
34
+ value: matchMediaMock,
35
+ });
36
+ }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/components/DatePicker/DatePickerModal.tsx", "../../src/hooks/useFocusTrap/useFocusTrap.tsx", "../../src/components/DatePicker/utils/dateObjToString.ts", "../../src/components/DatePicker/constants.ts", "../../src/components/DatePicker/utils/weekdayAsOneLetter.ts", "../../src/components/DatePicker/utils/getStartWeekday.ts", "../../src/components/DatePicker/utils/timezoneOffset.ts", "../../src/components/DatePicker/CustomComponents/CaptionLabel.tsx", "../../src/components/DatePicker/CustomComponents/ChevronComponent.tsx"],
4
- "sourcesContent": ["\"use client\";\n\nimport { VisuallyHidden, useOnClickOutside } from \"@simplybusiness/mobius\";\nimport classNames from \"classnames/dedupe\";\nimport { parseISO } from \"date-fns\";\nimport { useId, useRef } from \"react\";\nimport type { Matcher } from \"react-day-picker\";\nimport { DayPicker } from \"react-day-picker\";\nimport FocusTrap from \"../../hooks/useFocusTrap/useFocusTrap\";\nimport { dateObjToString, weekdayAsOneLetter } from \"./utils\";\nimport { getStartWeekday } from \"./utils/getStartWeekday\";\nimport { toLocal } from \"./utils/timezoneOffset\";\nimport { ChevronComponent, CaptionLabel } from \"./CustomComponents\";\n\nexport type DatePickerModalProps = {\n date?: string; // yyyy-mm-dd\n isOpen: boolean;\n top: number;\n onSelected: (date?: string) => void;\n min?: string;\n max?: string;\n};\n\nconst startWeekday = getStartWeekday(\n // eslint-disable-next-line ssr-friendly/no-dom-globals-in-module-scope\n typeof navigator !== \"undefined\" ? navigator?.language : undefined,\n);\n\nconst DatePickerModal = ({\n date,\n isOpen,\n onSelected,\n top,\n min,\n max,\n}: DatePickerModalProps) => {\n const modalRef = useRef<HTMLDivElement>(null);\n const initialDate = date ? toLocal(date) : undefined;\n const minDate = min ? toLocal(min) : undefined;\n const maxDate = max ? toLocal(max) : undefined;\n const hiddenId = `screen-reader-title-${useId()}`;\n\n const handleSelected = (selectedDate?: string) => {\n onSelected(selectedDate);\n };\n\n const handleDayPickerSelect = (selectedDate: Date | undefined) => {\n if (!selectedDate) return;\n\n handleSelected(dateObjToString(selectedDate));\n };\n\n useOnClickOutside(modalRef, () => {\n if (modalRef.current && isOpen) {\n handleSelected();\n }\n });\n\n const modalClasses = classNames(\"mobius-date-picker__modal\", {\n \"--is-open\": isOpen,\n });\n\n return (\n <FocusTrap>\n <div\n ref={modalRef}\n className={modalClasses}\n style={{ top }}\n aria-describedby={hiddenId}\n data-testid=\"modal-container\"\n >\n <VisuallyHidden>\n <div id={hiddenId}>Please select a date from the calendar</div>\n </VisuallyHidden>\n <DayPicker\n autoFocus\n mode=\"single\"\n {...(minDate && { startMonth: minDate })}\n {...(maxDate && { endMonth: maxDate })}\n disabled={\n {\n ...(min && { before: parseISO(min) }),\n ...(max && { after: parseISO(max) }),\n } as Matcher\n }\n selected={initialDate}\n defaultMonth={initialDate}\n onSelect={handleDayPickerSelect}\n pagedNavigation\n showOutsideDays\n weekStartsOn={startWeekday}\n formatters={{ formatWeekdayName: weekdayAsOneLetter }}\n components={{\n Chevron: ChevronComponent,\n CaptionLabel,\n }}\n classNames={{\n root: \"mobius-date-picker__root\",\n months: \"mobius-date-picker__months\",\n month: \"mobius-date-picker__month\",\n nav: \"mobius-date-picker__nav\",\n button_previous: \"mobius-date-picker__nav-button --previous\",\n button_next: \"mobius-date-picker__nav-button --next\",\n month_caption: \"mobius-date-picker__caption\",\n caption_label: \"mobius-date-picker__caption-label\",\n month_grid: \"mobius-date-picker__month-grid\",\n weekdays: \"mobius-date-picker__weekdays\",\n weekday: \"mobius-date-picker__weekday\",\n weeks: \"mobius-date-picker__weeks\",\n week: \"mobius-date-picker__week\",\n day: \"mobius-date-picker__day\",\n day_button: \"mobius-date-picker__day-button\",\n selected: \"--is-selected\",\n disabled: \"--is-disabled\",\n outside: \"--is-outside\",\n hidden: \"--is-hidden\",\n today: \"--is-today\",\n focused: \"--is-focused\",\n }}\n />\n </div>\n </FocusTrap>\n );\n};\n\nexport default DatePickerModal;\n", "import type { ReactNode } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\nconst useFocusTrap = () => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (containerRef.current) {\n const element = containerRef.current;\n const focusableElements =\n containerRef.current.querySelectorAll<HTMLElement>(\n '[tabindex=\"0\"], .mobius-date-picker__nav-button',\n );\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n const handleTabKeyPress = (event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n } else if (\n !event.shiftKey &&\n document.activeElement &&\n document.activeElement.className.indexOf(\n \"mobius-date-picker__day-button\",\n ) > -1\n ) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n element.addEventListener(\"keydown\", handleTabKeyPress);\n return () => {\n element.removeEventListener(\"keydown\", handleTabKeyPress);\n };\n }\n return () => {};\n }, []);\n\n return containerRef;\n};\n\nexport type FocusTrapProps = {\n children: ReactNode;\n};\n\nexport default function FocusTrap({ children }: FocusTrapProps) {\n const focusRef = useFocusTrap();\n\n return (\n <div className=\"trap\" ref={focusRef}>\n {children}\n </div>\n );\n}\n", "export const dateObjToString = (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n\n // Extract the date part from the Date object\n return `${year}-${month}-${day}`;\n};\n", "export const SUNDAY_AS_NUMBER = 0;\nexport const MONDAY_AS_NUMBER = 1;\nexport const DEFAULT_LOCALE = \"en-GB\";\n", "import { DEFAULT_LOCALE } from \"../constants\";\n\nexport const weekdayAsOneLetter = (date: Date) => {\n const locale = navigator.language || DEFAULT_LOCALE;\n const oneLetter = date.toLocaleString(locale, {\n weekday: \"narrow\",\n });\n\n return oneLetter;\n};\n", "import {\n DEFAULT_LOCALE,\n MONDAY_AS_NUMBER,\n SUNDAY_AS_NUMBER,\n} from \"../constants\";\n\ntype WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;\n\n// Calculates start of week for calendar in UK and US locales\n// Add more to the switch statement as needed\nexport const getStartWeekday = (locale?: string): WeekStart => {\n switch (locale || DEFAULT_LOCALE) {\n case \"en-US\":\n return SUNDAY_AS_NUMBER;\n\n default:\n return MONDAY_AS_NUMBER;\n }\n};\n", "/**\n * Converts a local date-time to UTC\n * @param localDate - Date object in local timezone\n * @returns Date object in UTC\n */\nexport function toUTC(localDate: Date): Date {\n return new Date(localDate.getTime() - localDate.getTimezoneOffset() * 60000);\n}\n\nexport function toLocal(utcDateString: string): Date {\n const utcDate = new Date(utcDateString);\n if (Number.isNaN(utcDate.getTime())) {\n throw new Error(\"Invalid date string\");\n }\n // Convert UTC date to local date\n // by adding the timezone offset in milliseconds\n return new Date(utcDate.getTime() + utcDate.getTimezoneOffset() * 60000);\n}\n", "import { type HTMLAttributes } from \"react\";\n\n/**\n *\n * This component is used to render the caption label for the date picker.\n * We are overriding the standard span with an h2 for accessibility reasons.\n */\nexport const CaptionLabel = (props: HTMLAttributes<HTMLSpanElement>) => {\n return <h2 {...props} />;\n};\n", "import { chevronLeft, chevronRight } from \"@simplybusiness/icons\";\nimport { Icon } from \"@simplybusiness/mobius\";\n\ntype ChevronComponentProps = {\n orientation?: \"up\" | \"down\" | \"left\" | \"right\";\n};\n\nexport const ChevronComponent = ({ orientation }: ChevronComponentProps) => {\n if (orientation === \"left\") {\n return <Icon icon={chevronLeft} />;\n }\n return <Icon icon={chevronRight} />;\n};\n"],
5
- "mappings": "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",
6
- "names": ["useRef", "jsx", "jsx", "jsx", "useRef"]
7
- }
@@ -1 +0,0 @@
1
- export declare function jestMockMatchMedia(matches: boolean): void;
@@ -1,36 +0,0 @@
1
- export function jestMockMatchMedia(matches: boolean) {
2
- const addListenerMock: jest.MockedFunction<MediaQueryList["addListener"]> =
3
- jest.fn();
4
- const removeListenerMock: jest.MockedFunction<
5
- MediaQueryList["removeListener"]
6
- > = jest.fn();
7
- const addEventListenerMock: jest.MockedFunction<
8
- MediaQueryList["addEventListener"]
9
- > = jest.fn();
10
- const removeEventListenerMock: jest.MockedFunction<
11
- MediaQueryList["removeEventListener"]
12
- > = jest.fn();
13
- const dispatchEventMock: jest.MockedFunction<
14
- MediaQueryList["dispatchEvent"]
15
- > = jest.fn();
16
-
17
- const matchMediaMock: jest.MockedFunction<typeof window.matchMedia> = jest.fn(
18
- (query: string) =>
19
- ({
20
- matches,
21
- media: query,
22
- onchange: null,
23
- addListener: addListenerMock,
24
- removeListener: removeListenerMock,
25
- addEventListener: addEventListenerMock,
26
- removeEventListener: removeEventListenerMock,
27
- dispatchEvent: dispatchEventMock,
28
- }) satisfies MediaQueryList,
29
- );
30
-
31
- Object.defineProperty(window, "matchMedia", {
32
- writable: true,
33
- configurable: true,
34
- value: matchMediaMock,
35
- });
36
- }