From 169e06d83cef5116f0e39c74d2c497f04ba6278d Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 29 May 2024 16:55:35 +0200 Subject: [PATCH 001/163] refactor: update isValidDate return type for improved type safety --- packages/time/src/tests/isValidDate.test.ts | 38 +++++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/time/src/tests/isValidDate.test.ts b/packages/time/src/tests/isValidDate.test.ts index 57a35567..188c31cb 100644 --- a/packages/time/src/tests/isValidDate.test.ts +++ b/packages/time/src/tests/isValidDate.test.ts @@ -1,16 +1,32 @@ -import {describe, expect, test} from 'vitest'; -import {isValidDate} from '../utils/isValidDate'; +import { describe, expect, test } from 'vitest' +import { isValidDate } from '../utils/isValidDate' describe('isValidDate', () => { test('should return true for a valid date', () => { - expect(isValidDate(new Date())).toBe(true); - }); + const date = new Date(); + expect(isValidDate(date)).toBe(true) + }) - test('should return false for an invalid date', () => { - expect(isValidDate(new Date("invalid"))).toBe(false); - }); + test.each([ + '2021-10-10', + new Date('invalid'), + {}, + undefined, + null, + NaN, + 0, + ])('should return false for invalid date %p', (date) => { + expect(isValidDate(date)).toBe(false) + }) - test("should return false for null", () => { - expect(isValidDate(null)).toBe(false); - }); -}); \ No newline at end of file + test('should assert type guards correctly', () => { + const notADate = 'not a date'; + if (isValidDate(notADate)) { + expect(notADate).toBeInstanceOf(Date) + notADate.getDate() + } else { + // @ts-expect-error + notADate.getTime() + } + }) +}) From 75cb7b331a5c2ee41263f45509378197e9645b60 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 29 May 2024 16:55:47 +0200 Subject: [PATCH 002/163] refactor: update isValidDate return type for improved type safety --- packages/time/src/utils/isValidDate.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/time/src/utils/isValidDate.ts b/packages/time/src/utils/isValidDate.ts index 987df31a..c0d15991 100644 --- a/packages/time/src/utils/isValidDate.ts +++ b/packages/time/src/utils/isValidDate.ts @@ -4,9 +4,6 @@ * @param date Date * @returns boolean */ -export function isValidDate(date: any): boolean { - if (Object.prototype.toString.call(date) !== '[object Date]') { - return false; - } - return date.getTime() === date.getTime(); -} \ No newline at end of file +export function isValidDate(date: unknown): date is Date { + return date instanceof Date && !isNaN(date.getTime()); +} From 5dca8d5e763a5e7cb2879ae836fec9cd16070a89 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 30 May 2024 17:52:05 +0200 Subject: [PATCH 003/163] refactor: update isValidDate return type for improved type safety --- packages/time/src/tests/isValidDate.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/time/src/tests/isValidDate.test.ts b/packages/time/src/tests/isValidDate.test.ts index 188c31cb..4d019705 100644 --- a/packages/time/src/tests/isValidDate.test.ts +++ b/packages/time/src/tests/isValidDate.test.ts @@ -25,8 +25,10 @@ describe('isValidDate', () => { expect(notADate).toBeInstanceOf(Date) notADate.getDate() } else { - // @ts-expect-error - notADate.getTime() + expect(() => { + // @ts-expect-error + notADate.getTime() + }).toThrowError() } }) }) From 4fb89ecae526f61139aabb0e277634661984b508 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 30 May 2024 18:05:30 +0200 Subject: [PATCH 004/163] test: refactor tests for the parse util --- packages/time/src/tests/parse.test.ts | 164 ++++++++++++++------------ 1 file changed, 88 insertions(+), 76 deletions(-) diff --git a/packages/time/src/tests/parse.test.ts b/packages/time/src/tests/parse.test.ts index 4ee05229..d8bd6cae 100644 --- a/packages/time/src/tests/parse.test.ts +++ b/packages/time/src/tests/parse.test.ts @@ -1,5 +1,5 @@ -import {describe, expect, test} from 'vitest'; -import {parse} from '../utils/parse'; +import { describe, expect, test } from 'vitest' +import { parse } from '../utils/parse' const dateTimeFormat = new Intl.DateTimeFormat('en-US', { year: 'numeric', @@ -9,124 +9,136 @@ const dateTimeFormat = new Intl.DateTimeFormat('en-US', { minute: '2-digit', second: '2-digit', timeZoneName: 'short', - timeZone: 'America/New_York' -}); + timeZone: 'America/New_York', +}) const timeOnlyFormat = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', //timeZoneName: 'short', - timeZone: 'America/New_York' -}); + timeZone: 'America/New_York', +}) describe('parse', () => { test('should parse a valid year only date string', () => { - const date = parse('2021'); - expect(dateTimeFormat.format(date)).toBe('01/01/2021, 12:00:00 AM EST'); - }); + const date = parse('2021') + expect(dateTimeFormat.format(date)).toBe('01/01/2021, 12:00:00 AM EST') + }) test('should parse a valid year and month only date string', () => { - const date = parse('2021-03'); - expect(dateTimeFormat.format(date)).toBe('03/01/2021, 12:00:00 AM EST'); - }); + const date = parse('2021-03') + expect(dateTimeFormat.format(date)).toBe('03/01/2021, 12:00:00 AM EST') + }) test('should parse a valid year, month and day only date string', () => { - const date = parse('2021-03-12'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 12:00:00 AM EST'); - }); + const date = parse('2021-03-12') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 12:00:00 AM EST') + }) test('should cast date only string to UTC', () => { - const date = parse('2021-03-12TZ'); - expect(dateTimeFormat.format(date)).toBe('03/11/2021, 07:00:00 PM EST'); - }); + const date = parse('2021-03-12TZ') + expect(dateTimeFormat.format(date)).toBe('03/11/2021, 07:00:00 PM EST') + }) test('should cast date only string to offset', () => { - const date = parse('2021-03-12T-07:00'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:00:00 AM EST'); - }); + const date = parse('2021-03-12T-07:00') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:00:00 AM EST') + }) test('should parse a valid year, month, day and hour only date/time string with separator', () => { - const date = parse('2021-03-12T14'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:00:00 PM EST'); - }); + const date = parse('2021-03-12T14') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:00:00 PM EST') + }) test('should parse a valid year, month, day and hour only date/time string without separator', () => { - const date = parse('2021-03-12 16'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 04:00:00 PM EST'); - }); + const date = parse('2021-03-12 16') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 04:00:00 PM EST') + }) test('should parse a valid year, month, day, hour and minute only date/time string', () => { - const date = parse('2021-03-12T14:42'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:42:00 PM EST'); - }); + const date = parse('2021-03-12T14:42') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:42:00 PM EST') + }) test('should parse a valid year, month, day, hour, minute and seconds only date/time string', () => { - const date = parse('2021-03-12T14:42:12'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:42:12 PM EST'); - }); + const date = parse('2021-03-12T14:42:12') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 02:42:12 PM EST') + }) test('should parse a valid UTC date/time string', () => { - const date = parse('2021-03-12T14:42:12Z'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 09:42:12 AM EST'); - }); + const date = parse('2021-03-12T14:42:12Z') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 09:42:12 AM EST') + }) test('should parse a valid UTC date/time string with lower case separator and zulu', () => { - const date = parse('2021-03-12t14:42:12z'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 09:42:12 AM EST'); - }); + const date = parse('2021-03-12t14:42:12z') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 09:42:12 AM EST') + }) test('should parse a valid date/time string with offset', () => { - const date = parse('2021-03-12T14:42:12+09:00'); - expect(dateTimeFormat.format(date)).toBe('03/12/2021, 12:42:12 AM EST'); - }); + const date = parse('2021-03-12T14:42:12+09:00') + expect(dateTimeFormat.format(date)).toBe('03/12/2021, 12:42:12 AM EST') + }) test('should parse a valid epoch date/time', () => { - const date = parse(1711639239717); - expect(dateTimeFormat.format(date)).toBe('03/28/2024, 11:20:39 AM EDT'); - }); + const date = parse(1711639239717) + expect(dateTimeFormat.format(date)).toBe('03/28/2024, 11:20:39 AM EDT') + }) test('should parse a valid hour and minute time string', () => { - const date = parse('14:00'); - expect(timeOnlyFormat.format(date)).toBe('02:00:00 PM'); - }); + const date = parse('14:00') + expect(timeOnlyFormat.format(date)).toBe('02:00:00 PM') + }) test('should parse a valid hour, minute and second time string', () => { - const date = parse('14:14:34'); - expect(timeOnlyFormat.format(date)).toBe('02:14:34 PM'); - }); + const date = parse('14:14:34') + expect(timeOnlyFormat.format(date)).toBe('02:14:34 PM') + }) test('should parse a valid hour, minute and second time string with meridiem', () => { - const date = parse('08:14:34 PM'); - expect(timeOnlyFormat.format(date)).toBe('08:14:34 PM'); - }); + const date = parse('08:14:34 PM') + expect(timeOnlyFormat.format(date)).toBe('08:14:34 PM') + }) test('should throw an error for an invalid date string', () => { - expect(() => parse('2021-15-37')).toThrowError('"2021-15-37" is an invalid RFC339 Internet Date Time string'); - }); + expect(() => parse('2021-15-37')).toThrowError( + '"2021-15-37" is an invalid RFC339 Internet Date Time string', + ) + }) test('should throw an error for an invalid time string', () => { - expect(() => parse('27:62')).toThrowError('"27:62" is an invalid RFC339 Internet Date Time string'); - }); + expect(() => parse('27:62')).toThrowError( + '"27:62" is an invalid RFC339 Internet Date Time string', + ) + }) test('should throw an error for an invalid time string', () => { - expect(() => parse('14:12 PM')).toThrowError('"14:12 PM" is an invalid time string'); - }); + expect(() => parse('14:12 PM')).toThrowError( + '"14:12 PM" is an invalid time string', + ) + }) test('should throw an error for an invalid epoch', () => { - expect(() => parse(9274309587123413)).toThrowError('"9274309587123412" is an invalid epoch date value'); - }); - - /* test('should parse a valid time string', () => { - const date = parse('00:00:00.000Z'); - expect(dateTimeFormat.format(date)).toBe('12/31/2020, 7:00:00 PM EST'); - }); - - test('should throw an error for an invalid date string', () => { - expect(() => parse('2021-01-01T00:00:00.000')).toThrowError('"2021-01-01T00:00:00.000" is an invalid RFC339 Internet Date Time string'); - }); - - test('should throw an error for an invalid time string', () => { - expect(() => parse('00:00:00.000')).toThrowError('"00:00:00.000" is an invalid time string'); - }); */ -}); \ No newline at end of file + expect(() => parse(9274309587123410)).toThrowError( + '"9274309587123410" is an invalid epoch date value', + ) + }) + + test.skip('should parse a valid time string', () => { + const date = parse('00:00:00.000Z') + expect(dateTimeFormat.format(date)).toBe('12/31/2020, 7:00:00 PM EST') + }) + + test.skip('should throw an error for an invalid date string', () => { + expect(() => parse('2021-01-01T00:00:00.000')).toThrowError( + '"2021-01-01T00:00:00.000" is an invalid RFC339 Internet Date Time string', + ) + }) + + test.skip('should throw an error for an invalid time string', () => { + expect(() => parse('00:00:00.000')).toThrowError( + '"00:00:00.000" is an invalid time string', + ) + }) +}) From b2bbb4ddabd5a2ab647709f6215326ea81c4fc04 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 30 May 2024 22:26:17 +0200 Subject: [PATCH 005/163] refactor: types for utils --- packages/time/test-setup.ts | 1 + packages/time/tsconfig.json | 2 +- packages/time/vite.config.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 packages/time/test-setup.ts diff --git a/packages/time/test-setup.ts b/packages/time/test-setup.ts new file mode 100644 index 00000000..a9d0dd31 --- /dev/null +++ b/packages/time/test-setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest' diff --git a/packages/time/tsconfig.json b/packages/time/tsconfig.json index f1368359..6d4f9053 100644 --- a/packages/time/tsconfig.json +++ b/packages/time/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "moduleResolution": "Bundler" }, - "include": ["src/**/*.ts", "src/**/*.tsx", ".eslintrc.cjs", "vite.config.ts"] + "include": ["src/**/*.ts", "src/**/*.tsx", ".eslintrc.cjs", "vite.config.ts", "test-setup.ts"], } diff --git a/packages/time/vite.config.ts b/packages/time/vite.config.ts index a80956da..4c3ad5f9 100644 --- a/packages/time/vite.config.ts +++ b/packages/time/vite.config.ts @@ -7,6 +7,7 @@ const config = defineConfig({ dir: './src', watch: false, environment: 'jsdom', + setupFiles: ['./vitest-setup.js'], coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, typecheck: { enabled: true }, }, From e9e4be9c36c35283dded374d5475822fd888d203 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 30 May 2024 22:29:49 +0200 Subject: [PATCH 006/163] revert: isValidDate util --- packages/time/src/tests/isValidDate.test.ts | 38 ++++++--------------- packages/time/src/utils/isValidDate.ts | 9 +++-- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/packages/time/src/tests/isValidDate.test.ts b/packages/time/src/tests/isValidDate.test.ts index 4d019705..01afdc69 100644 --- a/packages/time/src/tests/isValidDate.test.ts +++ b/packages/time/src/tests/isValidDate.test.ts @@ -1,34 +1,16 @@ -import { describe, expect, test } from 'vitest' -import { isValidDate } from '../utils/isValidDate' +import {describe, expect, test} from 'vitest'; +import {isValidDate} from '../utils/isValidDate'; describe('isValidDate', () => { test('should return true for a valid date', () => { - const date = new Date(); - expect(isValidDate(date)).toBe(true) + expect(isValidDate(new Date())).toBe(true); }) - test.each([ - '2021-10-10', - new Date('invalid'), - {}, - undefined, - null, - NaN, - 0, - ])('should return false for invalid date %p', (date) => { - expect(isValidDate(date)).toBe(false) - }) + test('should return false for an invalid date', () => { + expect(isValidDate(new Date("invalid"))).toBe(false); + }); - test('should assert type guards correctly', () => { - const notADate = 'not a date'; - if (isValidDate(notADate)) { - expect(notADate).toBeInstanceOf(Date) - notADate.getDate() - } else { - expect(() => { - // @ts-expect-error - notADate.getTime() - }).toThrowError() - } - }) -}) + test("should return false for null", () => { + expect(isValidDate(null)).toBe(false); + }); +}); diff --git a/packages/time/src/utils/isValidDate.ts b/packages/time/src/utils/isValidDate.ts index c0d15991..987df31a 100644 --- a/packages/time/src/utils/isValidDate.ts +++ b/packages/time/src/utils/isValidDate.ts @@ -4,6 +4,9 @@ * @param date Date * @returns boolean */ -export function isValidDate(date: unknown): date is Date { - return date instanceof Date && !isNaN(date.getTime()); -} +export function isValidDate(date: any): boolean { + if (Object.prototype.toString.call(date) !== '[object Date]') { + return false; + } + return date.getTime() === date.getTime(); +} \ No newline at end of file From ae48b692d2ea70b96fe7c3d668e487a555dfee4b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 30 May 2024 23:16:28 +0200 Subject: [PATCH 007/163] docs: architecture md file --- .editorconfig | 9 ++++++ ARCHITECTURE.md | 55 +++++++++++++++++++++++++++++++ CODE_OF_CONDUCT.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 .editorconfig create mode 100644 ARCHITECTURE.md create mode 100644 CODE_OF_CONDUCT.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..9d08a1a8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 00000000..5f3718cf --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,55 @@ +## Overview + +`@tanstack/time` is a headless utility library designed to facilitate the creation of time and calendar components across various JavaScript frameworks, including TypeScript/JavaScript, React, Solid, Vue, Svelte, and Angular. This document provides an overview of the architecture and design principles of the library. + + +## Design Principles + +### Headless utilities +The library provides core functionalities without imposing any UI constraints, allowing developers to build custom UI components tailored to their specific needs. + +### Framework agnostic +Core logic is implemented in a framework-agnostic manner, ensuring compatibility across multiple frameworks. + +### Modular and extensible +The library is designed to be modular, enabling developers to use only the parts they need and extend functionalities when required. + +### Type safety +Leveraging TypeScript to provide a strongly typed API, ensuring better developer experience and reducing runtime errors. + + +## Core Modules + +### Time utilities +The library provides a set of utilities for working with time, including parsing, formatting, and manipulating time values. + +### Calendar utilities +Calendar utilities enable developers to work with calendar-related functionalities, such as date range calculations, month view generation, and event scheduling. + + +## Project Structure + +The project is structured as follows: +```lua +├── packages # Contains individual packages for different frameworks +│ ├── time # Core logic shared across all packages +│ ├── src # Core logic implementation +│ ├── test # Unit tests +│ ├── {framework}-time # Adapters for specific frameworks (e.g., react-time, vue-time) +├── examples # Example applications demonstrating library usage +├── docs # Documentation files +├── scripts # Build and test scripts +``` + +The core logic is implemented in the `time` package, which contains the shared functionality across all framework-specific packages. Each framework-specific package (e.g., `react-time`, `vue-time`) contains the necessary adapters to integrate the core logic with the respective framework. + + +## API Design + +The API of @tanstack/time is designed to be intuitive and flexible. It provides a set of core functions that can be easily composed to build complex time and calendar functionalities. The API is consistent across different frameworks, ensuring a seamless developer experience when switching between frameworks. + + +## Extensibility + +The library is designed to be extensible, allowing developers to add custom functionalities or modify existing ones to suit their requirements. Developers can extend the core logic by creating custom utilities or by composing existing utilities in new ways. + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..fa111aa2 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,81 @@ +--- +title: Code of Conduct +id: code-of-conduct +--- + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at TANNERLINSLEY@GMAIL.COM. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq From d64d04a6a7bddb4feee5ed3af4736158aa3597a3 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 1 Jun 2024 21:24:36 +0200 Subject: [PATCH 008/163] feat: useCalendar hook --- packages/react-time/package.json | 1 + packages/react-time/src/useCalendar.ts | 350 +++++++++++++++++++++++++ pnpm-lock.yaml | 64 +++-- 3 files changed, 389 insertions(+), 26 deletions(-) create mode 100644 packages/react-time/src/useCalendar.ts diff --git a/packages/react-time/package.json b/packages/react-time/package.json index c3f9d136..a784c85b 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -62,6 +62,7 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "dependencies": { + "@js-temporal/polyfill": "^0.4.4", "@tanstack/time": "workspace:*", "use-sync-external-store": "^1.2.0" }, diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar.ts new file mode 100644 index 00000000..e77606dc --- /dev/null +++ b/packages/react-time/src/useCalendar.ts @@ -0,0 +1,350 @@ +import { useCallback, useMemo, useState } from 'react' +import { Temporal } from '@js-temporal/polyfill' +import type { CSSProperties, MouseEventHandler } from 'react' + +export interface Event { + id: string + startDate: Temporal.PlainDateTime + endDate: Temporal.PlainDateTime + title: string +} + +const getFirstDayOfMonth = (currMonth: string) => + Temporal.PlainDate.from(`${currMonth}-01`) + +const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { + const date = Temporal.PlainDate.from(currWeek) + return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) +} + +const getChunks = function* (arr: T[], n: number) { + for (let i = 0; i < arr.length; i += n) { + yield arr.slice(i, i + n) + } +} + +const splitMultiDayEvents = (event: Event) => { + const startDate = Temporal.PlainDateTime.from(event.startDate) + const endDate = Temporal.PlainDateTime.from(event.endDate) + const events: Event[] = [] + + let currentDay = startDate + while ( + Temporal.PlainDate.compare( + currentDay.toPlainDate(), + endDate.toPlainDate(), + ) < 0 + ) { + const startOfCurrentDay = currentDay.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }) + const endOfCurrentDay = currentDay.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }) + + const eventStart = + Temporal.PlainDateTime.compare(currentDay, startDate) === 0 + ? startDate + : startOfCurrentDay + const eventEnd = + Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 + ? endDate + : endOfCurrentDay + + events.push({ + ...event, + startDate: eventStart, + endDate: eventEnd, + }) + + currentDay = startOfCurrentDay.add({ days: 1 }) + } + + return events +} + +interface UseCalendarProps { + weekStartsOn?: number + events: Event[] + viewMode: 'month' | 'week' | number + locale?: string + onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void +} + +const generateDateRange = ( + start: Temporal.PlainDate, + end: Temporal.PlainDate, +) => { + const dates: Temporal.PlainDate[] = [] + let current = start + while (Temporal.PlainDate.compare(current, end) <= 0) { + dates.push(current) + current = current.add({ days: 1 }) + } + return dates +} + +export const useCalendar = ({ + weekStartsOn = 1, + events, + viewMode: initialViewMode, + locale, + onChangeViewMode, +}: UseCalendarProps) => { + const today = Temporal.Now.plainDateISO() + + const [currPeriod, setCurrPeriod] = useState(today) + const [viewMode, setViewMode] = useState(initialViewMode) + + const firstDayOfMonth = getFirstDayOfMonth( + currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ) + const firstDayOfWeek = getFirstDayOfWeek(currPeriod.toString(), weekStartsOn) + + const days = + viewMode === 'month' + ? Array.from( + getChunks( + generateDateRange( + firstDayOfMonth, + firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }), + ), + 7, + ), + ) + : viewMode === 'week' + ? Array.from( + getChunks( + generateDateRange( + firstDayOfWeek, + firstDayOfWeek.add({ days: 6 }), + ), + 7, + ), + ) + : Array.from( + getChunks( + generateDateRange( + currPeriod, + currPeriod.add({ days: viewMode - 1 }), + ), + viewMode, + ), + ) + + const eventMap = useMemo(() => { + const map = new Map() + + events.forEach((event) => { + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + if ( + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 + ) { + const splitEvents = splitMultiDayEvents(event) + splitEvents.forEach((splitEvent) => { + const splitKey = splitEvent.startDate.toString().split('T')[0] + if (splitKey && !map.has(splitKey)) { + map.set(splitKey, []) + map.get(splitKey)?.push(splitEvent) + } + }) + } else { + const eventKey = event.startDate.toString().split('T')[0] + if (eventKey && !map.has(eventKey)) { + map.set(eventKey, []) + map.get(eventKey)?.push(event) + } + } + }) + + return map + }, [events]) + + const daysWithEvents = days.map((dayChunk) => { + return dayChunk.map((day) => { + const dayKey = day.toString() + const dailyEvents = eventMap.get(dayKey) ?? [] + + return { + date: day, + events: dailyEvents, + } + }) + }) + + const getPrev = useCallback>(() => { + switch (viewMode) { + case 'month': { + const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: 1 }) + setCurrPeriod(firstDayOfPrevMonth) + break + } + case 'week': { + const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: 1 }) + setCurrPeriod(firstDayOfPrevWeek) + break + } + default: { + const prevCustomStart = currPeriod.subtract({ days: viewMode }) + setCurrPeriod(prevCustomStart) + break + } + } + }, [viewMode, firstDayOfMonth, firstDayOfWeek, currPeriod]) + + const getNext = useCallback>(() => { + switch (viewMode) { + case 'month': { + const firstDayOfNextMonth = firstDayOfMonth.add({ months: 1 }) + setCurrPeriod(firstDayOfNextMonth) + break + } + case 'week': { + const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: 1 }) + setCurrPeriod(firstDayOfNextWeek) + break + } + default: { + const nextCustomStart = currPeriod.add({ days: viewMode }) + setCurrPeriod(nextCustomStart) + break + } + } + }, [viewMode, firstDayOfMonth, firstDayOfWeek, currPeriod]) + + const getCurrent = useCallback>(() => { + setCurrPeriod(today) + }, [today]) + + const get = useCallback((date: Temporal.PlainDate) => { + setCurrPeriod(date) + }, []) + + const chunks = + viewMode === 'month' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents] + const changeViewMode = useCallback( + (newViewMode: 'month' | 'week' | number) => { + onChangeViewMode?.(newViewMode) + setViewMode(newViewMode) + }, + [onChangeViewMode], + ) + + const getEventProps = useCallback( + (id: Event['id']): { style: CSSProperties } | null => { + const event = [...eventMap.values()] + .flat() + .find((event) => event.id === id) + if (!event) return null + + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + + const isSplitEvent = + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 + + let percentageOfDay + let eventHeightInMinutes + + if (isSplitEvent) { + const isStartPart = + eventStartDate.hour !== 0 || eventStartDate.minute !== 0 + if (isStartPart) { + const eventTimeInMinutes = + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes + } else { + percentageOfDay = 0 + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + } + } else { + const eventTimeInMinutes = + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes + } + + const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) + + const overlappingEvents = [...eventMap.values()].flat().filter((e) => { + const eStartDate = Temporal.PlainDateTime.from(e.startDate) + const eEndDate = Temporal.PlainDateTime.from(e.endDate) + return ( + (e.id !== id && + Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) + ) + }) + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id) + const totalOverlaps = overlappingEvents.length + const sidePadding = 2 + const innerPadding = 2 + const totalInnerPadding = (totalOverlaps - 1) * innerPadding + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding + const eventWidth = + totalOverlaps > 0 + ? availableWidth / totalOverlaps + : 100 - 2 * sidePadding + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) + + if (viewMode === 'week' || typeof viewMode === 'number') { + return { + style: { + position: 'absolute', + top: `min(${percentageOfDay}%, calc(100% - 55px))`, + left: `${eventLeft}%`, + width: `${eventWidth}%`, + margin: 0, + height: `${eventHeight}%`, + }, + } + } + + return null + }, + [eventMap, viewMode], + ) + + return { + firstDayOfPeriod: + viewMode === 'month' + ? firstDayOfMonth + : viewMode === 'week' + ? firstDayOfWeek + : currPeriod, + currPeriod: currPeriod.toString({ calendarName: 'auto' }), + getPrev, + getNext, + getCurrent, + get, + chunks, + daysNames: days + .flat() + .map((day) => day.toLocaleString(locale, { weekday: 'short' })), + viewMode, + changeViewMode, + getEventProps, + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37c8fc72..e0326575 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,6 +150,9 @@ importers: packages/react-time: dependencies: + '@js-temporal/polyfill': + specifier: ^0.4.4 + version: 0.4.4 '@tanstack/time': specifier: workspace:* version: link:../time @@ -541,7 +544,7 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.23.6 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) '@babel/helpers': 7.24.1 @@ -2619,6 +2622,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@js-temporal/polyfill@0.4.4: + resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} + engines: {node: '>=12'} + dependencies: + jsbi: 4.3.0 + tslib: 2.6.2 + dev: false + /@leichtgewicht/ip-codec@2.0.5: resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} dev: true @@ -5113,7 +5124,7 @@ packages: dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.35 + postcss: 8.4.38 postcss-media-query-parser: 0.2.3 dev: true @@ -5151,12 +5162,12 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) + postcss-modules-scope: 3.1.1(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.0 webpack: 5.90.3(esbuild@0.20.2) @@ -7006,13 +7017,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.38): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /identity-function@1.0.0: @@ -7495,7 +7506,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -7641,6 +7652,10 @@ packages: argparse: 2.0.1 dev: true + /jsbi@4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + dev: false + /jsdom@24.0.0: resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} engines: {node: '>=18'} @@ -7891,8 +7906,6 @@ packages: peerDependenciesMeta: webpack: optional: true - webpack-sources: - optional: true dependencies: webpack: 5.90.3(esbuild@0.20.2) webpack-sources: 3.2.3 @@ -9113,45 +9126,45 @@ packages: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.35): + /postcss-modules-scope@3.1.1(postcss@8.4.38): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 dev: true /postcss-selector-parser@6.0.16: @@ -9458,7 +9471,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: true /regex-parser@2.3.0: @@ -9545,7 +9558,7 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.35 + postcss: 8.4.38 source-map: 0.6.1 dev: true @@ -10741,7 +10754,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} From 28b43046ca47236c01941c0d139d3e51d37afdf9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 2 Jun 2024 23:28:45 +0200 Subject: [PATCH 009/163] test: useCalendar tests --- packages/react-time/src/index.ts | 4 +- .../react-time/src/tests/useCalendar.test.ts | 99 +++++++++++++++++++ packages/react-time/src/useCalendar.ts | 2 +- packages/react-time/vite.config.ts | 4 +- 4 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 packages/react-time/src/tests/useCalendar.test.ts diff --git a/packages/react-time/src/index.ts b/packages/react-time/src/index.ts index dabac739..0b95ae99 100644 --- a/packages/react-time/src/index.ts +++ b/packages/react-time/src/index.ts @@ -1,3 +1 @@ -/** - * TanStack Time - */ \ No newline at end of file +export { useCalendar } from './useCalendar'; diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts new file mode 100644 index 00000000..d1548c47 --- /dev/null +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -0,0 +1,99 @@ +import { Temporal } from '@js-temporal/polyfill'; +import { describe, expect, test } from 'vitest'; +import { act, renderHook } from '@testing-library/react'; +import { useCalendar } from '../useCalendar'; + +describe('useCalendar', () => { + const events = [ + { + id: '1', + startDate: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), + endDate: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), + title: 'Event 1', + }, + { + id: '2', + startDate: Temporal.PlainDateTime.from('2024-06-02T14:00:00'), + endDate: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), + title: 'Event 2', + }, + ]; + + const mockEvent = {} as React.MouseEvent; + + test('should initialize with the correct view mode and current period', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + expect(result.current.viewMode).toBe('month'); + expect(result.current.currPeriod).toBe(Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }).substring(0, 7)); + }); + + test('should navigate to the previous period correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + + act(() => { + result.current.getPrev(mockEvent); + }); + + const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ months: 1 }); + expect(result.current.currPeriod).toBe(expectedPreviousMonth.toString({ calendarName: 'auto' }).substring(0, 7)); + }); + + test('should navigate to the next period correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + + act(() => { + result.current.getNext(mockEvent); + }); + + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }); + expect(result.current.currPeriod).toBe(expectedNextMonth.toString({ calendarName: 'auto' }).substring(0, 7)); + }); + + test('should reset to the current period correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + + act(() => { + result.current.getNext(mockEvent); + result.current.getCurrent(mockEvent); + }); + + expect(result.current.currPeriod).toBe(Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }).substring(0, 7)); + }); + + test('should change view mode correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + + act(() => { + result.current.changeViewMode('week'); + }); + + expect(result.current.viewMode).toBe('week'); + }); + + test('should select a day correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + + act(() => { + result.current.get(Temporal.PlainDate.from('2024-06-01')); + }); + + expect(result.current.currPeriod).toBe('2024-06-01'); + }); + + test('should return the correct props for an event', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'week' })); + + const eventProps = result.current.getEventProps('1'); + + expect(eventProps).toEqual({ + style: { + position: 'absolute', + top: '41.66666666666667%', + left: '2%', + width: '96%', + margin: 0, + height: '5.555555555555555%', + }, + }); + }); +}); diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar.ts index e77606dc..edfdf183 100644 --- a/packages/react-time/src/useCalendar.ts +++ b/packages/react-time/src/useCalendar.ts @@ -244,7 +244,7 @@ export const useCalendar = ({ (id: Event['id']): { style: CSSProperties } | null => { const event = [...eventMap.values()] .flat() - .find((event) => event.id === id) + .find((currEvent) => currEvent.id === id) if (!event) return null const eventStartDate = Temporal.PlainDateTime.from(event.startDate) diff --git a/packages/react-time/vite.config.ts b/packages/react-time/vite.config.ts index 68b84116..36d06563 100644 --- a/packages/react-time/vite.config.ts +++ b/packages/react-time/vite.config.ts @@ -1,11 +1,9 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackBuildConfig } from '@tanstack/config/build' -import react from '@vitejs/plugin-react' const config = defineConfig({ - plugins: [react()], test: { - name: 'react-time', + name: 'time', dir: './src', watch: false, environment: 'jsdom', From 28f491c7375436be29e4e80cb325d1850cec06d0 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 2 Jun 2024 23:29:44 +0200 Subject: [PATCH 010/163] docs: useCalendar hook --- docs/framework/react/reference/uesCalendar.md | 65 +++++++++++++++++++ docs/framework/react/reference/useStore.md | 28 -------- 2 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 docs/framework/react/reference/uesCalendar.md delete mode 100644 docs/framework/react/reference/useStore.md diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md new file mode 100644 index 00000000..d798fc5e --- /dev/null +++ b/docs/framework/react/reference/uesCalendar.md @@ -0,0 +1,65 @@ +--- +title: Use Calendar +id: useCalendar +--- + +### `useCalendar` + +```tsx +export function useCalendar({ + weekStartsOn, + events, + viewMode, + locale, + onChangeViewMode, +}: UseCalendarProps) +``` + +`useCalendar` is a hook that provides a comprehensive set of functionalities for managing calendar events, view modes, and period navigation. + + +#### Parameters + +- `weekStartsOn?: number` + - This parameter is an optional number that specifies the day of the week that the calendar should start on. It defaults to 0, which is Sunday. +- `events: Event[]` + - This parameter is an array of events that the calendar should display. +- `viewMode: 'month' | 'week' | number` + - This parameter is a string that specifies the initial view mode of the calendar. It can be either 'month', 'week', or a number representing the number of days in a custom view mode. +- `locale?: string` + - This parameter is an optional string that specifies the locale to use for formatting dates and times. It defaults to the system locale. +- `onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void` + - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. +- `onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void` + - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. + + +#### Returns + +- `firstDayOfPeriod: Temporal.PlainDate` + - This value represents the first day of the current period displayed by the calendar. +- `currPeriod: string` + - This value represents a string that describes the current period displayed by the calendar. +- `getPrev: MouseEventHandler` + - This function is a click event handler that navigates to the previous period. +- `getNext: MouseEventHandler` + - This function is a click event handler that navigates to the next period. +- `getCurrent: MouseEventHandler` + - This function is a click event handler that navigates to the current period. +- `get: (date: Temporal.PlainDate) => void` + - This function is a callback function that is called when a date is selected in the calendar. It receives the selected date as an argument. +- `chunks: Array>` + - This value represents the calendar grid, where each cell contains the date and events for that day. +- `daysNames: string[]` + - This value represents an array of strings that contain the names of the days of the week. +- `viewMode: 'month' | 'week' | number` + - This value represents the current view mode of the calendar. +- `changeViewMode: (newViewMode: 'month' | 'week' | number) => void` + - This function is used to change the view mode of the calendar. +- `getEventProps: (id: string) => { style: CSSProperties } | null` + - This function is used to retrieve the style properties for a specific event based on its ID. +- `getEventProps: (id: string) => { style: CSSProperties } | null` + - This function is used to retrieve the style properties for a specific event based on its ID. +- `getEventProps: (id: string) => { style: CSSProperties } | null` + - This function is used to retrieve the style properties for a specific event based on its ID. + diff --git a/docs/framework/react/reference/useStore.md b/docs/framework/react/reference/useStore.md deleted file mode 100644 index 0a709c58..00000000 --- a/docs/framework/react/reference/useStore.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Use Store -id: useStore ---- -### `useStore` - -```tsx -export function useStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, - selector: (state: NoInfer) => TSelected = (d) => d as any, -) -``` - -useStore is a custom hook that returns the updated store given the intial store and the selector. React can use this to keep your component subscribed to the store and re-render it on changes. - - - -#### Parameters -- `store: Store` - - This parameter represents the external store itself which holds the entire state of your application. It expects an instance of a `@tanstack/store` that manages state and supports updates through a callback. -- `selector: (state: NoInfer) => TSelected = (d) => d as any` - - This parameter is a callback function that takes the state of the store and expects you to return a sub-state of the store. This selected sub-state is subsequently utilized as the state displayed by the useStore hook. It triggers a re-render of the component only when there are changes in this data, ensuring that updates to the displayed state trigger the necessary re-renders - - From 468dc262149029341d79295598023323e350f095 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 2 Jun 2024 23:32:43 +0200 Subject: [PATCH 011/163] docs: useCalendar hook --- docs/framework/react/reference/uesCalendar.md | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md index d798fc5e..91a0650d 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/uesCalendar.md @@ -63,3 +63,79 @@ export function useCalendar({ - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. + +#### Example Usage + +```tsx +const CalendarComponent = ({ events }) => { + const { + firstDayOfPeriod, + currPeriod, + getPrev, + getNext, + getCurrent, + get, + changeViewMode, + chunks, + daysNames, + viewMode, + getEventProps, + } = useCalendar({ + events, + viewMode: 'month', + locale: 'en-US', + onChangeViewMode: (newViewMode) => console.log('View mode changed:', newViewMode), + }); + + return ( +
+
+ + + +
+
+ + + + +
+
+ {viewMode === 'month' && ( +
+ {daysNames.map((dayName, index) => ( +
+ {dayName} +
+ ))} +
+ )} +
+ {chunks.map((week, weekIndex) => ( +
+ {week.map((day) => ( +
+
+ {day.date.day} +
+
+ {day.events.map((event) => ( +
+ {event.title} +
+ ))} +
+
+ ))} +
+ ))} +
+
+
+ ); +}; +``` \ No newline at end of file From 0b9bdeb6ee4818791da704c8ff6c0c914d03cde9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 2 Jun 2024 23:39:32 +0200 Subject: [PATCH 012/163] test: useCalendar tests --- .../react-time/src/tests/useCalendar.test.ts | 115 +++++++++++------- 1 file changed, 70 insertions(+), 45 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index d1548c47..c808afde 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -1,7 +1,7 @@ -import { Temporal } from '@js-temporal/polyfill'; -import { describe, expect, test } from 'vitest'; -import { act, renderHook } from '@testing-library/react'; -import { useCalendar } from '../useCalendar'; +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { act, renderHook } from '@testing-library/react' +import { useCalendar } from '../useCalendar' describe('useCalendar', () => { const events = [ @@ -17,83 +17,108 @@ describe('useCalendar', () => { endDate: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), title: 'Event 2', }, - ]; + ] - const mockEvent = {} as React.MouseEvent; + const mockEvent = {} as React.MouseEvent test('should initialize with the correct view mode and current period', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); - expect(result.current.viewMode).toBe('month'); - expect(result.current.currPeriod).toBe(Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }).substring(0, 7)); - }); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) + expect(result.current.viewMode).toBe('month') + expect(result.current.currPeriod).toBe( + Temporal.Now.plainDateISO() + .toString({ calendarName: 'auto' }) + ) + }) test('should navigate to the previous period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) act(() => { - result.current.getPrev(mockEvent); - }); + result.current.getPrev(mockEvent) + }) - const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ months: 1 }); - expect(result.current.currPeriod).toBe(expectedPreviousMonth.toString({ calendarName: 'auto' }).substring(0, 7)); - }); + const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ + months: 1, + }) + expect(result.current.currPeriod).toBe( + expectedPreviousMonth.toString({ calendarName: 'auto' }), + ) + }) test('should navigate to the next period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) act(() => { - result.current.getNext(mockEvent); - }); + result.current.getNext(mockEvent) + }) - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }); - expect(result.current.currPeriod).toBe(expectedNextMonth.toString({ calendarName: 'auto' }).substring(0, 7)); - }); + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) + expect(result.current.currPeriod).toBe( + expectedNextMonth.toString({ calendarName: 'auto' }), + ) + }) test('should reset to the current period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) act(() => { - result.current.getNext(mockEvent); - result.current.getCurrent(mockEvent); - }); + result.current.getNext(mockEvent) + result.current.getCurrent(mockEvent) + }) - expect(result.current.currPeriod).toBe(Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }).substring(0, 7)); - }); + expect(result.current.currPeriod).toBe( + Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }) + ) + }) test('should change view mode correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) act(() => { - result.current.changeViewMode('week'); - }); + result.current.changeViewMode('week') + }) - expect(result.current.viewMode).toBe('week'); - }); + expect(result.current.viewMode).toBe('week') + }) test('should select a day correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month' }), + ) act(() => { - result.current.get(Temporal.PlainDate.from('2024-06-01')); - }); + result.current.get(Temporal.PlainDate.from('2024-06-01')) + }) - expect(result.current.currPeriod).toBe('2024-06-01'); - }); + expect(result.current.currPeriod).toBe('2024-06-01') + }) test('should return the correct props for an event', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'week' })); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'week' }), + ) - const eventProps = result.current.getEventProps('1'); + const eventProps = result.current.getEventProps('1') expect(eventProps).toEqual({ style: { position: 'absolute', - top: '41.66666666666667%', + top: 'min(41.66666666666667%, calc(100% - 55px))', left: '2%', width: '96%', margin: 0, - height: '5.555555555555555%', + height: '8.333333333333332%', }, - }); - }); -}); + }) + }) +}) From 5b6533e812b615d8ff4bdfa510149dcb73c3e6a7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 2 Jun 2024 23:44:06 +0200 Subject: [PATCH 013/163] test: useCalendar tests --- .../react-time/src/tests/useCalendar.test.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index c808afde..e5701722 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -41,12 +41,14 @@ describe('useCalendar', () => { result.current.getPrev(mockEvent) }) - const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ - months: 1, - }) - expect(result.current.currPeriod).toBe( - expectedPreviousMonth.toString({ calendarName: 'auto' }), - ) + const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ months: 1 }); + const expectedFirstDayOfPreviousMonth = Temporal.PlainDate.from({ + year: expectedPreviousMonth.year, + month: expectedPreviousMonth.month, + day: 1, + }); + + expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfPreviousMonth); }) test('should navigate to the next period correctly', () => { @@ -58,10 +60,14 @@ describe('useCalendar', () => { result.current.getNext(mockEvent) }) - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) - expect(result.current.currPeriod).toBe( - expectedNextMonth.toString({ calendarName: 'auto' }), - ) + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }); + const expectedFirstDayOfNextMonth = Temporal.PlainDate.from({ + year: expectedNextMonth.year, + month: expectedNextMonth.month, + day: 1, + }); + + expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfNextMonth); }) test('should reset to the current period correctly', () => { From 37effd4e7746d8595f6fa6b9e7f71fc85f800ae1 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 00:12:17 +0200 Subject: [PATCH 014/163] test: overlaping events --- .../react-time/src/tests/useCalendar.test.ts | 66 ++++++++++++++++--- packages/react-time/src/useCalendar.ts | 12 ++-- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index e5701722..153db8e8 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -27,8 +27,7 @@ describe('useCalendar', () => { ) expect(result.current.viewMode).toBe('month') expect(result.current.currPeriod).toBe( - Temporal.Now.plainDateISO() - .toString({ calendarName: 'auto' }) + Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }), ) }) @@ -41,14 +40,18 @@ describe('useCalendar', () => { result.current.getPrev(mockEvent) }) - const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ months: 1 }); + const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ + months: 1, + }) const expectedFirstDayOfPreviousMonth = Temporal.PlainDate.from({ year: expectedPreviousMonth.year, month: expectedPreviousMonth.month, day: 1, - }); + }) - expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfPreviousMonth); + expect(result.current.firstDayOfPeriod).toEqual( + expectedFirstDayOfPreviousMonth, + ) }) test('should navigate to the next period correctly', () => { @@ -60,14 +63,14 @@ describe('useCalendar', () => { result.current.getNext(mockEvent) }) - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }); + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) const expectedFirstDayOfNextMonth = Temporal.PlainDate.from({ year: expectedNextMonth.year, month: expectedNextMonth.month, day: 1, - }); + }) - expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfNextMonth); + expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfNextMonth) }) test('should reset to the current period correctly', () => { @@ -81,7 +84,7 @@ describe('useCalendar', () => { }) expect(result.current.currPeriod).toBe( - Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }) + Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }), ) }) @@ -127,4 +130,49 @@ describe('useCalendar', () => { }, }) }) + + test('should return the correct props for overlapping events', () => { + const overlappingEvents = [ + { + id: '1', + startDate: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), + endDate: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), + title: 'Event 1', + }, + { + id: '2', + startDate: Temporal.PlainDateTime.from('2024-06-01T11:00:00'), + endDate: Temporal.PlainDateTime.from('2024-06-01T13:00:00'), + title: 'Event 2', + }, + ] + const { result } = renderHook(() => + useCalendar({ events: overlappingEvents, viewMode: 'week' }), + ) + + const event1Props = result.current.getEventProps('1') + const event2Props = result.current.getEventProps('2') + + expect(event1Props).toEqual({ + style: { + position: 'absolute', + top: 'min(41.66666666666667%, calc(100% - 55px))', + left: '2%', + width: '47%', + margin: 0, + height: '8.333333333333332%', + }, + }) + + expect(event2Props).toEqual({ + style: { + position: 'absolute', + top: 'min(45.83333333333333%, calc(100% - 55px))', + left: '51%', + width: '47%', + margin: 0, + height: '8.333333333333332%', + }, + }) + }) }) diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar.ts index edfdf183..22fbf4c7 100644 --- a/packages/react-time/src/useCalendar.ts +++ b/packages/react-time/src/useCalendar.ts @@ -153,16 +153,16 @@ export const useCalendar = ({ const splitEvents = splitMultiDayEvents(event) splitEvents.forEach((splitEvent) => { const splitKey = splitEvent.startDate.toString().split('T')[0] - if (splitKey && !map.has(splitKey)) { - map.set(splitKey, []) - map.get(splitKey)?.push(splitEvent) + if (splitKey) { + if (!map.has(splitKey)) map.set(splitKey, []) + map.get(splitKey)?.push(splitEvent) } }) } else { const eventKey = event.startDate.toString().split('T')[0] - if (eventKey && !map.has(eventKey)) { - map.set(eventKey, []) - map.get(eventKey)?.push(event) + if (eventKey) { + if (!map.has(eventKey)) map.set(eventKey, []) + map.get(eventKey)?.push(event) } } }) From c0e5713351728fea93ed5d73b48e7894c20a5a64 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 00:21:46 +0200 Subject: [PATCH 015/163] docs: add the choosing-a-date-time-handling-solution adr --- adr/choosing-a-date-time-handling-solution.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 adr/choosing-a-date-time-handling-solution.md diff --git a/adr/choosing-a-date-time-handling-solution.md b/adr/choosing-a-date-time-handling-solution.md new file mode 100644 index 00000000..03aae494 --- /dev/null +++ b/adr/choosing-a-date-time-handling-solution.md @@ -0,0 +1,91 @@ +# ADR: Choosing a Date and Time Handling Solution + +## Status + +Accepted, decided on Temporal API. + +## Context + +In modern web applications, accurate and efficient handling of dates and times is crucial. Traditional JavaScript `Date`` objects have several limitations and pitfalls, including: +- Lack of support for different calendars +- Difficulties with time zone conversions +- Ambiguous and error-prone APIs for date and time manipulation + +These issues often lead to bugs and inefficiencies in handling date and time data, especially in complex applications that require extensive date and time manipulations, such as calendar applications. + +## Decision + +After evaluating several options, we have decided to adopt the Temporal API for all date and time handling in our application. Temporal is a new standard for working with dates and times in JavaScript, designed to provide a more reliable, readable, and easy-to-use API. + +### Evaluation of Alternatives + +1. **JavaScript `Date`** + - **Pros**: + - Built-in and requires no additional dependencies. + - Supported natively in all JavaScript environments. + - **Cons**: + - Ambiguous and error-prone API. + - Poor support for time zones and different calendars. + - Mutable objects, leading to potential bugs. + - Date arithmetic is complex and error-prone. + +2. **moment.js** + - **Pros**: + - Widely used and battle-tested. + - Rich feature set for date manipulation and formatting. + - **Cons**: + - Large library size, affecting bundle size. + - Mutable objects, leading to potential bugs. + - Moment.js is in maintenance mode, with no new features planned. + +3. **date-fns** + - **Pros**: + - Modular approach, allowing selective imports to reduce bundle size. + - Immutable and functional API. + - Good support for date arithmetic and formatting. + - **Cons**: + - Limited support for time zones without additional libraries. + - Requires combining multiple functions for complex operations. + +### Reasons for Choosing Temporal + +1. **Clarity and Readability**: Temporal's API is designed to be intuitive and readable. For example, creating a date in Temporal is straightforward and unambiguous: + ```javascript + const date = Temporal.PlainDate.from('2024-06-01'); + ``` + This is much clearer than the equivalent using `Date`: + ```javascript + const date = new Date('2024-06-01'); + ``` + +2. **Immutability**: Temporal objects are immutable, meaning that once created, they cannot be changed. This immutability prevents common bugs related to date manipulation and makes the code easier to reason about. + +3. **Comprehensive Support for Calendars and Time Zones**: Temporal natively supports different calendars and time zones, making it ideal for applications that need to handle internationalization and localization. + +4. **Precise Arithmetic Operations**: Temporal provides precise and easy-to-use methods for date and time arithmetic, avoiding the pitfalls of JavaScript `Date` arithmetic: + ```javascript + const nextMonth = date.add({ months: 1 }); + ``` + +5. **Better Error Handling**: Temporal's API is designed to throw errors for invalid operations, which helps in catching bugs early in the development process. + +6. **Standardization**: Temporal is an upcoming standard for date and time handling in JavaScript, which means it will have long-term support and improvements from the community and browser vendors. + +## Consequences + +### Positive + +- **Reduced Bugs**: By using Temporal, we expect to see a reduction in date and time-related bugs, especially those related to time zone conversions and date arithmetic. +- **Improved Code Quality**: The clarity and immutability of Temporal will lead to more readable and maintainable code. +- **Enhanced Features**: Support for multiple calendars and time zones will allow us to build more robust and feature-rich internationalized applications. + +### Negative + +- **Learning Curve**: Developers will need to learn the new Temporal API, which might slow down initial development. +- **Polyfill Requirement**: Until Temporal is fully supported in all target environments, we will need to include a polyfill, which may slightly increase the bundle size. + +## Conclusion + +After evaluating various options for date and time handling in JavaScript, we have decided to adopt the Temporal API. Temporal provides a robust, readable, and reliable API that addresses the shortcomings of the existing `Date` object and offers comprehensive support for internationalization and time zone handling. Despite the initial learning curve and the need for a polyfill, the long-term benefits make Temporal the best choice for our application's needs. + +By documenting this decision, we ensure that future developers understand the rationale behind adopting Temporal and can build upon this foundation with confidence. From 096f95d82d64c964dddaf59fee79b8c694fc0433 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 16:36:36 +0200 Subject: [PATCH 016/163] feat(react-time/useCalendar): getCurrentTimeMarkerProps --- docs/framework/react/reference/uesCalendar.md | 2 ++ .../react-time/src/tests/useCalendar.test.ts | 23 +++++++++++++++- packages/react-time/src/useCalendar.ts | 27 ++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md index 91a0650d..4fbf0aa3 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/uesCalendar.md @@ -62,6 +62,8 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. +- `getCurrentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` + - This function is used to retrieve the style properties and current time for the current time marker. #### Example Usage diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index 153db8e8..2c29fe5c 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -1,5 +1,5 @@ import { Temporal } from '@js-temporal/polyfill' -import { describe, expect, test } from 'vitest' +import { describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' @@ -175,4 +175,25 @@ describe('useCalendar', () => { }, }) }) + + test('should return the correct props for the current time marker', () => { + vi.setSystemTime(new Date('2024-06-01T11:00:00')); + + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'week' }), + ) + + const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps() + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.83333333333333%', + left: '0%', + }, + currentTime: '11:00', + }) + + vi.useRealTimers(); + }) }) diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar.ts index 22fbf4c7..1bc7b878 100644 --- a/packages/react-time/src/useCalendar.ts +++ b/packages/react-time/src/useCalendar.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { Temporal } from '@js-temporal/polyfill' import type { CSSProperties, MouseEventHandler } from 'react' @@ -101,6 +101,7 @@ export const useCalendar = ({ const [currPeriod, setCurrPeriod] = useState(today) const [viewMode, setViewMode] = useState(initialViewMode) + const [currentTime, setCurrentTime] = useState(Temporal.Now.plainDateTimeISO()); const firstDayOfMonth = getFirstDayOfMonth( currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), @@ -327,6 +328,29 @@ export const useCalendar = ({ [eventMap, viewMode], ) + useEffect(() => { + const intervalId = setInterval(() => { + setCurrentTime(Temporal.Now.plainDateTimeISO()); + }, 60000); + + return () => clearInterval(intervalId); + }, []); + + const getCurrentTimeMarkerProps = useCallback(() => { + const { hour, minute } = currentTime; + const currentTimeInMinutes = hour * 60 + minute; + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + + return { + style: { + position: 'absolute', + top: `${percentageOfDay}%`, + left: 0, + }, + currentTime: currentTime.toString().split('T')[1]?.substring(0, 5), + } + }, [currentTime]); + return { firstDayOfPeriod: viewMode === 'month' @@ -346,5 +370,6 @@ export const useCalendar = ({ viewMode, changeViewMode, getEventProps, + getCurrentTimeMarkerProps, } } From 26b0e1e675d44bf914867419a3c9e9e8f992f381 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 16:43:17 +0200 Subject: [PATCH 017/163] feat(react-time/useCalendar): getCurrentTimeMarkerProps --- docs/framework/react/reference/uesCalendar.md | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md index 4fbf0aa3..60563c19 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/uesCalendar.md @@ -82,6 +82,7 @@ const CalendarComponent = ({ events }) => { daysNames, viewMode, getEventProps, + getCurrentTimeMarkerProps, } = useCalendar({ events, viewMode: 'month', @@ -102,21 +103,23 @@ const CalendarComponent = ({ events }) => { -
+ {viewMode === 'month' && ( -
- {daysNames.map((dayName, index) => ( -
- {dayName} -
- ))} -
+ + + {daysNames.map((dayName, index) => ( + + ))} + + )} -
+
{chunks.map((week, weekIndex) => ( -
+
{week.map((day) => ( -
+
))} - +
+ ))} - - + +
+ {dayName} +
{day.date.day}
@@ -131,12 +134,13 @@ const CalendarComponent = ({ events }) => { ))} - +
); }; From 3cf89c309fadcaef581fdb93e9eb6ad7f955a1dd Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 16:47:09 +0200 Subject: [PATCH 018/163] feat(react-time/useCalendar): getCurrentTimeMarkerProps --- docs/framework/react/reference/uesCalendar.md | 2 +- packages/react-time/src/useCalendar.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md index 60563c19..3ac395a4 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/uesCalendar.md @@ -144,4 +144,4 @@ const CalendarComponent = ({ events }) => { ); }; -``` \ No newline at end of file +``` diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar.ts index 1bc7b878..5d14ba40 100644 --- a/packages/react-time/src/useCalendar.ts +++ b/packages/react-time/src/useCalendar.ts @@ -243,6 +243,9 @@ export const useCalendar = ({ const getEventProps = useCallback( (id: Event['id']): { style: CSSProperties } | null => { + // TODO: Drag and drop events + // TODO: Change event duration by dragging + const event = [...eventMap.values()] .flat() .find((currEvent) => currEvent.id === id) From 4ae3c4547b0821f81a8529e0629af26adc68832c Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 22:59:12 +0200 Subject: [PATCH 019/163] refactor: reducer --- packages/react-time/package.json | 1 + .../react-time/src/tests/useCalendar.test.ts | 2 +- .../src/useCalendar/calendarActions.ts | 10 ++ packages/react-time/src/useCalendar/index.ts | 1 + .../src/{ => useCalendar}/useCalendar.ts | 156 ++++++++++-------- .../src/useCalendar/useCalendarReducer.ts | 29 ++++ .../src/useCalendar/useCalendarState.ts | 14 ++ 7 files changed, 144 insertions(+), 69 deletions(-) create mode 100644 packages/react-time/src/useCalendar/calendarActions.ts create mode 100644 packages/react-time/src/useCalendar/index.ts rename packages/react-time/src/{ => useCalendar}/useCalendar.ts (76%) create mode 100644 packages/react-time/src/useCalendar/useCalendarReducer.ts create mode 100644 packages/react-time/src/useCalendar/useCalendarState.ts diff --git a/packages/react-time/package.json b/packages/react-time/package.json index a784c85b..0181e8d0 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -64,6 +64,7 @@ "dependencies": { "@js-temporal/polyfill": "^0.4.4", "@tanstack/time": "workspace:*", + "typesafe-actions": "^5.1.0", "use-sync-external-store": "^1.2.0" }, "devDependencies": { diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index 2c29fe5c..a425434f 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -189,7 +189,7 @@ describe('useCalendar', () => { style: { position: 'absolute', top: '45.83333333333333%', - left: '0%', + left: 0, }, currentTime: '11:00', }) diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts new file mode 100644 index 00000000..c713b377 --- /dev/null +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -0,0 +1,10 @@ +import { createAction } from 'typesafe-actions'; +import type { Temporal } from '@js-temporal/polyfill'; +import type { ActionType } from 'typesafe-actions'; + +export const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); +export const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); +export const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); + +const actions = { setCurrentPeriod, setViewMode, updateCurrentTime }; +export type CalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/index.ts b/packages/react-time/src/useCalendar/index.ts new file mode 100644 index 00000000..0b95ae99 --- /dev/null +++ b/packages/react-time/src/useCalendar/index.ts @@ -0,0 +1 @@ +export { useCalendar } from './useCalendar'; diff --git a/packages/react-time/src/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts similarity index 76% rename from packages/react-time/src/useCalendar.ts rename to packages/react-time/src/useCalendar/useCalendar.ts index 5d14ba40..06b9c736 100644 --- a/packages/react-time/src/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,12 +1,20 @@ -import { useCallback, useEffect, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo } from 'react' import { Temporal } from '@js-temporal/polyfill' +import { + setCurrentPeriod, + setViewMode, + updateCurrentTime, +} from './calendarActions' +import { useCalendarReducer } from './useCalendarReducer' +import type { Event } from './useCalendarState' import type { CSSProperties, MouseEventHandler } from 'react' -export interface Event { - id: string - startDate: Temporal.PlainDateTime - endDate: Temporal.PlainDateTime - title: string +interface UseCalendarProps { + weekStartsOn?: number + events: Event[] + viewMode: 'month' | 'week' | number + locale?: string + onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void } const getFirstDayOfMonth = (currMonth: string) => @@ -69,14 +77,6 @@ const splitMultiDayEvents = (event: Event) => { return events } -interface UseCalendarProps { - weekStartsOn?: number - events: Event[] - viewMode: 'month' | 'week' | number - locale?: string - onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void -} - const generateDateRange = ( start: Temporal.PlainDate, end: Temporal.PlainDate, @@ -98,18 +98,21 @@ export const useCalendar = ({ onChangeViewMode, }: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() - - const [currPeriod, setCurrPeriod] = useState(today) - const [viewMode, setViewMode] = useState(initialViewMode) - const [currentTime, setCurrentTime] = useState(Temporal.Now.plainDateTimeISO()); - + const [state, dispatch] = useCalendarReducer({ + currPeriod: today, + viewMode: initialViewMode, + currentTime: Temporal.Now.plainDateTimeISO(), + }) const firstDayOfMonth = getFirstDayOfMonth( - currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ) + const firstDayOfWeek = getFirstDayOfWeek( + state.currPeriod.toString(), + weekStartsOn, ) - const firstDayOfWeek = getFirstDayOfWeek(currPeriod.toString(), weekStartsOn) const days = - viewMode === 'month' + state.viewMode === 'month' ? Array.from( getChunks( generateDateRange( @@ -119,7 +122,7 @@ export const useCalendar = ({ 7, ), ) - : viewMode === 'week' + : state.viewMode === 'week' ? Array.from( getChunks( generateDateRange( @@ -132,10 +135,10 @@ export const useCalendar = ({ : Array.from( getChunks( generateDateRange( - currPeriod, - currPeriod.add({ days: viewMode - 1 }), + state.currPeriod, + state.currPeriod.add({ days: state.viewMode - 1 }), ), - viewMode, + state.viewMode, ), ) @@ -156,14 +159,14 @@ export const useCalendar = ({ const splitKey = splitEvent.startDate.toString().split('T')[0] if (splitKey) { if (!map.has(splitKey)) map.set(splitKey, []) - map.get(splitKey)?.push(splitEvent) + map.get(splitKey)?.push(splitEvent) } }) } else { const eventKey = event.startDate.toString().split('T')[0] if (eventKey) { if (!map.has(eventKey)) map.set(eventKey, []) - map.get(eventKey)?.push(event) + map.get(eventKey)?.push(event) } } }) @@ -184,68 +187,85 @@ export const useCalendar = ({ }) const getPrev = useCallback>(() => { - switch (viewMode) { + switch (state.viewMode) { case 'month': { const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: 1 }) - setCurrPeriod(firstDayOfPrevMonth) + dispatch(setCurrentPeriod(firstDayOfPrevMonth)) break } case 'week': { const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: 1 }) - setCurrPeriod(firstDayOfPrevWeek) + dispatch(setCurrentPeriod(firstDayOfPrevWeek)) break } default: { - const prevCustomStart = currPeriod.subtract({ days: viewMode }) - setCurrPeriod(prevCustomStart) + const prevCustomStart = state.currPeriod.subtract({ + days: state.viewMode, + }) + dispatch(setCurrentPeriod(prevCustomStart)) break } } - }, [viewMode, firstDayOfMonth, firstDayOfWeek, currPeriod]) + }, [ + state.viewMode, + state.currPeriod, + firstDayOfMonth, + dispatch, + firstDayOfWeek, + ]) const getNext = useCallback>(() => { - switch (viewMode) { + switch (state.viewMode) { case 'month': { const firstDayOfNextMonth = firstDayOfMonth.add({ months: 1 }) - setCurrPeriod(firstDayOfNextMonth) + dispatch(setCurrentPeriod(firstDayOfNextMonth)) break } case 'week': { const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: 1 }) - setCurrPeriod(firstDayOfNextWeek) + dispatch(setCurrentPeriod(firstDayOfNextWeek)) break } default: { - const nextCustomStart = currPeriod.add({ days: viewMode }) - setCurrPeriod(nextCustomStart) + const nextCustomStart = state.currPeriod.add({ days: state.viewMode }) + dispatch(setCurrentPeriod(nextCustomStart)) break } } - }, [viewMode, firstDayOfMonth, firstDayOfWeek, currPeriod]) + }, [ + state.viewMode, + state.currPeriod, + firstDayOfMonth, + dispatch, + firstDayOfWeek, + ]) const getCurrent = useCallback>(() => { - setCurrPeriod(today) - }, [today]) + dispatch(setCurrentPeriod(Temporal.Now.plainDateISO())) + }, [dispatch]) - const get = useCallback((date: Temporal.PlainDate) => { - setCurrPeriod(date) - }, []) + const get = useCallback( + (date: Temporal.PlainDate) => { + dispatch(setCurrentPeriod(date)) + }, + [dispatch], + ) const chunks = - viewMode === 'month' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents] + state.viewMode === 'month' + ? [...getChunks(daysWithEvents, 7)] + : [daysWithEvents] + const changeViewMode = useCallback( (newViewMode: 'month' | 'week' | number) => { onChangeViewMode?.(newViewMode) - setViewMode(newViewMode) + dispatch(setViewMode(newViewMode)) }, - [onChangeViewMode], + [dispatch, onChangeViewMode], ) const getEventProps = useCallback( (id: Event['id']): { style: CSSProperties } | null => { - // TODO: Drag and drop events - // TODO: Change event duration by dragging - const event = [...eventMap.values()] .flat() .find((currEvent) => currEvent.id === id) @@ -313,7 +333,7 @@ export const useCalendar = ({ : 100 - 2 * sidePadding const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - if (viewMode === 'week' || typeof viewMode === 'number') { + if (state.viewMode === 'week' || typeof state.viewMode === 'number') { return { style: { position: 'absolute', @@ -328,21 +348,21 @@ export const useCalendar = ({ return null }, - [eventMap, viewMode], + [eventMap, state.viewMode], ) useEffect(() => { const intervalId = setInterval(() => { - setCurrentTime(Temporal.Now.plainDateTimeISO()); - }, 60000); - - return () => clearInterval(intervalId); - }, []); + dispatch(updateCurrentTime(Temporal.Now.plainDateTimeISO())) + }, 60000) + + return () => clearInterval(intervalId) + }, [dispatch]) const getCurrentTimeMarkerProps = useCallback(() => { - const { hour, minute } = currentTime; - const currentTimeInMinutes = hour * 60 + minute; - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + const { hour, minute } = state.currentTime + const currentTimeInMinutes = hour * 60 + minute + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 return { style: { @@ -350,18 +370,18 @@ export const useCalendar = ({ top: `${percentageOfDay}%`, left: 0, }, - currentTime: currentTime.toString().split('T')[1]?.substring(0, 5), + currentTime: state.currentTime.toString().split('T')[1]?.substring(0, 5), } - }, [currentTime]); + }, [state.currentTime]) return { firstDayOfPeriod: - viewMode === 'month' + state.viewMode === 'month' ? firstDayOfMonth - : viewMode === 'week' + : state.viewMode === 'week' ? firstDayOfWeek - : currPeriod, - currPeriod: currPeriod.toString({ calendarName: 'auto' }), + : state.currPeriod, + currPeriod: state.currPeriod.toString({ calendarName: 'auto' }), getPrev, getNext, getCurrent, @@ -370,7 +390,7 @@ export const useCalendar = ({ daysNames: days .flat() .map((day) => day.toLocaleString(locale, { weekday: 'short' })), - viewMode, + viewMode: state.viewMode, changeViewMode, getEventProps, getCurrentTimeMarkerProps, diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts new file mode 100644 index 00000000..06391a43 --- /dev/null +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -0,0 +1,29 @@ +import { useReducer } from 'react'; +import { createReducer } from 'typesafe-actions'; + +import { setCurrentPeriod, setViewMode, updateCurrentTime } from './calendarActions'; +import type { CalendarAction} from './calendarActions'; +import type { CalendarState} from './useCalendarState'; + +const createCalendarReducer = (initialState: CalendarState) => { + return createReducer(initialState) + .handleAction(setCurrentPeriod, (state, action) => ({ + ...state, + currPeriod: action.payload, + })) + .handleAction(setViewMode, (state, action) => ({ + ...state, + viewMode: action.payload, + })) + .handleAction(updateCurrentTime, (state, action) => ({ + ...state, + currentTime: action.payload, + })); +} + +export const useCalendarReducer = ( + initialState: TState, +) => { + const reducer = createCalendarReducer(initialState); + return useReducer(reducer, initialState); +} diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts new file mode 100644 index 00000000..4f7eb91b --- /dev/null +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -0,0 +1,14 @@ +import type { Temporal } from '@js-temporal/polyfill'; + +export interface Event { + id: string; + startDate: Temporal.PlainDateTime; + endDate: Temporal.PlainDateTime; + title: string; +} + +export interface CalendarState { + currPeriod: Temporal.PlainDate; + viewMode: 'month' | 'week' | number; + currentTime: Temporal.PlainDateTime; +} From 4009dae1481028b0bb81b3f9e4df10f2c981f152 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 3 Jun 2024 22:59:20 +0200 Subject: [PATCH 020/163] refactor: reducer --- pnpm-lock.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0326575..8df55dd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,6 +162,9 @@ importers: react-dom: specifier: ^17.0.0 || ^18.0.0 version: 18.2.0(react@18.2.0) + typesafe-actions: + specifier: ^5.1.0 + version: 5.1.0 use-sync-external-store: specifier: ^1.2.0 version: 1.2.0(react@18.2.0) @@ -10838,6 +10841,11 @@ packages: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} dev: true + /typesafe-actions@5.1.0: + resolution: {integrity: sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==} + engines: {node: '>= 4'} + dev: false + /typescript@4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} From fa3716a5c06882540739e797211c36a9627d5e02 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 4 Jun 2024 11:52:33 +0200 Subject: [PATCH 021/163] refactor(useCalendar): types --- packages/react-time/src/useCalendar/useCalendar.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 06b9c736..2f6b3006 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -9,9 +9,9 @@ import { useCalendarReducer } from './useCalendarReducer' import type { Event } from './useCalendarState' import type { CSSProperties, MouseEventHandler } from 'react' -interface UseCalendarProps { +interface UseCalendarProps { weekStartsOn?: number - events: Event[] + events: TEvent[] viewMode: 'month' | 'week' | number locale?: string onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void @@ -31,10 +31,10 @@ const getChunks = function* (arr: T[], n: number) { } } -const splitMultiDayEvents = (event: Event) => { +const splitMultiDayEvents = (event: TEvent): TEvent[] => { const startDate = Temporal.PlainDateTime.from(event.startDate) const endDate = Temporal.PlainDateTime.from(event.endDate) - const events: Event[] = [] + const events: TEvent[] = [] let currentDay = startDate while ( @@ -90,13 +90,13 @@ const generateDateRange = ( return dates } -export const useCalendar = ({ +export const useCalendar = ({ weekStartsOn = 1, events, viewMode: initialViewMode, locale, onChangeViewMode, -}: UseCalendarProps) => { +}: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() const [state, dispatch] = useCalendarReducer({ currPeriod: today, @@ -143,7 +143,7 @@ export const useCalendar = ({ ) const eventMap = useMemo(() => { - const map = new Map() + const map = new Map() events.forEach((event) => { const eventStartDate = Temporal.PlainDateTime.from(event.startDate) From 131984b16eb26d26b810a2093f9a066c3958a164 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 4 Jun 2024 12:04:35 +0200 Subject: [PATCH 022/163] refactor(useCalendar): types --- packages/react-time/src/useCalendar/useCalendar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 2f6b3006..89ae6b8b 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -13,7 +13,7 @@ interface UseCalendarProps { weekStartsOn?: number events: TEvent[] viewMode: 'month' | 'week' | number - locale?: string + locale?: Parameters['0'] onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void } From e54293462cadfd4fa09d65b294d85e69f12b2ec7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 4 Jun 2024 22:37:59 +0200 Subject: [PATCH 023/163] refactor: useCalendar reducer --- docs/framework/react/reference/uesCalendar.md | 24 ++--- .../react-time/src/tests/useCalendar.test.ts | 10 +- .../src/useCalendar/calendarActions.ts | 10 +- .../react-time/src/useCalendar/useCalendar.ts | 100 ++++-------------- .../src/useCalendar/useCalendarReducer.ts | 94 +++++++++++++--- .../src/useCalendar/useCalendarState.ts | 1 + packages/time/package.json | 5 +- packages/time/src/index.ts | 2 +- packages/time/src/utils/getFirstDayOfMonth.ts | 4 + packages/time/src/utils/getFirstDayOfWeek.ts | 6 ++ packages/time/src/utils/index.ts | 3 + 11 files changed, 147 insertions(+), 112 deletions(-) create mode 100644 packages/time/src/utils/getFirstDayOfMonth.ts create mode 100644 packages/time/src/utils/getFirstDayOfWeek.ts create mode 100644 packages/time/src/utils/index.ts diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/uesCalendar.md index 3ac395a4..7bf0a043 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/uesCalendar.md @@ -40,11 +40,11 @@ export function useCalendar({ - This value represents the first day of the current period displayed by the calendar. - `currPeriod: string` - This value represents a string that describes the current period displayed by the calendar. -- `getPrev: MouseEventHandler` +- `setPreviousPeriod: MouseEventHandler` - This function is a click event handler that navigates to the previous period. -- `getNext: MouseEventHandler` +- `setNextPeriod: MouseEventHandler` - This function is a click event handler that navigates to the next period. -- `getCurrent: MouseEventHandler` +- `getCurrentPeriod: MouseEventHandler` - This function is a click event handler that navigates to the current period. - `get: (date: Temporal.PlainDate) => void` - This function is a callback function that is called when a date is selected in the calendar. It receives the selected date as an argument. @@ -62,7 +62,7 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. -- `getCurrentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` +- `getCurrentPeriodTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - This function is used to retrieve the style properties and current time for the current time marker. @@ -73,16 +73,16 @@ const CalendarComponent = ({ events }) => { const { firstDayOfPeriod, currPeriod, - getPrev, - getNext, - getCurrent, + setPreviousPeriod, + setNextPeriod, + getCurrentPeriod, get, changeViewMode, chunks, daysNames, viewMode, getEventProps, - getCurrentTimeMarkerProps, + getCurrentPeriodTimeMarkerProps, } = useCalendar({ events, viewMode: 'month', @@ -93,9 +93,9 @@ const CalendarComponent = ({ events }) => { return (
- - - + + +
@@ -136,7 +136,7 @@ const CalendarComponent = ({ events }) => {
))} -
+
))} diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.ts index a425434f..a66a0b7b 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.ts @@ -37,7 +37,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.getPrev(mockEvent) + result.current.setPreviousPeriod(mockEvent) }) const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ @@ -60,7 +60,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.getNext(mockEvent) + result.current.setNextPeriod(mockEvent) }) const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) @@ -79,8 +79,8 @@ describe('useCalendar', () => { ) act(() => { - result.current.getNext(mockEvent) - result.current.getCurrent(mockEvent) + result.current.setNextPeriod(mockEvent) + result.current.getCurrentPeriod(mockEvent) }) expect(result.current.currPeriod).toBe( @@ -183,7 +183,7 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: 'week' }), ) - const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps() + const currentTimeMarkerProps = result.current.getCurrentPeriodTimeMarkerProps() expect(currentTimeMarkerProps).toEqual({ style: { diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts index c713b377..c9190d5c 100644 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -2,9 +2,11 @@ import { createAction } from 'typesafe-actions'; import type { Temporal } from '@js-temporal/polyfill'; import type { ActionType } from 'typesafe-actions'; -export const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); -export const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); -export const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); +const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); +const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); +const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); +const setNextPeriodPeriod = createAction('SET_NEXT_PERIOD') +const setPreviousPeriod = createAction('SET_PREVIOUS_PERIOD') -const actions = { setCurrentPeriod, setViewMode, updateCurrentTime }; +export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, setNextPeriodPeriod, setPreviousPeriod }; export type CalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 89ae6b8b..5b313099 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,10 +1,7 @@ import { useCallback, useEffect, useMemo } from 'react' import { Temporal } from '@js-temporal/polyfill' -import { - setCurrentPeriod, - setViewMode, - updateCurrentTime, -} from './calendarActions' +import { getFirstDayOfMonth, getFirstDayOfWeek } from "@tanstack/time"; +import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' import type { Event } from './useCalendarState' import type { CSSProperties, MouseEventHandler } from 'react' @@ -17,14 +14,6 @@ interface UseCalendarProps { onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void } -const getFirstDayOfMonth = (currMonth: string) => - Temporal.PlainDate.from(`${currMonth}-01`) - -const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { - const date = Temporal.PlainDate.from(currWeek) - return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) -} - const getChunks = function* (arr: T[], n: number) { for (let i = 0; i < arr.length; i += n) { yield arr.slice(i, i + n) @@ -102,13 +91,16 @@ export const useCalendar = ({ currPeriod: today, viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), + weekStartsOn, }) + const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) + const firstDayOfWeek = getFirstDayOfWeek( state.currPeriod.toString(), - weekStartsOn, + state.weekStartsOn, ) const days = @@ -186,67 +178,21 @@ export const useCalendar = ({ }) }) - const getPrev = useCallback>(() => { - switch (state.viewMode) { - case 'month': { - const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: 1 }) - dispatch(setCurrentPeriod(firstDayOfPrevMonth)) - break - } - case 'week': { - const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: 1 }) - dispatch(setCurrentPeriod(firstDayOfPrevWeek)) - break - } - default: { - const prevCustomStart = state.currPeriod.subtract({ - days: state.viewMode, - }) - dispatch(setCurrentPeriod(prevCustomStart)) - break - } - } - }, [ - state.viewMode, - state.currPeriod, - firstDayOfMonth, - dispatch, - firstDayOfWeek, - ]) - - const getNext = useCallback>(() => { - switch (state.viewMode) { - case 'month': { - const firstDayOfNextMonth = firstDayOfMonth.add({ months: 1 }) - dispatch(setCurrentPeriod(firstDayOfNextMonth)) - break - } - case 'week': { - const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: 1 }) - dispatch(setCurrentPeriod(firstDayOfNextWeek)) - break - } - default: { - const nextCustomStart = state.currPeriod.add({ days: state.viewMode }) - dispatch(setCurrentPeriod(nextCustomStart)) - break - } - } - }, [ - state.viewMode, - state.currPeriod, - firstDayOfMonth, - dispatch, - firstDayOfWeek, - ]) - - const getCurrent = useCallback>(() => { - dispatch(setCurrentPeriod(Temporal.Now.plainDateISO())) + const setPreviousPeriod = useCallback>(() => { + dispatch(actions.setPreviousPeriod) + }, [dispatch]) + + const setNextPeriod = useCallback>(() => { + dispatch(actions.setNextPeriodPeriod) + }, [dispatch]) + + const getCurrentPeriod = useCallback>(() => { + dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())) }, [dispatch]) const get = useCallback( (date: Temporal.PlainDate) => { - dispatch(setCurrentPeriod(date)) + dispatch(actions.setCurrentPeriod(date)) }, [dispatch], ) @@ -258,8 +204,8 @@ export const useCalendar = ({ const changeViewMode = useCallback( (newViewMode: 'month' | 'week' | number) => { + dispatch(actions.setViewMode(newViewMode)) onChangeViewMode?.(newViewMode) - dispatch(setViewMode(newViewMode)) }, [dispatch, onChangeViewMode], ) @@ -359,7 +305,7 @@ export const useCalendar = ({ return () => clearInterval(intervalId) }, [dispatch]) - const getCurrentTimeMarkerProps = useCallback(() => { + const getCurrentPeriodTimeMarkerProps = useCallback(() => { const { hour, minute } = state.currentTime const currentTimeInMinutes = hour * 60 + minute const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 @@ -382,9 +328,9 @@ export const useCalendar = ({ ? firstDayOfWeek : state.currPeriod, currPeriod: state.currPeriod.toString({ calendarName: 'auto' }), - getPrev, - getNext, - getCurrent, + setPreviousPeriod, + setNextPeriod, + getCurrentPeriod, get, chunks, daysNames: days @@ -393,6 +339,6 @@ export const useCalendar = ({ viewMode: state.viewMode, changeViewMode, getEventProps, - getCurrentTimeMarkerProps, + getCurrentPeriodTimeMarkerProps, } } diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 06391a43..81efe8f8 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -1,29 +1,99 @@ -import { useReducer } from 'react'; -import { createReducer } from 'typesafe-actions'; +import { useReducer } from 'react' +import { createReducer } from 'typesafe-actions' -import { setCurrentPeriod, setViewMode, updateCurrentTime } from './calendarActions'; -import type { CalendarAction} from './calendarActions'; -import type { CalendarState} from './useCalendarState'; +import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' +import { type CalendarAction, actions } from './calendarActions' +import type { CalendarState } from './useCalendarState' const createCalendarReducer = (initialState: CalendarState) => { return createReducer(initialState) - .handleAction(setCurrentPeriod, (state, action) => ({ + .handleAction(actions.setCurrentPeriod, (state, action) => ({ ...state, currPeriod: action.payload, })) - .handleAction(setViewMode, (state, action) => ({ + .handleAction(actions.setViewMode, (state, action) => ({ ...state, viewMode: action.payload, })) - .handleAction(updateCurrentTime, (state, action) => ({ + .handleAction(actions.updateCurrentTime, (state, action) => ({ ...state, currentTime: action.payload, - })); + })) + .handleAction(actions.setPreviousPeriod, (state) => { + const firstDayOfMonth = getFirstDayOfMonth( + state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ) + const firstDayOfWeek = getFirstDayOfWeek( + state.currPeriod.toString(), + state.weekStartsOn, + ) + + switch (state.viewMode) { + case 'month': { + const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: 1 }) + return { + ...state, + currPeriod: firstDayOfPrevMonth, + } + } + case 'week': { + const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: 1 }) + return { + ...state, + currPeriod: firstDayOfPrevWeek, + } + } + default: { + const prevCustomStart = state.currPeriod.subtract({ + days: state.viewMode, + }) + return { + ...state, + currPeriod: prevCustomStart, + } + } + } + }) + .handleAction(actions.setNextPeriodPeriod, (state, action) => { + const firstDayOfMonth = getFirstDayOfMonth( + state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ) + const firstDayOfWeek = getFirstDayOfWeek( + state.currPeriod.toString(), + state.weekStartsOn, + ) + + switch (state.viewMode) { + case 'month': { + const firstDayOfNextMonth = firstDayOfMonth.add({ months: 1 }) + return { + ...state, + currPeriod: firstDayOfNextMonth, + } + } + case 'week': { + const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: 1 }) + return { + ...state, + currPeriod: firstDayOfNextWeek, + } + } + default: { + const nextCustomStart = state.currPeriod.add({ days: state.viewMode }) + return { + ...state, + currPeriod: nextCustomStart, + } + } + } + }) } -export const useCalendarReducer = ( +export const useCalendarReducer = < + TState extends CalendarState = CalendarState, +>( initialState: TState, ) => { - const reducer = createCalendarReducer(initialState); - return useReducer(reducer, initialState); + const reducer = createCalendarReducer(initialState) + return useReducer(reducer, initialState) } diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index 4f7eb91b..cd57a883 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -11,4 +11,5 @@ export interface CalendarState { currPeriod: Temporal.PlainDate; viewMode: 'month' | 'week' | number; currentTime: Temporal.PlainDateTime; + weekStartsOn: number; } diff --git a/packages/time/package.json b/packages/time/package.json index 081903be..1b370165 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -55,5 +55,8 @@ "files": [ "dist", "src" - ] + ], + "dependencies": { + "@js-temporal/polyfill": "^0.4.4" + } } diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 12981a25..0e36b7bf 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -1,4 +1,4 @@ /** * TanStack Time */ -export * from './utils/parse'; \ No newline at end of file +export * from './utils'; \ No newline at end of file diff --git a/packages/time/src/utils/getFirstDayOfMonth.ts b/packages/time/src/utils/getFirstDayOfMonth.ts new file mode 100644 index 00000000..845b49b7 --- /dev/null +++ b/packages/time/src/utils/getFirstDayOfMonth.ts @@ -0,0 +1,4 @@ +import { Temporal } from '@js-temporal/polyfill' + +export const getFirstDayOfMonth = (currMonth: string) => + Temporal.PlainDate.from(`${currMonth}-01`) diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts new file mode 100644 index 00000000..bb021805 --- /dev/null +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -0,0 +1,6 @@ +import { Temporal } from '@js-temporal/polyfill' + +export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { + const date = Temporal.PlainDate.from(currWeek) + return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) +} diff --git a/packages/time/src/utils/index.ts b/packages/time/src/utils/index.ts new file mode 100644 index 00000000..293009a0 --- /dev/null +++ b/packages/time/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './parse'; +export * from './getFirstDayOfMonth'; +export * from './getFirstDayOfWeek'; From a1497781695311ecff4074f8c397120e9cc3179f Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 11:05:56 +0200 Subject: [PATCH 024/163] refactor: useCalendar reducer --- packages/react-time/src/useCalendar/calendarActions.ts | 8 ++++---- packages/react-time/src/useCalendar/useCalendar.ts | 6 +++--- packages/react-time/src/useCalendar/useCalendarReducer.ts | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts index c9190d5c..ddccef7a 100644 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -5,8 +5,8 @@ import type { ActionType } from 'typesafe-actions'; const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); -const setNextPeriodPeriod = createAction('SET_NEXT_PERIOD') -const setPreviousPeriod = createAction('SET_PREVIOUS_PERIOD') +const setNextPeriod = createAction('SET_NEXT_PERIOD')(); +const setPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')(); -export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, setNextPeriodPeriod, setPreviousPeriod }; -export type CalendarAction = ActionType; +export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, setNextPeriod, setPreviousPeriod }; +export type UseCalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 5b313099..e30691db 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -179,11 +179,11 @@ export const useCalendar = ({ }) const setPreviousPeriod = useCallback>(() => { - dispatch(actions.setPreviousPeriod) + dispatch(actions.setPreviousPeriod()) }, [dispatch]) const setNextPeriod = useCallback>(() => { - dispatch(actions.setNextPeriodPeriod) + dispatch(actions.setNextPeriod()); }, [dispatch]) const getCurrentPeriod = useCallback>(() => { @@ -299,7 +299,7 @@ export const useCalendar = ({ useEffect(() => { const intervalId = setInterval(() => { - dispatch(updateCurrentTime(Temporal.Now.plainDateTimeISO())) + dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())) }, 60000) return () => clearInterval(intervalId) diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 81efe8f8..57fde848 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -2,11 +2,11 @@ import { useReducer } from 'react' import { createReducer } from 'typesafe-actions' import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' -import { type CalendarAction, actions } from './calendarActions' +import { type UseCalendarAction, actions } from './calendarActions' import type { CalendarState } from './useCalendarState' const createCalendarReducer = (initialState: CalendarState) => { - return createReducer(initialState) + return createReducer(initialState) .handleAction(actions.setCurrentPeriod, (state, action) => ({ ...state, currPeriod: action.payload, @@ -54,7 +54,7 @@ const createCalendarReducer = (initialState: CalendarState) => { } } }) - .handleAction(actions.setNextPeriodPeriod, (state, action) => { + .handleAction(actions.setNextPeriod, (state) => { const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) From 28ac64f8e1ba30f6a83e14c67d5e38d8ce38bf27 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 11:06:07 +0200 Subject: [PATCH 025/163] refactor: useCalendar reducer --- pnpm-lock.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8df55dd6..6e5ac1a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,7 +189,11 @@ importers: specifier: ^2.10.1 version: 2.10.1(@testing-library/jest-dom@6.4.2)(solid-js@1.7.8)(vite@5.2.6) - packages/time: {} + packages/time: + dependencies: + '@js-temporal/polyfill': + specifier: ^0.4.4 + version: 0.4.4 packages/vue-time: dependencies: From dfa353a60eef68340366a8faa288331f1ebf2e63 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 12:16:24 +0200 Subject: [PATCH 026/163] feat: add the isToday field --- packages/react-time/src/useCalendar/useCalendar.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index e30691db..5244528f 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -174,6 +174,7 @@ export const useCalendar = ({ return { date: day, events: dailyEvents, + isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, } }) }) From 874208741db48acf61e4ef6075cb557b43f1744f Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 12:57:28 +0200 Subject: [PATCH 027/163] feat: add the isToday field --- ...eCalendar.test.ts => useCalendar.test.tsx} | 16 +++++++ .../react-time/src/useCalendar/useCalendar.ts | 44 +++++++++---------- 2 files changed, 37 insertions(+), 23 deletions(-) rename packages/react-time/src/tests/{useCalendar.test.ts => useCalendar.test.tsx} (91%) diff --git a/packages/react-time/src/tests/useCalendar.test.ts b/packages/react-time/src/tests/useCalendar.test.tsx similarity index 91% rename from packages/react-time/src/tests/useCalendar.test.ts rename to packages/react-time/src/tests/useCalendar.test.tsx index a66a0b7b..0603e908 100644 --- a/packages/react-time/src/tests/useCalendar.test.ts +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -196,4 +196,20 @@ describe('useCalendar', () => { vi.useRealTimers(); }) + + test('should render array of days', () => { + vi.setSystemTime(new Date('2024-06-01T11:00:00')); + + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + ); + + const { chunks } = result.current; + expect(chunks).toHaveLength(5); + expect(chunks[0]).toHaveLength(7); + + expect(chunks[0]?.[0]?.date.toString()).toBe('2024-06-01'); + expect(chunks[chunks.length - 1]?.[0]?.date.toString()).toBe('2024-06-29'); + expect(chunks[0]?.[0]?.isToday).toBe(true); + }); }) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 5244528f..79900267 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -8,7 +8,7 @@ import type { CSSProperties, MouseEventHandler } from 'react' interface UseCalendarProps { weekStartsOn?: number - events: TEvent[] + events?: TEvent[] viewMode: 'month' | 'week' | number locale?: Parameters['0'] onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void @@ -113,7 +113,7 @@ export const useCalendar = ({ ), 7, ), - ) + ).flat() : state.viewMode === 'week' ? Array.from( getChunks( @@ -123,7 +123,7 @@ export const useCalendar = ({ ), 7, ), - ) + ).flat() : Array.from( getChunks( generateDateRange( @@ -132,12 +132,12 @@ export const useCalendar = ({ ), state.viewMode, ), - ) + ).flat() const eventMap = useMemo(() => { const map = new Map() - events.forEach((event) => { + events?.forEach((event) => { const eventStartDate = Temporal.PlainDateTime.from(event.startDate) const eventEndDate = Temporal.PlainDateTime.from(event.endDate) if ( @@ -166,19 +166,22 @@ export const useCalendar = ({ return map }, [events]) - const daysWithEvents = days.map((dayChunk) => { - return dayChunk.map((day) => { - const dayKey = day.toString() - const dailyEvents = eventMap.get(dayKey) ?? [] + const daysWithEvents = days.map((day) => { + const dayKey = day.toString() + const dailyEvents = eventMap.get(dayKey) ?? [] - return { - date: day, - events: dailyEvents, - isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, - } - }) + return { + date: day, + events: dailyEvents, + isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, + } }) + const chunks = + state.viewMode === 'month' + ? [...getChunks(daysWithEvents, 7)] + : [daysWithEvents] + const setPreviousPeriod = useCallback>(() => { dispatch(actions.setPreviousPeriod()) }, [dispatch]) @@ -198,11 +201,6 @@ export const useCalendar = ({ [dispatch], ) - const chunks = - state.viewMode === 'month' - ? [...getChunks(daysWithEvents, 7)] - : [daysWithEvents] - const changeViewMode = useCallback( (newViewMode: 'month' | 'week' | number) => { dispatch(actions.setViewMode(newViewMode)) @@ -334,9 +332,9 @@ export const useCalendar = ({ getCurrentPeriod, get, chunks, - daysNames: days - .flat() - .map((day) => day.toLocaleString(locale, { weekday: 'short' })), + daysNames: Array.from(getChunks(daysWithEvents, 7)).flat() + .slice(0, 7) + .map((day) => day.date.toLocaleString(locale, { weekday: 'short' })), viewMode: state.viewMode, changeViewMode, getEventProps, From 3d6f74a8b75eac107ab44a3299653384fa81441a Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 12:58:46 +0200 Subject: [PATCH 028/163] feat: add the isToday field --- packages/react-time/src/tests/useCalendar.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 0603e908..c390cb89 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -210,6 +210,6 @@ describe('useCalendar', () => { expect(chunks[0]?.[0]?.date.toString()).toBe('2024-06-01'); expect(chunks[chunks.length - 1]?.[0]?.date.toString()).toBe('2024-06-29'); - expect(chunks[0]?.[0]?.isToday).toBe(true); + expect(chunks.find((week) => week.some((day) => day.isToday))?.find((day) => day.isToday)?.date.toString()).toBe('2024-06-01'); }); }) From d93b29d0d56432ff694ff4d7f6cc8bf37cc284c9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 13:09:58 +0200 Subject: [PATCH 029/163] docs: useCalendar --- .../react/reference/{uesCalendar.md => useCalendar.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/framework/react/reference/{uesCalendar.md => useCalendar.md} (99%) diff --git a/docs/framework/react/reference/uesCalendar.md b/docs/framework/react/reference/useCalendar.md similarity index 99% rename from docs/framework/react/reference/uesCalendar.md rename to docs/framework/react/reference/useCalendar.md index 7bf0a043..2d8fea7e 100644 --- a/docs/framework/react/reference/uesCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -136,7 +136,7 @@ const CalendarComponent = ({ events }) => {
))} -
+
))} From 6432973e85d90a4eb1d0485b17cae1b8e1cf2037 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 5 Jun 2024 23:48:55 +0200 Subject: [PATCH 030/163] feat: useCalendar hook --- docs/framework/react/reference/useCalendar.md | 34 +++++++++---------- .../react-time/src/tests/useCalendar.test.tsx | 22 ++++++------ .../src/useCalendar/calendarActions.ts | 6 ++-- .../react-time/src/useCalendar/useCalendar.ts | 28 +++++++-------- .../src/useCalendar/useCalendarReducer.ts | 4 +-- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 2d8fea7e..dcb86e94 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -40,15 +40,15 @@ export function useCalendar({ - This value represents the first day of the current period displayed by the calendar. - `currPeriod: string` - This value represents a string that describes the current period displayed by the calendar. -- `setPreviousPeriod: MouseEventHandler` +- `goToPreviousPeriod: MouseEventHandler` - This function is a click event handler that navigates to the previous period. -- `setNextPeriod: MouseEventHandler` +- `goToNextPeriod: MouseEventHandler` - This function is a click event handler that navigates to the next period. -- `getCurrentPeriod: MouseEventHandler` +- `goToCurrentPeriod: MouseEventHandler` - This function is a click event handler that navigates to the current period. -- `get: (date: Temporal.PlainDate) => void` +- `goToSpecificPeriod: (date: Temporal.PlainDate) => void` - This function is a callback function that is called when a date is selected in the calendar. It receives the selected date as an argument. -- `chunks: Array>` +- `weeks: Array>` - This value represents the calendar grid, where each cell contains the date and events for that day. - `daysNames: string[]` - This value represents an array of strings that contain the names of the days of the week. @@ -62,7 +62,7 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. -- `getCurrentPeriodTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` +- `goToCurrentPeriodTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - This function is used to retrieve the style properties and current time for the current time marker. @@ -73,16 +73,16 @@ const CalendarComponent = ({ events }) => { const { firstDayOfPeriod, currPeriod, - setPreviousPeriod, - setNextPeriod, - getCurrentPeriod, - get, + goToPreviousPeriod, + goToNextPeriod, + goToCurrentPeriod, + goToSpecificPeriod, changeViewMode, - chunks, + weeks, daysNames, viewMode, getEventProps, - getCurrentPeriodTimeMarkerProps, + goToCurrentPeriodTimeMarkerProps, } = useCalendar({ events, viewMode: 'month', @@ -93,9 +93,9 @@ const CalendarComponent = ({ events }) => { return (
- - - + + +
@@ -116,7 +116,7 @@ const CalendarComponent = ({ events }) => { )} - {chunks.map((week, weekIndex) => ( + {weeks.map((week, weekIndex) => ( {week.map((day) => ( @@ -136,7 +136,7 @@ const CalendarComponent = ({ events }) => {
))} -
+
))} diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index c390cb89..9a73267b 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -37,7 +37,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.setPreviousPeriod(mockEvent) + result.current.goToPreviousPeriod(mockEvent) }) const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ @@ -60,7 +60,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.setNextPeriod(mockEvent) + result.current.goToNextPeriod(mockEvent) }) const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) @@ -79,8 +79,8 @@ describe('useCalendar', () => { ) act(() => { - result.current.setNextPeriod(mockEvent) - result.current.getCurrentPeriod(mockEvent) + result.current.goToNextPeriod(mockEvent) + result.current.goToCurrentPeriod(mockEvent) }) expect(result.current.currPeriod).toBe( @@ -183,7 +183,7 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: 'week' }), ) - const currentTimeMarkerProps = result.current.getCurrentPeriodTimeMarkerProps() + const currentTimeMarkerProps = result.current.goToCurrentPeriodTimeMarkerProps() expect(currentTimeMarkerProps).toEqual({ style: { @@ -204,12 +204,12 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: 'month', locale: 'en-US' }) ); - const { chunks } = result.current; - expect(chunks).toHaveLength(5); - expect(chunks[0]).toHaveLength(7); + const { weeks } = result.current; + expect(weeks).toHaveLength(5); + expect(weeks[0]).toHaveLength(7); - expect(chunks[0]?.[0]?.date.toString()).toBe('2024-06-01'); - expect(chunks[chunks.length - 1]?.[0]?.date.toString()).toBe('2024-06-29'); - expect(chunks.find((week) => week.some((day) => day.isToday))?.find((day) => day.isToday)?.date.toString()).toBe('2024-06-01'); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-06-01'); + expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-29'); + expect(weeks.find((week) => week.some((day) => day.isToday))?.find((day) => day.isToday)?.date.toString()).toBe('2024-06-01'); }); }) diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts index ddccef7a..aee447fc 100644 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -5,8 +5,8 @@ import type { ActionType } from 'typesafe-actions'; const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); -const setNextPeriod = createAction('SET_NEXT_PERIOD')(); -const setPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')(); +const goToNextPeriod = createAction('SET_NEXT_PERIOD')(); +const goToPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')(); -export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, setNextPeriod, setPreviousPeriod }; +export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, goToNextPeriod, goToPreviousPeriod }; export type UseCalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 79900267..f52bbd48 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -177,24 +177,24 @@ export const useCalendar = ({ } }) - const chunks = + const weeks = state.viewMode === 'month' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents] - const setPreviousPeriod = useCallback>(() => { - dispatch(actions.setPreviousPeriod()) + const goToPreviousPeriod = useCallback>(() => { + dispatch(actions.goToPreviousPeriod()) }, [dispatch]) - const setNextPeriod = useCallback>(() => { - dispatch(actions.setNextPeriod()); + const goToNextPeriod = useCallback>(() => { + dispatch(actions.goToNextPeriod()); }, [dispatch]) - const getCurrentPeriod = useCallback>(() => { + const goToCurrentPeriod = useCallback>(() => { dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())) }, [dispatch]) - const get = useCallback( + const goToSpecificPeriod = useCallback( (date: Temporal.PlainDate) => { dispatch(actions.setCurrentPeriod(date)) }, @@ -304,7 +304,7 @@ export const useCalendar = ({ return () => clearInterval(intervalId) }, [dispatch]) - const getCurrentPeriodTimeMarkerProps = useCallback(() => { + const goToCurrentPeriodTimeMarkerProps = useCallback(() => { const { hour, minute } = state.currentTime const currentTimeInMinutes = hour * 60 + minute const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 @@ -327,17 +327,17 @@ export const useCalendar = ({ ? firstDayOfWeek : state.currPeriod, currPeriod: state.currPeriod.toString({ calendarName: 'auto' }), - setPreviousPeriod, - setNextPeriod, - getCurrentPeriod, - get, - chunks, + goToPreviousPeriod, + goToNextPeriod, + goToCurrentPeriod, + goToSpecificPeriod, + weeks, daysNames: Array.from(getChunks(daysWithEvents, 7)).flat() .slice(0, 7) .map((day) => day.date.toLocaleString(locale, { weekday: 'short' })), viewMode: state.viewMode, changeViewMode, getEventProps, - getCurrentPeriodTimeMarkerProps, + goToCurrentPeriodTimeMarkerProps, } } diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 57fde848..5aa28d22 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -19,7 +19,7 @@ const createCalendarReducer = (initialState: CalendarState) => { ...state, currentTime: action.payload, })) - .handleAction(actions.setPreviousPeriod, (state) => { + .handleAction(actions.goToPreviousPeriod, (state) => { const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) @@ -54,7 +54,7 @@ const createCalendarReducer = (initialState: CalendarState) => { } } }) - .handleAction(actions.setNextPeriod, (state) => { + .handleAction(actions.goToNextPeriod, (state) => { const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) From 75a445a6ec0531ed4289c0d80c8268018fe2b916 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 00:00:01 +0200 Subject: [PATCH 031/163] cd --- .../react-time/src/tests/useCalendar.test.tsx | 24 +++++++++++++++---- .../react-time/src/useCalendar/useCalendar.ts | 23 ++++++++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 9a73267b..1657d40e 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -106,7 +106,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.get(Temporal.PlainDate.from('2024-06-01')) + result.current.goToSpecificPeriod(Temporal.PlainDate.from('2024-06-01')) }) expect(result.current.currPeriod).toBe('2024-06-01') @@ -208,8 +208,24 @@ describe('useCalendar', () => { expect(weeks).toHaveLength(5); expect(weeks[0]).toHaveLength(7); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-06-01'); - expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-29'); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); + expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-24'); expect(weeks.find((week) => week.some((day) => day.isToday))?.find((day) => day.isToday)?.date.toString()).toBe('2024-06-01'); }); -}) + + test('should return the correct day names based on weekStartsOn', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US', weekStartsOn: 1 }) + ); + + const { daysNames } = result.current; + expect(daysNames).toEqual(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']); + + const { result: resultSundayStart } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US', weekStartsOn: 7 }) + ); + + const { daysNames: sundayDaysNames } = resultSundayStart.current; + expect(sundayDaysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); + }); +}); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index f52bbd48..6a80b1fa 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,11 +1,18 @@ import { useCallback, useEffect, useMemo } from 'react' import { Temporal } from '@js-temporal/polyfill' -import { getFirstDayOfMonth, getFirstDayOfWeek } from "@tanstack/time"; import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' import type { Event } from './useCalendarState' import type { CSSProperties, MouseEventHandler } from 'react' +export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { + const date = Temporal.PlainDate.from(currWeek) + return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) +} + +export const getFirstDayOfMonth = (currMonth: string) => + Temporal.PlainDate.from(`${currMonth}-01`) + interface UseCalendarProps { weekStartsOn?: number events?: TEvent[] @@ -108,7 +115,7 @@ export const useCalendar = ({ ? Array.from( getChunks( generateDateRange( - firstDayOfMonth, + firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - state.weekStartsOn + 7) % 7 }), firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }), ), 7, @@ -319,6 +326,14 @@ export const useCalendar = ({ } }, [state.currentTime]) + const daysNames = useMemo(() => { + const baseDate = Temporal.PlainDate.from('2024-01-01') + return Array.from({ length: 7 }).map((_, i) => + baseDate.add({ days: (i + weekStartsOn - 1) % 7 }) + .toLocaleString(locale, { weekday: 'short' }) + ) + }, [locale, weekStartsOn]) + return { firstDayOfPeriod: state.viewMode === 'month' @@ -332,9 +347,7 @@ export const useCalendar = ({ goToCurrentPeriod, goToSpecificPeriod, weeks, - daysNames: Array.from(getChunks(daysWithEvents, 7)).flat() - .slice(0, 7) - .map((day) => day.date.toLocaleString(locale, { weekday: 'short' })), + daysNames, viewMode: state.viewMode, changeViewMode, getEventProps, From 7536efc4c6eefc645a666ed052c4b4597743c8a0 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 00:02:08 +0200 Subject: [PATCH 032/163] feat: useCalendar hook --- packages/react-time/src/tests/useCalendar.test.tsx | 2 +- packages/react-time/src/useCalendar/useCalendar.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 1657d40e..5321e76b 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -183,7 +183,7 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: 'week' }), ) - const currentTimeMarkerProps = result.current.goToCurrentPeriodTimeMarkerProps() + const currentTimeMarkerProps = result.current.currentTimeMarkerProps() expect(currentTimeMarkerProps).toEqual({ style: { diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 6a80b1fa..27e46216 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -311,7 +311,7 @@ export const useCalendar = ({ return () => clearInterval(intervalId) }, [dispatch]) - const goToCurrentPeriodTimeMarkerProps = useCallback(() => { + const currentTimeMarkerProps = useCallback(() => { const { hour, minute } = state.currentTime const currentTimeInMinutes = hour * 60 + minute const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 @@ -351,6 +351,6 @@ export const useCalendar = ({ viewMode: state.viewMode, changeViewMode, getEventProps, - goToCurrentPeriodTimeMarkerProps, + currentTimeMarkerProps, } } From 29d20ae54430ce2d8274ab05eff0bcf9f4356f82 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 00:02:18 +0200 Subject: [PATCH 033/163] feat: useCalendar hook --- docs/framework/react/reference/useCalendar.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index dcb86e94..6a1941fb 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -62,7 +62,7 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. -- `goToCurrentPeriodTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` +- `currentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - This function is used to retrieve the style properties and current time for the current time marker. @@ -82,7 +82,7 @@ const CalendarComponent = ({ events }) => { daysNames, viewMode, getEventProps, - goToCurrentPeriodTimeMarkerProps, + currentTimeMarkerProps, } = useCalendar({ events, viewMode: 'month', @@ -136,7 +136,7 @@ const CalendarComponent = ({ events }) => {
))} -
+
))} From e37dbf7f646282d1c6be4000d8cb5191ed74f766 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 00:14:43 +0200 Subject: [PATCH 034/163] feat: useCalendar hook --- .../react-time/src/tests/useCalendar.test.tsx | 26 ++++++++++++++++--- .../react-time/src/useCalendar/useCalendar.ts | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 5321e76b..e4926eeb 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,9 +1,13 @@ import { Temporal } from '@js-temporal/polyfill' -import { describe, expect, test, vi } from 'vitest' +import { afterEach, describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' describe('useCalendar', () => { + afterEach(() => { + vi.useRealTimers(); + }); + const events = [ { id: '1', @@ -193,8 +197,6 @@ describe('useCalendar', () => { }, currentTime: '11:00', }) - - vi.useRealTimers(); }) test('should render array of days', () => { @@ -228,4 +230,22 @@ describe('useCalendar', () => { const { daysNames: sundayDaysNames } = resultSundayStart.current; expect(sundayDaysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); }); + + test('should correctly mark days as in current period', () => { + vi.setSystemTime(new Date('2024-06-01T11:00:00')); + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + ); + + const { weeks } = result.current; + const daysInCurrentPeriod = weeks.flat().map(day => day.isInCurrentPeriod); + + expect(daysInCurrentPeriod).toEqual([ + false, false, false, false, false, true, true, + true, true, true, true, true, true, true, + true, true, true, true, true, true, true, + true, true, true, true, true, true, true, + true, true, true, true, true, true, true + ]); + }); }); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 27e46216..a8825788 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -176,11 +176,13 @@ export const useCalendar = ({ const daysWithEvents = days.map((day) => { const dayKey = day.toString() const dailyEvents = eventMap.get(dayKey) ?? [] + const isInCurrentPeriod = day.month === state.currPeriod.month return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, + isInCurrentPeriod, } }) From d76ddc148110aab895a06004c25157ff5ce11889 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 00:14:51 +0200 Subject: [PATCH 035/163] feat: useCalendar hook --- docs/framework/react/reference/useCalendar.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 6a1941fb..a53e07f6 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -119,7 +119,11 @@ const CalendarComponent = ({ events }) => { {weeks.map((week, weekIndex) => ( {week.map((day) => ( - +
{day.date.day}
From f6b6f29e9ae1bccc429d06312cdcce0d737e0aa4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 01:48:24 +0200 Subject: [PATCH 036/163] test: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 56 +++++++++++++++++++ .../react-time/src/useCalendar/useCalendar.ts | 8 +-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index e4926eeb..ca273c1d 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -248,4 +248,60 @@ describe('useCalendar', () => { true, true, true, true, true, true, true ]); }); + + test('should navigate to a specific period correctly', () => { + const { result } = renderHook(() => useCalendar({ events, viewMode: 'month', locale: 'en-US' })) + const specificDate = Temporal.PlainDate.from('2024-05-15') + + act(() => { + result.current.goToSpecificPeriod(specificDate) + }) + + expect(result.current.currPeriod).toEqual(specificDate) + }) + + test('should navigate to the previous period correctly', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + ) + + act(() => { + result.current.goToPreviousPeriod() + }) + + const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ + months: 1, + }) + + expect(result.current.currPeriod).toEqual(expectedPreviousMonth) + }) + + test('should navigate to the next period correctly', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + ) + + act(() => { + result.current.goToNextPeriod() + }) + + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) + + expect(result.current.currPeriod).toEqual(expectedNextMonth) + }) + + test('should reset to the current period correctly', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + ) + + act(() => { + result.current.goToNextPeriod() + result.current.goToCurrentPeriod() + }) + + expect(result.current.currPeriod).toEqual( + Temporal.Now.plainDateISO(), + ) + }) }); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index a8825788..65c7e982 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -191,15 +191,15 @@ export const useCalendar = ({ ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents] - const goToPreviousPeriod = useCallback>(() => { + const goToPreviousPeriod = useCallback(() => { dispatch(actions.goToPreviousPeriod()) }, [dispatch]) - const goToNextPeriod = useCallback>(() => { + const goToNextPeriod = useCallback(() => { dispatch(actions.goToNextPeriod()); }, [dispatch]) - const goToCurrentPeriod = useCallback>(() => { + const goToCurrentPeriod = useCallback(() => { dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())) }, [dispatch]) @@ -337,13 +337,13 @@ export const useCalendar = ({ }, [locale, weekStartsOn]) return { + ...state, firstDayOfPeriod: state.viewMode === 'month' ? firstDayOfMonth : state.viewMode === 'week' ? firstDayOfWeek : state.currPeriod, - currPeriod: state.currPeriod.toString({ calendarName: 'auto' }), goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, From d9ed5e750e0270be3585aef7cf5bcef64e7ca77b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 01:49:16 +0200 Subject: [PATCH 037/163] test: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index ca273c1d..0933e156 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -77,21 +77,6 @@ describe('useCalendar', () => { expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfNextMonth) }) - test('should reset to the current period correctly', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), - ) - - act(() => { - result.current.goToNextPeriod(mockEvent) - result.current.goToCurrentPeriod(mockEvent) - }) - - expect(result.current.currPeriod).toBe( - Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }), - ) - }) - test('should change view mode correctly', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' }), From 7b8662b64b6531ed6ccf5ba1607f563474d87cb9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 01:50:00 +0200 Subject: [PATCH 038/163] test: useCalendar --- packages/react-time/src/tests/useCalendar.test.tsx | 6 ++---- packages/react-time/src/useCalendar/useCalendar.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 0933e156..65a580b2 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -23,8 +23,6 @@ describe('useCalendar', () => { }, ] - const mockEvent = {} as React.MouseEvent - test('should initialize with the correct view mode and current period', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: 'month' }), @@ -41,7 +39,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.goToPreviousPeriod(mockEvent) + result.current.goToPreviousPeriod() }) const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ @@ -64,7 +62,7 @@ describe('useCalendar', () => { ) act(() => { - result.current.goToNextPeriod(mockEvent) + result.current.goToNextPeriod() }) const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 65c7e982..97746763 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -3,7 +3,7 @@ import { Temporal } from '@js-temporal/polyfill' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' import type { Event } from './useCalendarState' -import type { CSSProperties, MouseEventHandler } from 'react' +import type { CSSProperties } from 'react' export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { const date = Temporal.PlainDate.from(currWeek) From be2e360b69d0ddca18c73afafd3af1ff72396553 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 13:34:17 +0200 Subject: [PATCH 039/163] feat: custom reducer --- .../react-time/src/tests/useCalendar.test.tsx | 27 +++++++++++++++++++ .../react-time/src/useCalendar/useCalendar.ts | 9 ++++--- .../src/useCalendar/useCalendarReducer.ts | 13 ++++----- .../src/useCalendar/useCalendarState.ts | 2 +- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 65a580b2..ba714544 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -2,6 +2,9 @@ import { Temporal } from '@js-temporal/polyfill' import { afterEach, describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' +import { actions } from '../useCalendar/calendarActions'; +import type { UseCalendarAction} from '../useCalendar/calendarActions'; +import type { UseCalendarState } from '../useCalendar/useCalendarState'; describe('useCalendar', () => { afterEach(() => { @@ -287,4 +290,28 @@ describe('useCalendar', () => { Temporal.Now.plainDateISO(), ) }) + + test(`should allow overriding the reducer`, () => { + const customReducer = (state: UseCalendarState, action: UseCalendarAction) => { + if (action.type === actions.goToNextPeriod().type) { + return { + ...state, + currPeriod: state.currPeriod.add({ months: 2 }), + } + } + + return state + } + + const { result } = renderHook(() => + useCalendar({ events, viewMode: 'month', reducer: customReducer }) + ) + + act(() => { + result.current.goToNextPeriod() + }) + + const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 2 }) + expect(result.current.currPeriod).toEqual(expectedNextMonth) + }); }); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 97746763..a24629aa 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -2,7 +2,8 @@ import { useCallback, useEffect, useMemo } from 'react' import { Temporal } from '@js-temporal/polyfill' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' -import type { Event } from './useCalendarState' +import type { UseCalendarAction} from './calendarActions'; +import type { Event, UseCalendarState } from './useCalendarState' import type { CSSProperties } from 'react' export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { @@ -13,12 +14,13 @@ export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { export const getFirstDayOfMonth = (currMonth: string) => Temporal.PlainDate.from(`${currMonth}-01`) -interface UseCalendarProps { +interface UseCalendarProps { weekStartsOn?: number events?: TEvent[] viewMode: 'month' | 'week' | number locale?: Parameters['0'] onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void + reducer?: (state: TState, action: TAction) => TState } const getChunks = function* (arr: T[], n: number) { @@ -92,6 +94,7 @@ export const useCalendar = ({ viewMode: initialViewMode, locale, onChangeViewMode, + reducer, }: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() const [state, dispatch] = useCalendarReducer({ @@ -99,7 +102,7 @@ export const useCalendar = ({ viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), weekStartsOn, - }) + }, reducer) const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 5aa28d22..70a9954b 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -1,12 +1,12 @@ -import { useReducer } from 'react' +import { useMemo, useReducer } from 'react' import { createReducer } from 'typesafe-actions' import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' import { type UseCalendarAction, actions } from './calendarActions' -import type { CalendarState } from './useCalendarState' +import type { UseCalendarState } from './useCalendarState' -const createCalendarReducer = (initialState: CalendarState) => { - return createReducer(initialState) +const createCalendarReducer = (initialState: UseCalendarState) => { + return createReducer(initialState) .handleAction(actions.setCurrentPeriod, (state, action) => ({ ...state, currPeriod: action.payload, @@ -90,10 +90,11 @@ const createCalendarReducer = (initialState: CalendarState) => { } export const useCalendarReducer = < - TState extends CalendarState = CalendarState, + TState extends UseCalendarState = UseCalendarState, >( initialState: TState, + extReducer?: (state: TState, action: UseCalendarAction) => TState, ) => { - const reducer = createCalendarReducer(initialState) + const reducer = useMemo(() => extReducer ?? createCalendarReducer(initialState), [extReducer, initialState]) return useReducer(reducer, initialState) } diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index cd57a883..a2d36e49 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -7,7 +7,7 @@ export interface Event { title: string; } -export interface CalendarState { +export interface UseCalendarState { currPeriod: Temporal.PlainDate; viewMode: 'month' | 'week' | number; currentTime: Temporal.PlainDateTime; From 4ccd56bdf108ad2262a0d7f1c12b0b8575ff0228 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 13:37:37 +0200 Subject: [PATCH 040/163] docs: tsdocs --- .../react-time/src/useCalendar/useCalendar.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index a24629aa..30ddfe50 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -15,11 +15,30 @@ export const getFirstDayOfMonth = (currMonth: string) => Temporal.PlainDate.from(`${currMonth}-01`) interface UseCalendarProps { + /** + * The day of the week the calendar should start on (1 for Monday, 7 for Sunday). + * @default 1 + */ weekStartsOn?: number + /** + * An array of events that the calendar should display. + */ events?: TEvent[] + /** + * The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. + */ viewMode: 'month' | 'week' | number + /** + * The locale to use for formatting dates and times. + */ locale?: Parameters['0'] + /** + * Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. + */ onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void + /** + * Custom reducer function to manage the state of the calendar. + */ reducer?: (state: TState, action: TAction) => TState } @@ -88,6 +107,31 @@ const generateDateRange = ( return dates } +/** + * Hook to manage the state and behavior of a calendar. + * + * @param {UseCalendarProps} props - The configuration properties for the calendar. + * @param {number} [props.weekStartsOn=1] - The day of the week the calendar should start on (1 for Monday, 7 for Sunday). + * @param {TEvent[]} [props.events] - An array of events that the calendar should display. + * @param {'month' | 'week' | number} props.viewMode - The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. + * @param {Intl.LocalesArgument} [props.locale] - The locale to use for formatting dates and times. + * @param {Function} [props.onChangeViewMode] - Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. + * @param {Function} [props.reducer] - Custom reducer function to manage the state of the calendar. + * + * @returns {Object} calendarState - The state and functions for managing the calendar. + * @returns {Temporal.PlainDate} calendarState.firstDayOfPeriod - The first day of the current period displayed by the calendar. + * @returns {Temporal.PlainDate} calendarState.currPeriod - The current period displayed by the calendar. + * @returns {Function} calendarState.goToPreviousPeriod - Function to navigate to the previous period. + * @returns {Function} calendarState.goToNextPeriod - Function to navigate to the next period. + * @returns {Function} calendarState.goToCurrentPeriod - Function to navigate to the current period. + * @returns {Function} calendarState.goToSpecificPeriod - Function to navigate to a specific period. + * @returns {Array>} calendarState.weeks - The calendar grid, where each cell contains the date and events for that day. + * @returns {string[]} calendarState.daysNames - An array of day names based on the locale and week start day. + * @returns {'month' | 'week' | number} calendarState.viewMode - The current view mode of the calendar. + * @returns {Function} calendarState.changeViewMode - Function to change the view mode of the calendar. + * @returns {Function} calendarState.getEventProps - Function to retrieve the style properties for a specific event based on its ID. + * @returns {Function} calendarState.currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. + */ export const useCalendar = ({ weekStartsOn = 1, events, From cc59409a7aed4a49060dc05dd8b729eed3d77205 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 13:37:45 +0200 Subject: [PATCH 041/163] docs: tsdocs --- docs/framework/react/reference/useCalendar.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index a53e07f6..620e1fef 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -32,6 +32,8 @@ export function useCalendar({ - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. - `onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void` - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. +- `reducer?: (state: CalendarState, action: CalendarAction) => CalendarState` + - This parameter is an optional custom reducer function that can be used to manage the state of the calendar. #### Returns From 8d51b58e3e4a2dde91b817c07bd268a7602027f4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 13:46:28 +0200 Subject: [PATCH 042/163] docs: tsdocs --- packages/react-time/src/useCalendar/useCalendar.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 30ddfe50..e12d456c 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -397,7 +397,6 @@ export const useCalendar = ({ goToSpecificPeriod, weeks, daysNames, - viewMode: state.viewMode, changeViewMode, getEventProps, currentTimeMarkerProps, From 1e7168446066e3be01ff0d233cfe4d0df6a4e89e Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 13:59:02 +0200 Subject: [PATCH 043/163] refactor: useCalendar --- .../react-time/src/useCalendar/calendarActions.ts | 4 ++-- packages/react-time/src/useCalendar/useCalendar.ts | 13 ++++++------- .../src/useCalendar/useCalendarReducer.ts | 8 ++++---- .../react-time/src/useCalendar/useCalendarState.ts | 1 - 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts index aee447fc..3eb69d43 100644 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -5,8 +5,8 @@ import type { ActionType } from 'typesafe-actions'; const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); -const goToNextPeriod = createAction('SET_NEXT_PERIOD')(); -const goToPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')(); +const goToNextPeriod = createAction('SET_NEXT_PERIOD')<{ weekStartsOn: number }>(); +const goToPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')<{ weekStartsOn: number }>(); export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, goToNextPeriod, goToPreviousPeriod }; export type UseCalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index e12d456c..e12c438d 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -145,7 +145,6 @@ export const useCalendar = ({ currPeriod: today, viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), - weekStartsOn, }, reducer) const firstDayOfMonth = getFirstDayOfMonth( @@ -154,7 +153,7 @@ export const useCalendar = ({ const firstDayOfWeek = getFirstDayOfWeek( state.currPeriod.toString(), - state.weekStartsOn, + weekStartsOn, ) const days = @@ -162,7 +161,7 @@ export const useCalendar = ({ ? Array.from( getChunks( generateDateRange( - firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - state.weekStartsOn + 7) % 7 }), + firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }), firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }), ), 7, @@ -239,12 +238,12 @@ export const useCalendar = ({ : [daysWithEvents] const goToPreviousPeriod = useCallback(() => { - dispatch(actions.goToPreviousPeriod()) - }, [dispatch]) + dispatch(actions.goToPreviousPeriod({ weekStartsOn })) + }, [dispatch, weekStartsOn]) const goToNextPeriod = useCallback(() => { - dispatch(actions.goToNextPeriod()); - }, [dispatch]) + dispatch(actions.goToNextPeriod({ weekStartsOn })) + }, [dispatch, weekStartsOn]) const goToCurrentPeriod = useCallback(() => { dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())) diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 70a9954b..b8d635bb 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -19,13 +19,13 @@ const createCalendarReducer = (initialState: UseCalendarState) => { ...state, currentTime: action.payload, })) - .handleAction(actions.goToPreviousPeriod, (state) => { + .handleAction(actions.goToPreviousPeriod, (state, action) => { const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) const firstDayOfWeek = getFirstDayOfWeek( state.currPeriod.toString(), - state.weekStartsOn, + action.payload.weekStartsOn, ) switch (state.viewMode) { @@ -54,13 +54,13 @@ const createCalendarReducer = (initialState: UseCalendarState) => { } } }) - .handleAction(actions.goToNextPeriod, (state) => { + .handleAction(actions.goToNextPeriod, (state, action) => { const firstDayOfMonth = getFirstDayOfMonth( state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ) const firstDayOfWeek = getFirstDayOfWeek( state.currPeriod.toString(), - state.weekStartsOn, + action.payload.weekStartsOn, ) switch (state.viewMode) { diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index a2d36e49..dd3679b2 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -11,5 +11,4 @@ export interface UseCalendarState { currPeriod: Temporal.PlainDate; viewMode: 'month' | 'week' | number; currentTime: Temporal.PlainDateTime; - weekStartsOn: number; } From e134065f530bf5330a4ac797b0968f48532d6d95 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 16:40:27 +0200 Subject: [PATCH 044/163] refactor: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 9 +- .../react-time/src/useCalendar/useCalendar.ts | 309 ++++++------------ .../src/useCalendar/useCalendarReducer.ts | 26 +- 3 files changed, 111 insertions(+), 233 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index ba714544..4f524624 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -2,7 +2,6 @@ import { Temporal } from '@js-temporal/polyfill' import { afterEach, describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' -import { actions } from '../useCalendar/calendarActions'; import type { UseCalendarAction} from '../useCalendar/calendarActions'; import type { UseCalendarState } from '../useCalendar/useCalendarState'; @@ -31,8 +30,8 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: 'month' }), ) expect(result.current.viewMode).toBe('month') - expect(result.current.currPeriod).toBe( - Temporal.Now.plainDateISO().toString({ calendarName: 'auto' }), + expect(result.current.currPeriod.toString()).toBe( + Temporal.Now.plainDateISO().toString(), ) }) @@ -99,7 +98,7 @@ describe('useCalendar', () => { result.current.goToSpecificPeriod(Temporal.PlainDate.from('2024-06-01')) }) - expect(result.current.currPeriod).toBe('2024-06-01') + expect(result.current.currPeriod.toString()).toBe('2024-06-01') }) test('should return the correct props for an event', () => { @@ -293,7 +292,7 @@ describe('useCalendar', () => { test(`should allow overriding the reducer`, () => { const customReducer = (state: UseCalendarState, action: UseCalendarAction) => { - if (action.type === actions.goToNextPeriod().type) { + if (action.type === 'SET_NEXT_PERIOD') { return { ...state, currPeriod: state.currPeriod.add({ months: 2 }), diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index e12c438d..d91929fb 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo } from 'react' +import { useCallback, useEffect, useMemo, useTransition } from 'react' import { Temporal } from '@js-temporal/polyfill' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' @@ -54,39 +54,14 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { const events: TEvent[] = [] let currentDay = startDate - while ( - Temporal.PlainDate.compare( - currentDay.toPlainDate(), - endDate.toPlainDate(), - ) < 0 - ) { - const startOfCurrentDay = currentDay.with({ - hour: 0, - minute: 0, - second: 0, - millisecond: 0, - }) - const endOfCurrentDay = currentDay.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }) + while (Temporal.PlainDate.compare(currentDay.toPlainDate(), endDate.toPlainDate()) < 0) { + const startOfCurrentDay = currentDay.with({ hour: 0, minute: 0, second: 0, millisecond: 0 }) + const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999 }) - const eventStart = - Temporal.PlainDateTime.compare(currentDay, startDate) === 0 - ? startDate - : startOfCurrentDay - const eventEnd = - Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 - ? endDate - : endOfCurrentDay - - events.push({ - ...event, - startDate: eventStart, - endDate: eventEnd, - }) + const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate : startOfCurrentDay + const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate : endOfCurrentDay + + events.push({ ...event, startDate: eventStart, endDate: eventEnd }) currentDay = startOfCurrentDay.add({ days: 1 }) } @@ -94,10 +69,7 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { return events } -const generateDateRange = ( - start: Temporal.PlainDate, - end: Temporal.PlainDate, -) => { +const generateDateRange = (start: Temporal.PlainDate, end: Temporal.PlainDate) => { const dates: Temporal.PlainDate[] = [] let current = start while (Temporal.PlainDate.compare(current, end) <= 0) { @@ -146,59 +118,23 @@ export const useCalendar = ({ viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), }, reducer) - - const firstDayOfMonth = getFirstDayOfMonth( - state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), - ) - - const firstDayOfWeek = getFirstDayOfWeek( - state.currPeriod.toString(), - weekStartsOn, - ) - - const days = - state.viewMode === 'month' - ? Array.from( - getChunks( - generateDateRange( - firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }), - firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }), - ), - 7, - ), - ).flat() - : state.viewMode === 'week' - ? Array.from( - getChunks( - generateDateRange( - firstDayOfWeek, - firstDayOfWeek.add({ days: 6 }), - ), - 7, - ), - ).flat() - : Array.from( - getChunks( - generateDateRange( - state.currPeriod, - state.currPeriod.add({ days: state.viewMode - 1 }), - ), - state.viewMode, - ), - ).flat() + + const firstDayOfMonth = useMemo(() => getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)), [state.currPeriod]) + + const firstDayOfWeek = useMemo(() => getFirstDayOfWeek(state.currPeriod.toString(), weekStartsOn), [state.currPeriod, weekStartsOn]) + + const days = useMemo(() => { + const start = state.viewMode === 'month' ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }) : firstDayOfWeek + const end = state.viewMode === 'month' ? firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }) : firstDayOfWeek.add({ days: 6 }) + return Array.from(getChunks(generateDateRange(start, end), 7)).flat() + }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]) const eventMap = useMemo(() => { const map = new Map() - events?.forEach((event) => { const eventStartDate = Temporal.PlainDateTime.from(event.startDate) const eventEndDate = Temporal.PlainDateTime.from(event.endDate) - if ( - Temporal.PlainDate.compare( - eventStartDate.toPlainDate(), - eventEndDate.toPlainDate(), - ) !== 0 - ) { + if (Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0) { const splitEvents = splitMultiDayEvents(event) splitEvents.forEach((splitEvent) => { const splitKey = splitEvent.startDate.toString().split('T')[0] @@ -215,147 +151,108 @@ export const useCalendar = ({ } } }) - return map }, [events]) - const daysWithEvents = days.map((day) => { + const daysWithEvents = useMemo(() => days.map((day) => { const dayKey = day.toString() const dailyEvents = eventMap.get(dayKey) ?? [] const isInCurrentPeriod = day.month === state.currPeriod.month + return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod } + }), [days, eventMap, state.currPeriod]) - return { - date: day, - events: dailyEvents, - isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, - isInCurrentPeriod, - } - }) + const weeks = useMemo(() => state.viewMode === 'month' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents], [state.viewMode, daysWithEvents]) - const weeks = - state.viewMode === 'month' - ? [...getChunks(daysWithEvents, 7)] - : [daysWithEvents] + const [isPending, startTransition] = useTransition() - const goToPreviousPeriod = useCallback(() => { - dispatch(actions.goToPreviousPeriod({ weekStartsOn })) - }, [dispatch, weekStartsOn]) + const goToPreviousPeriod = useCallback(() => startTransition(() => dispatch(actions.goToPreviousPeriod({ weekStartsOn }))), [dispatch, weekStartsOn]) - const goToNextPeriod = useCallback(() => { - dispatch(actions.goToNextPeriod({ weekStartsOn })) - }, [dispatch, weekStartsOn]) + const goToNextPeriod = useCallback(() => startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), [dispatch, weekStartsOn]) - const goToCurrentPeriod = useCallback(() => { - dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())) - }, [dispatch]) + const goToCurrentPeriod = useCallback(() => startTransition(() => dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO()))), [dispatch]) - const goToSpecificPeriod = useCallback( - (date: Temporal.PlainDate) => { - dispatch(actions.setCurrentPeriod(date)) - }, - [dispatch], - ) + const goToSpecificPeriod = useCallback((date: Temporal.PlainDate) => startTransition(() => dispatch(actions.setCurrentPeriod(date))), [dispatch]) - const changeViewMode = useCallback( - (newViewMode: 'month' | 'week' | number) => { + const changeViewMode = useCallback((newViewMode: 'month' | 'week' | number) => { + startTransition(() => { dispatch(actions.setViewMode(newViewMode)) onChangeViewMode?.(newViewMode) - }, - [dispatch, onChangeViewMode], - ) + }) + }, [dispatch, onChangeViewMode]) - const getEventProps = useCallback( - (id: Event['id']): { style: CSSProperties } | null => { - const event = [...eventMap.values()] - .flat() - .find((currEvent) => currEvent.id === id) - if (!event) return null + const getEventProps = useCallback((id: Event['id']): { style: CSSProperties } | null => { + const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id) + if (!event) return null - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0 - const isSplitEvent = - Temporal.PlainDate.compare( - eventStartDate.toPlainDate(), - eventEndDate.toPlainDate(), - ) !== 0 - - let percentageOfDay - let eventHeightInMinutes - - if (isSplitEvent) { - const isStartPart = - eventStartDate.hour !== 0 || eventStartDate.minute !== 0 - if (isStartPart) { - const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes - } else { - percentageOfDay = 0 - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - } - } else { - const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute + let percentageOfDay + let eventHeightInMinutes + + if (isSplitEvent) { + const isStartPart = eventStartDate.hour !== 0 || eventStartDate.minute !== 0 + if (isStartPart) { + const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes + } else { + percentageOfDay = 0 + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute } + } else { + const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes + } - const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) - - const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate) - const eEndDate = Temporal.PlainDateTime.from(e.endDate) - return ( - (e.id !== id && - Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) - ) - }) - - const eventIndex = overlappingEvents.findIndex((e) => e.id === id) - const totalOverlaps = overlappingEvents.length - const sidePadding = 2 - const innerPadding = 2 - const totalInnerPadding = (totalOverlaps - 1) * innerPadding - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding - const eventWidth = - totalOverlaps > 0 - ? availableWidth / totalOverlaps - : 100 - 2 * sidePadding - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - - if (state.viewMode === 'week' || typeof state.viewMode === 'number') { - return { - style: { - position: 'absolute', - top: `min(${percentageOfDay}%, calc(100% - 55px))`, - left: `${eventLeft}%`, - width: `${eventWidth}%`, - margin: 0, - height: `${eventHeight}%`, - }, - } + const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) + + const overlappingEvents = [...eventMap.values()].flat().filter((e) => { + const eStartDate = Temporal.PlainDateTime.from(e.startDate) + const eEndDate = Temporal.PlainDateTime.from(e.endDate) + return ( + (e.id !== id && + Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) + ) + }) + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id) + const totalOverlaps = overlappingEvents.length + const sidePadding = 2 + const innerPadding = 2 + const totalInnerPadding = (totalOverlaps - 1) * innerPadding + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding + const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) + + if (state.viewMode === 'week' || typeof state.viewMode === 'number') { + return { + style: { + position: 'absolute', + top: `min(${percentageOfDay}%, calc(100% - 55px))`, + left: `${eventLeft}%`, + width: `${eventWidth}%`, + margin: 0, + height: `${eventHeight}%`, + }, } + } - return null - }, - [eventMap, state.viewMode], - ) + return null + }, [eventMap, state.viewMode]) useEffect(() => { - const intervalId = setInterval(() => { - dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())) - }, 60000) - + const intervalId = setInterval(() => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), 60000) return () => clearInterval(intervalId) }, [dispatch]) @@ -376,7 +273,7 @@ export const useCalendar = ({ const daysNames = useMemo(() => { const baseDate = Temporal.PlainDate.from('2024-01-01') - return Array.from({ length: 7 }).map((_, i) => + return Array.from({ length: 7 }).map((_, i) => baseDate.add({ days: (i + weekStartsOn - 1) % 7 }) .toLocaleString(locale, { weekday: 'short' }) ) @@ -384,12 +281,7 @@ export const useCalendar = ({ return { ...state, - firstDayOfPeriod: - state.viewMode === 'month' - ? firstDayOfMonth - : state.viewMode === 'week' - ? firstDayOfWeek - : state.currPeriod, + firstDayOfPeriod: state.viewMode === 'month' ? firstDayOfMonth : state.viewMode === 'week' ? firstDayOfWeek : state.currPeriod, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, @@ -399,5 +291,6 @@ export const useCalendar = ({ changeViewMode, getEventProps, currentTimeMarkerProps, + isPending } -} +} \ No newline at end of file diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index b8d635bb..0789b6cf 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -20,13 +20,8 @@ const createCalendarReducer = (initialState: UseCalendarState) => { currentTime: action.payload, })) .handleAction(actions.goToPreviousPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth( - state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), - ) - const firstDayOfWeek = getFirstDayOfWeek( - state.currPeriod.toString(), - action.payload.weekStartsOn, - ) + const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)) + const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn) switch (state.viewMode) { case 'month': { @@ -44,9 +39,7 @@ const createCalendarReducer = (initialState: UseCalendarState) => { } } default: { - const prevCustomStart = state.currPeriod.subtract({ - days: state.viewMode, - }) + const prevCustomStart = state.currPeriod.subtract({ days: state.viewMode }) return { ...state, currPeriod: prevCustomStart, @@ -55,13 +48,8 @@ const createCalendarReducer = (initialState: UseCalendarState) => { } }) .handleAction(actions.goToNextPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth( - state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), - ) - const firstDayOfWeek = getFirstDayOfWeek( - state.currPeriod.toString(), - action.payload.weekStartsOn, - ) + const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)) + const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn) switch (state.viewMode) { case 'month': { @@ -89,9 +77,7 @@ const createCalendarReducer = (initialState: UseCalendarState) => { }) } -export const useCalendarReducer = < - TState extends UseCalendarState = UseCalendarState, ->( +export const useCalendarReducer = ( initialState: TState, extReducer?: (state: TState, action: UseCalendarAction) => TState, ) => { From f3f47ed1999b8671c69fb552d10f260c476226f4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 6 Jun 2024 16:40:34 +0200 Subject: [PATCH 045/163] refactor: useCalendar --- docs/framework/react/reference/useCalendar.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 620e1fef..54542048 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -66,6 +66,8 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `currentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - This function is used to retrieve the style properties and current time for the current time marker. +- `isPending: boolean` + - This value represents whether the calendar is in a pending state. #### Example Usage From 1ee814a0e68ae2ef2cddd07dd051a01e4bb222e6 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 9 Jun 2024 18:08:14 +0200 Subject: [PATCH 046/163] refactor: change viewMode type --- .../react-time/src/tests/useCalendar.test.tsx | 40 ++++++------- .../src/useCalendar/calendarActions.ts | 3 +- .../react-time/src/useCalendar/useCalendar.ts | 37 ++++++------ .../src/useCalendar/useCalendarReducer.ts | 56 ++++++++++--------- .../src/useCalendar/useCalendarState.ts | 19 ++++--- 5 files changed, 82 insertions(+), 73 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 4f524624..bfecedc7 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -27,9 +27,9 @@ describe('useCalendar', () => { test('should initialize with the correct view mode and current period', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), + useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) - expect(result.current.viewMode).toBe('month') + expect(result.current.viewMode).toEqual({ value: 1, unit: 'months' }) expect(result.current.currPeriod.toString()).toBe( Temporal.Now.plainDateISO().toString(), ) @@ -37,7 +37,7 @@ describe('useCalendar', () => { test('should navigate to the previous period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), + useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) act(() => { @@ -60,7 +60,7 @@ describe('useCalendar', () => { test('should navigate to the next period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), + useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) act(() => { @@ -79,19 +79,19 @@ describe('useCalendar', () => { test('should change view mode correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), + useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) act(() => { - result.current.changeViewMode('week') + result.current.changeViewMode({ value: 1, unit: 'weeks' }) }) - expect(result.current.viewMode).toBe('week') + expect(result.current.viewMode).toEqual({ value: 1, unit: 'weeks' }) }) test('should select a day correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month' }), + useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) act(() => { @@ -103,7 +103,7 @@ describe('useCalendar', () => { test('should return the correct props for an event', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'week' }), + useCalendar({ events, viewMode: { value: 1, unit: 'weeks' } }), ) const eventProps = result.current.getEventProps('1') @@ -136,7 +136,7 @@ describe('useCalendar', () => { }, ] const { result } = renderHook(() => - useCalendar({ events: overlappingEvents, viewMode: 'week' }), + useCalendar({ events: overlappingEvents, viewMode: { value: 1, unit: 'weeks' } }), ) const event1Props = result.current.getEventProps('1') @@ -169,7 +169,7 @@ describe('useCalendar', () => { vi.setSystemTime(new Date('2024-06-01T11:00:00')); const { result } = renderHook(() => - useCalendar({ events, viewMode: 'week' }), + useCalendar({ events, viewMode: { value: 1, unit: 'weeks' } }), ) const currentTimeMarkerProps = result.current.currentTimeMarkerProps() @@ -188,7 +188,7 @@ describe('useCalendar', () => { vi.setSystemTime(new Date('2024-06-01T11:00:00')); const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }), ); const { weeks } = result.current; @@ -202,14 +202,14 @@ describe('useCalendar', () => { test('should return the correct day names based on weekStartsOn', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US', weekStartsOn: 1 }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 1 }) ); const { daysNames } = result.current; expect(daysNames).toEqual(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']); const { result: resultSundayStart } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US', weekStartsOn: 7 }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 7 }) ); const { daysNames: sundayDaysNames } = resultSundayStart.current; @@ -219,7 +219,7 @@ describe('useCalendar', () => { test('should correctly mark days as in current period', () => { vi.setSystemTime(new Date('2024-06-01T11:00:00')); const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) ); const { weeks } = result.current; @@ -235,7 +235,7 @@ describe('useCalendar', () => { }); test('should navigate to a specific period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: 'month', locale: 'en-US' })) + const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'months' } })) const specificDate = Temporal.PlainDate.from('2024-05-15') act(() => { @@ -247,7 +247,7 @@ describe('useCalendar', () => { test('should navigate to the previous period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) ) act(() => { @@ -263,7 +263,7 @@ describe('useCalendar', () => { test('should navigate to the next period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) ) act(() => { @@ -277,7 +277,7 @@ describe('useCalendar', () => { test('should reset to the current period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) ) act(() => { @@ -303,7 +303,7 @@ describe('useCalendar', () => { } const { result } = renderHook(() => - useCalendar({ events, viewMode: 'month', reducer: customReducer }) + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, reducer: customReducer }), ) act(() => { diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts index 3eb69d43..abf5c73b 100644 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ b/packages/react-time/src/useCalendar/calendarActions.ts @@ -1,8 +1,9 @@ import { createAction } from 'typesafe-actions'; import type { Temporal } from '@js-temporal/polyfill'; import type { ActionType } from 'typesafe-actions'; +import type { UseCalendarState } from './useCalendarState'; -const setViewMode = createAction('SET_VIEW_MODE')<'month' | 'week' | number>(); +const setViewMode = createAction('SET_VIEW_MODE')(); const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); const goToNextPeriod = createAction('SET_NEXT_PERIOD')<{ weekStartsOn: number }>(); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index d91929fb..9aaef02d 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -27,7 +27,7 @@ interface UseCalendarProps void + onChangeViewMode?: (viewMode: UseCalendarState['viewMode']) => void /** * Custom reducer function to manage the state of the calendar. */ @@ -113,6 +113,7 @@ export const useCalendar = ({ reducer, }: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() + const [isPending, startTransition] = useTransition() const [state, dispatch] = useCalendarReducer({ currPeriod: today, viewMode: initialViewMode, @@ -124,10 +125,10 @@ export const useCalendar = ({ const firstDayOfWeek = useMemo(() => getFirstDayOfWeek(state.currPeriod.toString(), weekStartsOn), [state.currPeriod, weekStartsOn]) const days = useMemo(() => { - const start = state.viewMode === 'month' ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }) : firstDayOfWeek - const end = state.viewMode === 'month' ? firstDayOfMonth.add({ months: 1 }).subtract({ days: 1 }) : firstDayOfWeek.add({ days: 6 }) - return Array.from(getChunks(generateDateRange(start, end), 7)).flat() - }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]) + const start = state.viewMode.unit === 'months' ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }) : firstDayOfWeek; + const end = state.viewMode.unit === 'months' ? firstDayOfMonth.add({ months: state.viewMode.value }).subtract({ days: 1 }) : firstDayOfWeek.add({ days: 6 }); + return Array.from(getChunks(generateDateRange(start, end), 7)).flat(); + }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]); const eventMap = useMemo(() => { const map = new Map() @@ -161,9 +162,7 @@ export const useCalendar = ({ return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod } }), [days, eventMap, state.currPeriod]) - const weeks = useMemo(() => state.viewMode === 'month' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents], [state.viewMode, daysWithEvents]) - - const [isPending, startTransition] = useTransition() + const weeks = useMemo(() => state.viewMode.unit === 'months' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents], [state.viewMode, daysWithEvents]) const goToPreviousPeriod = useCallback(() => startTransition(() => dispatch(actions.goToPreviousPeriod({ weekStartsOn }))), [dispatch, weekStartsOn]) @@ -173,12 +172,12 @@ export const useCalendar = ({ const goToSpecificPeriod = useCallback((date: Temporal.PlainDate) => startTransition(() => dispatch(actions.setCurrentPeriod(date))), [dispatch]) - const changeViewMode = useCallback((newViewMode: 'month' | 'week' | number) => { + const changeViewMode = useCallback((newViewMode: UseCalendarState['viewMode']) => { startTransition(() => { - dispatch(actions.setViewMode(newViewMode)) - onChangeViewMode?.(newViewMode) - }) - }, [dispatch, onChangeViewMode]) + dispatch(actions.setViewMode(newViewMode)); + onChangeViewMode?.(newViewMode); + }); + }, [dispatch, onChangeViewMode]); const getEventProps = useCallback((id: Event['id']): { style: CSSProperties } | null => { const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id) @@ -235,7 +234,9 @@ export const useCalendar = ({ const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - if (state.viewMode === 'week' || typeof state.viewMode === 'number') { + console.log('state.viewMode.unit', state.viewMode.unit) + + if (state.viewMode.unit === 'weeks' || state.viewMode.unit === 'days') { return { style: { position: 'absolute', @@ -247,8 +248,8 @@ export const useCalendar = ({ }, } } - - return null + + return null }, [eventMap, state.viewMode]) useEffect(() => { @@ -281,7 +282,7 @@ export const useCalendar = ({ return { ...state, - firstDayOfPeriod: state.viewMode === 'month' ? firstDayOfMonth : state.viewMode === 'week' ? firstDayOfWeek : state.currPeriod, + firstDayOfPeriod: state.viewMode.unit === 'months' ? firstDayOfMonth : state.viewMode.unit === 'weeks' ? firstDayOfWeek : state.currPeriod, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 0789b6cf..793c1011 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -20,62 +20,66 @@ const createCalendarReducer = (initialState: UseCalendarState) => { currentTime: action.payload, })) .handleAction(actions.goToPreviousPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)) - const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn) + const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); + const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn); - switch (state.viewMode) { - case 'month': { - const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: 1 }) + switch (state.viewMode.unit) { + case 'months': { + const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: state.viewMode.value }); return { ...state, currPeriod: firstDayOfPrevMonth, - } + }; } - case 'week': { - const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: 1 }) + case 'weeks': { + const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: state.viewMode.value }); return { ...state, currPeriod: firstDayOfPrevWeek, - } + }; } - default: { - const prevCustomStart = state.currPeriod.subtract({ days: state.viewMode }) + case 'days': { + const prevCustomStart = state.currPeriod.subtract({ days: state.viewMode.value }); return { ...state, currPeriod: prevCustomStart, - } + }; } + default: + return state; } }) .handleAction(actions.goToNextPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)) - const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn) + const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); + const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn); - switch (state.viewMode) { - case 'month': { - const firstDayOfNextMonth = firstDayOfMonth.add({ months: 1 }) + switch (state.viewMode.unit) { + case 'months': { + const firstDayOfNextMonth = firstDayOfMonth.add({ months: state.viewMode.value }); return { ...state, currPeriod: firstDayOfNextMonth, - } + }; } - case 'week': { - const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: 1 }) + case 'weeks': { + const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: state.viewMode.value }); return { ...state, currPeriod: firstDayOfNextWeek, - } + }; } - default: { - const nextCustomStart = state.currPeriod.add({ days: state.viewMode }) + case 'days': { + const nextCustomStart = state.currPeriod.add({ days: state.viewMode.value }); return { ...state, currPeriod: nextCustomStart, - } + }; } + default: + return state; } - }) -} + }); +}; export const useCalendarReducer = ( initialState: TState, diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index dd3679b2..b5a48fb9 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -1,14 +1,17 @@ -import type { Temporal } from '@js-temporal/polyfill'; +import type { Temporal } from '@js-temporal/polyfill' export interface Event { - id: string; - startDate: Temporal.PlainDateTime; - endDate: Temporal.PlainDateTime; - title: string; + id: string + startDate: Temporal.PlainDateTime + endDate: Temporal.PlainDateTime + title: string } export interface UseCalendarState { - currPeriod: Temporal.PlainDate; - viewMode: 'month' | 'week' | number; - currentTime: Temporal.PlainDateTime; + currPeriod: Temporal.PlainDate + viewMode: { + value: number + unit: 'months' | 'weeks' | 'days' + } + currentTime: Temporal.PlainDateTime } From c2419defb9c6aa6c5794d77a0fd0cecbc1eef00d Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 9 Jun 2024 18:08:58 +0200 Subject: [PATCH 047/163] refactor: change viewMode type --- packages/react-time/src/useCalendar/useCalendar.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 9aaef02d..478cfc0f 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -234,8 +234,6 @@ export const useCalendar = ({ const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - console.log('state.viewMode.unit', state.viewMode.unit) - if (state.viewMode.unit === 'weeks' || state.viewMode.unit === 'days') { return { style: { From 215f7227b6ae8434500cbdb3d93a7ea0ffb0f593 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 9 Jun 2024 18:44:10 +0200 Subject: [PATCH 048/163] fix: missing days in view --- .../react-time/src/useCalendar/useCalendar.ts | 345 ++++++++++++------ 1 file changed, 230 insertions(+), 115 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 478cfc0f..06baefa2 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,10 +1,11 @@ +import type { CSSProperties } from 'react' import { useCallback, useEffect, useMemo, useTransition } from 'react' import { Temporal } from '@js-temporal/polyfill' + +import type { UseCalendarAction } from './calendarActions' +import type { Event, UseCalendarState } from './useCalendarState' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' -import type { UseCalendarAction} from './calendarActions'; -import type { Event, UseCalendarState } from './useCalendarState' -import type { CSSProperties } from 'react' export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { const date = Temporal.PlainDate.from(currWeek) @@ -14,7 +15,10 @@ export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { export const getFirstDayOfMonth = (currMonth: string) => Temporal.PlainDate.from(`${currMonth}-01`) -interface UseCalendarProps { +interface UseCalendarProps< + TEvent extends Event, + TState extends UseCalendarState = UseCalendarState, +> { /** * The day of the week the calendar should start on (1 for Monday, 7 for Sunday). * @default 1 @@ -39,7 +43,10 @@ interface UseCalendarProps(state: TState, action: TAction) => TState + reducer?: ( + state: TState, + action: TAction, + ) => TState } const getChunks = function* (arr: T[], n: number) { @@ -54,12 +61,33 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { const events: TEvent[] = [] let currentDay = startDate - while (Temporal.PlainDate.compare(currentDay.toPlainDate(), endDate.toPlainDate()) < 0) { - const startOfCurrentDay = currentDay.with({ hour: 0, minute: 0, second: 0, millisecond: 0 }) - const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999 }) + while ( + Temporal.PlainDate.compare( + currentDay.toPlainDate(), + endDate.toPlainDate(), + ) < 0 + ) { + const startOfCurrentDay = currentDay.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }) + const endOfCurrentDay = currentDay.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }) - const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate : startOfCurrentDay - const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate : endOfCurrentDay + const eventStart = + Temporal.PlainDateTime.compare(currentDay, startDate) === 0 + ? startDate + : startOfCurrentDay + const eventEnd = + Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 + ? endDate + : endOfCurrentDay events.push({ ...event, startDate: eventStart, endDate: eventEnd }) @@ -69,7 +97,10 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { return events } -const generateDateRange = (start: Temporal.PlainDate, end: Temporal.PlainDate) => { +const generateDateRange = ( + start: Temporal.PlainDate, + end: Temporal.PlainDate, +) => { const dates: Temporal.PlainDate[] = [] let current = start while (Temporal.PlainDate.compare(current, end) <= 0) { @@ -114,28 +145,62 @@ export const useCalendar = ({ }: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() const [isPending, startTransition] = useTransition() - const [state, dispatch] = useCalendarReducer({ - currPeriod: today, - viewMode: initialViewMode, - currentTime: Temporal.Now.plainDateTimeISO(), - }, reducer) - - const firstDayOfMonth = useMemo(() => getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)), [state.currPeriod]) - - const firstDayOfWeek = useMemo(() => getFirstDayOfWeek(state.currPeriod.toString(), weekStartsOn), [state.currPeriod, weekStartsOn]) + const [state, dispatch] = useCalendarReducer( + { + currPeriod: today, + viewMode: initialViewMode, + currentTime: Temporal.Now.plainDateTimeISO(), + }, + reducer, + ) + + const firstDayOfMonth = useMemo( + () => + getFirstDayOfMonth( + state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ), + [state.currPeriod], + ) + + const firstDayOfWeek = useMemo( + () => getFirstDayOfWeek(state.currPeriod.toString(), weekStartsOn), + [state.currPeriod, weekStartsOn], + ) const days = useMemo(() => { - const start = state.viewMode.unit === 'months' ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 }) : firstDayOfWeek; - const end = state.viewMode.unit === 'months' ? firstDayOfMonth.add({ months: state.viewMode.value }).subtract({ days: 1 }) : firstDayOfWeek.add({ days: 6 }); - return Array.from(getChunks(generateDateRange(start, end), 7)).flat(); - }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]); + const start = + state.viewMode.unit === 'months' + ? firstDayOfMonth.subtract({ + days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7, + }) + : firstDayOfWeek + + let end + if (state.viewMode.unit === 'months') { + const lastDayOfMonth = firstDayOfMonth + .add({ months: state.viewMode.value }) + .subtract({ days: 1 }) + const lastDayOfMonthWeekDay = + (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) + } else { + end = firstDayOfWeek.add({ days: 6 }) + } + + return Array.from(getChunks(generateDateRange(start, end), 7)).flat() + }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]) const eventMap = useMemo(() => { const map = new Map() events?.forEach((event) => { const eventStartDate = Temporal.PlainDateTime.from(event.startDate) const eventEndDate = Temporal.PlainDateTime.from(event.endDate) - if (Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0) { + if ( + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 + ) { const splitEvents = splitMultiDayEvents(event) splitEvents.forEach((splitEvent) => { const splitKey = splitEvent.startDate.toString().split('T')[0] @@ -155,103 +220,147 @@ export const useCalendar = ({ return map }, [events]) - const daysWithEvents = useMemo(() => days.map((day) => { - const dayKey = day.toString() - const dailyEvents = eventMap.get(dayKey) ?? [] - const isInCurrentPeriod = day.month === state.currPeriod.month + const daysWithEvents = useMemo( + () => + days.map((day) => { + const dayKey = day.toString() + const dailyEvents = eventMap.get(dayKey) ?? [] + const isInCurrentPeriod = day.month === state.currPeriod.month return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod } }), [days, eventMap, state.currPeriod]) const weeks = useMemo(() => state.viewMode.unit === 'months' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents], [state.viewMode, daysWithEvents]) - const goToPreviousPeriod = useCallback(() => startTransition(() => dispatch(actions.goToPreviousPeriod({ weekStartsOn }))), [dispatch, weekStartsOn]) - - const goToNextPeriod = useCallback(() => startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), [dispatch, weekStartsOn]) - - const goToCurrentPeriod = useCallback(() => startTransition(() => dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO()))), [dispatch]) - - const goToSpecificPeriod = useCallback((date: Temporal.PlainDate) => startTransition(() => dispatch(actions.setCurrentPeriod(date))), [dispatch]) - - const changeViewMode = useCallback((newViewMode: UseCalendarState['viewMode']) => { - startTransition(() => { - dispatch(actions.setViewMode(newViewMode)); - onChangeViewMode?.(newViewMode); - }); - }, [dispatch, onChangeViewMode]); - - const getEventProps = useCallback((id: Event['id']): { style: CSSProperties } | null => { - const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id) - if (!event) return null + const goToPreviousPeriod = useCallback( + () => + startTransition(() => + dispatch(actions.goToPreviousPeriod({ weekStartsOn })), + ), + [dispatch, weekStartsOn], + ) + + const goToNextPeriod = useCallback( + () => + startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), + [dispatch, weekStartsOn], + ) + + const goToCurrentPeriod = useCallback( + () => + startTransition(() => + dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())), + ), + [dispatch], + ) + + const goToSpecificPeriod = useCallback( + (date: Temporal.PlainDate) => + startTransition(() => dispatch(actions.setCurrentPeriod(date))), + [dispatch], + ) + + const changeViewMode = useCallback( + (newViewMode: { value: number; unit: 'months' | 'weeks' | 'days' }) => { + startTransition(() => { + dispatch(actions.setViewMode(newViewMode)) + onChangeViewMode?.(newViewMode) + }) + }, + [dispatch, onChangeViewMode], + ) + + const getEventProps = useCallback( + (id: Event['id']): { style: CSSProperties } | null => { + const event = [...eventMap.values()] + .flat() + .find((currEvent) => currEvent.id === id) + if (!event) return null - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) - const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0 - - let percentageOfDay - let eventHeightInMinutes - - if (isSplitEvent) { - const isStartPart = eventStartDate.hour !== 0 || eventStartDate.minute !== 0 - if (isStartPart) { - const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + const isSplitEvent = + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 + + let percentageOfDay + let eventHeightInMinutes + + if (isSplitEvent) { + const isStartPart = + eventStartDate.hour !== 0 || eventStartDate.minute !== 0 + if (isStartPart) { + const eventTimeInMinutes = + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes + } else { + percentageOfDay = 0 + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + } } else { - percentageOfDay = 0 - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + const eventTimeInMinutes = + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes } - } else { - const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes - } - - const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) - - const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate) - const eEndDate = Temporal.PlainDateTime.from(e.endDate) - return ( - (e.id !== id && - Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) - ) - }) - const eventIndex = overlappingEvents.findIndex((e) => e.id === id) - const totalOverlaps = overlappingEvents.length - const sidePadding = 2 - const innerPadding = 2 - const totalInnerPadding = (totalOverlaps - 1) * innerPadding - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding - const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - - if (state.viewMode.unit === 'weeks' || state.viewMode.unit === 'days') { - return { - style: { - position: 'absolute', - top: `min(${percentageOfDay}%, calc(100% - 55px))`, - left: `${eventLeft}%`, - width: `${eventWidth}%`, - margin: 0, - height: `${eventHeight}%`, - }, + const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) + + const overlappingEvents = [...eventMap.values()].flat().filter((e) => { + const eStartDate = Temporal.PlainDateTime.from(e.startDate) + const eEndDate = Temporal.PlainDateTime.from(e.endDate) + return ( + (e.id !== id && + Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) + ) + }) + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id) + const totalOverlaps = overlappingEvents.length + const sidePadding = 2 + const innerPadding = 2 + const totalInnerPadding = (totalOverlaps - 1) * innerPadding + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding + const eventWidth = + totalOverlaps > 0 + ? availableWidth / totalOverlaps + : 100 - 2 * sidePadding + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) + + if (state.viewMode.unit === 'weeks' || state.viewMode.unit === 'days') { + return { + style: { + position: 'absolute', + top: `min(${percentageOfDay}%, calc(100% - 55px))`, + left: `${eventLeft}%`, + width: `${eventWidth}%`, + margin: 0, + height: `${eventHeight}%`, + }, + } } - } - - return null - }, [eventMap, state.viewMode]) + + return null + }, + [eventMap, state.viewMode], + ) useEffect(() => { - const intervalId = setInterval(() => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), 60000) + const intervalId = setInterval( + () => + dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), + 60000, + ) return () => clearInterval(intervalId) }, [dispatch]) @@ -273,14 +382,20 @@ export const useCalendar = ({ const daysNames = useMemo(() => { const baseDate = Temporal.PlainDate.from('2024-01-01') return Array.from({ length: 7 }).map((_, i) => - baseDate.add({ days: (i + weekStartsOn - 1) % 7 }) - .toLocaleString(locale, { weekday: 'short' }) + baseDate + .add({ days: (i + weekStartsOn - 1) % 7 }) + .toLocaleString(locale, { weekday: 'short' }), ) }, [locale, weekStartsOn]) return { ...state, - firstDayOfPeriod: state.viewMode.unit === 'months' ? firstDayOfMonth : state.viewMode.unit === 'weeks' ? firstDayOfWeek : state.currPeriod, + firstDayOfPeriod: + state.viewMode.unit === 'months' + ? firstDayOfMonth + : state.viewMode.unit === 'weeks' + ? firstDayOfWeek + : state.currPeriod, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, @@ -290,6 +405,6 @@ export const useCalendar = ({ changeViewMode, getEventProps, currentTimeMarkerProps, - isPending + isPending, } -} \ No newline at end of file +} From 0f05c00683774e4128a58d991b83773d9beac605 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 13:16:42 +0200 Subject: [PATCH 049/163] refactor: api --- .../react-time/src/tests/useCalendar.test.tsx | 89 ++-- .../react-time/src/useCalendar/useCalendar.ts | 435 +++++++++++------- .../src/useCalendar/useCalendarReducer.ts | 26 +- .../src/useCalendar/useCalendarState.ts | 2 +- 4 files changed, 348 insertions(+), 204 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index bfecedc7..c7753ce3 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,11 +1,14 @@ import { Temporal } from '@js-temporal/polyfill' -import { afterEach, describe, expect, test, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' -import type { UseCalendarAction} from '../useCalendar/calendarActions'; +import type { UseCalendarAction } from '../useCalendar/calendarActions'; import type { UseCalendarState } from '../useCalendar/useCalendarState'; describe('useCalendar', () => { + beforeEach(() => { + vi.setSystemTime(new Date('2024-06-01T11:00:00')); + }); afterEach(() => { vi.useRealTimers(); }); @@ -30,7 +33,7 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), ) expect(result.current.viewMode).toEqual({ value: 1, unit: 'months' }) - expect(result.current.currPeriod.toString()).toBe( + expect(result.current.currentPeriod.toString()).toBe( Temporal.Now.plainDateISO().toString(), ) }) @@ -47,14 +50,9 @@ describe('useCalendar', () => { const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ months: 1, }) - const expectedFirstDayOfPreviousMonth = Temporal.PlainDate.from({ - year: expectedPreviousMonth.year, - month: expectedPreviousMonth.month, - day: 1, - }) - expect(result.current.firstDayOfPeriod).toEqual( - expectedFirstDayOfPreviousMonth, + expect(result.current.currentPeriod).toEqual( + expectedPreviousMonth, ) }) @@ -68,13 +66,8 @@ describe('useCalendar', () => { }) const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) - const expectedFirstDayOfNextMonth = Temporal.PlainDate.from({ - year: expectedNextMonth.year, - month: expectedNextMonth.month, - day: 1, - }) - expect(result.current.firstDayOfPeriod).toEqual(expectedFirstDayOfNextMonth) + expect(result.current.currentPeriod).toEqual(expectedNextMonth) }) test('should change view mode correctly', () => { @@ -98,7 +91,7 @@ describe('useCalendar', () => { result.current.goToSpecificPeriod(Temporal.PlainDate.from('2024-06-01')) }) - expect(result.current.currPeriod.toString()).toBe('2024-06-01') + expect(result.current.currentPeriod.toString()).toBe('2024-06-01') }) test('should return the correct props for an event', () => { @@ -166,8 +159,6 @@ describe('useCalendar', () => { }) test('should return the correct props for the current time marker', () => { - vi.setSystemTime(new Date('2024-06-01T11:00:00')); - const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'weeks' } }), ) @@ -185,13 +176,13 @@ describe('useCalendar', () => { }) test('should render array of days', () => { - vi.setSystemTime(new Date('2024-06-01T11:00:00')); - const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }), ); - const { weeks } = result.current; + const { days } = result.current; + const weeks = result.current.groupDaysBy(days, 'weeks'); + expect(weeks).toHaveLength(5); expect(weeks[0]).toHaveLength(7); @@ -217,12 +208,12 @@ describe('useCalendar', () => { }); test('should correctly mark days as in current period', () => { - vi.setSystemTime(new Date('2024-06-01T11:00:00')); const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) ); - const { weeks } = result.current; + const { days } = result.current; + const weeks = result.current.groupDaysBy(days, 'weeks'); const daysInCurrentPeriod = weeks.flat().map(day => day.isInCurrentPeriod); expect(daysInCurrentPeriod).toEqual([ @@ -242,7 +233,7 @@ describe('useCalendar', () => { result.current.goToSpecificPeriod(specificDate) }) - expect(result.current.currPeriod).toEqual(specificDate) + expect(result.current.currentPeriod).toEqual(specificDate) }) test('should navigate to the previous period correctly', () => { @@ -258,7 +249,7 @@ describe('useCalendar', () => { months: 1, }) - expect(result.current.currPeriod).toEqual(expectedPreviousMonth) + expect(result.current.currentPeriod).toEqual(expectedPreviousMonth) }) test('should navigate to the next period correctly', () => { @@ -272,7 +263,7 @@ describe('useCalendar', () => { const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) - expect(result.current.currPeriod).toEqual(expectedNextMonth) + expect(result.current.currentPeriod).toEqual(expectedNextMonth) }) test('should reset to the current period correctly', () => { @@ -285,7 +276,7 @@ describe('useCalendar', () => { result.current.goToCurrentPeriod() }) - expect(result.current.currPeriod).toEqual( + expect(result.current.currentPeriod).toEqual( Temporal.Now.plainDateISO(), ) }) @@ -295,7 +286,7 @@ describe('useCalendar', () => { if (action.type === 'SET_NEXT_PERIOD') { return { ...state, - currPeriod: state.currPeriod.add({ months: 2 }), + currentPeriod: state.currentPeriod.add({ months: 2 }), } } @@ -311,6 +302,44 @@ describe('useCalendar', () => { }) const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 2 }) - expect(result.current.currPeriod).toEqual(expectedNextMonth) + expect(result.current.currentPeriod).toEqual(expectedNextMonth) + }); + + test('should group days by months correctly', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: { value: 2, unit: 'months' }, locale: 'en-US' }) + ); + + const { days, groupDaysBy } = result.current; + const months = groupDaysBy(days, 'months'); + + expect(months).toHaveLength(2); + expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01'); + expect(months[1]?.[0]?.date.toString()).toBe('2024-07-01'); + }); + + test('should group days by weeks correctly', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + ); + + const { days, groupDaysBy } = result.current; + const weeks = groupDaysBy(days, 'weeks'); + expect(weeks).toHaveLength(5); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); + expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-30'); + }); + + test('should group days by weeks correctly when weekStartsOn is Sunday', () => { + const { result } = renderHook(() => + useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 7 }) + ); + + const { days, groupDaysBy } = result.current; + const weeks = groupDaysBy(days, 'weeks'); + + expect(weeks).toHaveLength(6); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); + expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-29'); }); }); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 06baefa2..082a9f33 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,66 +1,53 @@ -import type { CSSProperties } from 'react' import { useCallback, useEffect, useMemo, useTransition } from 'react' import { Temporal } from '@js-temporal/polyfill' -import type { UseCalendarAction } from './calendarActions' -import type { Event, UseCalendarState } from './useCalendarState' +import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' - -export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { - const date = Temporal.PlainDate.from(currWeek) - return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) -} - -export const getFirstDayOfMonth = (currMonth: string) => - Temporal.PlainDate.from(`${currMonth}-01`) +import type { UseCalendarAction } from './calendarActions' +import type { Event, UseCalendarState } from './useCalendarState' +import type { CSSProperties } from 'react' interface UseCalendarProps< TEvent extends Event, TState extends UseCalendarState = UseCalendarState, > { /** - * The day of the week the calendar should start on (1 for Monday, 7 for Sunday). + * The day of the week the calendar should start on (0 for Sunday, 6 for Saturday). * @default 1 */ - weekStartsOn?: number + weekStartsOn?: number; /** * An array of events that the calendar should display. */ - events?: TEvent[] + events?: TEvent[]; /** * The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. */ - viewMode: UseCalendarState['viewMode'] + viewMode: UseCalendarState['viewMode']; /** * The locale to use for formatting dates and times. */ - locale?: Parameters['0'] + locale?: Parameters['0']; /** * Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. */ - onChangeViewMode?: (viewMode: UseCalendarState['viewMode']) => void + onChangeViewMode?: (viewMode: UseCalendarState['viewMode']) => void; /** * Custom reducer function to manage the state of the calendar. */ reducer?: ( state: TState, action: TAction, - ) => TState -} - -const getChunks = function* (arr: T[], n: number) { - for (let i = 0; i < arr.length; i += n) { - yield arr.slice(i, i + n) - } + ) => TState; } const splitMultiDayEvents = (event: TEvent): TEvent[] => { - const startDate = Temporal.PlainDateTime.from(event.startDate) - const endDate = Temporal.PlainDateTime.from(event.endDate) - const events: TEvent[] = [] + const startDate = Temporal.PlainDateTime.from(event.startDate); + const endDate = Temporal.PlainDateTime.from(event.endDate); + const events: TEvent[] = []; - let currentDay = startDate + let currentDay = startDate; while ( Temporal.PlainDate.compare( currentDay.toPlainDate(), @@ -72,42 +59,42 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { minute: 0, second: 0, millisecond: 0, - }) + }); const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999, - }) + }); const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate - : startOfCurrentDay + : startOfCurrentDay; const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate - : endOfCurrentDay + : endOfCurrentDay; - events.push({ ...event, startDate: eventStart, endDate: eventEnd }) + events.push({ ...event, startDate: eventStart, endDate: eventEnd }); - currentDay = startOfCurrentDay.add({ days: 1 }) + currentDay = startOfCurrentDay.add({ days: 1 }); } - return events + return events; } const generateDateRange = ( start: Temporal.PlainDate, end: Temporal.PlainDate, ) => { - const dates: Temporal.PlainDate[] = [] - let current = start + const dates: Temporal.PlainDate[] = []; + let current = start; while (Temporal.PlainDate.compare(current, end) <= 0) { - dates.push(current) - current = current.add({ days: 1 }) + dates.push(current); + current = current.add({ days: 1 }); } - return dates + return dates; } /** @@ -122,13 +109,12 @@ const generateDateRange = ( * @param {Function} [props.reducer] - Custom reducer function to manage the state of the calendar. * * @returns {Object} calendarState - The state and functions for managing the calendar. - * @returns {Temporal.PlainDate} calendarState.firstDayOfPeriod - The first day of the current period displayed by the calendar. - * @returns {Temporal.PlainDate} calendarState.currPeriod - The current period displayed by the calendar. + * @returns {Temporal.PlainDate} calendarState.currentPeriod - The current period displayed by the calendar. * @returns {Function} calendarState.goToPreviousPeriod - Function to navigate to the previous period. * @returns {Function} calendarState.goToNextPeriod - Function to navigate to the next period. * @returns {Function} calendarState.goToCurrentPeriod - Function to navigate to the current period. * @returns {Function} calendarState.goToSpecificPeriod - Function to navigate to a specific period. - * @returns {Array>} calendarState.weeks - The calendar grid, where each cell contains the date and events for that day. + * @returns {Array>} calendarState.days - The calendar grid, where each cell contains the date and events for that day. * @returns {string[]} calendarState.daysNames - An array of day names based on the locale and week start day. * @returns {'month' | 'week' | number} calendarState.viewMode - The current view mode of the calendar. * @returns {Function} calendarState.changeViewMode - Function to change the view mode of the calendar. @@ -143,93 +129,126 @@ export const useCalendar = ({ onChangeViewMode, reducer, }: UseCalendarProps) => { - const today = Temporal.Now.plainDateISO() - const [isPending, startTransition] = useTransition() + const today = Temporal.Now.plainDateISO(); + const [isPending, startTransition] = useTransition(); const [state, dispatch] = useCalendarReducer( { - currPeriod: today, + currentPeriod: today, viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), }, reducer, - ) + ); const firstDayOfMonth = useMemo( () => getFirstDayOfMonth( - state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + state.currentPeriod.toString({ calendarName: "auto" }).substring(0, 7), ), - [state.currPeriod], - ) + [state.currentPeriod], + ); const firstDayOfWeek = useMemo( - () => getFirstDayOfWeek(state.currPeriod.toString(), weekStartsOn), - [state.currPeriod, weekStartsOn], - ) + () => getFirstDayOfWeek(state.currentPeriod.toString(), weekStartsOn), + [state.currentPeriod, weekStartsOn], + ); - const days = useMemo(() => { + const calendarDays = useMemo(() => { const start = - state.viewMode.unit === 'months' + state.viewMode.unit === "months" ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7, }) - : firstDayOfWeek - - let end - if (state.viewMode.unit === 'months') { - const lastDayOfMonth = firstDayOfMonth - .add({ months: state.viewMode.value }) - .subtract({ days: 1 }) - const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 - end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) - } else { - end = firstDayOfWeek.add({ days: 6 }) + : state.currentPeriod; + + let end; + switch (state.viewMode.unit) { + case "months": { + const lastDayOfMonth = firstDayOfMonth + .add({ months: state.viewMode.value }) + .subtract({ days: 1 }); + const lastDayOfMonthWeekDay = + (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7; + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); + break; + } + case "weeks": { + end = firstDayOfWeek.add({ days: 7 * state.viewMode.value - 1 }); + break; + } + case "days": { + end = state.currentPeriod.add({ days: state.viewMode.value - 1 }); + break; + } } - return Array.from(getChunks(generateDateRange(start, end), 7)).flat() - }, [state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn]) + const allDays = generateDateRange(start, end); + const startMonth = state.currentPeriod.month; + const endMonth = state.currentPeriod.add({ + months: state.viewMode.value - 1, + }).month; + + return allDays.filter( + (day) => day.month >= startMonth && day.month <= endMonth, + ); + }, [ + state.viewMode, + firstDayOfMonth, + firstDayOfWeek, + weekStartsOn, + state.currentPeriod, + ]); const eventMap = useMemo(() => { - const map = new Map() + const map = new Map(); events?.forEach((event) => { - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + const eventStartDate = Temporal.PlainDateTime.from(event.startDate); + const eventEndDate = Temporal.PlainDateTime.from(event.endDate); if ( Temporal.PlainDate.compare( eventStartDate.toPlainDate(), eventEndDate.toPlainDate(), ) !== 0 ) { - const splitEvents = splitMultiDayEvents(event) + const splitEvents = splitMultiDayEvents(event); splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.startDate.toString().split('T')[0] + const splitKey = splitEvent.startDate.toString().split("T")[0]; if (splitKey) { - if (!map.has(splitKey)) map.set(splitKey, []) - map.get(splitKey)?.push(splitEvent) + if (!map.has(splitKey)) map.set(splitKey, []); + map.get(splitKey)?.push(splitEvent); } - }) + }); } else { - const eventKey = event.startDate.toString().split('T')[0] + const eventKey = event.startDate.toString().split("T")[0]; if (eventKey) { - if (!map.has(eventKey)) map.set(eventKey, []) - map.get(eventKey)?.push(event) + if (!map.has(eventKey)) map.set(eventKey, []); + map.get(eventKey)?.push(event); } } - }) - return map - }, [events]) + }); + return map; + }, [events]); const daysWithEvents = useMemo( () => - days.map((day) => { - const dayKey = day.toString() - const dailyEvents = eventMap.get(dayKey) ?? [] - const isInCurrentPeriod = day.month === state.currPeriod.month - return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod } - }), [days, eventMap, state.currPeriod]) - - const weeks = useMemo(() => state.viewMode.unit === 'months' ? [...getChunks(daysWithEvents, 7)] : [daysWithEvents], [state.viewMode, daysWithEvents]) + calendarDays.map((day) => { + const dayKey = day.toString(); + const dailyEvents = eventMap.get(dayKey) ?? []; + const currentMonthRange = Array.from( + { length: state.viewMode.value }, + (_, i) => state.currentPeriod.add({ months: i }).month, + ); + const isInCurrentPeriod = currentMonthRange.includes(day.month); + return { + date: day, + events: dailyEvents, + isToday: + Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, + isInCurrentPeriod, + }; + }), + [calendarDays, eventMap, state.viewMode, state.currentPeriod], + ); const goToPreviousPeriod = useCallback( () => @@ -237,13 +256,13 @@ export const useCalendar = ({ dispatch(actions.goToPreviousPeriod({ weekStartsOn })), ), [dispatch, weekStartsOn], - ) + ); const goToNextPeriod = useCallback( () => startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), [dispatch, weekStartsOn], - ) + ); const goToCurrentPeriod = useCallback( () => @@ -251,67 +270,70 @@ export const useCalendar = ({ dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())), ), [dispatch], - ) + ); const goToSpecificPeriod = useCallback( (date: Temporal.PlainDate) => startTransition(() => dispatch(actions.setCurrentPeriod(date))), [dispatch], - ) + ); const changeViewMode = useCallback( - (newViewMode: { value: number; unit: 'months' | 'weeks' | 'days' }) => { + (newViewMode: { value: number; unit: "months" | "weeks" | "days" }) => { startTransition(() => { - dispatch(actions.setViewMode(newViewMode)) - onChangeViewMode?.(newViewMode) - }) + dispatch(actions.setViewMode(newViewMode)); + onChangeViewMode?.(newViewMode); + }); }, [dispatch, onChangeViewMode], - ) + ); const getEventProps = useCallback( - (id: Event['id']): { style: CSSProperties } | null => { + (id: Event["id"]): { style: CSSProperties } | null => { const event = [...eventMap.values()] .flat() - .find((currEvent) => currEvent.id === id) - if (!event) return null + .find((currEvent) => currEvent.id === id); + if (!event) return null; - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) + const eventStartDate = Temporal.PlainDateTime.from(event.startDate); + const eventEndDate = Temporal.PlainDateTime.from(event.endDate); const isSplitEvent = Temporal.PlainDate.compare( eventStartDate.toPlainDate(), eventEndDate.toPlainDate(), - ) !== 0 + ) !== 0; - let percentageOfDay - let eventHeightInMinutes + let percentageOfDay; + let eventHeightInMinutes; if (isSplitEvent) { const isStartPart = - eventStartDate.hour !== 0 || eventStartDate.minute !== 0 + eventStartDate.hour !== 0 || eventStartDate.minute !== 0; if (isStartPart) { const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes + eventStartDate.hour * 60 + eventStartDate.minute; + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes; } else { - percentageOfDay = 0 - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + percentageOfDay = 0; + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; } } else { const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes + eventStartDate.hour * 60 + eventStartDate.minute; + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes; } - const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) + const eventHeight = Math.min( + (eventHeightInMinutes / (24 * 60)) * 100, + 20, + ); const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate) - const eEndDate = Temporal.PlainDateTime.from(e.endDate) + const eStartDate = Temporal.PlainDateTime.from(e.startDate); + const eEndDate = Temporal.PlainDateTime.from(e.endDate); return ( (e.id !== id && Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && @@ -322,89 +344,182 @@ export const useCalendar = ({ Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) - ) - }) - - const eventIndex = overlappingEvents.findIndex((e) => e.id === id) - const totalOverlaps = overlappingEvents.length - const sidePadding = 2 - const innerPadding = 2 - const totalInnerPadding = (totalOverlaps - 1) * innerPadding - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding + ); + }); + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id); + const totalOverlaps = overlappingEvents.length; + const sidePadding = 2; + const innerPadding = 2; + const totalInnerPadding = (totalOverlaps - 1) * innerPadding; + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding; const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps - : 100 - 2 * sidePadding - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) + : 100 - 2 * sidePadding; + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding); - if (state.viewMode.unit === 'weeks' || state.viewMode.unit === 'days') { + if (state.viewMode.unit === "weeks" || state.viewMode.unit === "days") { return { style: { - position: 'absolute', + position: "absolute", top: `min(${percentageOfDay}%, calc(100% - 55px))`, left: `${eventLeft}%`, width: `${eventWidth}%`, margin: 0, height: `${eventHeight}%`, }, - } + }; } - return null + return null; }, [eventMap, state.viewMode], - ) + ); useEffect(() => { const intervalId = setInterval( () => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), 60000, - ) - return () => clearInterval(intervalId) - }, [dispatch]) + ); + return () => clearInterval(intervalId); + }, [dispatch]); const currentTimeMarkerProps = useCallback(() => { - const { hour, minute } = state.currentTime - const currentTimeInMinutes = hour * 60 + minute - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 + const { hour, minute } = state.currentTime; + const currentTimeInMinutes = hour * 60 + minute; + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; return { style: { - position: 'absolute', + position: "absolute", top: `${percentageOfDay}%`, left: 0, }, - currentTime: state.currentTime.toString().split('T')[1]?.substring(0, 5), - } - }, [state.currentTime]) + currentTime: state.currentTime.toString().split("T")[1]?.substring(0, 5), + }; + }, [state.currentTime]); const daysNames = useMemo(() => { - const baseDate = Temporal.PlainDate.from('2024-01-01') + const baseDate = Temporal.PlainDate.from("2024-01-01"); return Array.from({ length: 7 }).map((_, i) => baseDate .add({ days: (i + weekStartsOn - 1) % 7 }) - .toLocaleString(locale, { weekday: 'short' }), - ) - }, [locale, weekStartsOn]) + .toLocaleString(locale, { weekday: "short" }), + ); + }, [locale, weekStartsOn]); + + const groupDaysBy = useCallback( + ( + days: { + date: Temporal.PlainDate; + events: TEvent[]; + isToday: boolean; + isInCurrentPeriod: boolean; + }[], + unit: "months" | "weeks", + ) => { + const groups: { + date: Temporal.PlainDate; + events: TEvent[]; + isToday: boolean; + isInCurrentPeriod: boolean; + }[][] = []; + + switch (unit) { + case "months": { + let currentMonth: { + date: Temporal.PlainDate; + events: TEvent[]; + isToday: boolean; + isInCurrentPeriod: boolean; + }[] = []; + days.forEach((day) => { + if ( + currentMonth.length > 0 && + day.date.month !== currentMonth[0]?.date.month + ) { + groups.push(currentMonth); + currentMonth = []; + } + currentMonth.push(day); + }); + if (currentMonth.length > 0) { + groups.push(currentMonth); + } + break; + } + + case 'weeks': { + const weeks: { + date: Temporal.PlainDate; + events: TEvent[]; + isToday: boolean; + isInCurrentPeriod: boolean; + }[][] = []; + let currentWeek: { + date: Temporal.PlainDate; + events: TEvent[]; + isToday: boolean; + isInCurrentPeriod: boolean; + }[] = []; + + days.forEach((day) => { + if (currentWeek.length === 0 && day.date.dayOfWeek !== weekStartsOn) { + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + for (let i = 0; i < dayOfWeek; i++) { + currentWeek.push({ + date: day.date.subtract({ days: dayOfWeek - i }), + events: [], + isToday: false, + isInCurrentPeriod: false, + }); + } + } + currentWeek.push(day); + if (currentWeek.length === 7) { + weeks.push(currentWeek); + currentWeek = []; + } + }); + + if (currentWeek.length > 0) { + while (currentWeek.length < 7) { + const lastDate = + currentWeek[currentWeek.length - 1]?.date ?? + Temporal.PlainDate.from("2024-01-01"); + currentWeek.push({ + date: lastDate.add({ days: 1 }), + events: [], + isToday: false, + isInCurrentPeriod: false, + }); + } + weeks.push(currentWeek); + } + + return weeks; + } + default: break + } + return groups; + }, + [weekStartsOn], + ); return { ...state, - firstDayOfPeriod: - state.viewMode.unit === 'months' - ? firstDayOfMonth - : state.viewMode.unit === 'weeks' - ? firstDayOfWeek - : state.currPeriod, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, goToSpecificPeriod, - weeks, + days: daysWithEvents, daysNames, changeViewMode, getEventProps, currentTimeMarkerProps, isPending, - } -} + groupDaysBy, + }; +}; diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts index 793c1011..2f7296b0 100644 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ b/packages/react-time/src/useCalendar/useCalendarReducer.ts @@ -9,7 +9,7 @@ const createCalendarReducer = (initialState: UseCalendarState) => { return createReducer(initialState) .handleAction(actions.setCurrentPeriod, (state, action) => ({ ...state, - currPeriod: action.payload, + currentPeriod: action.payload, })) .handleAction(actions.setViewMode, (state, action) => ({ ...state, @@ -20,29 +20,29 @@ const createCalendarReducer = (initialState: UseCalendarState) => { currentTime: action.payload, })) .handleAction(actions.goToPreviousPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); - const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn); + const firstDayOfMonth = getFirstDayOfMonth(state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); + const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); switch (state.viewMode.unit) { case 'months': { const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: state.viewMode.value }); return { ...state, - currPeriod: firstDayOfPrevMonth, + currentPeriod: firstDayOfPrevMonth, }; } case 'weeks': { const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: state.viewMode.value }); return { ...state, - currPeriod: firstDayOfPrevWeek, + currentPeriod: firstDayOfPrevWeek, }; } case 'days': { - const prevCustomStart = state.currPeriod.subtract({ days: state.viewMode.value }); + const prevCustomStart = state.currentPeriod.subtract({ days: state.viewMode.value }); return { ...state, - currPeriod: prevCustomStart, + currentPeriod: prevCustomStart, }; } default: @@ -50,29 +50,29 @@ const createCalendarReducer = (initialState: UseCalendarState) => { } }) .handleAction(actions.goToNextPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); - const firstDayOfWeek = getFirstDayOfWeek(state.currPeriod.toString(), action.payload.weekStartsOn); + const firstDayOfMonth = getFirstDayOfMonth(state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); + const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); switch (state.viewMode.unit) { case 'months': { const firstDayOfNextMonth = firstDayOfMonth.add({ months: state.viewMode.value }); return { ...state, - currPeriod: firstDayOfNextMonth, + currentPeriod: firstDayOfNextMonth, }; } case 'weeks': { const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: state.viewMode.value }); return { ...state, - currPeriod: firstDayOfNextWeek, + currentPeriod: firstDayOfNextWeek, }; } case 'days': { - const nextCustomStart = state.currPeriod.add({ days: state.viewMode.value }); + const nextCustomStart = state.currentPeriod.add({ days: state.viewMode.value }); return { ...state, - currPeriod: nextCustomStart, + currentPeriod: nextCustomStart, }; } default: diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index b5a48fb9..e5308749 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -8,7 +8,7 @@ export interface Event { } export interface UseCalendarState { - currPeriod: Temporal.PlainDate + currentPeriod: Temporal.PlainDate viewMode: { value: number unit: 'months' | 'weeks' | 'days' From def6499c63f02511f51256c1e2da699028d0ddf5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 13:16:50 +0200 Subject: [PATCH 050/163] refactor: api --- docs/framework/react/reference/useCalendar.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 54542048..7f3681f5 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -40,7 +40,7 @@ export function useCalendar({ - `firstDayOfPeriod: Temporal.PlainDate` - This value represents the first day of the current period displayed by the calendar. -- `currPeriod: string` +- `currentPeriod: string` - This value represents a string that describes the current period displayed by the calendar. - `goToPreviousPeriod: MouseEventHandler` - This function is a click event handler that navigates to the previous period. @@ -69,14 +69,13 @@ export function useCalendar({ - `isPending: boolean` - This value represents whether the calendar is in a pending state. - #### Example Usage ```tsx const CalendarComponent = ({ events }) => { const { firstDayOfPeriod, - currPeriod, + currentPeriod, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, From 110e8be61fa7319ee8725434af2bf98e7d7f6648 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 14:06:53 +0200 Subject: [PATCH 051/163] fix: types --- packages/react-time/src/useCalendar/useCalendar.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 082a9f33..d8c36cb4 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -121,14 +121,14 @@ const generateDateRange = ( * @returns {Function} calendarState.getEventProps - Function to retrieve the style properties for a specific event based on its ID. * @returns {Function} calendarState.currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. */ -export const useCalendar = ({ +export const useCalendar = ({ weekStartsOn = 1, events, viewMode: initialViewMode, locale, onChangeViewMode, reducer, -}: UseCalendarProps) => { +}: UseCalendarProps) => { const today = Temporal.Now.plainDateISO(); const [isPending, startTransition] = useTransition(); const [state, dispatch] = useCalendarReducer( @@ -136,7 +136,7 @@ export const useCalendar = ({ currentPeriod: today, viewMode: initialViewMode, currentTime: Temporal.Now.plainDateTimeISO(), - }, + } as TState, reducer, ); From 3333fcb391311cb20a52ee48a31a9fdfdea701f9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 14:07:34 +0200 Subject: [PATCH 052/163] fix: types --- packages/react-time/src/useCalendar/useCalendar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index d8c36cb4..99c53423 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -24,7 +24,7 @@ interface UseCalendarProps< /** * The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. */ - viewMode: UseCalendarState['viewMode']; + viewMode: TState['viewMode']; /** * The locale to use for formatting dates and times. */ @@ -32,7 +32,7 @@ interface UseCalendarProps< /** * Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. */ - onChangeViewMode?: (viewMode: UseCalendarState['viewMode']) => void; + onChangeViewMode?: (viewMode: TState['viewMode']) => void; /** * Custom reducer function to manage the state of the calendar. */ From 492405bb992af32dcb58639326b4480c8ddc94d4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 14:25:06 +0200 Subject: [PATCH 053/163] fix: types --- packages/react-time/src/useCalendar/useCalendar.ts | 12 ++++++------ .../react-time/src/useCalendar/useCalendarReducer.ts | 12 ++++++------ .../react-time/src/useCalendar/useCalendarState.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 99c53423..1c43f4b9 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -155,7 +155,7 @@ export const useCalendar = { const start = - state.viewMode.unit === "months" + state.viewMode.unit === "month" ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7, }) @@ -163,7 +163,7 @@ export const useCalendar = { + (newViewMode: TState["viewMode"]) => { startTransition(() => { dispatch(actions.setViewMode(newViewMode)); onChangeViewMode?.(newViewMode); @@ -359,7 +359,7 @@ export const useCalendar = { const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); switch (state.viewMode.unit) { - case 'months': { + case 'month': { const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: state.viewMode.value }); return { ...state, currentPeriod: firstDayOfPrevMonth, }; } - case 'weeks': { + case 'week': { const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: state.viewMode.value }); return { ...state, currentPeriod: firstDayOfPrevWeek, }; } - case 'days': { + case 'day': { const prevCustomStart = state.currentPeriod.subtract({ days: state.viewMode.value }); return { ...state, @@ -54,21 +54,21 @@ const createCalendarReducer = (initialState: UseCalendarState) => { const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); switch (state.viewMode.unit) { - case 'months': { + case 'month': { const firstDayOfNextMonth = firstDayOfMonth.add({ months: state.viewMode.value }); return { ...state, currentPeriod: firstDayOfNextMonth, }; } - case 'weeks': { + case 'week': { const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: state.viewMode.value }); return { ...state, currentPeriod: firstDayOfNextWeek, }; } - case 'days': { + case 'day': { const nextCustomStart = state.currentPeriod.add({ days: state.viewMode.value }); return { ...state, diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts index e5308749..c5a3b105 100644 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ b/packages/react-time/src/useCalendar/useCalendarState.ts @@ -11,7 +11,7 @@ export interface UseCalendarState { currentPeriod: Temporal.PlainDate viewMode: { value: number - unit: 'months' | 'weeks' | 'days' + unit: 'month' | 'week' | 'day' } currentTime: Temporal.PlainDateTime } From 7bee6b43520df3f0c9017e27b9928813644e4b96 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 14:25:36 +0200 Subject: [PATCH 054/163] fix: types --- .../react-time/src/tests/useCalendar.test.tsx | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index c7753ce3..b0e07c8c 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -30,9 +30,9 @@ describe('useCalendar', () => { test('should initialize with the correct view mode and current period', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ) - expect(result.current.viewMode).toEqual({ value: 1, unit: 'months' }) + expect(result.current.viewMode).toEqual({ value: 1, unit: 'month' }) expect(result.current.currentPeriod.toString()).toBe( Temporal.Now.plainDateISO().toString(), ) @@ -40,7 +40,7 @@ describe('useCalendar', () => { test('should navigate to the previous period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ) act(() => { @@ -58,7 +58,7 @@ describe('useCalendar', () => { test('should navigate to the next period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ) act(() => { @@ -72,19 +72,19 @@ describe('useCalendar', () => { test('should change view mode correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ) act(() => { - result.current.changeViewMode({ value: 1, unit: 'weeks' }) + result.current.changeViewMode({ value: 1, unit: 'week' }) }) - expect(result.current.viewMode).toEqual({ value: 1, unit: 'weeks' }) + expect(result.current.viewMode).toEqual({ value: 1, unit: 'week' }) }) test('should select a day correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ) act(() => { @@ -96,7 +96,7 @@ describe('useCalendar', () => { test('should return the correct props for an event', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'weeks' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), ) const eventProps = result.current.getEventProps('1') @@ -129,7 +129,7 @@ describe('useCalendar', () => { }, ] const { result } = renderHook(() => - useCalendar({ events: overlappingEvents, viewMode: { value: 1, unit: 'weeks' } }), + useCalendar({ events: overlappingEvents, viewMode: { value: 1, unit: 'week' } }), ) const event1Props = result.current.getEventProps('1') @@ -160,7 +160,7 @@ describe('useCalendar', () => { test('should return the correct props for the current time marker', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'weeks' } }), + useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), ) const currentTimeMarkerProps = result.current.currentTimeMarkerProps() @@ -177,7 +177,7 @@ describe('useCalendar', () => { test('should render array of days', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }), ); const { days } = result.current; @@ -193,14 +193,14 @@ describe('useCalendar', () => { test('should return the correct day names based on weekStartsOn', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 1 }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 1 }) ); const { daysNames } = result.current; expect(daysNames).toEqual(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']); const { result: resultSundayStart } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 7 }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 7 }) ); const { daysNames: sundayDaysNames } = resultSundayStart.current; @@ -209,7 +209,7 @@ describe('useCalendar', () => { test('should correctly mark days as in current period', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ); const { days } = result.current; @@ -226,7 +226,7 @@ describe('useCalendar', () => { }); test('should navigate to a specific period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'months' } })) + const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } })) const specificDate = Temporal.PlainDate.from('2024-05-15') act(() => { @@ -238,7 +238,7 @@ describe('useCalendar', () => { test('should navigate to the previous period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ) act(() => { @@ -254,7 +254,7 @@ describe('useCalendar', () => { test('should navigate to the next period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ) act(() => { @@ -268,7 +268,7 @@ describe('useCalendar', () => { test('should reset to the current period correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ) act(() => { @@ -294,7 +294,7 @@ describe('useCalendar', () => { } const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, reducer: customReducer }), + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, reducer: customReducer }), ) act(() => { @@ -307,7 +307,7 @@ describe('useCalendar', () => { test('should group days by months correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 2, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 2, unit: 'month' }, locale: 'en-US' }) ); const { days, groupDaysBy } = result.current; @@ -320,7 +320,7 @@ describe('useCalendar', () => { test('should group days by weeks correctly', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ); const { days, groupDaysBy } = result.current; @@ -332,7 +332,7 @@ describe('useCalendar', () => { test('should group days by weeks correctly when weekStartsOn is Sunday', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'months' }, locale: 'en-US', weekStartsOn: 7 }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 7 }) ); const { days, groupDaysBy } = result.current; From 83f0724db1e932d6c6500f1b61a830196894160d Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 14:30:55 +0200 Subject: [PATCH 055/163] docs: useCalendar --- .../react-time/src/useCalendar/useCalendar.ts | 372 +++++++++--------- 1 file changed, 185 insertions(+), 187 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 1c43f4b9..fc09c01e 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -8,6 +8,13 @@ import type { UseCalendarAction } from './calendarActions' import type { Event, UseCalendarState } from './useCalendarState' import type { CSSProperties } from 'react' +type Day = { + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean +} + interface UseCalendarProps< TEvent extends Event, TState extends UseCalendarState = UseCalendarState, @@ -16,38 +23,38 @@ interface UseCalendarProps< * The day of the week the calendar should start on (0 for Sunday, 6 for Saturday). * @default 1 */ - weekStartsOn?: number; + weekStartsOn?: number /** * An array of events that the calendar should display. */ - events?: TEvent[]; + events?: TEvent[] /** * The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. */ - viewMode: TState['viewMode']; + viewMode: TState['viewMode'] /** * The locale to use for formatting dates and times. */ - locale?: Parameters['0']; + locale?: Parameters['0'] /** * Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. */ - onChangeViewMode?: (viewMode: TState['viewMode']) => void; + onChangeViewMode?: (viewMode: TState['viewMode']) => void /** * Custom reducer function to manage the state of the calendar. */ reducer?: ( state: TState, action: TAction, - ) => TState; + ) => TState } const splitMultiDayEvents = (event: TEvent): TEvent[] => { - const startDate = Temporal.PlainDateTime.from(event.startDate); - const endDate = Temporal.PlainDateTime.from(event.endDate); - const events: TEvent[] = []; + const startDate = Temporal.PlainDateTime.from(event.startDate) + const endDate = Temporal.PlainDateTime.from(event.endDate) + const events: TEvent[] = [] - let currentDay = startDate; + let currentDay = startDate while ( Temporal.PlainDate.compare( currentDay.toPlainDate(), @@ -59,42 +66,42 @@ const splitMultiDayEvents = (event: TEvent): TEvent[] => { minute: 0, second: 0, millisecond: 0, - }); + }) const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999, - }); + }) const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate - : startOfCurrentDay; + : startOfCurrentDay const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate - : endOfCurrentDay; + : endOfCurrentDay - events.push({ ...event, startDate: eventStart, endDate: eventEnd }); + events.push({ ...event, startDate: eventStart, endDate: eventEnd }) - currentDay = startOfCurrentDay.add({ days: 1 }); + currentDay = startOfCurrentDay.add({ days: 1 }) } - return events; + return events } const generateDateRange = ( start: Temporal.PlainDate, end: Temporal.PlainDate, ) => { - const dates: Temporal.PlainDate[] = []; - let current = start; + const dates: Temporal.PlainDate[] = [] + let current = start while (Temporal.PlainDate.compare(current, end) <= 0) { - dates.push(current); - current = current.add({ days: 1 }); + dates.push(current) + current = current.add({ days: 1 }) } - return dates; + return dates } /** @@ -121,7 +128,10 @@ const generateDateRange = ( * @returns {Function} calendarState.getEventProps - Function to retrieve the style properties for a specific event based on its ID. * @returns {Function} calendarState.currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. */ -export const useCalendar = ({ +export const useCalendar = < + TEvent extends Event, + TState extends UseCalendarState = UseCalendarState, +>({ weekStartsOn = 1, events, viewMode: initialViewMode, @@ -129,8 +139,8 @@ export const useCalendar = ) => { - const today = Temporal.Now.plainDateISO(); - const [isPending, startTransition] = useTransition(); + const today = Temporal.Now.plainDateISO() + const [isPending, startTransition] = useTransition() const [state, dispatch] = useCalendarReducer( { currentPeriod: today, @@ -138,117 +148,117 @@ export const useCalendar = getFirstDayOfMonth( - state.currentPeriod.toString({ calendarName: "auto" }).substring(0, 7), + state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7), ), [state.currentPeriod], - ); + ) const firstDayOfWeek = useMemo( () => getFirstDayOfWeek(state.currentPeriod.toString(), weekStartsOn), [state.currentPeriod, weekStartsOn], - ); + ) const calendarDays = useMemo(() => { const start = - state.viewMode.unit === "month" + state.viewMode.unit === 'month' ? firstDayOfMonth.subtract({ days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7, }) - : state.currentPeriod; + : state.currentPeriod - let end; + let end switch (state.viewMode.unit) { - case "month": { + case 'month': { const lastDayOfMonth = firstDayOfMonth .add({ months: state.viewMode.value }) - .subtract({ days: 1 }); + .subtract({ days: 1 }) const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7; - end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); - break; + (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) + break } - case "week": { - end = firstDayOfWeek.add({ days: 7 * state.viewMode.value - 1 }); - break; + case 'week': { + end = firstDayOfWeek.add({ days: 7 * state.viewMode.value - 1 }) + break } - case "day": { - end = state.currentPeriod.add({ days: state.viewMode.value - 1 }); - break; + case 'day': { + end = state.currentPeriod.add({ days: state.viewMode.value - 1 }) + break } } - const allDays = generateDateRange(start, end); - const startMonth = state.currentPeriod.month; + const allDays = generateDateRange(start, end) + const startMonth = state.currentPeriod.month const endMonth = state.currentPeriod.add({ months: state.viewMode.value - 1, - }).month; + }).month return allDays.filter( (day) => day.month >= startMonth && day.month <= endMonth, - ); + ) }, [ state.viewMode, firstDayOfMonth, firstDayOfWeek, weekStartsOn, state.currentPeriod, - ]); + ]) const eventMap = useMemo(() => { - const map = new Map(); + const map = new Map() events?.forEach((event) => { - const eventStartDate = Temporal.PlainDateTime.from(event.startDate); - const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) if ( Temporal.PlainDate.compare( eventStartDate.toPlainDate(), eventEndDate.toPlainDate(), ) !== 0 ) { - const splitEvents = splitMultiDayEvents(event); + const splitEvents = splitMultiDayEvents(event) splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.startDate.toString().split("T")[0]; + const splitKey = splitEvent.startDate.toString().split('T')[0] if (splitKey) { - if (!map.has(splitKey)) map.set(splitKey, []); - map.get(splitKey)?.push(splitEvent); + if (!map.has(splitKey)) map.set(splitKey, []) + map.get(splitKey)?.push(splitEvent) } - }); + }) } else { - const eventKey = event.startDate.toString().split("T")[0]; + const eventKey = event.startDate.toString().split('T')[0] if (eventKey) { - if (!map.has(eventKey)) map.set(eventKey, []); - map.get(eventKey)?.push(event); + if (!map.has(eventKey)) map.set(eventKey, []) + map.get(eventKey)?.push(event) } } - }); - return map; - }, [events]); + }) + return map + }, [events]) const daysWithEvents = useMemo( () => calendarDays.map((day) => { - const dayKey = day.toString(); - const dailyEvents = eventMap.get(dayKey) ?? []; + const dayKey = day.toString() + const dailyEvents = eventMap.get(dayKey) ?? [] const currentMonthRange = Array.from( { length: state.viewMode.value }, (_, i) => state.currentPeriod.add({ months: i }).month, - ); - const isInCurrentPeriod = currentMonthRange.includes(day.month); + ) + const isInCurrentPeriod = currentMonthRange.includes(day.month) return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod, - }; + } }), [calendarDays, eventMap, state.viewMode, state.currentPeriod], - ); + ) const goToPreviousPeriod = useCallback( () => @@ -256,13 +266,13 @@ export const useCalendar = startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), [dispatch, weekStartsOn], - ); + ) const goToCurrentPeriod = useCallback( () => @@ -270,70 +280,67 @@ export const useCalendar = startTransition(() => dispatch(actions.setCurrentPeriod(date))), [dispatch], - ); + ) const changeViewMode = useCallback( - (newViewMode: TState["viewMode"]) => { + (newViewMode: TState['viewMode']) => { startTransition(() => { - dispatch(actions.setViewMode(newViewMode)); - onChangeViewMode?.(newViewMode); - }); + dispatch(actions.setViewMode(newViewMode)) + onChangeViewMode?.(newViewMode) + }) }, [dispatch, onChangeViewMode], - ); + ) const getEventProps = useCallback( - (id: Event["id"]): { style: CSSProperties } | null => { + (id: Event['id']): { style: CSSProperties } | null => { const event = [...eventMap.values()] .flat() - .find((currEvent) => currEvent.id === id); - if (!event) return null; + .find((currEvent) => currEvent.id === id) + if (!event) return null - const eventStartDate = Temporal.PlainDateTime.from(event.startDate); - const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + const eventStartDate = Temporal.PlainDateTime.from(event.startDate) + const eventEndDate = Temporal.PlainDateTime.from(event.endDate) const isSplitEvent = Temporal.PlainDate.compare( eventStartDate.toPlainDate(), eventEndDate.toPlainDate(), - ) !== 0; + ) !== 0 - let percentageOfDay; - let eventHeightInMinutes; + let percentageOfDay + let eventHeightInMinutes if (isSplitEvent) { const isStartPart = - eventStartDate.hour !== 0 || eventStartDate.minute !== 0; + eventStartDate.hour !== 0 || eventStartDate.minute !== 0 if (isStartPart) { const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute; - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes; + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes } else { - percentageOfDay = 0; - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; + percentageOfDay = 0 + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute } } else { const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute; - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes; + eventStartDate.hour * 60 + eventStartDate.minute + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes } - const eventHeight = Math.min( - (eventHeightInMinutes / (24 * 60)) * 100, - 20, - ); + const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate); - const eEndDate = Temporal.PlainDateTime.from(e.endDate); + const eStartDate = Temporal.PlainDateTime.from(e.startDate) + const eEndDate = Temporal.PlainDateTime.from(e.endDate) return ( (e.id !== id && Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && @@ -344,169 +351,160 @@ export const useCalendar = = 0 && Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) - ); - }); - - const eventIndex = overlappingEvents.findIndex((e) => e.id === id); - const totalOverlaps = overlappingEvents.length; - const sidePadding = 2; - const innerPadding = 2; - const totalInnerPadding = (totalOverlaps - 1) * innerPadding; - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding; + ) + }) + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id) + const totalOverlaps = overlappingEvents.length + const sidePadding = 2 + const innerPadding = 2 + const totalInnerPadding = (totalOverlaps - 1) * innerPadding + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps - : 100 - 2 * sidePadding; - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding); + : 100 - 2 * sidePadding + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - if (state.viewMode.unit === "week" || state.viewMode.unit === "day") { + if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { return { style: { - position: "absolute", + position: 'absolute', top: `min(${percentageOfDay}%, calc(100% - 55px))`, left: `${eventLeft}%`, width: `${eventWidth}%`, margin: 0, height: `${eventHeight}%`, }, - }; + } } - return null; + return null }, [eventMap, state.viewMode], - ); + ) useEffect(() => { const intervalId = setInterval( () => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), 60000, - ); - return () => clearInterval(intervalId); - }, [dispatch]); + ) + return () => clearInterval(intervalId) + }, [dispatch]) const currentTimeMarkerProps = useCallback(() => { - const { hour, minute } = state.currentTime; - const currentTimeInMinutes = hour * 60 + minute; - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + const { hour, minute } = state.currentTime + const currentTimeInMinutes = hour * 60 + minute + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 return { style: { - position: "absolute", + position: 'absolute', top: `${percentageOfDay}%`, left: 0, }, - currentTime: state.currentTime.toString().split("T")[1]?.substring(0, 5), - }; - }, [state.currentTime]); + currentTime: state.currentTime.toString().split('T')[1]?.substring(0, 5), + } + }, [state.currentTime]) const daysNames = useMemo(() => { - const baseDate = Temporal.PlainDate.from("2024-01-01"); + const baseDate = Temporal.PlainDate.from('2024-01-01') return Array.from({ length: 7 }).map((_, i) => baseDate .add({ days: (i + weekStartsOn - 1) % 7 }) - .toLocaleString(locale, { weekday: "short" }), - ); - }, [locale, weekStartsOn]); + .toLocaleString(locale, { weekday: 'short' }), + ) + }, [locale, weekStartsOn]) const groupDaysBy = useCallback( - ( - days: { - date: Temporal.PlainDate; - events: TEvent[]; - isToday: boolean; - isInCurrentPeriod: boolean; - }[], - unit: "months" | "weeks", - ) => { + (days: Day[], unit: 'months' | 'weeks') => { const groups: { - date: Temporal.PlainDate; - events: TEvent[]; - isToday: boolean; - isInCurrentPeriod: boolean; - }[][] = []; + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean + }[][] = [] switch (unit) { - case "months": { - let currentMonth: { - date: Temporal.PlainDate; - events: TEvent[]; - isToday: boolean; - isInCurrentPeriod: boolean; - }[] = []; + case 'months': { + let currentMonth: Day[] = [] days.forEach((day) => { if ( currentMonth.length > 0 && day.date.month !== currentMonth[0]?.date.month ) { - groups.push(currentMonth); - currentMonth = []; + groups.push(currentMonth) + currentMonth = [] } - currentMonth.push(day); - }); + currentMonth.push(day) + }) if (currentMonth.length > 0) { - groups.push(currentMonth); + groups.push(currentMonth) } - break; + break } case 'weeks': { const weeks: { - date: Temporal.PlainDate; - events: TEvent[]; - isToday: boolean; - isInCurrentPeriod: boolean; - }[][] = []; + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean + }[][] = [] let currentWeek: { - date: Temporal.PlainDate; - events: TEvent[]; - isToday: boolean; - isInCurrentPeriod: boolean; - }[] = []; - + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean + }[] = [] + days.forEach((day) => { - if (currentWeek.length === 0 && day.date.dayOfWeek !== weekStartsOn) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + if ( + currentWeek.length === 0 && + day.date.dayOfWeek !== weekStartsOn + ) { + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 for (let i = 0; i < dayOfWeek; i++) { currentWeek.push({ date: day.date.subtract({ days: dayOfWeek - i }), events: [], isToday: false, isInCurrentPeriod: false, - }); + }) } } - currentWeek.push(day); + currentWeek.push(day) if (currentWeek.length === 7) { - weeks.push(currentWeek); - currentWeek = []; + weeks.push(currentWeek) + currentWeek = [] } - }); - + }) + if (currentWeek.length > 0) { while (currentWeek.length < 7) { const lastDate = currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from("2024-01-01"); + Temporal.PlainDate.from('2024-01-01') currentWeek.push({ date: lastDate.add({ days: 1 }), events: [], isToday: false, isInCurrentPeriod: false, - }); + }) } - weeks.push(currentWeek); + weeks.push(currentWeek) } - - return weeks; + + return weeks } - default: break + default: + break } - return groups; + return groups }, [weekStartsOn], - ); + ) return { ...state, @@ -521,5 +519,5 @@ export const useCalendar = Date: Tue, 11 Jun 2024 14:31:00 +0200 Subject: [PATCH 056/163] docs: useCalendar --- docs/framework/react/reference/useCalendar.md | 132 ++++++++++++++---- 1 file changed, 104 insertions(+), 28 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 7f3681f5..a55d02e2 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -50,8 +50,8 @@ export function useCalendar({ - This function is a click event handler that navigates to the current period. - `goToSpecificPeriod: (date: Temporal.PlainDate) => void` - This function is a callback function that is called when a date is selected in the calendar. It receives the selected date as an argument. -- `weeks: Array>` - - This value represents the calendar grid, where each cell contains the date and events for that day. +- `days: Day[]` + - This value represents an array of days in the current period displayed by the calendar. - `daysNames: string[]` - This value represents an array of strings that contain the names of the days of the week. - `viewMode: 'month' | 'week' | number` @@ -68,6 +68,8 @@ export function useCalendar({ - This function is used to retrieve the style properties and current time for the current time marker. - `isPending: boolean` - This value represents whether the calendar is in a pending state. +- `groupDaysBy: (days: Day[], unit: 'day' | 'week' | 'month') => Day[][]` + - This function is used to group days into units of days, weeks, or months. #### Example Usage @@ -81,14 +83,15 @@ const CalendarComponent = ({ events }) => { goToCurrentPeriod, goToSpecificPeriod, changeViewMode, - weeks, + days, daysNames, viewMode, getEventProps, currentTimeMarkerProps, + groupDaysBy, } = useCalendar({ - events, - viewMode: 'month', + weekStartsOn: 1, + viewMode: { value: 1, unit: 'month' }, locale: 'en-US', onChangeViewMode: (newViewMode) => console.log('View mode changed:', newViewMode), }); @@ -101,14 +104,58 @@ const CalendarComponent = ({ events }) => {
- - - - + + + +
- {viewMode === 'month' && ( - + {viewMode.unit === 'month' && ( + groupDaysBy(days, 'months').map((month, monthIndex) => ( + + + + + + {daysNames.map((dayName, index) => ( + + ))} + + {groupDaysBy(month, 'weeks').map((week, weekIndex) => ( + + {week.map((day) => ( + + ))} + + ))} + + )) + )} + + {viewMode.unit === 'week' && ( + {daysNames.map((dayName, index) => ( ))} - + {groupDaysBy(days, 'weeks').map((week, weekIndex) => ( + + {week.map((day) => ( + + ))} + + ))} + )} - - {weeks.map((week, weekIndex) => ( - - {week.map((day) => ( - + + {daysNames.map((dayName, index) => ( + + ))} + + + {days.map((day) => ( + ))} -
- ))} - + + )}
+ {month[0]?.date.toLocaleString('default', { month: 'long' })}{' '} + {month[0]?.date.year} +
+ {dayName} +
+
{day.date.day}
+
+ {day.events.map((event) => ( +
+ {event.title} +
+ ))} +
+
@@ -116,26 +163,56 @@ const CalendarComponent = ({ events }) => {
+
{day.date.day}
+
+ {day.events.map((event) => ( +
+ {event.title} +
+ ))} +
+
-
- {day.date.day} -
+ + {viewMode.unit === 'day' && ( +
+ {dayName} +
+
{day.date.day}
{day.events.map((event) => (
{event.title}
@@ -143,10 +220,9 @@ const CalendarComponent = ({ events }) => {
); From e598c204b5bb929c759752e6f6668454141786bb Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 15:05:39 +0200 Subject: [PATCH 057/163] fix: types --- docs/framework/react/reference/useCalendar.md | 4 ++-- packages/react-time/src/useCalendar/useCalendar.ts | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index a55d02e2..b54df89e 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -28,9 +28,9 @@ export function useCalendar({ - This parameter is a string that specifies the initial view mode of the calendar. It can be either 'month', 'week', or a number representing the number of days in a custom view mode. - `locale?: string` - This parameter is an optional string that specifies the locale to use for formatting dates and times. It defaults to the system locale. -- `onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void` +- `onChangeViewMode?: ({ value: number; unit: "month" | "week" | "day"; }) => void` - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. -- `onChangeViewMode?: (viewMode: 'month' | 'week' | number) => void` +- `onChangeViewMode?: (viewMode: value: number; unit: "month" | "week" | "day";) => void` - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. - `reducer?: (state: CalendarState, action: CalendarAction) => CalendarState` - This parameter is an optional custom reducer function that can be used to manage the state of the calendar. diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index fc09c01e..69685340 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -419,12 +419,7 @@ export const useCalendar = < const groupDaysBy = useCallback( (days: Day[], unit: 'months' | 'weeks') => { - const groups: { - date: Temporal.PlainDate - events: TEvent[] - isToday: boolean - isInCurrentPeriod: boolean - }[][] = [] + const groups: Day[][] = [] switch (unit) { case 'months': { From a9665a72509801a77d1064ba4a7c083c52670829 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 19:17:02 +0200 Subject: [PATCH 058/163] refactor: add the fillMissingDays argument --- docs/framework/react/reference/useCalendar.md | 4 +- .../react-time/src/tests/useCalendar.test.tsx | 4 +- .../react-time/src/useCalendar/useCalendar.ts | 97 +++++++++---------- 3 files changed, 49 insertions(+), 56 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index b54df89e..49846874 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -68,8 +68,8 @@ export function useCalendar({ - This function is used to retrieve the style properties and current time for the current time marker. - `isPending: boolean` - This value represents whether the calendar is in a pending state. -- `groupDaysBy: (days: Day[], unit: 'day' | 'week' | 'month') => Day[][]` - - This function is used to group days into units of days, weeks, or months. +- `groupDaysBy: (days: Day[], unit: 'day' | 'week' | 'month', fillMissingDays?: boolean) => Day[][]` + - This function is used to group the days in the current period by a specified unit. #### Example Usage diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index b0e07c8c..7e02f134 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -188,7 +188,7 @@ describe('useCalendar', () => { expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-24'); - expect(weeks.find((week) => week.some((day) => day.isToday))?.find((day) => day.isToday)?.date.toString()).toBe('2024-06-01'); + expect(weeks.find((week) => week.some((day) => day?.isToday))?.find((day) => day?.isToday)?.date.toString()).toBe('2024-06-01'); }); test('should return the correct day names based on weekStartsOn', () => { @@ -214,7 +214,7 @@ describe('useCalendar', () => { const { days } = result.current; const weeks = result.current.groupDaysBy(days, 'weeks'); - const daysInCurrentPeriod = weeks.flat().map(day => day.isInCurrentPeriod); + const daysInCurrentPeriod = weeks.flat().map(day => day?.isInCurrentPeriod); expect(daysInCurrentPeriod).toEqual([ false, false, false, false, false, true, true, diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 69685340..9c812c50 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -418,88 +418,81 @@ export const useCalendar = < }, [locale, weekStartsOn]) const groupDaysBy = useCallback( - (days: Day[], unit: 'months' | 'weeks') => { - const groups: Day[][] = [] - + ( + days: (Day | null)[], + unit: "months" | "weeks", + fillMissingDays = true + ) => { + const groups: (Day | null)[][] = []; + switch (unit) { - case 'months': { - let currentMonth: Day[] = [] + case "months": { + let currentMonth: (Day | null)[] = []; days.forEach((day) => { if ( currentMonth.length > 0 && - day.date.month !== currentMonth[0]?.date.month + day?.date.month !== currentMonth[0]?.date.month ) { - groups.push(currentMonth) - currentMonth = [] + groups.push(currentMonth); + currentMonth = []; } - currentMonth.push(day) - }) + currentMonth.push(day); + }); if (currentMonth.length > 0) { - groups.push(currentMonth) + groups.push(currentMonth); } - break + break; } - + case 'weeks': { - const weeks: { - date: Temporal.PlainDate - events: TEvent[] - isToday: boolean - isInCurrentPeriod: boolean - }[][] = [] - let currentWeek: { - date: Temporal.PlainDate - events: TEvent[] - isToday: boolean - isInCurrentPeriod: boolean - }[] = [] - + const weeks: (Day | null)[][] = []; + let currentWeek: (Day | null)[] = []; + days.forEach((day) => { - if ( - currentWeek.length === 0 && - day.date.dayOfWeek !== weekStartsOn - ) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 + if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { + if (day) { + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; for (let i = 0; i < dayOfWeek; i++) { - currentWeek.push({ - date: day.date.subtract({ days: dayOfWeek - i }), - events: [], - isToday: false, - isInCurrentPeriod: false, - }) + currentWeek.push(fillMissingDays ? { + date: day.date.subtract({ days: dayOfWeek - i }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } : null); + } } } - currentWeek.push(day) + currentWeek.push(day); if (currentWeek.length === 7) { - weeks.push(currentWeek) - currentWeek = [] + weeks.push(currentWeek); + currentWeek = []; } - }) - + }); + if (currentWeek.length > 0) { while (currentWeek.length < 7) { const lastDate = currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01') - currentWeek.push({ + Temporal.PlainDate.from("2024-01-01"); + currentWeek.push(fillMissingDays ? { date: lastDate.add({ days: 1 }), events: [], isToday: false, isInCurrentPeriod: false, - }) + } : null); } - weeks.push(currentWeek) + weeks.push(currentWeek); } - - return weeks + + return weeks; } - default: - break + default: break } - return groups + return groups; }, [weekStartsOn], - ) + ); + return { ...state, From d9e9b883faa8ef3292b98a8f2d59f23049d6a4f5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 22:08:50 +0200 Subject: [PATCH 059/163] refactor: add the fillMissingDays argument --- .../react-time/src/tests/useCalendar.test.tsx | 10 +- .../react-time/src/useCalendar/useCalendar.ts | 117 +++++++++++------- 2 files changed, 74 insertions(+), 53 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 7e02f134..68a1be73 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -181,7 +181,7 @@ describe('useCalendar', () => { ); const { days } = result.current; - const weeks = result.current.groupDaysBy(days, 'weeks'); + const weeks = result.current.groupDaysBy({ days, unit: 'week' }); expect(weeks).toHaveLength(5); expect(weeks[0]).toHaveLength(7); @@ -213,7 +213,7 @@ describe('useCalendar', () => { ); const { days } = result.current; - const weeks = result.current.groupDaysBy(days, 'weeks'); + const weeks = result.current.groupDaysBy({ days, unit: 'week' }); const daysInCurrentPeriod = weeks.flat().map(day => day?.isInCurrentPeriod); expect(daysInCurrentPeriod).toEqual([ @@ -311,7 +311,7 @@ describe('useCalendar', () => { ); const { days, groupDaysBy } = result.current; - const months = groupDaysBy(days, 'months'); + const months = groupDaysBy({ days, unit: 'month' }); expect(months).toHaveLength(2); expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01'); @@ -324,7 +324,7 @@ describe('useCalendar', () => { ); const { days, groupDaysBy } = result.current; - const weeks = groupDaysBy(days, 'weeks'); + const weeks = groupDaysBy({ days, unit: 'week' }); expect(weeks).toHaveLength(5); expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-30'); @@ -336,7 +336,7 @@ describe('useCalendar', () => { ); const { days, groupDaysBy } = result.current; - const weeks = groupDaysBy(days, 'weeks'); + const weeks = groupDaysBy({ days, unit: 'week' }); expect(weeks).toHaveLength(6); expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 9c812c50..72c12c1c 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -418,81 +418,102 @@ export const useCalendar = < }, [locale, weekStartsOn]) const groupDaysBy = useCallback( - ( - days: (Day | null)[], - unit: "months" | "weeks", - fillMissingDays = true - ) => { - const groups: (Day | null)[][] = []; - + ({ + days, + unit, + fillMissingDays = true, + }: + | { + days: (Day | null)[] + unit: 'month' + fillMissingDays?: never + } + | { + days: (Day | null)[] + unit: 'week' + fillMissingDays?: boolean + }) => { + const groups: (Day | null)[][] = [] + switch (unit) { - case "months": { - let currentMonth: (Day | null)[] = []; + case 'month': { + let currentMonth: (Day | null)[] = [] days.forEach((day) => { if ( currentMonth.length > 0 && day?.date.month !== currentMonth[0]?.date.month ) { - groups.push(currentMonth); - currentMonth = []; + groups.push(currentMonth) + currentMonth = [] } - currentMonth.push(day); - }); + currentMonth.push(day) + }) if (currentMonth.length > 0) { - groups.push(currentMonth); + groups.push(currentMonth) } - break; + break } - - case 'weeks': { - const weeks: (Day | null)[][] = []; - let currentWeek: (Day | null)[] = []; - + + case 'week': { + const weeks: (Day | null)[][] = [] + let currentWeek: (Day | null)[] = [] + days.forEach((day) => { - if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { + if ( + currentWeek.length === 0 && + day?.date.dayOfWeek !== weekStartsOn + ) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; - for (let i = 0; i < dayOfWeek; i++) { - currentWeek.push(fillMissingDays ? { - date: day.date.subtract({ days: dayOfWeek - i }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } : null); + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 + for (let i = 0; i < dayOfWeek; i++) { + currentWeek.push( + fillMissingDays + ? { + date: day.date.subtract({ days: dayOfWeek - i }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ) } } } - currentWeek.push(day); + currentWeek.push(day) if (currentWeek.length === 7) { - weeks.push(currentWeek); - currentWeek = []; + weeks.push(currentWeek) + currentWeek = [] } - }); - + }) + if (currentWeek.length > 0) { while (currentWeek.length < 7) { const lastDate = currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from("2024-01-01"); - currentWeek.push(fillMissingDays ? { - date: lastDate.add({ days: 1 }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } : null); + Temporal.PlainDate.from('2024-01-01') + currentWeek.push( + fillMissingDays + ? { + date: lastDate.add({ days: 1 }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ) } - weeks.push(currentWeek); + weeks.push(currentWeek) } - - return weeks; + + return weeks } - default: break + default: + break } - return groups; + return groups }, [weekStartsOn], - ); - + ) return { ...state, From fe13c2c51b601735000c0e40000bb9b26322834d Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 11 Jun 2024 22:11:03 +0200 Subject: [PATCH 060/163] refactor: add the fillMissingDays argument --- docs/framework/react/reference/useCalendar.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 49846874..418bc27e 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -68,8 +68,8 @@ export function useCalendar({ - This function is used to retrieve the style properties and current time for the current time marker. - `isPending: boolean` - This value represents whether the calendar is in a pending state. -- `groupDaysBy: (days: Day[], unit: 'day' | 'week' | 'month', fillMissingDays?: boolean) => Day[][]` - - This function is used to group the days in the current period by a specified unit. +- `groupDaysBy: ({ days: Day[], unit: 'week' | 'month', fillMissingDays?: boolean }) => Day[][]` + - This function is used to group the days in the current period by a specified unit. The `fillMissingDays` parameter can be used to fill in missing days with previous or next month's days. #### Example Usage From 9f998463e96541287245eaafbf55702cf5006a16 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 12 Jun 2024 00:57:15 +0200 Subject: [PATCH 061/163] refactor: move utilities to the core package --- docs/framework/react/reference/useCalendar.md | 4 +- .../react-time/src/tests/useCalendar.test.tsx | 4 +- .../react-time/src/useCalendar/useCalendar.ts | 260 +----------------- packages/time/package.json | 3 + .../time/src/calendar/generateDateRange.ts | 14 + .../src/calendar/getCurrentTimeMarkerProps.ts | 17 ++ packages/time/src/calendar/getEventProps.ts | 78 ++++++ packages/time/src/calendar/groupDaysBy.ts | 97 +++++++ packages/time/src/calendar/index.ts | 5 + .../time/src/calendar/splitMultiDayEvents.ts | 23 ++ packages/time/src/calendar/types.ts | 24 ++ packages/time/src/index.ts | 3 +- pnpm-lock.yaml | 4 + 13 files changed, 286 insertions(+), 250 deletions(-) create mode 100644 packages/time/src/calendar/generateDateRange.ts create mode 100644 packages/time/src/calendar/getCurrentTimeMarkerProps.ts create mode 100644 packages/time/src/calendar/getEventProps.ts create mode 100644 packages/time/src/calendar/groupDaysBy.ts create mode 100644 packages/time/src/calendar/index.ts create mode 100644 packages/time/src/calendar/splitMultiDayEvents.ts create mode 100644 packages/time/src/calendar/types.ts diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 418bc27e..0582268c 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -64,7 +64,7 @@ export function useCalendar({ - This function is used to retrieve the style properties for a specific event based on its ID. - `getEventProps: (id: string) => { style: CSSProperties } | null` - This function is used to retrieve the style properties for a specific event based on its ID. -- `currentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` +- `getCurrentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - This function is used to retrieve the style properties and current time for the current time marker. - `isPending: boolean` - This value represents whether the calendar is in a pending state. @@ -87,7 +87,7 @@ const CalendarComponent = ({ events }) => { daysNames, viewMode, getEventProps, - currentTimeMarkerProps, + getCurrentTimeMarkerProps, groupDaysBy, } = useCalendar({ weekStartsOn: 1, diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 68a1be73..d1f14052 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -163,9 +163,9 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), ) - const currentTimeMarkerProps = result.current.currentTimeMarkerProps() + const getCurrentTimeMarkerProps = result.current.getCurrentTimeMarkerProps() - expect(currentTimeMarkerProps).toEqual({ + expect(getCurrentTimeMarkerProps).toEqual({ style: { position: 'absolute', top: '45.83333333333333%', diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 72c12c1c..29adfe14 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,23 +1,18 @@ import { useCallback, useEffect, useMemo, useTransition } from 'react' import { Temporal } from '@js-temporal/polyfill' -import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' +import { generateDateRange, getEventProps, getFirstDayOfMonth, getFirstDayOfWeek, groupDaysBy, splitMultiDayEvents } from '@tanstack/time' import { actions } from './calendarActions' import { useCalendarReducer } from './useCalendarReducer' +import type { CalendarState, Event, GroupDaysByProps} from '@tanstack/time'; import type { UseCalendarAction } from './calendarActions' -import type { Event, UseCalendarState } from './useCalendarState' import type { CSSProperties } from 'react' -type Day = { - date: Temporal.PlainDate - events: TEvent[] - isToday: boolean - isInCurrentPeriod: boolean -} + interface UseCalendarProps< TEvent extends Event, - TState extends UseCalendarState = UseCalendarState, + TState extends CalendarState = CalendarState, > { /** * The day of the week the calendar should start on (0 for Sunday, 6 for Saturday). @@ -49,61 +44,6 @@ interface UseCalendarProps< ) => TState } -const splitMultiDayEvents = (event: TEvent): TEvent[] => { - const startDate = Temporal.PlainDateTime.from(event.startDate) - const endDate = Temporal.PlainDateTime.from(event.endDate) - const events: TEvent[] = [] - - let currentDay = startDate - while ( - Temporal.PlainDate.compare( - currentDay.toPlainDate(), - endDate.toPlainDate(), - ) < 0 - ) { - const startOfCurrentDay = currentDay.with({ - hour: 0, - minute: 0, - second: 0, - millisecond: 0, - }) - const endOfCurrentDay = currentDay.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }) - - const eventStart = - Temporal.PlainDateTime.compare(currentDay, startDate) === 0 - ? startDate - : startOfCurrentDay - const eventEnd = - Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 - ? endDate - : endOfCurrentDay - - events.push({ ...event, startDate: eventStart, endDate: eventEnd }) - - currentDay = startOfCurrentDay.add({ days: 1 }) - } - - return events -} - -const generateDateRange = ( - start: Temporal.PlainDate, - end: Temporal.PlainDate, -) => { - const dates: Temporal.PlainDate[] = [] - let current = start - while (Temporal.PlainDate.compare(current, end) <= 0) { - dates.push(current) - current = current.add({ days: 1 }) - } - return dates -} - /** * Hook to manage the state and behavior of a calendar. * @@ -130,7 +70,7 @@ const generateDateRange = ( */ export const useCalendar = < TEvent extends Event, - TState extends UseCalendarState = UseCalendarState, + TState extends CalendarState = CalendarState, >({ weekStartsOn = 1, events, @@ -220,7 +160,7 @@ export const useCalendar = < eventEndDate.toPlainDate(), ) !== 0 ) { - const splitEvents = splitMultiDayEvents(event) + const splitEvents = splitMultiDayEvents(event) splitEvents.forEach((splitEvent) => { const splitKey = splitEvent.startDate.toString().split('T')[0] if (splitKey) { @@ -298,90 +238,9 @@ export const useCalendar = < [dispatch, onChangeViewMode], ) - const getEventProps = useCallback( - (id: Event['id']): { style: CSSProperties } | null => { - const event = [...eventMap.values()] - .flat() - .find((currEvent) => currEvent.id === id) - if (!event) return null - - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) - const isSplitEvent = - Temporal.PlainDate.compare( - eventStartDate.toPlainDate(), - eventEndDate.toPlainDate(), - ) !== 0 - - let percentageOfDay - let eventHeightInMinutes - - if (isSplitEvent) { - const isStartPart = - eventStartDate.hour !== 0 || eventStartDate.minute !== 0 - if (isStartPart) { - const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes - } else { - percentageOfDay = 0 - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - } - } else { - const eventTimeInMinutes = - eventStartDate.hour * 60 + eventStartDate.minute - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100 - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes - } - - const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20) - - const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate) - const eEndDate = Temporal.PlainDateTime.from(e.endDate) - return ( - (e.id !== id && - Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) - ) - }) - - const eventIndex = overlappingEvents.findIndex((e) => e.id === id) - const totalOverlaps = overlappingEvents.length - const sidePadding = 2 - const innerPadding = 2 - const totalInnerPadding = (totalOverlaps - 1) * innerPadding - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding - const eventWidth = - totalOverlaps > 0 - ? availableWidth / totalOverlaps - : 100 - 2 * sidePadding - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding) - - if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { - return { - style: { - position: 'absolute', - top: `min(${percentageOfDay}%, calc(100% - 55px))`, - left: `${eventLeft}%`, - width: `${eventWidth}%`, - margin: 0, - height: `${eventHeight}%`, - }, - } - } - - return null - }, - [eventMap, state.viewMode], + const getEventPropsCallback = useCallback( + (id: Event['id']): { style: CSSProperties } | null => getEventProps(eventMap, id, state), + [eventMap, state], ) useEffect(() => { @@ -393,7 +252,7 @@ export const useCalendar = < return () => clearInterval(intervalId) }, [dispatch]) - const currentTimeMarkerProps = useCallback(() => { + const getCurrentTimeMarkerProps = useCallback(() => { const { hour, minute } = state.currentTime const currentTimeInMinutes = hour * 60 + minute const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 @@ -417,101 +276,12 @@ export const useCalendar = < ) }, [locale, weekStartsOn]) - const groupDaysBy = useCallback( + const groupDaysByCallback = useCallback( ({ days, unit, fillMissingDays = true, - }: - | { - days: (Day | null)[] - unit: 'month' - fillMissingDays?: never - } - | { - days: (Day | null)[] - unit: 'week' - fillMissingDays?: boolean - }) => { - const groups: (Day | null)[][] = [] - - switch (unit) { - case 'month': { - let currentMonth: (Day | null)[] = [] - days.forEach((day) => { - if ( - currentMonth.length > 0 && - day?.date.month !== currentMonth[0]?.date.month - ) { - groups.push(currentMonth) - currentMonth = [] - } - currentMonth.push(day) - }) - if (currentMonth.length > 0) { - groups.push(currentMonth) - } - break - } - - case 'week': { - const weeks: (Day | null)[][] = [] - let currentWeek: (Day | null)[] = [] - - days.forEach((day) => { - if ( - currentWeek.length === 0 && - day?.date.dayOfWeek !== weekStartsOn - ) { - if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 - for (let i = 0; i < dayOfWeek; i++) { - currentWeek.push( - fillMissingDays - ? { - date: day.date.subtract({ days: dayOfWeek - i }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } - : null, - ) - } - } - } - currentWeek.push(day) - if (currentWeek.length === 7) { - weeks.push(currentWeek) - currentWeek = [] - } - }) - - if (currentWeek.length > 0) { - while (currentWeek.length < 7) { - const lastDate = - currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01') - currentWeek.push( - fillMissingDays - ? { - date: lastDate.add({ days: 1 }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } - : null, - ) - } - weeks.push(currentWeek) - } - - return weeks - } - default: - break - } - return groups - }, + }: Omit, 'weekStartsOn'>) => groupDaysBy({ days, unit, fillMissingDays, weekStartsOn } as GroupDaysByProps), [weekStartsOn], ) @@ -524,9 +294,9 @@ export const useCalendar = < days: daysWithEvents, daysNames, changeViewMode, - getEventProps, - currentTimeMarkerProps, + getEventProps: getEventPropsCallback, + getCurrentTimeMarkerProps, isPending, - groupDaysBy, + groupDaysBy: groupDaysByCallback, } } diff --git a/packages/time/package.json b/packages/time/package.json index 1b370165..a1233303 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -58,5 +58,8 @@ ], "dependencies": { "@js-temporal/polyfill": "^0.4.4" + }, + "devDependencies": { + "csstype": "^3.1.3" } } diff --git a/packages/time/src/calendar/generateDateRange.ts b/packages/time/src/calendar/generateDateRange.ts new file mode 100644 index 00000000..ec73960d --- /dev/null +++ b/packages/time/src/calendar/generateDateRange.ts @@ -0,0 +1,14 @@ +import { Temporal } from '@js-temporal/polyfill' + +export const generateDateRange = ( + start: Temporal.PlainDate, + end: Temporal.PlainDate, +): Temporal.PlainDate[] => { + const dates: Temporal.PlainDate[] = [] + let current = start + while (Temporal.PlainDate.compare(current, end) <= 0) { + dates.push(current) + current = current.add({ days: 1 }) + } + return dates +} diff --git a/packages/time/src/calendar/getCurrentTimeMarkerProps.ts b/packages/time/src/calendar/getCurrentTimeMarkerProps.ts new file mode 100644 index 00000000..76d17c94 --- /dev/null +++ b/packages/time/src/calendar/getCurrentTimeMarkerProps.ts @@ -0,0 +1,17 @@ +import type { Temporal } from "@js-temporal/polyfill"; +import type { Properties as CSSProperties } from "csstype"; + +export const getCurrentTimeMarkerProps = (currentTime: Temporal.PlainDateTime): { style: CSSProperties; currentTime: string | undefined } => { + const { hour, minute } = currentTime; + const currentTimeInMinutes = hour * 60 + minute; + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + + return { + style: { + position: 'absolute', + top: `${percentageOfDay}%`, + left: 0, + }, + currentTime: currentTime.toString().split('T')[1]?.substring(0, 5), + }; +}; \ No newline at end of file diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts new file mode 100644 index 00000000..023d59b9 --- /dev/null +++ b/packages/time/src/calendar/getEventProps.ts @@ -0,0 +1,78 @@ +import { Temporal } from "@js-temporal/polyfill"; +import type { Properties as CSSProperties } from "csstype"; +import type { CalendarState, Event } from "./types"; + +export const getEventProps = ( + eventMap: Map, + id: Event['id'], + state: CalendarState +): { style: CSSProperties } | null => { + const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id); + if (!event) return null; + + const eventStartDate = Temporal.PlainDateTime.from(event.startDate); + const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; + + let percentageOfDay; + let eventHeightInMinutes; + + if (isSplitEvent) { + const isStartPart = eventStartDate.hour !== 0 || eventStartDate.minute !== 0; + if (isStartPart) { + const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; + eventHeightInMinutes = 24 * 60 - eventTimeInMinutes; + } else { + percentageOfDay = 0; + eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; + } + } else { + const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; + percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; + const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; + eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes; + } + + const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20); + + const overlappingEvents = [...eventMap.values()].flat().filter((e) => { + const eStartDate = Temporal.PlainDateTime.from(e.startDate); + const eEndDate = Temporal.PlainDateTime.from(e.endDate); + return ( + (e.id !== id && + Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) + ); + }); + + const eventIndex = overlappingEvents.findIndex((e) => e.id === id); + const totalOverlaps = overlappingEvents.length; + const sidePadding = 2; + const innerPadding = 2; + const totalInnerPadding = (totalOverlaps - 1) * innerPadding; + const availableWidth = 100 - totalInnerPadding - 2 * sidePadding; + const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding; + const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding); + + if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { + return { + style: { + position: 'absolute', + top: `min(${percentageOfDay}%, calc(100% - 55px))`, + left: `${eventLeft}%`, + width: `${eventWidth}%`, + margin: 0, + height: `${eventHeight}%`, + }, + }; + } + + return null; +}; \ No newline at end of file diff --git a/packages/time/src/calendar/groupDaysBy.ts b/packages/time/src/calendar/groupDaysBy.ts new file mode 100644 index 00000000..8b19e983 --- /dev/null +++ b/packages/time/src/calendar/groupDaysBy.ts @@ -0,0 +1,97 @@ +import { Temporal } from "@js-temporal/polyfill"; +import type { Day, Event } from "./types"; + +interface GroupDaysByBaseProps { + days: (Day | null)[]; + weekStartsOn: number; +} + +type GroupDaysByMonthProps = GroupDaysByBaseProps & { + unit: 'month'; + fillMissingDays?: never; +}; + +type GroupDaysByWeekProps = GroupDaysByBaseProps & { + unit: 'week'; + fillMissingDays?: boolean; +}; + +export type GroupDaysByProps = GroupDaysByMonthProps | GroupDaysByWeekProps; + +export const groupDaysBy = ({ + days, + unit, + fillMissingDays = true, + weekStartsOn, +}: GroupDaysByProps): (Day | null)[][] => { + const groups: (Day | null)[][] = []; + + switch (unit) { + case 'month': { + let currentMonth: (Day | null)[] = []; + days.forEach((day) => { + if (currentMonth.length > 0 && day?.date.month !== currentMonth[0]?.date.month) { + groups.push(currentMonth); + currentMonth = []; + } + currentMonth.push(day); + }); + if (currentMonth.length > 0) { + groups.push(currentMonth); + } + break; + } + + case 'week': { + const weeks: (Day | null)[][] = []; + let currentWeek: (Day | null)[] = []; + + days.forEach((day) => { + if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { + if (day) { + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + for (let i = 0; i < dayOfWeek; i++) { + currentWeek.push( + fillMissingDays + ? { + date: day.date.subtract({ days: dayOfWeek - i }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null + ); + } + } + } + currentWeek.push(day); + if (currentWeek.length === 7) { + weeks.push(currentWeek); + currentWeek = []; + } + }); + + if (currentWeek.length > 0) { + while (currentWeek.length < 7) { + const lastDate = currentWeek[currentWeek.length - 1]?.date ?? Temporal.PlainDate.from('2024-01-01'); + currentWeek.push( + fillMissingDays + ? { + date: lastDate.add({ days: 1 }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null + ); + } + weeks.push(currentWeek); + } + + return weeks; + } + default: + break; + } + return groups; +}; diff --git a/packages/time/src/calendar/index.ts b/packages/time/src/calendar/index.ts new file mode 100644 index 00000000..a16de01b --- /dev/null +++ b/packages/time/src/calendar/index.ts @@ -0,0 +1,5 @@ +export * from './types' +export * from './splitMultiDayEvents' +export * from './generateDateRange' +export * from './getEventProps' +export * from './groupDaysBy' \ No newline at end of file diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts new file mode 100644 index 00000000..ebb0c2aa --- /dev/null +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -0,0 +1,23 @@ +import { Temporal } from '@js-temporal/polyfill'; +import type { Event } from './types'; + +export const splitMultiDayEvents = (event: TEvent): TEvent[] => { + const startDate = Temporal.PlainDateTime.from(event.startDate); + const endDate = Temporal.PlainDateTime.from(event.endDate); + const events: TEvent[] = []; + + let currentDay = startDate; + while (Temporal.PlainDate.compare(currentDay.toPlainDate(), endDate.toPlainDate()) < 0) { + const startOfCurrentDay = currentDay.with({ hour: 0, minute: 0, second: 0, millisecond: 0 }); + const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999 }); + + const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate : startOfCurrentDay; + const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate : endOfCurrentDay; + + events.push({ ...event, startDate: eventStart, endDate: eventEnd }); + + currentDay = startOfCurrentDay.add({ days: 1 }); + } + + return events; +}; diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts new file mode 100644 index 00000000..d8552b43 --- /dev/null +++ b/packages/time/src/calendar/types.ts @@ -0,0 +1,24 @@ +import type { Temporal } from "@js-temporal/polyfill" + +export interface Event { + id: string + startDate: Temporal.PlainDateTime + endDate: Temporal.PlainDateTime + title: string +} + +export interface CalendarState { + currentPeriod: Temporal.PlainDate + viewMode: { + value: number + unit: 'month' | 'week' | 'day' + } + currentTime: Temporal.PlainDateTime +} + +export type Day = { + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean +} \ No newline at end of file diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 0e36b7bf..6370bcc1 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -1,4 +1,5 @@ /** * TanStack Time */ -export * from './utils'; \ No newline at end of file +export * from './utils'; +export * from './calendar'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e5ac1a5..7de84db3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,6 +194,10 @@ importers: '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 + devDependencies: + csstype: + specifier: ^3.1.3 + version: 3.1.3 packages/vue-time: dependencies: From 93b519a92c37fee040d4204a62b2825d2dd8f9e0 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 12 Jun 2024 16:42:47 +0200 Subject: [PATCH 062/163] fix: getCurrentTimeMarkerProps --- .../react-time/src/tests/useCalendar.test.tsx | 76 ++++++++++++++++--- .../react-time/src/useCalendar/useCalendar.ts | 22 ++++-- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index d1f14052..2a7f6d3c 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,18 +1,11 @@ import { Temporal } from '@js-temporal/polyfill' -import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' import type { UseCalendarAction } from '../useCalendar/calendarActions'; import type { UseCalendarState } from '../useCalendar/useCalendarState'; describe('useCalendar', () => { - beforeEach(() => { - vi.setSystemTime(new Date('2024-06-01T11:00:00')); - }); - afterEach(() => { - vi.useRealTimers(); - }); - const events = [ { id: '1', @@ -159,11 +152,13 @@ describe('useCalendar', () => { }) test('should return the correct props for the current time marker', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2024-06-01T11:00:00')); const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), - ) + useCalendar({ viewMode: { value: 1, unit: 'week' } }), + ); - const getCurrentTimeMarkerProps = result.current.getCurrentTimeMarkerProps() + const getCurrentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); expect(getCurrentTimeMarkerProps).toEqual({ style: { @@ -172,8 +167,65 @@ describe('useCalendar', () => { left: 0, }, currentTime: '11:00', + }); + }); + + test('should update the current time marker props after time passes', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2024-06-01T11:00:00')); + const { result } = renderHook(() => + useCalendar({ viewMode: { value: 1, unit: 'week' } }), + ); + + let currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.83333333333333%', + left: 0, + }, + currentTime: '11:00', + }); + + act(() => { + vi.useFakeTimers(); + vi.advanceTimersByTime(60000); + }); + + currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); + }); + + test('should update the current time marker props after time passes when the next minute is in less than a minute', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2024-06-01T11:00:55')); + + const { result } = renderHook(() => useCalendar({ viewMode: { value: 1, unit: 'week' } })); + + act(() => { + vi.advanceTimersByTime(5000); }) - }) + + const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); + }); test('should render array of days', () => { const { result } = renderHook(() => diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 29adfe14..4341b1f5 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -243,14 +243,22 @@ export const useCalendar = < [eventMap, state], ) + const updateCurrentTime = useCallback(() => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), [dispatch]) + useEffect(() => { - const intervalId = setInterval( - () => - dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), - 60000, - ) - return () => clearInterval(intervalId) - }, [dispatch]) + const now = Temporal.Now.plainDateTimeISO(); + const msToNextMinute = (60 - now.second) * 1000 - now.millisecond; + + const timeoutId = setTimeout(() => { + updateCurrentTime(); + const intervalId = setInterval(updateCurrentTime, 60000); + + return () => clearInterval(intervalId); + }, msToNextMinute); + + return () => clearTimeout(timeoutId); + }, [dispatch, updateCurrentTime]); + const getCurrentTimeMarkerProps = useCallback(() => { const { hour, minute } = state.currentTime From 87544e219a02265e141d3eab9060eb5c182b9764 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 12 Jun 2024 18:03:24 +0200 Subject: [PATCH 063/163] docs: update jsdocs --- .../react-time/src/useCalendar/useCalendar.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 4341b1f5..d5b933da 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -57,16 +57,16 @@ interface UseCalendarProps< * * @returns {Object} calendarState - The state and functions for managing the calendar. * @returns {Temporal.PlainDate} calendarState.currentPeriod - The current period displayed by the calendar. - * @returns {Function} calendarState.goToPreviousPeriod - Function to navigate to the previous period. - * @returns {Function} calendarState.goToNextPeriod - Function to navigate to the next period. - * @returns {Function} calendarState.goToCurrentPeriod - Function to navigate to the current period. - * @returns {Function} calendarState.goToSpecificPeriod - Function to navigate to a specific period. - * @returns {Array>} calendarState.days - The calendar grid, where each cell contains the date and events for that day. - * @returns {string[]} calendarState.daysNames - An array of day names based on the locale and week start day. * @returns {'month' | 'week' | number} calendarState.viewMode - The current view mode of the calendar. - * @returns {Function} calendarState.changeViewMode - Function to change the view mode of the calendar. - * @returns {Function} calendarState.getEventProps - Function to retrieve the style properties for a specific event based on its ID. - * @returns {Function} calendarState.currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. + * @returns {Function} goToPreviousPeriod - Function to navigate to the previous period. + * @returns {Function} goToNextPeriod - Function to navigate to the next period. + * @returns {Function} goToCurrentPeriod - Function to navigate to the current period. + * @returns {Function} goToSpecificPeriod - Function to navigate to a specific period. + * @returns {Array>} days - The calendar grid, where each cell contains the date and events for that day. + * @returns {string[]} daysNames - An array of day names based on the locale and week start day. + * @returns {Function} changeViewMode - Function to change the view mode of the calendar. + * @returns {Function} getEventProps - Function to retrieve the style properties for a specific event based on its ID. + * @returns {Function} currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. */ export const useCalendar = < TEvent extends Event, From b5ae21e1401eed1e628a34904acb237b8dfaa69b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 12 Jun 2024 22:09:25 +0200 Subject: [PATCH 064/163] test: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 2a7f6d3c..7bfe44b3 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,6 +1,6 @@ import { Temporal } from '@js-temporal/polyfill' import { describe, expect, test, vi } from 'vitest' -import { act, renderHook } from '@testing-library/react' +import { act, renderHook, waitFor } from '@testing-library/react' import { useCalendar } from '../useCalendar' import type { UseCalendarAction } from '../useCalendar/calendarActions'; import type { UseCalendarState } from '../useCalendar/useCalendarState'; @@ -177,7 +177,7 @@ describe('useCalendar', () => { useCalendar({ viewMode: { value: 1, unit: 'week' } }), ); - let currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); + const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); expect(currentTimeMarkerProps).toEqual({ style: { @@ -189,19 +189,18 @@ describe('useCalendar', () => { }); act(() => { - vi.useFakeTimers(); vi.advanceTimersByTime(60000); }); - currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', + waitFor(() => { + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); }); }); From f5bd2b7cc6a1e78430e2ce05744ed1e3ac103d6b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 12 Jun 2024 22:16:59 +0200 Subject: [PATCH 065/163] refactor: getCurrentTimeMarkerProps --- .../react-time/src/useCalendar/useCalendar.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index d5b933da..aa19d16d 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useTransition } from 'react' +import { useCallback, useEffect, useMemo, useRef, useTransition } from 'react' import { Temporal } from '@js-temporal/polyfill' import { generateDateRange, getEventProps, getFirstDayOfMonth, getFirstDayOfWeek, groupDaysBy, splitMultiDayEvents } from '@tanstack/time' @@ -81,6 +81,7 @@ export const useCalendar = < }: UseCalendarProps) => { const today = Temporal.Now.plainDateISO() const [isPending, startTransition] = useTransition() + const currentTimeInterval = useRef() const [state, dispatch] = useCalendarReducer( { currentPeriod: today, @@ -246,17 +247,17 @@ export const useCalendar = < const updateCurrentTime = useCallback(() => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), [dispatch]) useEffect(() => { + if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current); + const now = Temporal.Now.plainDateTimeISO(); const msToNextMinute = (60 - now.second) * 1000 - now.millisecond; - - const timeoutId = setTimeout(() => { + + currentTimeInterval.current = setTimeout(() => { updateCurrentTime(); - const intervalId = setInterval(updateCurrentTime, 60000); - - return () => clearInterval(intervalId); + currentTimeInterval.current = setInterval(updateCurrentTime, 60000); }, msToNextMinute); - - return () => clearTimeout(timeoutId); + + return () => clearTimeout(currentTimeInterval.current); }, [dispatch, updateCurrentTime]); From c03128c56688e6405e36d3d84d34c87667a987ad Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 13 Jun 2024 22:32:43 +0200 Subject: [PATCH 066/163] feat: calendar core --- .../react-time/src/useCalendar/useCalendar.ts | 343 +++--------------- packages/time/package.json | 3 +- packages/time/src/calendar-core.ts | 281 ++++++++++++++ packages/time/src/index.ts | 2 +- pnpm-lock.yaml | 7 + 5 files changed, 348 insertions(+), 288 deletions(-) create mode 100644 packages/time/src/calendar-core.ts diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index aa19d16d..5d8acf32 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,252 +1,22 @@ -import { useCallback, useEffect, useMemo, useRef, useTransition } from 'react' -import { Temporal } from '@js-temporal/polyfill' +import { useEffect, useRef, useState, useTransition } from 'react'; +import { Temporal } from '@js-temporal/polyfill'; -import { generateDateRange, getEventProps, getFirstDayOfMonth, getFirstDayOfWeek, groupDaysBy, splitMultiDayEvents } from '@tanstack/time' -import { actions } from './calendarActions' -import { useCalendarReducer } from './useCalendarReducer' -import type { CalendarState, Event, GroupDaysByProps} from '@tanstack/time'; -import type { UseCalendarAction } from './calendarActions' -import type { CSSProperties } from 'react' +import { CalendarCore, type CalendarCoreOptions, type Event } from '@tanstack/time'; +import type { CalendarState} from '@tanstack/time'; +export const useCalendar = (options: CalendarCoreOptions) => { + const [calendarCore] = useState(() => new CalendarCore(options)); + const [state, setState] = useState(calendarCore.store.state); - -interface UseCalendarProps< - TEvent extends Event, - TState extends CalendarState = CalendarState, -> { - /** - * The day of the week the calendar should start on (0 for Sunday, 6 for Saturday). - * @default 1 - */ - weekStartsOn?: number - /** - * An array of events that the calendar should display. - */ - events?: TEvent[] - /** - * The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. - */ - viewMode: TState['viewMode'] - /** - * The locale to use for formatting dates and times. - */ - locale?: Parameters['0'] - /** - * Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. - */ - onChangeViewMode?: (viewMode: TState['viewMode']) => void - /** - * Custom reducer function to manage the state of the calendar. - */ - reducer?: ( - state: TState, - action: TAction, - ) => TState -} - -/** - * Hook to manage the state and behavior of a calendar. - * - * @param {UseCalendarProps} props - The configuration properties for the calendar. - * @param {number} [props.weekStartsOn=1] - The day of the week the calendar should start on (1 for Monday, 7 for Sunday). - * @param {TEvent[]} [props.events] - An array of events that the calendar should display. - * @param {'month' | 'week' | number} props.viewMode - The initial view mode of the calendar. It can be 'month', 'week', or a number representing the number of days in a custom view mode. - * @param {Intl.LocalesArgument} [props.locale] - The locale to use for formatting dates and times. - * @param {Function} [props.onChangeViewMode] - Callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. - * @param {Function} [props.reducer] - Custom reducer function to manage the state of the calendar. - * - * @returns {Object} calendarState - The state and functions for managing the calendar. - * @returns {Temporal.PlainDate} calendarState.currentPeriod - The current period displayed by the calendar. - * @returns {'month' | 'week' | number} calendarState.viewMode - The current view mode of the calendar. - * @returns {Function} goToPreviousPeriod - Function to navigate to the previous period. - * @returns {Function} goToNextPeriod - Function to navigate to the next period. - * @returns {Function} goToCurrentPeriod - Function to navigate to the current period. - * @returns {Function} goToSpecificPeriod - Function to navigate to a specific period. - * @returns {Array>} days - The calendar grid, where each cell contains the date and events for that day. - * @returns {string[]} daysNames - An array of day names based on the locale and week start day. - * @returns {Function} changeViewMode - Function to change the view mode of the calendar. - * @returns {Function} getEventProps - Function to retrieve the style properties for a specific event based on its ID. - * @returns {Function} currentTimeMarkerProps - Function to retrieve the style properties and current time for the current time marker. - */ -export const useCalendar = < - TEvent extends Event, - TState extends CalendarState = CalendarState, ->({ - weekStartsOn = 1, - events, - viewMode: initialViewMode, - locale, - onChangeViewMode, - reducer, -}: UseCalendarProps) => { - const today = Temporal.Now.plainDateISO() - const [isPending, startTransition] = useTransition() - const currentTimeInterval = useRef() - const [state, dispatch] = useCalendarReducer( - { - currentPeriod: today, - viewMode: initialViewMode, - currentTime: Temporal.Now.plainDateTimeISO(), - } as TState, - reducer, - ) - - const firstDayOfMonth = useMemo( - () => - getFirstDayOfMonth( - state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7), - ), - [state.currentPeriod], - ) - - const firstDayOfWeek = useMemo( - () => getFirstDayOfWeek(state.currentPeriod.toString(), weekStartsOn), - [state.currentPeriod, weekStartsOn], - ) - - const calendarDays = useMemo(() => { - const start = - state.viewMode.unit === 'month' - ? firstDayOfMonth.subtract({ - days: (firstDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7, - }) - : state.currentPeriod - - let end - switch (state.viewMode.unit) { - case 'month': { - const lastDayOfMonth = firstDayOfMonth - .add({ months: state.viewMode.value }) - .subtract({ days: 1 }) - const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - weekStartsOn + 7) % 7 - end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) - break - } - case 'week': { - end = firstDayOfWeek.add({ days: 7 * state.viewMode.value - 1 }) - break - } - case 'day': { - end = state.currentPeriod.add({ days: state.viewMode.value - 1 }) - break - } - } - - const allDays = generateDateRange(start, end) - const startMonth = state.currentPeriod.month - const endMonth = state.currentPeriod.add({ - months: state.viewMode.value - 1, - }).month - - return allDays.filter( - (day) => day.month >= startMonth && day.month <= endMonth, - ) - }, [ - state.viewMode, - firstDayOfMonth, - firstDayOfWeek, - weekStartsOn, - state.currentPeriod, - ]) - - const eventMap = useMemo(() => { - const map = new Map() - events?.forEach((event) => { - const eventStartDate = Temporal.PlainDateTime.from(event.startDate) - const eventEndDate = Temporal.PlainDateTime.from(event.endDate) - if ( - Temporal.PlainDate.compare( - eventStartDate.toPlainDate(), - eventEndDate.toPlainDate(), - ) !== 0 - ) { - const splitEvents = splitMultiDayEvents(event) - splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.startDate.toString().split('T')[0] - if (splitKey) { - if (!map.has(splitKey)) map.set(splitKey, []) - map.get(splitKey)?.push(splitEvent) - } - }) - } else { - const eventKey = event.startDate.toString().split('T')[0] - if (eventKey) { - if (!map.has(eventKey)) map.set(eventKey, []) - map.get(eventKey)?.push(event) - } - } - }) - return map - }, [events]) - - const daysWithEvents = useMemo( - () => - calendarDays.map((day) => { - const dayKey = day.toString() - const dailyEvents = eventMap.get(dayKey) ?? [] - const currentMonthRange = Array.from( - { length: state.viewMode.value }, - (_, i) => state.currentPeriod.add({ months: i }).month, - ) - const isInCurrentPeriod = currentMonthRange.includes(day.month) - return { - date: day, - events: dailyEvents, - isToday: - Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, - isInCurrentPeriod, - } - }), - [calendarDays, eventMap, state.viewMode, state.currentPeriod], - ) - - const goToPreviousPeriod = useCallback( - () => - startTransition(() => - dispatch(actions.goToPreviousPeriod({ weekStartsOn })), - ), - [dispatch, weekStartsOn], - ) - - const goToNextPeriod = useCallback( - () => - startTransition(() => dispatch(actions.goToNextPeriod({ weekStartsOn }))), - [dispatch, weekStartsOn], - ) - - const goToCurrentPeriod = useCallback( - () => - startTransition(() => - dispatch(actions.setCurrentPeriod(Temporal.Now.plainDateISO())), - ), - [dispatch], - ) - - const goToSpecificPeriod = useCallback( - (date: Temporal.PlainDate) => - startTransition(() => dispatch(actions.setCurrentPeriod(date))), - [dispatch], - ) - - const changeViewMode = useCallback( - (newViewMode: TState['viewMode']) => { - startTransition(() => { - dispatch(actions.setViewMode(newViewMode)) - onChangeViewMode?.(newViewMode) - }) - }, - [dispatch, onChangeViewMode], - ) - - const getEventPropsCallback = useCallback( - (id: Event['id']): { style: CSSProperties } | null => getEventProps(eventMap, id, state), - [eventMap, state], - ) - - const updateCurrentTime = useCallback(() => dispatch(actions.updateCurrentTime(Temporal.Now.plainDateTimeISO())), [dispatch]) + const [isPending, startTransition] = useTransition(); + const currentTimeInterval = useRef(); useEffect(() => { + const updateCurrentTime = () => { + calendarCore.updateCurrentTime(); + setState({ ...calendarCore.store.state }); + }; + if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current); const now = Temporal.Now.plainDateTimeISO(); @@ -258,41 +28,42 @@ export const useCalendar = < }, msToNextMinute); return () => clearTimeout(currentTimeInterval.current); - }, [dispatch, updateCurrentTime]); - - - const getCurrentTimeMarkerProps = useCallback(() => { - const { hour, minute } = state.currentTime - const currentTimeInMinutes = hour * 60 + minute - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 - - return { - style: { - position: 'absolute', - top: `${percentageOfDay}%`, - left: 0, - }, - currentTime: state.currentTime.toString().split('T')[1]?.substring(0, 5), - } - }, [state.currentTime]) - - const daysNames = useMemo(() => { - const baseDate = Temporal.PlainDate.from('2024-01-01') - return Array.from({ length: 7 }).map((_, i) => - baseDate - .add({ days: (i + weekStartsOn - 1) % 7 }) - .toLocaleString(locale, { weekday: 'short' }), - ) - }, [locale, weekStartsOn]) - - const groupDaysByCallback = useCallback( - ({ - days, - unit, - fillMissingDays = true, - }: Omit, 'weekStartsOn'>) => groupDaysBy({ days, unit, fillMissingDays, weekStartsOn } as GroupDaysByProps), - [weekStartsOn], - ) + }, [calendarCore]); + + const goToPreviousPeriod = () => { + startTransition(() => { + calendarCore.goToPreviousPeriod(); + setState({ ...calendarCore.store.state }); + }); + }; + + const goToNextPeriod = () => { + startTransition(() => { + calendarCore.goToNextPeriod(); + setState({ ...calendarCore.store.state }); + }); + }; + + const goToCurrentPeriod = () => { + startTransition(() => { + calendarCore.goToCurrentPeriod(); + setState({ ...calendarCore.store.state }); + }); + }; + + const goToSpecificPeriod = (date: Temporal.PlainDate) => { + startTransition(() => { + calendarCore.goToSpecificPeriod(date); + setState({ ...calendarCore.store.state }); + }); + }; + + const changeViewMode = (newViewMode: CalendarState['viewMode']) => { + startTransition(() => { + calendarCore.changeViewMode(newViewMode); + setState({ ...calendarCore.store.state }); + }); + }; return { ...state, @@ -300,12 +71,12 @@ export const useCalendar = < goToNextPeriod, goToCurrentPeriod, goToSpecificPeriod, - days: daysWithEvents, - daysNames, + days: calendarCore.getDaysWithEvents(), + daysNames: calendarCore.getDaysNames(), changeViewMode, - getEventProps: getEventPropsCallback, - getCurrentTimeMarkerProps, + getEventProps: calendarCore.getEventProps.bind(calendarCore), + getCurrentTimeMarkerProps: calendarCore.getCurrentTimeMarkerProps.bind(calendarCore), isPending, - groupDaysBy: groupDaysByCallback, - } -} + groupDaysBy: calendarCore.groupDaysBy.bind(calendarCore), + }; +}; diff --git a/packages/time/package.json b/packages/time/package.json index a1233303..44f58127 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,8 @@ "src" ], "dependencies": { - "@js-temporal/polyfill": "^0.4.4" + "@js-temporal/polyfill": "^0.4.4", + "@tanstack/store": "^0.4.1" }, "devDependencies": { "csstype": "^3.1.3" diff --git a/packages/time/src/calendar-core.ts b/packages/time/src/calendar-core.ts new file mode 100644 index 00000000..f5ff903e --- /dev/null +++ b/packages/time/src/calendar-core.ts @@ -0,0 +1,281 @@ +import { Store } from '@tanstack/store'; +import { Temporal } from '@js-temporal/polyfill'; +import { getFirstDayOfMonth, getFirstDayOfWeek } from './utils'; +import { generateDateRange } from './calendar/generateDateRange'; +import { splitMultiDayEvents } from './calendar/splitMultiDayEvents'; +import { getEventProps } from './calendar/getEventProps'; +import { groupDaysBy } from './calendar/groupDaysBy'; +import type { GroupDaysByProps} from './calendar/groupDaysBy'; + +export interface Event { + id: string + startDate: Temporal.PlainDateTime + endDate: Temporal.PlainDateTime + title: string +} + +export interface CalendarState { + currentPeriod: Temporal.PlainDate + viewMode: { + value: number + unit: 'month' | 'week' | 'day' + } + currentTime: Temporal.PlainDateTime +} + +export type Day = { + date: Temporal.PlainDate + events: TEvent[] + isToday: boolean + isInCurrentPeriod: boolean +} + +export interface CalendarCoreOptions { + weekStartsOn: number; + events?: TEvent[]; + viewMode: CalendarState['viewMode']; + locale?: Parameters['0']; +} + +export class CalendarCore { + store: Store; + options: CalendarCoreOptions; + + constructor(options: CalendarCoreOptions) { + this.options = options; + this.store = new Store({ + currentPeriod: Temporal.Now.plainDateISO(), + viewMode: options.viewMode, + currentTime: Temporal.Now.plainDateTimeISO(), + }); + } + + private getFirstDayOfMonth() { + return getFirstDayOfMonth( + this.store.state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7), + ); + } + + private getFirstDayOfWeek() { + return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.weekStartsOn || 1); + } + + private getCalendarDays() { + const start = + this.store.state.viewMode.unit === 'month' + ? this.getFirstDayOfMonth().subtract({ + days: (this.getFirstDayOfMonth().dayOfWeek - (this.options.weekStartsOn || 1) + 7) % 7, + }) + : this.store.state.currentPeriod; + + let end; + switch (this.store.state.viewMode.unit) { + case 'month': { + const lastDayOfMonth = this.getFirstDayOfMonth() + .add({ months: this.store.state.viewMode.value }) + .subtract({ days: 1 }); + const lastDayOfMonthWeekDay = + (lastDayOfMonth.dayOfWeek - (this.options.weekStartsOn || 1) + 7) % 7; + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); + break; + } + case 'week': { + end = this.getFirstDayOfWeek().add({ days: 7 * this.store.state.viewMode.value - 1 }); + break; + } + case 'day': { + end = this.store.state.currentPeriod.add({ days: this.store.state.viewMode.value - 1 }); + break; + } + } + + const allDays = generateDateRange(start, end); + const startMonth = this.store.state.currentPeriod.month; + const endMonth = this.store.state.currentPeriod.add({ + months: this.store.state.viewMode.value - 1, + }).month; + + return allDays.filter( + (day) => day.month >= startMonth && day.month <= endMonth, + ); + } + + private getEventMap() { + const map = new Map(); + this.options.events?.forEach((event) => { + const eventStartDate = Temporal.PlainDateTime.from(event.startDate); + const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + if ( + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 + ) { + const splitEvents = splitMultiDayEvents(event); + splitEvents.forEach((splitEvent) => { + const splitKey = splitEvent.startDate.toString().split('T')[0]; + if (splitKey) { + if (!map.has(splitKey)) map.set(splitKey, []); + map.get(splitKey)?.push(splitEvent); + } + }); + } else { + const eventKey = event.startDate.toString().split('T')[0]; + if (eventKey) { + if (!map.has(eventKey)) map.set(eventKey, []); + map.get(eventKey)?.push(event); + } + } + }); + return map; + } + + getDaysWithEvents() { + const calendarDays = this.getCalendarDays(); + const eventMap = this.getEventMap(); + return calendarDays.map((day) => { + const dayKey = day.toString(); + const dailyEvents = eventMap.get(dayKey) ?? []; + const currentMonthRange = Array.from( + { length: this.store.state.viewMode.value }, + (_, i) => this.store.state.currentPeriod.add({ months: i }).month, + ); + const isInCurrentPeriod = currentMonthRange.includes(day.month); + return { + date: day, + events: dailyEvents, + isToday: + Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, + isInCurrentPeriod, + }; + }); + } + + getDaysNames() { + const baseDate = Temporal.PlainDate.from('2024-01-01'); + return Array.from({ length: 7 }).map((_, i) => + baseDate + .add({ days: (i + (this.options.weekStartsOn || 1) - 1) % 7 }) + .toLocaleString(this.options.locale, { weekday: 'short' }), + ); + } + + changeViewMode(newViewMode: CalendarState['viewMode']) { + this.store.setState((prev) => ({ + ...prev, + viewMode: newViewMode, + })); + } + + goToPreviousPeriod() { + const firstDayOfMonth = this.getFirstDayOfMonth(); + const firstDayOfWeek = this.getFirstDayOfWeek(); + + switch (this.store.state.viewMode.unit) { + case 'month': { + const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: firstDayOfPrevMonth, + })); + break; + } + + case 'week': { + const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: firstDayOfPrevWeek, + })); + break; + } + + case 'day': { + const prevCustomStart = this.store.state.currentPeriod.subtract({ days: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: prevCustomStart, + })); + break; + } + } + } + + goToNextPeriod() { + const firstDayOfMonth = this.getFirstDayOfMonth(); + const firstDayOfWeek = this.getFirstDayOfWeek(); + + switch (this.store.state.viewMode.unit) { + case 'month': { + const firstDayOfNextMonth = firstDayOfMonth.add({ months: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: firstDayOfNextMonth, + })); + break; + } + + case 'week': { + const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: firstDayOfNextWeek, + })); + break; + } + + case 'day': { + const nextCustomStart = this.store.state.currentPeriod.add({ days: this.store.state.viewMode.value }); + this.store.setState((prev) => ({ + ...prev, + currentPeriod: nextCustomStart, + })); + break; + } + } + } + + goToCurrentPeriod() { + this.store.setState((prev) => ({ + ...prev, + currentPeriod: Temporal.Now.plainDateISO(), + })); + } + + goToSpecificPeriod(date: Temporal.PlainDate) { + this.store.setState((prev) => ({ + ...prev, + currentPeriod: date, + })); + } + + updateCurrentTime() { + this.store.setState((prev) => ({ + ...prev, + currentTime: Temporal.Now.plainDateTimeISO(), + })); + } + + getEventProps(id: Event['id']) { + return getEventProps(this.getEventMap(), id, this.store.state); + } + + getCurrentTimeMarkerProps() { + const { hour, minute } = this.store.state.currentTime; + const currentTimeInMinutes = hour * 60 + minute; + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + + return { + style: { + position: 'absolute', + top: `${percentageOfDay}%`, + left: 0, + }, + currentTime: this.store.state.currentTime.toString().split('T')[1]?.substring(0, 5), + }; + } + + groupDaysBy({ days, unit, fillMissingDays = true }: Omit, 'weekStartsOn'>) { + return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.options.weekStartsOn } as GroupDaysByProps); + } +} diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 6370bcc1..0e2559bb 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -2,4 +2,4 @@ * TanStack Time */ export * from './utils'; -export * from './calendar'; +export * from './calendar-core'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7de84db3..8e864d4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,6 +194,9 @@ importers: '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 + '@tanstack/store': + specifier: ^0.4.1 + version: 0.4.1 devDependencies: csstype: specifier: ^3.1.3 @@ -3310,6 +3313,10 @@ packages: - vite dev: true + /@tanstack/store@0.4.1: + resolution: {integrity: sha512-NvW3MomYSTzQK61AWdtWNIhWgszXFZDRgCNlvSDw/DBaoLqJIlZ0/gKLsditA8un/BGU1NR06+j0a/UNLgXA+Q==} + dev: false + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} From 3c48a5e5972a8dedf48556bc145a870ec743ed6e Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 14 Jun 2024 00:10:37 +0200 Subject: [PATCH 067/163] feat: calendar core --- packages/time/src/calendar-core.ts | 61 +++--- .../src/calendar/getCurrentTimeMarkerProps.ts | 17 -- packages/time/src/calendar/types.ts | 8 +- packages/time/src/tests/calendar-core.test.ts | 188 ++++++++++++++++++ 4 files changed, 225 insertions(+), 49 deletions(-) delete mode 100644 packages/time/src/calendar/getCurrentTimeMarkerProps.ts create mode 100644 packages/time/src/tests/calendar-core.test.ts diff --git a/packages/time/src/calendar-core.ts b/packages/time/src/calendar-core.ts index f5ff903e..4f2ed916 100644 --- a/packages/time/src/calendar-core.ts +++ b/packages/time/src/calendar-core.ts @@ -5,38 +5,43 @@ import { generateDateRange } from './calendar/generateDateRange'; import { splitMultiDayEvents } from './calendar/splitMultiDayEvents'; import { getEventProps } from './calendar/getEventProps'; import { groupDaysBy } from './calendar/groupDaysBy'; -import type { GroupDaysByProps} from './calendar/groupDaysBy'; +import type { Properties as CSSProperties } from 'csstype'; +import type { GroupDaysByProps } from './calendar/groupDaysBy'; +import type { CalendarState, Day, Event } from './calendar/types'; -export interface Event { - id: string - startDate: Temporal.PlainDateTime - endDate: Temporal.PlainDateTime - title: string -} - -export interface CalendarState { - currentPeriod: Temporal.PlainDate - viewMode: { - value: number - unit: 'month' | 'week' | 'day' - } - currentTime: Temporal.PlainDateTime -} +export type { CalendarState, Event, Day } from './calendar/types'; -export type Day = { - date: Temporal.PlainDate - events: TEvent[] - isToday: boolean - isInCurrentPeriod: boolean +export interface ViewMode { + value: number; + unit: 'month' | 'week' | 'day'; } export interface CalendarCoreOptions { - weekStartsOn: number; + weekStartsOn?: number; events?: TEvent[]; viewMode: CalendarState['viewMode']; locale?: Parameters['0']; } +export interface CalendarApi { + currentPeriod: CalendarState['currentPeriod']; + viewMode: CalendarState['viewMode']; + currentTime: CalendarState['currentTime']; + days: Array>; + daysNames: string[]; + goToPreviousPeriod: () => void; + goToNextPeriod: () => void; + goToCurrentPeriod: () => void; + goToSpecificPeriod: (date: Temporal.PlainDate) => void; + changeViewMode: (newViewMode: CalendarState['viewMode']) => void; + getEventProps: (id: Event['id']) => { style: CSSProperties } | null; + getCurrentTimeMarkerProps: () => { + style: CSSProperties; + currentTime: string | undefined; + }; + groupDaysBy: (props: Omit, 'weekStartsOn'>) => (Day | null)[][]; +} + export class CalendarCore { store: Store; options: CalendarCoreOptions; @@ -57,14 +62,14 @@ export class CalendarCore { } private getFirstDayOfWeek() { - return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.weekStartsOn || 1); + return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.weekStartsOn ?? 1); } private getCalendarDays() { const start = this.store.state.viewMode.unit === 'month' ? this.getFirstDayOfMonth().subtract({ - days: (this.getFirstDayOfMonth().dayOfWeek - (this.options.weekStartsOn || 1) + 7) % 7, + days: (this.getFirstDayOfMonth().dayOfWeek - (this.options.weekStartsOn ?? 1) + 7) % 7, }) : this.store.state.currentPeriod; @@ -75,7 +80,7 @@ export class CalendarCore { .add({ months: this.store.state.viewMode.value }) .subtract({ days: 1 }); const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - (this.options.weekStartsOn || 1) + 7) % 7; + (lastDayOfMonth.dayOfWeek - (this.options.weekStartsOn ?? 1) + 7) % 7; end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); break; } @@ -155,7 +160,7 @@ export class CalendarCore { const baseDate = Temporal.PlainDate.from('2024-01-01'); return Array.from({ length: 7 }).map((_, i) => baseDate - .add({ days: (i + (this.options.weekStartsOn || 1) - 1) % 7 }) + .add({ days: (i + (this.options.weekStartsOn ?? 1) - 1) % 7 }) .toLocaleString(this.options.locale, { weekday: 'short' }), ); } @@ -260,7 +265,7 @@ export class CalendarCore { return getEventProps(this.getEventMap(), id, this.store.state); } - getCurrentTimeMarkerProps() { + getCurrentTimeMarkerProps(): { style: CSSProperties; currentTime: string | undefined } { const { hour, minute } = this.store.state.currentTime; const currentTimeInMinutes = hour * 60 + minute; const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; @@ -276,6 +281,6 @@ export class CalendarCore { } groupDaysBy({ days, unit, fillMissingDays = true }: Omit, 'weekStartsOn'>) { - return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.options.weekStartsOn } as GroupDaysByProps); + return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.options.weekStartsOn ?? 1 } as GroupDaysByProps); } } diff --git a/packages/time/src/calendar/getCurrentTimeMarkerProps.ts b/packages/time/src/calendar/getCurrentTimeMarkerProps.ts deleted file mode 100644 index 76d17c94..00000000 --- a/packages/time/src/calendar/getCurrentTimeMarkerProps.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Temporal } from "@js-temporal/polyfill"; -import type { Properties as CSSProperties } from "csstype"; - -export const getCurrentTimeMarkerProps = (currentTime: Temporal.PlainDateTime): { style: CSSProperties; currentTime: string | undefined } => { - const { hour, minute } = currentTime; - const currentTimeInMinutes = hour * 60 + minute; - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; - - return { - style: { - position: 'absolute', - top: `${percentageOfDay}%`, - left: 0, - }, - currentTime: currentTime.toString().split('T')[1]?.substring(0, 5), - }; -}; \ No newline at end of file diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index d8552b43..8da9ad3b 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -1,10 +1,10 @@ import type { Temporal } from "@js-temporal/polyfill" export interface Event { - id: string - startDate: Temporal.PlainDateTime - endDate: Temporal.PlainDateTime - title: string + id: string; + startDate: Temporal.PlainDateTime; + endDate: Temporal.PlainDateTime; + title: string; } export interface CalendarState { diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts new file mode 100644 index 00000000..25c576ca --- /dev/null +++ b/packages/time/src/tests/calendar-core.test.ts @@ -0,0 +1,188 @@ +import { Temporal } from '@js-temporal/polyfill'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { CalendarCore } from '../calendar-core'; +import type { CalendarCoreOptions, Event } from '../calendar-core'; + +describe('CalendarCore', () => { + let options: CalendarCoreOptions; + let calendarCore: CalendarCore; + const mockDate = Temporal.PlainDate.from('2023-06-15'); + const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00'); + + beforeEach(() => { + options = { + weekStartsOn: 1, + viewMode: { value: 1, unit: 'month' }, + events: [ + { + id: '1', + startDate: Temporal.PlainDateTime.from('2023-06-10T09:00'), + endDate: Temporal.PlainDateTime.from('2023-06-10T10:00'), + title: 'Event 1', + }, + { + id: '2', + startDate: Temporal.PlainDateTime.from('2023-06-12T11:00'), + endDate: Temporal.PlainDateTime.from('2023-06-12T12:00'), + title: 'Event 2', + }, + ], + }; + calendarCore = new CalendarCore(options); + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + }); + + test('should initialize with the correct current period', () => { + const today = Temporal.Now.plainDateISO(); + expect(calendarCore.store.state.currentPeriod).toEqual(today); + }); + + test('should get the correct days with events for the month', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + expect(daysWithEvents.length).toBeGreaterThan(0); + }); + + test('should correctly map events to days', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + const dayWithEvent1 = daysWithEvents.find((day) => day.date.equals(Temporal.PlainDate.from('2023-06-10'))); + const dayWithEvent2 = daysWithEvents.find((day) => day.date.equals(Temporal.PlainDate.from('2023-06-12'))); + expect(dayWithEvent1?.events).toHaveLength(1); + expect(dayWithEvent1?.events[0]?.id).toBe('1'); + expect(dayWithEvent2?.events).toHaveLength(1); + expect(dayWithEvent2?.events[0]?.id).toBe('2'); + }); + + test('should change view mode correctly', () => { + calendarCore.changeViewMode({ value: 2, unit: 'week' }); + expect(calendarCore.store.state.viewMode.value).toBe(2); + expect(calendarCore.store.state.viewMode.unit).toBe('week'); + }); + + test('should go to previous period correctly', () => { + const initialPeriod = calendarCore.store.state.currentPeriod; + calendarCore.goToPreviousPeriod(); + const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }); + expect(calendarCore.store.state.currentPeriod).toEqual(expectedPreviousMonth); + }); + + test('should go to next period correctly', () => { + const initialPeriod = calendarCore.store.state.currentPeriod; + calendarCore.goToNextPeriod(); + const expectedNextMonth = initialPeriod.add({ months: 1 }); + expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth); + }); + + test('should go to current period correctly', () => { + calendarCore.goToNextPeriod(); + calendarCore.goToCurrentPeriod(); + const today = Temporal.Now.plainDateISO(); + expect(calendarCore.store.state.currentPeriod).toEqual(today); + }); + + test('should go to specific period correctly', () => { + const specificDate = Temporal.PlainDate.from('2023-07-01'); + calendarCore.goToSpecificPeriod(specificDate); + expect(calendarCore.store.state.currentPeriod).toEqual(specificDate); + }); + + test('should update current time correctly', () => { + const initialTime = calendarCore.store.state.currentTime; + const newMockDateTime = initialTime.add({ minutes: 1 }); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); + + calendarCore.updateCurrentTime(); + const updatedTime = calendarCore.store.state.currentTime; + expect(updatedTime).toEqual(newMockDateTime); + }); + + test('should return the correct props for the current time marker', () => { + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:00')); + + const coreOptions: CalendarCoreOptions = { + weekStartsOn: 1, + viewMode: { value: 1, unit: 'week' }, + events: [], + }; + calendarCore = new CalendarCore(coreOptions); + + const currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.83333333333333%', + left: 0, + }, + currentTime: '11:00', + }); + }); + + test('should update the current time marker props after time passes', () => { + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:00')); + + const coreOptions: CalendarCoreOptions = { + weekStartsOn: 1, + viewMode: { value: 1, unit: 'week' }, + events: [], + }; + calendarCore = new CalendarCore(coreOptions); + + let currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.83333333333333%', + left: 0, + }, + currentTime: '11:00', + }); + + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:01:00')); + + calendarCore.updateCurrentTime(); + currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); + }); + + test('should update the current time marker props after time passes when the next minute is in less than a minute', () => { + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:55')); + + + const coreOptions: CalendarCoreOptions = { + weekStartsOn: 1, + viewMode: { value: 1, unit: 'week' }, + events: [], + }; + calendarCore = new CalendarCore(coreOptions); + + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:01:00')); + + calendarCore.updateCurrentTime(); + const currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); + + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); + }); + + test('should group days correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month'}); + expect(groupedDays.length).toBeGreaterThan(0); + }); +}); From 649947544969204389342087fa119f36f8233be9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 14 Jun 2024 00:10:44 +0200 Subject: [PATCH 068/163] feat: calendar core --- packages/react-time/package.json | 1 + .../react-time/src/tests/useCalendar.test.tsx | 26 ------ .../src/useCalendar/calendarActions.ts | 13 --- .../react-time/src/useCalendar/useCalendar.ts | 93 +++++++++---------- .../src/useCalendar/useCalendarReducer.ts | 90 ------------------ .../src/useCalendar/useCalendarState.ts | 17 ---- pnpm-lock.yaml | 15 +++ 7 files changed, 62 insertions(+), 193 deletions(-) delete mode 100644 packages/react-time/src/useCalendar/calendarActions.ts delete mode 100644 packages/react-time/src/useCalendar/useCalendarReducer.ts delete mode 100644 packages/react-time/src/useCalendar/useCalendarState.ts diff --git a/packages/react-time/package.json b/packages/react-time/package.json index 0181e8d0..84a9a616 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -63,6 +63,7 @@ }, "dependencies": { "@js-temporal/polyfill": "^0.4.4", + "@tanstack/react-store": "^0.4.1", "@tanstack/time": "workspace:*", "typesafe-actions": "^5.1.0", "use-sync-external-store": "^1.2.0" diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 7bfe44b3..c59201b1 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -2,8 +2,6 @@ import { Temporal } from '@js-temporal/polyfill' import { describe, expect, test, vi } from 'vitest' import { act, renderHook, waitFor } from '@testing-library/react' import { useCalendar } from '../useCalendar' -import type { UseCalendarAction } from '../useCalendar/calendarActions'; -import type { UseCalendarState } from '../useCalendar/useCalendarState'; describe('useCalendar', () => { const events = [ @@ -332,30 +330,6 @@ describe('useCalendar', () => { ) }) - test(`should allow overriding the reducer`, () => { - const customReducer = (state: UseCalendarState, action: UseCalendarAction) => { - if (action.type === 'SET_NEXT_PERIOD') { - return { - ...state, - currentPeriod: state.currentPeriod.add({ months: 2 }), - } - } - - return state - } - - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, reducer: customReducer }), - ) - - act(() => { - result.current.goToNextPeriod() - }) - - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 2 }) - expect(result.current.currentPeriod).toEqual(expectedNextMonth) - }); - test('should group days by months correctly', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 2, unit: 'month' }, locale: 'en-US' }) diff --git a/packages/react-time/src/useCalendar/calendarActions.ts b/packages/react-time/src/useCalendar/calendarActions.ts deleted file mode 100644 index abf5c73b..00000000 --- a/packages/react-time/src/useCalendar/calendarActions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createAction } from 'typesafe-actions'; -import type { Temporal } from '@js-temporal/polyfill'; -import type { ActionType } from 'typesafe-actions'; -import type { UseCalendarState } from './useCalendarState'; - -const setViewMode = createAction('SET_VIEW_MODE')(); -const updateCurrentTime = createAction('UPDATE_CURRENT_TIME')(); -const setCurrentPeriod = createAction('SET_CURRENT_PERIOD')(); -const goToNextPeriod = createAction('SET_NEXT_PERIOD')<{ weekStartsOn: number }>(); -const goToPreviousPeriod = createAction('SET_PREVIOUS_PERIOD')<{ weekStartsOn: number }>(); - -export const actions = { setCurrentPeriod, setViewMode, updateCurrentTime, goToNextPeriod, goToPreviousPeriod }; -export type UseCalendarAction = ActionType; diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 5d8acf32..f6b168cd 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,82 +1,81 @@ -import { useEffect, useRef, useState, useTransition } from 'react'; -import { Temporal } from '@js-temporal/polyfill'; +import { useEffect, useRef, useState, useTransition } from 'react' +import { useStore } from '@tanstack/react-store' +import { Temporal } from '@js-temporal/polyfill' +import { CalendarCore, type CalendarState, type Event } from '@tanstack/time' +import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' -import { CalendarCore, type CalendarCoreOptions, type Event } from '@tanstack/time'; -import type { CalendarState} from '@tanstack/time'; +export const useCalendar = ( + options: CalendarCoreOptions, +): CalendarApi & { isPending: boolean } => { + const [calendarCore] = useState(() => new CalendarCore(options)) + const state = useStore(calendarCore.store) -export const useCalendar = (options: CalendarCoreOptions) => { - const [calendarCore] = useState(() => new CalendarCore(options)); - const [state, setState] = useState(calendarCore.store.state); - - const [isPending, startTransition] = useTransition(); - const currentTimeInterval = useRef(); + const [isPending, startTransition] = useTransition() + const currentTimeInterval = useRef() useEffect(() => { const updateCurrentTime = () => { - calendarCore.updateCurrentTime(); - setState({ ...calendarCore.store.state }); - }; + calendarCore.updateCurrentTime() + } - if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current); + if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current) - const now = Temporal.Now.plainDateTimeISO(); - const msToNextMinute = (60 - now.second) * 1000 - now.millisecond; + const now = Temporal.Now.plainDateTimeISO() + const msToNextMinute = (60 - now.second) * 1000 - now.millisecond currentTimeInterval.current = setTimeout(() => { - updateCurrentTime(); - currentTimeInterval.current = setInterval(updateCurrentTime, 60000); - }, msToNextMinute); + updateCurrentTime() + currentTimeInterval.current = setInterval(updateCurrentTime, 60000) + }, msToNextMinute) - return () => clearTimeout(currentTimeInterval.current); - }, [calendarCore]); + return () => clearTimeout(currentTimeInterval.current) + }, [calendarCore]) const goToPreviousPeriod = () => { startTransition(() => { - calendarCore.goToPreviousPeriod(); - setState({ ...calendarCore.store.state }); - }); - }; + calendarCore.goToPreviousPeriod() + }) + } const goToNextPeriod = () => { startTransition(() => { - calendarCore.goToNextPeriod(); - setState({ ...calendarCore.store.state }); - }); - }; + calendarCore.goToNextPeriod() + }) + } const goToCurrentPeriod = () => { startTransition(() => { - calendarCore.goToCurrentPeriod(); - setState({ ...calendarCore.store.state }); - }); - }; + calendarCore.goToCurrentPeriod() + }) + } const goToSpecificPeriod = (date: Temporal.PlainDate) => { startTransition(() => { - calendarCore.goToSpecificPeriod(date); - setState({ ...calendarCore.store.state }); - }); - }; + calendarCore.goToSpecificPeriod(date) + }) + } const changeViewMode = (newViewMode: CalendarState['viewMode']) => { startTransition(() => { - calendarCore.changeViewMode(newViewMode); - setState({ ...calendarCore.store.state }); - }); - }; + calendarCore.changeViewMode(newViewMode) + }) + } return { - ...state, + currentPeriod: state.currentPeriod, + viewMode: state.viewMode, + currentTime: state.currentTime, + days: calendarCore.getDaysWithEvents(), + daysNames: calendarCore.getDaysNames(), goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, goToSpecificPeriod, - days: calendarCore.getDaysWithEvents(), - daysNames: calendarCore.getDaysNames(), changeViewMode, getEventProps: calendarCore.getEventProps.bind(calendarCore), - getCurrentTimeMarkerProps: calendarCore.getCurrentTimeMarkerProps.bind(calendarCore), + getCurrentTimeMarkerProps: + calendarCore.getCurrentTimeMarkerProps.bind(calendarCore), isPending, groupDaysBy: calendarCore.groupDaysBy.bind(calendarCore), - }; -}; + } +} diff --git a/packages/react-time/src/useCalendar/useCalendarReducer.ts b/packages/react-time/src/useCalendar/useCalendarReducer.ts deleted file mode 100644 index d3b87f58..00000000 --- a/packages/react-time/src/useCalendar/useCalendarReducer.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { useMemo, useReducer } from 'react' -import { createReducer } from 'typesafe-actions' - -import { getFirstDayOfMonth, getFirstDayOfWeek } from '@tanstack/time' -import { type UseCalendarAction, actions } from './calendarActions' -import type { UseCalendarState } from './useCalendarState' - -const createCalendarReducer = (initialState: UseCalendarState) => { - return createReducer(initialState) - .handleAction(actions.setCurrentPeriod, (state, action) => ({ - ...state, - currentPeriod: action.payload, - })) - .handleAction(actions.setViewMode, (state, action) => ({ - ...state, - viewMode: action.payload, - })) - .handleAction(actions.updateCurrentTime, (state, action) => ({ - ...state, - currentTime: action.payload, - })) - .handleAction(actions.goToPreviousPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); - const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); - - switch (state.viewMode.unit) { - case 'month': { - const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: state.viewMode.value }); - return { - ...state, - currentPeriod: firstDayOfPrevMonth, - }; - } - case 'week': { - const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: state.viewMode.value }); - return { - ...state, - currentPeriod: firstDayOfPrevWeek, - }; - } - case 'day': { - const prevCustomStart = state.currentPeriod.subtract({ days: state.viewMode.value }); - return { - ...state, - currentPeriod: prevCustomStart, - }; - } - default: - return state; - } - }) - .handleAction(actions.goToNextPeriod, (state, action) => { - const firstDayOfMonth = getFirstDayOfMonth(state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7)); - const firstDayOfWeek = getFirstDayOfWeek(state.currentPeriod.toString(), action.payload.weekStartsOn); - - switch (state.viewMode.unit) { - case 'month': { - const firstDayOfNextMonth = firstDayOfMonth.add({ months: state.viewMode.value }); - return { - ...state, - currentPeriod: firstDayOfNextMonth, - }; - } - case 'week': { - const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: state.viewMode.value }); - return { - ...state, - currentPeriod: firstDayOfNextWeek, - }; - } - case 'day': { - const nextCustomStart = state.currentPeriod.add({ days: state.viewMode.value }); - return { - ...state, - currentPeriod: nextCustomStart, - }; - } - default: - return state; - } - }); -}; - -export const useCalendarReducer = ( - initialState: TState, - extReducer?: (state: TState, action: UseCalendarAction) => TState, -) => { - const reducer = useMemo(() => extReducer ?? createCalendarReducer(initialState), [extReducer, initialState]) - return useReducer(reducer, initialState) -} diff --git a/packages/react-time/src/useCalendar/useCalendarState.ts b/packages/react-time/src/useCalendar/useCalendarState.ts deleted file mode 100644 index c5a3b105..00000000 --- a/packages/react-time/src/useCalendar/useCalendarState.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Temporal } from '@js-temporal/polyfill' - -export interface Event { - id: string - startDate: Temporal.PlainDateTime - endDate: Temporal.PlainDateTime - title: string -} - -export interface UseCalendarState { - currentPeriod: Temporal.PlainDate - viewMode: { - value: number - unit: 'month' | 'week' | 'day' - } - currentTime: Temporal.PlainDateTime -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e864d4b..626d76f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,9 @@ importers: '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 + '@tanstack/react-store': + specifier: ^0.4.1 + version: 0.4.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/time': specifier: workspace:* version: link:../time @@ -3313,6 +3316,18 @@ packages: - vite dev: true + /@tanstack/react-store@0.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cyriofh2I6dPOPJf2W0K+ON5q08ezevLTUhC1txiUnrJ9XFFFPr0X8CmGnXzucI2c0t0V6wYZc0GCz4zOAeptg==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/store': 0.4.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /@tanstack/store@0.4.1: resolution: {integrity: sha512-NvW3MomYSTzQK61AWdtWNIhWgszXFZDRgCNlvSDw/DBaoLqJIlZ0/gKLsditA8un/BGU1NR06+j0a/UNLgXA+Q==} dev: false From 2ac6065adaa2aa491ebee0504c3cdac0535e338f Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 14 Jun 2024 00:17:58 +0200 Subject: [PATCH 069/163] docs: calendar core --- docs/reference/calendar-core.md | 113 ++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 docs/reference/calendar-core.md diff --git a/docs/reference/calendar-core.md b/docs/reference/calendar-core.md new file mode 100644 index 00000000..8c7b2442 --- /dev/null +++ b/docs/reference/calendar-core.md @@ -0,0 +1,113 @@ +--- +title: Calendar Core +id: calendar-core +--- + +### `CalendarCore` + +```tsx +export class CalendarCore { + constructor(options: CalendarCoreOptions); +} +``` + +The `CalendarCore` class provides a set of functionalities for managing calendar events, view modes, and period navigation. This class is designed to be used in various calendar applications where precise date management and event handling are required. + + +#### Parameters + +- `weekStartsOn?: number` + - An optional number that specifies the day of the week that the calendar should start on. It defaults to 1 (Monday). +- `events?: TEvent[]` + - An optional array of events that the calendar should display. +- `viewMode: ViewMode` + - An object that specifies the initial view mode of the calendar. +- `locale?: Parameters['0']` + - An optional string that specifies the locale to use for formatting dates and times. + + +#### Returns + +- `getDaysWithEvents(): Array>` + - Returns an array of days in the current period with their associated events. +- `getDaysNames(): string[]` + - Returns an array of strings representing the names of the days of the week based on the locale and week start day. +- `changeViewMode(newViewMode: ViewMode): void` + - Changes the view mode of the calendar. +- `goToPreviousPeriod(): void` + - Navigates to the previous period based on the current view mode. +- `goToNextPeriod(): void` + - Navigates to the next period based on the current view mode. +- `goToCurrentPeriod(): void` + - Navigates to the current period. +- `goToSpecificPeriod(date: Temporal.PlainDate): void` + - Navigates to a specific period based on the provided date. +- `updateCurrentTime(): void` + - Updates the current time. +- `getEventProps(id: Event['id']): { style: CSSProperties } | null` + - Retrieves the style properties for a specific event based on its ID. +- `getCurrentTimeMarkerProps(): { style: CSSProperties; currentTime: string | undefined }` + - Retrieves the style properties and current time for the current time marker. +- `groupDaysBy(props: Omit, 'weekStartsOn'>): (Day | null)[][]` + - Groups the days in the current period by a specified unit. The fillMissingDays parameter can be used to fill in missing days with previous or next month's days. + + +#### Example Usage + +```ts +import { CalendarCore, Event } from 'your-calendar-core-package'; +import { Temporal } from '@js-temporal/polyfill'; + +interface MyEvent extends Event { + location: string; +} + +const events: MyEvent[] = [ + { + id: '1', + startDate: Temporal.PlainDateTime.from('2024-06-10T09:00'), + endDate: Temporal.PlainDateTime.from('2024-06-10T10:00'), + title: 'Event 1', + location: 'Room 101', + }, + { + id: '2', + startDate: Temporal.PlainDateTime.from('2024-06-12T11:00'), + endDate: Temporal.PlainDateTime.from('2024-06-12T12:00'), + title: 'Event 2', + location: 'Room 202', + }, +]; + +const calendarCore = new CalendarCore({ + weekStartsOn: 1, + viewMode: { value: 1, unit: 'month' }, + events, + locale: 'en-US', +}); + +// Get days with events +const daysWithEvents = calendarCore.getDaysWithEvents(); +console.log(daysWithEvents); + +// Change view mode to week +calendarCore.changeViewMode({ value: 1, unit: 'week' }); + +// Navigate to the next period +calendarCore.goToNextPeriod(); + +// Update current time +calendarCore.updateCurrentTime(); + +// Get event properties +const eventProps = calendarCore.getEventProps('1'); +console.log(eventProps); + +// Get current time marker properties +const currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); +console.log(currentTimeMarkerProps); + +// Group days by week +const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'week' }); +console.log(groupedDays); +``` From a71f5a83ae582053a8b97de11aab67f2fbfc06b3 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 14 Jun 2024 00:23:15 +0200 Subject: [PATCH 070/163] refactor: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 21 ++++++++++--------- .../react-time/src/useCalendar/useCalendar.ts | 13 ++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index c59201b1..ea50fedf 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -207,21 +207,22 @@ describe('useCalendar', () => { vi.setSystemTime(new Date('2024-06-01T11:00:55')); const { result } = renderHook(() => useCalendar({ viewMode: { value: 1, unit: 'week' } })); + const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); act(() => { vi.advanceTimersByTime(5000); }) - const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', - }); + waitFor(() => { + expect(currentTimeMarkerProps).toEqual({ + style: { + position: 'absolute', + top: '45.90277777777778%', + left: 0, + }, + currentTime: '11:01', + }); + }) }); test('should render array of days', () => { diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index f6b168cd..6cbcdbff 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState, useTransition } from 'react' +import { useCallback, useEffect, useRef, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' import { Temporal } from '@js-temporal/polyfill' import { CalendarCore, type CalendarState, type Event } from '@tanstack/time' @@ -9,15 +9,14 @@ export const useCalendar = ( ): CalendarApi & { isPending: boolean } => { const [calendarCore] = useState(() => new CalendarCore(options)) const state = useStore(calendarCore.store) - const [isPending, startTransition] = useTransition() const currentTimeInterval = useRef() - useEffect(() => { - const updateCurrentTime = () => { - calendarCore.updateCurrentTime() - } + const updateCurrentTime = useCallback(() => { + calendarCore.updateCurrentTime() + }, [calendarCore]) + useEffect(() => { if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current) const now = Temporal.Now.plainDateTimeISO() @@ -29,7 +28,7 @@ export const useCalendar = ( }, msToNextMinute) return () => clearTimeout(currentTimeInterval.current) - }, [calendarCore]) + }, [calendarCore, updateCurrentTime]) const goToPreviousPeriod = () => { startTransition(() => { From 965de147280b039abb4147478ed9d7580e88c6c5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 17 Jun 2024 16:45:53 +0200 Subject: [PATCH 071/163] test: calendar core --- packages/time/src/tests/calendar-core.test.ts | 67 ++----------------- 1 file changed, 7 insertions(+), 60 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 25c576ca..74e6e341 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -118,67 +118,14 @@ describe('CalendarCore', () => { }); }); - test('should update the current time marker props after time passes', () => { - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:00')); - - const coreOptions: CalendarCoreOptions = { - weekStartsOn: 1, - viewMode: { value: 1, unit: 'week' }, - events: [], - }; - calendarCore = new CalendarCore(coreOptions); - - let currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.83333333333333%', - left: 0, - }, - currentTime: '11:00', - }); - - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:01:00')); - - calendarCore.updateCurrentTime(); - currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', - }); - }); - - test('should update the current time marker props after time passes when the next minute is in less than a minute', () => { - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:55')); - - - const coreOptions: CalendarCoreOptions = { - weekStartsOn: 1, - viewMode: { value: 1, unit: 'week' }, - events: [], - }; - calendarCore = new CalendarCore(coreOptions); - - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:01:00')); - + test('should update the current time on', () => { + const initialTime = calendarCore.store.state.currentTime; + const newMockDateTime = initialTime.add({ minutes: 1 }); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); + calendarCore.updateCurrentTime(); - const currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', - }); - }); + expect(initialTime).toEqual(newMockDateTime); + }) test('should group days correctly', () => { const daysWithEvents = calendarCore.getDaysWithEvents(); From 301d4b891bd04b99d953c6077cc288e4df5f70c5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 17 Jun 2024 18:22:43 +0200 Subject: [PATCH 072/163] refactor: useCalendar --- .../react-time/src/useCalendar/useCalendar.ts | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 6cbcdbff..1c87c743 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' import { Temporal } from '@js-temporal/polyfill' import { CalendarCore, type CalendarState, type Event } from '@tanstack/time' -import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' +import type { CalendarApi, CalendarCoreOptions, GroupDaysByProps } from '@tanstack/time' export const useCalendar = ( options: CalendarCoreOptions, @@ -30,35 +30,41 @@ export const useCalendar = ( return () => clearTimeout(currentTimeInterval.current) }, [calendarCore, updateCurrentTime]) - const goToPreviousPeriod = () => { + const goToPreviousPeriod = useCallback(() => { startTransition(() => { calendarCore.goToPreviousPeriod() }) - } + }, [calendarCore, startTransition]) - const goToNextPeriod = () => { + const goToNextPeriod = useCallback(() => { startTransition(() => { calendarCore.goToNextPeriod() }) - } + }, [calendarCore, startTransition]) - const goToCurrentPeriod = () => { + const goToCurrentPeriod = useCallback(() => { startTransition(() => { calendarCore.goToCurrentPeriod() }) - } + }, [calendarCore, startTransition]) - const goToSpecificPeriod = (date: Temporal.PlainDate) => { + const goToSpecificPeriod = useCallback((date: Temporal.PlainDate) => { startTransition(() => { calendarCore.goToSpecificPeriod(date) }) - } + }, [calendarCore, startTransition]) - const changeViewMode = (newViewMode: CalendarState['viewMode']) => { + const changeViewMode = useCallback((newViewMode: CalendarState['viewMode']) => { startTransition(() => { calendarCore.changeViewMode(newViewMode) }) - } + }, [calendarCore, startTransition]) + + const getEventProps = useCallback((id: TEvent['id']) => calendarCore.getEventProps(id), [calendarCore]) + + const getCurrentTimeMarkerProps = useCallback(() => calendarCore.getCurrentTimeMarkerProps(), [calendarCore]) + + const groupDaysBy = useCallback((props: Omit, 'weekStartsOn'>) => calendarCore.groupDaysBy(props), [calendarCore]) return { currentPeriod: state.currentPeriod, @@ -71,10 +77,9 @@ export const useCalendar = ( goToCurrentPeriod, goToSpecificPeriod, changeViewMode, - getEventProps: calendarCore.getEventProps.bind(calendarCore), - getCurrentTimeMarkerProps: - calendarCore.getCurrentTimeMarkerProps.bind(calendarCore), + getEventProps, + getCurrentTimeMarkerProps, isPending, - groupDaysBy: calendarCore.groupDaysBy.bind(calendarCore), + groupDaysBy, } } From 1324311582943a61a57e8e56bf497cefeff00eda Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 17 Jun 2024 18:35:35 +0200 Subject: [PATCH 073/163] refactor: useCalendar --- packages/react-time/src/useCalendar/useCalendar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 1c87c743..ed0f428e 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -64,7 +64,7 @@ export const useCalendar = ( const getCurrentTimeMarkerProps = useCallback(() => calendarCore.getCurrentTimeMarkerProps(), [calendarCore]) - const groupDaysBy = useCallback((props: Omit, 'weekStartsOn'>) => calendarCore.groupDaysBy(props), [calendarCore]) + const groupDaysBy = useCallback((props: Omit, "weekStartsOn">) => calendarCore.groupDaysBy(props), [calendarCore]) return { currentPeriod: state.currentPeriod, From 042bb13e11eef8d891edfeaf486f373c344e14b3 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 17 Jun 2024 18:35:42 +0200 Subject: [PATCH 074/163] refactor: useCalendar --- packages/time/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 0e2559bb..e2e01d1a 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -3,3 +3,4 @@ */ export * from './utils'; export * from './calendar-core'; +export * from './calendar'; From 82c1c8776d4c076e4bb28cbcd49af0f9eec95914 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 17 Jun 2024 22:28:19 +0200 Subject: [PATCH 075/163] refactor(useCalendar): types --- .../react-time/src/useCalendar/useCalendar.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index ed0f428e..6dd34126 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,8 +1,8 @@ import { useCallback, useEffect, useRef, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' import { Temporal } from '@js-temporal/polyfill' -import { CalendarCore, type CalendarState, type Event } from '@tanstack/time' -import type { CalendarApi, CalendarCoreOptions, GroupDaysByProps } from '@tanstack/time' +import { CalendarCore, type Event } from '@tanstack/time' +import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' export const useCalendar = ( options: CalendarCoreOptions, @@ -12,7 +12,7 @@ export const useCalendar = ( const [isPending, startTransition] = useTransition() const currentTimeInterval = useRef() - const updateCurrentTime = useCallback(() => { + const updateCurrentTime = useCallback(() => { calendarCore.updateCurrentTime() }, [calendarCore]) @@ -30,41 +30,41 @@ export const useCalendar = ( return () => clearTimeout(currentTimeInterval.current) }, [calendarCore, updateCurrentTime]) - const goToPreviousPeriod = useCallback(() => { + const goToPreviousPeriod = useCallback(() => { startTransition(() => { calendarCore.goToPreviousPeriod() }) }, [calendarCore, startTransition]) - const goToNextPeriod = useCallback(() => { + const goToNextPeriod = useCallback(() => { startTransition(() => { calendarCore.goToNextPeriod() }) }, [calendarCore, startTransition]) - const goToCurrentPeriod = useCallback(() => { + const goToCurrentPeriod = useCallback(() => { startTransition(() => { calendarCore.goToCurrentPeriod() }) }, [calendarCore, startTransition]) - const goToSpecificPeriod = useCallback((date: Temporal.PlainDate) => { + const goToSpecificPeriod = useCallback((date) => { startTransition(() => { calendarCore.goToSpecificPeriod(date) }) }, [calendarCore, startTransition]) - const changeViewMode = useCallback((newViewMode: CalendarState['viewMode']) => { + const changeViewMode = useCallback((newViewMode) => { startTransition(() => { calendarCore.changeViewMode(newViewMode) }) }, [calendarCore, startTransition]) - const getEventProps = useCallback((id: TEvent['id']) => calendarCore.getEventProps(id), [calendarCore]) + const getEventProps = useCallback((id) => calendarCore.getEventProps(id), [calendarCore]) - const getCurrentTimeMarkerProps = useCallback(() => calendarCore.getCurrentTimeMarkerProps(), [calendarCore]) + const getCurrentTimeMarkerProps = useCallback(() => calendarCore.getCurrentTimeMarkerProps(), [calendarCore]) - const groupDaysBy = useCallback((props: Omit, "weekStartsOn">) => calendarCore.groupDaysBy(props), [calendarCore]) + const groupDaysBy = useCallback((props) => calendarCore.groupDaysBy(props), [calendarCore]) return { currentPeriod: state.currentPeriod, From f61a99d3a9b9f242cb3dab616895e7d8c75d3696 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:00:34 +0200 Subject: [PATCH 076/163] refactor: move calendar-related files to the core directory --- .../src/{calendar-core.ts => core/calendar.ts} | 16 ++++++++-------- packages/time/src/core/index.ts | 1 + packages/time/src/index.ts | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) rename packages/time/src/{calendar-core.ts => core/calendar.ts} (94%) create mode 100644 packages/time/src/core/index.ts diff --git a/packages/time/src/calendar-core.ts b/packages/time/src/core/calendar.ts similarity index 94% rename from packages/time/src/calendar-core.ts rename to packages/time/src/core/calendar.ts index 4f2ed916..b5ce5e5b 100644 --- a/packages/time/src/calendar-core.ts +++ b/packages/time/src/core/calendar.ts @@ -1,15 +1,15 @@ import { Store } from '@tanstack/store'; import { Temporal } from '@js-temporal/polyfill'; -import { getFirstDayOfMonth, getFirstDayOfWeek } from './utils'; -import { generateDateRange } from './calendar/generateDateRange'; -import { splitMultiDayEvents } from './calendar/splitMultiDayEvents'; -import { getEventProps } from './calendar/getEventProps'; -import { groupDaysBy } from './calendar/groupDaysBy'; +import { getFirstDayOfMonth, getFirstDayOfWeek } from '../utils'; +import { generateDateRange } from '../calendar/generateDateRange'; +import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents'; +import { getEventProps } from '../calendar/getEventProps'; +import { groupDaysBy } from '../calendar/groupDaysBy'; import type { Properties as CSSProperties } from 'csstype'; -import type { GroupDaysByProps } from './calendar/groupDaysBy'; -import type { CalendarState, Day, Event } from './calendar/types'; +import type { GroupDaysByProps } from '../calendar/groupDaysBy'; +import type { CalendarState, Day, Event } from '../calendar/types'; -export type { CalendarState, Event, Day } from './calendar/types'; +export type { CalendarState, Event, Day } from '../calendar/types'; export interface ViewMode { value: number; diff --git a/packages/time/src/core/index.ts b/packages/time/src/core/index.ts new file mode 100644 index 00000000..e00be3cf --- /dev/null +++ b/packages/time/src/core/index.ts @@ -0,0 +1 @@ +export * from './calendar' diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index e2e01d1a..0535016d 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -2,5 +2,5 @@ * TanStack Time */ export * from './utils'; -export * from './calendar-core'; -export * from './calendar'; +export * from './core'; + From dc3bcbfee9cbc27f68ec04946af35d66bae7a826 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:15:32 +0200 Subject: [PATCH 077/163] refactor: update CalendarCoreOptions interface to use default generic type for TEvent --- packages/time/src/core/calendar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index b5ce5e5b..4412972a 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -16,7 +16,7 @@ export interface ViewMode { unit: 'month' | 'week' | 'day'; } -export interface CalendarCoreOptions { +export interface CalendarCoreOptions { weekStartsOn?: number; events?: TEvent[]; viewMode: CalendarState['viewMode']; From 1465e850ba989600f9630478d2d0779eba5e8bf4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:16:25 +0200 Subject: [PATCH 078/163] refactor: Update CalendarCoreOptions interface in calendar.ts --- packages/time/src/core/calendar.ts | 2 +- packages/time/src/core/date-picker.ts | 64 +++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 packages/time/src/core/date-picker.ts diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index b5ce5e5b..4412972a 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -16,7 +16,7 @@ export interface ViewMode { unit: 'month' | 'week' | 'day'; } -export interface CalendarCoreOptions { +export interface CalendarCoreOptions { weekStartsOn?: number; events?: TEvent[]; viewMode: CalendarState['viewMode']; diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts new file mode 100644 index 00000000..30d96b75 --- /dev/null +++ b/packages/time/src/core/date-picker.ts @@ -0,0 +1,64 @@ +import { Store } from '@tanstack/store'; +import { Temporal } from '@js-temporal/polyfill'; +import { CalendarCore } from './calendar'; +import type { CalendarCoreOptions, CalendarState, Event } from './calendar'; + +export interface DatePickerOptions extends CalendarCoreOptions { + minDate?: Temporal.PlainDate; + maxDate?: Temporal.PlainDate; + onSelectDate?: (date: Temporal.PlainDate) => void; + multiple?: boolean; + range?: boolean; + selectedDates?: Temporal.PlainDate[]; +} + +export interface DatePickerState extends CalendarState { + selectedDates: Map; +} + +export class DatePicker extends CalendarCore { + datePickerStore: Store; + options: DatePickerOptions; + + constructor(options: DatePickerOptions) { + super(options); + this.options = options; + this.datePickerStore = new Store({ + ...this.store.state, + selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), + }); + } + + getSelectedDates() { + return Array.from(this.datePickerStore.state.selectedDates.values()); + } + + selectDate(date: Temporal.PlainDate) { + const { multiple, range, minDate, maxDate, onSelectDate } = this.options; + + if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return; + if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return; + + const selectedDates = new Map(this.datePickerStore.state.selectedDates); + + if (range && selectedDates.size === 1) { + selectedDates.set(date.toString(), date); + } else if (multiple) { + if (selectedDates.has(date.toString())) { + selectedDates.delete(date.toString()); + } else { + selectedDates.set(date.toString(), date); + } + } else { + selectedDates.clear(); + selectedDates.set(date.toString(), date); + } + + this.datePickerStore.setState(prev => ({ + ...prev, + selectedDates, + })); + + onSelectDate?.(date); + } +} From 55751f829c0b6f2680952ab2cc8d000b17820a3e Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:26:48 +0200 Subject: [PATCH 079/163] feat: date picker core --- packages/time/src/core/calendar.ts | 2 +- packages/time/src/core/date-picker.ts | 64 +++++++++++++ .../time/src/tests/date-picker-core.test.ts | 92 +++++++++++++++++++ 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 packages/time/src/core/date-picker.ts create mode 100644 packages/time/src/tests/date-picker-core.test.ts diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 4412972a..15ccb15e 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -42,7 +42,7 @@ export interface CalendarApi { groupDaysBy: (props: Omit, 'weekStartsOn'>) => (Day | null)[][]; } -export class CalendarCore { +export class CalendarCore { store: Store; options: CalendarCoreOptions; diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts new file mode 100644 index 00000000..005681e5 --- /dev/null +++ b/packages/time/src/core/date-picker.ts @@ -0,0 +1,64 @@ +import { Store } from '@tanstack/store'; +import { Temporal } from '@js-temporal/polyfill'; +import { CalendarCore } from './calendar'; +import type { CalendarCoreOptions, CalendarState } from './calendar'; + +export interface DatePickerOptions extends CalendarCoreOptions { + minDate?: Temporal.PlainDate; + maxDate?: Temporal.PlainDate; + onSelectDate?: (date: Temporal.PlainDate) => void; + multiple?: boolean; + range?: boolean; + selectedDates?: Temporal.PlainDate[]; +} + +export interface DatePickerState extends CalendarState { + selectedDates: Map; +} + +export class DatePicker extends CalendarCore { + datePickerStore: Store; + options: DatePickerOptions; + + constructor(options: DatePickerOptions) { + super(options); + this.options = options; + this.datePickerStore = new Store({ + ...this.store.state, + selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), + }); + } + + getSelectedDates() { + return Array.from(this.datePickerStore.state.selectedDates.values()); + } + + selectDate(date: Temporal.PlainDate) { + const { multiple, range, minDate, maxDate, onSelectDate } = this.options; + + if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return; + if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return; + + const selectedDates = new Map(this.datePickerStore.state.selectedDates); + + if (range && selectedDates.size === 1) { + selectedDates.set(date.toString(), date); + } else if (multiple) { + if (selectedDates.has(date.toString())) { + selectedDates.delete(date.toString()); + } else { + selectedDates.set(date.toString(), date); + } + } else { + selectedDates.clear(); + selectedDates.set(date.toString(), date); + } + + this.datePickerStore.setState(prev => ({ + ...prev, + selectedDates, + })); + + onSelectDate?.(date); + } +} diff --git a/packages/time/src/tests/date-picker-core.test.ts b/packages/time/src/tests/date-picker-core.test.ts new file mode 100644 index 00000000..3e2a5f8b --- /dev/null +++ b/packages/time/src/tests/date-picker-core.test.ts @@ -0,0 +1,92 @@ +import { Temporal } from '@js-temporal/polyfill'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { DatePicker } from '../core/date-picker'; +import type { DatePickerOptions } from '../core/date-picker'; + +describe('DatePicker', () => { + let options: DatePickerOptions; + let datePicker: DatePicker; + const mockDate = Temporal.PlainDate.from('2023-06-15'); + const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00'); + + beforeEach(() => { + options = { + weekStartsOn: 1, + viewMode: { value: 1, unit: 'month' }, + events: [ + { + id: '1', + startDate: Temporal.PlainDateTime.from('2023-06-10T09:00'), + endDate: Temporal.PlainDateTime.from('2023-06-10T10:00'), + title: 'Event 1', + }, + { + id: '2', + startDate: Temporal.PlainDateTime.from('2023-06-12T11:00'), + endDate: Temporal.PlainDateTime.from('2023-06-12T12:00'), + title: 'Event 2', + }, + ], + selectedDates: [Temporal.PlainDate.from('2023-06-10')], + multiple: true, + }; + datePicker = new DatePicker(options); + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + }); + + test('should initialize with the correct selected dates', () => { + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(1); + expect(selectedDates[0]?.toString()).toBe('2023-06-10'); + }); + + test('should select a date correctly in single selection mode', () => { + datePicker.selectDate(Temporal.PlainDate.from('2023-06-15')); + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(1); + expect(selectedDates[0]?.toString()).toBe('2023-06-15'); + }); + + test('should select multiple dates correctly', () => { + datePicker.selectDate(Temporal.PlainDate.from('2023-06-15')); + datePicker.selectDate(Temporal.PlainDate.from('2023-06-20')); + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(3); + expect(selectedDates.map(date => date.toString())).toContain('2023-06-15'); + expect(selectedDates.map(date => date.toString())).toContain('2023-06-20'); + }); + + test('should deselect a date correctly in multiple selection mode', () => { + datePicker.selectDate(Temporal.PlainDate.from('2023-06-10')); + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(0); + }); + + test('should select a date range correctly', () => { + datePicker = new DatePicker({ + ...options, + multiple: false, + range: true, + selectedDates: [Temporal.PlainDate.from('2023-06-10')], + }); + datePicker.selectDate(Temporal.PlainDate.from('2023-06-15')); + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(2); + expect(selectedDates.map(date => date.toString())).toContain('2023-06-10'); + expect(selectedDates.map(date => date.toString())).toContain('2023-06-15'); + }); + + test('should not select a date outside the min and max range', () => { + datePicker = new DatePicker({ + ...options, + minDate: Temporal.PlainDate.from('2023-06-05'), + maxDate: Temporal.PlainDate.from('2023-06-20'), + }); + datePicker.selectDate(Temporal.PlainDate.from('2023-06-01')); + datePicker.selectDate(Temporal.PlainDate.from('2023-06-25')); + const selectedDates = datePicker.getSelectedDates(); + expect(selectedDates).toHaveLength(1); + expect(selectedDates[0]?.toString()).toBe('2023-06-10'); + }); +}); From 3f4ef792c3b85122be5248903924d84f081bb295 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:27:22 +0200 Subject: [PATCH 080/163] test: imports --- packages/time/src/tests/calendar-core.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 74e6e341..c11605b5 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -1,7 +1,7 @@ import { Temporal } from '@js-temporal/polyfill'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { CalendarCore } from '../calendar-core'; -import type { CalendarCoreOptions, Event } from '../calendar-core'; +import { CalendarCore } from '../core/calendar'; +import type { CalendarCoreOptions, Event } from '../core/calendar'; describe('CalendarCore', () => { let options: CalendarCoreOptions; From ce4fa6b2586d3f47a976e54b6273f9587240906b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:30:48 +0200 Subject: [PATCH 081/163] feat: date picker core --- packages/time/src/tests/calendar-core.test.ts | 4 ++-- .../time/src/tests/date-picker-core.test.ts | 18 ++++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 74e6e341..c11605b5 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -1,7 +1,7 @@ import { Temporal } from '@js-temporal/polyfill'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { CalendarCore } from '../calendar-core'; -import type { CalendarCoreOptions, Event } from '../calendar-core'; +import { CalendarCore } from '../core/calendar'; +import type { CalendarCoreOptions, Event } from '../core/calendar'; describe('CalendarCore', () => { let options: CalendarCoreOptions; diff --git a/packages/time/src/tests/date-picker-core.test.ts b/packages/time/src/tests/date-picker-core.test.ts index 3e2a5f8b..372672d9 100644 --- a/packages/time/src/tests/date-picker-core.test.ts +++ b/packages/time/src/tests/date-picker-core.test.ts @@ -13,20 +13,6 @@ describe('DatePicker', () => { options = { weekStartsOn: 1, viewMode: { value: 1, unit: 'month' }, - events: [ - { - id: '1', - startDate: Temporal.PlainDateTime.from('2023-06-10T09:00'), - endDate: Temporal.PlainDateTime.from('2023-06-10T10:00'), - title: 'Event 1', - }, - { - id: '2', - startDate: Temporal.PlainDateTime.from('2023-06-12T11:00'), - endDate: Temporal.PlainDateTime.from('2023-06-12T12:00'), - title: 'Event 2', - }, - ], selectedDates: [Temporal.PlainDate.from('2023-06-10')], multiple: true, }; @@ -42,6 +28,10 @@ describe('DatePicker', () => { }); test('should select a date correctly in single selection mode', () => { + datePicker = new DatePicker({ + ...options, + multiple: false, + }); datePicker.selectDate(Temporal.PlainDate.from('2023-06-15')); const selectedDates = datePicker.getSelectedDates(); expect(selectedDates).toHaveLength(1); From bff5f34133f910b35afb4c8505adfc5fa36ed341 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 20 Jun 2024 23:35:38 +0200 Subject: [PATCH 082/163] docs: typo --- docs/reference/calendar-core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/calendar-core.md b/docs/reference/calendar-core.md index 8c7b2442..22e4b524 100644 --- a/docs/reference/calendar-core.md +++ b/docs/reference/calendar-core.md @@ -55,7 +55,7 @@ The `CalendarCore` class provides a set of functionalities for managing calendar #### Example Usage ```ts -import { CalendarCore, Event } from 'your-calendar-core-package'; +import { CalendarCore, Event } from '@tanstack/time'; import { Temporal } from '@js-temporal/polyfill'; interface MyEvent extends Event { From 1c10f149649ffec08acf4ba61cf62878a8c3e45e Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 21 Jun 2024 11:15:04 +0200 Subject: [PATCH 083/163] refactor: DatePickerCore --- docs/reference/date-picker-core.md | 109 ++++++++++++++++++++++++++ packages/time/src/core/date-picker.ts | 13 ++- 2 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 docs/reference/date-picker-core.md diff --git a/docs/reference/date-picker-core.md b/docs/reference/date-picker-core.md new file mode 100644 index 00000000..184a2348 --- /dev/null +++ b/docs/reference/date-picker-core.md @@ -0,0 +1,109 @@ +--- +title: DatePicker Core +id: date-picker-core +--- + +### `CalendarCore` +```ts +export class DatePickerCore extends CalendarCore { + constructor(options: DatePickerCoreOptions); +} +``` + +The `DatePicker` class extends `CalendarCore` to provide additional functionalities for managing date selection, including single-date, multiple-date, and range selection modes. This class is designed to be used in various date picker applications where precise date management and selection are required. + +#### Parameters + +- `weekStartsOn?: number` + - An optional number that specifies the day of the week that the calendar should start on. It defaults to 1 (Monday). +- `events?: TEvent[]` + - An optional array of events that the calendar should display. +- `viewMode: ViewMode` + - An object that specifies the initial view mode of the calendar. +- `locale?: Parameters['0']` + - An optional string that specifies the locale to use for formatting dates and times. +- `minDate?: Temporal.PlainDate` + - An optional date that specifies the minimum selectable date. +- `maxDate?: Temporal.PlainDate` + - An optional date that specifies the maximum selectable date. +- `selectedDates?: Temporal.PlainDate[]` + - An optional array of dates that are initially selected. +- `multiple?: boolean` + - An optional boolean that allows multiple dates to be selected if set to true. +- `range?: boolean` + - An optional boolean that allows a range of dates to be selected if set to true. + +#### Returns + +- `getSelectedDates(): Temporal.PlainDate[]` + - Returns an array of selected dates. +- `selectDate(date: Temporal.PlainDate): void` + - Selects a date. Depending on the configuration, this can handle single, multiple, or range selections. +- `getDaysWithEvents(): Array>` + - Returns an array of days in the current period with their associated events. +- `getDaysNames(): string[]` + - Returns an array of strings representing the names of the days of the week based on the locale and week start day. +- `changeViewMode(newViewMode: ViewMode): void` + - Changes the view mode of the calendar. +- `goToPreviousPeriod(): void` + - Navigates to the previous period based on the current view mode. +- `goToNextPeriod(): void` + - Navigates to the next period based on the current view mode. +- `goToCurrentPeriod(): void` + - Navigates to the current period. +- `goToSpecificPeriod(date: Temporal.PlainDate): void` + - Navigates to a specific period based on the provided date. +- `updateCurrentTime(): void` + - Updates the current time. +- `getEventProps(id: Event['id']): { style: CSSProperties } | null` + - Retrieves the style properties for a specific event based on its ID. +- `getCurrentTimeMarkerProps(): { style: CSSProperties; currentTime: string | undefined }` + - Retrieves the style properties and current time for the current time marker. +- `groupDaysBy(props: Omit, 'weekStartsOn'>): (Day | null)[][]` + - Groups the days in the current period by a specified unit. The fillMissingDays parameter can be used to fill in missing days with previous or next month's days. + + +#### Example Usage +```ts +import { DatePickerCore, Event } from '@tanstack/time'; +import { Temporal } from '@js-temporal/polyfill'; + +const datePickerCore = new DatePickerCore({ + weekStartsOn: 1, + viewMode: { value: 1, unit: 'month' }, + events, + locale: 'en-US', + minDate: Temporal.PlainDate.from('2024-01-01'), + maxDate: Temporal.PlainDate.from('2024-12-31'), + selectedDates: [Temporal.PlainDate.from('2024-06-10')], + multiple: true, +}); + +// Get selected dates +const selectedDates = datePickerCore.getSelectedDates(); +console.log(selectedDates); + +// Select a date +datePickerCore.selectDate(Temporal.PlainDate.from('2024-06-15')); + +// Change view mode to week +datePickerCore.changeViewMode({ value: 1, unit: 'week' }); + +// Navigate to the next period +datePickerCore.goToNextPeriod(); + +// Update current time +datePickerCore.updateCurrentTime(); + +// Get event properties +const eventProps = datePickerCore.getEventProps('1'); +console.log(eventProps); + +// Get current time marker properties +const currentTimeMarkerProps = datePickerCore.getCurrentTimeMarkerProps(); +console.log(currentTimeMarkerProps); + +// Group days by week +const groupedDays = datePickerCore.groupDaysBy({ days: daysWithSelection, unit: 'week' }); +console.log(groupedDays); +``` diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts index 005681e5..b8e80801 100644 --- a/packages/time/src/core/date-picker.ts +++ b/packages/time/src/core/date-picker.ts @@ -6,24 +6,23 @@ import type { CalendarCoreOptions, CalendarState } from './calendar'; export interface DatePickerOptions extends CalendarCoreOptions { minDate?: Temporal.PlainDate; maxDate?: Temporal.PlainDate; - onSelectDate?: (date: Temporal.PlainDate) => void; multiple?: boolean; range?: boolean; selectedDates?: Temporal.PlainDate[]; } -export interface DatePickerState extends CalendarState { +export interface DatePickerCoreState extends CalendarState { selectedDates: Map; } -export class DatePicker extends CalendarCore { - datePickerStore: Store; +export class DatePickerCore extends CalendarCore { + datePickerStore: Store; options: DatePickerOptions; constructor(options: DatePickerOptions) { super(options); this.options = options; - this.datePickerStore = new Store({ + this.datePickerStore = new Store({ ...this.store.state, selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), }); @@ -34,7 +33,7 @@ export class DatePicker extends CalendarCore { } selectDate(date: Temporal.PlainDate) { - const { multiple, range, minDate, maxDate, onSelectDate } = this.options; + const { multiple, range, minDate, maxDate } = this.options; if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return; if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return; @@ -58,7 +57,5 @@ export class DatePicker extends CalendarCore { ...prev, selectedDates, })); - - onSelectDate?.(date); } } From 57c547efad812ba8384dbc2c4387d9baf008af97 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 21 Jun 2024 12:42:18 +0200 Subject: [PATCH 084/163] refactor: DatePickerCore --- packages/time/src/core/date-picker.ts | 64 --------------------------- 1 file changed, 64 deletions(-) delete mode 100644 packages/time/src/core/date-picker.ts diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts deleted file mode 100644 index 30d96b75..00000000 --- a/packages/time/src/core/date-picker.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Store } from '@tanstack/store'; -import { Temporal } from '@js-temporal/polyfill'; -import { CalendarCore } from './calendar'; -import type { CalendarCoreOptions, CalendarState, Event } from './calendar'; - -export interface DatePickerOptions extends CalendarCoreOptions { - minDate?: Temporal.PlainDate; - maxDate?: Temporal.PlainDate; - onSelectDate?: (date: Temporal.PlainDate) => void; - multiple?: boolean; - range?: boolean; - selectedDates?: Temporal.PlainDate[]; -} - -export interface DatePickerState extends CalendarState { - selectedDates: Map; -} - -export class DatePicker extends CalendarCore { - datePickerStore: Store; - options: DatePickerOptions; - - constructor(options: DatePickerOptions) { - super(options); - this.options = options; - this.datePickerStore = new Store({ - ...this.store.state, - selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), - }); - } - - getSelectedDates() { - return Array.from(this.datePickerStore.state.selectedDates.values()); - } - - selectDate(date: Temporal.PlainDate) { - const { multiple, range, minDate, maxDate, onSelectDate } = this.options; - - if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return; - if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return; - - const selectedDates = new Map(this.datePickerStore.state.selectedDates); - - if (range && selectedDates.size === 1) { - selectedDates.set(date.toString(), date); - } else if (multiple) { - if (selectedDates.has(date.toString())) { - selectedDates.delete(date.toString()); - } else { - selectedDates.set(date.toString(), date); - } - } else { - selectedDates.clear(); - selectedDates.set(date.toString(), date); - } - - this.datePickerStore.setState(prev => ({ - ...prev, - selectedDates, - })); - - onSelectDate?.(date); - } -} From 3dc223d4f564efe2053b59c6f69d09d16766eb7b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 23 Jun 2024 23:26:06 +0200 Subject: [PATCH 085/163] refactor: weekInfoPolyfill --- packages/time/src/core/calendar.ts | 2 + packages/time/src/core/weekInfoPolyfill.ts | 3213 ++++++++++++++++++++ 2 files changed, 3215 insertions(+) create mode 100644 packages/time/src/core/weekInfoPolyfill.ts diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 4412972a..daa2aed3 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -9,6 +9,8 @@ import type { Properties as CSSProperties } from 'csstype'; import type { GroupDaysByProps } from '../calendar/groupDaysBy'; import type { CalendarState, Day, Event } from '../calendar/types'; +import './weekInfoPolyfill' + export type { CalendarState, Event, Day } from '../calendar/types'; export interface ViewMode { diff --git a/packages/time/src/core/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill.ts new file mode 100644 index 00000000..e3e73f30 --- /dev/null +++ b/packages/time/src/core/weekInfoPolyfill.ts @@ -0,0 +1,3213 @@ +interface WeekInfo { + firstDay: number + weekend: number[] + minimalDays: number +} + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Intl { + interface Locale { + getWeekInfo: () => WeekInfo + } +} + +;(function () { + if (typeof (Intl as any).Locale.prototype.getWeekInfo !== 'function') { + ;(Intl as any).Locale.prototype.getWeekInfo = function () { + const locale = this.toString().toLowerCase() + const weekInfo: Record = { + af_NA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + af_ZA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + af: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ak_GH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ak: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sq_AL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + am_ET: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + am: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_DZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_BH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_EG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_IQ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_JO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_KW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_LB: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_LY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_MA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_OM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_QA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_SA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_SD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_SY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_TN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_AE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar_YE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hy_AM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + as_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + as: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + asa_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + asa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + az_Cyrl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + az_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + az: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bm_ML: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + eu_ES: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + eu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + be_BY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + be: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bem_ZM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bem: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bez_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bez: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bn_BD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bn_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bs_BA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bs: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bg_BG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + my_MM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + my: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ca_ES: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ca: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tzm_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tzm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + chr_US: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + chr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cgg_UG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cgg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zh_Hans: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zh_Hant: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zh: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kw_GB: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hr_HR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cs_CZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cs: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + da_DK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + da: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nl_BE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nl_NL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ebu_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ebu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_AS: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_AU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_BE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_BZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_BW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_CA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_GU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_HK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_IE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_IL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_JM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_MT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_MH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_MU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_NA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_NZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_MP: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_PK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_PH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_SG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_ZA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_TT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_UM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_VI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_GB: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_US: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en_ZW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + eo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + et_EE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + et: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ee_GH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ee_TG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ee: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fo_FO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fil_PH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fil: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fi_FI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_BE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_BJ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_BF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_BI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_TD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_KM: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_DJ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_GQ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_FR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_GA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_GP: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_GN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_LU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_MG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_ML: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_MQ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_MC: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_NE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_RW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_RE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_BL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_MF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_SN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_CH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr_TG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ff_SN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ff: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gl_ES: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lg_UG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ka_GE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ka: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_AT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_BE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_DE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_LI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_LU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de_CH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + el_CY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + el_GR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + el: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gu_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + guz_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + guz: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ha_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ha: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + haw_US: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + haw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + he_IL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + he: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hi_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hu_HU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + is_IS: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + is: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ig_NG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ig: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + id_ID: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + id: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ga_IE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ga: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + it_IT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + it_CH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + it: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ja_JP: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ja: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kea_CV: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kea: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kab_DZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kab: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kl_GL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kln_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kln: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kam_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kam: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kn_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kk_Cyrl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + km_KH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + km: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ki_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ki: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rw_RW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kok_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kok: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ko_KR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ko: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + khq_ML: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + khq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ses_ML: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ses: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lag_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lag: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lv_LV: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lt_LT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luo_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luy_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mk_MK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + jmc_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + jmc: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kde_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kde: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mg_MG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ms_BN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ms_MY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ms: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ml_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ml: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mt_MT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gv_GB: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mr_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mas_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mas_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mas: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mer_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mer: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mfe_MU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mfe: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + naq_NA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + naq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ne_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ne_NP: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ne: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nd_ZW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nd: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nb_NO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nb: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nn_NO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nyn_UG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nyn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + or_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + or: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + om_ET: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + om_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + om: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ps_AF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ps: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fa_AF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fa_IR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pl_PL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt_BR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt_GW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt_MZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt_PT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pa_Arab: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pa_Guru: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ro_MD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ro_RO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ro: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rm_CH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rof_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rof: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ru_MD: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ru_RU: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ru_UA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ru: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rwk_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rwk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + saq_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + saq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sg_CF: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + seh_MZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + seh: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sr_Cyrl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sr_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sn_ZW: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ii_CN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ii: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + si_LK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + si: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sk_SK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sl_SI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + xog_UG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + xog: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so_DJ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so_ET: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so_SO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_AR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_BO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_CL: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_CO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_CR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_DO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_EC: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_SV: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_GQ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_GT: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_HN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_419: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_MX: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_NI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_PA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_PY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_PE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_PR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_ES: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_US: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_UY: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es_VE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sw_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sw_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sv_FI: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sv_SE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gsw_CH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gsw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + shi_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + shi_Tfng: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + shi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + dav_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + dav: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ta_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ta_LK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ta: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + te_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + te: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + teo_KE: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + teo_UG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + teo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + th_TH: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + th: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bo_CN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bo_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ti_ER: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ti_ET: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ti: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + to_TO: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + to: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tr_TR: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uk_UA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ur_IN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ur_PK: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ur: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uz_Arab: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uz_Cyrl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uz_Latn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uz: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vi_VN: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vun_TZ: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vun: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cy_GB: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + yo_NG: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + yo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zu_ZA: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'af-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'am-ET': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-AE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-BH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-DZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-EG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-IQ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-JO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-KW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-LB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-LY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-MA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'arn-CL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-OM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-QA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SD': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-TN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-YE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'as-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-az': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-Cyrl-AZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-Latn-AZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ba-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'be-BY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bg-BG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bn-BD': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bn-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bo-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'br-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bs-Cyrl-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bs-Latn-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ca-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'co-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'cs-CZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'cy-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'da-DK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-AT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-LI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'dsb-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'dv-MV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'el-CY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'el-GR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-029': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-AU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-BZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-cb': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-IE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-JM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-MT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-MY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-NZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-PH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-SG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-TT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-US': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-ZW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-AR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-BO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-DO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-EC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-GT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-HN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-MX': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-NI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-SV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-US': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-UY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-VE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'et-EE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'eu-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fa-IR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fi-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fil-PH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fo-FO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-BE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-MC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fy-NL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ga-IE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gd-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gd-ie': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gl-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gsw-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gu-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ha-Latn-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'he-IL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hi-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hr-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hr-HR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hsb-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hu-HU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hy-AM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'id-ID': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ig-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ii-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'in-ID': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'is-IS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'it-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'it-IT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iu-Cans-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iu-Latn-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iw-IL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ja-JP': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ka-GE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kk-KZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kl-GL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'km-KH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kn-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kok-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ko-KR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ky-KG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lb-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lo-LA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lt-LT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lv-LV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mi-NZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mk-MK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ml-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mn-MN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mn-Mong-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'moh-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mr-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ms-BN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ms-MY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mt-MT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nb-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ne-NP': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nl-BE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nl-NL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nn-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'no-no': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nso-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'oc-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'or-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pa-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pl-PL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'prs-AF': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ps-AF': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pt-BR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pt-PT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'qut-GT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-BO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-EC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-PE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'rm-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ro-mo': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ro-RO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ru-mo': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ru-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'rw-RW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sah-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sa-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'si-LK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sk-SK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sl-SI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sma-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sma-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smj-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smj-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smn-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sms-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sq-AL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-sp': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sv-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sv-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sw-KE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'syr-SY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ta-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'te-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tg-Cyrl-TJ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'th-TH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tk-TM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tlh-QS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tn-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tr-TR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tt-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tzm-Latn-DZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ug-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uk-UA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ur-PK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-Cyrl-UZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-Latn-UZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-uz': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'vi-VN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'wo-SN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'xh-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'yo-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-HK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-MO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-SG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-TW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zu-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + } + + const match = + weekInfo[locale] || + weekInfo[locale.split('-')[0]] || + weekInfo['default'] + + return { + firstDay: match?.firstDay, + weekend: match?.weekend, + minimalDays: match?.minimalDays, + } + } + } +})() From 2eabee40d5f93441a9a866befa7a1e677bd5a278 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 23 Jun 2024 23:43:29 +0200 Subject: [PATCH 086/163] refactor: weekInfoPolyfill --- packages/time/src/core/calendar.ts | 8 ++++---- packages/time/src/utils/getFirstDayOfWeek.ts | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index daa2aed3..834a2e81 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -9,7 +9,7 @@ import type { Properties as CSSProperties } from 'csstype'; import type { GroupDaysByProps } from '../calendar/groupDaysBy'; import type { CalendarState, Day, Event } from '../calendar/types'; -import './weekInfoPolyfill' +import './weekInfoPolyfill'; export type { CalendarState, Event, Day } from '../calendar/types'; @@ -22,7 +22,7 @@ export interface CalendarCoreOptions { weekStartsOn?: number; events?: TEvent[]; viewMode: CalendarState['viewMode']; - locale?: Parameters['0']; + locale?: string; } export interface CalendarApi { @@ -49,7 +49,7 @@ export class CalendarCore { options: CalendarCoreOptions; constructor(options: CalendarCoreOptions) { - this.options = options; + this.options = options; this.store = new Store({ currentPeriod: Temporal.Now.plainDateISO(), viewMode: options.viewMode, @@ -64,7 +64,7 @@ export class CalendarCore { } private getFirstDayOfWeek() { - return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.weekStartsOn ?? 1); + return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.locale); } private getCalendarDays() { diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts index bb021805..701b1ede 100644 --- a/packages/time/src/utils/getFirstDayOfWeek.ts +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -1,6 +1,8 @@ import { Temporal } from '@js-temporal/polyfill' -export const getFirstDayOfWeek = (currWeek: string, weekStartsOn: number) => { - const date = Temporal.PlainDate.from(currWeek) - return date.subtract({ days: (date.dayOfWeek - weekStartsOn + 7) % 7 }) +export const getFirstDayOfWeek = (currWeek: string, locale: string = 'en-US') => { + const date = Temporal.PlainDate.from(currWeek); + const loc = new Intl.Locale(locale); + const { firstDay } = loc.getWeekInfo(); + return date.subtract({ days: (date.dayOfWeek - firstDay + 7) % 7 }); } From 564c4e7d58be50b726dce17483e9364c5fcd1b04 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 24 Jun 2024 00:31:41 +0200 Subject: [PATCH 087/163] refactor: weekInfoPolyfill --- packages/time/src/core/weekInfoPolyfill.ts | 1590 ++------------------ 1 file changed, 120 insertions(+), 1470 deletions(-) diff --git a/packages/time/src/core/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill.ts index e3e73f30..70f0558d 100644 --- a/packages/time/src/core/weekInfoPolyfill.ts +++ b/packages/time/src/core/weekInfoPolyfill.ts @@ -16,1832 +16,602 @@ declare namespace Intl { ;(Intl as any).Locale.prototype.getWeekInfo = function () { const locale = this.toString().toLowerCase() const weekInfo: Record = { - af_NA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - af_ZA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - af: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ak_GH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ak: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sq_AL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - am_ET: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - am: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_DZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_BH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_EG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_IQ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_JO: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_KW: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_LB: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_LY: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_MA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_OM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_QA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_SA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_SD: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_SY: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_TN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_AE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar_YE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hy_AM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - as_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - as: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - asa_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - asa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - az_Cyrl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - az_Latn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - az: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bm_ML: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eu_ES: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - be_BY: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - be: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bem_ZM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bem: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bez_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bez: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bn_BD: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bn_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bs_BA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bg_BG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - my_MM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - my: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ca_ES: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ca: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tzm_Latn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tzm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - chr_US: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - chr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cgg_UG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cgg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zh_Hans: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zh_Hant: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zh: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kw_GB: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hr_HR: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cs_CZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - da_DK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - da: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nl_BE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nl_NL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ebu_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ebu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_AS: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_AU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_BE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_BZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_BW: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_CA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_GU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_HK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_IE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_IL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_JM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_MT: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_MH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_MU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_NA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_NZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_MP: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_PK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_PH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_SG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_ZA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_TT: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_UM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_VI: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_GB: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_US: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en_ZW: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - et_EE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - et: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ee_GH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ee_TG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ee: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fo_FO: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fil_PH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fil: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fi_FI: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_BE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_BJ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_BF: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_BI: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CF: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_TD: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_KM: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CD: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CI: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_DJ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_GQ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_FR: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_GA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_GP: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_GN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_LU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_MG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_ML: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_MQ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_MC: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_NE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_RW: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_RE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_BL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_MF: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_SN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_CH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr_TG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ff_SN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ff: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gl_ES: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lg_UG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ka_GE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ka: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_AT: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_BE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_DE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_LI: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_LU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de_CH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - el_CY: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - el_GR: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - el: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gu_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - guz_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - guz: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ha_Latn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ha: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - haw_US: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - haw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - he_IL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - he: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hi_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hu_HU: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - is_IS: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - is: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ig_NG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ig: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - id_ID: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - id: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ga_IE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ga: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - it_IT: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - it_CH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - it: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ja_JP: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ja: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kea_CV: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kea: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kab_DZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kab: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kl_GL: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kln_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kln: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kam_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kam: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kn_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kk_Cyrl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - km_KH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - km: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ki_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ki: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rw_RW: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kok_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kok: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ko_KR: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ko: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - khq_ML: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - khq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ses_ML: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ses: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lag_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lag: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lv_LV: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lt_LT: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luo_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luy_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mk_MK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - jmc_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - jmc: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kde_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kde: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mg_MG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ms_BN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ms_MY: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ms: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ml_IN: { + af: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ml: { + ak: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mt_MT: { + sq: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mt: { + am: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - gv_GB: { + ar: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - gv: { + hy: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mr_IN: { + as: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mr: { + asa: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mas_KE: { + az: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mas_TZ: { + bm: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mas: { + eu: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mer_KE: { + be: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mer: { + bem: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mfe_MU: { + bez: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - mfe: { + bn: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - naq_NA: { + bs: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - naq: { + bg: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ne_IN: { + my: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ne_NP: { + ca: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ne: { + tzm: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nd_ZW: { + chr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nd: { + cgg: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nb_NO: { + zh: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nb: { + kw: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nn_NO: { + hr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nn: { + cs: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nyn_UG: { + da: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - nyn: { + nl: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - or_IN: { + ebu: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - or: { + en: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - om_ET: { + eo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - om_KE: { + et: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - om: { + ee: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ps_AF: { + fo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ps: { + fil: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - fa_AF: { + fi: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - fa_IR: { + fr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - fa: { + ff: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pl_PL: { + gl: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pl: { + lg: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pt_BR: { + ka: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pt_GW: { + de: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pt_MZ: { + el: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pt_PT: { + gu: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pt: { + guz: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pa_Arab: { + ha: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pa_Guru: { + haw: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - pa: { + he: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ro_MD: { + hi: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ro_RO: { + hu: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ro: { + is: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rm_CH: { + ig: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rm: { + id: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rof_TZ: { + ga: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rof: { + it: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ru_MD: { + ja: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ru_RU: { + kea: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ru_UA: { + kab: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ru: { + kl: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rwk_TZ: { + kln: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - rwk: { + kam: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - saq_KE: { + kn: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - saq: { + kk: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sg_CF: { + km: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sg: { + ki: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - seh_MZ: { + rw: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - seh: { + kok: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sr_Cyrl: { + ko: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sr_Latn: { + khq: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sr: { + ses: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sn_ZW: { + lag: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sn: { + lv: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ii_CN: { + lt: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ii: { + luo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - si_LK: { + luy: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - si: { + mk: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sk_SK: { + jmc: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sk: { + kde: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sl_SI: { + mg: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sl: { + ms: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - xog_UG: { + ml: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - xog: { + mt: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - so_DJ: { + gv: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - so_ET: { + mr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - so_KE: { + mas: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - so_SO: { + mer: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - so: { + mfe: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_AR: { + naq: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_BO: { + ne: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_CL: { + nd: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_CO: { + nb: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_CR: { + nn: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_DO: { + nyn: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_EC: { + or: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_SV: { + om: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_GQ: { + ps: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_GT: { + fa: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_HN: { + pl: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_419: { + pt: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_MX: { + pa: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_NI: { + ro: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_PA: { + rm: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_PY: { + rof: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_PE: { + ru: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_PR: { + rwk: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_ES: { + saq: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_US: { + sg: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_UY: { + seh: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es_VE: { + sr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - es: { + sn: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sw_KE: { + ii: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sw_TZ: { + si: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sw: { + sk: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sv_FI: { + sl: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sv_SE: { + xog: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - sv: { + so: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - gsw_CH: { + es: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - gsw: { + sw: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - shi_Latn: { + sv: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - shi_Tfng: { + gsw: { firstDay: 1, weekend: [6, 7], minimalDays: 4, @@ -1851,206 +621,86 @@ declare namespace Intl { weekend: [6, 7], minimalDays: 4, }, - dav_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, dav: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ta_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ta_LK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, ta: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - te_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, te: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - teo_KE: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - teo_UG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, teo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - th_TH: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, th: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - bo_CN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bo_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, bo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ti_ER: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ti_ET: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, ti: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - to_TO: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, to: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - tr_TR: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, tr: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - uk_UA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, uk: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - ur_IN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ur_PK: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, ur: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - uz_Arab: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uz_Cyrl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uz_Latn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, uz: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - vi_VN: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, vi: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - vun_TZ: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, vun: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - cy_GB: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, cy: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - yo_NG: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, yo: { firstDay: 1, weekend: [6, 7], minimalDays: 4, }, - zu_ZA: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, zu: { firstDay: 1, weekend: [6, 7], From 1a5f1937ebd80184764ab1332c7b1eb46d46d4d6 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 24 Jun 2024 10:13:56 +0200 Subject: [PATCH 088/163] refactor: weekInfoPolyfill --- packages/time/src/core/weekInfoPolyfill.ts | 1 + packages/time/src/utils/getFirstDayOfWeek.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/time/src/core/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill.ts index 70f0558d..28c73511 100644 --- a/packages/time/src/core/weekInfoPolyfill.ts +++ b/packages/time/src/core/weekInfoPolyfill.ts @@ -8,6 +8,7 @@ interface WeekInfo { declare namespace Intl { interface Locale { getWeekInfo: () => WeekInfo + weekInfo?: WeekInfo } } diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts index 701b1ede..1b33e98e 100644 --- a/packages/time/src/utils/getFirstDayOfWeek.ts +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -3,6 +3,6 @@ import { Temporal } from '@js-temporal/polyfill' export const getFirstDayOfWeek = (currWeek: string, locale: string = 'en-US') => { const date = Temporal.PlainDate.from(currWeek); const loc = new Intl.Locale(locale); - const { firstDay } = loc.getWeekInfo(); + const { firstDay } = loc.weekInfo || loc.getWeekInfo(); return date.subtract({ days: (date.dayOfWeek - firstDay + 7) % 7 }); } From 3331c174e061d9b45fb193fb46b3a11e5951a0bf Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 24 Jun 2024 21:46:29 +0200 Subject: [PATCH 089/163] refactor: date defaults --- packages/time/src/core/calendar.ts | 11 ++++++----- packages/time/src/tests/calendar-core.test.ts | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 834a2e81..5e5fa9e7 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -19,10 +19,11 @@ export interface ViewMode { } export interface CalendarCoreOptions { - weekStartsOn?: number; events?: TEvent[]; viewMode: CalendarState['viewMode']; locale?: string; + timeZone?: string; + calendar?: string; } export interface CalendarApi { @@ -71,7 +72,7 @@ export class CalendarCore { const start = this.store.state.viewMode.unit === 'month' ? this.getFirstDayOfMonth().subtract({ - days: (this.getFirstDayOfMonth().dayOfWeek - (this.options.weekStartsOn ?? 1) + 7) % 7, + days: (this.getFirstDayOfMonth().dayOfWeek - (this.getFirstDayOfWeek().dayOfWeek + 1) + 7) % 7, }) : this.store.state.currentPeriod; @@ -82,7 +83,7 @@ export class CalendarCore { .add({ months: this.store.state.viewMode.value }) .subtract({ days: 1 }); const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - (this.options.weekStartsOn ?? 1) + 7) % 7; + (lastDayOfMonth.dayOfWeek - (this.getFirstDayOfWeek().dayOfWeek + 1) + 7) % 7; end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); break; } @@ -162,7 +163,7 @@ export class CalendarCore { const baseDate = Temporal.PlainDate.from('2024-01-01'); return Array.from({ length: 7 }).map((_, i) => baseDate - .add({ days: (i + (this.options.weekStartsOn ?? 1) - 1) % 7 }) + .add({ days: (i + (this.getFirstDayOfWeek().dayOfWeek + 1)) % 7 }) .toLocaleString(this.options.locale, { weekday: 'short' }), ); } @@ -283,6 +284,6 @@ export class CalendarCore { } groupDaysBy({ days, unit, fillMissingDays = true }: Omit, 'weekStartsOn'>) { - return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.options.weekStartsOn ?? 1 } as GroupDaysByProps); + return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.getFirstDayOfWeek().dayOfWeek } as GroupDaysByProps); } } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index c11605b5..29f42349 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -11,7 +11,6 @@ describe('CalendarCore', () => { beforeEach(() => { options = { - weekStartsOn: 1, viewMode: { value: 1, unit: 'month' }, events: [ { @@ -100,7 +99,6 @@ describe('CalendarCore', () => { vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:00')); const coreOptions: CalendarCoreOptions = { - weekStartsOn: 1, viewMode: { value: 1, unit: 'week' }, events: [], }; From e1f9c12aea6fb5225c8ad1e63ec2c929fb86fd50 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 24 Jun 2024 22:53:48 +0200 Subject: [PATCH 090/163] refactor: date defaults --- .../time/src/calendar/splitMultiDayEvents.ts | 8 ++--- packages/time/src/core/calendar.ts | 31 ++++++++++++------- packages/time/src/tests/calendar-core.test.ts | 29 +++++++++++++---- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index ebb0c2aa..e5bddddf 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -1,13 +1,13 @@ import { Temporal } from '@js-temporal/polyfill'; import type { Event } from './types'; -export const splitMultiDayEvents = (event: TEvent): TEvent[] => { - const startDate = Temporal.PlainDateTime.from(event.startDate); - const endDate = Temporal.PlainDateTime.from(event.endDate); +export const splitMultiDayEvents = (event: TEvent, timeZone: Temporal.TimeZoneLike): TEvent[] => { + const startDate = event.startDate.toZonedDateTime(timeZone); + const endDate = event.endDate.toZonedDateTime(timeZone); const events: TEvent[] = []; let currentDay = startDate; - while (Temporal.PlainDate.compare(currentDay.toPlainDate(), endDate.toPlainDate()) < 0) { + while (Temporal.ZonedDateTime.compare(currentDay, endDate) < 0) { const startOfCurrentDay = currentDay.with({ hour: 0, minute: 0, second: 0, millisecond: 0 }); const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999 }); diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 5e5fa9e7..f70a736a 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -5,6 +5,7 @@ import { generateDateRange } from '../calendar/generateDateRange'; import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents'; import { getEventProps } from '../calendar/getEventProps'; import { groupDaysBy } from '../calendar/groupDaysBy'; +import { getDateDefaults } from '../utils/dateDefaults'; import type { Properties as CSSProperties } from 'csstype'; import type { GroupDaysByProps } from '../calendar/groupDaysBy'; import type { CalendarState, Day, Event } from '../calendar/types'; @@ -19,7 +20,7 @@ export interface ViewMode { } export interface CalendarCoreOptions { - events?: TEvent[]; + events?: TEvent[] | null; viewMode: CalendarState['viewMode']; locale?: string; timeZone?: string; @@ -47,14 +48,22 @@ export interface CalendarApi { export class CalendarCore { store: Store; - options: CalendarCoreOptions; + options: Required>; constructor(options: CalendarCoreOptions) { - this.options = options; + const defaults = getDateDefaults(); + this.options = { + ...options, + locale: options.locale || defaults.locale, + timeZone: options.timeZone || defaults.timeZone, + calendar: options.calendar || defaults.calendar, + events: options.events || null, + }; + this.store = new Store({ - currentPeriod: Temporal.Now.plainDateISO(), + currentPeriod: Temporal.Now.plainDateISO().withCalendar(this.options.calendar), viewMode: options.viewMode, - currentTime: Temporal.Now.plainDateTimeISO(), + currentTime: Temporal.Now.plainDateTimeISO(this.options.timeZone), }); } @@ -111,15 +120,15 @@ export class CalendarCore { private getEventMap() { const map = new Map(); this.options.events?.forEach((event) => { - const eventStartDate = Temporal.PlainDateTime.from(event.startDate); - const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + const eventStartDate = event.startDate.toZonedDateTime(this.options.timeZone); + const eventEndDate = event.endDate.toZonedDateTime(this.options.timeZone); if ( - Temporal.PlainDate.compare( - eventStartDate.toPlainDate(), - eventEndDate.toPlainDate(), + Temporal.ZonedDateTime.compare( + eventStartDate, + eventEndDate, ) !== 0 ) { - const splitEvents = splitMultiDayEvents(event); + const splitEvents = splitMultiDayEvents(event, this.options.timeZone); splitEvents.forEach((splitEvent) => { const splitKey = splitEvent.startDate.toString().split('T')[0]; if (splitKey) { diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 29f42349..22f66974 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -8,6 +8,7 @@ describe('CalendarCore', () => { let calendarCore: CalendarCore; const mockDate = Temporal.PlainDate.from('2023-06-15'); const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00'); + const mockTimeZone = 'America/New_York'; beforeEach(() => { options = { @@ -26,6 +27,7 @@ describe('CalendarCore', () => { title: 'Event 2', }, ], + timeZone: mockTimeZone, }; calendarCore = new CalendarCore(options); vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); @@ -89,7 +91,7 @@ describe('CalendarCore', () => { const initialTime = calendarCore.store.state.currentTime; const newMockDateTime = initialTime.add({ minutes: 1 }); vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); - + calendarCore.updateCurrentTime(); const updatedTime = calendarCore.store.state.currentTime; expect(updatedTime).toEqual(newMockDateTime); @@ -101,6 +103,7 @@ describe('CalendarCore', () => { const coreOptions: CalendarCoreOptions = { viewMode: { value: 1, unit: 'week' }, events: [], + timeZone: mockTimeZone, }; calendarCore = new CalendarCore(coreOptions); @@ -116,18 +119,32 @@ describe('CalendarCore', () => { }); }); - test('should update the current time on', () => { + test('should update the current time', () => { const initialTime = calendarCore.store.state.currentTime; const newMockDateTime = initialTime.add({ minutes: 1 }); vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); - + calendarCore.updateCurrentTime(); - expect(initialTime).toEqual(newMockDateTime); - }) + expect(calendarCore.store.state.currentTime).toEqual(newMockDateTime); + }); test('should group days correctly', () => { const daysWithEvents = calendarCore.getDaysWithEvents(); - const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month'}); + const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month' }); expect(groupedDays.length).toBeGreaterThan(0); }); + + test('should initialize with the correct time zone', () => { + expect(calendarCore.options.timeZone).toBe(mockTimeZone); + }); + + test('should respect custom calendar', () => { + const customCalendar = 'islamic-civil'; + options.calendar = customCalendar; + calendarCore = new CalendarCore(options); + + const today = Temporal.Now.plainDateISO(customCalendar); + expect(calendarCore.store.state.currentPeriod.calendarId).toBe(customCalendar); + expect(calendarCore.store.state.currentPeriod).toEqual(today); + }); }); From 1dfecfbdba39238040c85fed2b3d925f15640253 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 24 Jun 2024 23:02:26 +0200 Subject: [PATCH 091/163] refactor: date defaults --- packages/time/src/calendar/splitMultiDayEvents.ts | 4 ++-- packages/time/src/calendar/types.ts | 4 ++-- packages/time/src/core/calendar.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index e5bddddf..0d2088d5 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -2,8 +2,8 @@ import { Temporal } from '@js-temporal/polyfill'; import type { Event } from './types'; export const splitMultiDayEvents = (event: TEvent, timeZone: Temporal.TimeZoneLike): TEvent[] => { - const startDate = event.startDate.toZonedDateTime(timeZone); - const endDate = event.endDate.toZonedDateTime(timeZone); + const startDate = event.startDate instanceof Temporal.PlainDateTime ? event.startDate.toZonedDateTime(timeZone) : event.startDate; + const endDate = event.endDate instanceof Temporal.PlainDateTime ? event.endDate.toZonedDateTime(timeZone) : event.endDate; const events: TEvent[] = []; let currentDay = startDate; diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 8da9ad3b..c3376b3c 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -2,8 +2,8 @@ import type { Temporal } from "@js-temporal/polyfill" export interface Event { id: string; - startDate: Temporal.PlainDateTime; - endDate: Temporal.PlainDateTime; + startDate: Temporal.PlainDateTime | Temporal.ZonedDateTime; + endDate: Temporal.PlainDateTime | Temporal.ZonedDateTime; title: string; } diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index f70a736a..c220b440 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -120,8 +120,8 @@ export class CalendarCore { private getEventMap() { const map = new Map(); this.options.events?.forEach((event) => { - const eventStartDate = event.startDate.toZonedDateTime(this.options.timeZone); - const eventEndDate = event.endDate.toZonedDateTime(this.options.timeZone); + const eventStartDate = event.startDate instanceof Temporal.PlainDateTime ? event.startDate.toZonedDateTime(this.options.timeZone) : event.startDate; + const eventEndDate = event.endDate instanceof Temporal.PlainDateTime ? event.endDate.toZonedDateTime(this.options.timeZone) : event.endDate; if ( Temporal.ZonedDateTime.compare( eventStartDate, From 277f416cc4e363e0170ead2f8bee347395e3718b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 11:25:45 +0200 Subject: [PATCH 092/163] refactor: types --- packages/time/src/core/calendar.ts | 6 +++--- packages/time/src/utils/dateDefaults.ts | 8 +++++--- packages/time/src/utils/getFirstDayOfWeek.ts | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index c220b440..2a697b5a 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -22,9 +22,9 @@ export interface ViewMode { export interface CalendarCoreOptions { events?: TEvent[] | null; viewMode: CalendarState['viewMode']; - locale?: string; - timeZone?: string; - calendar?: string; + locale?: Intl.UnicodeBCP47LocaleIdentifier; + timeZone?: Temporal.TimeZoneLike; + calendar?: Temporal.CalendarLike; } export interface CalendarApi { diff --git a/packages/time/src/utils/dateDefaults.ts b/packages/time/src/utils/dateDefaults.ts index 0dd3f983..0ac14ae5 100644 --- a/packages/time/src/utils/dateDefaults.ts +++ b/packages/time/src/utils/dateDefaults.ts @@ -1,7 +1,9 @@ +import type { Temporal } from "@js-temporal/polyfill"; + export interface IDateDefaults { - calendar: string; - locale: string; - timeZone: string; + calendar: Temporal.CalendarLike; + locale: Intl.UnicodeBCP47LocaleIdentifier; + timeZone: Temporal.TimeZoneLike; } const { diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts index 1b33e98e..65f71e39 100644 --- a/packages/time/src/utils/getFirstDayOfWeek.ts +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -1,6 +1,6 @@ import { Temporal } from '@js-temporal/polyfill' -export const getFirstDayOfWeek = (currWeek: string, locale: string = 'en-US') => { +export const getFirstDayOfWeek = (currWeek: string, locale: Intl.UnicodeBCP47LocaleIdentifier | Intl.Locale = 'en-US') => { const date = Temporal.PlainDate.from(currWeek); const loc = new Intl.Locale(locale); const { firstDay } = loc.weekInfo || loc.getWeekInfo(); From 4131b8e56424f62f4bc4b983edb1fb515b204025 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 11:43:24 +0200 Subject: [PATCH 093/163] docs: jsdocs --- packages/time/src/core/calendar.ts | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 2a697b5a..81b414b0 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -14,38 +14,77 @@ import './weekInfoPolyfill'; export type { CalendarState, Event, Day } from '../calendar/types'; +/** + * Represents the configuration for the current viewing mode of a calendar, + * specifying the scale and unit of time. + */ export interface ViewMode { + /** The number of units for the view mode. */ value: number; + /** The unit of time that the calendar view should display (month, week, or day). */ unit: 'month' | 'week' | 'day'; } +/** + * Configuration options for initializing a CalendarCore instance, allowing customization + * of events, locale, time zone, and the calendar system. + * @template TEvent - Specifies the event type, extending a base Event type. + */ export interface CalendarCoreOptions { + /** An optional array of events to be handled by the calendar. */ events?: TEvent[] | null; + /** The initial view mode configuration of the calendar. */ viewMode: CalendarState['viewMode']; + /** Optional locale for date formatting. Uses a BCP 47 language tag. */ locale?: Intl.UnicodeBCP47LocaleIdentifier; + /** Optional time zone specification for the calendar. */ timeZone?: Temporal.TimeZoneLike; + /** Optional calendar system to be used. */ calendar?: Temporal.CalendarLike; } +/** + * The API surface provided by CalendarCore, allowing interaction with the calendar's state + * and manipulation of its settings and data. + * @template TEvent - The type of events handled by the calendar. + */ export interface CalendarApi { + /** The currently focused date period in the calendar. */ currentPeriod: CalendarState['currentPeriod']; + /** The current view mode of the calendar. */ viewMode: CalendarState['viewMode']; + /** The current date and time according to the calendar's time zone. */ currentTime: CalendarState['currentTime']; + /** An array of days, each potentially containing events. */ days: Array>; + /** An array of names for the days of the week, localized to the calendar's locale. */ daysNames: string[]; + /** Navigates to the previous period according to the current view mode. */ goToPreviousPeriod: () => void; + /** Navigates to the next period according to the current view mode. */ goToNextPeriod: () => void; + /** Resets the view to the current period based on today's date. */ goToCurrentPeriod: () => void; + /** Navigates to a specific date. */ goToSpecificPeriod: (date: Temporal.PlainDate) => void; + /** Changes the current view mode of the calendar. */ changeViewMode: (newViewMode: CalendarState['viewMode']) => void; + /** Retrieves styling properties for a specific event, identified by ID. */ getEventProps: (id: Event['id']) => { style: CSSProperties } | null; + /** Provides properties for the marker indicating the current time. */ getCurrentTimeMarkerProps: () => { style: CSSProperties; currentTime: string | undefined; }; + /** Groups days by a specified unit. */ groupDaysBy: (props: Omit, 'weekStartsOn'>) => (Day | null)[][]; } +/** + * Core functionality for a calendar system, managing the state and operations of the calendar, + * such as navigating through time periods, handling events, and adjusting settings. + * @template TEvent - The type of events managed by the calendar. + */ export class CalendarCore { store: Store; options: Required>; From b7f67f09e125371e18e4d8b7f5a4510a0d842ee5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 11:58:02 +0200 Subject: [PATCH 094/163] refactor: types --- packages/time/src/calendar/types.ts | 2 +- packages/time/src/core/calendar.ts | 330 ++++++++++++++++------------ 2 files changed, 196 insertions(+), 136 deletions(-) diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index c3376b3c..08ffe7ef 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -7,7 +7,7 @@ export interface Event { title: string; } -export interface CalendarState { +export interface CalendarStore { currentPeriod: Temporal.PlainDate viewMode: { value: number diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 81b414b0..50fe6b83 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -1,18 +1,18 @@ -import { Store } from '@tanstack/store'; -import { Temporal } from '@js-temporal/polyfill'; -import { getFirstDayOfMonth, getFirstDayOfWeek } from '../utils'; -import { generateDateRange } from '../calendar/generateDateRange'; -import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents'; -import { getEventProps } from '../calendar/getEventProps'; -import { groupDaysBy } from '../calendar/groupDaysBy'; -import { getDateDefaults } from '../utils/dateDefaults'; -import type { Properties as CSSProperties } from 'csstype'; -import type { GroupDaysByProps } from '../calendar/groupDaysBy'; -import type { CalendarState, Day, Event } from '../calendar/types'; - -import './weekInfoPolyfill'; - -export type { CalendarState, Event, Day } from '../calendar/types'; +import { Store } from '@tanstack/store' +import { Temporal } from '@js-temporal/polyfill' +import { getFirstDayOfMonth, getFirstDayOfWeek } from '../utils' +import { generateDateRange } from '../calendar/generateDateRange' +import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents' +import { getEventProps } from '../calendar/getEventProps' +import { groupDaysBy } from '../calendar/groupDaysBy' +import { getDateDefaults } from '../utils/dateDefaults' +import type { Properties as CSSProperties } from 'csstype' +import type { GroupDaysByProps } from '../calendar/groupDaysBy' +import type { CalendarStore, Day, Event } from '../calendar/types' + +import './weekInfoPolyfill' + +export type { CalendarStore, Event, Day } from '../calendar/types' /** * Represents the configuration for the current viewing mode of a calendar, @@ -20,9 +20,9 @@ export type { CalendarState, Event, Day } from '../calendar/types'; */ export interface ViewMode { /** The number of units for the view mode. */ - value: number; + value: number /** The unit of time that the calendar view should display (month, week, or day). */ - unit: 'month' | 'week' | 'day'; + unit: 'month' | 'week' | 'day' } /** @@ -32,15 +32,15 @@ export interface ViewMode { */ export interface CalendarCoreOptions { /** An optional array of events to be handled by the calendar. */ - events?: TEvent[] | null; + events?: TEvent[] | null /** The initial view mode configuration of the calendar. */ - viewMode: CalendarState['viewMode']; + viewMode: CalendarStore['viewMode'] /** Optional locale for date formatting. Uses a BCP 47 language tag. */ - locale?: Intl.UnicodeBCP47LocaleIdentifier; + locale?: Intl.UnicodeBCP47LocaleIdentifier /** Optional time zone specification for the calendar. */ - timeZone?: Temporal.TimeZoneLike; + timeZone?: Temporal.TimeZoneLike /** Optional calendar system to be used. */ - calendar?: Temporal.CalendarLike; + calendar?: Temporal.CalendarLike } /** @@ -48,245 +48,290 @@ export interface CalendarCoreOptions { * and manipulation of its settings and data. * @template TEvent - The type of events handled by the calendar. */ -export interface CalendarApi { - /** The currently focused date period in the calendar. */ - currentPeriod: CalendarState['currentPeriod']; - /** The current view mode of the calendar. */ - viewMode: CalendarState['viewMode']; - /** The current date and time according to the calendar's time zone. */ - currentTime: CalendarState['currentTime']; - /** An array of days, each potentially containing events. */ - days: Array>; - /** An array of names for the days of the week, localized to the calendar's locale. */ - daysNames: string[]; +interface CalendarActions { /** Navigates to the previous period according to the current view mode. */ - goToPreviousPeriod: () => void; + goToPreviousPeriod: () => void /** Navigates to the next period according to the current view mode. */ - goToNextPeriod: () => void; + goToNextPeriod: () => void /** Resets the view to the current period based on today's date. */ - goToCurrentPeriod: () => void; + goToCurrentPeriod: () => void /** Navigates to a specific date. */ - goToSpecificPeriod: (date: Temporal.PlainDate) => void; + goToSpecificPeriod: (date: Temporal.PlainDate) => void /** Changes the current view mode of the calendar. */ - changeViewMode: (newViewMode: CalendarState['viewMode']) => void; + changeViewMode: (newViewMode: CalendarStore['viewMode']) => void /** Retrieves styling properties for a specific event, identified by ID. */ - getEventProps: (id: Event['id']) => { style: CSSProperties } | null; + getEventProps: (id: Event['id']) => { style: CSSProperties } | null /** Provides properties for the marker indicating the current time. */ getCurrentTimeMarkerProps: () => { - style: CSSProperties; - currentTime: string | undefined; - }; + style: CSSProperties + currentTime: string | undefined + } /** Groups days by a specified unit. */ - groupDaysBy: (props: Omit, 'weekStartsOn'>) => (Day | null)[][]; + groupDaysBy: ( + props: Omit, 'weekStartsOn'>, + ) => (Day | null)[][] +} + +interface CalendarState { + /** The currently focused date period in the calendar. */ + currentPeriod: CalendarStore['currentPeriod'] + /** The current view mode of the calendar. */ + viewMode: CalendarStore['viewMode'] + /** The current date and time according to the calendar's time zone. */ + currentTime: CalendarStore['currentTime'] + /** An array of days, each potentially containing events. */ + days: Array> + /** An array of names for the days of the week, localized to the calendar's locale. */ + daysNames: string[] } +export interface CalendarApi + extends CalendarActions, + CalendarState {} + /** * Core functionality for a calendar system, managing the state and operations of the calendar, * such as navigating through time periods, handling events, and adjusting settings. * @template TEvent - The type of events managed by the calendar. */ -export class CalendarCore { - store: Store; - options: Required>; +export class CalendarCore + implements CalendarActions +{ + store: Store + options: Required> constructor(options: CalendarCoreOptions) { - const defaults = getDateDefaults(); + const defaults = getDateDefaults() this.options = { ...options, locale: options.locale || defaults.locale, timeZone: options.timeZone || defaults.timeZone, calendar: options.calendar || defaults.calendar, events: options.events || null, - }; - - this.store = new Store({ - currentPeriod: Temporal.Now.plainDateISO().withCalendar(this.options.calendar), + } + + this.store = new Store({ + currentPeriod: Temporal.Now.plainDateISO().withCalendar( + this.options.calendar, + ), viewMode: options.viewMode, currentTime: Temporal.Now.plainDateTimeISO(this.options.timeZone), - }); + }) } private getFirstDayOfMonth() { return getFirstDayOfMonth( - this.store.state.currentPeriod.toString({ calendarName: 'auto' }).substring(0, 7), - ); + this.store.state.currentPeriod + .toString({ calendarName: 'auto' }) + .substring(0, 7), + ) } private getFirstDayOfWeek() { - return getFirstDayOfWeek(this.store.state.currentPeriod.toString(), this.options.locale); + return getFirstDayOfWeek( + this.store.state.currentPeriod.toString(), + this.options.locale, + ) } private getCalendarDays() { const start = this.store.state.viewMode.unit === 'month' ? this.getFirstDayOfMonth().subtract({ - days: (this.getFirstDayOfMonth().dayOfWeek - (this.getFirstDayOfWeek().dayOfWeek + 1) + 7) % 7, + days: + (this.getFirstDayOfMonth().dayOfWeek - + (this.getFirstDayOfWeek().dayOfWeek + 1) + + 7) % + 7, }) - : this.store.state.currentPeriod; + : this.store.state.currentPeriod - let end; + let end switch (this.store.state.viewMode.unit) { case 'month': { const lastDayOfMonth = this.getFirstDayOfMonth() .add({ months: this.store.state.viewMode.value }) - .subtract({ days: 1 }); + .subtract({ days: 1 }) const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - (this.getFirstDayOfWeek().dayOfWeek + 1) + 7) % 7; - end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }); - break; + (lastDayOfMonth.dayOfWeek - + (this.getFirstDayOfWeek().dayOfWeek + 1) + + 7) % + 7 + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) + break } case 'week': { - end = this.getFirstDayOfWeek().add({ days: 7 * this.store.state.viewMode.value - 1 }); - break; + end = this.getFirstDayOfWeek().add({ + days: 7 * this.store.state.viewMode.value - 1, + }) + break } case 'day': { - end = this.store.state.currentPeriod.add({ days: this.store.state.viewMode.value - 1 }); - break; + end = this.store.state.currentPeriod.add({ + days: this.store.state.viewMode.value - 1, + }) + break } } - const allDays = generateDateRange(start, end); - const startMonth = this.store.state.currentPeriod.month; + const allDays = generateDateRange(start, end) + const startMonth = this.store.state.currentPeriod.month const endMonth = this.store.state.currentPeriod.add({ months: this.store.state.viewMode.value - 1, - }).month; + }).month return allDays.filter( (day) => day.month >= startMonth && day.month <= endMonth, - ); + ) } private getEventMap() { - const map = new Map(); + const map = new Map() this.options.events?.forEach((event) => { - const eventStartDate = event.startDate instanceof Temporal.PlainDateTime ? event.startDate.toZonedDateTime(this.options.timeZone) : event.startDate; - const eventEndDate = event.endDate instanceof Temporal.PlainDateTime ? event.endDate.toZonedDateTime(this.options.timeZone) : event.endDate; - if ( - Temporal.ZonedDateTime.compare( - eventStartDate, - eventEndDate, - ) !== 0 - ) { - const splitEvents = splitMultiDayEvents(event, this.options.timeZone); + const eventStartDate = + event.startDate instanceof Temporal.PlainDateTime + ? event.startDate.toZonedDateTime(this.options.timeZone) + : event.startDate + const eventEndDate = + event.endDate instanceof Temporal.PlainDateTime + ? event.endDate.toZonedDateTime(this.options.timeZone) + : event.endDate + if (Temporal.ZonedDateTime.compare(eventStartDate, eventEndDate) !== 0) { + const splitEvents = splitMultiDayEvents( + event, + this.options.timeZone, + ) splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.startDate.toString().split('T')[0]; + const splitKey = splitEvent.startDate.toString().split('T')[0] if (splitKey) { - if (!map.has(splitKey)) map.set(splitKey, []); - map.get(splitKey)?.push(splitEvent); + if (!map.has(splitKey)) map.set(splitKey, []) + map.get(splitKey)?.push(splitEvent) } - }); + }) } else { - const eventKey = event.startDate.toString().split('T')[0]; + const eventKey = event.startDate.toString().split('T')[0] if (eventKey) { - if (!map.has(eventKey)) map.set(eventKey, []); - map.get(eventKey)?.push(event); + if (!map.has(eventKey)) map.set(eventKey, []) + map.get(eventKey)?.push(event) } } - }); - return map; + }) + return map } getDaysWithEvents() { - const calendarDays = this.getCalendarDays(); - const eventMap = this.getEventMap(); + const calendarDays = this.getCalendarDays() + const eventMap = this.getEventMap() return calendarDays.map((day) => { - const dayKey = day.toString(); - const dailyEvents = eventMap.get(dayKey) ?? []; + const dayKey = day.toString() + const dailyEvents = eventMap.get(dayKey) ?? [] const currentMonthRange = Array.from( { length: this.store.state.viewMode.value }, (_, i) => this.store.state.currentPeriod.add({ months: i }).month, - ); - const isInCurrentPeriod = currentMonthRange.includes(day.month); + ) + const isInCurrentPeriod = currentMonthRange.includes(day.month) return { date: day, events: dailyEvents, isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod, - }; - }); + } + }) } getDaysNames() { - const baseDate = Temporal.PlainDate.from('2024-01-01'); + const baseDate = Temporal.PlainDate.from('2024-01-01') return Array.from({ length: 7 }).map((_, i) => baseDate .add({ days: (i + (this.getFirstDayOfWeek().dayOfWeek + 1)) % 7 }) .toLocaleString(this.options.locale, { weekday: 'short' }), - ); + ) } - changeViewMode(newViewMode: CalendarState['viewMode']) { + changeViewMode(newViewMode: CalendarStore['viewMode']) { this.store.setState((prev) => ({ ...prev, viewMode: newViewMode, - })); + })) } goToPreviousPeriod() { - const firstDayOfMonth = this.getFirstDayOfMonth(); - const firstDayOfWeek = this.getFirstDayOfWeek(); + const firstDayOfMonth = this.getFirstDayOfMonth() + const firstDayOfWeek = this.getFirstDayOfWeek() switch (this.store.state.viewMode.unit) { case 'month': { - const firstDayOfPrevMonth = firstDayOfMonth.subtract({ months: this.store.state.viewMode.value }); + const firstDayOfPrevMonth = firstDayOfMonth.subtract({ + months: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: firstDayOfPrevMonth, - })); - break; + })) + break } case 'week': { - const firstDayOfPrevWeek = firstDayOfWeek.subtract({ weeks: this.store.state.viewMode.value }); + const firstDayOfPrevWeek = firstDayOfWeek.subtract({ + weeks: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: firstDayOfPrevWeek, - })); - break; + })) + break } case 'day': { - const prevCustomStart = this.store.state.currentPeriod.subtract({ days: this.store.state.viewMode.value }); + const prevCustomStart = this.store.state.currentPeriod.subtract({ + days: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: prevCustomStart, - })); - break; + })) + break } } } goToNextPeriod() { - const firstDayOfMonth = this.getFirstDayOfMonth(); - const firstDayOfWeek = this.getFirstDayOfWeek(); + const firstDayOfMonth = this.getFirstDayOfMonth() + const firstDayOfWeek = this.getFirstDayOfWeek() switch (this.store.state.viewMode.unit) { case 'month': { - const firstDayOfNextMonth = firstDayOfMonth.add({ months: this.store.state.viewMode.value }); + const firstDayOfNextMonth = firstDayOfMonth.add({ + months: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: firstDayOfNextMonth, - })); - break; + })) + break } case 'week': { - const firstDayOfNextWeek = firstDayOfWeek.add({ weeks: this.store.state.viewMode.value }); + const firstDayOfNextWeek = firstDayOfWeek.add({ + weeks: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: firstDayOfNextWeek, - })); - break; + })) + break } case 'day': { - const nextCustomStart = this.store.state.currentPeriod.add({ days: this.store.state.viewMode.value }); + const nextCustomStart = this.store.state.currentPeriod.add({ + days: this.store.state.viewMode.value, + }) this.store.setState((prev) => ({ ...prev, currentPeriod: nextCustomStart, - })); - break; + })) + break } } } @@ -295,31 +340,34 @@ export class CalendarCore { this.store.setState((prev) => ({ ...prev, currentPeriod: Temporal.Now.plainDateISO(), - })); + })) } goToSpecificPeriod(date: Temporal.PlainDate) { this.store.setState((prev) => ({ ...prev, currentPeriod: date, - })); + })) } updateCurrentTime() { this.store.setState((prev) => ({ ...prev, currentTime: Temporal.Now.plainDateTimeISO(), - })); + })) } getEventProps(id: Event['id']) { - return getEventProps(this.getEventMap(), id, this.store.state); + return getEventProps(this.getEventMap(), id, this.store.state) } - getCurrentTimeMarkerProps(): { style: CSSProperties; currentTime: string | undefined } { - const { hour, minute } = this.store.state.currentTime; - const currentTimeInMinutes = hour * 60 + minute; - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100; + getCurrentTimeMarkerProps(): { + style: CSSProperties + currentTime: string | undefined + } { + const { hour, minute } = this.store.state.currentTime + const currentTimeInMinutes = hour * 60 + minute + const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 return { style: { @@ -327,11 +375,23 @@ export class CalendarCore { top: `${percentageOfDay}%`, left: 0, }, - currentTime: this.store.state.currentTime.toString().split('T')[1]?.substring(0, 5), - }; + currentTime: this.store.state.currentTime + .toString() + .split('T')[1] + ?.substring(0, 5), + } } - groupDaysBy({ days, unit, fillMissingDays = true }: Omit, 'weekStartsOn'>) { - return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.getFirstDayOfWeek().dayOfWeek } as GroupDaysByProps); + groupDaysBy({ + days, + unit, + fillMissingDays = true, + }: Omit, 'weekStartsOn'>) { + return groupDaysBy({ + days, + unit, + fillMissingDays, + weekStartsOn: this.getFirstDayOfWeek().dayOfWeek, + } as GroupDaysByProps) } } From 4165b202724c3204a52c3a722b4f668a367ffdb7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 12:05:25 +0200 Subject: [PATCH 095/163] refactor: types --- packages/react-time/src/useCalendar/useCalendar.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 6dd34126..a9db19d4 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -67,9 +67,7 @@ export const useCalendar = ( const groupDaysBy = useCallback((props) => calendarCore.groupDaysBy(props), [calendarCore]) return { - currentPeriod: state.currentPeriod, - viewMode: state.viewMode, - currentTime: state.currentTime, + ...state, days: calendarCore.getDaysWithEvents(), daysNames: calendarCore.getDaysNames(), goToPreviousPeriod, From 1b71c7eb681c59e159320f28ebd664c9ffff4004 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 14:00:21 +0200 Subject: [PATCH 096/163] test: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index ea50fedf..ba20a201 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -241,20 +241,13 @@ describe('useCalendar', () => { expect(weeks.find((week) => week.some((day) => day?.isToday))?.find((day) => day?.isToday)?.date.toString()).toBe('2024-06-01'); }); - test('should return the correct day names based on weekStartsOn', () => { + test('should return the correct day names based on the locale', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 1 }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ); const { daysNames } = result.current; expect(daysNames).toEqual(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']); - - const { result: resultSundayStart } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 7 }) - ); - - const { daysNames: sundayDaysNames } = resultSundayStart.current; - expect(sundayDaysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); }); test('should correctly mark days as in current period', () => { @@ -355,17 +348,4 @@ describe('useCalendar', () => { expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-30'); }); - - test('should group days by weeks correctly when weekStartsOn is Sunday', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', weekStartsOn: 7 }) - ); - - const { days, groupDaysBy } = result.current; - const weeks = groupDaysBy({ days, unit: 'week' }); - - expect(weeks).toHaveLength(6); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); - expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-29'); - }); }); From 604c8bb7f611ccdada6b6a951600793d1bfd0a5f Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 16:41:18 +0200 Subject: [PATCH 097/163] refactor: useIsomorphicLayoutEffect --- packages/react-time/src/useCalendar/useCalendar.ts | 5 +++-- packages/react-time/src/utils/index.ts | 1 + packages/react-time/src/utils/useIsomorphicLayoutEffect.ts | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 packages/react-time/src/utils/index.ts create mode 100644 packages/react-time/src/utils/useIsomorphicLayoutEffect.ts diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index a9db19d4..84a236c5 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,7 +1,8 @@ -import { useCallback, useEffect, useRef, useState, useTransition } from 'react' +import { useCallback, useRef, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' import { Temporal } from '@js-temporal/polyfill' import { CalendarCore, type Event } from '@tanstack/time' +import { useIsomorphicLayoutEffect } from '../utils' import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' export const useCalendar = ( @@ -16,7 +17,7 @@ export const useCalendar = ( calendarCore.updateCurrentTime() }, [calendarCore]) - useEffect(() => { + useIsomorphicLayoutEffect(() => { if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current) const now = Temporal.Now.plainDateTimeISO() diff --git a/packages/react-time/src/utils/index.ts b/packages/react-time/src/utils/index.ts new file mode 100644 index 00000000..881ccca3 --- /dev/null +++ b/packages/react-time/src/utils/index.ts @@ -0,0 +1 @@ +export * from './useIsomorphicLayoutEffect' diff --git a/packages/react-time/src/utils/useIsomorphicLayoutEffect.ts b/packages/react-time/src/utils/useIsomorphicLayoutEffect.ts new file mode 100644 index 00000000..287b88a4 --- /dev/null +++ b/packages/react-time/src/utils/useIsomorphicLayoutEffect.ts @@ -0,0 +1,4 @@ +import { useEffect, useLayoutEffect } from "react"; + +export const useIsomorphicLayoutEffect = + typeof window !== 'undefined' ? useLayoutEffect : useEffect \ No newline at end of file From 4ee4be477563bead4739d00e5918e743e9c14102 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 21:38:41 +0200 Subject: [PATCH 098/163] chore: resolve conflicts --- packages/time/src/core/calendar.ts | 2 +- packages/time/src/core/date-picker.ts | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 50fe6b83..ecbc94a6 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -94,7 +94,7 @@ export interface CalendarApi * such as navigating through time periods, handling events, and adjusting settings. * @template TEvent - The type of events managed by the calendar. */ -export class CalendarCore +export class CalendarCore implements CalendarActions { store: Store diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts index b8e80801..14c79235 100644 --- a/packages/time/src/core/date-picker.ts +++ b/packages/time/src/core/date-picker.ts @@ -1,27 +1,41 @@ import { Store } from '@tanstack/store'; import { Temporal } from '@js-temporal/polyfill'; +import { getDateDefaults } from '../utils/dateDefaults'; import { CalendarCore } from './calendar'; -import type { CalendarCoreOptions, CalendarState } from './calendar'; +import type { CalendarCoreOptions, CalendarStore } from './calendar'; export interface DatePickerOptions extends CalendarCoreOptions { - minDate?: Temporal.PlainDate; - maxDate?: Temporal.PlainDate; + minDate?: Temporal.PlainDate | null; + maxDate?: Temporal.PlainDate | null; multiple?: boolean; range?: boolean; selectedDates?: Temporal.PlainDate[]; } -export interface DatePickerCoreState extends CalendarState { +export interface DatePickerCoreState extends CalendarStore { selectedDates: Map; } export class DatePickerCore extends CalendarCore { datePickerStore: Store; - options: DatePickerOptions; + options: Required; constructor(options: DatePickerOptions) { super(options); - this.options = options; + const defaults = getDateDefaults() + + this.options = { + ...options, + multiple: options.multiple ?? false, + range: options.range ?? false, + minDate: options.minDate ?? null, + maxDate: options.maxDate ?? null, + selectedDates: options.selectedDates ?? [], + events: options.events ?? [], + locale: options.locale ?? defaults.locale, + timeZone: options.timeZone ?? defaults.timeZone, + calendar: options.calendar ?? defaults.calendar, + } this.datePickerStore = new Store({ ...this.store.state, selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), From bd1d3e377db193b2ba93970caff7500c91e81660 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 25 Jun 2024 21:46:58 +0200 Subject: [PATCH 099/163] docs: jsdocs --- packages/time/src/core/date-picker.ts | 76 +++++++++++++++++---------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts index 14c79235..a238f2cf 100644 --- a/packages/time/src/core/date-picker.ts +++ b/packages/time/src/core/date-picker.ts @@ -1,27 +1,45 @@ -import { Store } from '@tanstack/store'; -import { Temporal } from '@js-temporal/polyfill'; -import { getDateDefaults } from '../utils/dateDefaults'; -import { CalendarCore } from './calendar'; -import type { CalendarCoreOptions, CalendarStore } from './calendar'; +import { Store } from '@tanstack/store' +import { Temporal } from '@js-temporal/polyfill' +import { getDateDefaults } from '../utils/dateDefaults' +import { CalendarCore } from './calendar' +import type { CalendarCoreOptions, CalendarStore } from './calendar' export interface DatePickerOptions extends CalendarCoreOptions { - minDate?: Temporal.PlainDate | null; - maxDate?: Temporal.PlainDate | null; - multiple?: boolean; - range?: boolean; - selectedDates?: Temporal.PlainDate[]; + /** + * The earliest date that can be selected. Null if no minimum constraint. + */ + minDate?: Temporal.PlainDate | null + /** + * The latest date that can be selected. Null if no maximum constraint. + */ + maxDate?: Temporal.PlainDate | null + /** + * Allows selection of multiple dates. + */ + multiple?: boolean + /** + * Allows selection of a range of dates. + */ + range?: boolean + /** + * Initial set of selected dates. + */ + selectedDates?: Temporal.PlainDate[] } export interface DatePickerCoreState extends CalendarStore { - selectedDates: Map; + /** + * A map of selected dates, keyed by their string representation. + */ + selectedDates: Map } export class DatePickerCore extends CalendarCore { - datePickerStore: Store; - options: Required; + datePickerStore: Store + options: Required constructor(options: DatePickerOptions) { - super(options); + super(options) const defaults = getDateDefaults() this.options = { @@ -38,38 +56,40 @@ export class DatePickerCore extends CalendarCore { } this.datePickerStore = new Store({ ...this.store.state, - selectedDates: new Map(options.selectedDates?.map(date => [date.toString(), date]) ?? []), - }); + selectedDates: new Map( + options.selectedDates?.map((date) => [date.toString(), date]) ?? [], + ), + }) } getSelectedDates() { - return Array.from(this.datePickerStore.state.selectedDates.values()); + return Array.from(this.datePickerStore.state.selectedDates.values()) } selectDate(date: Temporal.PlainDate) { - const { multiple, range, minDate, maxDate } = this.options; + const { multiple, range, minDate, maxDate } = this.options - if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return; - if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return; + if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return + if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return - const selectedDates = new Map(this.datePickerStore.state.selectedDates); + const selectedDates = new Map(this.datePickerStore.state.selectedDates) if (range && selectedDates.size === 1) { - selectedDates.set(date.toString(), date); + selectedDates.set(date.toString(), date) } else if (multiple) { if (selectedDates.has(date.toString())) { - selectedDates.delete(date.toString()); + selectedDates.delete(date.toString()) } else { - selectedDates.set(date.toString(), date); + selectedDates.set(date.toString(), date) } } else { - selectedDates.clear(); - selectedDates.set(date.toString(), date); + selectedDates.clear() + selectedDates.set(date.toString(), date) } - this.datePickerStore.setState(prev => ({ + this.datePickerStore.setState((prev) => ({ ...prev, selectedDates, - })); + })) } } From 63111957dba75d5a3bec0d0c8a1aed45e0cc231a Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 26 Jun 2024 23:26:34 +0200 Subject: [PATCH 100/163] docs: calendar --- docs/framework/react/reference/useCalendar.md | 74 +++++++++---------- docs/reference/calendar-core.md | 39 +++++----- 2 files changed, 55 insertions(+), 58 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 0582268c..81ca29a3 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -20,56 +20,48 @@ export function useCalendar({ #### Parameters -- `weekStartsOn?: number` - - This parameter is an optional number that specifies the day of the week that the calendar should start on. It defaults to 0, which is Sunday. -- `events: Event[]` - - This parameter is an array of events that the calendar should display. -- `viewMode: 'month' | 'week' | number` - - This parameter is a string that specifies the initial view mode of the calendar. It can be either 'month', 'week', or a number representing the number of days in a custom view mode. -- `locale?: string` - - This parameter is an optional string that specifies the locale to use for formatting dates and times. It defaults to the system locale. -- `onChangeViewMode?: ({ value: number; unit: "month" | "week" | "day"; }) => void` - - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. -- `onChangeViewMode?: (viewMode: value: number; unit: "month" | "week" | "day";) => void` - - This parameter is an optional callback function that is called when the view mode of the calendar changes. It receives the new view mode as an argument. -- `reducer?: (state: CalendarState, action: CalendarAction) => CalendarState` - - This parameter is an optional custom reducer function that can be used to manage the state of the calendar. +- `events?: TEvent[] | null` +An optional array of events to be handled by the calendar. +- `viewMode: CalendarStore['viewMode']` +The initial view mode configuration of the calendar. +- `locale?: Intl.UnicodeBCP47LocaleIdentifier` +Optional locale for date formatting. Uses a BCP 47 language tag. +- `timeZone?: Temporal.TimeZoneLike` +Optional time zone specification for the calendar. +- `calendar?: Temporal.CalendarLike` +Optional calendar system to be used. #### Returns -- `firstDayOfPeriod: Temporal.PlainDate` - - This value represents the first day of the current period displayed by the calendar. -- `currentPeriod: string` - - This value represents a string that describes the current period displayed by the calendar. -- `goToPreviousPeriod: MouseEventHandler` - - This function is a click event handler that navigates to the previous period. -- `goToNextPeriod: MouseEventHandler` - - This function is a click event handler that navigates to the next period. -- `goToCurrentPeriod: MouseEventHandler` - - This function is a click event handler that navigates to the current period. +`firstDayOfPeriod: Temporal.PlainDate` +This value represents the first day of the current period displayed by the calendar. +`currentPeriod: string` +This value represents a string that describes the current period displayed by the calendar. +`goToPreviousPeriod: () => void` +This function navigates to the previous period. +`goToNextPeriod: () => void` +This function navigates to the next period. +- `goToCurrentPeriod: () => void` +This function navigates to the current period. - `goToSpecificPeriod: (date: Temporal.PlainDate) => void` - - This function is a callback function that is called when a date is selected in the calendar. It receives the selected date as an argument. +This function navigates to a specific period based on the provided date. - `days: Day[]` - - This value represents an array of days in the current period displayed by the calendar. +This value represents an array of days in the current period displayed by the calendar. - `daysNames: string[]` - - This value represents an array of strings that contain the names of the days of the week. -- `viewMode: 'month' | 'week' | number` - - This value represents the current view mode of the calendar. -- `changeViewMode: (newViewMode: 'month' | 'week' | number) => void` - - This function is used to change the view mode of the calendar. +This value represents an array of strings that contain the names of the days of the week. +- `viewMode: CalendarStore['viewMode']` +This value represents the current view mode of the calendar. +- `changeViewMode: (newViewMode: CalendarStore['viewMode']) => void` +This function is used to change the view mode of the calendar. - `getEventProps: (id: string) => { style: CSSProperties } | null` - - This function is used to retrieve the style properties for a specific event based on its ID. -- `getEventProps: (id: string) => { style: CSSProperties } | null` - - This function is used to retrieve the style properties for a specific event based on its ID. -- `getEventProps: (id: string) => { style: CSSProperties } | null` - - This function is used to retrieve the style properties for a specific event based on its ID. -- `getCurrentTimeMarkerProps: () => { style: CSSProperties, currentTime: Temporal.PlainTime }` - - This function is used to retrieve the style properties and current time for the current time marker. +This function is used to retrieve the style properties for a specific event based on its ID. +- `getCurrentTimeMarkerProps: () => { style: CSSProperties, currentTime: string | undefined }` +This function is used to retrieve the style properties and current time for the current time marker. - `isPending: boolean` - - This value represents whether the calendar is in a pending state. -- `groupDaysBy: ({ days: Day[], unit: 'week' | 'month', fillMissingDays?: boolean }) => Day[][]` - - This function is used to group the days in the current period by a specified unit. The `fillMissingDays` parameter can be used to fill in missing days with previous or next month's days. +This value represents whether the calendar is in a pending state. +- `groupDaysBy: (props: Omit, 'weekStartsOn'>) => (Day | null)[][]` +This function is used to group the days in the current period by a specified unit. The fillMissingDays parameter can be used to fill in missing days with previous or next month's days. #### Example Usage diff --git a/docs/reference/calendar-core.md b/docs/reference/calendar-core.md index 22e4b524..8d758c55 100644 --- a/docs/reference/calendar-core.md +++ b/docs/reference/calendar-core.md @@ -17,39 +17,43 @@ The `CalendarCore` class provides a set of functionalities for managing calendar #### Parameters - `weekStartsOn?: number` - - An optional number that specifies the day of the week that the calendar should start on. It defaults to 1 (Monday). +An optional number that specifies the day of the week that the calendar should start on. It defaults to 1 (Monday). - `events?: TEvent[]` - - An optional array of events that the calendar should display. +An optional array of events that the calendar should display. - `viewMode: ViewMode` - - An object that specifies the initial view mode of the calendar. +An object that specifies the initial view mode of the calendar. - `locale?: Parameters['0']` - - An optional string that specifies the locale to use for formatting dates and times. +An optional string that specifies the locale to use for formatting dates and times. +- `timeZone?: Temporal.TimeZoneLike` +Optional time zone specification for the calendar. +- `calendar?: Temporal.CalendarLike` +Optional calendar system to be used. #### Returns - `getDaysWithEvents(): Array>` - - Returns an array of days in the current period with their associated events. +Returns an array of days in the current period with their associated events. - `getDaysNames(): string[]` - - Returns an array of strings representing the names of the days of the week based on the locale and week start day. -- `changeViewMode(newViewMode: ViewMode): void` - - Changes the view mode of the calendar. +Returns an array of strings representing the names of the days of the week based on the locale and week start day. +- `changeViewMode(newViewMode: CalendarStore['viewMode']): void` +Changes the view mode of the calendar. - `goToPreviousPeriod(): void` - - Navigates to the previous period based on the current view mode. +Navigates to the previous period based on the current view mode. - `goToNextPeriod(): void` - - Navigates to the next period based on the current view mode. +Navigates to the next period based on the current view mode. - `goToCurrentPeriod(): void` - - Navigates to the current period. +Navigates to the current period. - `goToSpecificPeriod(date: Temporal.PlainDate): void` - - Navigates to a specific period based on the provided date. +Navigates to a specific period based on the provided date. - `updateCurrentTime(): void` - - Updates the current time. +Updates the current time. - `getEventProps(id: Event['id']): { style: CSSProperties } | null` - - Retrieves the style properties for a specific event based on its ID. +Retrieves the style properties for a specific event based on its ID. - `getCurrentTimeMarkerProps(): { style: CSSProperties; currentTime: string | undefined }` - - Retrieves the style properties and current time for the current time marker. +Retrieves the style properties and current time for the current time marker. - `groupDaysBy(props: Omit, 'weekStartsOn'>): (Day | null)[][]` - - Groups the days in the current period by a specified unit. The fillMissingDays parameter can be used to fill in missing days with previous or next month's days. +Groups the days in the current period by a specified unit. The fillMissingDays parameter can be used to fill in missing days with previous or next month's days. #### Example Usage @@ -80,10 +84,11 @@ const events: MyEvent[] = [ ]; const calendarCore = new CalendarCore({ - weekStartsOn: 1, viewMode: { value: 1, unit: 'month' }, events, locale: 'en-US', + timeZone: 'America/New_York', + calendar: 'gregory', }); // Get days with events From 6627c0c1dfe67dce45714eb2e4ff2fd78f0dc2ed Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 26 Jun 2024 23:28:53 +0200 Subject: [PATCH 101/163] docs: calendar --- docs/framework/react/reference/useCalendar.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/framework/react/reference/useCalendar.md b/docs/framework/react/reference/useCalendar.md index 81ca29a3..42ad7fa5 100644 --- a/docs/framework/react/reference/useCalendar.md +++ b/docs/framework/react/reference/useCalendar.md @@ -82,10 +82,11 @@ const CalendarComponent = ({ events }) => { getCurrentTimeMarkerProps, groupDaysBy, } = useCalendar({ - weekStartsOn: 1, viewMode: { value: 1, unit: 'month' }, + events, locale: 'en-US', - onChangeViewMode: (newViewMode) => console.log('View mode changed:', newViewMode), + timeZone: 'America/New_York', + calendar: 'gregory', }); return ( From df925d41f7831503d2cbd1bed3f5ad675777bd9d Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 28 Jun 2024 21:03:29 +0200 Subject: [PATCH 102/163] refactor: zonedDateTime --- packages/time/src/calendar/getEventProps.ts | 28 ++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts index 023d59b9..8e949453 100644 --- a/packages/time/src/calendar/getEventProps.ts +++ b/packages/time/src/calendar/getEventProps.ts @@ -1,17 +1,17 @@ import { Temporal } from "@js-temporal/polyfill"; import type { Properties as CSSProperties } from "csstype"; -import type { CalendarState, Event } from "./types"; +import type { CalendarStore, Event } from "./types"; export const getEventProps = ( eventMap: Map, id: Event['id'], - state: CalendarState + state: CalendarStore, ): { style: CSSProperties } | null => { const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id); if (!event) return null; - const eventStartDate = Temporal.PlainDateTime.from(event.startDate); - const eventEndDate = Temporal.PlainDateTime.from(event.endDate); + const eventStartDate = Temporal.ZonedDateTime.from(event.startDate); + const eventEndDate = Temporal.ZonedDateTime.from(event.endDate); const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; let percentageOfDay; @@ -37,18 +37,18 @@ export const getEventProps = ( const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20); const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.PlainDateTime.from(e.startDate); - const eEndDate = Temporal.PlainDateTime.from(e.endDate); + const eStartDate = Temporal.ZonedDateTime.from(e.startDate); + const eEndDate = Temporal.ZonedDateTime.from(e.endDate); return ( (e.id !== id && - Temporal.PlainDateTime.compare(eventStartDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventStartDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eventEndDate, eStartDate) >= 0 && - Temporal.PlainDateTime.compare(eventEndDate, eEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eStartDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eStartDate, eventEndDate) <= 0) || - (Temporal.PlainDateTime.compare(eEndDate, eventStartDate) >= 0 && - Temporal.PlainDateTime.compare(eEndDate, eventEndDate) <= 0) + Temporal.ZonedDateTime.compare(eventStartDate, eStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eventStartDate, eEndDate) <= 0) || + (Temporal.ZonedDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.ZonedDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.ZonedDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eEndDate, eventEndDate) <= 0) ); }); From c65b760308a9cf0a401a65cab4292d6244e4d6c2 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 28 Jun 2024 21:21:53 +0200 Subject: [PATCH 103/163] refactor: rename startDate to start and endDate to end --- packages/time/src/calendar/getEventProps.ts | 8 ++++---- .../time/src/calendar/splitMultiDayEvents.ts | 6 +++--- packages/time/src/calendar/types.ts | 4 ++-- packages/time/src/core/calendar.ts | 16 ++++++++-------- packages/time/src/tests/calendar-core.test.ts | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts index 8e949453..cd6ce5e0 100644 --- a/packages/time/src/calendar/getEventProps.ts +++ b/packages/time/src/calendar/getEventProps.ts @@ -10,8 +10,8 @@ export const getEventProps = ( const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id); if (!event) return null; - const eventStartDate = Temporal.ZonedDateTime.from(event.startDate); - const eventEndDate = Temporal.ZonedDateTime.from(event.endDate); + const eventStartDate = Temporal.ZonedDateTime.from(event.start); + const eventEndDate = Temporal.ZonedDateTime.from(event.end); const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; let percentageOfDay; @@ -37,8 +37,8 @@ export const getEventProps = ( const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20); const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.ZonedDateTime.from(e.startDate); - const eEndDate = Temporal.ZonedDateTime.from(e.endDate); + const eStartDate = Temporal.ZonedDateTime.from(e.start); + const eEndDate = Temporal.ZonedDateTime.from(e.end); return ( (e.id !== id && Temporal.ZonedDateTime.compare(eventStartDate, eStartDate) >= 0 && diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 0d2088d5..4fb1560e 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -2,8 +2,8 @@ import { Temporal } from '@js-temporal/polyfill'; import type { Event } from './types'; export const splitMultiDayEvents = (event: TEvent, timeZone: Temporal.TimeZoneLike): TEvent[] => { - const startDate = event.startDate instanceof Temporal.PlainDateTime ? event.startDate.toZonedDateTime(timeZone) : event.startDate; - const endDate = event.endDate instanceof Temporal.PlainDateTime ? event.endDate.toZonedDateTime(timeZone) : event.endDate; + const startDate = event.start instanceof Temporal.PlainDateTime ? event.start.toZonedDateTime(timeZone) : event.start; + const endDate = event.end instanceof Temporal.PlainDateTime ? event.end.toZonedDateTime(timeZone) : event.end; const events: TEvent[] = []; let currentDay = startDate; @@ -14,7 +14,7 @@ export const splitMultiDayEvents = (event: TEvent, timeZon const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate : startOfCurrentDay; const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate : endOfCurrentDay; - events.push({ ...event, startDate: eventStart, endDate: eventEnd }); + events.push({ ...event, start: eventStart, end: eventEnd }); currentDay = startOfCurrentDay.add({ days: 1 }); } diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 08ffe7ef..4341d4ba 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -2,8 +2,8 @@ import type { Temporal } from "@js-temporal/polyfill" export interface Event { id: string; - startDate: Temporal.PlainDateTime | Temporal.ZonedDateTime; - endDate: Temporal.PlainDateTime | Temporal.ZonedDateTime; + start: Temporal.PlainDateTime | Temporal.ZonedDateTime; + end: Temporal.PlainDateTime | Temporal.ZonedDateTime; title: string; } diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 50fe6b83..2c21986c 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -189,27 +189,27 @@ export class CalendarCore const map = new Map() this.options.events?.forEach((event) => { const eventStartDate = - event.startDate instanceof Temporal.PlainDateTime - ? event.startDate.toZonedDateTime(this.options.timeZone) - : event.startDate + event.start instanceof Temporal.PlainDateTime + ? event.start.toZonedDateTime(this.options.timeZone) + : event.start const eventEndDate = - event.endDate instanceof Temporal.PlainDateTime - ? event.endDate.toZonedDateTime(this.options.timeZone) - : event.endDate + event.end instanceof Temporal.PlainDateTime + ? event.end.toZonedDateTime(this.options.timeZone) + : event.end if (Temporal.ZonedDateTime.compare(eventStartDate, eventEndDate) !== 0) { const splitEvents = splitMultiDayEvents( event, this.options.timeZone, ) splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.startDate.toString().split('T')[0] + const splitKey = splitEvent.start.toString().split('T')[0] if (splitKey) { if (!map.has(splitKey)) map.set(splitKey, []) map.get(splitKey)?.push(splitEvent) } }) } else { - const eventKey = event.startDate.toString().split('T')[0] + const eventKey = event.start.toString().split('T')[0] if (eventKey) { if (!map.has(eventKey)) map.set(eventKey, []) map.get(eventKey)?.push(event) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 22f66974..82d896f2 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -16,14 +16,14 @@ describe('CalendarCore', () => { events: [ { id: '1', - startDate: Temporal.PlainDateTime.from('2023-06-10T09:00'), - endDate: Temporal.PlainDateTime.from('2023-06-10T10:00'), + start: Temporal.PlainDateTime.from('2023-06-10T09:00'), + end: Temporal.PlainDateTime.from('2023-06-10T10:00'), title: 'Event 1', }, { id: '2', - startDate: Temporal.PlainDateTime.from('2023-06-12T11:00'), - endDate: Temporal.PlainDateTime.from('2023-06-12T12:00'), + start: Temporal.PlainDateTime.from('2023-06-12T11:00'), + end: Temporal.PlainDateTime.from('2023-06-12T12:00'), title: 'Event 2', }, ], From 18ad00c36066c1847c8dd7ac6a7a8458be2dacb1 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 28 Jun 2024 21:59:30 +0200 Subject: [PATCH 104/163] refactor: remove the getCurrentTimeMarkerProps method --- .../react-time/src/tests/useCalendar.test.tsx | 96 ++----------------- .../react-time/src/useCalendar/useCalendar.ts | 26 +---- packages/time/src/calendar/types.ts | 1 - packages/time/src/core/calendar.ts | 36 ------- packages/time/src/tests/calendar-core.test.ts | 41 -------- 5 files changed, 11 insertions(+), 189 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index ba20a201..2159dd8b 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,20 +1,20 @@ import { Temporal } from '@js-temporal/polyfill' -import { describe, expect, test, vi } from 'vitest' -import { act, renderHook, waitFor } from '@testing-library/react' +import { describe, expect, test } from 'vitest' +import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' describe('useCalendar', () => { const events = [ { id: '1', - startDate: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), - endDate: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), + start: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), + end: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), title: 'Event 1', }, { id: '2', - startDate: Temporal.PlainDateTime.from('2024-06-02T14:00:00'), - endDate: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), + start: Temporal.PlainDateTime.from('2024-06-02T14:00:00'), + end: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), title: 'Event 2', }, ] @@ -108,14 +108,14 @@ describe('useCalendar', () => { const overlappingEvents = [ { id: '1', - startDate: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), - endDate: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), + start: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), + end: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), title: 'Event 1', }, { id: '2', - startDate: Temporal.PlainDateTime.from('2024-06-01T11:00:00'), - endDate: Temporal.PlainDateTime.from('2024-06-01T13:00:00'), + start: Temporal.PlainDateTime.from('2024-06-01T11:00:00'), + end: Temporal.PlainDateTime.from('2024-06-01T13:00:00'), title: 'Event 2', }, ] @@ -149,82 +149,6 @@ describe('useCalendar', () => { }) }) - test('should return the correct props for the current time marker', () => { - vi.useFakeTimers(); - vi.setSystemTime(new Date('2024-06-01T11:00:00')); - const { result } = renderHook(() => - useCalendar({ viewMode: { value: 1, unit: 'week' } }), - ); - - const getCurrentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); - - expect(getCurrentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.83333333333333%', - left: 0, - }, - currentTime: '11:00', - }); - }); - - test('should update the current time marker props after time passes', () => { - vi.useFakeTimers(); - vi.setSystemTime(new Date('2024-06-01T11:00:00')); - const { result } = renderHook(() => - useCalendar({ viewMode: { value: 1, unit: 'week' } }), - ); - - const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.83333333333333%', - left: 0, - }, - currentTime: '11:00', - }); - - act(() => { - vi.advanceTimersByTime(60000); - }); - - waitFor(() => { - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', - }); - }); - }); - - test('should update the current time marker props after time passes when the next minute is in less than a minute', () => { - vi.useFakeTimers(); - vi.setSystemTime(new Date('2024-06-01T11:00:55')); - - const { result } = renderHook(() => useCalendar({ viewMode: { value: 1, unit: 'week' } })); - const currentTimeMarkerProps = result.current.getCurrentTimeMarkerProps(); - - act(() => { - vi.advanceTimersByTime(5000); - }) - - waitFor(() => { - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.90277777777778%', - left: 0, - }, - currentTime: '11:01', - }); - }) - }); - test('should render array of days', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }), diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 84a236c5..8dd5ea7e 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,8 +1,6 @@ -import { useCallback, useRef, useState, useTransition } from 'react' +import { useCallback, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' -import { Temporal } from '@js-temporal/polyfill' import { CalendarCore, type Event } from '@tanstack/time' -import { useIsomorphicLayoutEffect } from '../utils' import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' export const useCalendar = ( @@ -11,25 +9,6 @@ export const useCalendar = ( const [calendarCore] = useState(() => new CalendarCore(options)) const state = useStore(calendarCore.store) const [isPending, startTransition] = useTransition() - const currentTimeInterval = useRef() - - const updateCurrentTime = useCallback(() => { - calendarCore.updateCurrentTime() - }, [calendarCore]) - - useIsomorphicLayoutEffect(() => { - if (currentTimeInterval.current) clearTimeout(currentTimeInterval.current) - - const now = Temporal.Now.plainDateTimeISO() - const msToNextMinute = (60 - now.second) * 1000 - now.millisecond - - currentTimeInterval.current = setTimeout(() => { - updateCurrentTime() - currentTimeInterval.current = setInterval(updateCurrentTime, 60000) - }, msToNextMinute) - - return () => clearTimeout(currentTimeInterval.current) - }, [calendarCore, updateCurrentTime]) const goToPreviousPeriod = useCallback(() => { startTransition(() => { @@ -63,8 +42,6 @@ export const useCalendar = ( const getEventProps = useCallback((id) => calendarCore.getEventProps(id), [calendarCore]) - const getCurrentTimeMarkerProps = useCallback(() => calendarCore.getCurrentTimeMarkerProps(), [calendarCore]) - const groupDaysBy = useCallback((props) => calendarCore.groupDaysBy(props), [calendarCore]) return { @@ -77,7 +54,6 @@ export const useCalendar = ( goToSpecificPeriod, changeViewMode, getEventProps, - getCurrentTimeMarkerProps, isPending, groupDaysBy, } diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 4341d4ba..4b637de1 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -13,7 +13,6 @@ export interface CalendarStore { value: number unit: 'month' | 'week' | 'day' } - currentTime: Temporal.PlainDateTime } export type Day = { diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 2c21986c..eb3ca01a 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -61,11 +61,6 @@ interface CalendarActions { changeViewMode: (newViewMode: CalendarStore['viewMode']) => void /** Retrieves styling properties for a specific event, identified by ID. */ getEventProps: (id: Event['id']) => { style: CSSProperties } | null - /** Provides properties for the marker indicating the current time. */ - getCurrentTimeMarkerProps: () => { - style: CSSProperties - currentTime: string | undefined - } /** Groups days by a specified unit. */ groupDaysBy: ( props: Omit, 'weekStartsOn'>, @@ -77,8 +72,6 @@ interface CalendarState { currentPeriod: CalendarStore['currentPeriod'] /** The current view mode of the calendar. */ viewMode: CalendarStore['viewMode'] - /** The current date and time according to the calendar's time zone. */ - currentTime: CalendarStore['currentTime'] /** An array of days, each potentially containing events. */ days: Array> /** An array of names for the days of the week, localized to the calendar's locale. */ @@ -115,7 +108,6 @@ export class CalendarCore this.options.calendar, ), viewMode: options.viewMode, - currentTime: Temporal.Now.plainDateTimeISO(this.options.timeZone), }) } @@ -350,38 +342,10 @@ export class CalendarCore })) } - updateCurrentTime() { - this.store.setState((prev) => ({ - ...prev, - currentTime: Temporal.Now.plainDateTimeISO(), - })) - } - getEventProps(id: Event['id']) { return getEventProps(this.getEventMap(), id, this.store.state) } - getCurrentTimeMarkerProps(): { - style: CSSProperties - currentTime: string | undefined - } { - const { hour, minute } = this.store.state.currentTime - const currentTimeInMinutes = hour * 60 + minute - const percentageOfDay = (currentTimeInMinutes / (24 * 60)) * 100 - - return { - style: { - position: 'absolute', - top: `${percentageOfDay}%`, - left: 0, - }, - currentTime: this.store.state.currentTime - .toString() - .split('T')[1] - ?.substring(0, 5), - } - } - groupDaysBy({ days, unit, diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 82d896f2..c12f74b2 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -87,47 +87,6 @@ describe('CalendarCore', () => { expect(calendarCore.store.state.currentPeriod).toEqual(specificDate); }); - test('should update current time correctly', () => { - const initialTime = calendarCore.store.state.currentTime; - const newMockDateTime = initialTime.add({ minutes: 1 }); - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); - - calendarCore.updateCurrentTime(); - const updatedTime = calendarCore.store.state.currentTime; - expect(updatedTime).toEqual(newMockDateTime); - }); - - test('should return the correct props for the current time marker', () => { - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(Temporal.PlainDateTime.from('2024-06-01T11:00:00')); - - const coreOptions: CalendarCoreOptions = { - viewMode: { value: 1, unit: 'week' }, - events: [], - timeZone: mockTimeZone, - }; - calendarCore = new CalendarCore(coreOptions); - - const currentTimeMarkerProps = calendarCore.getCurrentTimeMarkerProps(); - - expect(currentTimeMarkerProps).toEqual({ - style: { - position: 'absolute', - top: '45.83333333333333%', - left: 0, - }, - currentTime: '11:00', - }); - }); - - test('should update the current time', () => { - const initialTime = calendarCore.store.state.currentTime; - const newMockDateTime = initialTime.add({ minutes: 1 }); - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(newMockDateTime); - - calendarCore.updateCurrentTime(); - expect(calendarCore.store.state.currentTime).toEqual(newMockDateTime); - }); - test('should group days correctly', () => { const daysWithEvents = calendarCore.getDaysWithEvents(); const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month' }); From 403df9927f46fbc767d1e4bbfb18407dcf0d2ff0 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 20:34:15 +0200 Subject: [PATCH 105/163] refactor: weekInfoPolyfill --- packages/time/src/core/weekInfoPolyfill.ts | 1864 ----------------- .../time/src/core/weekInfoPolyfill/index.ts | 1 + .../src/core/weekInfoPolyfill/weekInfoData.ts | 1832 ++++++++++++++++ .../core/weekInfoPolyfill/weekInfoPolyfill.ts | 41 + packages/time/src/utils/getFirstDayOfWeek.ts | 2 +- 5 files changed, 1875 insertions(+), 1865 deletions(-) delete mode 100644 packages/time/src/core/weekInfoPolyfill.ts create mode 100644 packages/time/src/core/weekInfoPolyfill/index.ts create mode 100644 packages/time/src/core/weekInfoPolyfill/weekInfoData.ts create mode 100644 packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts diff --git a/packages/time/src/core/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill.ts deleted file mode 100644 index 28c73511..00000000 --- a/packages/time/src/core/weekInfoPolyfill.ts +++ /dev/null @@ -1,1864 +0,0 @@ -interface WeekInfo { - firstDay: number - weekend: number[] - minimalDays: number -} - -// eslint-disable-next-line @typescript-eslint/no-namespace -declare namespace Intl { - interface Locale { - getWeekInfo: () => WeekInfo - weekInfo?: WeekInfo - } -} - -;(function () { - if (typeof (Intl as any).Locale.prototype.getWeekInfo !== 'function') { - ;(Intl as any).Locale.prototype.getWeekInfo = function () { - const locale = this.toString().toLowerCase() - const weekInfo: Record = { - af: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ak: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - am: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - as: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - asa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - az: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - be: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bem: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bez: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - my: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ca: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tzm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - chr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cgg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zh: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - da: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ebu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - et: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ee: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fil: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ff: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ka: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - el: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - guz: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ha: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - haw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - he: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - is: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ig: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - id: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ga: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - it: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ja: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kea: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kab: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kln: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kam: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - km: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ki: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kok: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ko: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - khq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ses: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lag: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - jmc: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kde: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ms: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ml: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mas: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mer: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mfe: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - naq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ne: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nd: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nb: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nyn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - or: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - om: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ps: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ro: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rof: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ru: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rwk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - saq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - seh: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ii: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - si: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - xog: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - so: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - es: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gsw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - shi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - dav: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ta: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - te: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - teo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - th: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ti: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - to: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ur: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uz: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - vi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - vun: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - yo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'af-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'am-ET': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-AE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-BH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-DZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-EG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-IQ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-JO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-KW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-LB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-LY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-MA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'arn-CL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-OM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-QA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SD': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-TN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-YE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'as-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-az': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-Cyrl-AZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-Latn-AZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ba-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'be-BY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bg-BG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bn-BD': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bn-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bo-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'br-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bs-Cyrl-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bs-Latn-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ca-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'co-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'cs-CZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'cy-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'da-DK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-AT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-LI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'dsb-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'dv-MV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'el-CY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'el-GR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-029': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-AU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-BZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-cb': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-IE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-JM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-MT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-MY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-NZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-PH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-SG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-TT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-US': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-ZW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-AR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-BO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-DO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-EC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-GT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-HN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-MX': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-NI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-SV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-US': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-UY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-VE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'et-EE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'eu-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fa-IR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fi-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fil-PH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fo-FO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-BE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-MC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fy-NL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ga-IE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gd-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gd-ie': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gl-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gsw-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gu-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ha-Latn-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'he-IL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hi-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hr-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hr-HR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hsb-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hu-HU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hy-AM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'id-ID': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ig-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ii-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'in-ID': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'is-IS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'it-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'it-IT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iu-Cans-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iu-Latn-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iw-IL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ja-JP': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ka-GE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kk-KZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kl-GL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'km-KH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kn-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kok-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ko-KR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ky-KG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lb-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lo-LA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lt-LT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lv-LV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mi-NZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mk-MK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ml-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mn-MN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mn-Mong-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'moh-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mr-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ms-BN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ms-MY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mt-MT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nb-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ne-NP': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nl-BE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nl-NL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nn-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'no-no': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nso-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'oc-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'or-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pa-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pl-PL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'prs-AF': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ps-AF': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pt-BR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pt-PT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'qut-GT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-BO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-EC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-PE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'rm-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ro-mo': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ro-RO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ru-mo': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ru-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'rw-RW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sah-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sa-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'si-LK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sk-SK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sl-SI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sma-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sma-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smj-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smj-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smn-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sms-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sq-AL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-sp': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sv-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sv-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sw-KE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'syr-SY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ta-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'te-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tg-Cyrl-TJ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'th-TH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tk-TM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tlh-QS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tn-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tr-TR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tt-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tzm-Latn-DZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ug-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uk-UA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ur-PK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-Cyrl-UZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-Latn-UZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-uz': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'vi-VN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'wo-SN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'xh-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'yo-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-HK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-MO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-SG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-TW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zu-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - } - - const match = - weekInfo[locale] || - weekInfo[locale.split('-')[0]] || - weekInfo['default'] - - return { - firstDay: match?.firstDay, - weekend: match?.weekend, - minimalDays: match?.minimalDays, - } - } - } -})() diff --git a/packages/time/src/core/weekInfoPolyfill/index.ts b/packages/time/src/core/weekInfoPolyfill/index.ts new file mode 100644 index 00000000..92eafb31 --- /dev/null +++ b/packages/time/src/core/weekInfoPolyfill/index.ts @@ -0,0 +1 @@ +import './weekInfoPolyfill' diff --git a/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts b/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts new file mode 100644 index 00000000..26c82058 --- /dev/null +++ b/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts @@ -0,0 +1,1832 @@ +export const weekInfoData: Record = { + af: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ak: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + am: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ar: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + as: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + asa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + az: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + eu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + be: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bem: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bez: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bs: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + my: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ca: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tzm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + chr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cgg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zh: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cs: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + da: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ebu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + en: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + eo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + et: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ee: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fil: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ff: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ka: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + de: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + el: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + guz: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ha: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + haw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + he: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + hu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + is: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ig: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + id: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ga: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + it: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ja: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kea: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kab: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kln: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kam: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + km: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ki: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kok: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ko: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + khq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ses: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lag: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + lt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + luy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + jmc: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + kde: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ms: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ml: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mas: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mer: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + mfe: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + naq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ne: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nd: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nb: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + nyn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + or: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + om: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ps: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + fa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pt: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + pa: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ro: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rm: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rof: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ru: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + rwk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + saq: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sg: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + seh: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sn: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ii: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + si: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sl: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + xog: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + so: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + es: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + sv: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + gsw: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + shi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + dav: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ta: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + te: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + teo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + th: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + bo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ti: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + to: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + tr: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uk: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + ur: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + uz: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vi: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + vun: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + cy: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + yo: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + zu: { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'af-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'am-ET': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-AE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-BH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-DZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-EG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-IQ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-JO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-KW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-LB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-LY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-MA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'arn-CL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-OM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-QA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SD': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-SY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-TN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ar-YE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'as-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-az': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-Cyrl-AZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'az-Latn-AZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ba-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'be-BY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bg-BG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bn-BD': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bn-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bo-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'br-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bs-Cyrl-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'bs-Latn-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ca-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'co-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'cs-CZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'cy-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'da-DK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-AT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-LI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'de-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'dsb-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'dv-MV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'el-CY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'el-GR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-029': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-AU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-BZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-cb': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-IE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-JM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-MT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-MY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-NZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-PH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-SG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-TT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-US': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'en-ZW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-AR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-BO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-CR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-DO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-EC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-GT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-HN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-MX': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-NI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-PY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-SV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-US': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-UY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'es-VE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'et-EE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'eu-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fa-IR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fi-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fil-PH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fo-FO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-BE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fr-MC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'fy-NL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ga-IE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gd-GB': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gd-ie': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gl-ES': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gsw-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'gu-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ha-Latn-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'he-IL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hi-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hr-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hr-HR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hsb-DE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hu-HU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'hy-AM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'id-ID': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ig-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ii-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'in-ID': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'is-IS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'it-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'it-IT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iu-Cans-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iu-Latn-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'iw-IL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ja-JP': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ka-GE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kk-KZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kl-GL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'km-KH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kn-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'kok-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ko-KR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ky-KG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lb-LU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lo-LA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lt-LT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'lv-LV': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mi-NZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mk-MK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ml-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mn-MN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mn-Mong-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'moh-CA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mr-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ms-BN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ms-MY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'mt-MT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nb-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ne-NP': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nl-BE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nl-NL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nn-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'no-no': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'nso-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'oc-FR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'or-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pa-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pl-PL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'prs-AF': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ps-AF': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pt-BR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'pt-PT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'qut-GT': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-BO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-EC': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'quz-PE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'rm-CH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ro-mo': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ro-RO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ru-mo': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ru-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'rw-RW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sah-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sa-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'se-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'si-LK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sk-SK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sl-SI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sma-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sma-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smj-NO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smj-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'smn-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sms-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sq-AL': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Cyrl-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-BA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-CS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-Latn-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-ME': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-RS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sr-sp': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sv-FI': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sv-SE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'sw-KE': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'syr-SY': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ta-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'te-IN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tg-Cyrl-TJ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'th-TH': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tk-TM': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tlh-QS': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tn-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tr-TR': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tt-RU': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'tzm-Latn-DZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ug-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uk-UA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'ur-PK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-Cyrl-UZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-Latn-UZ': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'uz-uz': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'vi-VN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'wo-SN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'xh-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'yo-NG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-CN': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-HK': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-MO': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-SG': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zh-TW': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, + 'zu-ZA': { + firstDay: 1, + weekend: [6, 7], + minimalDays: 4, + }, +} \ No newline at end of file diff --git a/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts new file mode 100644 index 00000000..a722d0ad --- /dev/null +++ b/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts @@ -0,0 +1,41 @@ +interface WeekInfo { + firstDay: number + weekend: number[] + minimalDays: number +} + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Intl { + interface Locale { + getWeekInfo: () => WeekInfo + weekInfo?: WeekInfo + } +} + +;(function () { + // Chrome & Safari + if ('weekInfo' in Intl.Locale.prototype && typeof Intl.Locale.prototype.getWeekInfo !== 'function') { + Intl.Locale.prototype.getWeekInfo = function () { + return this.weekInfo + } + } + // Firefox + if (typeof Intl.Locale.prototype.getWeekInfo !== 'function') { + import('./weekInfoData').then(({ weekInfoData }) => { + Intl.Locale.prototype.getWeekInfo = function () { + const locale = this.toString().toLowerCase() + + const match = + weekInfoData[locale] || + weekInfoData[locale.split('-')[0]] || + weekInfoData['default'] + + return { + firstDay: match?.firstDay, + weekend: match?.weekend, + minimalDays: match?.minimalDays, + } + } + }) + } +})() diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts index 65f71e39..31224f1a 100644 --- a/packages/time/src/utils/getFirstDayOfWeek.ts +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -3,6 +3,6 @@ import { Temporal } from '@js-temporal/polyfill' export const getFirstDayOfWeek = (currWeek: string, locale: Intl.UnicodeBCP47LocaleIdentifier | Intl.Locale = 'en-US') => { const date = Temporal.PlainDate.from(currWeek); const loc = new Intl.Locale(locale); - const { firstDay } = loc.weekInfo || loc.getWeekInfo(); + const { firstDay } = loc.getWeekInfo(); return date.subtract({ days: (date.dayOfWeek - firstDay + 7) % 7 }); } From a80513107489553e5217285c50e42b806f014f10 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 21:13:33 +0200 Subject: [PATCH 106/163] refactor: add a resources field to event --- packages/time/src/calendar/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 4b637de1..f18e4fbf 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -1,10 +1,11 @@ import type { Temporal } from "@js-temporal/polyfill" -export interface Event { +export interface Event { id: string; start: Temporal.PlainDateTime | Temporal.ZonedDateTime; end: Temporal.PlainDateTime | Temporal.ZonedDateTime; title: string; + resources?: TResource[]; } export interface CalendarStore { From e17f0cd684a8f5d12157fab9a00ace05181873ba Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 21:19:28 +0200 Subject: [PATCH 107/163] refactor: add a resources field to event --- packages/time/src/core/calendar.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index eb3ca01a..6cf341f0 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -30,7 +30,7 @@ export interface ViewMode { * of events, locale, time zone, and the calendar system. * @template TEvent - Specifies the event type, extending a base Event type. */ -export interface CalendarCoreOptions { +export interface CalendarCoreOptions> { /** An optional array of events to be handled by the calendar. */ events?: TEvent[] | null /** The initial view mode configuration of the calendar. */ @@ -41,6 +41,8 @@ export interface CalendarCoreOptions { timeZone?: Temporal.TimeZoneLike /** Optional calendar system to be used. */ calendar?: Temporal.CalendarLike + /** Optional resources to be used in the calendar. */ + resources?: TResource[] } /** From 396d6291de0594c13e2b9473680b53ccef4473a9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 22:19:52 +0200 Subject: [PATCH 108/163] refactor: add a resources field to event --- packages/time/src/calendar/groupDaysBy.ts | 109 +++++++++++------- .../time/src/calendar/splitMultiDayEvents.ts | 58 +++++++--- packages/time/src/calendar/types.ts | 23 ++-- packages/time/src/core/calendar.ts | 39 ++++--- packages/time/src/tests/calendar-core.test.ts | 4 +- 5 files changed, 146 insertions(+), 87 deletions(-) diff --git a/packages/time/src/calendar/groupDaysBy.ts b/packages/time/src/calendar/groupDaysBy.ts index 8b19e983..dbd3af65 100644 --- a/packages/time/src/calendar/groupDaysBy.ts +++ b/packages/time/src/calendar/groupDaysBy.ts @@ -1,55 +1,78 @@ -import { Temporal } from "@js-temporal/polyfill"; -import type { Day, Event } from "./types"; +import { Temporal } from '@js-temporal/polyfill' +import type { Day, Event, Resource } from './types' -interface GroupDaysByBaseProps { - days: (Day | null)[]; - weekStartsOn: number; +interface GroupDaysByBaseProps< + TResource extends Resource, + TEvent extends Event = Event, +> { + days: (Day | null)[] + weekStartsOn: number } -type GroupDaysByMonthProps = GroupDaysByBaseProps & { - unit: 'month'; - fillMissingDays?: never; -}; +type GroupDaysByMonthProps< + TResource extends Resource, + TEvent extends Event = Event, +> = GroupDaysByBaseProps & { + unit: 'month' + fillMissingDays?: never +} -type GroupDaysByWeekProps = GroupDaysByBaseProps & { - unit: 'week'; - fillMissingDays?: boolean; -}; +type GroupDaysByWeekProps< + TResource extends Resource, + TEvent extends Event = Event, +> = GroupDaysByBaseProps & { + unit: 'week' + fillMissingDays?: boolean +} -export type GroupDaysByProps = GroupDaysByMonthProps | GroupDaysByWeekProps; +export type GroupDaysByProps< + TResource extends Resource, + TEvent extends Event = Event, +> = + | GroupDaysByMonthProps + | GroupDaysByWeekProps -export const groupDaysBy = ({ +export const groupDaysBy = < + TResource extends Resource, + TEvent extends Event = Event, +>({ days, unit, fillMissingDays = true, weekStartsOn, -}: GroupDaysByProps): (Day | null)[][] => { - const groups: (Day | null)[][] = []; +}: GroupDaysByProps): (Day< + TResource, + TEvent +> | null)[][] => { + const groups: (Day | null)[][] = [] switch (unit) { case 'month': { - let currentMonth: (Day | null)[] = []; + let currentMonth: (Day | null)[] = [] days.forEach((day) => { - if (currentMonth.length > 0 && day?.date.month !== currentMonth[0]?.date.month) { - groups.push(currentMonth); - currentMonth = []; + if ( + currentMonth.length > 0 && + day?.date.month !== currentMonth[0]?.date.month + ) { + groups.push(currentMonth) + currentMonth = [] } - currentMonth.push(day); - }); + currentMonth.push(day) + }) if (currentMonth.length > 0) { - groups.push(currentMonth); + groups.push(currentMonth) } - break; + break } case 'week': { - const weeks: (Day | null)[][] = []; - let currentWeek: (Day | null)[] = []; + const weeks: (Day | null)[][] = [] + let currentWeek: (Day | null)[] = [] days.forEach((day) => { if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 for (let i = 0; i < dayOfWeek; i++) { currentWeek.push( fillMissingDays @@ -59,21 +82,23 @@ export const groupDaysBy = ({ isToday: false, isInCurrentPeriod: false, } - : null - ); + : null, + ) } } } - currentWeek.push(day); + currentWeek.push(day) if (currentWeek.length === 7) { - weeks.push(currentWeek); - currentWeek = []; + weeks.push(currentWeek) + currentWeek = [] } - }); + }) if (currentWeek.length > 0) { while (currentWeek.length < 7) { - const lastDate = currentWeek[currentWeek.length - 1]?.date ?? Temporal.PlainDate.from('2024-01-01'); + const lastDate = + currentWeek[currentWeek.length - 1]?.date ?? + Temporal.PlainDate.from('2024-01-01') currentWeek.push( fillMissingDays ? { @@ -82,16 +107,16 @@ export const groupDaysBy = ({ isToday: false, isInCurrentPeriod: false, } - : null - ); + : null, + ) } - weeks.push(currentWeek); + weeks.push(currentWeek) } - return weeks; + return weeks } default: - break; + break } - return groups; -}; + return groups +} diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 4fb1560e..4117784d 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -1,23 +1,51 @@ -import { Temporal } from '@js-temporal/polyfill'; -import type { Event } from './types'; +import { Temporal } from '@js-temporal/polyfill' +import type { Event } from './types' -export const splitMultiDayEvents = (event: TEvent, timeZone: Temporal.TimeZoneLike): TEvent[] => { - const startDate = event.start instanceof Temporal.PlainDateTime ? event.start.toZonedDateTime(timeZone) : event.start; - const endDate = event.end instanceof Temporal.PlainDateTime ? event.end.toZonedDateTime(timeZone) : event.end; - const events: TEvent[] = []; +export const splitMultiDayEvents = < + TResource extends string | null = null, + TEvent extends Event = Event, +>( + event: TEvent, + timeZone: Temporal.TimeZoneLike, +): TEvent[] => { + const startDate = + event.start instanceof Temporal.PlainDateTime + ? event.start.toZonedDateTime(timeZone) + : event.start + const endDate = + event.end instanceof Temporal.PlainDateTime + ? event.end.toZonedDateTime(timeZone) + : event.end + const events: TEvent[] = [] - let currentDay = startDate; + let currentDay = startDate while (Temporal.ZonedDateTime.compare(currentDay, endDate) < 0) { - const startOfCurrentDay = currentDay.with({ hour: 0, minute: 0, second: 0, millisecond: 0 }); - const endOfCurrentDay = currentDay.with({ hour: 23, minute: 59, second: 59, millisecond: 999 }); + const startOfCurrentDay = currentDay.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }) + const endOfCurrentDay = currentDay.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }) - const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate : startOfCurrentDay; - const eventEnd = Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 ? endDate : endOfCurrentDay; + const eventStart = + Temporal.PlainDateTime.compare(currentDay, startDate) === 0 + ? startDate + : startOfCurrentDay + const eventEnd = + Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 + ? endDate + : endOfCurrentDay - events.push({ ...event, start: eventStart, end: eventEnd }); + events.push({ ...event, start: eventStart, end: eventEnd }) - currentDay = startOfCurrentDay.add({ days: 1 }); + currentDay = startOfCurrentDay.add({ days: 1 }) } - return events; -}; + return events +} diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index f18e4fbf..31572271 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -1,11 +1,13 @@ -import type { Temporal } from "@js-temporal/polyfill" +import type { Temporal } from '@js-temporal/polyfill' -export interface Event { - id: string; - start: Temporal.PlainDateTime | Temporal.ZonedDateTime; - end: Temporal.PlainDateTime | Temporal.ZonedDateTime; - title: string; - resources?: TResource[]; +export type Resource = string | null + +export interface Event { + id: string + start: Temporal.PlainDateTime | Temporal.ZonedDateTime + end: Temporal.PlainDateTime | Temporal.ZonedDateTime + title: string + resources?: TResource[] } export interface CalendarStore { @@ -16,9 +18,12 @@ export interface CalendarStore { } } -export type Day = { +export type Day< + TResource extends string | null = null, + TEvent extends Event = Event, +> = { date: Temporal.PlainDate events: TEvent[] isToday: boolean isInCurrentPeriod: boolean -} \ No newline at end of file +} diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 6cf341f0..38a98fd8 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -8,7 +8,7 @@ import { groupDaysBy } from '../calendar/groupDaysBy' import { getDateDefaults } from '../utils/dateDefaults' import type { Properties as CSSProperties } from 'csstype' import type { GroupDaysByProps } from '../calendar/groupDaysBy' -import type { CalendarStore, Day, Event } from '../calendar/types' +import type { CalendarStore, Day, Event, Resource } from '../calendar/types' import './weekInfoPolyfill' @@ -30,7 +30,7 @@ export interface ViewMode { * of events, locale, time zone, and the calendar system. * @template TEvent - Specifies the event type, extending a base Event type. */ -export interface CalendarCoreOptions> { +export interface CalendarCoreOptions> { /** An optional array of events to be handled by the calendar. */ events?: TEvent[] | null /** The initial view mode configuration of the calendar. */ @@ -42,7 +42,7 @@ export interface CalendarCoreOptions { +interface CalendarActions> { /** Navigates to the previous period according to the current view mode. */ goToPreviousPeriod: () => void /** Navigates to the next period according to the current view mode. */ @@ -65,37 +65,37 @@ interface CalendarActions { getEventProps: (id: Event['id']) => { style: CSSProperties } | null /** Groups days by a specified unit. */ groupDaysBy: ( - props: Omit, 'weekStartsOn'>, - ) => (Day | null)[][] + props: Omit, 'weekStartsOn'>, + ) => (Day | null)[][] } -interface CalendarState { +interface CalendarState> { /** The currently focused date period in the calendar. */ currentPeriod: CalendarStore['currentPeriod'] /** The current view mode of the calendar. */ viewMode: CalendarStore['viewMode'] /** An array of days, each potentially containing events. */ - days: Array> + days: Array> /** An array of names for the days of the week, localized to the calendar's locale. */ daysNames: string[] } -export interface CalendarApi - extends CalendarActions, - CalendarState {} +export interface CalendarApi> + extends CalendarActions, + CalendarState {} /** * Core functionality for a calendar system, managing the state and operations of the calendar, * such as navigating through time periods, handling events, and adjusting settings. * @template TEvent - The type of events managed by the calendar. */ -export class CalendarCore - implements CalendarActions +export class CalendarCore> + implements CalendarActions { store: Store - options: Required> + options: Required> - constructor(options: CalendarCoreOptions) { + constructor(options: CalendarCoreOptions) { const defaults = getDateDefaults() this.options = { ...options, @@ -103,6 +103,7 @@ export class CalendarCore timeZone: options.timeZone || defaults.timeZone, calendar: options.calendar || defaults.calendar, events: options.events || null, + resources: options.resources || null, } this.store = new Store({ @@ -191,7 +192,7 @@ export class CalendarCore ? event.end.toZonedDateTime(this.options.timeZone) : event.end if (Temporal.ZonedDateTime.compare(eventStartDate, eventEndDate) !== 0) { - const splitEvents = splitMultiDayEvents( + const splitEvents = splitMultiDayEvents( event, this.options.timeZone, ) @@ -352,12 +353,12 @@ export class CalendarCore days, unit, fillMissingDays = true, - }: Omit, 'weekStartsOn'>) { - return groupDaysBy({ + }: Omit, 'weekStartsOn'>) { + return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.getFirstDayOfWeek().dayOfWeek, - } as GroupDaysByProps) + } as GroupDaysByProps) } } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index c12f74b2..91906702 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -4,8 +4,8 @@ import { CalendarCore } from '../core/calendar'; import type { CalendarCoreOptions, Event } from '../core/calendar'; describe('CalendarCore', () => { - let options: CalendarCoreOptions; - let calendarCore: CalendarCore; + let options: CalendarCoreOptions>; + let calendarCore: CalendarCore>; const mockDate = Temporal.PlainDate.from('2023-06-15'); const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00'); const mockTimeZone = 'America/New_York'; From adc999877927832c258b0311666369ad0f008069 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 22:43:55 +0200 Subject: [PATCH 109/163] refactor: add startOf and endOf helpers --- .../time/src/calendar/splitMultiDayEvents.ts | 22 +++++-------------- packages/time/src/utils/endOf.ts | 15 +++++++++++++ packages/time/src/utils/index.ts | 8 ++++--- packages/time/src/utils/startOf.ts | 17 ++++++++++++++ 4 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 packages/time/src/utils/endOf.ts create mode 100644 packages/time/src/utils/startOf.ts diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 4117784d..41a84303 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -1,4 +1,5 @@ import { Temporal } from '@js-temporal/polyfill' +import { endOf, startOf } from '../utils' import type { Event } from './types' export const splitMultiDayEvents = < @@ -20,31 +21,18 @@ export const splitMultiDayEvents = < let currentDay = startDate while (Temporal.ZonedDateTime.compare(currentDay, endDate) < 0) { - const startOfCurrentDay = currentDay.with({ - hour: 0, - minute: 0, - second: 0, - millisecond: 0, - }) - const endOfCurrentDay = currentDay.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }) - const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate - : startOfCurrentDay + : startOf(currentDay) const eventEnd = - Temporal.PlainDateTime.compare(endDate, endOfCurrentDay) <= 0 + Temporal.PlainDateTime.compare(endDate, endOf(currentDay)) <= 0 ? endDate - : endOfCurrentDay + : endOf(currentDay) events.push({ ...event, start: eventStart, end: eventEnd }) - currentDay = startOfCurrentDay.add({ days: 1 }) + currentDay = startOf(currentDay).add({ days: 1 }) } return events diff --git a/packages/time/src/utils/endOf.ts b/packages/time/src/utils/endOf.ts new file mode 100644 index 00000000..4742df98 --- /dev/null +++ b/packages/time/src/utils/endOf.ts @@ -0,0 +1,15 @@ +import type { Temporal } from '@js-temporal/polyfill' + +/** + * Helper function to get the end of a given day. + * @param date - The date for which the end of the day is needed. + * @returns The end of the given day. + */ +export const endOf = (date: Temporal.ZonedDateTime): Temporal.ZonedDateTime => { + return date.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }) +} diff --git a/packages/time/src/utils/index.ts b/packages/time/src/utils/index.ts index 293009a0..a744ffac 100644 --- a/packages/time/src/utils/index.ts +++ b/packages/time/src/utils/index.ts @@ -1,3 +1,5 @@ -export * from './parse'; -export * from './getFirstDayOfMonth'; -export * from './getFirstDayOfWeek'; +export * from './parse' +export * from './getFirstDayOfMonth' +export * from './getFirstDayOfWeek' +export * from './startOf' +export * from './endOf' diff --git a/packages/time/src/utils/startOf.ts b/packages/time/src/utils/startOf.ts new file mode 100644 index 00000000..d5723e35 --- /dev/null +++ b/packages/time/src/utils/startOf.ts @@ -0,0 +1,17 @@ +import type { Temporal } from '@js-temporal/polyfill' + +/** + * Helper function to get the start of a given day. + * @param date - The date for which the start of the day is needed. + * @returns The start of the given day. + */ +export const startOf = ( + date: Temporal.ZonedDateTime, +): Temporal.ZonedDateTime => { + return date.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }) +} From 31470b431ee445f3aaf6d97fc7a80f73857690ab Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 30 Jun 2024 23:58:38 +0200 Subject: [PATCH 110/163] refactor: remove all the layout specific code --- .../react-time/src/tests/useCalendar.test.tsx | 33 ++++---------- .../react-time/src/useCalendar/useCalendar.ts | 10 ++--- packages/time/src/calendar/getEventProps.ts | 29 ++----------- .../time/src/calendar/splitMultiDayEvents.ts | 4 +- packages/time/src/calendar/types.ts | 2 +- packages/time/src/core/calendar.ts | 43 ++++++++++++++----- 6 files changed, 53 insertions(+), 68 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 2159dd8b..64f8d6da 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -93,14 +93,9 @@ describe('useCalendar', () => { const eventProps = result.current.getEventProps('1') expect(eventProps).toEqual({ - style: { - position: 'absolute', - top: 'min(41.66666666666667%, calc(100% - 55px))', - left: '2%', - width: '96%', - margin: 0, - height: '8.333333333333332%', - }, + eventHeightInMinutes: 120, + isSplitEvent: false, + overlappingEvents: [], }) }) @@ -127,25 +122,15 @@ describe('useCalendar', () => { const event2Props = result.current.getEventProps('2') expect(event1Props).toEqual({ - style: { - position: 'absolute', - top: 'min(41.66666666666667%, calc(100% - 55px))', - left: '2%', - width: '47%', - margin: 0, - height: '8.333333333333332%', - }, + eventHeightInMinutes: 120, + isSplitEvent: false, + overlappingEvents: overlappingEvents[1] }) expect(event2Props).toEqual({ - style: { - position: 'absolute', - top: 'min(45.83333333333333%, calc(100% - 55px))', - left: '51%', - width: '47%', - margin: 0, - height: '8.333333333333332%', - }, + eventHeightInMinutes: 120, + isSplitEvent: false, + overlappingEvents: overlappingEvents[0] }) }) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 8dd5ea7e..52b73225 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,12 +1,12 @@ import { useCallback, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' import { CalendarCore, type Event } from '@tanstack/time' -import type { CalendarApi, CalendarCoreOptions } from '@tanstack/time' +import type { CalendarApi, CalendarCoreOptions, Resource } from '@tanstack/time' -export const useCalendar = ( - options: CalendarCoreOptions, -): CalendarApi & { isPending: boolean } => { - const [calendarCore] = useState(() => new CalendarCore(options)) +export const useCalendar = = Event>( + options: CalendarCoreOptions, +): CalendarApi & { isPending: boolean } => { + const [calendarCore] = useState(() => new CalendarCore(options)) const state = useStore(calendarCore.store) const [isPending, startTransition] = useTransition() diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts index cd6ce5e0..7e3c0d18 100644 --- a/packages/time/src/calendar/getEventProps.ts +++ b/packages/time/src/calendar/getEventProps.ts @@ -1,12 +1,11 @@ import { Temporal } from "@js-temporal/polyfill"; -import type { Properties as CSSProperties } from "csstype"; import type { CalendarStore, Event } from "./types"; export const getEventProps = ( eventMap: Map, id: Event['id'], state: CalendarStore, -): { style: CSSProperties } | null => { +) => { const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id); if (!event) return null; @@ -14,28 +13,22 @@ export const getEventProps = ( const eventEndDate = Temporal.ZonedDateTime.from(event.end); const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; - let percentageOfDay; let eventHeightInMinutes; if (isSplitEvent) { const isStartPart = eventStartDate.hour !== 0 || eventStartDate.minute !== 0; if (isStartPart) { const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; eventHeightInMinutes = 24 * 60 - eventTimeInMinutes; } else { - percentageOfDay = 0; eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; } } else { const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; - percentageOfDay = (eventTimeInMinutes / (24 * 60)) * 100; const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes; } - const eventHeight = Math.min((eventHeightInMinutes / (24 * 60)) * 100, 20); - const overlappingEvents = [...eventMap.values()].flat().filter((e) => { const eStartDate = Temporal.ZonedDateTime.from(e.start); const eEndDate = Temporal.ZonedDateTime.from(e.end); @@ -52,25 +45,11 @@ export const getEventProps = ( ); }); - const eventIndex = overlappingEvents.findIndex((e) => e.id === id); - const totalOverlaps = overlappingEvents.length; - const sidePadding = 2; - const innerPadding = 2; - const totalInnerPadding = (totalOverlaps - 1) * innerPadding; - const availableWidth = 100 - totalInnerPadding - 2 * sidePadding; - const eventWidth = totalOverlaps > 0 ? availableWidth / totalOverlaps : 100 - 2 * sidePadding; - const eventLeft = sidePadding + eventIndex * (eventWidth + innerPadding); - if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { return { - style: { - position: 'absolute', - top: `min(${percentageOfDay}%, calc(100% - 55px))`, - left: `${eventLeft}%`, - width: `${eventWidth}%`, - margin: 0, - height: `${eventHeight}%`, - }, + eventHeightInMinutes, + isSplitEvent, + overlappingEvents, }; } diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 41a84303..8aa58e6d 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -1,9 +1,9 @@ import { Temporal } from '@js-temporal/polyfill' import { endOf, startOf } from '../utils' -import type { Event } from './types' +import type { Event, Resource } from './types' export const splitMultiDayEvents = < - TResource extends string | null = null, + TResource extends Resource = Resource, TEvent extends Event = Event, >( event: TEvent, diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 31572271..05933b9b 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -19,7 +19,7 @@ export interface CalendarStore { } export type Day< - TResource extends string | null = null, + TResource extends Resource = Resource, TEvent extends Event = Event, > = { date: Temporal.PlainDate diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 38a98fd8..a9c75547 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -6,13 +6,12 @@ import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents' import { getEventProps } from '../calendar/getEventProps' import { groupDaysBy } from '../calendar/groupDaysBy' import { getDateDefaults } from '../utils/dateDefaults' -import type { Properties as CSSProperties } from 'csstype' import type { GroupDaysByProps } from '../calendar/groupDaysBy' import type { CalendarStore, Day, Event, Resource } from '../calendar/types' import './weekInfoPolyfill' -export type { CalendarStore, Event, Day } from '../calendar/types' +export type * from '../calendar/types' /** * Represents the configuration for the current viewing mode of a calendar, @@ -30,7 +29,10 @@ export interface ViewMode { * of events, locale, time zone, and the calendar system. * @template TEvent - Specifies the event type, extending a base Event type. */ -export interface CalendarCoreOptions> { +export interface CalendarCoreOptions< + TResource extends Resource, + TEvent extends Event, +> { /** An optional array of events to be handled by the calendar. */ events?: TEvent[] | null /** The initial view mode configuration of the calendar. */ @@ -50,7 +52,10 @@ export interface CalendarCoreOptions> { +interface CalendarActions< + TResource extends Resource, + TEvent extends Event, +> { /** Navigates to the previous period according to the current view mode. */ goToPreviousPeriod: () => void /** Navigates to the next period according to the current view mode. */ @@ -62,14 +67,22 @@ interface CalendarActions void /** Retrieves styling properties for a specific event, identified by ID. */ - getEventProps: (id: Event['id']) => { style: CSSProperties } | null + getEventProps: (id: Event['id']) => { + eventHeightInMinutes: number + isSplitEvent: boolean + overlappingEvents: TEvent[] + } | null + /** Groups days by a specified unit. */ groupDaysBy: ( props: Omit, 'weekStartsOn'>, ) => (Day | null)[][] } -interface CalendarState> { +interface CalendarState< + TResource extends Resource, + TEvent extends Event, +> { /** The currently focused date period in the calendar. */ currentPeriod: CalendarStore['currentPeriod'] /** The current view mode of the calendar. */ @@ -80,8 +93,10 @@ interface CalendarState> - extends CalendarActions, +export interface CalendarApi< + TResource extends Resource, + TEvent extends Event, +> extends CalendarActions, CalendarState {} /** @@ -89,8 +104,10 @@ export interface CalendarApi> - implements CalendarActions +export class CalendarCore< + TResource extends Resource, + TEvent extends Event, +> implements CalendarActions { store: Store options: Required> @@ -346,7 +363,11 @@ export class CalendarCore['getEventProps']> } groupDaysBy({ From 16867e8d8f4ca91b3716b85cc0538ae394cb0a2f Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 1 Jul 2024 22:51:15 +0200 Subject: [PATCH 111/163] refactor: update getDaysNames method to accept weekday parameter --- .../react-time/src/tests/useCalendar.test.tsx | 7 ++++--- .../react-time/src/useCalendar/useCalendar.ts | 4 +++- packages/time/src/core/calendar.ts | 16 +++++++++------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 64f8d6da..15f74195 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -25,7 +25,7 @@ describe('useCalendar', () => { ) expect(result.current.viewMode).toEqual({ value: 1, unit: 'month' }) expect(result.current.currentPeriod.toString()).toBe( - Temporal.Now.plainDateISO().toString(), + Temporal.Now.plainDateISO().withCalendar('gregory').toString(), ) }) @@ -155,8 +155,9 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) ); - const { daysNames } = result.current; - expect(daysNames).toEqual(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']); + const { getDaysNames } = result.current; + const daysNames = getDaysNames(); + expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); }); test('should correctly mark days as in current period', () => { diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 52b73225..82860361 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -44,10 +44,12 @@ export const useCalendar = ((props) => calendarCore.groupDaysBy(props), [calendarCore]) + const getDaysNames = useCallback((props) => calendarCore.getDaysNames(props), [calendarCore]) + return { ...state, days: calendarCore.getDaysWithEvents(), - daysNames: calendarCore.getDaysNames(), + getDaysNames, goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index a9c75547..b969959e 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -72,6 +72,8 @@ interface CalendarActions< isSplitEvent: boolean overlappingEvents: TEvent[] } | null + /** Retrieves the names of the days of the week, based on the current locale. */ + getDaysNames: (weekday?: 'long' | 'short') => string[] /** Groups days by a specified unit. */ groupDaysBy: ( @@ -89,8 +91,6 @@ interface CalendarState< viewMode: CalendarStore['viewMode'] /** An array of days, each potentially containing events. */ days: Array> - /** An array of names for the days of the week, localized to the calendar's locale. */ - daysNames: string[] } export interface CalendarApi< @@ -252,13 +252,15 @@ export class CalendarCore< }) } - getDaysNames() { - const baseDate = Temporal.PlainDate.from('2024-01-01') + getDaysNames(weekday: 'long' | 'short' = 'short') { + const baseDate = Temporal.PlainDate.from('2024-01-01'); + const firstDayOfWeek = this.getFirstDayOfWeek().dayOfWeek; + return Array.from({ length: 7 }).map((_, i) => baseDate - .add({ days: (i + (this.getFirstDayOfWeek().dayOfWeek + 1)) % 7 }) - .toLocaleString(this.options.locale, { weekday: 'short' }), - ) + .add({ days: (i + (firstDayOfWeek - 1)) % 7 }) + .toLocaleString(this.options.locale, { weekday: weekday }), + ); } changeViewMode(newViewMode: CalendarStore['viewMode']) { From be687989b13e6e09e8e945d7b1d83e8bd5496b14 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 1 Jul 2024 23:07:42 +0200 Subject: [PATCH 112/163] refactor: update useCalendar test to mock current date and time --- .../react-time/src/tests/useCalendar.test.tsx | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 15f74195..79b511da 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,5 +1,5 @@ import { Temporal } from '@js-temporal/polyfill' -import { describe, expect, test } from 'vitest' +import { beforeEach, describe, expect, test, vi } from 'vitest' import { act, renderHook } from '@testing-library/react' import { useCalendar } from '../useCalendar' @@ -19,6 +19,18 @@ describe('useCalendar', () => { }, ] + + const mockDate = Temporal.PlainDate.from('2024-06-15'); + const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00'); + const mockTimeZone = 'America/New_York'; + + beforeEach(() => { + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory',mockTimeZone)); + vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); + }); + test('should initialize with the correct view mode and current period', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), @@ -142,12 +154,12 @@ describe('useCalendar', () => { const { days } = result.current; const weeks = result.current.groupDaysBy({ days, unit: 'week' }); - expect(weeks).toHaveLength(5); + expect(weeks).toHaveLength(6); expect(weeks[0]).toHaveLength(7); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); - expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-24'); - expect(weeks.find((week) => week.some((day) => day?.isToday))?.find((day) => day?.isToday)?.date.toString()).toBe('2024-06-01'); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); + expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-30'); + expect(weeks.find((week) => week.some((day) => day?.isToday))?.find((day) => day?.isToday)?.date.toString()).toBe('2024-06-15'); }); test('should return the correct day names based on the locale', () => { From c3ba0c9d1e5fc02917d6bce96316519bc1a08389 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 1 Jul 2024 23:07:53 +0200 Subject: [PATCH 113/163] refactor: update useCalendar test to mock current date and time --- packages/time/src/tests/calendar-core.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 91906702..63bfcbb4 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -32,6 +32,8 @@ describe('CalendarCore', () => { calendarCore = new CalendarCore(options); vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory',mockTimeZone)); + vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); }); test('should initialize with the correct current period', () => { From 5afea3ed8a696f94d143c7f40301713a342c1a55 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 1 Jul 2024 23:15:01 +0200 Subject: [PATCH 114/163] test: update useCalendar tests --- .../react-time/src/tests/useCalendar.test.tsx | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 79b511da..58685764 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -27,7 +27,7 @@ describe('useCalendar', () => { beforeEach(() => { vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); - vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory',mockTimeZone)); + vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory', mockTimeZone)); vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); }); @@ -170,6 +170,14 @@ describe('useCalendar', () => { const { getDaysNames } = result.current; const daysNames = getDaysNames(); expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); + + const { result: resultPl } = renderHook(() => + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'pl' }) + ); + + const { getDaysNames: getDaysNamesPl } = resultPl.current; + const daysNamesPl = getDaysNamesPl(); + expect(daysNamesPl).toEqual(['pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.', 'niedz.']); }); test('should correctly mark days as in current period', () => { @@ -180,13 +188,13 @@ describe('useCalendar', () => { const { days } = result.current; const weeks = result.current.groupDaysBy({ days, unit: 'week' }); const daysInCurrentPeriod = weeks.flat().map(day => day?.isInCurrentPeriod); - expect(daysInCurrentPeriod).toEqual([ - false, false, false, false, false, true, true, + false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true + true, true, true, true, true, true, true, + true, false, false, false, false, false, false ]); }); @@ -266,8 +274,8 @@ describe('useCalendar', () => { const { days, groupDaysBy } = result.current; const weeks = groupDaysBy({ days, unit: 'week' }); - expect(weeks).toHaveLength(5); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-27'); - expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-30'); + expect(weeks).toHaveLength(6); + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); + expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-29'); }); }); From 15aced55e529b7f6d627531864195ccebe677410 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 1 Jul 2024 23:15:45 +0200 Subject: [PATCH 115/163] test: update useCalendar tests --- packages/react-time/src/tests/useCalendar.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 58685764..c10cc8c5 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -19,7 +19,6 @@ describe('useCalendar', () => { }, ] - const mockDate = Temporal.PlainDate.from('2024-06-15'); const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00'); const mockTimeZone = 'America/New_York'; From eb8b7b7dbc97ab1a04a40ddc1d1b7dd1d7c557fb Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 00:19:58 +0200 Subject: [PATCH 116/163] test: useCalendar --- .../react-time/src/tests/useCalendar.test.tsx | 316 ++++++------------ packages/time/src/core/calendar.ts | 4 +- packages/time/src/tests/calendar-core.test.ts | 69 +++- 3 files changed, 180 insertions(+), 209 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index c10cc8c5..d34af123 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,10 +1,26 @@ -import { Temporal } from '@js-temporal/polyfill' -import { beforeEach, describe, expect, test, vi } from 'vitest' -import { act, renderHook } from '@testing-library/react' -import { useCalendar } from '../useCalendar' +import { Temporal } from '@js-temporal/polyfill'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { act, renderHook } from '@testing-library/react'; +import { CalendarCore } from '@tanstack/time'; +import { useStore } from '@tanstack/react-store'; +import { useCalendar } from '../useCalendar'; +import type { Mock } from 'vitest'; +import type { Event } from '@tanstack/time'; + +vi.mock('@tanstack/time', () => { + return { + CalendarCore: vi.fn(), + }; +}); + +vi.mock('@tanstack/react-store', () => { + return { + useStore: vi.fn(), + }; +}); describe('useCalendar', () => { - const events = [ + const events: Event[] = [ { id: '1', start: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), @@ -17,264 +33,154 @@ describe('useCalendar', () => { end: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), title: 'Event 2', }, - ] + ]; const mockDate = Temporal.PlainDate.from('2024-06-15'); const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00'); const mockTimeZone = 'America/New_York'; + let mockStore: any; + let calendarCoreInstance: any; + beforeEach(() => { vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory', mockTimeZone)); vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); - }); - - test('should initialize with the correct view mode and current period', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ) - expect(result.current.viewMode).toEqual({ value: 1, unit: 'month' }) - expect(result.current.currentPeriod.toString()).toBe( - Temporal.Now.plainDateISO().withCalendar('gregory').toString(), - ) - }) - - test('should navigate to the previous period correctly', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ) - act(() => { - result.current.goToPreviousPeriod() - }) + mockStore = { + subscribe: vi.fn(), + state: { + currentPeriod: mockDate, + viewMode: { value: 1, unit: 'month' }, + }, + }; + + calendarCoreInstance = { + getDaysWithEvents: vi.fn().mockReturnValue([]), + getDaysNames: vi.fn().mockReturnValue([]), + goToPreviousPeriod: vi.fn(), + goToNextPeriod: vi.fn(), + goToCurrentPeriod: vi.fn(), + goToSpecificPeriod: vi.fn(), + changeViewMode: vi.fn(), + getEventProps: vi.fn().mockReturnValue({}), + groupDaysBy: vi.fn().mockReturnValue([]), + store: mockStore, + }; + + (CalendarCore as Mock).mockImplementation(() => calendarCoreInstance); + + (useStore as Mock).mockImplementation((store) => store.state); + }); - const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ - months: 1, - }) + test('should initialize CalendarCore with provided options', () => { + renderHook(() => + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, timeZone: mockTimeZone }), + ); - expect(result.current.currentPeriod).toEqual( - expectedPreviousMonth, - ) - }) + expect(CalendarCore).toHaveBeenCalledWith({ + events, + viewMode: { value: 1, unit: 'month' }, + timeZone: mockTimeZone, + }); + }); - test('should navigate to the next period correctly', () => { + test('should call goToPreviousPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ) + ); act(() => { - result.current.goToNextPeriod() - }) + result.current.goToPreviousPeriod(); + }); - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) - - expect(result.current.currentPeriod).toEqual(expectedNextMonth) - }) + expect(calendarCoreInstance.goToPreviousPeriod).toHaveBeenCalled(); + }); - test('should change view mode correctly', () => { + test('should call goToNextPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ) + ); act(() => { - result.current.changeViewMode({ value: 1, unit: 'week' }) - }) + result.current.goToNextPeriod(); + }); - expect(result.current.viewMode).toEqual({ value: 1, unit: 'week' }) - }) + expect(calendarCoreInstance.goToNextPeriod).toHaveBeenCalled(); + }); - test('should select a day correctly', () => { + test('should call changeViewMode on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ) - - act(() => { - result.current.goToSpecificPeriod(Temporal.PlainDate.from('2024-06-01')) - }) - - expect(result.current.currentPeriod.toString()).toBe('2024-06-01') - }) - - test('should return the correct props for an event', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), - ) - - const eventProps = result.current.getEventProps('1') - - expect(eventProps).toEqual({ - eventHeightInMinutes: 120, - isSplitEvent: false, - overlappingEvents: [], - }) - }) - - test('should return the correct props for overlapping events', () => { - const overlappingEvents = [ - { - id: '1', - start: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), - end: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), - title: 'Event 1', - }, - { - id: '2', - start: Temporal.PlainDateTime.from('2024-06-01T11:00:00'), - end: Temporal.PlainDateTime.from('2024-06-01T13:00:00'), - title: 'Event 2', - }, - ] - const { result } = renderHook(() => - useCalendar({ events: overlappingEvents, viewMode: { value: 1, unit: 'week' } }), - ) - - const event1Props = result.current.getEventProps('1') - const event2Props = result.current.getEventProps('2') - - expect(event1Props).toEqual({ - eventHeightInMinutes: 120, - isSplitEvent: false, - overlappingEvents: overlappingEvents[1] - }) - - expect(event2Props).toEqual({ - eventHeightInMinutes: 120, - isSplitEvent: false, - overlappingEvents: overlappingEvents[0] - }) - }) - - test('should render array of days', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }), ); - const { days } = result.current; - const weeks = result.current.groupDaysBy({ days, unit: 'week' }); - - expect(weeks).toHaveLength(6); - expect(weeks[0]).toHaveLength(7); + act(() => { + result.current.changeViewMode({ value: 1, unit: 'week' }); + }); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); - expect(weeks[weeks.length - 1]?.[0]?.date.toString()).toBe('2024-06-30'); - expect(weeks.find((week) => week.some((day) => day?.isToday))?.find((day) => day?.isToday)?.date.toString()).toBe('2024-06-15'); + expect(calendarCoreInstance.changeViewMode).toHaveBeenCalledWith({ value: 1, unit: 'week' }); }); - test('should return the correct day names based on the locale', () => { + test('should call goToSpecificPeriod on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ); - const { getDaysNames } = result.current; - const daysNames = getDaysNames(); - expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); - - const { result: resultPl } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'pl' }) - ); + const specificDate = Temporal.PlainDate.from('2024-06-01'); + act(() => { + result.current.goToSpecificPeriod(specificDate); + }); - const { getDaysNames: getDaysNamesPl } = resultPl.current; - const daysNamesPl = getDaysNamesPl(); - expect(daysNamesPl).toEqual(['pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.', 'niedz.']); + expect(calendarCoreInstance.goToSpecificPeriod).toHaveBeenCalledWith(specificDate); }); - test('should correctly mark days as in current period', () => { + test('should call goToCurrentPeriod on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ); - const { days } = result.current; - const weeks = result.current.groupDaysBy({ days, unit: 'week' }); - const daysInCurrentPeriod = weeks.flat().map(day => day?.isInCurrentPeriod); - expect(daysInCurrentPeriod).toEqual([ - false, false, false, false, false, false, true, - true, true, true, true, true, true, true, - true, true, true, true, true, true, true, - true, true, true, true, true, true, true, - true, true, true, true, true, true, true, - true, false, false, false, false, false, false - ]); - }); - - test('should navigate to a specific period correctly', () => { - const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } })) - const specificDate = Temporal.PlainDate.from('2024-05-15') - - act(() => { - result.current.goToSpecificPeriod(specificDate) - }) - - expect(result.current.currentPeriod).toEqual(specificDate) - }) - - test('should navigate to the previous period correctly', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) - ) - act(() => { - result.current.goToPreviousPeriod() - }) - - const expectedPreviousMonth = Temporal.Now.plainDateISO().subtract({ - months: 1, - }) + result.current.goToNextPeriod(); + result.current.goToCurrentPeriod(); + }); - expect(result.current.currentPeriod).toEqual(expectedPreviousMonth) - }) - - test('should navigate to the next period correctly', () => { - const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) - ) - - act(() => { - result.current.goToNextPeriod() - }) - - const expectedNextMonth = Temporal.Now.plainDateISO().add({ months: 1 }) - - expect(result.current.currentPeriod).toEqual(expectedNextMonth) - }) + expect(calendarCoreInstance.goToCurrentPeriod).toHaveBeenCalled(); + }); - test('should reset to the current period correctly', () => { + test('should call getEventProps on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) - ) + useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), + ); act(() => { - result.current.goToNextPeriod() - result.current.goToCurrentPeriod() - }) + result.current.getEventProps('1'); + }); - expect(result.current.currentPeriod).toEqual( - Temporal.Now.plainDateISO(), - ) - }) + expect(calendarCoreInstance.getEventProps).toHaveBeenCalledWith('1'); + }); - test('should group days by months correctly', () => { + test('should call getDaysNames on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 2, unit: 'month' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }), ); - const { days, groupDaysBy } = result.current; - const months = groupDaysBy({ days, unit: 'month' }); + act(() => { + result.current.getDaysNames('short'); + }); - expect(months).toHaveLength(2); - expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01'); - expect(months[1]?.[0]?.date.toString()).toBe('2024-07-01'); + expect(calendarCoreInstance.getDaysNames).toHaveBeenCalledWith('short'); }); - test('should group days by weeks correctly', () => { + test('should call groupDaysBy on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }) + useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ); - const { days, groupDaysBy } = result.current; - const weeks = groupDaysBy({ days, unit: 'week' }); - expect(weeks).toHaveLength(6); - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26'); - expect(weeks[4]?.[6]?.date.toString()).toBe('2024-06-29'); + act(() => { + result.current.groupDaysBy({ days: [], unit: 'month' }); + }); + + expect(calendarCoreInstance.groupDaysBy).toHaveBeenCalledWith({ days: [], unit: 'month' }); }); }); diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index b969959e..42f23dd6 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -115,10 +115,8 @@ export class CalendarCore< constructor(options: CalendarCoreOptions) { const defaults = getDateDefaults() this.options = { + ...defaults, ...options, - locale: options.locale || defaults.locale, - timeZone: options.timeZone || defaults.timeZone, - calendar: options.calendar || defaults.calendar, events: options.events || null, resources: options.resources || null, } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 63bfcbb4..a1b09291 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -26,6 +26,12 @@ describe('CalendarCore', () => { end: Temporal.PlainDateTime.from('2023-06-12T12:00'), title: 'Event 2', }, + { + id: '3', + start: Temporal.PlainDateTime.from('2023-06-12T11:00'), + end: Temporal.PlainDateTime.from('2023-06-12T13:00'), + title: 'Event 3', + }, ], timeZone: mockTimeZone, }; @@ -52,8 +58,9 @@ describe('CalendarCore', () => { const dayWithEvent2 = daysWithEvents.find((day) => day.date.equals(Temporal.PlainDate.from('2023-06-12'))); expect(dayWithEvent1?.events).toHaveLength(1); expect(dayWithEvent1?.events[0]?.id).toBe('1'); - expect(dayWithEvent2?.events).toHaveLength(1); + expect(dayWithEvent2?.events).toHaveLength(2); expect(dayWithEvent2?.events[0]?.id).toBe('2'); + expect(dayWithEvent2?.events[1]?.id).toBe('3'); }); test('should change view mode correctly', () => { @@ -108,4 +115,64 @@ describe('CalendarCore', () => { expect(calendarCore.store.state.currentPeriod.calendarId).toBe(customCalendar); expect(calendarCore.store.state.currentPeriod).toEqual(today); }); + + test('should return the correct props for an event', () => { + const eventProps = calendarCore.getEventProps('1'); + expect(eventProps).toEqual({ + eventHeightInMinutes: 60, + isSplitEvent: false, + overlappingEvents: [], + }); + }); + + test('should return the correct props for overlapping events', () => { + const event1Props = calendarCore.getEventProps('2'); + const event2Props = calendarCore.getEventProps('3'); + + expect(event1Props).toEqual({ + eventHeightInMinutes: 60, + isSplitEvent: false, + overlappingEvents: [options.events![2]], + }); + + expect(event2Props).toEqual({ + eventHeightInMinutes: 120, + isSplitEvent: false, + overlappingEvents: [options.events![1]], + }); + }); + + test('should correctly mark days as in current period', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + const currentPeriodDays = daysWithEvents.filter(day => day.isInCurrentPeriod); + expect(currentPeriodDays).toHaveLength(30); // Assuming a 30-day month + }); + + test('should return the correct day names based on the locale', () => { + const daysNames = calendarCore.getDaysNames('short'); + expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); + }); + + test('should reset to the current period correctly', () => { + calendarCore.goToNextPeriod(); + calendarCore.goToCurrentPeriod(); + const today = Temporal.Now.plainDateISO(); + expect(calendarCore.store.state.currentPeriod).toEqual(today); + }); + + test('should group days by weeks correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + const weeks = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'week' }); + expect(weeks).toHaveLength(6); + expect(weeks[0]?.[0]?.date.toString()).toBe('2023-05-28'); + expect(weeks[4]?.[6]?.date.toString()).toBe('2023-06-30'); + }); + + test('should group days by months correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents(); + const months = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month' }); + expect(months).toHaveLength(1); + expect(months[0]?.[0]?.date.toString()).toBe('2023-06-01'); + }); + }); From 4d71196c9f48ff06bedfec7e9d25a6fadc52347b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 00:31:23 +0200 Subject: [PATCH 117/163] refactor: update CalendarCore tests to mock current date and time --- packages/time/src/tests/calendar-core.test.ts | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index a1b09291..4dc548d5 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -11,6 +11,31 @@ describe('CalendarCore', () => { const mockTimeZone = 'America/New_York'; beforeEach(() => { + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue( + Temporal.ZonedDateTime.from({ + timeZone: mockTimeZone, + year: 2023, + month: 6, + day: 15, + hour: 10, + minute: 0, + second: 0, + }) + ); + vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue( + Temporal.ZonedDateTime.from({ + timeZone: mockTimeZone, + year: 2023, + month: 6, + day: 15, + hour: 10, + minute: 0, + second: 0, + }) + ); + options = { viewMode: { value: 1, unit: 'month' }, events: [ @@ -36,10 +61,6 @@ describe('CalendarCore', () => { timeZone: mockTimeZone, }; calendarCore = new CalendarCore(options); - vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); - vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory',mockTimeZone)); - vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); }); test('should initialize with the correct current period', () => { @@ -163,9 +184,10 @@ describe('CalendarCore', () => { test('should group days by weeks correctly', () => { const daysWithEvents = calendarCore.getDaysWithEvents(); const weeks = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'week' }); - expect(weeks).toHaveLength(6); + + expect(weeks).toHaveLength(5); expect(weeks[0]?.[0]?.date.toString()).toBe('2023-05-28'); - expect(weeks[4]?.[6]?.date.toString()).toBe('2023-06-30'); + expect(weeks[4]?.[6]?.date.toString()).toBe('2023-07-01'); }); test('should group days by months correctly', () => { From fbbae152bb6d915988b56db3bc1370ec1a781427 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 17:20:33 +0200 Subject: [PATCH 118/163] refactor: Update CalendarCore to use destructuring assignment for datePart --- packages/time/src/core/calendar.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 42f23dd6..f3102ced 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -212,14 +212,14 @@ export class CalendarCore< this.options.timeZone, ) splitEvents.forEach((splitEvent) => { - const splitKey = splitEvent.start.toString().split('T')[0] - if (splitKey) { - if (!map.has(splitKey)) map.set(splitKey, []) - map.get(splitKey)?.push(splitEvent) + const [ datePart ] = splitEvent.start.toString().split('T') + if (datePart) { + if (!map.has(datePart)) map.set(datePart, []) + map.get(datePart)?.push(splitEvent) } }) } else { - const eventKey = event.start.toString().split('T')[0] + const [ eventKey ] = event.start.toString().split('T') if (eventKey) { if (!map.has(eventKey)) map.set(eventKey, []) map.get(eventKey)?.push(event) From ce9b9245282754d54eae925713c1a4599bed1b98 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 22:51:27 +0200 Subject: [PATCH 119/163] feat: add the activeDate property --- packages/time/src/calendar/types.ts | 1 + packages/time/src/core/calendar.ts | 51 ++++++++++--------- packages/time/src/tests/calendar-core.test.ts | 8 ++- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 05933b9b..1e97697d 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -12,6 +12,7 @@ export interface Event { export interface CalendarStore { currentPeriod: Temporal.PlainDate + activeDate: Temporal.PlainDate viewMode: { value: number unit: 'month' | 'week' | 'day' diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index f3102ced..124bb438 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -74,7 +74,6 @@ interface CalendarActions< } | null /** Retrieves the names of the days of the week, based on the current locale. */ getDaysNames: (weekday?: 'long' | 'short') => string[] - /** Groups days by a specified unit. */ groupDaysBy: ( props: Omit, 'weekStartsOn'>, @@ -91,6 +90,8 @@ interface CalendarState< viewMode: CalendarStore['viewMode'] /** An array of days, each potentially containing events. */ days: Array> + /** The currently active date in the calendar. */ + activeDate: Temporal.PlainDate } export interface CalendarApi< @@ -121,10 +122,11 @@ export class CalendarCore< resources: options.resources || null, } + const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) + this.store = new Store({ - currentPeriod: Temporal.Now.plainDateISO().withCalendar( - this.options.calendar, - ), + currentPeriod: now, + activeDate: now, viewMode: options.viewMode, }) } @@ -269,39 +271,39 @@ export class CalendarCore< } goToPreviousPeriod() { - const firstDayOfMonth = this.getFirstDayOfMonth() - const firstDayOfWeek = this.getFirstDayOfWeek() - switch (this.store.state.viewMode.unit) { case 'month': { - const firstDayOfPrevMonth = firstDayOfMonth.subtract({ + const newActiveDate = this.store.state.activeDate.subtract({ months: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: firstDayOfPrevMonth, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } case 'week': { - const firstDayOfPrevWeek = firstDayOfWeek.subtract({ + const newActiveDate = this.store.state.activeDate.subtract({ weeks: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: firstDayOfPrevWeek, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } case 'day': { - const prevCustomStart = this.store.state.currentPeriod.subtract({ + const newActiveDate = this.store.state.activeDate.subtract({ days: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: prevCustomStart, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } @@ -309,39 +311,39 @@ export class CalendarCore< } goToNextPeriod() { - const firstDayOfMonth = this.getFirstDayOfMonth() - const firstDayOfWeek = this.getFirstDayOfWeek() - switch (this.store.state.viewMode.unit) { case 'month': { - const firstDayOfNextMonth = firstDayOfMonth.add({ + const newActiveDate = this.store.state.activeDate.add({ months: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: firstDayOfNextMonth, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } case 'week': { - const firstDayOfNextWeek = firstDayOfWeek.add({ + const newActiveDate = this.store.state.activeDate.add({ weeks: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: firstDayOfNextWeek, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } case 'day': { - const nextCustomStart = this.store.state.currentPeriod.add({ + const newActiveDate = this.store.state.activeDate.add({ days: this.store.state.viewMode.value, }) this.store.setState((prev) => ({ ...prev, - currentPeriod: nextCustomStart, + activeDate: newActiveDate, + currentPeriod: newActiveDate, })) break } @@ -349,15 +351,18 @@ export class CalendarCore< } goToCurrentPeriod() { + const now = Temporal.Now.plainDateISO() this.store.setState((prev) => ({ ...prev, - currentPeriod: Temporal.Now.plainDateISO(), + activeDate: now, + currentPeriod: now, })) } goToSpecificPeriod(date: Temporal.PlainDate) { this.store.setState((prev) => ({ ...prev, + activeDate: date, currentPeriod: date, })) } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 4dc548d5..8bca208c 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -66,6 +66,7 @@ describe('CalendarCore', () => { test('should initialize with the correct current period', () => { const today = Temporal.Now.plainDateISO(); expect(calendarCore.store.state.currentPeriod).toEqual(today); + expect(calendarCore.store.state.activeDate).toEqual(today); }); test('should get the correct days with events for the month', () => { @@ -95,6 +96,7 @@ describe('CalendarCore', () => { calendarCore.goToPreviousPeriod(); const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }); expect(calendarCore.store.state.currentPeriod).toEqual(expectedPreviousMonth); + expect(calendarCore.store.state.activeDate).toEqual(expectedPreviousMonth); }); test('should go to next period correctly', () => { @@ -102,6 +104,7 @@ describe('CalendarCore', () => { calendarCore.goToNextPeriod(); const expectedNextMonth = initialPeriod.add({ months: 1 }); expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth); + expect(calendarCore.store.state.activeDate).toEqual(expectedNextMonth); }); test('should go to current period correctly', () => { @@ -109,12 +112,14 @@ describe('CalendarCore', () => { calendarCore.goToCurrentPeriod(); const today = Temporal.Now.plainDateISO(); expect(calendarCore.store.state.currentPeriod).toEqual(today); + expect(calendarCore.store.state.activeDate).toEqual(today); }); test('should go to specific period correctly', () => { const specificDate = Temporal.PlainDate.from('2023-07-01'); calendarCore.goToSpecificPeriod(specificDate); expect(calendarCore.store.state.currentPeriod).toEqual(specificDate); + expect(calendarCore.store.state.activeDate).toEqual(specificDate); }); test('should group days correctly', () => { @@ -135,6 +140,7 @@ describe('CalendarCore', () => { const today = Temporal.Now.plainDateISO(customCalendar); expect(calendarCore.store.state.currentPeriod.calendarId).toBe(customCalendar); expect(calendarCore.store.state.currentPeriod).toEqual(today); + expect(calendarCore.store.state.activeDate).toEqual(today); }); test('should return the correct props for an event', () => { @@ -179,6 +185,7 @@ describe('CalendarCore', () => { calendarCore.goToCurrentPeriod(); const today = Temporal.Now.plainDateISO(); expect(calendarCore.store.state.currentPeriod).toEqual(today); + expect(calendarCore.store.state.activeDate).toEqual(today); }); test('should group days by weeks correctly', () => { @@ -196,5 +203,4 @@ describe('CalendarCore', () => { expect(months).toHaveLength(1); expect(months[0]?.[0]?.date.toString()).toBe('2023-06-01'); }); - }); From 66bfe536de0105447c4bba142c395c78a14b0f3e Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 23:02:58 +0200 Subject: [PATCH 120/163] refactor: use compare method --- packages/time/src/core/calendar.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 124bb438..dab75828 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -187,13 +187,21 @@ export class CalendarCore< } const allDays = generateDateRange(start, end) - const startMonth = this.store.state.currentPeriod.month - const endMonth = this.store.state.currentPeriod.add({ - months: this.store.state.viewMode.value - 1, - }).month + const startMonthDate = this.store.state.currentPeriod.with({ day: 1 }) + const endMonthDate = this.store.state.currentPeriod + .add({ + months: this.store.state.viewMode.value - 1, + }) + .with({ + day: Temporal.PlainDate.from( + this.store.state.currentPeriod.toString({ calendarName: 'auto' }), + ).daysInMonth, + }) return allDays.filter( - (day) => day.month >= startMonth && day.month <= endMonth, + (day) => + Temporal.PlainDate.compare(day, startMonthDate) >= 0 && + Temporal.PlainDate.compare(day, endMonthDate) <= 0, ) } @@ -214,14 +222,14 @@ export class CalendarCore< this.options.timeZone, ) splitEvents.forEach((splitEvent) => { - const [ datePart ] = splitEvent.start.toString().split('T') + const [datePart] = splitEvent.start.toString().split('T') if (datePart) { if (!map.has(datePart)) map.set(datePart, []) map.get(datePart)?.push(splitEvent) } }) } else { - const [ eventKey ] = event.start.toString().split('T') + const [eventKey] = event.start.toString().split('T') if (eventKey) { if (!map.has(eventKey)) map.set(eventKey, []) map.get(eventKey)?.push(event) @@ -253,14 +261,14 @@ export class CalendarCore< } getDaysNames(weekday: 'long' | 'short' = 'short') { - const baseDate = Temporal.PlainDate.from('2024-01-01'); - const firstDayOfWeek = this.getFirstDayOfWeek().dayOfWeek; + const baseDate = Temporal.PlainDate.from('2024-01-01') + const firstDayOfWeek = this.getFirstDayOfWeek().dayOfWeek return Array.from({ length: 7 }).map((_, i) => baseDate .add({ days: (i + (firstDayOfWeek - 1)) % 7 }) .toLocaleString(this.options.locale, { weekday: weekday }), - ); + ) } changeViewMode(newViewMode: CalendarStore['viewMode']) { From 06f633d2b90036f09cb43df27d9c55051496e07b Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Tue, 2 Jul 2024 23:40:07 +0200 Subject: [PATCH 121/163] feat: add workWeek unit --- packages/time/src/calendar/groupDaysBy.ts | 56 +++- packages/time/src/calendar/types.ts | 2 +- packages/time/src/core/calendar.ts | 30 +- packages/time/src/tests/calendar-core.test.ts | 274 +++++++++++------- 4 files changed, 250 insertions(+), 112 deletions(-) diff --git a/packages/time/src/calendar/groupDaysBy.ts b/packages/time/src/calendar/groupDaysBy.ts index dbd3af65..582eeba0 100644 --- a/packages/time/src/calendar/groupDaysBy.ts +++ b/packages/time/src/calendar/groupDaysBy.ts @@ -21,7 +21,7 @@ type GroupDaysByWeekProps< TResource extends Resource, TEvent extends Event = Event, > = GroupDaysByBaseProps & { - unit: 'week' + unit: 'week' | 'workWeek' fillMissingDays?: boolean } @@ -115,6 +115,60 @@ export const groupDaysBy = < return weeks } + + case 'workWeek': { + const workWeeks: (Day | null)[][] = [] + let currentWorkWeek: (Day | null)[] = [] + + days.forEach((day) => { + if ( + currentWorkWeek.length === 0 && + day?.date.dayOfWeek !== weekStartsOn + ) { + if (day) { + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 + for (let i = 0; i < dayOfWeek; i++) { + currentWorkWeek.push( + fillMissingDays + ? { + date: day.date.subtract({ days: dayOfWeek - i }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ) + } + } + } + currentWorkWeek.push(day) + if (currentWorkWeek.length === 5) { + workWeeks.push(currentWorkWeek) + currentWorkWeek = [] + } + }) + + if (currentWorkWeek.length > 0) { + while (currentWorkWeek.length < 5) { + const lastDate = + currentWorkWeek[currentWorkWeek.length - 1]?.date ?? + Temporal.PlainDate.from('2024-01-01') + currentWorkWeek.push( + fillMissingDays + ? { + date: lastDate.add({ days: 1 }), + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ) + } + workWeeks.push(currentWorkWeek) + } + + return workWeeks + } default: break } diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 1e97697d..30c7b79d 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -15,7 +15,7 @@ export interface CalendarStore { activeDate: Temporal.PlainDate viewMode: { value: number - unit: 'month' | 'week' | 'day' + unit: 'month' | 'week' | 'workWeek' | 'day' } } diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index dab75828..a274a7e1 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -20,8 +20,8 @@ export type * from '../calendar/types' export interface ViewMode { /** The number of units for the view mode. */ value: number - /** The unit of time that the calendar view should display (month, week, or day). */ - unit: 'month' | 'week' | 'day' + /** The unit of time that the calendar view should display (month, week, workWeek or day). */ + unit: 'month' | 'week' | 'day' | 'workWeek' } /** @@ -184,6 +184,10 @@ export class CalendarCore< }) break } + case 'workWeek': { + end = start.add({ days: 4 }) + break + } } const allDays = generateDateRange(start, end) @@ -315,6 +319,17 @@ export class CalendarCore< })) break } + case 'workWeek': { + const newActiveDate = this.store.state.activeDate.subtract({ + days: 5, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: newActiveDate, + currentPeriod: newActiveDate, + })) + break + } } } @@ -355,6 +370,17 @@ export class CalendarCore< })) break } + case 'workWeek': { + const newActiveDate = this.store.state.activeDate.add({ + days: 5, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: newActiveDate, + currentPeriod: newActiveDate, + })) + break + } } } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 8bca208c..1ab82e8b 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -1,18 +1,18 @@ -import { Temporal } from '@js-temporal/polyfill'; -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { CalendarCore } from '../core/calendar'; -import type { CalendarCoreOptions, Event } from '../core/calendar'; +import { Temporal } from '@js-temporal/polyfill' +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { CalendarCore } from '../core/calendar' +import type { CalendarCoreOptions, Event } from '../core/calendar' describe('CalendarCore', () => { - let options: CalendarCoreOptions>; - let calendarCore: CalendarCore>; - const mockDate = Temporal.PlainDate.from('2023-06-15'); - const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00'); - const mockTimeZone = 'America/New_York'; + let options: CalendarCoreOptions> + let calendarCore: CalendarCore> + const mockDate = Temporal.PlainDate.from('2023-06-15') + const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00') + const mockTimeZone = 'America/New_York' beforeEach(() => { - vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate) + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime) vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue( Temporal.ZonedDateTime.from({ timeZone: mockTimeZone, @@ -22,8 +22,8 @@ describe('CalendarCore', () => { hour: 10, minute: 0, second: 0, - }) - ); + }), + ) vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue( Temporal.ZonedDateTime.from({ timeZone: mockTimeZone, @@ -33,8 +33,8 @@ describe('CalendarCore', () => { hour: 10, minute: 0, second: 0, - }) - ); + }), + ) options = { viewMode: { value: 1, unit: 'month' }, @@ -59,148 +59,206 @@ describe('CalendarCore', () => { }, ], timeZone: mockTimeZone, - }; - calendarCore = new CalendarCore(options); - }); + } + calendarCore = new CalendarCore(options) + }) test('should initialize with the correct current period', () => { - const today = Temporal.Now.plainDateISO(); - expect(calendarCore.store.state.currentPeriod).toEqual(today); - expect(calendarCore.store.state.activeDate).toEqual(today); - }); + const today = Temporal.Now.plainDateISO() + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) test('should get the correct days with events for the month', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - expect(daysWithEvents.length).toBeGreaterThan(0); - }); + const daysWithEvents = calendarCore.getDaysWithEvents() + expect(daysWithEvents.length).toBeGreaterThan(0) + }) test('should correctly map events to days', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - const dayWithEvent1 = daysWithEvents.find((day) => day.date.equals(Temporal.PlainDate.from('2023-06-10'))); - const dayWithEvent2 = daysWithEvents.find((day) => day.date.equals(Temporal.PlainDate.from('2023-06-12'))); - expect(dayWithEvent1?.events).toHaveLength(1); - expect(dayWithEvent1?.events[0]?.id).toBe('1'); - expect(dayWithEvent2?.events).toHaveLength(2); - expect(dayWithEvent2?.events[0]?.id).toBe('2'); - expect(dayWithEvent2?.events[1]?.id).toBe('3'); - }); + const daysWithEvents = calendarCore.getDaysWithEvents() + const dayWithEvent1 = daysWithEvents.find((day) => + day.date.equals(Temporal.PlainDate.from('2023-06-10')), + ) + const dayWithEvent2 = daysWithEvents.find((day) => + day.date.equals(Temporal.PlainDate.from('2023-06-12')), + ) + expect(dayWithEvent1?.events).toHaveLength(1) + expect(dayWithEvent1?.events[0]?.id).toBe('1') + expect(dayWithEvent2?.events).toHaveLength(2) + expect(dayWithEvent2?.events[0]?.id).toBe('2') + expect(dayWithEvent2?.events[1]?.id).toBe('3') + }) test('should change view mode correctly', () => { - calendarCore.changeViewMode({ value: 2, unit: 'week' }); - expect(calendarCore.store.state.viewMode.value).toBe(2); - expect(calendarCore.store.state.viewMode.unit).toBe('week'); - }); + calendarCore.changeViewMode({ value: 2, unit: 'week' }) + expect(calendarCore.store.state.viewMode.value).toBe(2) + expect(calendarCore.store.state.viewMode.unit).toBe('week') + }) test('should go to previous period correctly', () => { - const initialPeriod = calendarCore.store.state.currentPeriod; - calendarCore.goToPreviousPeriod(); - const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }); - expect(calendarCore.store.state.currentPeriod).toEqual(expectedPreviousMonth); - expect(calendarCore.store.state.activeDate).toEqual(expectedPreviousMonth); - }); + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToPreviousPeriod() + const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }) + expect(calendarCore.store.state.currentPeriod).toEqual( + expectedPreviousMonth, + ) + expect(calendarCore.store.state.activeDate).toEqual(expectedPreviousMonth) + }) test('should go to next period correctly', () => { - const initialPeriod = calendarCore.store.state.currentPeriod; - calendarCore.goToNextPeriod(); - const expectedNextMonth = initialPeriod.add({ months: 1 }); - expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth); - expect(calendarCore.store.state.activeDate).toEqual(expectedNextMonth); - }); + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToNextPeriod() + const expectedNextMonth = initialPeriod.add({ months: 1 }) + expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth) + expect(calendarCore.store.state.activeDate).toEqual(expectedNextMonth) + }) test('should go to current period correctly', () => { - calendarCore.goToNextPeriod(); - calendarCore.goToCurrentPeriod(); - const today = Temporal.Now.plainDateISO(); - expect(calendarCore.store.state.currentPeriod).toEqual(today); - expect(calendarCore.store.state.activeDate).toEqual(today); - }); + calendarCore.goToNextPeriod() + calendarCore.goToCurrentPeriod() + const today = Temporal.Now.plainDateISO() + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) test('should go to specific period correctly', () => { - const specificDate = Temporal.PlainDate.from('2023-07-01'); - calendarCore.goToSpecificPeriod(specificDate); - expect(calendarCore.store.state.currentPeriod).toEqual(specificDate); - expect(calendarCore.store.state.activeDate).toEqual(specificDate); - }); + const specificDate = Temporal.PlainDate.from('2023-07-01') + calendarCore.goToSpecificPeriod(specificDate) + expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) + expect(calendarCore.store.state.activeDate).toEqual(specificDate) + }) test('should group days correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - const groupedDays = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month' }); - expect(groupedDays.length).toBeGreaterThan(0); - }); + const daysWithEvents = calendarCore.getDaysWithEvents() + const groupedDays = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'month', + }) + expect(groupedDays.length).toBeGreaterThan(0) + }) test('should initialize with the correct time zone', () => { - expect(calendarCore.options.timeZone).toBe(mockTimeZone); - }); + expect(calendarCore.options.timeZone).toBe(mockTimeZone) + }) test('should respect custom calendar', () => { - const customCalendar = 'islamic-civil'; - options.calendar = customCalendar; - calendarCore = new CalendarCore(options); + const customCalendar = 'islamic-civil' + options.calendar = customCalendar + calendarCore = new CalendarCore(options) - const today = Temporal.Now.plainDateISO(customCalendar); - expect(calendarCore.store.state.currentPeriod.calendarId).toBe(customCalendar); - expect(calendarCore.store.state.currentPeriod).toEqual(today); - expect(calendarCore.store.state.activeDate).toEqual(today); - }); + const today = Temporal.Now.plainDateISO(customCalendar) + expect(calendarCore.store.state.currentPeriod.calendarId).toBe( + customCalendar, + ) + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) test('should return the correct props for an event', () => { - const eventProps = calendarCore.getEventProps('1'); + const eventProps = calendarCore.getEventProps('1') expect(eventProps).toEqual({ eventHeightInMinutes: 60, isSplitEvent: false, overlappingEvents: [], - }); - }); + }) + }) test('should return the correct props for overlapping events', () => { - const event1Props = calendarCore.getEventProps('2'); - const event2Props = calendarCore.getEventProps('3'); + const event1Props = calendarCore.getEventProps('2') + const event2Props = calendarCore.getEventProps('3') expect(event1Props).toEqual({ eventHeightInMinutes: 60, isSplitEvent: false, overlappingEvents: [options.events![2]], - }); + }) expect(event2Props).toEqual({ eventHeightInMinutes: 120, isSplitEvent: false, overlappingEvents: [options.events![1]], - }); - }); + }) + }) test('should correctly mark days as in current period', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - const currentPeriodDays = daysWithEvents.filter(day => day.isInCurrentPeriod); - expect(currentPeriodDays).toHaveLength(30); // Assuming a 30-day month - }); + const daysWithEvents = calendarCore.getDaysWithEvents() + const currentPeriodDays = daysWithEvents.filter( + (day) => day.isInCurrentPeriod, + ) + expect(currentPeriodDays).toHaveLength(30) // Assuming a 30-day month + }) test('should return the correct day names based on the locale', () => { - const daysNames = calendarCore.getDaysNames('short'); - expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']); - }); + const daysNames = calendarCore.getDaysNames('short') + expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']) + }) test('should reset to the current period correctly', () => { - calendarCore.goToNextPeriod(); - calendarCore.goToCurrentPeriod(); - const today = Temporal.Now.plainDateISO(); - expect(calendarCore.store.state.currentPeriod).toEqual(today); - expect(calendarCore.store.state.activeDate).toEqual(today); - }); + calendarCore.goToNextPeriod() + calendarCore.goToCurrentPeriod() + const today = Temporal.Now.plainDateISO() + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) test('should group days by weeks correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - const weeks = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'week' }); + const daysWithEvents = calendarCore.getDaysWithEvents() + const weeks = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'week', + }) - expect(weeks).toHaveLength(5); - expect(weeks[0]?.[0]?.date.toString()).toBe('2023-05-28'); - expect(weeks[4]?.[6]?.date.toString()).toBe('2023-07-01'); - }); + expect(weeks).toHaveLength(5) + expect(weeks[0]?.[0]?.date.toString()).toBe('2023-05-28') + expect(weeks[4]?.[6]?.date.toString()).toBe('2023-07-01') + }) test('should group days by months correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents(); - const months = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'month' }); - expect(months).toHaveLength(1); - expect(months[0]?.[0]?.date.toString()).toBe('2023-06-01'); - }); -}); + const daysWithEvents = calendarCore.getDaysWithEvents() + const months = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'month', + }) + expect(months).toHaveLength(1) + expect(months[0]?.[0]?.date.toString()).toBe('2023-06-01') + }) + + test('should change view mode to workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + expect(calendarCore.store.state.viewMode.value).toBe(1) + expect(calendarCore.store.state.viewMode.unit).toBe('workWeek') + }) + + test('should go to previous workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToPreviousPeriod() + const expectedPreviousWorkWeek = initialPeriod.subtract({ days: 5 }) + expect(calendarCore.store.state.currentPeriod).toEqual( + expectedPreviousWorkWeek, + ) + expect(calendarCore.store.state.activeDate).toEqual( + expectedPreviousWorkWeek, + ) + }) + + test('should go to next workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToNextPeriod() + const expectedNextWorkWeek = initialPeriod.add({ days: 5 }) + expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextWorkWeek) + expect(calendarCore.store.state.activeDate).toEqual(expectedNextWorkWeek) + }) + + test('should group days by workWeek correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + const workWeeks = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'workWeek', + }) + + expect(workWeeks.length).toBeGreaterThan(0) + expect(workWeeks[0]?.length).toBe(5) + }) +}) From 0c8c868388f19dadd456482c27b83aa015f50a9a Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 00:00:46 +0200 Subject: [PATCH 122/163] feat: add workWeek unit --- packages/time/src/calendar/groupDaysBy.ts | 142 ++++++++++-------- packages/time/src/core/calendar.ts | 3 +- packages/time/src/tests/calendar-core.test.ts | 41 ++--- 3 files changed, 100 insertions(+), 86 deletions(-) diff --git a/packages/time/src/calendar/groupDaysBy.ts b/packages/time/src/calendar/groupDaysBy.ts index 582eeba0..b739c344 100644 --- a/packages/time/src/calendar/groupDaysBy.ts +++ b/packages/time/src/calendar/groupDaysBy.ts @@ -1,28 +1,29 @@ -import { Temporal } from '@js-temporal/polyfill' -import type { Day, Event, Resource } from './types' +import { Temporal } from '@js-temporal/polyfill'; +import type { Day, Event, Resource } from './types'; interface GroupDaysByBaseProps< TResource extends Resource, TEvent extends Event = Event, > { - days: (Day | null)[] - weekStartsOn: number + days: (Day | null)[]; + weekStartsOn: number; + locale: string; } type GroupDaysByMonthProps< TResource extends Resource, TEvent extends Event = Event, > = GroupDaysByBaseProps & { - unit: 'month' - fillMissingDays?: never + unit: 'month'; + fillMissingDays?: never; } type GroupDaysByWeekProps< TResource extends Resource, TEvent extends Event = Event, > = GroupDaysByBaseProps & { - unit: 'week' | 'workWeek' - fillMissingDays?: boolean + unit: 'week' | 'workWeek'; + fillMissingDays?: boolean; } export type GroupDaysByProps< @@ -30,7 +31,7 @@ export type GroupDaysByProps< TEvent extends Event = Event, > = | GroupDaysByMonthProps - | GroupDaysByWeekProps + | GroupDaysByWeekProps; export const groupDaysBy = < TResource extends Resource, @@ -40,39 +41,42 @@ export const groupDaysBy = < unit, fillMissingDays = true, weekStartsOn, + locale, }: GroupDaysByProps): (Day< TResource, TEvent > | null)[][] => { - const groups: (Day | null)[][] = [] + const groups: (Day | null)[][] = []; + const loc = new Intl.Locale(locale); + const { weekend } = loc.getWeekInfo(); switch (unit) { case 'month': { - let currentMonth: (Day | null)[] = [] + let currentMonth: (Day | null)[] = []; days.forEach((day) => { if ( currentMonth.length > 0 && day?.date.month !== currentMonth[0]?.date.month ) { - groups.push(currentMonth) - currentMonth = [] + groups.push(currentMonth); + currentMonth = []; } - currentMonth.push(day) - }) + currentMonth.push(day); + }); if (currentMonth.length > 0) { - groups.push(currentMonth) + groups.push(currentMonth); } - break + break; } case 'week': { - const weeks: (Day | null)[][] = [] - let currentWeek: (Day | null)[] = [] + const weeks: (Day | null)[][] = []; + let currentWeek: (Day | null)[] = []; days.forEach((day) => { if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; for (let i = 0; i < dayOfWeek; i++) { currentWeek.push( fillMissingDays @@ -83,22 +87,22 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ) + ); } } } - currentWeek.push(day) + currentWeek.push(day); if (currentWeek.length === 7) { - weeks.push(currentWeek) - currentWeek = [] + weeks.push(currentWeek); + currentWeek = []; } - }) + }); if (currentWeek.length > 0) { while (currentWeek.length < 7) { const lastDate = currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01') + Temporal.PlainDate.from('2024-01-01'); currentWeek.push( fillMissingDays ? { @@ -108,69 +112,75 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ) + ); } - weeks.push(currentWeek) + weeks.push(currentWeek); } - return weeks + return weeks; } case 'workWeek': { - const workWeeks: (Day | null)[][] = [] - let currentWorkWeek: (Day | null)[] = [] + const workWeeks: (Day | null)[][] = []; + let currentWorkWeek: (Day | null)[] = []; days.forEach((day) => { - if ( - currentWorkWeek.length === 0 && - day?.date.dayOfWeek !== weekStartsOn - ) { + if (currentWorkWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; for (let i = 0; i < dayOfWeek; i++) { - currentWorkWeek.push( - fillMissingDays - ? { - date: day.date.subtract({ days: dayOfWeek - i }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } - : null, - ) + const newDay = day.date.subtract({ days: dayOfWeek - i }); + if (!weekend.includes(newDay.dayOfWeek)) { + currentWorkWeek.push( + fillMissingDays + ? { + date: newDay, + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ); + } } } } - currentWorkWeek.push(day) + if (day && !weekend.includes(day.date.dayOfWeek)) { + currentWorkWeek.push(day); + } if (currentWorkWeek.length === 5) { - workWeeks.push(currentWorkWeek) - currentWorkWeek = [] + workWeeks.push(currentWorkWeek); + currentWorkWeek = []; } - }) + }); if (currentWorkWeek.length > 0) { while (currentWorkWeek.length < 5) { const lastDate = currentWorkWeek[currentWorkWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01') - currentWorkWeek.push( - fillMissingDays - ? { - date: lastDate.add({ days: 1 }), - events: [], - isToday: false, - isInCurrentPeriod: false, - } - : null, - ) + Temporal.PlainDate.from('2024-01-01'); + const nextDate = lastDate.add({ days: 1 }); + if (!weekend.includes(nextDate.dayOfWeek)) { + currentWorkWeek.push( + fillMissingDays + ? { + date: nextDate, + events: [], + isToday: false, + isInCurrentPeriod: false, + } + : null, + ); + } } - workWeeks.push(currentWorkWeek) + workWeeks.push(currentWorkWeek); } - return workWeeks + return workWeeks; } + default: - break + break; } - return groups -} + return groups; +}; diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index a274a7e1..cf6553aa 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -413,12 +413,13 @@ export class CalendarCore< days, unit, fillMissingDays = true, - }: Omit, 'weekStartsOn'>) { + }: Omit, 'weekStartsOn' | 'locale'>) { return groupDaysBy({ days, unit, fillMissingDays, weekStartsOn: this.getFirstDayOfWeek().dayOfWeek, + locale: this.options.locale, } as GroupDaysByProps) } } diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 1ab82e8b..55780207 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -6,8 +6,8 @@ import type { CalendarCoreOptions, Event } from '../core/calendar' describe('CalendarCore', () => { let options: CalendarCoreOptions> let calendarCore: CalendarCore> - const mockDate = Temporal.PlainDate.from('2023-06-15') - const mockDateTime = Temporal.PlainDateTime.from('2023-06-15T10:00') + const mockDate = Temporal.PlainDate.from('2024-06-15') + const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00') const mockTimeZone = 'America/New_York' beforeEach(() => { @@ -16,7 +16,7 @@ describe('CalendarCore', () => { vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue( Temporal.ZonedDateTime.from({ timeZone: mockTimeZone, - year: 2023, + year: 2024, month: 6, day: 15, hour: 10, @@ -27,7 +27,7 @@ describe('CalendarCore', () => { vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue( Temporal.ZonedDateTime.from({ timeZone: mockTimeZone, - year: 2023, + year: 2024, month: 6, day: 15, hour: 10, @@ -41,20 +41,20 @@ describe('CalendarCore', () => { events: [ { id: '1', - start: Temporal.PlainDateTime.from('2023-06-10T09:00'), - end: Temporal.PlainDateTime.from('2023-06-10T10:00'), + start: Temporal.PlainDateTime.from('2024-06-10T09:00'), + end: Temporal.PlainDateTime.from('2024-06-10T10:00'), title: 'Event 1', }, { id: '2', - start: Temporal.PlainDateTime.from('2023-06-12T11:00'), - end: Temporal.PlainDateTime.from('2023-06-12T12:00'), + start: Temporal.PlainDateTime.from('2024-06-12T11:00'), + end: Temporal.PlainDateTime.from('2024-06-12T12:00'), title: 'Event 2', }, { id: '3', - start: Temporal.PlainDateTime.from('2023-06-12T11:00'), - end: Temporal.PlainDateTime.from('2023-06-12T13:00'), + start: Temporal.PlainDateTime.from('2024-06-12T11:00'), + end: Temporal.PlainDateTime.from('2024-06-12T13:00'), title: 'Event 3', }, ], @@ -77,10 +77,10 @@ describe('CalendarCore', () => { test('should correctly map events to days', () => { const daysWithEvents = calendarCore.getDaysWithEvents() const dayWithEvent1 = daysWithEvents.find((day) => - day.date.equals(Temporal.PlainDate.from('2023-06-10')), + day.date.equals(Temporal.PlainDate.from('2024-06-10')), ) const dayWithEvent2 = daysWithEvents.find((day) => - day.date.equals(Temporal.PlainDate.from('2023-06-12')), + day.date.equals(Temporal.PlainDate.from('2024-06-12')), ) expect(dayWithEvent1?.events).toHaveLength(1) expect(dayWithEvent1?.events[0]?.id).toBe('1') @@ -122,7 +122,7 @@ describe('CalendarCore', () => { }) test('should go to specific period correctly', () => { - const specificDate = Temporal.PlainDate.from('2023-07-01') + const specificDate = Temporal.PlainDate.from('2024-07-01') calendarCore.goToSpecificPeriod(specificDate) expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) expect(calendarCore.store.state.activeDate).toEqual(specificDate) @@ -185,7 +185,7 @@ describe('CalendarCore', () => { const currentPeriodDays = daysWithEvents.filter( (day) => day.isInCurrentPeriod, ) - expect(currentPeriodDays).toHaveLength(30) // Assuming a 30-day month + expect(currentPeriodDays).toHaveLength(30) }) test('should return the correct day names based on the locale', () => { @@ -209,8 +209,8 @@ describe('CalendarCore', () => { }) expect(weeks).toHaveLength(5) - expect(weeks[0]?.[0]?.date.toString()).toBe('2023-05-28') - expect(weeks[4]?.[6]?.date.toString()).toBe('2023-07-01') + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-28') + expect(weeks[4]?.[6]?.date.toString()).toBe('2024-07-01') }) test('should group days by months correctly', () => { @@ -220,7 +220,7 @@ describe('CalendarCore', () => { unit: 'month', }) expect(months).toHaveLength(1) - expect(months[0]?.[0]?.date.toString()).toBe('2023-06-01') + expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01') }) test('should change view mode to workWeek correctly', () => { @@ -233,7 +233,7 @@ describe('CalendarCore', () => { calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) const initialPeriod = calendarCore.store.state.currentPeriod calendarCore.goToPreviousPeriod() - const expectedPreviousWorkWeek = initialPeriod.subtract({ days: 5 }) + const expectedPreviousWorkWeek = initialPeriod.subtract({ days: 7 }) expect(calendarCore.store.state.currentPeriod).toEqual( expectedPreviousWorkWeek, ) @@ -246,12 +246,13 @@ describe('CalendarCore', () => { calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) const initialPeriod = calendarCore.store.state.currentPeriod calendarCore.goToNextPeriod() - const expectedNextWorkWeek = initialPeriod.add({ days: 5 }) + const expectedNextWorkWeek = initialPeriod.add({ days: 7 }) expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextWorkWeek) expect(calendarCore.store.state.activeDate).toEqual(expectedNextWorkWeek) }) test('should group days by workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) const daysWithEvents = calendarCore.getDaysWithEvents() const workWeeks = calendarCore.groupDaysBy({ days: daysWithEvents, @@ -260,5 +261,7 @@ describe('CalendarCore', () => { expect(workWeeks.length).toBeGreaterThan(0) expect(workWeeks[0]?.length).toBe(5) + expect(workWeeks[0]?.[0]?.date.toString()).toBe('2024-06-10[u-ca=gregory]') + expect(workWeeks[0]?.[4]?.date.toString()).toBe('2024-06-14[u-ca=gregory]') }) }) From 4b7ea40bb7f1e58b57f6c8246f30c5ea7735af99 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 00:24:31 +0200 Subject: [PATCH 123/163] test: tests reorganisation --- packages/time/src/tests/calendar-core.test.ts | 366 ++++++++++-------- 1 file changed, 203 insertions(+), 163 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 55780207..4f6a81e3 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -63,205 +63,245 @@ describe('CalendarCore', () => { calendarCore = new CalendarCore(options) }) - test('should initialize with the correct current period', () => { - const today = Temporal.Now.plainDateISO() - expect(calendarCore.store.state.currentPeriod).toEqual(today) - expect(calendarCore.store.state.activeDate).toEqual(today) - }) + describe('Initialization', () => { + test('should initialize with the correct current period', () => { + const today = Temporal.Now.plainDateISO() + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) - test('should get the correct days with events for the month', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - expect(daysWithEvents.length).toBeGreaterThan(0) - }) + test('should initialize with the correct time zone', () => { + expect(calendarCore.options.timeZone).toBe(mockTimeZone) + }) - test('should correctly map events to days', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - const dayWithEvent1 = daysWithEvents.find((day) => - day.date.equals(Temporal.PlainDate.from('2024-06-10')), - ) - const dayWithEvent2 = daysWithEvents.find((day) => - day.date.equals(Temporal.PlainDate.from('2024-06-12')), - ) - expect(dayWithEvent1?.events).toHaveLength(1) - expect(dayWithEvent1?.events[0]?.id).toBe('1') - expect(dayWithEvent2?.events).toHaveLength(2) - expect(dayWithEvent2?.events[0]?.id).toBe('2') - expect(dayWithEvent2?.events[1]?.id).toBe('3') - }) + test('should respect custom calendar', () => { + const customCalendar = 'islamic-civil' + options.calendar = customCalendar + calendarCore = new CalendarCore(options) - test('should change view mode correctly', () => { - calendarCore.changeViewMode({ value: 2, unit: 'week' }) - expect(calendarCore.store.state.viewMode.value).toBe(2) - expect(calendarCore.store.state.viewMode.unit).toBe('week') + const today = Temporal.Now.plainDateISO(customCalendar) + expect(calendarCore.store.state.currentPeriod.calendarId).toBe( + customCalendar, + ) + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) + }) }) - test('should go to previous period correctly', () => { - const initialPeriod = calendarCore.store.state.currentPeriod - calendarCore.goToPreviousPeriod() - const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }) - expect(calendarCore.store.state.currentPeriod).toEqual( - expectedPreviousMonth, - ) - expect(calendarCore.store.state.activeDate).toEqual(expectedPreviousMonth) - }) + describe('Event mapping', () => { + test('should get the correct days with events for the month', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + expect(daysWithEvents.length).toBeGreaterThan(0) + }) - test('should go to next period correctly', () => { - const initialPeriod = calendarCore.store.state.currentPeriod - calendarCore.goToNextPeriod() - const expectedNextMonth = initialPeriod.add({ months: 1 }) - expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth) - expect(calendarCore.store.state.activeDate).toEqual(expectedNextMonth) - }) + test('should correctly map events to days', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + const dayWithEvent1 = daysWithEvents.find((day) => + day.date.equals(Temporal.PlainDate.from('2024-06-10')), + ) + const dayWithEvent2 = daysWithEvents.find((day) => + day.date.equals(Temporal.PlainDate.from('2024-06-12')), + ) + expect(dayWithEvent1?.events).toHaveLength(1) + expect(dayWithEvent1?.events[0]?.id).toBe('1') + expect(dayWithEvent2?.events).toHaveLength(2) + expect(dayWithEvent2?.events[0]?.id).toBe('2') + expect(dayWithEvent2?.events[1]?.id).toBe('3') + }) - test('should go to current period correctly', () => { - calendarCore.goToNextPeriod() - calendarCore.goToCurrentPeriod() - const today = Temporal.Now.plainDateISO() - expect(calendarCore.store.state.currentPeriod).toEqual(today) - expect(calendarCore.store.state.activeDate).toEqual(today) - }) + test('should return the correct props for an event', () => { + const eventProps = calendarCore.getEventProps('1') + expect(eventProps).toEqual({ + eventHeightInMinutes: 60, + isSplitEvent: false, + overlappingEvents: [], + }) + }) - test('should go to specific period correctly', () => { - const specificDate = Temporal.PlainDate.from('2024-07-01') - calendarCore.goToSpecificPeriod(specificDate) - expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) - expect(calendarCore.store.state.activeDate).toEqual(specificDate) - }) + test('should return the correct props for overlapping events', () => { + const event1Props = calendarCore.getEventProps('2') + const event2Props = calendarCore.getEventProps('3') - test('should group days correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - const groupedDays = calendarCore.groupDaysBy({ - days: daysWithEvents, - unit: 'month', + expect(event1Props).toEqual({ + eventHeightInMinutes: 60, + isSplitEvent: false, + overlappingEvents: [options.events![2]], + }) + + expect(event2Props).toEqual({ + eventHeightInMinutes: 120, + isSplitEvent: false, + overlappingEvents: [options.events![1]], + }) }) - expect(groupedDays.length).toBeGreaterThan(0) }) - test('should initialize with the correct time zone', () => { - expect(calendarCore.options.timeZone).toBe(mockTimeZone) + describe('View mode', () => { + test('should change view mode correctly', () => { + calendarCore.changeViewMode({ value: 2, unit: 'week' }) + expect(calendarCore.store.state.viewMode.value).toBe(2) + expect(calendarCore.store.state.viewMode.unit).toBe('week') + }) + + test('should change view mode to workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + expect(calendarCore.store.state.viewMode.value).toBe(1) + expect(calendarCore.store.state.viewMode.unit).toBe('workWeek') + }) }) - test('should respect custom calendar', () => { - const customCalendar = 'islamic-civil' - options.calendar = customCalendar - calendarCore = new CalendarCore(options) + describe('Navigation', () => { + test('should go to previous period correctly', () => { + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToPreviousPeriod() + const expectedPreviousMonth = initialPeriod.subtract({ months: 1 }) + expect(calendarCore.store.state.currentPeriod).toEqual( + expectedPreviousMonth, + ) + expect(calendarCore.store.state.activeDate).toEqual(expectedPreviousMonth) + }) - const today = Temporal.Now.plainDateISO(customCalendar) - expect(calendarCore.store.state.currentPeriod.calendarId).toBe( - customCalendar, - ) - expect(calendarCore.store.state.currentPeriod).toEqual(today) - expect(calendarCore.store.state.activeDate).toEqual(today) - }) + test('should go to next period correctly', () => { + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToNextPeriod() + const expectedNextMonth = initialPeriod.add({ months: 1 }) + expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextMonth) + expect(calendarCore.store.state.activeDate).toEqual(expectedNextMonth) + }) - test('should return the correct props for an event', () => { - const eventProps = calendarCore.getEventProps('1') - expect(eventProps).toEqual({ - eventHeightInMinutes: 60, - isSplitEvent: false, - overlappingEvents: [], + test('should go to current period correctly', () => { + calendarCore.goToNextPeriod() + calendarCore.goToCurrentPeriod() + const today = Temporal.Now.plainDateISO() + expect(calendarCore.store.state.currentPeriod).toEqual(today) + expect(calendarCore.store.state.activeDate).toEqual(today) }) - }) - test('should return the correct props for overlapping events', () => { - const event1Props = calendarCore.getEventProps('2') - const event2Props = calendarCore.getEventProps('3') + test('should go to specific period correctly', () => { + const specificDate = Temporal.PlainDate.from('2024-07-01') + calendarCore.goToSpecificPeriod(specificDate) + expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) + expect(calendarCore.store.state.activeDate).toEqual(specificDate) + }) - expect(event1Props).toEqual({ - eventHeightInMinutes: 60, - isSplitEvent: false, - overlappingEvents: [options.events![2]], + test('should go to previous workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToPreviousPeriod() + const expectedPreviousWorkWeek = initialPeriod.subtract({ days: 7 }) + expect(calendarCore.store.state.currentPeriod).toEqual( + expectedPreviousWorkWeek, + ) + expect(calendarCore.store.state.activeDate).toEqual( + expectedPreviousWorkWeek, + ) }) - expect(event2Props).toEqual({ - eventHeightInMinutes: 120, - isSplitEvent: false, - overlappingEvents: [options.events![1]], + test('should go to next workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + const initialPeriod = calendarCore.store.state.currentPeriod + calendarCore.goToNextPeriod() + const expectedNextWorkWeek = initialPeriod.add({ days: 7 }) + expect(calendarCore.store.state.currentPeriod).toEqual( + expectedNextWorkWeek, + ) + expect(calendarCore.store.state.activeDate).toEqual(expectedNextWorkWeek) }) }) - test('should correctly mark days as in current period', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - const currentPeriodDays = daysWithEvents.filter( - (day) => day.isInCurrentPeriod, - ) - expect(currentPeriodDays).toHaveLength(30) - }) + describe('Days grouping', () => { + test('should group days correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + const groupedDays = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'month', + }) + expect(groupedDays.length).toBeGreaterThan(0) + }) - test('should return the correct day names based on the locale', () => { - const daysNames = calendarCore.getDaysNames('short') - expect(daysNames).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']) - }) + test('should group days by weeks correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + const weeks = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'week', + }) - test('should reset to the current period correctly', () => { - calendarCore.goToNextPeriod() - calendarCore.goToCurrentPeriod() - const today = Temporal.Now.plainDateISO() - expect(calendarCore.store.state.currentPeriod).toEqual(today) - expect(calendarCore.store.state.activeDate).toEqual(today) - }) + expect(weeks).toHaveLength(6) + expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-26') + expect(weeks[5]?.[6]?.date.toString()).toBe('2024-07-06') + }) - test('should group days by weeks correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - const weeks = calendarCore.groupDaysBy({ - days: daysWithEvents, - unit: 'week', + test('should group days by months correctly', () => { + const daysWithEvents = calendarCore.getDaysWithEvents() + const months = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'month', + }) + expect(months).toHaveLength(1) + expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01') }) - expect(weeks).toHaveLength(5) - expect(weeks[0]?.[0]?.date.toString()).toBe('2024-05-28') - expect(weeks[4]?.[6]?.date.toString()).toBe('2024-07-01') - }) + test('should group days by workWeek correctly', () => { + calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) + const daysWithEvents = calendarCore.getDaysWithEvents() + const workWeeks = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'workWeek', + }) - test('should group days by months correctly', () => { - const daysWithEvents = calendarCore.getDaysWithEvents() - const months = calendarCore.groupDaysBy({ - days: daysWithEvents, - unit: 'month', + expect(workWeeks.length).toBeGreaterThan(0) + expect(workWeeks[0]?.length).toBe(5) + expect(workWeeks[0]?.[0]?.date.toString()).toBe( + '2024-06-10[u-ca=gregory]', + ) + expect(workWeeks[0]?.[4]?.date.toString()).toBe( + '2024-06-14[u-ca=gregory]', + ) }) - expect(months).toHaveLength(1) - expect(months[0]?.[0]?.date.toString()).toBe('2024-06-01') - }) - - test('should change view mode to workWeek correctly', () => { - calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) - expect(calendarCore.store.state.viewMode.value).toBe(1) - expect(calendarCore.store.state.viewMode.unit).toBe('workWeek') - }) - test('should go to previous workWeek correctly', () => { - calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) - const initialPeriod = calendarCore.store.state.currentPeriod - calendarCore.goToPreviousPeriod() - const expectedPreviousWorkWeek = initialPeriod.subtract({ days: 7 }) - expect(calendarCore.store.state.currentPeriod).toEqual( - expectedPreviousWorkWeek, - ) - expect(calendarCore.store.state.activeDate).toEqual( - expectedPreviousWorkWeek, - ) - }) + test('should group days by workWeek correctly with custom locale', () => { + const customLocale = 'pl' + calendarCore = new CalendarCore({ ...options, locale: customLocale }) + const daysWithEvents = calendarCore.getDaysWithEvents() + const workWeeks = calendarCore.groupDaysBy({ + days: daysWithEvents, + unit: 'workWeek', + }) - test('should go to next workWeek correctly', () => { - calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) - const initialPeriod = calendarCore.store.state.currentPeriod - calendarCore.goToNextPeriod() - const expectedNextWorkWeek = initialPeriod.add({ days: 7 }) - expect(calendarCore.store.state.currentPeriod).toEqual(expectedNextWorkWeek) - expect(calendarCore.store.state.activeDate).toEqual(expectedNextWorkWeek) + expect(workWeeks.length).toBeGreaterThan(0) + expect(workWeeks[0]?.length).toBe(5) + expect(workWeeks[0]?.[0]?.date.toString()).toBe('2024-05-27') + expect(workWeeks[0]?.[4]?.date.toString()).toBe('2024-05-31') + }) }) - test('should group days by workWeek correctly', () => { - calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) - const daysWithEvents = calendarCore.getDaysWithEvents() - const workWeeks = calendarCore.groupDaysBy({ - days: daysWithEvents, - unit: 'workWeek', + describe('Locale and timezone', () => { + test('should return the correct day names based on default locale', () => { + const daysNames = calendarCore.getDaysNames('short') + expect(daysNames).toEqual([ + 'Sun', + 'Mon', + 'Tue', + 'Wed', + 'Thu', + 'Fri', + 'Sat', + ]) }) - expect(workWeeks.length).toBeGreaterThan(0) - expect(workWeeks[0]?.length).toBe(5) - expect(workWeeks[0]?.[0]?.date.toString()).toBe('2024-06-10[u-ca=gregory]') - expect(workWeeks[0]?.[4]?.date.toString()).toBe('2024-06-14[u-ca=gregory]') + test('should return the correct day names based on custom locale', () => { + const customLocale = 'pl' + calendarCore = new CalendarCore({ ...options, locale: customLocale }) + const customDaysNames = calendarCore.getDaysNames('short') + expect(customDaysNames).toEqual([ + 'pon.', + 'wt.', + 'śr.', + 'czw.', + 'pt.', + 'sob.', + 'niedz.', + ]) + }) }) }) From d54434818b03351ab0b13d10b67c8407818e0ec6 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 23:02:21 +0200 Subject: [PATCH 124/163] chore: add the get-week-info-polyfill --- packages/time/package.json | 1 + packages/time/src/core/calendar.ts | 2 +- .../time/src/core/weekInfoPolyfill/index.ts | 1 - .../src/core/weekInfoPolyfill/weekInfoData.ts | 1832 ----------------- .../core/weekInfoPolyfill/weekInfoPolyfill.ts | 41 - pnpm-lock.yaml | 7 + 6 files changed, 9 insertions(+), 1875 deletions(-) delete mode 100644 packages/time/src/core/weekInfoPolyfill/index.ts delete mode 100644 packages/time/src/core/weekInfoPolyfill/weekInfoData.ts delete mode 100644 packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts diff --git a/packages/time/package.json b/packages/time/package.json index 44f58127..ac995da1 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,6 +57,7 @@ "src" ], "dependencies": { + "@bart-krakowski/get-week-info-polyfill": "^1.0.2", "@js-temporal/polyfill": "^0.4.4", "@tanstack/store": "^0.4.1" }, diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index cf6553aa..242dff06 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -9,7 +9,7 @@ import { getDateDefaults } from '../utils/dateDefaults' import type { GroupDaysByProps } from '../calendar/groupDaysBy' import type { CalendarStore, Day, Event, Resource } from '../calendar/types' -import './weekInfoPolyfill' +import '@bart-krakowski/get-week-info-polyfill' export type * from '../calendar/types' diff --git a/packages/time/src/core/weekInfoPolyfill/index.ts b/packages/time/src/core/weekInfoPolyfill/index.ts deleted file mode 100644 index 92eafb31..00000000 --- a/packages/time/src/core/weekInfoPolyfill/index.ts +++ /dev/null @@ -1 +0,0 @@ -import './weekInfoPolyfill' diff --git a/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts b/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts deleted file mode 100644 index 26c82058..00000000 --- a/packages/time/src/core/weekInfoPolyfill/weekInfoData.ts +++ /dev/null @@ -1,1832 +0,0 @@ -export const weekInfoData: Record = { - af: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ak: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - am: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ar: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - as: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - asa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - az: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - be: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bem: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bez: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - my: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ca: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tzm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - chr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cgg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zh: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cs: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - da: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ebu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - en: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - eo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - et: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ee: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fil: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ff: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ka: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - de: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - el: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - guz: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ha: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - haw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - he: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - hu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - is: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ig: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - id: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ga: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - it: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ja: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kea: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kab: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kln: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kam: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - km: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ki: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kok: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ko: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - khq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ses: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lag: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - lt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - luy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - jmc: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - kde: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ms: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ml: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mas: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mer: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - mfe: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - naq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ne: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nd: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nb: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - nyn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - or: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - om: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ps: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - fa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pt: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - pa: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ro: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rm: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rof: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ru: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - rwk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - saq: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sg: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - seh: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sn: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ii: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - si: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sl: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - xog: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - so: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - es: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - sv: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - gsw: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - shi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - dav: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ta: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - te: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - teo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - th: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - bo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ti: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - to: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - tr: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uk: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - ur: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - uz: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - vi: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - vun: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - cy: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - yo: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - zu: { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'af-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'am-ET': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-AE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-BH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-DZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-EG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-IQ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-JO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-KW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-LB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-LY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-MA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'arn-CL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-OM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-QA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SD': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-SY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-TN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ar-YE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'as-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-az': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-Cyrl-AZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'az-Latn-AZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ba-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'be-BY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bg-BG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bn-BD': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bn-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bo-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'br-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bs-Cyrl-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'bs-Latn-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ca-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'co-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'cs-CZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'cy-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'da-DK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-AT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-LI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'de-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'dsb-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'dv-MV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'el-CY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'el-GR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-029': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-AU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-BZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-cb': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-IE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-JM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-MT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-MY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-NZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-PH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-SG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-TT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-US': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'en-ZW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-AR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-BO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-CR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-DO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-EC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-GT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-HN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-MX': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-NI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-PY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-SV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-US': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-UY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'es-VE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'et-EE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'eu-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fa-IR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fi-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fil-PH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fo-FO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-BE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fr-MC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'fy-NL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ga-IE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gd-GB': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gd-ie': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gl-ES': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gsw-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'gu-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ha-Latn-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'he-IL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hi-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hr-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hr-HR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hsb-DE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hu-HU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'hy-AM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'id-ID': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ig-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ii-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'in-ID': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'is-IS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'it-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'it-IT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iu-Cans-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iu-Latn-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'iw-IL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ja-JP': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ka-GE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kk-KZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kl-GL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'km-KH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kn-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'kok-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ko-KR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ky-KG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lb-LU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lo-LA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lt-LT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'lv-LV': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mi-NZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mk-MK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ml-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mn-MN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mn-Mong-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'moh-CA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mr-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ms-BN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ms-MY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'mt-MT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nb-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ne-NP': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nl-BE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nl-NL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nn-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'no-no': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'nso-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'oc-FR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'or-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pa-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pl-PL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'prs-AF': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ps-AF': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pt-BR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'pt-PT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'qut-GT': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-BO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-EC': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'quz-PE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'rm-CH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ro-mo': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ro-RO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ru-mo': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ru-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'rw-RW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sah-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sa-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'se-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'si-LK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sk-SK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sl-SI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sma-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sma-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smj-NO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smj-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'smn-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sms-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sq-AL': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Cyrl-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-BA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-CS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-Latn-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-ME': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-RS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sr-sp': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sv-FI': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sv-SE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'sw-KE': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'syr-SY': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ta-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'te-IN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tg-Cyrl-TJ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'th-TH': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tk-TM': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tlh-QS': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tn-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tr-TR': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tt-RU': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'tzm-Latn-DZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ug-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uk-UA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'ur-PK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-Cyrl-UZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-Latn-UZ': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'uz-uz': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'vi-VN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'wo-SN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'xh-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'yo-NG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-CN': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-HK': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-MO': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-SG': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zh-TW': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, - 'zu-ZA': { - firstDay: 1, - weekend: [6, 7], - minimalDays: 4, - }, -} \ No newline at end of file diff --git a/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts b/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts deleted file mode 100644 index a722d0ad..00000000 --- a/packages/time/src/core/weekInfoPolyfill/weekInfoPolyfill.ts +++ /dev/null @@ -1,41 +0,0 @@ -interface WeekInfo { - firstDay: number - weekend: number[] - minimalDays: number -} - -// eslint-disable-next-line @typescript-eslint/no-namespace -declare namespace Intl { - interface Locale { - getWeekInfo: () => WeekInfo - weekInfo?: WeekInfo - } -} - -;(function () { - // Chrome & Safari - if ('weekInfo' in Intl.Locale.prototype && typeof Intl.Locale.prototype.getWeekInfo !== 'function') { - Intl.Locale.prototype.getWeekInfo = function () { - return this.weekInfo - } - } - // Firefox - if (typeof Intl.Locale.prototype.getWeekInfo !== 'function') { - import('./weekInfoData').then(({ weekInfoData }) => { - Intl.Locale.prototype.getWeekInfo = function () { - const locale = this.toString().toLowerCase() - - const match = - weekInfoData[locale] || - weekInfoData[locale.split('-')[0]] || - weekInfoData['default'] - - return { - firstDay: match?.firstDay, - weekend: match?.weekend, - minimalDays: match?.minimalDays, - } - } - }) - } -})() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 626d76f8..92cea18e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,6 +194,9 @@ importers: packages/time: dependencies: + '@bart-krakowski/get-week-info-polyfill': + specifier: ^1.0.2 + version: 1.0.2 '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 @@ -1840,6 +1843,10 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@bart-krakowski/get-week-info-polyfill@1.0.2: + resolution: {integrity: sha512-wqDBdZBzs3H6PmeXtasxA52Ls980AS2g31TCy6xEUyuURXVuVAWRrPh4d3ptyvbwkQ3Nn7xFPj1Fjppf6sOKhA==} + dev: false + /@commitlint/parse@18.6.1: resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} engines: {node: '>=v18'} From d0904831a8f65d6244109746bf7df88701948434 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 23:17:27 +0200 Subject: [PATCH 125/163] feat: getWeekInfo polyfill --- packages/time/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/time/package.json b/packages/time/package.json index ac995da1..d8c01d87 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,7 @@ "src" ], "dependencies": { - "@bart-krakowski/get-week-info-polyfill": "^1.0.2", + "@bart-krakowski/get-week-info-polyfill": "^1.0.3", "@js-temporal/polyfill": "^0.4.4", "@tanstack/store": "^0.4.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92cea18e..b175bf97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,8 +195,8 @@ importers: packages/time: dependencies: '@bart-krakowski/get-week-info-polyfill': - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.0.3 + version: 1.0.3 '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 @@ -1843,8 +1843,8 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@bart-krakowski/get-week-info-polyfill@1.0.2: - resolution: {integrity: sha512-wqDBdZBzs3H6PmeXtasxA52Ls980AS2g31TCy6xEUyuURXVuVAWRrPh4d3ptyvbwkQ3Nn7xFPj1Fjppf6sOKhA==} + /@bart-krakowski/get-week-info-polyfill@1.0.3: + resolution: {integrity: sha512-Rg3nnpR1WuVNtL0A+OxdQpzHfMRNQOezJcYPZQ1XR8VdiefZZw8ea0MMjhfu13pELwsMRxZmsbmGYX5rJTN5WQ==} dev: false /@commitlint/parse@18.6.1: From 178aa347b7d94c2a4f289821499d235abe9e37b7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 23:46:33 +0200 Subject: [PATCH 126/163] refactor: getEventProps --- packages/time/src/calendar/getEventProps.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts index 7e3c0d18..38aa2e99 100644 --- a/packages/time/src/calendar/getEventProps.ts +++ b/packages/time/src/calendar/getEventProps.ts @@ -13,22 +13,6 @@ export const getEventProps = ( const eventEndDate = Temporal.ZonedDateTime.from(event.end); const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; - let eventHeightInMinutes; - - if (isSplitEvent) { - const isStartPart = eventStartDate.hour !== 0 || eventStartDate.minute !== 0; - if (isStartPart) { - const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; - eventHeightInMinutes = 24 * 60 - eventTimeInMinutes; - } else { - eventHeightInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; - } - } else { - const eventTimeInMinutes = eventStartDate.hour * 60 + eventStartDate.minute; - const endTimeInMinutes = eventEndDate.hour * 60 + eventEndDate.minute; - eventHeightInMinutes = endTimeInMinutes - eventTimeInMinutes; - } - const overlappingEvents = [...eventMap.values()].flat().filter((e) => { const eStartDate = Temporal.ZonedDateTime.from(e.start); const eEndDate = Temporal.ZonedDateTime.from(e.end); @@ -47,7 +31,6 @@ export const getEventProps = ( if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { return { - eventHeightInMinutes, isSplitEvent, overlappingEvents, }; From 79fdfddf6a822ab2aa3c381ca220b2ae5eade2c9 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 3 Jul 2024 23:51:07 +0200 Subject: [PATCH 127/163] refactor: getEventProps --- packages/time/src/core/calendar.ts | 1 - packages/time/src/tests/calendar-core.test.ts | 3 --- 2 files changed, 4 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 242dff06..1925fc4e 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -68,7 +68,6 @@ interface CalendarActions< changeViewMode: (newViewMode: CalendarStore['viewMode']) => void /** Retrieves styling properties for a specific event, identified by ID. */ getEventProps: (id: Event['id']) => { - eventHeightInMinutes: number isSplitEvent: boolean overlappingEvents: TEvent[] } | null diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 4f6a81e3..a444cc73 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -112,7 +112,6 @@ describe('CalendarCore', () => { test('should return the correct props for an event', () => { const eventProps = calendarCore.getEventProps('1') expect(eventProps).toEqual({ - eventHeightInMinutes: 60, isSplitEvent: false, overlappingEvents: [], }) @@ -123,13 +122,11 @@ describe('CalendarCore', () => { const event2Props = calendarCore.getEventProps('3') expect(event1Props).toEqual({ - eventHeightInMinutes: 60, isSplitEvent: false, overlappingEvents: [options.events![2]], }) expect(event2Props).toEqual({ - eventHeightInMinutes: 120, isSplitEvent: false, overlappingEvents: [options.events![1]], }) From 20fb06d40037d8f3ea95f771f98f67f0963131f2 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 00:06:51 +0200 Subject: [PATCH 128/163] refactor: Update generateDateRange to accept string inputs --- packages/time/src/calendar/generateDateRange.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/time/src/calendar/generateDateRange.ts b/packages/time/src/calendar/generateDateRange.ts index ec73960d..7aeaaca7 100644 --- a/packages/time/src/calendar/generateDateRange.ts +++ b/packages/time/src/calendar/generateDateRange.ts @@ -1,12 +1,18 @@ import { Temporal } from '@js-temporal/polyfill' +import { validateDate } from '../utils/validateDate' export const generateDateRange = ( - start: Temporal.PlainDate, - end: Temporal.PlainDate, + start: string, + end: string, ): Temporal.PlainDate[] => { + validateDate({ date: start }) + validateDate({ date: end }) + + const startDate = Temporal.PlainDate.from(start) + const endDate = Temporal.PlainDate.from(end) const dates: Temporal.PlainDate[] = [] - let current = start - while (Temporal.PlainDate.compare(current, end) <= 0) { + let current = startDate + while (Temporal.PlainDate.compare(current, endDate) <= 0) { dates.push(current) current = current.add({ days: 1 }) } From 8ae1bcdf4c9f3507dfb16fdc992ada9d3bc279a6 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 10:43:02 +0200 Subject: [PATCH 129/163] chore: upgrade polyfill --- packages/time/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/time/package.json b/packages/time/package.json index d8c01d87..abf3fa5d 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,7 @@ "src" ], "dependencies": { - "@bart-krakowski/get-week-info-polyfill": "^1.0.3", + "@bart-krakowski/get-week-info-polyfill": "^1.0.4", "@js-temporal/polyfill": "^0.4.4", "@tanstack/store": "^0.4.1" }, From 0e974ac6466377647dbfb4edb0021031f7e6f552 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 13:16:22 +0200 Subject: [PATCH 130/163] fix: getEventProps --- packages/time/src/calendar/getEventProps.ts | 50 +++++++++++-------- packages/time/src/tests/calendar-core.test.ts | 2 + 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/packages/time/src/calendar/getEventProps.ts b/packages/time/src/calendar/getEventProps.ts index 38aa2e99..0aba95b1 100644 --- a/packages/time/src/calendar/getEventProps.ts +++ b/packages/time/src/calendar/getEventProps.ts @@ -1,40 +1,46 @@ -import { Temporal } from "@js-temporal/polyfill"; -import type { CalendarStore, Event } from "./types"; +import { Temporal } from '@js-temporal/polyfill' +import type { CalendarStore, Event } from './types' export const getEventProps = ( eventMap: Map, id: Event['id'], state: CalendarStore, ) => { - const event = [...eventMap.values()].flat().find((currEvent) => currEvent.id === id); - if (!event) return null; + const event = [...eventMap.values()] + .flat() + .find((currEvent) => currEvent.id === id) + if (!event) return null - const eventStartDate = Temporal.ZonedDateTime.from(event.start); - const eventEndDate = Temporal.ZonedDateTime.from(event.end); - const isSplitEvent = Temporal.PlainDate.compare(eventStartDate.toPlainDate(), eventEndDate.toPlainDate()) !== 0; + const eventStartDate = Temporal.ZonedDateTime.from(event.start) + const eventEndDate = Temporal.ZonedDateTime.from(event.end) + const isSplitEvent = + Temporal.PlainDate.compare( + eventStartDate.toPlainDate(), + eventEndDate.toPlainDate(), + ) !== 0 const overlappingEvents = [...eventMap.values()].flat().filter((e) => { - const eStartDate = Temporal.ZonedDateTime.from(e.start); - const eEndDate = Temporal.ZonedDateTime.from(e.end); + const eStartDate = Temporal.ZonedDateTime.from(e.start) + const eEndDate = Temporal.ZonedDateTime.from(e.end) return ( - (e.id !== id && - Temporal.ZonedDateTime.compare(eventStartDate, eStartDate) >= 0 && + e.id !== id && + ((Temporal.ZonedDateTime.compare(eventStartDate, eStartDate) >= 0 && Temporal.ZonedDateTime.compare(eventStartDate, eEndDate) <= 0) || - (Temporal.ZonedDateTime.compare(eventEndDate, eStartDate) >= 0 && - Temporal.ZonedDateTime.compare(eventEndDate, eEndDate) <= 0) || - (Temporal.ZonedDateTime.compare(eStartDate, eventStartDate) >= 0 && - Temporal.ZonedDateTime.compare(eStartDate, eventEndDate) <= 0) || - (Temporal.ZonedDateTime.compare(eEndDate, eventStartDate) >= 0 && - Temporal.ZonedDateTime.compare(eEndDate, eventEndDate) <= 0) - ); - }); + (Temporal.ZonedDateTime.compare(eventEndDate, eStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eventEndDate, eEndDate) <= 0) || + (Temporal.ZonedDateTime.compare(eStartDate, eventStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eStartDate, eventEndDate) <= 0) || + (Temporal.ZonedDateTime.compare(eEndDate, eventStartDate) >= 0 && + Temporal.ZonedDateTime.compare(eEndDate, eventEndDate) <= 0)) + ) + }) if (state.viewMode.unit === 'week' || state.viewMode.unit === 'day') { return { isSplitEvent, overlappingEvents, - }; + } } - return null; -}; \ No newline at end of file + return null +} diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index a444cc73..824dc4b5 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -110,6 +110,7 @@ describe('CalendarCore', () => { }) test('should return the correct props for an event', () => { + calendarCore.changeViewMode({ value: 1, unit: 'day' }) const eventProps = calendarCore.getEventProps('1') expect(eventProps).toEqual({ isSplitEvent: false, @@ -118,6 +119,7 @@ describe('CalendarCore', () => { }) test('should return the correct props for overlapping events', () => { + calendarCore.changeViewMode({ value: 1, unit: 'day' }) const event1Props = calendarCore.getEventProps('2') const event2Props = calendarCore.getEventProps('3') From 85c6a7708b1a694454a832892904b76d6c41ce47 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 13:22:03 +0200 Subject: [PATCH 131/163] fix: getEventProps --- packages/time/src/core/calendar.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 1925fc4e..d9c7d198 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -63,7 +63,7 @@ interface CalendarActions< /** Resets the view to the current period based on today's date. */ goToCurrentPeriod: () => void /** Navigates to a specific date. */ - goToSpecificPeriod: (date: Temporal.PlainDate) => void + goToSpecificPeriod: (date: string) => void /** Changes the current view mode of the calendar. */ changeViewMode: (newViewMode: CalendarStore['viewMode']) => void /** Retrieves styling properties for a specific event, identified by ID. */ @@ -90,7 +90,7 @@ interface CalendarState< /** An array of days, each potentially containing events. */ days: Array> /** The currently active date in the calendar. */ - activeDate: Temporal.PlainDate + activeDate: CalendarStore['activeDate'] } export interface CalendarApi< @@ -189,7 +189,7 @@ export class CalendarCore< } } - const allDays = generateDateRange(start, end) + const allDays = generateDateRange(start.toString(), end.toString()) const startMonthDate = this.store.state.currentPeriod.with({ day: 1 }) const endMonthDate = this.store.state.currentPeriod .add({ @@ -392,11 +392,11 @@ export class CalendarCore< })) } - goToSpecificPeriod(date: Temporal.PlainDate) { + goToSpecificPeriod(date: string) { this.store.setState((prev) => ({ ...prev, - activeDate: date, - currentPeriod: date, + activeDate: Temporal.PlainDate.from(date), + currentPeriod: Temporal.PlainDate.from(date), })) } From 72d43d4b58105cf0e9388ab9a1d94260b9d06220 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 14:01:45 +0200 Subject: [PATCH 132/163] refactor: update date inputs to accept string format --- .../time/src/calendar/splitMultiDayEvents.ts | 10 ++-------- packages/time/src/calendar/types.ts | 4 ++-- packages/time/src/core/calendar.ts | 16 +++++++--------- packages/time/src/tests/calendar-core.test.ts | 14 +++++++------- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 8aa58e6d..dd99059e 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -9,14 +9,8 @@ export const splitMultiDayEvents = < event: TEvent, timeZone: Temporal.TimeZoneLike, ): TEvent[] => { - const startDate = - event.start instanceof Temporal.PlainDateTime - ? event.start.toZonedDateTime(timeZone) - : event.start - const endDate = - event.end instanceof Temporal.PlainDateTime - ? event.end.toZonedDateTime(timeZone) - : event.end + const startDate = Temporal.PlainDateTime.from(event.start).toZonedDateTime(timeZone) + const endDate = Temporal.PlainDateTime.from(event.end).toZonedDateTime(timeZone) const events: TEvent[] = [] let currentDay = startDate diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 30c7b79d..5d7b8886 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -4,8 +4,8 @@ export type Resource = string | null export interface Event { id: string - start: Temporal.PlainDateTime | Temporal.ZonedDateTime - end: Temporal.PlainDateTime | Temporal.ZonedDateTime + start: string + end: string title: string resources?: TResource[] } diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index d9c7d198..102ed6d1 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -157,7 +157,7 @@ export class CalendarCore< }) : this.store.state.currentPeriod - let end + let end: Temporal.PlainDate switch (this.store.state.viewMode.unit) { case 'month': { const lastDayOfMonth = this.getFirstDayOfMonth() @@ -211,14 +211,12 @@ export class CalendarCore< private getEventMap() { const map = new Map() this.options.events?.forEach((event) => { - const eventStartDate = - event.start instanceof Temporal.PlainDateTime - ? event.start.toZonedDateTime(this.options.timeZone) - : event.start - const eventEndDate = - event.end instanceof Temporal.PlainDateTime - ? event.end.toZonedDateTime(this.options.timeZone) - : event.end + const eventStartDate = Temporal.PlainDateTime.from( + event.start, + ).toZonedDateTime(this.options.timeZone) + const eventEndDate = Temporal.PlainDateTime.from( + event.end, + ).toZonedDateTime(this.options.timeZone) if (Temporal.ZonedDateTime.compare(eventStartDate, eventEndDate) !== 0) { const splitEvents = splitMultiDayEvents( event, diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 824dc4b5..9def0f20 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -41,20 +41,20 @@ describe('CalendarCore', () => { events: [ { id: '1', - start: Temporal.PlainDateTime.from('2024-06-10T09:00'), - end: Temporal.PlainDateTime.from('2024-06-10T10:00'), + start: '2024-06-10T09:00', + end: '2024-06-10T10:00', title: 'Event 1', }, { id: '2', - start: Temporal.PlainDateTime.from('2024-06-12T11:00'), - end: Temporal.PlainDateTime.from('2024-06-12T12:00'), + start: '2024-06-12T11:00', + end: '2024-06-12T12:00', title: 'Event 2', }, { id: '3', - start: Temporal.PlainDateTime.from('2024-06-12T11:00'), - end: Temporal.PlainDateTime.from('2024-06-12T13:00'), + start: '2024-06-12T11:00', + end: '2024-06-12T13:00', title: 'Event 3', }, ], @@ -177,7 +177,7 @@ describe('CalendarCore', () => { }) test('should go to specific period correctly', () => { - const specificDate = Temporal.PlainDate.from('2024-07-01') + const specificDate = '2024-07-01' calendarCore.goToSpecificPeriod(specificDate) expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) expect(calendarCore.store.state.activeDate).toEqual(specificDate) From cbc21864c749831a22de27b116840accb36a60a1 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 4 Jul 2024 14:27:26 +0200 Subject: [PATCH 133/163] refactor: convert activeDate, currentPeriod to string in useCalendar --- packages/react-time/src/useCalendar/useCalendar.ts | 4 +++- packages/time/src/core/calendar.ts | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 82860361..23441b09 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -47,7 +47,9 @@ export const useCalendar = ((props) => calendarCore.getDaysNames(props), [calendarCore]) return { - ...state, + activeDate: state.activeDate.toString(), + currentPeriod: state.currentPeriod.toString(), + viewMode: state.viewMode, days: calendarCore.getDaysWithEvents(), getDaysNames, goToPreviousPeriod, diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 102ed6d1..4c17cc34 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -93,11 +93,15 @@ interface CalendarState< activeDate: CalendarStore['activeDate'] } +type ConvertTemporalToString = { + [K in keyof T]: T[K] extends Temporal.PlainDate ? string : T[K] +} + export interface CalendarApi< TResource extends Resource, TEvent extends Event, > extends CalendarActions, - CalendarState {} + ConvertTemporalToString> {} /** * Core functionality for a calendar system, managing the state and operations of the calendar, From 1f6048ecee2b373a08a41f59d7d4ccd03422c095 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 18 Jul 2024 23:16:53 +0200 Subject: [PATCH 134/163] refactor: startOf and endOf helpers --- .../8560fb4b2dbac6ca-turbo.log.2024-07-18 | 0 .../time/src/calendar/splitMultiDayEvents.ts | 8 +- packages/time/src/tests/endOf.test.ts | 47 ++++++++++++ packages/time/src/tests/startOf.test.ts | 49 ++++++++++++ packages/time/src/utils/endOf.ts | 72 +++++++++++++++--- packages/time/src/utils/startOf.ts | 74 ++++++++++++++++--- 6 files changed, 224 insertions(+), 26 deletions(-) create mode 100644 .turbo/daemon/8560fb4b2dbac6ca-turbo.log.2024-07-18 create mode 100644 packages/time/src/tests/endOf.test.ts create mode 100644 packages/time/src/tests/startOf.test.ts diff --git a/.turbo/daemon/8560fb4b2dbac6ca-turbo.log.2024-07-18 b/.turbo/daemon/8560fb4b2dbac6ca-turbo.log.2024-07-18 new file mode 100644 index 00000000..e69de29b diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index dd99059e..e59e6493 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -18,15 +18,15 @@ export const splitMultiDayEvents = < const eventStart = Temporal.PlainDateTime.compare(currentDay, startDate) === 0 ? startDate - : startOf(currentDay) + : startOf(currentDay, 'day') const eventEnd = - Temporal.PlainDateTime.compare(endDate, endOf(currentDay)) <= 0 + Temporal.PlainDateTime.compare(endDate, endOf(currentDay, 'day')) < 0 ? endDate - : endOf(currentDay) + : endOf(currentDay, 'day') events.push({ ...event, start: eventStart, end: eventEnd }) - currentDay = startOf(currentDay).add({ days: 1 }) + currentDay = startOf(currentDay, 'day').add({ days: 1 }) } return events diff --git a/packages/time/src/tests/endOf.test.ts b/packages/time/src/tests/endOf.test.ts new file mode 100644 index 00000000..a29b4d60 --- /dev/null +++ b/packages/time/src/tests/endOf.test.ts @@ -0,0 +1,47 @@ +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { endOf } from '../utils' + +describe('endOf', () => { + test('should get the end of the given day', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'day') + const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the end of the given week', () => { + const date = Temporal.ZonedDateTime.from('2023-07-13T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'week') + const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the end of the given month', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'month') + const expected = Temporal.ZonedDateTime.from('2023-07-31T23:59:59.999+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the end of the given year', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'year') + const expected = Temporal.ZonedDateTime.from('2023-12-31T23:59:59.999+00:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the end of the given work week', () => { + const date = Temporal.ZonedDateTime.from('2023-07-10T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'workWeek') + const expected = Temporal.ZonedDateTime.from('2023-07-14T23:59:59.999+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the end of the given decade', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = endOf(date, 'decade') + const expected = Temporal.ZonedDateTime.from('2029-12-31T23:59:59.999+00:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) +}) diff --git a/packages/time/src/tests/startOf.test.ts b/packages/time/src/tests/startOf.test.ts new file mode 100644 index 00000000..ca26f904 --- /dev/null +++ b/packages/time/src/tests/startOf.test.ts @@ -0,0 +1,49 @@ + +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { startOf } from '../utils' + +describe('startOf', () => { + test('should get the start of the given day', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'day') + const expected = Temporal.ZonedDateTime.from('2023-07-16T00:00:00.000+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the start of the given week', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'week') + const expected = Temporal.ZonedDateTime.from('2023-07-10T00:00:00.000+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the start of the given month', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'month') + const expected = Temporal.ZonedDateTime.from('2023-07-01T00:00:00.000+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the start of the given year', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'year') + console.log('result', result.toString()) + const expected = Temporal.ZonedDateTime.from('2023-01-01T00:00:00.000+00:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the start of the given work week', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'workWeek') + const expected = Temporal.ZonedDateTime.from('2023-07-10T00:00:00.000+01:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) + + test('should get the start of the given decade', () => { + const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const result = startOf(date, 'decade') + const expected = Temporal.ZonedDateTime.from('2020-01-01T00:00:00.000+00:00[Europe/London]') + expect(result.equals(expected)).toBe(true) + }) +}) diff --git a/packages/time/src/utils/endOf.ts b/packages/time/src/utils/endOf.ts index 4742df98..70bf48ca 100644 --- a/packages/time/src/utils/endOf.ts +++ b/packages/time/src/utils/endOf.ts @@ -1,15 +1,67 @@ import type { Temporal } from '@js-temporal/polyfill' /** - * Helper function to get the end of a given day. - * @param date - The date for which the end of the day is needed. - * @returns The end of the given day. + * Helper function to get the end of a given temporal unit. + * @param date {Temporal.ZonedDateTime} - The date for which the end of the unit is needed. + * @param unit {Unit} - The unit for which to find the end ('day', 'week', 'month', 'year', 'workWeek', 'decade'). + * @returns {Temporal.ZonedDateTime} The end of the given unit. */ -export const endOf = (date: Temporal.ZonedDateTime): Temporal.ZonedDateTime => { - return date.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }) +export const endOf = (date: Temporal.ZonedDateTime, unit: 'day' | 'week' | 'month' | 'year' | 'workWeek' | 'decade'): Temporal.ZonedDateTime => { + switch (unit) { + case 'day': + return date.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + case 'week': { + const endOfWeek = date.add({ days: 7 - date.dayOfWeek }).with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + return endOfWeek; + } + case 'month': { + const lastDayOfMonth = date.with({ day: 1 }).add({ months: 1 }).subtract({ days: 1 }); + return lastDayOfMonth.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + } + case 'year': { + const lastDayOfYear = date.with({ month: 12, day: 31 }); + return lastDayOfYear.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + } + case 'workWeek': { + const endOfWorkWeek = date.add({ days: 5 - date.dayOfWeek }).with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + return endOfWorkWeek; + } + case 'decade': { + const lastYearOfDecade = date.with({ year: date.year - (date.year % 10) + 9 }); + const lastDayOfDecade = lastYearOfDecade.with({ month: 12, day: 31 }); + return lastDayOfDecade.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + }); + } + default: + throw new Error(`Unsupported unit: ${unit}`); + } } diff --git a/packages/time/src/utils/startOf.ts b/packages/time/src/utils/startOf.ts index d5723e35..3cd6c871 100644 --- a/packages/time/src/utils/startOf.ts +++ b/packages/time/src/utils/startOf.ts @@ -1,17 +1,67 @@ import type { Temporal } from '@js-temporal/polyfill' /** - * Helper function to get the start of a given day. - * @param date - The date for which the start of the day is needed. - * @returns The start of the given day. + * Helper function to get the start of a given temporal unit. + * @param date {Temporal.ZonedDateTime} - The date for which the start of the unit is needed. + * @param unit {Unit} - The unit for which to find the start ('day', 'week', 'month', 'year', 'workWeek', 'decade'). + * @returns {Temporal.ZonedDateTime} The start of the given unit. */ -export const startOf = ( - date: Temporal.ZonedDateTime, -): Temporal.ZonedDateTime => { - return date.with({ - hour: 0, - minute: 0, - second: 0, - millisecond: 0, - }) +export const startOf = (date: Temporal.ZonedDateTime, unit: 'day' | 'week' | 'month' | 'year' | 'workWeek' | 'decade'): Temporal.ZonedDateTime => { + switch (unit) { + case 'day': + return date.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + case 'week': { + const startOfWeek = date.subtract({ days: date.dayOfWeek - 1 }).with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + return startOfWeek; + } + case 'month': { + const startOfMonth = date.with({ day: 1 }).with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + return startOfMonth; + } + case 'year': { + const startOfYear = date.with({ month: 1, day: 1 }).with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + return startOfYear; + } + case 'workWeek': { + const dayOfWeek = date.dayOfWeek; + const startOfWorkWeek = dayOfWeek === 1 ? date : date.subtract({ days: dayOfWeek - 1 }); + return startOfWorkWeek.with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + } + case 'decade': { + const startOfDecade = date.with({ year: date.year - (date.year % 10), month: 1, day: 1 }).with({ + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }); + return startOfDecade; + } + default: + throw new Error(`Unsupported unit: ${unit}`); + } } From 291cfb15ba5ed5b5effe0531f3a6a88bcba961e7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 18 Jul 2024 23:42:02 +0200 Subject: [PATCH 135/163] test: calendar core --- packages/time/src/tests/calendar-core.test.ts | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 9def0f20..7a1c132e 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -125,12 +125,34 @@ describe('CalendarCore', () => { expect(event1Props).toEqual({ isSplitEvent: false, - overlappingEvents: [options.events![2]], + overlappingEvents: [ + { + ...options.events![2], + start: + Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( + mockTimeZone, + ), + end: Temporal.PlainDateTime.from( + '2024-06-12T13:00', + ).toZonedDateTime(mockTimeZone), + }, + ], }) expect(event2Props).toEqual({ isSplitEvent: false, - overlappingEvents: [options.events![1]], + overlappingEvents: [ + { + ...options.events![1], + start: + Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( + mockTimeZone, + ), + end: Temporal.PlainDateTime.from( + '2024-06-12T12:00', + ).toZonedDateTime(mockTimeZone), + }, + ], }) }) }) @@ -179,8 +201,12 @@ describe('CalendarCore', () => { test('should go to specific period correctly', () => { const specificDate = '2024-07-01' calendarCore.goToSpecificPeriod(specificDate) - expect(calendarCore.store.state.currentPeriod).toEqual(specificDate) - expect(calendarCore.store.state.activeDate).toEqual(specificDate) + expect(calendarCore.store.state.currentPeriod.toString()).toEqual( + specificDate, + ) + expect(calendarCore.store.state.activeDate.toString()).toEqual( + specificDate, + ) }) test('should go to previous workWeek correctly', () => { @@ -241,21 +267,16 @@ describe('CalendarCore', () => { }) test('should group days by workWeek correctly', () => { - calendarCore.changeViewMode({ value: 1, unit: 'workWeek' }) const daysWithEvents = calendarCore.getDaysWithEvents() const workWeeks = calendarCore.groupDaysBy({ days: daysWithEvents, unit: 'workWeek', }) - expect(workWeeks.length).toBeGreaterThan(0) + expect(workWeeks.length).toBe(9) expect(workWeeks[0]?.length).toBe(5) - expect(workWeeks[0]?.[0]?.date.toString()).toBe( - '2024-06-10[u-ca=gregory]', - ) - expect(workWeeks[0]?.[4]?.date.toString()).toBe( - '2024-06-14[u-ca=gregory]', - ) + expect(workWeeks[0]?.[0]?.date.toString()).toBe('2024-05-27') + expect(workWeeks[0]?.[4]?.date.toString()).toBe('2024-05-31') }) test('should group days by workWeek correctly with custom locale', () => { From 3aa0488479e99b4e3781e788d306f770d8f8bd25 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 20 Jul 2024 23:14:45 +0200 Subject: [PATCH 136/163] refactor: update useCalendar to accept string inputs for activeDate and currentPeriod --- packages/react-time/src/tests/useCalendar.test.tsx | 11 ++++++----- packages/time/package.json | 2 +- packages/time/src/core/calendar.ts | 3 ++- packages/time/src/global.d.ts | 1 + pnpm-lock.yaml | 8 ++++---- 5 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 packages/time/src/global.d.ts diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index d34af123..006e5d40 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -23,14 +23,14 @@ describe('useCalendar', () => { const events: Event[] = [ { id: '1', - start: Temporal.PlainDateTime.from('2024-06-01T10:00:00'), - end: Temporal.PlainDateTime.from('2024-06-01T12:00:00'), + start: '2024-06-01T10:00:00', + end: '2024-06-01T12:00:00', title: 'Event 1', }, { id: '2', - start: Temporal.PlainDateTime.from('2024-06-02T14:00:00'), - end: Temporal.PlainDateTime.from('2024-06-02T16:00:00'), + start: '2024-06-02T14:00:00', + end: '2024-06-02T16:00:00', title: 'Event 2', }, ]; @@ -52,6 +52,7 @@ describe('useCalendar', () => { subscribe: vi.fn(), state: { currentPeriod: mockDate, + activeDate: mockDate, viewMode: { value: 1, unit: 'month' }, }, }; @@ -127,7 +128,7 @@ describe('useCalendar', () => { useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), ); - const specificDate = Temporal.PlainDate.from('2024-06-01'); + const specificDate = '2024-06-01'; act(() => { result.current.goToSpecificPeriod(specificDate); }); diff --git a/packages/time/package.json b/packages/time/package.json index abf3fa5d..3edf63af 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,7 @@ "src" ], "dependencies": { - "@bart-krakowski/get-week-info-polyfill": "^1.0.4", + "@bart-krakowski/get-week-info-polyfill": "^1.0.5", "@js-temporal/polyfill": "^0.4.4", "@tanstack/store": "^0.4.1" }, diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 4c17cc34..43aec57c 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -75,7 +75,7 @@ interface CalendarActions< getDaysNames: (weekday?: 'long' | 'short') => string[] /** Groups days by a specified unit. */ groupDaysBy: ( - props: Omit, 'weekStartsOn'>, + props: Omit, 'weekStartsOn' | 'locale'>, ) => (Day | null)[][] } @@ -134,6 +134,7 @@ export class CalendarCore< }) } + private getFirstDayOfMonth() { return getFirstDayOfMonth( this.store.state.currentPeriod diff --git a/packages/time/src/global.d.ts b/packages/time/src/global.d.ts new file mode 100644 index 00000000..fb48dac6 --- /dev/null +++ b/packages/time/src/global.d.ts @@ -0,0 +1 @@ +/// diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b175bf97..e0c2ad86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,8 +195,8 @@ importers: packages/time: dependencies: '@bart-krakowski/get-week-info-polyfill': - specifier: ^1.0.3 - version: 1.0.3 + specifier: ^1.0.5 + version: 1.0.5 '@js-temporal/polyfill': specifier: ^0.4.4 version: 0.4.4 @@ -1843,8 +1843,8 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@bart-krakowski/get-week-info-polyfill@1.0.3: - resolution: {integrity: sha512-Rg3nnpR1WuVNtL0A+OxdQpzHfMRNQOezJcYPZQ1XR8VdiefZZw8ea0MMjhfu13pELwsMRxZmsbmGYX5rJTN5WQ==} + /@bart-krakowski/get-week-info-polyfill@1.0.5: + resolution: {integrity: sha512-TE6yg50I2W0/EJ43OAD76TNleubb/P3w8DcxsGlUZIJNODtBjyqXyxyaj9vwiftb288TBl7Sfst2alNHSp4PCQ==} dev: false /@commitlint/parse@18.6.1: From 8850d2ac13eb4d77bc701ab3b39e78fd5592e0d4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 20 Jul 2024 23:32:58 +0200 Subject: [PATCH 137/163] refactor: Update get-week-info-polyfill dependency to version 1.0.6 --- packages/time/package.json | 2 +- packages/time/src/global.d.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 packages/time/src/global.d.ts diff --git a/packages/time/package.json b/packages/time/package.json index 3edf63af..285e7e43 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,7 @@ "src" ], "dependencies": { - "@bart-krakowski/get-week-info-polyfill": "^1.0.5", + "@bart-krakowski/get-week-info-polyfill": "^1.0.6", "@js-temporal/polyfill": "^0.4.4", "@tanstack/store": "^0.4.1" }, diff --git a/packages/time/src/global.d.ts b/packages/time/src/global.d.ts deleted file mode 100644 index fb48dac6..00000000 --- a/packages/time/src/global.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// From fe67772294719e28052194e1bb8573062fb9f158 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 21 Jul 2024 00:06:25 +0200 Subject: [PATCH 138/163] refactor: Update startOf and endOf helpers to accept string inputs --- .../time/src/calendar/splitMultiDayEvents.ts | 18 +-- packages/time/src/tests/calendar-core.test.ts | 8 +- packages/time/src/tests/endOf.test.ts | 74 +++++++++--- packages/time/src/utils/endOf.ts | 109 +++++++++--------- packages/time/src/utils/startOf.ts | 90 ++++++++++----- 5 files changed, 192 insertions(+), 107 deletions(-) diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index e59e6493..376460eb 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -16,18 +16,22 @@ export const splitMultiDayEvents = < let currentDay = startDate while (Temporal.ZonedDateTime.compare(currentDay, endDate) < 0) { const eventStart = - Temporal.PlainDateTime.compare(currentDay, startDate) === 0 + Temporal.ZonedDateTime.compare(currentDay, startDate) === 0 ? startDate - : startOf(currentDay, 'day') + : startOf({ date: currentDay, unit: 'day' }) const eventEnd = - Temporal.PlainDateTime.compare(endDate, endOf(currentDay, 'day')) < 0 + Temporal.ZonedDateTime.compare(endDate, endOf({ date: currentDay, unit: 'day' })) < 0 ? endDate - : endOf(currentDay, 'day') + : endOf({ date: currentDay, unit: 'day' }) - events.push({ ...event, start: eventStart, end: eventEnd }) + events.push({ + ...event, + start: eventStart.toString(), + end: eventEnd.toString(), + }) - currentDay = startOf(currentDay, 'day').add({ days: 1 }) + currentDay = startOf({ date: currentDay, unit: 'day' }).add({ days: 1 }) } return events -} +} \ No newline at end of file diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 7a1c132e..1d68f72e 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -131,10 +131,10 @@ describe('CalendarCore', () => { start: Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( mockTimeZone, - ), + ).toString(), end: Temporal.PlainDateTime.from( '2024-06-12T13:00', - ).toZonedDateTime(mockTimeZone), + ).toZonedDateTime(mockTimeZone).toString(), }, ], }) @@ -147,10 +147,10 @@ describe('CalendarCore', () => { start: Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( mockTimeZone, - ), + ).toString(), end: Temporal.PlainDateTime.from( '2024-06-12T12:00', - ).toZonedDateTime(mockTimeZone), + ).toZonedDateTime(mockTimeZone).toString(), }, ], }) diff --git a/packages/time/src/tests/endOf.test.ts b/packages/time/src/tests/endOf.test.ts index a29b4d60..f8db8332 100644 --- a/packages/time/src/tests/endOf.test.ts +++ b/packages/time/src/tests/endOf.test.ts @@ -5,43 +5,91 @@ import { endOf } from '../utils' describe('endOf', () => { test('should get the end of the given day', () => { const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'day') - const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999+01:00[Europe/London]') + const result = endOf({ + date, + unit: 'day', + }) + const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999+01:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) test('should get the end of the given week', () => { const date = Temporal.ZonedDateTime.from('2023-07-13T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'week') - const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999+01:00[Europe/London]') + const result = endOf({ + date, + unit: 'week', + }) + const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999+01:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) test('should get the end of the given month', () => { const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'month') - const expected = Temporal.ZonedDateTime.from('2023-07-31T23:59:59.999+01:00[Europe/London]') + const result = endOf({ + date, + unit: 'month', + }) + const expected = Temporal.ZonedDateTime.from('2023-07-31T23:59:59.999999999+01:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) test('should get the end of the given year', () => { const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'year') - const expected = Temporal.ZonedDateTime.from('2023-12-31T23:59:59.999+00:00[Europe/London]') + const result = endOf({ + date, + unit: 'year', + }) + const expected = Temporal.ZonedDateTime.from('2023-12-31T23:59:59.999999999+00:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) test('should get the end of the given work week', () => { const date = Temporal.ZonedDateTime.from('2023-07-10T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'workWeek') - const expected = Temporal.ZonedDateTime.from('2023-07-14T23:59:59.999+01:00[Europe/London]') + const result = endOf({ + date, + unit: 'workWeek', + }) + const expected = Temporal.ZonedDateTime.from('2023-07-14T23:59:59.999999999+01:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) test('should get the end of the given decade', () => { const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = endOf(date, 'decade') - const expected = Temporal.ZonedDateTime.from('2029-12-31T23:59:59.999+00:00[Europe/London]') + const result = endOf({ + date, + unit: 'decade', + }) + const expected = Temporal.ZonedDateTime.from('2029-12-31T23:59:59.999999999+00:00[Europe/London]') expect(result.equals(expected)).toBe(true) }) -}) + + test('should handle daylight saving time changes', () => { + // Test for a date just before the DST change + const dateBeforeDST = Temporal.ZonedDateTime.from('2023-10-28T12:00:00+01:00[Europe/London]') + const resultBeforeDST = endOf({ + date: dateBeforeDST, + unit: 'day', + }) + const expectedBeforeDST = Temporal.ZonedDateTime.from('2023-10-28T23:59:59.999999999+01:00[Europe/London]') + expect(resultBeforeDST.equals(expectedBeforeDST)).toBe(true) + + // Test for a date just after the DST change + const dateAfterDST = Temporal.ZonedDateTime.from('2023-10-29T12:00:00+00:00[Europe/London]') + const resultAfterDST = endOf({ + date: dateAfterDST, + unit: 'day', + }) + const expectedAfterDST = Temporal.ZonedDateTime.from('2023-10-29T23:59:59.999999999+00:00[Europe/London]') + expect(resultAfterDST.equals(expectedAfterDST)).toBe(true) + }) + + test('should handle different time zones', () => { + const dateNY = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789-04:00[America/New_York]') + const resultNY = endOf({ + date: dateNY, + unit: 'day', + }) + const expectedNY = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999-04:00[America/New_York]') + expect(resultNY.equals(expectedNY)).toBe(true) + }) +}) \ No newline at end of file diff --git a/packages/time/src/utils/endOf.ts b/packages/time/src/utils/endOf.ts index 70bf48ca..db8e419f 100644 --- a/packages/time/src/utils/endOf.ts +++ b/packages/time/src/utils/endOf.ts @@ -1,67 +1,68 @@ import type { Temporal } from '@js-temporal/polyfill' +type ViewUnit = 'month' | 'week' | 'day' | 'workWeek' | 'decade' | 'year' + +interface EndOfParams { + date: Temporal.ZonedDateTime + unit: ViewUnit + viewModeValue?: number + firstDayOfWeek?: number +} + /** * Helper function to get the end of a given temporal unit. - * @param date {Temporal.ZonedDateTime} - The date for which the end of the unit is needed. - * @param unit {Unit} - The unit for which to find the end ('day', 'week', 'month', 'year', 'workWeek', 'decade'). + * @param {EndOfParams} params - The parameters for the endOf function. * @returns {Temporal.ZonedDateTime} The end of the given unit. */ -export const endOf = (date: Temporal.ZonedDateTime, unit: 'day' | 'week' | 'month' | 'year' | 'workWeek' | 'decade'): Temporal.ZonedDateTime => { +export function endOf({ + date, + unit, + viewModeValue = 1, + firstDayOfWeek = 1, +}: EndOfParams): Temporal.ZonedDateTime { + let endDate: Temporal.ZonedDateTime + switch (unit) { case 'day': - return date.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); - case 'week': { - const endOfWeek = date.add({ days: 7 - date.dayOfWeek }).with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); - return endOfWeek; - } - case 'month': { - const lastDayOfMonth = date.with({ day: 1 }).add({ months: 1 }).subtract({ days: 1 }); - return lastDayOfMonth.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); - } - case 'year': { - const lastDayOfYear = date.with({ month: 12, day: 31 }); - return lastDayOfYear.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); - } - case 'workWeek': { - const endOfWorkWeek = date.add({ days: 5 - date.dayOfWeek }).with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); - return endOfWorkWeek; - } + endDate = date + break + case 'week': + endDate = date.add({ days: 7 - date.dayOfWeek }) + break + case 'workWeek': + endDate = date.add({ days: 5 - date.dayOfWeek }) + break + case 'month': + endDate = date + .with({ day: 1 }) + .add({ months: viewModeValue }) + .subtract({ days: 1 }) + if (viewModeValue > 1) { + const lastDayOfMonthWeekDay = + (endDate.dayOfWeek - firstDayOfWeek + 7) % 7 + endDate = endDate.add({ days: 6 - lastDayOfMonthWeekDay }) + } + break + case 'year': + endDate = date.with({ month: 12, day: 31 }) + break case 'decade': { - const lastYearOfDecade = date.with({ year: date.year - (date.year % 10) + 9 }); - const lastDayOfDecade = lastYearOfDecade.with({ month: 12, day: 31 }); - return lastDayOfDecade.with({ - hour: 23, - minute: 59, - second: 59, - millisecond: 999, - }); + const lastYearOfDecade = date.with({ + year: date.year - (date.year % 10) + 9, + }) + endDate = lastYearOfDecade.with({ month: 12, day: 31 }) + break } default: - throw new Error(`Unsupported unit: ${unit}`); + throw new Error(`Unsupported unit: ${unit}`) } + + return endDate.with({ + hour: 23, + minute: 59, + second: 59, + millisecond: 999, + microsecond: 999, + nanosecond: 999, + }) } diff --git a/packages/time/src/utils/startOf.ts b/packages/time/src/utils/startOf.ts index 3cd6c871..67c492bf 100644 --- a/packages/time/src/utils/startOf.ts +++ b/packages/time/src/utils/startOf.ts @@ -1,67 +1,99 @@ import type { Temporal } from '@js-temporal/polyfill' +type ViewUnit = 'month' | 'week' | 'day' | 'workWeek' | 'decade' | 'year' + +interface StartOfParams { + date: Temporal.ZonedDateTime + unit: ViewUnit + firstDayOfWeek?: number +} + /** * Helper function to get the start of a given temporal unit. - * @param date {Temporal.ZonedDateTime} - The date for which the start of the unit is needed. - * @param unit {Unit} - The unit for which to find the start ('day', 'week', 'month', 'year', 'workWeek', 'decade'). + * @param {StartOfParams} params - The parameters for the startOf function. * @returns {Temporal.ZonedDateTime} The start of the given unit. */ -export const startOf = (date: Temporal.ZonedDateTime, unit: 'day' | 'week' | 'month' | 'year' | 'workWeek' | 'decade'): Temporal.ZonedDateTime => { +export function startOf({ + date, + unit, + firstDayOfWeek = 1 +}: StartOfParams): Temporal.ZonedDateTime { + let startDate: Temporal.ZonedDateTime + switch (unit) { case 'day': - return date.with({ + startDate = date.with({ hour: 0, minute: 0, second: 0, millisecond: 0, - }); + microsecond: 0, + nanosecond: 0 + }) + break case 'week': { - const startOfWeek = date.subtract({ days: date.dayOfWeek - 1 }).with({ + const daysToSubtract = (date.dayOfWeek - firstDayOfWeek + 7) % 7 + startDate = date.subtract({ days: daysToSubtract }).with({ hour: 0, minute: 0, second: 0, millisecond: 0, - }); - return startOfWeek; + microsecond: 0, + nanosecond: 0 + }) + break } - case 'month': { - const startOfMonth = date.with({ day: 1 }).with({ + case 'month': + startDate = date.with({ + day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, - }); - return startOfMonth; - } - case 'year': { - const startOfYear = date.with({ month: 1, day: 1 }).with({ + microsecond: 0, + nanosecond: 0 + }) + break + case 'year': + startDate = date.with({ + month: 1, + day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, - }); - return startOfYear; - } + microsecond: 0, + nanosecond: 0 + }) + break case 'workWeek': { - const dayOfWeek = date.dayOfWeek; - const startOfWorkWeek = dayOfWeek === 1 ? date : date.subtract({ days: dayOfWeek - 1 }); - return startOfWorkWeek.with({ + const daysToSubtract = (date.dayOfWeek - 1 + 7) % 7 + startDate = date.subtract({ days: daysToSubtract }).with({ hour: 0, minute: 0, second: 0, millisecond: 0, - }); + microsecond: 0, + nanosecond: 0 + }) + break } - case 'decade': { - const startOfDecade = date.with({ year: date.year - (date.year % 10), month: 1, day: 1 }).with({ + case 'decade': + startDate = date.with({ + year: date.year - (date.year % 10), + month: 1, + day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, - }); - return startOfDecade; - } + microsecond: 0, + nanosecond: 0 + }) + break default: - throw new Error(`Unsupported unit: ${unit}`); + throw new Error(`Unsupported unit: ${unit}`) } -} + + return startDate +} \ No newline at end of file From e17fa798bda8dde4f4aada87ee5ac452d0dc65d7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 24 Jul 2024 16:18:24 +0200 Subject: [PATCH 139/163] docs: update architecture --- ARCHITECTURE.md | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 5f3718cf..13628375 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -17,15 +17,21 @@ The library is designed to be modular, enabling developers to use only the parts ### Type safety Leveraging TypeScript to provide a strongly typed API, ensuring better developer experience and reducing runtime errors. - -## Core Modules - +### Standards-based +The library uses standards-based core logic, aligning with modern web standards and best practices. +Internationalization and localization +TanStack Time is designed to handle various locales, calendars, and timezones, addressing the complexities of global date and time representation. +Core Modules ### Time utilities The library provides a set of utilities for working with time, including parsing, formatting, and manipulating time values. ### Calendar utilities Calendar utilities enable developers to work with calendar-related functionalities, such as date range calculations, month view generation, and event scheduling. +### Date manipulation +Utilities for performing date math, comparisons, grouping, and range operations. +Formatting +Flexible date and time formatting options based on locale, calendar, and timezone. ## Project Structure @@ -48,8 +54,28 @@ The core logic is implemented in the `time` package, which contains the shared f The API of @tanstack/time is designed to be intuitive and flexible. It provides a set of core functions that can be easily composed to build complex time and calendar functionalities. The API is consistent across different frameworks, ensuring a seamless developer experience when switching between frameworks. +### Key API features include: -## Extensibility +Parsing of RFC 3339 date time strings, epoch time, and Date objects +Formatting based on Intl.DateTimeFormat standards +Date math operations +Comparison and sorting utilities +Grouping and range operations +Timezone and DST handling +## Extensibility The library is designed to be extensible, allowing developers to add custom functionalities or modify existing ones to suit their requirements. Developers can extend the core logic by creating custom utilities or by composing existing utilities in new ways. +### Temporal API Integration +TanStack Time leverages the upcoming Temporal API, using a polyfill maintained by the TC39 champions until it's fully ratified and implemented by all major browsers. This ensures forward compatibility and access to advanced date and time manipulation features. + +### Internationalization +The library is built with internationalization in mind, addressing the complexities of different calendar systems, date formats, and time representations across various cultures and regions. + +### Performance Considerations + +Memoization is used for formatters to improve performance when repeatedly formatting dates. +The library provides options for working with "simple" date representations (strings or numbers) to facilitate easier memoization in application code. + +### Compatibility +While focusing on modern standards, TanStack Time also provides compatibility options for working with legacy date formats and parsing methods, ensuring broad applicability across different project requirements. From de02743c04473c16eaf7e97c06f9b6ce25fba564 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Wed, 7 Aug 2024 22:45:02 +0200 Subject: [PATCH 140/163] # This is a combination of 6 commits. # This is the 1st commit message: docs: readme # This is the commit message #2: docs: readme # This is the commit message #3: docs: update the repo header # This is the commit message #4: docs: update the repo header # This is the commit message #5: docs: update the repo header # This is the commit message #6: docs: update the repo header --- README.md | 29 ++++++++++++++++++++++++++++- media/repo-header.png | Bin 379293 -> 252933 bytes 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3c81954..f5cfa3ca 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# time +# TanStack Time + +![TanStack Time Header](media/repo-header.png) + 🤖⏰ Headless utilities for building time and calendar components in TS/JS, React, Solid, Vue, Svelte and Angular + + + #TanStack + + + + + + + + semantic-release + + Join the discussion on Github +Best of JS + + + + + + + +Enjoy this library? Try the entire [TanStack](https://tanstack.com)! + +## Visit [tanstack.com/time](https://tanstack.com/time) for docs, guides, API and more! diff --git a/media/repo-header.png b/media/repo-header.png index e86dec452efb3871cd1ce8d3a8d5a7bedf8e6f31..765d9e97473e09ea48578e1d1839cdd33e2fc05f 100644 GIT binary patch literal 252933 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̚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%0ANi#Kt+~I6s^cbL!rQsFTEZVq#L2 zW7YJ2Nt=C5OW`6wDS=o(>u!}ZB3MwlprmkIp|bDlp4+ifuM_$oIHY;21BYC%6=?t7 zaDxL~FOR@=)^$kDc4j494x>?~L#?+um+rtaJk&ZTwxLssvF~kOr``rHa;J(4k_E7P zr8;V0v%2yh!5g_;x3z8D6GYhJJ+}A*chu-?kKF~5y_WKEY9}267S8D@;e;30h3go! z=-ULhJGW#oWyEb1PU2pHKZK0=C|Esu2HcH|PXB3B(ILAt00Pc#?Q4oLsQJzlR|s)< z6C58lT6aZ~G@Kcg|9s+C{VnYhssz>~Ye?af@Lf~@0 zKhx4!-?Rk&=_#RK(2E(W9Z(y`m}hsrOxwFiZ%J|M&TdMUJyWuv@uzhVskAwe?q$UB zpC7mK!?5oFX4g#`2p_85*!og`~>*yGyu< z+AV|JFK}*niSsBgu`l(n7i0y9`ph+)WSlA>%~TvnDAng|j4d@;#5#C?FjA+h{%H&r z7;b2i%aiYa4=-&8Ui(<_<+ zUE>}ptvjL8-r42b`0XbKKOA2pbAJ^{X`%geu;LmquKy=tGKFHgRN{uD72lY__B3aT zjB-^r_v1P*Ev2W{0)OVDK-g;4rDDCA#29Pg!ZYIY;cz1A+MEC?SAaksF9c+ z7EdQ?EhcJ9M2rcUr{oPex~EtRDdovkEUOlJL}-~pFE(h1XBGwrZk4+Y`G9TMC&$S< zh=nT-5|YII)%rXPmx-GgA`n6>&tSpDUkXm@vpT-Z zU@{nH`5g4i=;<=uG_IW{2*1+Vcae_c=+TAY$etfoA)-dw05j#N&B{!e{ zy2a^FXTVy6`?*fOGXh=)VoGf?-C(wz(**W(Fpo1a?;%eux2RiwIb?S;VvP9>1 zhexBlKOogDL_DYZLB+u)Wrp>u+lI8LbmP;b@a(;!?aHQk7Ve_8yii$BW?2VhjkOMQSI@pX=Q#=2#skBFuhB;^s|(}+?Y>D@BFQM$5?{AcC8 zxpFn7Zfd*JEA!c5ltS=6NpjgI#tx`?1Tuf{?8zDee3%E2e8KQC{$CVCnSdUP|4qi> zigmTv+azNc@ijx!Y!|M7Wm;PFsXN4^VMT>Lo)ah^wEx@k!^ox{(MC#CXKC{X9e#2< zvfN^2ZarvA^Ujxm?qF?B3E5)Ipyh)xgt*4ii6L}lcvJHt20L0)*k^LA9;s^<7518D zrS!^y#yG!lEp}=Sf+N#<<|1vz>?jb(z!KD@7)n%9__9uGZ&cA7pVQ--^D3iZ=BhLR zXPD=Z-aEe3>UNWcTK-HMn)PZLWgoY(5r2j_%WviVR;)!vaPv<@a6vxZq`- zQ@R_wBJ!3%YDelE+XjM@R8yP9U{)Bb6SVCf@1?*nkbjvc~F zf78esCg;yR-Ki6XL&4)0Z8tVH@xTBTS+qD>GZ*ORR>#n(Go@7vJ6itzeGmvEbMUoH;N zbXiMxQ~W1nWUNCZ8@m1@%@eXep!DE|lplgz#uDA(?}FN};3FFFFOI}P=y%>&^#}TN zr(^5WgXhF=Ui>KY;NY>tdVcUY3PQ}wHSp-n6Z!Uam77dI#^|EmCWrcMtXmhie4;tG z&A*xko$!~i_2wV7#ehDbDt`(z-Usg0G}Tfs9kNYxS8G}lr|FVC^=m24XRm5{nfRw$ z=%Tmm)AguvspTY|{B$%vy9w?%P`cr1IdS@Oa3`<`F6rb~NOE}-AZ+{&Ha77-nnDyA z+a8{?Pl1Jz1BNZ{&#-8AGTKn5Ze$WAM+>X=6Nc2#Y&+_-9_8`0{p#QiHN|4&&Q^vW zj0d8gwC1+LKcfCMdLyB5q{>WlNg0#Gb5APlLsdc5m=dZ=?Yz{Z>CPATkY>O=I8N1R zarZY@FjM)osQNER=zFb4J1t(J#A}47lBd&KkTDuUZwl7*Bia2~aHIv>Vv|BZN#uC* zm(6N7I<}(s)#N(|9H?iQm^l9?Mp8}34EdJ(5PYig1D|{NdL;#dhEq4?aXM8AXFc;o z3{1fz0o)Gt@H9UOUVej&4%Ps7_BGHf(n!B|^6u03sPd27er6{NIr2jt;|sl`l;8$n z#Alhe&QYFLroSyCS9-puLUzx@cE9I zm{oDZWGRm+VS1`PE#bQHKl#;CKCMW@D&tb=# zQqoP=GvC&Q*7AIf0}U1}@|%*s)FHj2)8;uOR*RKqw!m8((dDzH?46YM{Oj2KA?u|D zHKFpA;QrBwGw^#&wd>nkcH+D=@x}|YCo+?RxcvHTECZ-JY zicIcCtBdnV?UsU3?+7XzN)37X&ZD@GRfyY9Ie^#*atka9Bs7m$D@Swdg_$#ji2q|t z5Wj(Jd{G&C`#mThX};NAKVBy^gf|=|#cvVKH*B7N%UFjVZaA(89c973#iRG-oo!^^ z#`2wB9=zy!J3lO`N>hL%Xv7`roGCfm(8D)RWesn_C!E%OhjO@}Him9^RqR2CW99Z@ zY)B|!mO8&U zTT|sjr?Mu9y}o;6+<1tZ-O$`++lo3CSJbLlJv*LGS=ksmW zT5uxM(D=HhuC=L_PcSc4c_~q_?kb8T3y)`UDhyrI+b;QPNtZ)2{w0jZwtgB>+Yv!( z;e72L)mv(4J~rbtli=wb@;9Ic_Nj*x2dvdn*nYB^@CLl%Lo?cjnqtLIda)|_``E5r z#6hN_IZF6TM|4>|RlOQ(+ua&=hhE10{Aa~Nya<`*v$nj8>*N<^DzZQy%kC&E zPo7K&`6@Kk+y;t4mOs08Pwr*T#y=dQ6S}vQj?2uINX;=B=&n3{JJDKG7i;S*-H*8) zjdc2si07;>jQ@3(LlqeGVVNQxm7^InelY6&aSAM-{mkKUeDGmCMVi3{Gd5^@Cu~Y6 zk#oL>lghaAB9vY4WK0x`_iIv!UvR}nigAPXYLXd&thW;WI6CE>NGXp4;b9y$+sgpv zWCLCbAbYqKXH}(8denKQ=L~WD1%F&%fFAWi8-7tqz5g#H7|7yp{khH1IK?nuFC zxn{f~e?C+X{832>Jc^^cJ25vK=Q+jCRHuLp zY9AQP0kIW;K*ypZYXw)|ZPJ9G8Hx_DyrJSeBQtLA3xRDF&tButVPc<0LYMg6y8h=; zu7Xy~71?|r4Yk)=k7A*7^kgb>j;SeT-rC6hfPApCcoTF+#;Q?vd~BPPOnIxIHfCi4 zHi-l3-2A+UmGIWJCZ?CSj|b7#lHVCiC2Jn%P~wKp&HH@Mik@h7<$%x6smzT`Z+ysh z6HnLQ-ft0s837gU#JURkE2}K_qrb#Vf<2l|7kNiHT_ad6VAW;eTc*Hyy!?*Ed>Uge zDWV7-mon3TKZ4PcZ~IIVPyW~LR=ed8InF+of z-G++XY0C1Qtr@b_$pe*Y=UJwo;rt<^G{TS&wO)D4CL%gK3ifNwIZFbCmI>)AHJUvbY|X zIq?^+vaZwDr+@tWr+N_|%*Hw^!J$RCw^T$ac^Z^0r-7TgIhv3U8%rY(n&N<+@Gr^$ zpjyz!!ZEn(!=KMTW62pr#{FPn24FuRT>|LC`}dpsi$n;1rv zr{@0pGiUh$x)lxpXhXU+=(uP3E*11ksUI%!>D$K%03M$YR^B&jmBid5k35#R(f6d} zo#MNMm6WX@V%>H;`zCV{?pLuA<{3VsJ~Xd6cyA&=Z&%)Yjx5{z5F&V)@8*D~%9xlX zL43criqK^IX?xe0QJYAY^detf6V6CnvTvg0d8;gvjKTdzk0XzddqFu=DSJ;b58Sx7q~6b zu3ktmdYA1d>ZVVbkD;3fSF;oDHly;^gqkNTTX`~7FS!~Ha*L9x!u*OtM4=j?$Uh{6 zPZ&}bu!lQpYW9lDx2pJNA$sqIp=8ef2!HV14lqh|QdE#eeK-97yMSm8#}Px6Oc)RxRr^ znOwaNzBfIYfAHOh64ewaJN~q2{6>Y1Pw+SP_Zd)mME^PFtDv&?%N}7$qI_-*c)j8q zxJ2!Wbqd7epUY;7l0QC6p}{X{xI^ho-TOx7T8iyMeNBcAJMSpFDh(g7l7kU6Mp#PQ z-b9T7c8~^xlse2Zk8@!!&+B7fA$LEMYA~ll0E69z15EJbP~eZQ?!;)6{ityBa{b8P zVDKRUn_>|a;Xsh`?nSHpOQN?(0*&m>v$(O@xt`~G{MZvr_AWrUGoglW4no)>&WjRR?KgdCnp>n5y@sa)PEf( z8T85F{RP+(WsI-Fd%Y@2==|5Gnl{~L;x{nUU5OCVF!}TTOy35W4?Xe0Ud zL8H~ivSZNY^=cnRV*s)zN`s?kZv>j_hG_GFtw$>c7YDbRH|%Zy23jz8j!LpMo;T>c zC*o_ZKbhmtD)$2f;|3=r0DKkodFbBpnuh(fI>unM;#JQ_$7&|9V#k-w{YrvO)Vv;% zBNZnHbAtMBUnbbLw}jnKNOG4?7e*Dy)>f!i$TWXV$SvqIlbkjjwdsaNj3}lw%ys_& z%vijBGoQ3cFEF7m2H~V*USQkDs`Gzc%&;1v9QuRSnc8s@_!!pqaV)Mb`u39G>q(VN za^MwXiP93gOk$wTmD$J;|9w)3o&TKrS4_w$3R)bpCMfap@v)Nn^>DQqz^sY|4w`p* z7Ykk8i|D@xoR7}G=i_m}fuAJw20H#gW4C9i)ZNed22eSzC{|mv3Xe( z?A(aSx5zM^yd?XhSXu9w)(MU|SowTmv7NG4O!IG8*pjs0Y#*cZoO6dV0jb85G{#`u zl|*e7+KaM0^l-@^RL@Tcmh+9(m12qDIIf-a9wUTw4Y?Ie8zkj#S2Rfc>XZ;!pt2RU5XxHu(11FF6^$Ki*{gfBoDy;B5n&jEbZW!?uB zcQ@tRP}ccZ3ay^*j>0wuXIwlZub9;4y}M74AV^K!($_@hPQ61gwFbBllv$jjIEqa1 zR_l*=_NrnNp14^D@H)Y1y7OOU8rhsm<^o1iE;!Bn5!}pFS@aCQ7c+klzHO_zCb=o1p_zalpwKkD{ zfO>^WvA8&YlEqikm}~8&ikywiC=oQ3Q+|OXAj0yTPL;B@cRI#r_F|X;xU8vi<8D{| zjeVbHbexz%n=347A3H@x7XFAwzLjT9uj@8Lb9D$5`)7!sthm_4MH2T7VGUxObo(L`kM<5(ckeZ{~$8Oqst zs6pB9fIc^}yo>m66*N&0OddN7kKkhOZk}#VM41oD!RO1?^5gX+;#l%UsZvQtA2$MZ z#`oa@Z-b(qhhI~`8cGrJL?37!s~suEdb>k|?}7A3&}@%JvT`j)`Kw27)59)Cf8 z`v%<6US*GqcZRM%`XFK`)fD9Msnoe(tLUTq z?q|O)v-npj8>G_L@;8qbu-HaUdxZubjBbVrICsybls({PvU?BgZTb2Z`MCxx*)A!* z&V`=T&KCmuX(%xp>GDv+DfmF2dNAq>O3&INMIng+w~(7;HO;vCGW8O5iXAp%hcK)q z=w@3w@ntcs@zjLt=WO4sjxX(|5dN*u`{NU&%0GZIriYw*DCzjnq!}7Js^|b}7IWiP zzuMj<$noV(*(Qe{eBL??uyjm&mA32e@?9Ji(S`ZQW{JAbXFsIH(opCWU$iW>{c>pcC}?IWGu zSz{r~#|x*o_=R118JyeQ*ZTjV7dGW4neT)W0EPSKnFq=j^rupoafTTIH~-|W7gAls z5UH3DnpL0QlY`5VU4g?*no3OY0M!hJyalkr4d92}CRlp>(+>#7I zHfLNYEwV1Oy!$)vw18h(SO)+(Pe>fC+ht8%>eCpMCAA=^y(?^De&PANh(c9d${El# z_;Uk^b0cN$oh1t7T7vb5t=Z(-(GxE*Yn%-GNry0$B(q4t;%I+~6c;L32OR+wQPHit z!{5%gC&c$BYn@BWXXJT4hZL&d@!3KaDF&xcpedZ$-92SQKR6H<1Qb6@h~;R*4+ggI z4w`T~1=`Ky(&To|N8fjGmuSk&kzAG+NKaM}oOBcPxS@m#Q|>+K)w}%O`mtb_uU&8G zamf$lzc#Su67N1xHSyvTDX3ii-# ztb&s}uPy#aAedoMt8t{p*-hFo z)XuvQ%La_DrLF_<@maxzOAcYd3KKTUw+mk}!B;1Fc?SkkN!hQY48q+kKB8c+M*?D9 z*Pe3v4yuYCI+u8VoLvB14;nRYYKhzD_->i{EFS^pv*+sSQ*!1qQ%M%?zairVz6Ejv zFG$`dEye=pc^B*K!%{5Nnso}Fq||ye{?gaTPcOd_&vnxpgVEOj+>@RU=~49^1Bx3~ zk+OS@w-Mr&*eDa(dU>ZSTjxil-X)x6G?ENfPP8P6u${h4@iHy#8&lPLoAl7N=f_1c zd@1$?AT_oXlZvw7d9%d{2}GL(&X&fq}fWviJ2grotl{O)LC-IPUQrW#Tq z86SW04MRV$O-6x~wY7pu@I9YSGSm+ z^R7P8K_Vn8qmKElNQ|rHI5AZH+VRDP2(y###`M!L5bXdVQ*PUoGdEqh}p zhbDEm?>*9V(OgNJ=l;C_fGx=>{bfg675irEo~v-#kkct0!lx;nUX-bTneuL$?t(S= zKVWgpC?0(?cH*SBCQC?U#ZOG)6_X0PkEvEo=>o2n(mVU=7wmKUr(8o({{6`cEi%3q zw??@kA!>;cNgodb2d<~a7F%}>TcY2wWwy)$f(y^31g(s+x2s+X%&zmb`XuH{7k%Lj zMbU?H)Xs10njjB&OZtKC2+#ts=g)02lX;K_U7bm)OeylGmK4kmS`S@9Z5ggsUE732 z{~`dhHnxt~=VwX0GlN$Q>ewth?^dvM=*w4fr=F>?XmOD6LHS5r-)Pcf#c$}}l6=|< z`)(SyP<-l33rRANML?Sr$y^EIDnZ1#>-je#QB6#&govSIo>F$TZ0E=#KJh%dtZ&hv zuTxgs7ZSKCdc_PpZx9PTxYT&}{Ep-H_gpEAQJ>`v=sm_sxJ*snO>17m=J$OctpI=E zL{>LvhtWooynbatXl?vM&l??jt6#55g(Og-&JSQ-w|r9kQ3$9lzAT}Bi&Qnu6Fv=j z#u4?iquYGi?m5YEd4wutjy<~?v&OB!VaJ7R1>SZOlEK9N$5|D zuHz`)Sg-MYqN8GuXjCcYGMOUj*S|-@=oz`G#{;@g$*Fg%Zk)HM~| z%wtvZu`AQ>X!`TtcH>ynHU{;^_?CQqsp_DC?z2QIIJwiZ)D}KA@u- z`q|n*t_=KcMU-LA2}KUfcor?)sPF)SL-Bf4LdQNsXVgTuE`{P(++@#A=$e^7wNc-) z=%|)ok+k7}tLi6Dd(ZyM07tew7q0+g@3j?Q^gg$0H&OD2LM`4l3*PG9Y1vkQ9mpUS zt}*7HN!fp=F+6@h&pQ}o5r44d*rmr_e7A6*CaSK)s|RY-9QO!+H407AE2S7C`rTwb zY5NXRuLIT#6>k-Les*o#nRSiuzQx!tMw?~VhYPQT#}AY8NLGDc;HRkCiBenis|`*N z26@q}zaFX`EBh>t2nH1De@oI6$AS1PqQ5f_KOW9F#yuS%c|VL9b@FGk1^XM*(ss#o z7?qbVsQMUxY8kq18<4I0Vu!(f?cRf}=Ommz#F;@F-WBB@lTEmgU%y`(m>rml&nLa= z?mN%js_ZAlwVYy}fxh=9VRL|u_e+vUw|763`$-8qIk(z%_a`9yw#}$qmoVGC7q%lA z)-8AWeCqj1WxF^)dDq$JXH5+xkAg&z3Ag6LY3Y>T-x-()!BLaqE)npLc2Y%od%31Y zvBe{Y-KqoIt0`ZGVy2cnV#yQhJB_v%?}5Md&HAo1H3iut?v`Fy322l-sz}~sn7T~J z{0`(~%dr$#stPb1_boK?4167D3>t}N2cN<>DrUEQ^4?vAQ_J7izHV3rkZRws*a*ZJ z$$8-(IR%tJbtC+75&mAoIL(Z%yCB&7oy)o-f*78iL475M9>wa%@=-VGJ_ zFh$DD_3_uxRC+(3FT4RWPmv`g?^kC$ba?e4QK~HXa(N$u(2ZJ}9QZP6i~ENk&rEh0 zFW-m~XbhZd@RhI&DBbL1ls$iRxImYvokuG{QpYyv;N~JBJ}J!BQrG3A5rnsdyK+B~ zu^Y}0sn0NTZPKT@_4z)`w4w{;P)q=+jU&{r+bP>KMYaG2)u!#8_fZ5k`FuycEx2iz zK2nK0aQ5ZUM!~7`-vu5IzU<_mmNO8$5F}C$&zROd4Yk_-549Cr^F5n|J;5EPNPd~p zo$oiN(B))4H>Pm4nM)jev1mceMl8n&k>m6Gd0$ow;m7%&y5d#4;|4WdfowcF(Os;(LjMFGRr* zYi#`QEyun~#AIk)u#OyIpc6#Rb_CQo{d9__W^uVe(C*`{jk1koS<*)>g6?=zJYZc? z@~wW|u+D+<&G&{pE~ml&PgyXaU~R*GUx$y3%;q$;_aK>=7NM)ar0hy7-f&ozr#oP3coMQ|s?k=3~Iaawuwp#bLT(1-$l|OznLIW*ta}1`mYeMdwNI*Zuzq%(bgtF@SoSTuUTS_-MmwYa# zAH6)h3~>(ikuWEnmzyvJcnp(tMeXL?CLZ>AWp51I6ZUQmVL~ijK*0iQ;4+j0n~kts zd4fzGL&6A8Dr~Dq`_+^};-DpavUzU%#K=hP1r2)d;f^IAlj}44lo6A*R~&S^gHyD7 zwRqK4{td4(<-AI79{-T_YD;aIR$%}jV6yc9PZL$+my$*fYMjQZKv78?ezePO?-gbt z4$zJ#OibNJSqG(?6^c9k$aVf_sUFV_j{C#lS~1?YlijUfCt5!!k-D;nkSijie5ZSf z>Z|Go0;(h8e=a>K@dE(MYewD@vVt7(MhI*tE22zk`8zaD06KLR9OakkQ&Fx(){T7E zIkb02Axj%KNxlEcfD*cU@nU)d9O{!aL;zIY?nA6T4BUTL zuDM)RbtZFa=CoAxvt5+79R3BADZMosTH9Gy9LT>wVfQ;MbKNx&rDdMA7+l=@;=XFq(Sk3{b9AIokHl zO=dZ}{7zLbJoZK@)WMWnK9u&tR9_z%*nBjVSC=u zEceeIfCiQhPY}(JIDXAz3jVgS5$pU*|9H&tOk36!s695Fbz5)fD=dJGEH%#8yx()? zRu^7z;y$g%=3J-X@2-YTm=8};f9Gskul=#8D(l-&i;0yVvTD7-&7JS5&qT6?9WEn` zm|8#8CRxOB(@e<}tX}Zg6Wd{m~GW}Qj!`+A?)3YAGgq?7cj(%Mp%+M&+0^ghx>~) zBu+4*pq=zj< zTneOdJF~LN)4)ixKNSZIY{-EVU@=p9<%nYgpyw%D`ci-6>iB`r_=eo2EKMd3Q5X9s zcmDBaB!&27at%6lo|cBtR>vC;`=vDc)XPhoec*Ah%5!>qOx@7!>+!+2t@eX`{C1}| z`~VxppnmFPYk6=jZ|iRrvJE4Ax#3=zvZBY#+K@_~h+5N5RC*Xr&x*slgO#8TRHfTO z#_{8vA6KTzAJUy5ssFve9{ftIieyteSSlId}LN0Vc^pT*j)1L>AU-=NhHzWE8Adpw`Tma_v+#P z>sc#x5z2-x4f^E0S)!6}U60#Ca=NfY4=7`GYj2QhG^()Lc(@T&amn5oLiC-z^l3Y7 zay;Z$ZDw(X)UR*TSKZ)ra7?5>R4qc`R?dPSBXiovs>tw6PZA*TT;&H5^h#q2lqnz_ z$ZfQi95E$0Mg66^fnSM;^2g|(N)LY``fQ-Q|B{rx4uFHqEH53 z667Yv5IE^{U-g6S_PWM%^+=8$6}sRsE0ev%QBx(dpe=<@aYJxsG6`@db@hI!eY`v% zj%+-ER0>|3m<#PWqj=f_v?VUmE@POH(iuw}I!{chl%H*nM{Km$fZ%>C?t=LLf%3^VU*hGyLX8%ugF3MnurM? z93De|*gh}=armeIK?|JMdvM{lhG9WhImTjGC4 zdLrDtfTPANA7OM~${E{Bvo}I^RcV17kGC+usKcYzAK?2>vAoIvCWMA!8-p2kjR5!P zZ>6i5Qzf~ieXOVo3gDGxmyg)MM%&*}ixMH&DGm@Z%CR5lFa`ge$_N}s*##H^aj!H~ zeRs#J%feNAcMF($N!rQ^)z8HR{sqi0R*?a>s#eli>RLdgHC%KR$0tf0zH$Nny2=OhbE2}kAUTY z+*dgx_MZk{a{uqoY6gBW2_W^VJ9II)H81<%ST4=vt}_Qr$p~QhnZQTVN~Q~P&O3mP z^e=`A90D2muJ@J&7J?>sH_z`h^Jp;MUVs5=ih`rhF<#!p2~Hw?R<4B|T8SRMq?w_p zZ~3ZQhi)eoG{i4z|C#Fmddtat zBw0^I*N>$v=#;Kn@JgU0qsVqWbl(qvp9EGSl4cShm2MTRXW#>WC02a8$bH(#syvYJ zUpFP)6G>eBIgL375%_3UAjKfBmP1CUs*J`PzA+ki^M7w>nBEX9>f*TqNF zEf1{bBW+9tm}{%w1g)q4+s_jbseBprsW6D>Mw~Q68XbzAeSsVM{+6sBA6G`;&2s>l zy}ufAuz^3AJY2B2=>YQWr-9_%Y5249a5isKy}y0=aU$={!nSq*q4uadaYQs0hBJG` zlW6ebTSb4U{rbEEf9DHliW{Xd7BX{OZvRSFur3#3Y@E{t=T{8{^vT%#CxJzKqu7#1 zzcRN;Sc{ix$)B|ZVSqCZXwD55H+t|v*g#-PW+*mrm25TB)duj!&9a}I;}z^|8@?pz zd;u&+%GrzfhLjFRZOx`NHCVXhZhw}E@;35;Yf(N4e$#5MwS(Ag5fg;`T6qz>G$0S2 z2}J%NYu#s@AwPWXpEy#{uJEz&r<{5T#UWX}Sa~Aw*Th4+Z_oP`abxzLbOQuYrtlmOH$3-H{6XW};G&g28 z2A0UVa+cD+ubzNUusL^^dOjMDCh&1Tg_|FMjI|814leFkrLLGwi6W)aH0o5I&h?yf zL~m7*-L&5tAnyjay<;gvyo{Vf;i$1XA= zkL3QO8>x*4k^AKDEV|)5z1#2`A#3Gj7FxRvJ^~G_5JoZ^?am3d&K+i%kU!H#jm6%Y z@_nxHAOdgC-R2YXAB&@PN0ER#&yEC>y-bNybAx~P(na9Rq3pGR(jJpOsnZ}trF+CT zf%n7*juQo;eA3tn1>^562Q<{i_{DWeOXLRviu*<)Hf8xdxQYvF$N3^(%C?a?Sv}|g zX31kKhL!~B$lTYQ*W3Ab^;rg48VL5RM#Ou3Znhxmbxdh78i!oo zC*5f3dJID$L=oOAMM;KLD9(U(zo2MNi_k9PWA@UljBh6>g?j>Z}YT%Xd2=69$p+Uf*q#gL_Rq<-aqE7m+qVy=p6GFGp2L8-ytB<33%< zKcYAN6CESI1Q?`HX@@-MzDIYG#7nKp&Lzd(hYKMkcF<$lJ6D0D`a2=IbunXqmU|Xc zk$vhJOXlr&)dIXD{in{2Uaw_+PR>0RlG`ty=^QF~;o|^I`=C?B_O7NR$1Pl+Uzfyt z@hgfq9+^9?0>Q67p|9@bNPZ(}diuuH(}IUM5RKT}{jgrM{o+o%R>+~n#m14PgtRxMAPfCK7YI$KEA`fS5w={Ua*j}%s@m5Lp9p0|(D9V3e3v=)a#^bo@ zbYCgszkL&_V|Tnu+I1n}Bk!9d{=^C}_5S#;XUX?4Cr~?>W8uyeNd}zjulx;H`i9)i zQ!O@a&)6=ZLxvYmNiZ*(FwKlgXpnTpnzfD><-Cl!t(lk&on%A}vS~Lg4c6@m?UO@5 z(s|T$wmSp&AH&q&v)mL7xrGpBMtva+GVMl6sp45C{a;;7^w5Q(ViycviVI09J=Z$6 zlFwb;aKIL= zG$fGu`!E73Hy_X^qqb<;Zl+L+@FQ=i>GbBx{^|`yQQVfkE4uFXbOlaiGm-yJ-aMOB zmf2GIOGA!~CDxr~xEZ*an9No(6YC-KLo^0S{hs89a_5r~$vmc1>zesc(@eau{#cJ? z1W^`Zn>8OXQt}@-YsVO5t&w+KlIu0|Pbeb)sqnAIbC_*qo;4xzIi`3G*Qf_ML$4O%`MSuUH^}RF37Q8!j7%8#Maj6*khp2G(OU4Y zxDm{Dq2bxDjqnjYrsu1duTauTM^_#CZNW$nAVCFE)T1gN6Vroj=H>H2ioRrPp;lHVGt{I_Fi8Y203hk3beWW`94viI7>-jd;_faELA zm!vB4Ljm2Xl$vv@r{#$$4Wcm9TkQ4h0Aneuua>PMNA?sW?V3m~XJs_*nPk{EiHc zvJIJMEX1f+xBtE6XNjHo@Z;(z)KCvcRsXp|{TX2KmU3kA#uO`OgGxxKWa#s) z@|H<(O~cdP_mzN#!mNG;-!GgN5k0LDqczyir6sv)obTpLADKuj5x)7>7?1AXQ&Y5E zO^~qK=*GE`gq8(YSYq@JJ#PY09~BfH4S>@dRQAna5b4P}bkaM?5k2~SK5D6!vk(p0 z^yHws94@4CF?^~>X=ql36zk`4X$#_d$BQ=h{u_XRLyK(P2A_>pUa^>s2xdTiNapg4&0zP&@x9V-~tn(Heg3tnIw zFLNMD`po#(*KjUrc`fQW8=Y*c4KgkfX4FER>#xk;1Q`m*Kft+Hm;~B}(Z`Q5dCg^q zt0}|g{p&A8Uxs=Mn3)CJrJLE0AWy{p4U}wuh3N|VA1%kNb`}cIAS5SL0p)nQyn=4^ z!2k7lgr&ezpgIK5HA|K(?_pm88m4VjTtwpW41;4Ul~xY4EkAEyLiVY&*h)Frxprd z18~}9qIxOA_s?mrCWz+2qEGlH368wbw4=p{1a21;^2-I=Aen zS$Ew6K-7^yDehI(J(p%3H^^Ueq8q=pzWlZz3kIf;MKsw;?)Yd`FNn?hj=+%fAa(y6 zpjqbq5q&K*=lic(^xXClr;G&+L!~m<7Cu=A^KIdXb;iA*bSY;slyq8R3f~k!h1GKnui_hCVqWVaSSCep z0wWc)uB?~((b~;{)koFT(i-^QaU2uv&YM>AdC_L&;VNHlw`vF)dd{rMki#+Sbu+$K z6GUfg9hdZjM(WNCqW=nCDu}x6mV=nvw~SmKqK=aSA-R^z{#nAsZg*&o4Rnq%h`*dj zt!d>3l|s%EAlo<=dYw90A`o8sG5^g*sHMV(4m-#%Av!iA1B1?=Ir*Zw@FP7h-G`p}`0}!+2XL9}p zjW^&^X+O6%Zuw51bMK{GVoAr!SV*bO{fQkjF-cqbj-md$KR)apzt3)9c>su`}gMY&Z;k#oOX8`+1690d$0t3W@*91 zYUtX<{p$1W=o_~r3%3uWw9}){nCrROTxAsO`CUi>krQ8MH+VX3EIV5*ViWCtn>CS- z-(YokyiNjMfP|Xy(X3Y zB4N*V{Cs5e3gvW8i<|j-H+!xbFYpy>??`KMd(=58^_=G^O2yGH02|q6u?5rE_9gt_ z2jy-1N?PH|9uxQG2FH5B)n_6l?>`r34h{2p5%YMab0Op_5h8K%+yvC^ZW+1ylC^^7 zg_FJ*SDRlL#U;(`>+l1=6pfSKiEIakSGGL{iFekc@enns1)aRX)15_W*KdJct%UnO zm{86=DhqDvMc&Lw7zyv$fuYzpvDX}I4vZFaL6`c6rRSBi-wUKY;EXfmfO%%tXzl2s zCyXQhxK4oa2PIlyHgQOB)!XkzYtg=`mpgS+9bCKBht!1-s9frB{SY!ybh|`-w*CZS z>K27O$IO2Ba6c^o|9sH*71|*KApGDDt~?Bxadwu@{!m#%(z6QjDT~x`+MvnK7hodp zID~kXaRJZh?0>QkuZk=qYzE`D>zp^35q&2c_@RCDV~lOycygH*fR^Mh_@R{3I?o6O zgS|Xw(sXI@u&3x;qE#5u?&!|&1@h&U*O~Q$Du;I$aR(kR#dBL)jCWd<0Z0y=3SQX9 z+v%F3u^*pW7a#IC5cU~>%q^@vE!X0O4)7ibY~>ER#k9uFyX_5>R>9n@;k?p6P`*~t z%nwxo^sWjv8{FDi44y z$1N5UuduvkzZX9L6s;gu<4To9x-3MGR-;Z8OR~3rPNJ4>v1Nq;_+^tXogKR+q!p&o z8V}}Yu9amJFUFpBYhC^E!=I9@s{goa5n^t4P7_x6~8E`FYBUGo^E|eY;2;@&``68th>90^@kDvhe;intxQnO5G2pZWAnyw1uMw zRYSROAs;{{_9xqskqe#$6ti=csbX-YORiP;7uP7osM8^&*A=S8o&~U5vLoX>dtvDs zB_<97+l{dlWcA+MND#Hi7&;89Yc;C95S*vAv!0#N!Y6$&TlS4?@Li#O=Vrkjxl757SjcGys zk-b%tBlWmt{9yN@%$G(~wa#|qcy{F+o?|9HXS5!;Js7aV`2X192S>_}$&Qjd22O?D zy~IH2SaL<-iP`~vT2#c;XZ<1T+sjVEiA zJPF3>++3cne1bpXrQ_n((L2DmEi z!!f}Q<22bQco{&siMwrHELD^J8yu*>^jej^eYDNFbEF)<3(UE3jeohw^0)f8^Go|lS ze1QU}l}zS+JDxT!83Uby{lP~~q98J5vk{tyBUbD~uAYT2tb~>N5^i~3KCidsB{waH zpOc#2X(cNB1F&c`ONDveZnv6uylMDr@RqmU?Zg1{rjo=F?qPpfVGgyia1(jtMoDfe zL@z%t7~s6}7M^mp>&UTO7T(HE=Os)G{xU0`12OaOAmu)+=69rVj)bqDE~s;K>*}Od zY<{0H#y1E%epplp0sS2PpCZ8CuM=~8=Qf!QkHm5II|!pbrJkhQU7B*CWt#&qccFb6 z^B0|ry~aP=l6+d(KjpYh!)9w&OnoGOX)NHK#jM^)Udhws<_nFw_ITCwe`cOuO**~n z(AWI)&Tgs%_`5{-+z>4^RMp?GOf`I4MuyryqWi^5HY{!WBbtK>5Z&MOdpyA+w@cZU z*#&cZkTFncE7o^WiRtphy3V*0J0H$VOA)U5joKl~> ziMjj9B{4PB&hfqAhfDaI1jXit)n~^*J)V5n3r!rrd|Z9|ZU{9l zu(Gf&M>R*K3;oZp-MH?b0;&XeqYqvd&}revF%fGH@|RqH%^7Q65ANPKbwJb4Fg~XP zAXXpN$<)_)Gk5f?&G2+#&ifSe#yZe#+6?+ZW@FKlK~vd-=kFYha*oddC}9K)jj9suIibBDDe&J~vI@GDiC* zzr$9aKZb;Y6@uoHl@jjLNT_J;u|nhl&AdLjdCL|PM`{;^QA@yVN{8A4y#R+ZAe|;Z zQB&20e(N_fWY3IKdIQk&w34|J-QMu~H6L5wN2mbQ8vjK-E`MCF90qOE$JW^Td6m*Q z>c5ecisvz0G^h6T-bX4-iA9CG{n@8=-OyP@CMA>G(a%Z_mn<==%RD>9eo<0moTl9> zIzKd*KHe#sFxMp~?)gFE`r_HZsg2R)bGMZbpDJx$uo?Ei4Qf1|B(lyuJsIL*MCrF9 zK#@u2vboK#F``sk^{cF#?>$@8C0m>xkQol18ZMppJEa@`s`BM=eZlDFb zXzrPx*ZseKX>`JVrfz&0%TE@?SfW>5N{$W%jF-bUq102Ari(rIpdmAZN4bqoWH9(@ ze*%U34Ow!6T=d#wMC(y`!IDM`w*=h|5lpDYV31MEyQIQ1Vaz=qF`odl)_%8n;})FJ zcsfb_2?d`NewyA@`dO#huBP)jq2COo8C|lqnj^)_koSiTXk(EyW&FfRUL&E$!ciKFet3+QXi1LJT1Fz^F^((ak#Q2goxi70Q751~&>%!?mrn1Wto6){h%++f@;E^W$`?B0 zZsklEm-UD#4=7O?LeC#@rS+PeUj6`5uT0Dot`s(Ahk&sMu(_?7g1d8R7v?Z6TNOs^ zze(B0DF(~5KYCwt`j6+@fS)<5eDb(i=hG2eSdyJpn(c46Q?Gh;bF3*WjZk_iW{sqk zYEd~n-7lRz7&A=VpRawOF#kefp8eZrPmk~4Ck?zLxTxyMju(fIU5cOfHI$`l4PQ4O z%0j&4<#OY6%}f?B{ACjvYtki#ld>_2D3#?bpvNv2w=&mvWHUIwUI z%c9z5faWBb-9-P);<`gi`OF5%5iT;Ngv!c+8U*<{&ne%j>cR`y9QP%pN6lc|>GEcu zVTZZv-ElMr2yT7LKE-Qyqqwg14_#Tann z?Zq1|na$foCim|IX8(zo(K?7vIyHe00Jdp->zM3LzmNtX8n#Csk*Lu%`cn~PUw8dl zs89ZC40j#3@5sIBH-$QnQuqH%CjKFN330@;jcl;j5?Ws`5FZWU^$ppDEJw{QgzR|< z##H&aDn|NEBK+E-UO18&_l$ zJN=~!F&`0A`b6SiVa26KNMT5@pVd2JRX}J|Ytb-|d}AC&AlHASr$r}~~vT61d{VB_klT=^=Vh4Ai4U!(Qj-$Y9Ce#FxcF5cm7b#FCWel2{8pv(U4 z*?7-iRs1aicj}n^Mkuy&A2_N;sh&HI69hW8N1!1O_gq|Xya}^tsst(BfLb7O06s@n zDcrA2T*I`OaC|AgOKLkN@#ha@%w+SN1uj&e{?nEE68D*b$h0hX(vY@wm!5;I2h4p{ zVZan?JgBL84}H=ZP8F?)RA)l;lES=mWEzP|*{53!P_rFfP2o9JKm;4Y%9zbCHtK}r zig+yv1|h;c8DI13wu2o#q1QdF&^Fz@2Vs4kQ7SCcAgSNv_;?Sja6Fjg3nJYY;ISJv zZ#E#p=+gwoC%T3FoV+{cs6&!B1D#?aeAsOUDcKVKH23 z)WYFJYgZW{*wo6OVpJr@ zyF@QT^>w@$g4K@_w+j@m<31s;_6%vYUqCB6qd3Cq_P-Gy*_A29bqGvoEoNcOkhpss z%IX}hAIr^z{7E5^_d}j^NofhhXEgI&F!*kk8um|V9v~mlYBFmb( zejWk`jn+GdyZ;1hQo2C(NjjPIz|CJ>bAqCZoOkP=TBeLocSl1rSjgv*7-5CS#+-=b zM^j6hLk^?j60N2PY5pGDvv%TAD$L|na_fLgJ^G)eKp}qG<9YOTk;(IW0P2UVw^T1b zcwTMT*h=p9~IRk+?ZuCqHbPY#+

Z=j{df(Fz-X%ml+}3y~jBy+90>O0v;AWxs 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 w;5hax(O>+%VFexVhGTG*>>BY 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%0A)Qiyc@nD&fpVu6c3{2sx`v$qh;J90B zqcX#OyD>cQ&CQxWo4-JTqFiY3!0^9+^?iWgG)<~~!(!UaG|ISZvqlu6GWympr*mIs zc3!o)0a+z53J?we`YR6!T4y~CwTgj#g*-wTC*~HJDkZC1H(?vl7g==}HemJ9rO`j9 zwZ!>9PZ7#Gyn9DB{-u%5zY^*A*M|9_cJrsb3+yQGz>tBvH$NWV?)Gu}H);(%llzQV zNgOnOI)7Bl(HaPtQ_yf$kl%SobwrHUUeXi~fikq_I)hx>gq35T^tRF<&v&8lsymc2 z3X?`!5;e4SId!ouu8EnjmBNlWj};pA!Xrv=myyqy;YY}`=Vsh{XOHb;FT{<1P^k)N z%}`6wlhx4b)%A^B+9${`_`y#iAwe9svDx{i!y@>qMXg#Y7%(OC4N5z`9Lj04Ha61| zsf=G(L-&`7{h3rpl(@9Uf%~R@XLeVa5~VmYwLIfmyDV2N!!AVj%X%Fd7On9%*@tOJ z@0Qlt#-dpjb-#PaOVAA#8mO@G?N7@0#e$g?YDG?$E{Ln5%taYS+b_TSicxi^CJ=NRBt2|ai)VSCDCzmb;9{# z-BIsy0reU^N0V>(c#d~~?k}}Ye@Woo^?d>bACW*urQ>8gupR(Ym)167y^BsySY5)z z-%0=G0FdDM_YFbGjJcZt_u^%!xc_<7daClN&>Xibq}MXssBs(h^KJH*HN%{;H73OU z9nc0bR^Bi+yYYM(zPA>Ne!{(K7b#Jt5B8SUBT=D}4H_pWr*s7ug^mB60*z@z6V{*) z-2h>@;|E3twVG&vA&KsMzXC^5%SVtfGR;nVGC68Y@quh}@L(j$Z<(esmPMtM8#)s& z&kSVju2q32=`aTV2;XX9b&U8$k&v2W$IzFXpFd4+Ic(?}%p=XLgr({MyxWjZ=!*S!a;!it z*T@?vZQv=aSeeb*;Ph~b0sP6z(Fr2$;%P$w=NQNA_M+bb)U!>U>o_~ z!NwRpNUuaI#DTm4NPba3)YU)ZG&*x|{CMWyl7W=Ru34)oC?izK<70CNwGKs7t(6Im zt}k%kR9`sXaDeqkFl+~Vi{*Qr1S`)18d0g1Zz+?QTu&4g!H>TOc4vZO6ndW~(5t$% z3;fmv@0M)O1#Pi(54h&Ju~$;JE#z`&u{KoTJjk)8Aryd7j_6}i)Z??d}9VVD>V$;4p2XIJeV2VmDovGl50uagNmjTC- x^w>jGj$ndV8o893ie4LY9Yi|!K)Hkf>2@it`lR9gyr0028Oq{V(UJ4l{}1+6a{vGU From b6931020e4189789cff581398f2c2d32ba454a9a Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Thu, 8 Aug 2024 17:06:19 +0200 Subject: [PATCH 141/163] docs: readme --- media/repo-header.png | Bin 252933 -> 254089 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/media/repo-header.png b/media/repo-header.png index 765d9e97473e09ea48578e1d1839cdd33e2fc05f..0c89fd57e7b77c32816c3a07ddad0896354806d6 100644 GIT binary patch delta 134806 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 SJby7yN}oJ_#)4_?PWlg$1j delta 132443 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 Ar2qf` From e2c36c4383ca372accc32a730c32980206c23819 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 25 Apr 2025 22:42:24 +0200 Subject: [PATCH 142/163] chore: dependencies update --- package.json | 4 +- packages/angular-time/vite.config.ts | 4 +- packages/react-time/package.json | 2 +- packages/react-time/vite.config.ts | 4 +- packages/solid-time/vite.config.ts | 5 +- packages/time/vite.config.ts | 4 +- packages/vue-time/vite.config.ts | 4 +- pnpm-lock.yaml | 2189 ++++++++++++++++---------- 8 files changed, 1359 insertions(+), 857 deletions(-) diff --git a/package.json b/package.json index aa81d1b3..6d0d7c8e 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "namespace": "@tanstack", "devDependencies": { "@solidjs/testing-library": "^0.8.6", - "@tanstack/config": "^0.6.0", + "@tanstack/config": "^0.18.0", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", @@ -71,7 +71,7 @@ "typescript50": "npm:typescript@5.0", "typescript51": "npm:typescript@5.1", "vite": "^5.1.5", - "vitest": "^1.3.1", + "vitest": "^3.1.2", "vue": "^3.3.4" } } diff --git a/packages/angular-time/vite.config.ts b/packages/angular-time/vite.config.ts index 1df7558a..9656801c 100644 --- a/packages/angular-time/vite.config.ts +++ b/packages/angular-time/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackBuildConfig } from '@tanstack/config/build' +import { tanstackViteConfig } from '@tanstack/config/vite' const config = defineConfig({ test: { @@ -16,7 +16,7 @@ const config = defineConfig({ export default mergeConfig( config, - tanstackBuildConfig({ + tanstackViteConfig({ entry: './src/index.ts', srcDir: './src', exclude: ['./src/tests'], diff --git a/packages/react-time/package.json b/packages/react-time/package.json index c3f9d136..9e6f0405 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -67,6 +67,6 @@ }, "devDependencies": { "@types/use-sync-external-store": "^0.0.3", - "@vitejs/plugin-react": "^4.2.1" + "@vitejs/plugin-react": "^4.4.1" } } diff --git a/packages/react-time/vite.config.ts b/packages/react-time/vite.config.ts index 68b84116..c2243e56 100644 --- a/packages/react-time/vite.config.ts +++ b/packages/react-time/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackBuildConfig } from '@tanstack/config/build' +import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' const config = defineConfig({ @@ -17,7 +17,7 @@ const config = defineConfig({ export default mergeConfig( config, - tanstackBuildConfig({ + tanstackViteConfig({ entry: './src/index.ts', srcDir: './src', exclude: ['./src/tests'], diff --git a/packages/solid-time/vite.config.ts b/packages/solid-time/vite.config.ts index 67c596e7..b3bd4a08 100644 --- a/packages/solid-time/vite.config.ts +++ b/packages/solid-time/vite.config.ts @@ -1,5 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackBuildConfig } from '@tanstack/config/build' +import { tanstackViteConfig } from '@tanstack/config/vite' + import solid from 'vite-plugin-solid' const config = defineConfig({ @@ -17,7 +18,7 @@ const config = defineConfig({ export default mergeConfig( config, - tanstackBuildConfig({ + tanstackViteConfig({ entry: './src/index.ts', srcDir: './src', exclude: ['./src/tests'], diff --git a/packages/time/vite.config.ts b/packages/time/vite.config.ts index a80956da..52c6ef48 100644 --- a/packages/time/vite.config.ts +++ b/packages/time/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackBuildConfig } from '@tanstack/config/build' +import { tanstackViteConfig } from '@tanstack/config/vite' const config = defineConfig({ test: { @@ -14,7 +14,7 @@ const config = defineConfig({ export default mergeConfig( config, - tanstackBuildConfig({ + tanstackViteConfig({ entry: './src/index.ts', srcDir: './src', exclude: ['./src/tests'], diff --git a/packages/vue-time/vite.config.ts b/packages/vue-time/vite.config.ts index 35eb453b..433824a8 100644 --- a/packages/vue-time/vite.config.ts +++ b/packages/vue-time/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackBuildConfig } from '@tanstack/config/build' +import { tanstackViteConfig } from '@tanstack/config/vite' import vue from '@vitejs/plugin-vue' const config = defineConfig({ @@ -21,7 +21,7 @@ const config = defineConfig({ export default mergeConfig( config, - tanstackBuildConfig({ + tanstackViteConfig({ entry: './src/index.ts', srcDir: './src', exclude: ['./src/tests'], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37c8fc72..cb21b5d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,11 +12,11 @@ importers: specifier: ^0.8.6 version: 0.8.6(@solidjs/router@0.13.1)(solid-js@1.7.8) '@tanstack/config': - specifier: ^0.6.0 - version: 0.6.0(@types/node@18.19.3)(esbuild@0.20.2)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5) + specifier: ^0.18.0 + version: 0.18.0(@types/node@18.19.3)(eslint@8.56.0)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5) '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.4.2(vitest@1.3.1) + version: 6.4.2(vitest@3.1.2) '@testing-library/react': specifier: ^14.2.1 version: 14.2.1(react-dom@18.2.0)(react@18.2.0) @@ -46,7 +46,7 @@ importers: version: 6.21.0(eslint@8.56.0)(typescript@5.2.2) '@vitest/coverage-istanbul': specifier: ^1.3.1 - version: 1.3.1(vitest@1.3.1) + version: 1.3.1(vitest@3.1.2) eslint: specifier: ^8.56.0 version: 8.56.0 @@ -111,8 +111,8 @@ importers: specifier: ^5.1.5 version: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) vitest: - specifier: ^1.3.1 - version: 1.3.1(@types/node@18.19.3)(jsdom@24.0.0) + specifier: ^3.1.2 + version: 3.1.2(@types/node@18.19.3)(jsdom@24.0.0) vue: specifier: ^3.3.4 version: 3.3.4 @@ -167,8 +167,8 @@ importers: specifier: ^0.0.3 version: 0.0.3 '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.2.1(vite@5.2.6) + specifier: ^4.4.1 + version: 4.4.1(vite@5.2.6) packages/solid-time: dependencies: @@ -349,7 +349,7 @@ packages: undici: 6.7.1 vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) watchpack: 2.4.0 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) webpack-dev-middleware: 6.1.2(webpack@5.90.3) webpack-dev-server: 4.15.1(webpack@5.90.3) webpack-merge: 5.10.0 @@ -385,7 +385,7 @@ packages: dependencies: '@angular-devkit/architect': 0.1703.2 rxjs: 7.8.1 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) webpack-dev-server: 4.15.1(webpack@5.90.3) transitivePeerDependencies: - chokidar @@ -507,11 +507,25 @@ packages: picocolors: 1.0.0 dev: true + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.26.8: + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} @@ -541,7 +555,7 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.23.6 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) '@babel/helpers': 7.24.1 @@ -550,7 +564,7 @@ packages: '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -581,6 +595,29 @@ packages: - supports-color dev: true + /@babel/core@7.26.10: + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} @@ -601,6 +638,17 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.27.0: + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -626,6 +674,17 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-compilation-targets@7.27.0: + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.0): resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} engines: {node: '>=6.9.0'} @@ -664,7 +723,7 @@ packages: '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - debug: 4.3.4 + debug: 4.4.0 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -679,7 +738,7 @@ packages: '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - debug: 4.3.4 + debug: 4.4.0 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -727,6 +786,16 @@ packages: '@babel/types': 7.24.0 dev: true + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} @@ -769,6 +838,20 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} @@ -781,6 +864,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-plugin-utils@7.26.5: + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.0): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -830,15 +918,30 @@ packages: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-wrap-function@7.22.20: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} @@ -859,6 +962,14 @@ packages: - supports-color dev: true + /@babel/helpers@7.27.0: + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + dev: true + /@babel/highlight@7.24.2: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} @@ -876,6 +987,14 @@ packages: dependencies: '@babel/types': 7.24.0 + /@babel/parser@7.27.0: + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.27.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.0): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} @@ -1513,24 +1632,24 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + /@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10): + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + /@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10): + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 dev: true /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.0): @@ -1794,6 +1913,15 @@ packages: '@babel/types': 7.24.0 dev: true + /@babel/template@7.27.0: + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + dev: true + /@babel/traverse@7.24.1: resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} @@ -1812,6 +1940,21 @@ packages: - supports-color dev: true + /@babel/traverse@7.27.0: + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} @@ -1820,20 +1963,29 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@commitlint/parse@18.6.1: - resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} + /@babel/types@7.27.0: + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + + /@commitlint/parse@19.8.0: + resolution: {integrity: sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.6.1 + '@commitlint/types': 19.8.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: true - /@commitlint/types@18.6.1: - resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} + /@commitlint/types@19.8.0: + resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} engines: {node: '>=v18'} dependencies: - chalk: 4.1.2 + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.3.0 dev: true /@discoveryjs/json-ext@0.5.7: @@ -1841,6 +1993,31 @@ packages: engines: {node: '>=10.0.0'} dev: true + /@emnapi/core@1.4.3: + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + requiresBuild: true + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + dev: true + optional: true + + /@emnapi/runtime@1.4.3: + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@emnapi/wasi-threads@1.0.2: + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + /@ericcornelissen/bash-parser@0.5.2: resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} engines: {node: '>=4'} @@ -2497,11 +2674,26 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/eslint-utils@4.6.1(eslint@8.56.0): + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2524,6 +2716,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@9.25.1: + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@gerrit0/mini-shiki@1.27.2: + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + dependencies: + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2612,6 +2817,10 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -2619,6 +2828,18 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@kwsites/file-exists@1.1.1: + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@kwsites/promise-deferred@1.1.1: + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + dev: true + /@leichtgewicht/ip-codec@2.0.5: resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} dev: true @@ -2630,27 +2851,27 @@ packages: call-bind: 1.0.7 dev: true - /@microsoft/api-extractor-model@7.28.13(@types/node@18.19.3): - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + /@microsoft/api-extractor-model@7.29.6(@types/node@18.19.3): + resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.3) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor@7.43.0(@types/node@18.19.3): - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + /@microsoft/api-extractor@7.47.7(@types/node@18.19.3): + resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@18.19.3) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.3) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@18.19.3) - '@rushstack/ts-command-line': 4.19.1(@types/node@18.19.3) + '@microsoft/api-extractor-model': 7.29.6(@types/node@18.19.3) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.0(@types/node@18.19.3) + '@rushstack/ts-command-line': 4.22.6(@types/node@18.19.3) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -2661,18 +2882,28 @@ packages: - '@types/node' dev: true - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + /@microsoft/tsdoc-config@0.17.1: + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 jju: 1.4.0 - resolve: 1.19.0 + resolve: 1.22.8 + dev: true + + /@microsoft/tsdoc@0.15.1: + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} dev: true - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + /@napi-rs/wasm-runtime@0.2.9: + resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + requiresBuild: true + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 dev: true + optional: true /@ngtools/webpack@17.3.2(@angular/compiler-cli@17.1.2)(typescript@5.3.3)(webpack@5.90.3): resolution: {integrity: sha512-E8zejFF4aJ8l2XcF+GgnE/1IqsZepnPT1xzulLB4LXtjVuXLFLoF9xkHQwxs7cJWWZsxd/SlNsCIcn/ezrYBcQ==} @@ -2684,7 +2915,7 @@ packages: dependencies: '@angular/compiler-cli': 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) typescript: 5.3.3 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /@nodelib/fs.scandir@2.1.5: @@ -3173,8 +3404,8 @@ packages: dev: true optional: true - /@rushstack/node-core-library@4.0.2(@types/node@18.19.3): - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + /@rushstack/node-core-library@5.7.0(@types/node@18.19.3): + resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -3182,38 +3413,40 @@ packages: optional: true dependencies: '@types/node': 18.19.3 + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.8 semver: 7.5.4 - z-schema: 5.0.5 dev: true - /@rushstack/rig-package@0.5.2: - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + /@rushstack/rig-package@0.5.3: + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 dev: true - /@rushstack/terminal@0.10.0(@types/node@18.19.3): - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + /@rushstack/terminal@0.14.0(@types/node@18.19.3): + resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.3) + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) '@types/node': 18.19.3 supports-color: 8.1.1 dev: true - /@rushstack/ts-command-line@4.19.1(@types/node@18.19.3): - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + /@rushstack/ts-command-line@4.22.6(@types/node@18.19.3): + resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} dependencies: - '@rushstack/terminal': 0.10.0(@types/node@18.19.3) + '@rushstack/terminal': 0.14.0(@types/node@18.19.3) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -3221,6 +3454,24 @@ packages: - '@types/node' dev: true + /@shikijs/engine-oniguruma@1.29.2: + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + dev: true + + /@shikijs/types@1.29.2: + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + dev: true + + /@shikijs/vscode-textmate@10.0.2: + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + dev: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -3255,33 +3506,84 @@ packages: solid-js: 1.7.8 dev: true - /@tanstack/config@0.6.0(@types/node@18.19.3)(esbuild@0.20.2)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5): - resolution: {integrity: sha512-ndVPsyXWZFz3RcpRF7q5L4Ol5zY+m1H2lAiufw+J4BrV09042PETU2OZAREYz88ZcLtu6p+LZAHKltmqrL8gDg==} + /@stylistic/eslint-plugin-js@4.2.0(eslint@8.56.0): + resolution: {integrity: sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + dev: true + + /@tanstack/config@0.18.0(@types/node@18.19.3)(eslint@8.56.0)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5): + resolution: {integrity: sha512-yHn8bj7ztyH5V3ilbm9J+G630qk5EIc5dRljM3lGqwrrpgbVIgN5vH0RhEr86ATW98T20VhYc5B3yLf/bE45bw==} engines: {node: '>=18'} - hasBin: true - requiresBuild: true dependencies: - '@commitlint/parse': 18.6.1 - chalk: 5.3.0 - commander: 12.0.0 - current-git-branch: 1.1.0 - esbuild-register: 3.5.0(esbuild@0.20.2) - git-log-parser: 1.2.0 - interpret: 3.1.1 + '@tanstack/eslint-config': 0.1.0(eslint@8.56.0)(typescript@5.2.2) + '@tanstack/publish-config': 0.1.0 + '@tanstack/typedoc-config': 0.2.0(typescript@5.2.2) + '@tanstack/vite-config': 0.2.0(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5) + transitivePeerDependencies: + - '@types/node' + - eslint + - rollup + - supports-color + - typescript + - vite + dev: true + + /@tanstack/eslint-config@0.1.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} + engines: {node: '>=18'} + dependencies: + '@eslint/js': 9.25.1 + '@stylistic/eslint-plugin-js': 4.2.0(eslint@8.56.0) + eslint-plugin-import-x: 4.11.0(eslint@8.56.0)(typescript@5.2.2) + eslint-plugin-n: 17.17.0(eslint@8.56.0) + globals: 16.0.0 + typescript-eslint: 8.31.0(eslint@8.56.0)(typescript@5.2.2) + vue-eslint-parser: 9.4.3(eslint@8.56.0) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + dev: true + + /@tanstack/publish-config@0.1.0: + resolution: {integrity: sha512-nI4F7/SpT6BMoigq1VmrrNe3A6Hsua9XcZNql+qzK2zJUOcKBRqMvC22n3eKcjsbZuWIFvkIC0ThsuBVYCKXfA==} + engines: {node: '>=18'} + dependencies: + '@commitlint/parse': 19.8.0 jsonfile: 6.1.0 - liftoff: 4.0.0 - luxon: 3.4.4 - minimist: 1.2.8 + semver: 7.7.1 + simple-git: 3.27.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@tanstack/typedoc-config@0.2.0(typescript@5.2.2): + resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} + engines: {node: '>=18'} + dependencies: + typedoc: 0.27.9(typescript@5.2.2) + typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9) + transitivePeerDependencies: + - typescript + dev: true + + /@tanstack/vite-config@0.2.0(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5): + resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} + engines: {node: '>=18'} + dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.13.1) - semver: 7.6.0 - stream-to-array: 2.3.0 - v8flags: 4.0.1 - vite-plugin-dts: 3.8.1(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5) - vite-plugin-externalize-deps: 0.8.0(vite@5.1.5) - vite-tsconfig-paths: 4.3.2(typescript@5.2.2)(vite@5.1.5) + vite-plugin-dts: 4.2.3(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5) + vite-plugin-externalize-deps: 0.9.0(vite@5.1.5) + vite-tsconfig-paths: 5.1.4(typescript@5.2.2)(vite@5.1.5) transitivePeerDependencies: - '@types/node' - - esbuild - rollup - supports-color - typescript @@ -3302,7 +3604,7 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@6.4.2(vitest@1.3.1): + /@testing-library/jest-dom@6.4.2(vitest@3.1.2): resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: @@ -3331,7 +3633,7 @@ packages: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.3.1(@types/node@18.19.3)(jsdom@24.0.0) + vitest: 3.1.2(@types/node@18.19.3)(jsdom@24.0.0) dev: true /@testing-library/react@14.2.1(react-dom@18.2.0)(react@18.2.0): @@ -3382,6 +3684,14 @@ packages: path-browserify: 1.0.1 dev: true + /@tybys/wasm-util@0.9.0: + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: true @@ -3445,6 +3755,12 @@ packages: '@types/node': 18.19.26 dev: true + /@types/conventional-commits-parser@5.0.1: + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + dependencies: + '@types/node': 18.19.26 + dev: true + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: @@ -3488,6 +3804,12 @@ packages: '@types/serve-static': 1.15.5 dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true @@ -3601,6 +3923,10 @@ packages: '@types/node': 18.19.26 dev: true + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: true + /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: true @@ -3640,6 +3966,30 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0)(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/type-utils': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 8.31.0 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.2.2): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3661,6 +4011,24 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@8.31.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + eslint: 8.56.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@6.21.0: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3669,6 +4037,14 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true + /@typescript-eslint/scope-manager@8.31.0: + resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + dev: true + /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.2.2): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3689,11 +4065,33 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils@8.31.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.2.2) + '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + debug: 4.4.0 + eslint: 8.56.0 + ts-api-utils: 2.1.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@6.21.0: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/types@8.31.0: + resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3716,6 +4114,25 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@8.31.0(typescript@5.2.2): + resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.2.2): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3735,6 +4152,23 @@ packages: - typescript dev: true + /@typescript-eslint/utils@8.31.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.2.2) + eslint: 8.56.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/visitor-keys@6.21.0: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3743,10 +4177,156 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@ungap/structured-clone@1.2.0: + /@typescript-eslint/visitor-keys@8.31.0: + resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.31.0 + eslint-visitor-keys: 4.2.0 + dev: true + + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true + /@unrs/resolver-binding-darwin-arm64@1.7.0: + resolution: {integrity: sha512-vIWAU56r2lZAmUsljp6m9+hrTlwNkZH6pqnSPff2WxzofV+jWRSHLmZRUS+g+VE+LlyPByifmGGHpJmhWetatg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-x64@1.7.0: + resolution: {integrity: sha512-+bShFLgtdwuNteQbKq3X230754AouNMXSLDZ56EssgDyckDt6Ld7wRaJjZF0pY671HnY2pk9/amO4amAFzfN1A==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-freebsd-x64@1.7.0: + resolution: {integrity: sha512-HJjXb3aIptDZQ0saSmk2S4W1pWNVZ2iNpAbNGZOfsUXbi8xwCmHdVjErNS92hRp7djuDLup1OLrzOMtTdw5BmA==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-gnueabihf@1.7.0: + resolution: {integrity: sha512-NF3lk7KHulLD97UE+MHjH0mrOjeZG8Hz10h48YcFz2V0rlxBdRSRcMbGer8iH/1mIlLqxtvXJfGLUr4SMj0XZg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-musleabihf@1.7.0: + resolution: {integrity: sha512-Gn1c/t24irDgU8yYj4vVG6qHplwUM42ti9/zYWgfmFjoXCH6L4Ab9hh6HuO7bfDSvGDRGWQt1IVaBpgbKHdh3Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-gnu@1.7.0: + resolution: {integrity: sha512-XRrVXRIUP++qyqAqgiXUpOv0GP3cHx7aA7NrzVFf6Cc8FoYuwtnmT+vctfSo4wRZN71MNU4xq2BEFxI4qvSerg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-musl@1.7.0: + resolution: {integrity: sha512-Sligg+vTDAYTXkUtgviPjGEFIh57pkvlfdyRw21i9gkjp/eCNOAi2o5e7qLGTkoYdJHZJs5wVMViPEmAbw2/Tg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-ppc64-gnu@1.7.0: + resolution: {integrity: sha512-Apek8/x+7Rg33zUJlQV44Bvq8/t1brfulk0veNJrk9wprF89bCYFMUHF7zQYcpf2u+m1+qs3mYQrBd43fGXhMA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-gnu@1.7.0: + resolution: {integrity: sha512-kBale8CFX5clfV9VmI9EwKw2ZACMEx1ecjV92F9SeWTUoxl9d+LGzS6zMSX3kGYqcfJB3NXMwLCTwIDBLG1y4g==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-musl@1.7.0: + resolution: {integrity: sha512-s/Q33xQjeFHSCvGl1sZztFZF6xhv7coMvFz6wa/x/ZlEArjiQoMMwGa/Aieq1Kp/6+S13iU3/IJF0ga6/451ow==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-s390x-gnu@1.7.0: + resolution: {integrity: sha512-7PuNXAo97ydaxVNrIYJzPipvINJafDpB8pt5CoZHfu8BmqcU6d7kl6/SABTnqNffNkd6Cfhuo70jvGB2P7oJ/Q==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-gnu@1.7.0: + resolution: {integrity: sha512-fNosEzDMYItA4It+R0tioHwKlEfx/3TkkJdP2x9B5o9R946NDC4ZZj5ZjA+Y4NQD2V/imB3QPAKmeh3vHQGQyA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-musl@1.7.0: + resolution: {integrity: sha512-gHIw42dmnVcw7osjNPRybaXhONhggWkkzqiOZzXco1q3OKkn4KsbDylATeemnq3TP+L1BrzSqzl0H9UTJ6ji+w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-wasm32-wasi@1.7.0: + resolution: {integrity: sha512-yq7POusv63/yTkNTaNsnXU/SAcBzckHyk1oYrDXqjS1m/goaWAaU9J9HrsovgTHkljxTcDd6PMAsJ5WZVBuGEQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.2.9 + dev: true + optional: true + + /@unrs/resolver-binding-win32-arm64-msvc@1.7.0: + resolution: {integrity: sha512-/IPZPbdri9jglHonwB3F7EpQZvBK3ObH+g4ma/KDrqTEAECwvgE10Unvo0ox3LQFR/iMMAkVY+sGNMrMiIV/QQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-ia32-msvc@1.7.0: + resolution: {integrity: sha512-NGVKbHEdrLuJdpcuGqV5zXO3v8t4CWOs0qeCGjO47RiwwufOi/yYcrtxtCzZAaMPBrffHL7c6tJ1Hxr17cPUGg==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-x64-msvc@1.7.0: + resolution: {integrity: sha512-Jf14pKofg58DIwcZv4Wt9AyVVe7bSJP8ODz+EP9nG/rho08FQzan0VOJk1g6/BNE1RkoYd+lRTWK+/BgH12qoQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@vitejs/plugin-basic-ssl@1.1.0(vite@5.1.5): resolution: {integrity: sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==} engines: {node: '>=14.6.0'} @@ -3756,17 +4336,17 @@ packages: vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) dev: true - /@vitejs/plugin-react@4.2.1(vite@5.2.6): - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + /@vitejs/plugin-react@4.4.1(vite@5.2.6): + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 + react-refresh: 0.17.0 vite: 5.2.6(@types/node@18.19.3) transitivePeerDependencies: - supports-color @@ -3783,7 +4363,7 @@ packages: vue: 3.3.4 dev: true - /@vitest/coverage-istanbul@1.3.1(vitest@1.3.1): + /@vitest/coverage-istanbul@1.3.1(vitest@3.1.2): resolution: {integrity: sha512-aBVgQ2eY9gzrxBJjGKbWgatTU2w1CacEx0n8OMctPzl9836KqoM5X/WigJpjM7wZEtX2N0ZTE5KDGPmVM+o2Wg==} peerDependencies: vitest: 1.3.1 @@ -3797,67 +4377,88 @@ packages: magicast: 0.3.3 picocolors: 1.0.0 test-exclude: 6.0.0 - vitest: 1.3.1(@types/node@18.19.3)(jsdom@24.0.0) + vitest: 3.1.2(@types/node@18.19.3)(jsdom@24.0.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + /@vitest/expect@3.1.2: + resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - chai: 4.4.1 + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + tinyrainbow: 2.0.0 dev: true - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + /@vitest/mocker@3.1.2(vite@5.2.6): + resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true dependencies: - '@vitest/utils': 1.3.1 - p-limit: 5.0.0 - pathe: 1.1.2 + '@vitest/spy': 3.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 5.2.6(@types/node@18.19.3) dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/pretty-format@3.1.2: + resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} dependencies: - magic-string: 0.30.8 - pathe: 1.1.2 - pretty-format: 29.7.0 + tinyrainbow: 2.0.0 dev: true - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + /@vitest/runner@3.1.2: + resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} dependencies: - tinyspy: 2.2.1 + '@vitest/utils': 3.1.2 + pathe: 2.0.3 dev: true - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + /@vitest/snapshot@3.1.2: + resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 3.1.2 + magic-string: 0.30.17 + pathe: 2.0.3 dev: true - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + /@vitest/spy@3.1.2: + resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} dependencies: - '@volar/source-map': 1.11.1 + tinyspy: 3.0.2 dev: true - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + /@vitest/utils@3.1.2: + resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} dependencies: - muggle-string: 0.3.1 + '@vitest/pretty-format': 3.1.2 + loupe: 3.1.3 + tinyrainbow: 2.0.0 dev: true - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + /@volar/language-core@2.4.13: + resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} dependencies: - '@volar/language-core': 1.11.1 + '@volar/source-map': 2.4.13 + dev: true + + /@volar/source-map@2.4.13: + resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} + dev: true + + /@volar/typescript@2.4.13: + resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} + dependencies: + '@volar/language-core': 2.4.13 path-browserify: 1.0.1 + vscode-uri: 3.1.0 dev: true /@vue/compiler-core@3.3.4: @@ -3919,6 +4520,13 @@ packages: '@vue/compiler-dom': 3.3.4 '@vue/shared': 3.3.4 + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + /@vue/composition-api@1.7.2(vue@3.3.4): resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} peerDependencies: @@ -3926,24 +4534,23 @@ packages: dependencies: vue: 3.3.4 - /@vue/language-core@1.8.27(typescript@5.2.2): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + /@vue/language-core@2.1.6(typescript@5.2.2): + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 + '@volar/language-core': 2.4.13 '@vue/compiler-dom': 3.4.21 + '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.4.21 computeds: 0.0.1 minimatch: 9.0.3 - muggle-string: 0.3.1 + muggle-string: 0.4.1 path-browserify: 1.0.1 typescript: 5.2.2 - vue-template-compiler: 2.7.16 dev: true /@vue/reactivity-transform@3.3.4: @@ -4162,12 +4769,13 @@ packages: negotiator: 0.6.3 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.14.1): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + deprecated: package has been renamed to acorn-import-attributes peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.3 + acorn: 8.14.1 dev: true /acorn-jsx@5.3.2(acorn@8.11.3): @@ -4178,9 +4786,12 @@ packages: acorn: 8.11.3 dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + /acorn-jsx@5.3.2(acorn@8.14.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.1 dev: true /acorn@8.11.3: @@ -4189,6 +4800,12 @@ packages: hasBin: true dev: true + /acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /adjust-sourcemap-loader@4.0.0: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} @@ -4201,7 +4818,7 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} dependencies: - debug: 4.3.4 + debug: 4.4.0 transitivePeerDependencies: - supports-color dev: true @@ -4214,6 +4831,17 @@ packages: indent-string: 4.0.0 dev: true + /ajv-draft-04@1.0.0(ajv@8.13.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -4225,6 +4853,28 @@ packages: ajv: 8.12.0 dev: true + /ajv-formats@2.1.1(ajv@8.13.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + + /ajv-formats@3.0.1(ajv@8.13.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -4233,12 +4883,12 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords@5.1.0(ajv@8.12.0): + /ajv-keywords@5.1.0(ajv@8.13.0): resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 dependencies: - ajv: 8.12.0 + ajv: 8.13.0 fast-deep-equal: 3.1.3 dev: true @@ -4260,6 +4910,15 @@ packages: uri-js: 4.4.1 dev: true + /ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -4322,10 +4981,6 @@ packages: fast-string-truncated-width: 1.1.0 dev: true - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4344,10 +4999,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /argv-formatter@1.0.0: - resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} - dev: true - /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: @@ -4372,11 +5023,6 @@ packages: is-array-buffer: 3.0.4 dev: true - /array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} - dev: true - /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -4404,11 +5050,6 @@ packages: is-number: 4.0.0 dev: true - /array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -4470,8 +5111,9 @@ packages: is-shared-array-buffer: 1.0.3 dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /asynckit@0.4.0: @@ -4528,11 +5170,7 @@ packages: '@babel/core': 7.24.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.2) - dev: true - - /babel-plugin-add-module-exports@0.2.1: - resolution: {integrity: sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==} + webpack: 5.90.3(esbuild@0.20.1) dev: true /babel-plugin-istanbul@6.1.1: @@ -4709,6 +5347,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true + /browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001715 + electron-to-chromium: 1.5.142 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -4766,17 +5415,19 @@ packages: resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + /caniuse-lite@1.0.30001715: + resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + dev: true + + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 dev: true /chalk@2.4.2: @@ -4813,10 +5464,9 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} dev: true /chokidar@3.6.0: @@ -4931,11 +5581,6 @@ packages: engines: {node: '>=14'} dev: true - /commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - dev: true - /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -4945,12 +5590,10 @@ packages: engines: {node: '>= 6'} dev: true - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - requiresBuild: true + /comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} dev: true - optional: true /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -4963,6 +5606,10 @@ packages: dot-prop: 5.3.0 dev: true + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: true + /compose-function@3.0.3: resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} dependencies: @@ -5076,7 +5723,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /core-js-compat@3.36.1: @@ -5113,18 +5760,10 @@ packages: dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.35 + postcss: 8.4.38 postcss-media-query-parser: 0.2.3 dev: true - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -5151,15 +5790,15 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) + postcss-modules-scope: 3.1.1(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.6.0 - webpack: 5.90.3(esbuild@0.20.2) + semver: 7.7.1 + webpack: 5.90.3(esbuild@0.20.1) dev: true /css-select@5.1.0: @@ -5197,14 +5836,6 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /current-git-branch@1.1.0: - resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} - dependencies: - babel-plugin-add-module-exports: 0.2.1 - execa: 0.6.3 - is-git-repository: 1.1.1 - dev: true - /data-uri-to-buffer@3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} @@ -5283,15 +5914,25 @@ packages: ms: 2.1.2 dev: true + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-equal@2.2.3: @@ -5388,11 +6029,6 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true - /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true @@ -5486,12 +6122,6 @@ packages: engines: {node: '>=12'} dev: true - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: true - /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -5527,6 +6157,10 @@ packages: resolution: {integrity: sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==} dev: true + /electron-to-chromium@1.5.142: + resolution: {integrity: sha512-Ah2HgkTu/9RhTDNThBtzu2Wirdy4DC9b0sMT1pUhbkZQ5U/iwmE+PHZX1MpjD5IkJCc2wSghgGG/B04szAx07w==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -5566,6 +6200,14 @@ packages: tapable: 2.2.1 dev: true + /enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -5700,8 +6342,8 @@ packages: safe-array-concat: 1.1.2 dev: true - /es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + /es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} dev: true /es-object-atoms@1.0.0: @@ -5735,17 +6377,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-register@3.5.0(esbuild@0.20.2): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4 - esbuild: 0.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /esbuild-wasm@0.20.1: resolution: {integrity: sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==} engines: {node: '>=12'} @@ -5813,7 +6444,6 @@ packages: '@esbuild/win32-ia32': 0.20.1 '@esbuild/win32-x64': 0.20.1 dev: true - optional: true /esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} @@ -5851,6 +6481,11 @@ packages: engines: {node: '>=6'} dev: true + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true @@ -5865,6 +6500,16 @@ packages: engines: {node: '>=10'} dev: true + /eslint-compat-utils@0.5.1(eslint@8.56.0): + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.56.0 + semver: 7.7.1 + dev: true + /eslint-config-prettier@9.1.0(eslint@8.56.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -5937,6 +6582,41 @@ packages: - supports-color dev: true + /eslint-plugin-es-x@7.8.0(eslint@8.56.0): + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@8.56.0) + '@eslint-community/regexpp': 4.12.1 + eslint: 8.56.0 + eslint-compat-utils: 0.5.1(eslint@8.56.0) + dev: true + + /eslint-plugin-import-x@4.11.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-NAaYY49342gj09QGvwnFFl5KcD5aLzjAz97Lo+upnN8MzjEGSIlmL5sxCYGqtIeMjw8fSRDFZIp2xjRLT+yl4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + dependencies: + '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + comment-parser: 1.4.1 + debug: 4.4.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.10.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.1 + stable-hash: 0.0.5 + tslib: 2.8.1 + unrs-resolver: 1.7.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} @@ -5972,6 +6652,23 @@ packages: - supports-color dev: true + /eslint-plugin-n@17.17.0(eslint@8.56.0): + resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@8.56.0) + enhanced-resolve: 5.18.1 + eslint: 8.56.0 + eslint-plugin-es-x: 7.8.0(eslint@8.56.0) + get-tsconfig: 4.10.0 + globals: 15.15.0 + ignore: 5.3.2 + minimatch: 9.0.5 + semver: 7.7.1 + dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -6027,6 +6724,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /eslint@8.56.0: resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6074,6 +6776,15 @@ packages: - supports-color dev: true + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6141,19 +6852,6 @@ packages: engines: {node: '>=0.8.x'} dev: true - /execa@0.6.3: - resolution: {integrity: sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -6169,26 +6867,9 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - dependencies: - homedir-polyfill: 1.0.3 + /expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} dev: true /express@4.19.2: @@ -6230,10 +6911,6 @@ packages: - supports-color dev: true - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -6299,6 +6976,17 @@ packages: websocket-driver: 0.7.4 dev: true + /fdir@6.4.4(picomatch@4.0.2): + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + /fetch-blob@2.1.2: resolution: {integrity: sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==} engines: {node: ^10.17.0 || >=12.3.0} @@ -6396,32 +7084,6 @@ packages: path-exists: 5.0.0 dev: true - /findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.5 - resolve-dir: 1.0.1 - dev: true - - /fined@2.0.0: - resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} - engines: {node: '>= 10.13.0'} - dependencies: - expand-tilde: 2.0.2 - is-plain-object: 5.0.0 - object.defaults: 1.1.0 - object.pick: 1.3.0 - parse-filepath: 1.0.2 - dev: true - - /flagged-respawn@2.0.0: - resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} - engines: {node: '>= 10.13.0'} - dev: true - /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -6456,18 +7118,6 @@ packages: is-callable: 1.2.7 dev: true - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: true - - /for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: true - /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -6580,10 +7230,6 @@ packages: find-up-json: 2.0.4 dev: true - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -6600,21 +7246,11 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -6624,21 +7260,16 @@ packages: get-intrinsic: 1.2.4 dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + /get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} dependencies: resolve-pkg-maps: 1.0.0 dev: true - /git-log-parser@1.2.0: - resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: - argv-formatter: 1.0.0 - spawn-error-forwarder: 1.0.0 - split2: 1.0.0 - stream-combiner2: 1.1.1 - through2: 2.0.5 - traverse: 0.6.8 + resolve-pkg-maps: 1.0.0 dev: true /glob-parent@5.1.2: @@ -6704,26 +7335,6 @@ packages: once: 1.4.0 dev: true - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - dev: true - - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - dev: true - /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -6736,6 +7347,16 @@ packages: type-fest: 0.20.2 dev: true + /globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + dev: true + + /globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -6761,7 +7382,7 @@ packages: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 dev: true @@ -6845,13 +7466,6 @@ packages: hasBin: true dev: true - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - dependencies: - parse-passwd: 1.0.0 - dev: true - /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -6987,11 +7601,6 @@ packages: engines: {node: '>=10.17.0'} dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -7006,13 +7615,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.38): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /identity-function@1.0.0: @@ -7035,6 +7644,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + /image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -7131,11 +7745,6 @@ packages: side-channel: 1.0.6 dev: true - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - dev: true - /ionstore@1.0.0: resolution: {integrity: sha512-ikEvmeZFh9u5SkjKbFqJlmmhaQTulB3P7QoSoZ/xL8EDP5uj5QWbPeKcQ8ZJtszBLHRRnhIJJE8P1dhFx/oCMw==} dev: true @@ -7150,14 +7759,6 @@ packages: engines: {node: '>= 10'} dev: true - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true - /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -7260,13 +7861,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-git-repository@1.1.1: - resolution: {integrity: sha512-hxLpJytJnIZ5Og5QsxSkzmb8Qx8rGau9bio1JN/QtXcGEFuSsQYau0IiqlsCwftsfVYjF1mOq6uLdmwNSspgpA==} - dependencies: - execa: 0.6.3 - path-is-absolute: 1.0.1 - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -7333,11 +7927,6 @@ packages: isobject: 3.0.1 dev: true - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -7350,13 +7939,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: true - /is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -7369,21 +7951,11 @@ packages: call-bind: 1.0.7 dev: true - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -7412,13 +7984,6 @@ packages: which-typed-array: 1.1.15 dev: true - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: true - /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -7452,11 +8017,6 @@ packages: engines: {node: '>=12.13'} dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -7495,7 +8055,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -7622,10 +8182,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - dev: true - /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -7688,6 +8244,12 @@ packages: hasBin: true dev: true + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -7855,7 +8417,7 @@ packages: dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /less@4.2.0: @@ -7865,7 +8427,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -7894,24 +8456,10 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) webpack-sources: 3.2.3 dev: true - /liftoff@4.0.0: - resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==} - engines: {node: '>=10.13.0'} - dependencies: - extend: 3.0.2 - findup-sync: 5.0.0 - fined: 2.0.0 - flagged-respawn: 2.0.0 - is-plain-object: 5.0.0 - object.map: 1.0.1 - rechoir: 0.8.0 - resolve: 1.22.8 - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -7921,6 +8469,12 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: true + /load-json-file@6.2.0: resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} engines: {node: '>=8'} @@ -7987,14 +8541,6 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -8017,10 +8563,8 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} dev: true /lru-cache@10.2.0: @@ -8028,13 +8572,6 @@ packages: engines: {node: 14 || >=16.14} dev: true - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -8048,9 +8585,8 @@ packages: yallist: 4.0.0 dev: true - /luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} - engines: {node: '>=12'} + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true /lz-string@1.5.0: @@ -8064,6 +8600,12 @@ packages: vlq: 0.2.3 dev: true + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -8095,13 +8637,6 @@ packages: semver: 7.6.0 dev: true - /make-iterator@1.0.1: - resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - /map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} @@ -8109,16 +8644,27 @@ packages: p-defer: 1.0.0 dev: true - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: true - /map-obj@2.0.0: resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} engines: {node: '>=4'} dev: true + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: true + + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: true + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -8213,11 +8759,6 @@ packages: engines: {node: '>=8'} dev: true - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -8231,7 +8772,7 @@ packages: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /minimalistic-assert@1.0.1: @@ -8277,6 +8818,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -8323,8 +8871,8 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} dev: true /multicast-dns@7.2.5: @@ -8345,6 +8893,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /napi-postinstall@0.1.6: + resolution: {integrity: sha512-w1bClprmjwpybo+7M1Rd0N4QK5Ein8kH/1CQ0Wv8Q9vrLbDMakxc4rZpv8zYc8RVErUELJlFhM8UzOF3IqlYKw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -8427,6 +8981,10 @@ packages: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: true + /nopt@7.2.0: resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8510,13 +9068,6 @@ packages: semver: 7.6.0 dev: true - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -8524,13 +9075,6 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -8644,16 +9188,6 @@ packages: object-keys: 1.1.1 dev: true - /object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} - engines: {node: '>=0.10.0'} - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - dev: true - /object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -8682,28 +9216,13 @@ packages: es-abstract: 1.23.2 dev: true - /object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.2 - es-object-atoms: 1.0.0 - dev: true - - /object.map@1.0.1: - resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} - engines: {node: '>=0.10.0'} - dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - dev: true - - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: - isobject: 3.0.1 + define-properties: 1.2.1 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true /object.values@1.2.0: @@ -8744,13 +9263,6 @@ packages: mimic-fn: 2.1.0 dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8797,11 +9309,6 @@ packages: engines: {node: '>=4'} dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8823,13 +9330,6 @@ packages: yocto-queue: 1.0.0 dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -8886,15 +9386,6 @@ packages: callsites: 3.1.0 dev: true - /parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - dev: true - /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -8922,11 +9413,6 @@ packages: semver: 6.3.1 dev: true - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true - /parse5-html-rewriting-stream@7.0.0: resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} dependencies: @@ -8971,37 +9457,15 @@ packages: engines: {node: '>=0.10.0'} dev: true - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - dev: true - - /path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - dependencies: - path-root-regex: 0.1.2 - dev: true - /path-scurry@1.10.2: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} @@ -9030,13 +9494,22 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: true + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -9047,6 +9520,11 @@ packages: engines: {node: '>=12'} dev: true + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -9103,8 +9581,8 @@ packages: cosmiconfig: 9.0.0(typescript@5.3.3) jiti: 1.21.0 postcss: 8.4.35 - semver: 7.6.0 - webpack: 5.90.3(esbuild@0.20.2) + semver: 7.7.1 + webpack: 5.90.3(esbuild@0.20.1) transitivePeerDependencies: - typescript dev: true @@ -9113,45 +9591,45 @@ packages: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.35): + /postcss-modules-scope@3.1.1(postcss@8.4.38): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 dev: true /postcss-selector-parser@6.0.16: @@ -9281,10 +9759,6 @@ packages: dev: true optional: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true @@ -9299,6 +9773,11 @@ packages: sade: 1.8.1 dev: true + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -9361,8 +9840,8 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + /react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} dev: true @@ -9408,13 +9887,6 @@ packages: picomatch: 2.3.1 dev: true - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.8 - dev: true - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -9458,7 +9930,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: true /regex-parser@2.3.0: @@ -9516,14 +9988,6 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -9545,17 +10009,10 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.35 + postcss: 8.4.38 source-map: 0.6.1 dev: true - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -9668,7 +10125,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: true /sade@1.8.1: @@ -9732,7 +10189,7 @@ packages: dependencies: neo-async: 2.6.2 sass: 1.71.1 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /sass@1.71.1: @@ -9777,9 +10234,9 @@ packages: engines: {node: '>= 12.13.0'} dependencies: '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) + ajv: 8.13.0 + ajv-formats: 2.1.1(ajv@8.13.0) + ajv-keywords: 5.1.0(ajv@8.13.0) dev: true /select-hose@2.0.0: @@ -9830,6 +10287,12 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -9926,13 +10389,6 @@ packages: kind-of: 6.0.3 dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -9940,11 +10396,6 @@ packages: shebang-regex: 3.0.0 dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -10041,6 +10492,16 @@ packages: engines: {node: '>=14'} dev: true + /simple-git@3.27.0: + resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -10094,7 +10555,7 @@ packages: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.0 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /source-map-support@0.5.21: @@ -10114,10 +10575,6 @@ packages: engines: {node: '>= 8'} dev: true - /spawn-error-forwarder@1.0.0: - resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} - dev: true - /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -10143,7 +10600,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4 + debug: 4.4.0 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -10157,7 +10614,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.4.0 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -10175,12 +10632,6 @@ packages: tiny-updater: 3.5.1 dev: true - /split2@1.0.0: - resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} - dependencies: - through2: 2.0.5 - dev: true - /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: @@ -10203,6 +10654,10 @@ packages: minipass: 7.0.4 dev: true + /stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + dev: true + /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -10217,8 +10672,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + /std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} dev: true /stdin-blocker@2.0.0: @@ -10232,19 +10687,6 @@ packages: internal-slot: 1.0.7 dev: true - /stream-combiner2@1.1.1: - resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} - dependencies: - duplexer2: 0.1.4 - readable-stream: 2.3.8 - dev: true - - /stream-to-array@2.3.0: - resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} - dependencies: - any-promise: 1.3.0 - dev: true - /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -10353,21 +10795,11 @@ packages: engines: {node: '>=8'} dev: true - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -10385,12 +10817,6 @@ packages: engines: {node: '>=14.16'} dev: true - /strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} - dependencies: - js-tokens: 8.0.3 - dev: true - /strong-log-transformer@2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} engines: {node: '>=4'} @@ -10455,7 +10881,7 @@ packages: readable-stream: 3.6.2 dev: true - /terser-webpack-plugin@5.3.10(esbuild@0.20.2)(webpack@5.90.3): + /terser-webpack-plugin@5.3.10(esbuild@0.20.1)(webpack@5.90.3): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10472,12 +10898,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - esbuild: 0.20.2 + esbuild: 0.20.1 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.29.1 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /terser@5.29.1: @@ -10486,7 +10912,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -10509,13 +10935,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: @@ -10607,17 +11026,34 @@ packages: when-exit: 2.1.2 dev: true - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} dev: true - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} dev: true @@ -10682,11 +11118,6 @@ packages: punycode: 2.3.1 dev: true - /traverse@0.6.8: - resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} - engines: {node: '>= 0.4'} - dev: true - /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -10701,6 +11132,15 @@ packages: typescript: 5.2.2 dev: true + /ts-api-utils@2.1.0(typescript@5.2.2): + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.2.2 + dev: true + /ts-morph@21.0.1: resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} dependencies: @@ -10743,6 +11183,10 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -10750,11 +11194,6 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -10826,6 +11265,55 @@ packages: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} dev: true + /typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2): + resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} + peerDependencies: + typedoc-plugin-markdown: '>=4.4.2' + dependencies: + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9) + yaml: 2.7.1 + dev: true + + /typedoc-plugin-markdown@4.4.2(typedoc@0.27.9): + resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.27.x + dependencies: + typedoc: 0.27.9(typescript@5.2.2) + dev: true + + /typedoc@0.27.9(typescript@5.2.2): + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + dependencies: + '@gerrit0/mini-shiki': 1.27.2 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.2.2 + yaml: 2.7.1 + dev: true + + /typescript-eslint@8.31.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + dependencies: + '@typescript-eslint/eslint-plugin': 8.31.0(@typescript-eslint/parser@8.31.0)(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/parser': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.2.2) + eslint: 8.56.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /typescript@4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} @@ -10862,6 +11350,10 @@ packages: hasBin: true dev: true + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: true + /ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true @@ -10875,11 +11367,6 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - dev: true - /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -10945,6 +11432,31 @@ packages: engines: {node: '>= 0.8'} dev: true + /unrs-resolver@1.7.0: + resolution: {integrity: sha512-b76tVoT9KPniDY1GoYghDUQX20gjzXm/TONfHfgayLaiuo+oGyT9CsQkGCEJs+1/uryVBEOGOt3yYWDXbJhL7g==} + requiresBuild: true + dependencies: + napi-postinstall: 0.1.6 + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.7.0 + '@unrs/resolver-binding-darwin-x64': 1.7.0 + '@unrs/resolver-binding-freebsd-x64': 1.7.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.0 + '@unrs/resolver-binding-linux-x64-musl': 1.7.0 + '@unrs/resolver-binding-wasm32-wasi': 1.7.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.0 + dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -10956,6 +11468,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.1.3(browserslist@4.24.4): + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -10991,11 +11514,6 @@ packages: hasBin: true dev: true - /v8flags@4.0.1: - resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} - engines: {node: '>= 10.13.0'} - dev: true - /validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} dev: true @@ -11021,11 +11539,6 @@ packages: builtins: 5.0.1 dev: true - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true - /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -11038,16 +11551,16 @@ packages: semver: 7.6.0 dev: true - /vite-node@1.3.1(@types/node@18.19.3): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} - engines: {node: ^18.0.0 || >=20.0.0} + /vite-node@3.1.2(@types/node@18.19.3): + resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) + debug: 4.4.0 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.2.6(@types/node@18.19.3) transitivePeerDependencies: - '@types/node' - less @@ -11059,8 +11572,8 @@ packages: - terser dev: true - /vite-plugin-dts@3.8.1(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5): - resolution: {integrity: sha512-zEYyQxH7lKto1VTKZHF3ZZeOPkkJgnMrePY4VxDHfDSvDjmYMMfWjZxYmNwW8QxbaItWJQhhXY+geAbyNphI7g==} + /vite-plugin-dts@4.2.3(@types/node@18.19.3)(rollup@4.13.1)(typescript@5.2.2)(vite@5.1.5): + resolution: {integrity: sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -11069,25 +11582,27 @@ packages: vite: optional: true dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.19.3) + '@microsoft/api-extractor': 7.47.7(@types/node@18.19.3) '@rollup/pluginutils': 5.1.0(rollup@4.13.1) - '@vue/language-core': 1.8.27(typescript@5.2.2) - debug: 4.3.4 + '@volar/typescript': 2.4.13 + '@vue/language-core': 2.1.6(typescript@5.2.2) + compare-versions: 6.1.1 + debug: 4.4.0 kolorist: 1.8.0 - magic-string: 0.30.8 + local-pkg: 0.5.0 + magic-string: 0.30.17 typescript: 5.2.2 vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) - vue-tsc: 1.8.27(typescript@5.2.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color dev: true - /vite-plugin-externalize-deps@0.8.0(vite@5.1.5): - resolution: {integrity: sha512-MdC8kRNQ1ZjhUicU2HcqGVhL0UUFqv83Zp1JZdHjE82PoPR8wsSWZ3axpot7B6img3sW6g8shYJikE0CKA0chA==} + /vite-plugin-externalize-deps@0.9.0(vite@5.1.5): + resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 dependencies: vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) dev: true @@ -11103,7 +11618,7 @@ packages: optional: true dependencies: '@babel/core': 7.24.3 - '@testing-library/jest-dom': 6.4.2(vitest@1.3.1) + '@testing-library/jest-dom': 6.4.2(vitest@3.1.2) '@types/babel__core': 7.20.5 babel-preset-solid: 1.8.16(@babel/core@7.24.3) merge-anything: 5.1.7 @@ -11115,8 +11630,8 @@ packages: - supports-color dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.2.2)(vite@5.1.5): - resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + /vite-tsconfig-paths@5.1.4(typescript@5.2.2)(vite@5.1.5): + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -11218,20 +11733,23 @@ packages: vite: 5.2.6(@types/node@18.19.3) dev: true - /vitest@1.3.1(@types/node@18.19.3)(jsdom@24.0.0): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} - engines: {node: ^18.0.0 || >=20.0.0} + /vitest@3.1.2(@types/node@18.19.3)(jsdom@24.0.0): + resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.1.2 + '@vitest/ui': 3.1.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -11244,30 +11762,32 @@ packages: optional: true dependencies: '@types/node': 18.19.3 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 + '@vitest/expect': 3.1.2 + '@vitest/mocker': 3.1.2(vite@5.2.6) + '@vitest/pretty-format': 3.1.2 + '@vitest/runner': 3.1.2 + '@vitest/snapshot': 3.1.2 + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 jsdom: 24.0.0 - local-pkg: 0.5.0 - magic-string: 0.30.8 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.3 - vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) - vite-node: 1.3.1(@types/node@18.19.3) - why-is-node-running: 2.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 5.2.6(@types/node@18.19.3) + vite-node: 3.1.2(@types/node@18.19.3) + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -11279,6 +11799,10 @@ packages: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} dev: true + /vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + dev: true + /vue-component-type-helpers@2.0.7: resolution: {integrity: sha512-7e12Evdll7JcTIocojgnCgwocX4WzIYStGClBQ+QuWPinZo/vQolv2EMq4a3lg16TKfwWafLimG77bxb56UauA==} dev: true @@ -11299,23 +11823,22 @@ packages: vue: 3.3.4 dev: false - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - - /vue-tsc@1.8.27(typescript@5.2.2): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true + /vue-eslint-parser@9.4.3(eslint@8.56.0): + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: - typescript: '*' + eslint: '>=6.0.0' dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.56.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 semver: 7.6.0 - typescript: 5.2.2 + transitivePeerDependencies: + - supports-color dev: true /vue@2.6.0: @@ -11383,7 +11906,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /webpack-dev-middleware@6.1.2(webpack@5.90.3): @@ -11400,7 +11923,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true /webpack-dev-server@4.15.1(webpack@5.90.3): @@ -11444,7 +11967,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) webpack-dev-middleware: 5.3.4(webpack@5.90.3) ws: 8.16.0 transitivePeerDependencies: @@ -11479,10 +12002,10 @@ packages: optional: true dependencies: typed-assert: 1.0.9 - webpack: 5.90.3(esbuild@0.20.2) + webpack: 5.90.3(esbuild@0.20.1) dev: true - /webpack@5.90.3(esbuild@0.20.2): + /webpack@5.90.3(esbuild@0.20.1): resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} engines: {node: '>=10.13.0'} hasBin: true @@ -11497,12 +12020,12 @@ packages: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.14.1 + acorn-import-assertions: 1.9.0(acorn@8.14.1) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.0 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -11513,7 +12036,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.90.3) + terser-webpack-plugin: 5.3.10(esbuild@0.20.1)(webpack@5.90.3) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11613,13 +12136,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11636,8 +12152,8 @@ packages: isexe: 3.1.1 dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: @@ -11709,20 +12225,11 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -11731,6 +12238,12 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + dev: true + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -11759,18 +12272,6 @@ packages: engines: {node: '>=12.20'} dev: true - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.11.0 - optionalDependencies: - commander: 9.5.0 - dev: true - /zeptomatch@1.2.2: resolution: {integrity: sha512-0ETdzEO0hdYmT8aXHHf5aMjpX+FHFE61sG4qKFAoJD2Umt3TWdCmH7ADxn2oUiWTlqBGC+SGr8sYMfr+37J8pQ==} dependencies: From 42b842ab22d3430ae0d658bdeffc9daff88574b7 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 9 Jan 2026 20:12:10 +0100 Subject: [PATCH 143/163] fix: parse util --- packages/time/src/index.ts | 2 +- packages/time/src/utils/parse.ts | 143 --------------------------- packages/time/src/utils/parseDate.ts | 22 +++++ packages/time/tests/parse.test.ts | 136 +++++++++++++++++++++++++ packages/time/tests/setup.ts | 3 + 5 files changed, 162 insertions(+), 144 deletions(-) delete mode 100644 packages/time/src/utils/parse.ts create mode 100644 packages/time/src/utils/parseDate.ts create mode 100644 packages/time/tests/parse.test.ts create mode 100644 packages/time/tests/setup.ts diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 12981a25..9b08ea6b 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -1,4 +1,4 @@ /** * TanStack Time */ -export * from './utils/parse'; \ No newline at end of file +export * from './utils/parseDate' diff --git a/packages/time/src/utils/parse.ts b/packages/time/src/utils/parse.ts deleted file mode 100644 index 265021c7..00000000 --- a/packages/time/src/utils/parse.ts +++ /dev/null @@ -1,143 +0,0 @@ - -/** - * rfc3339DateTimeOptionalTimeRegex - * Regular expression to match RFC3339 date/time strings with all optional parts - */ -const rfc3339DateTimeOptionalTimeRegex = - /^(?(?\d{4})(?:-(?0[1-9]|1[0-2])(?:-(?0[1-9]|[12][0-9]|3[01]))))(?:(?:T| )(?(?[01][0-9]|2[0-3])(?::(?[0-5][0-9])(?::(?[0-5][0-9])(?:\.(?\d+))?)?)?)?(?Z|[+-](?:2[0-3]|[01][0-9]:[0-5][0-9]))?)?$/i; - -/** - * timeOnlyRegex - * Regular expression to match time-only strings - */ -const timeOnlyRegex = - /^((?(?:2[0-3]|[0-1][0-9]))(?::(?[0-5][0-9])(?::(?[0-5][0-9])(?:\.(?\d+))?)?)?)(?:\s(?(?:AM|PM)))?$/i; - -/** - * dateOnlyRegex - * Regular expression to match date-only strings - */ -const dateOnlyRegex = - /^(?\d{4})(-(?0[1-9]|1[0-2]))?(-(?0[1-9]|[12][0-9]|3[01]))?(?T| )?(?Z|[+-](?:2[0-3]|[01][0-9]:[0-5][0-9]))?$/i; - -/** - * isValidEpoch - * Verifies if a numeric value is a valid epoch date - * @param {number} value - * @returns boolean - */ -function isValidEpoch(value: number): boolean { - return value >= -8.64e12 && value <= +8.64e12; -} - -/** - * parseEpochDateTime - * Parses a numeric value as a date/time epoch - * @param {number} value - * @returns Date - */ -function parseEpochDateTime(value: number): Date { - // if it's a floating point number, assume it's a unix timestamp - const toParse = Number.isInteger(value) ? value : value * 1000; - // but verify - if (isValidEpoch(toParse)) { - return new Date(toParse); - } - throw new Error(`"${value}" is an invalid epoch date value`); -} - -/** - * parseDateTimeString - * Parses a string as a date/time string - * @param {string} value - * @returns Date - */ -function parseDateTimeString(value: string): Date { - const match = - rfc3339DateTimeOptionalTimeRegex.exec(value) ?? dateOnlyRegex.exec(value); - //console.log("match", match); - if (match?.groups) { - const { - year, - month = "01", - day = "01", - hour = "00", - minute = "00", - second = "00", - millisecond = "000", - timezone = "", - } = match.groups; - return new Date( - `${year}-${month}-${day}T${hour}:${minute}:${second}.${millisecond}${timezone}`, - ); - } - throw new Error(`"${value}" is an invalid RFC339 Internet Date Time string`); -} - -/** - * parseTimeOnlyString - * Parses a string as a time-only string - * @param {string} value - * @returns Date - */ -function parseTimeOnlyString(value: string): Date { - const match = timeOnlyRegex.exec(value); - if (match?.groups) { - const now = new Date(); - const { - hour = "00", - minute = "00", - second = "00", - millisecond = "000", - meridiem, - } = match.groups; - // convert 12 hour time to 24 - let trueHour = Number(hour); - if (meridiem) { - if (trueHour > 12) { - throw new Error(`"${value}" is an invalid time string`); - } - if (meridiem.toLowerCase() === "pm" && trueHour < 12) { - trueHour += 12; - } - } - now.setHours( - trueHour, - Number(minute), - Number(second), - Number(millisecond), - ); - return now; - } - throw new Error(`"${value}" is an invalid time string`); -} - -/** - * parseDateOrTimeString - * Parses a string as a date/time or time string - * @param {string} value - * @returns Date - */ -function parseDateOrTimeString(value: string): Date { - const match = timeOnlyRegex.exec(value); - if (match) { - return parseTimeOnlyString(value); - } - return parseDateTimeString(value); -} - -/** - * parse - * Parses a string, number or Date object as a Date - * @param {string | number | Date} value - * @returns Date | undefined - */ -export function parse(value: string | number | Date): Date | undefined { - if (!value) return undefined; - if (typeof value === 'string') { - return parseDateOrTimeString(value); - } else if (typeof value === 'number') { - return parseEpochDateTime(value); - } - return value; -} \ No newline at end of file diff --git a/packages/time/src/utils/parseDate.ts b/packages/time/src/utils/parseDate.ts new file mode 100644 index 00000000..be15482e --- /dev/null +++ b/packages/time/src/utils/parseDate.ts @@ -0,0 +1,22 @@ +import { z } from 'zod' +import type { ZodSafeParseResult } from 'zod' + +type ParseDateResult = ZodSafeParseResult + +export type PossibleDate = string | number | Date + +export function parseDate(date: PossibleDate): ParseDateResult { + const schema = z + .preprocess((val) => { + if (val instanceof Date) return val + if (typeof val === 'string' || typeof val === 'number') { + const numVal = Number(val) + if (!isNaN(numVal)) return new Date(numVal) + return new Date(val) + } + return val + }, z.date()) + .refine((d) => !isNaN(d.getTime()) && d.getTime() > 0) + + return schema.safeParse(date) +} diff --git a/packages/time/tests/parse.test.ts b/packages/time/tests/parse.test.ts new file mode 100644 index 00000000..e4e4ac0e --- /dev/null +++ b/packages/time/tests/parse.test.ts @@ -0,0 +1,136 @@ +import { describe, expect, it } from 'vitest' +import { parseDate } from '../src/utils/parseDate' + +describe('parseDate', () => { + describe('Date input', () => { + it('should parse valid Date object', () => { + const date = new Date('2023-01-01T00:00:00Z') + const result = parseDate(date) + expect(result.success).toBe(true) + + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2023-01-01T00:00:00.000Z') + }) + + it('should return error for invalid Date object', () => { + const invalidDate = new Date('invalid') + const result = parseDate(invalidDate) + expect(result.success).toBe(false) + expect(result.error).toBeDefined() + }) + }) + + describe('number input', () => { + it('should parse valid timestamp', () => { + const timestamp = new Date('2023-01-01T00:00:00Z').getTime() + const result = parseDate(timestamp) + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2023-01-01T00:00:00.000Z') + }) + + it('should parse timestamp with milliseconds', () => { + const timestamp = new Date('2023-06-15T14:30:45.123Z').getTime() + const result = parseDate(timestamp) + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2023-06-15T14:30:45.123Z') + }) + + it('should return error for invalid timestamp', () => { + const result = parseDate(NaN) + expect(result.success).toBe(false) + expect(result.error).toBeDefined() + }) + }) + + describe('string input', () => { + it('should parse ISO 8601 datetime with Z timezone', () => { + const result = parseDate('2020-01-01T00:00:00Z') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2020-01-01T00:00:00.000Z') + }) + + it('should parse datetime with milliseconds', () => { + const result = parseDate('2020-01-01T00:00:00.123Z') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.getMilliseconds()).toBe(123) + }) + + it('should parse datetime with arbitrary precision', () => { + const result = parseDate('2020-01-01T00:00:00.123456Z') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + }) + + it('should parse datetime without seconds', () => { + const result = parseDate('2020-01-01T00:00Z') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2020-01-01T00:00:00.000Z') + }) + + it('should parse datetime with positive timezone offset', () => { + const result = parseDate('2020-01-01T00:00:00+02:00') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2019-12-31T22:00:00.000Z') + }) + + it('should parse datetime with negative timezone offset', () => { + const result = parseDate('2020-01-01T12:00:00-05:00') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2020-01-01T17:00:00.000Z') + }) + + it('should parse datetime with short timezone offset format', () => { + const result = parseDate('2020-01-01T00:00:00.123+0200') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + }) + + it('should parse datetime without minutes', () => { + const result = parseDate('2020-01-01T00:00+02:00') + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + }) + + it('should parse string representation of timestamp', () => { + const timestamp = new Date('2023-01-01T00:00:00Z').getTime() + const result = parseDate(String(timestamp)) + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.toISOString()).toBe('2023-01-01T00:00:00.000Z') + }) + + it('should parse numeric timestamp string', () => { + const timestamp = 1762259739191 + const result = parseDate(String(timestamp)) + expect(result.success).toBe(true) + expect(result.data).toBeInstanceOf(Date) + expect(result.data!.getTime()).toBe(timestamp) + }) + + it.each(['invalid-date', '14:30:00', 'not-a-date'])( + 'should return error for %s input', + (input) => { + const result = parseDate(input) + expect(result.success).toBe(false) + expect(result.error).toBeDefined() + }, + ) + }) + + it.each([null, undefined, true, {}, [], 'not-a-date'])( + 'should return error for %s input', + (input) => { + // @ts-expect-error - intentionally passing invalid input + const result = parseDate(input) + expect(result.success).toBe(false) + expect(result.error).toBeDefined() + }, + ) +}) diff --git a/packages/time/tests/setup.ts b/packages/time/tests/setup.ts new file mode 100644 index 00000000..4b75b9e3 --- /dev/null +++ b/packages/time/tests/setup.ts @@ -0,0 +1,3 @@ +// Set timezone for all tests +process.env.TZ = 'America/New_York' + From b081caf2ae692ab2b9e451ab5552442cddcfb177 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Fri, 9 Jan 2026 22:23:06 +0100 Subject: [PATCH 144/163] fix: parse util --- packages/time/tests/parse.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/time/tests/parse.test.ts b/packages/time/tests/parse.test.ts index e4e4ac0e..cc15dea0 100644 --- a/packages/time/tests/parse.test.ts +++ b/packages/time/tests/parse.test.ts @@ -92,7 +92,7 @@ describe('parseDate', () => { expect(result.data).toBeInstanceOf(Date) }) - it('should parse datetime without minutes', () => { + it('should parse datetime without seconds', () => { const result = parseDate('2020-01-01T00:00+02:00') expect(result.success).toBe(true) expect(result.data).toBeInstanceOf(Date) From 1895a018f336f23c522418c931c0dcef8f00cd59 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 17:41:12 +0100 Subject: [PATCH 145/163] chore: resolve conflicts --- package.json | 4 +- packages/react-time/package.json | 2 +- packages/react-time/src/index.ts | 9 +- packages/time/package.json | 2 +- packages/time/src/index.ts | 9 +- packages/time/src/utils/dateDefaults.ts | 17 +- pnpm-lock.yaml | 19810 ++++++++++++---------- pnpm-workspace.yaml | 3 + 8 files changed, 10882 insertions(+), 8974 deletions(-) diff --git a/package.json b/package.json index 6028b5c9..c7629c8a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "time", "private": true, "repository": "https://github.com/tanstack/time.git", - "packageManager": "pnpm@8.12.1", + "packageManager": "pnpm@9.6.0", "type": "module", "scripts": { "clean": "pnpm --filter \"./packages/**\" run clean", @@ -79,6 +79,6 @@ "vue": "^3.3.4" }, "dependencies": { - "@js-temporal/polyfill": "^0.5.1" + "@js-temporal/polyfill": "catalog:" } } diff --git a/packages/react-time/package.json b/packages/react-time/package.json index d49b0a76..a5218020 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -60,7 +60,7 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "dependencies": { - "@js-temporal/polyfill": "^0.4.4", + "@js-temporal/polyfill": "catalog:", "@tanstack/react-store": "^0.4.1", "@tanstack/time": "workspace:*", "typesafe-actions": "^5.1.0", diff --git a/packages/react-time/src/index.ts b/packages/react-time/src/index.ts index 2740c82e..5ba2e09d 100644 --- a/packages/react-time/src/index.ts +++ b/packages/react-time/src/index.ts @@ -1,8 +1 @@ -<<<<<<< HEAD -export { useCalendar } from './useCalendar'; -======= -/** - * TanStack Time - */ -export const foo = 'foo' ->>>>>>> v0-1-0 +export { useCalendar } from './useCalendar' diff --git a/packages/time/package.json b/packages/time/package.json index 46777038..6fb8b862 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -56,7 +56,7 @@ ], "dependencies": { "@bart-krakowski/get-week-info-polyfill": "^1.0.6", - "@js-temporal/polyfill": "^0.4.4", + "@js-temporal/polyfill": "catalog:", "@tanstack/store": "^0.4.1" }, "devDependencies": { diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 8c97852c..0e4c6531 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -1,10 +1,5 @@ /** * TanStack Time */ -<<<<<<< HEAD -export * from './utils'; -export * from './core'; - -======= -export * from './utils/parseDate' ->>>>>>> v0-1-0 +export * from './utils' +export * from './core' diff --git a/packages/time/src/utils/dateDefaults.ts b/packages/time/src/utils/dateDefaults.ts index d841baa0..8caa36ae 100644 --- a/packages/time/src/utils/dateDefaults.ts +++ b/packages/time/src/utils/dateDefaults.ts @@ -1,18 +1,9 @@ -<<<<<<< HEAD -import type { Temporal } from "@js-temporal/polyfill"; +import type { Temporal } from '@js-temporal/polyfill' export interface IDateDefaults { - calendar: Temporal.CalendarLike; - locale: Intl.UnicodeBCP47LocaleIdentifier; - timeZone: Temporal.TimeZoneLike; -======= -import { Locale } from '../formatter/shared' - -export interface IDateDefaults { - calendar: string - locale: string - timeZone: string ->>>>>>> v0-1-0 + calendar: Temporal.CalendarLike + locale: Intl.UnicodeBCP47LocaleIdentifier + timeZone: Temporal.TimeZoneLike } const { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4172e6dd..7154c396 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,89 +1,95 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@js-temporal/polyfill': + specifier: 0.5.1 + version: 0.5.1 + importers: .: dependencies: '@js-temporal/polyfill': - specifier: ^0.5.1 + specifier: 'catalog:' version: 0.5.1 devDependencies: '@solidjs/testing-library': specifier: ^0.8.6 - version: 0.8.6(@solidjs/router@0.13.1)(solid-js@1.7.8) + version: 0.8.10(solid-js@1.9.10) '@tanstack/config': specifier: ^0.18.0 - version: 0.18.0(@types/node@18.19.3)(eslint@8.56.0)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3) + version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) '@tanstack/eslint-config': specifier: ^0.1.0 - version: 0.1.0(eslint@8.56.0)(typescript@5.8.3) + version: 0.1.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) '@tanstack/publish-config': specifier: ^0.1.0 - version: 0.1.0 + version: 0.1.1 '@tanstack/typedoc-config': specifier: ^0.2.0 - version: 0.2.0(typescript@5.8.3) + version: 0.2.1(typescript@5.9.3) '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.4.2(vitest@1.6.1) + version: 6.9.1 '@testing-library/react': specifier: ^14.2.1 - version: 14.2.1(react-dom@18.2.0)(react@18.2.0) + version: 14.3.1(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) + version: 14.6.1(@testing-library/dom@10.4.1) '@testing-library/vue': specifier: ^8.0.2 - version: 8.0.2(vue@3.3.4) + version: 8.1.0(@vue/compiler-sfc@3.5.26)(vue@3.5.26(typescript@5.9.3)) '@types/eslint': specifier: ^8.56.2 - version: 8.56.2 + version: 8.56.12 '@types/node': specifier: ^18.19.3 - version: 18.19.3 + version: 18.19.130 '@types/react': specifier: ^18.2.45 - version: 18.2.45 + version: 18.3.27 '@types/react-dom': specifier: ^18.0.5 - version: 18.0.5 + version: 18.3.7(@types/react@18.3.27) '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.8.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.8.3) + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/coverage-istanbul': specifier: ^1.3.1 - version: 1.3.1(vitest@1.6.1) + version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)) eslint: specifier: ^8.56.0 - version: 8.56.0 + version: 8.57.1 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) + version: 9.1.2(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + version: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-react: specifier: ^7.33.2 - version: 7.33.2(eslint@8.56.0) + version: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.0(eslint@8.56.0) + version: 4.6.2(eslint@8.57.1) jsdom: specifier: ^24.0.0 - version: 24.0.0 + version: 24.1.3 knip: specifier: ^4.6.0 - version: 4.6.0(@types/node@18.19.3)(typescript@5.8.3) + version: 4.6.0(@types/node@18.19.130)(typescript@5.9.3) nx: specifier: 20.8.0 version: 20.8.0 @@ -92,46 +98,46 @@ importers: version: 3.5.3 publint: specifier: ^0.2.7 - version: 0.2.7 + version: 0.2.12 react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) rimraf: specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.10 sherif: specifier: ^0.7.0 version: 0.7.0 solid-js: specifier: ^1.7.8 - version: 1.7.8 + version: 1.9.10 typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.3 typescript50: specifier: npm:typescript@5.0 - version: /typescript@5.0.2 + version: typescript@5.0.4 typescript51: specifier: npm:typescript@5.1 - version: /typescript@5.1.3 + version: typescript@5.1.6 typescript52: specifier: npm:typescript@5.2 - version: /typescript@5.2.2 + version: typescript@5.2.2 typescript53: specifier: npm:typescript@5.3 - version: /typescript@5.3.3 + version: typescript@5.3.3 vite: specifier: ^6.3.3 - version: 6.3.3(@types/node@18.19.3) + version: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) vitest: specifier: ^1.3.1 - version: 1.6.1(@types/node@18.19.3)(jsdom@24.0.0) + version: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) vue: specifier: ^3.3.4 - version: 3.3.4 + version: 3.5.26(typescript@5.9.3) packages/angular-time: dependencies: @@ -141,59 +147,59 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^0.2.32 - version: 0.2.32(@angular-devkit/build-angular@17.3.2) + version: 0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)) '@angular/common': specifier: ^17.1.2 - version: 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) + version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) '@angular/compiler': specifier: ^17.1.2 - version: 17.1.2(@angular/core@17.1.2) + version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) '@angular/compiler-cli': specifier: ^17.1.2 - version: 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) + version: 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) '@angular/core': specifier: ^17.1.2 - version: 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + version: 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) '@angular/platform-browser': specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2) + version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) '@angular/platform-browser-dynamic': specifier: ^17.1.2 - version: 17.1.2(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2) + version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))) zone.js: specifier: ^0.14.3 - version: 0.14.3 + version: 0.14.10 packages/react-time: dependencies: '@js-temporal/polyfill': - specifier: ^0.4.4 - version: 0.4.4 + specifier: 'catalog:' + version: 0.5.1 '@tanstack/react-store': specifier: ^0.4.1 - version: 0.4.1(react-dom@18.2.0)(react@18.2.0) + version: 0.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/time': specifier: workspace:* version: link:../time react: specifier: ^17.0.0 || ^18.0.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^17.0.0 || ^18.0.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) typesafe-actions: specifier: ^5.1.0 version: 5.1.0 use-sync-external-store: specifier: ^1.2.0 - version: 1.2.0(react@18.2.0) + version: 1.6.0(react@18.3.1) devDependencies: '@types/use-sync-external-store': specifier: ^0.0.3 version: 0.0.3 '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.4.1(vite@6.3.3) + version: 4.7.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) packages/solid-time: dependencies: @@ -203,32 +209,26 @@ importers: devDependencies: solid-js: specifier: ^1.7.8 - version: 1.7.8 + version: 1.9.10 vite-plugin-solid: specifier: ^2.10.1 - version: 2.10.1(@testing-library/jest-dom@6.4.2)(solid-js@1.7.8)(vite@5.2.6) + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) packages/time: dependencies: -<<<<<<< HEAD '@bart-krakowski/get-week-info-polyfill': - specifier: ^1.0.5 - version: 1.0.5 + specifier: ^1.0.6 + version: 1.0.8 '@js-temporal/polyfill': - specifier: ^0.4.4 - version: 0.4.4 + specifier: 'catalog:' + version: 0.5.1 '@tanstack/store': specifier: ^0.4.1 version: 0.4.1 devDependencies: csstype: - specifier: ^3.1.3 - version: 3.1.3 -======= - '@js-temporal/polyfill': - specifier: ^0.5.1 - version: 0.5.1 ->>>>>>> v0-1-0 + specifier: ^3.2.3 + version: 3.2.3 packages/vue-time: dependencies: @@ -237,86 +237,75 @@ importers: version: link:../time vue-demi: specifier: ^0.14.6 - version: 0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4) + version: 0.14.10(@vue/composition-api@1.7.2(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.2 - version: 5.0.2(vite@5.2.6)(vue@3.3.4) + version: 5.2.4(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) '@vue/composition-api': specifier: ^1.7.2 - version: 1.7.2(vue@3.3.4) + version: 1.7.2(vue@3.5.26(typescript@5.9.3)) vue: specifier: ^3.3.4 - version: 3.3.4 + version: 3.5.26(typescript@5.9.3) vue2: specifier: npm:vue@2.6 - version: /vue@2.6.0 + version: vue@2.6.14 vue2.7: specifier: npm:vue@2.7 - version: /vue@2.7.0 + version: vue@2.7.16 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@analogjs/vite-plugin-angular@0.2.32(@angular-devkit/build-angular@17.3.2): - resolution: {integrity: sha512-0rmTXR60xrMcLBdeoOx7U7dcywdwlzSysVkFyztW9A3K51C3jUSn39Y3Jd4TMhhG5x+E1Ye/zvRhNgBRxf40cw==} + '@analogjs/vite-plugin-angular@0.2.45': + resolution: {integrity: sha512-HTqtPdtMap3Y6DVjxRwud0gu7m0XsZB+9kB71jpwbt6aypllVTkbjT7Gj+BBczB6GusT5d9f4ybacI+QA8dKXw==} peerDependencies: '@angular-devkit/build-angular': ^15.0.0 || >=16.0.0 - dependencies: - '@angular-devkit/build-angular': 17.3.2(@angular/compiler-cli@17.1.2)(@types/node@18.19.3)(typescript@5.3.3) - ts-morph: 21.0.1 - dev: true - - /@angular-devkit/architect@0.1703.2: - resolution: {integrity: sha512-fT5gSzwDHOyGv8zF97t8rjeoYSGSxXjWWstl3rN1nXdO0qgJ5m6Sv0fupON+HltdXDCBLRH+2khNpqx/Fh0Qww==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 17.3.2 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - dev: true - /@angular-devkit/build-angular@17.3.2(@angular/compiler-cli@17.1.2)(@types/node@18.19.3)(typescript@5.3.3): - resolution: {integrity: sha512-muPCUyL0uHvRkLH4NLWiccER6P2vCm/Q5DDvqyN4XOzzY3tAHHLrKrpvY87sgd2oNJ6Ci8x7GPNcfzR5KELCnw==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^17.0.0 - '@angular/localize': ^17.0.0 - '@angular/platform-server': ^17.0.0 - '@angular/service-worker': ^17.0.0 - '@web/test-runner': ^0.18.0 + '@angular-devkit/architect@0.2100.5': + resolution: {integrity: sha512-KKmZMXzHCX0cWHY7xo9yy1J0fV7S/suhPO00YTcHBgLivkLsnbI177CrmWiMdLxSJD3NqTVkBEMPFQ2I2ooDFw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/build-angular@21.0.5': + resolution: {integrity: sha512-My42P8i/FrZgEsTnsCS9IXKMk7ikJwa14i0aBcHg3lMBAPrdpHVzgDS6/1SOO1HsoVYF/SiPjwnlL152xlm8/Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.0.5 + '@web/test-runner': ^0.20.0 browser-sync: ^3.0.2 - jest: ^29.5.0 - jest-environment-jsdom: ^29.5.0 + jest: ^30.2.0 + jest-environment-jsdom: ^30.2.0 karma: ^6.3.0 - ng-packagr: ^17.0.0 + ng-packagr: ^21.0.0 protractor: ^7.0.0 - tailwindcss: ^2.0.0 || ^3.0.0 - typescript: '>=5.2 <5.5' + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + typescript: '>=5.9 <6.0' peerDependenciesMeta: + '@angular/core': + optional: true '@angular/localize': optional: true + '@angular/platform-browser': + optional: true '@angular/platform-server': optional: true '@angular/service-worker': optional: true + '@angular/ssr': + optional: true '@web/test-runner': optional: true browser-sync: @@ -333,3168 +322,8697 @@ packages: optional: true tailwindcss: optional: true - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.1703.2 - '@angular-devkit/build-webpack': 0.1703.2(webpack-dev-server@4.15.1)(webpack@5.90.3) - '@angular-devkit/core': 17.3.2 - '@angular/compiler-cli': 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.24.0) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-runtime': 7.24.0(@babel/core@7.24.0) - '@babel/preset-env': 7.24.0(@babel/core@7.24.0) - '@babel/runtime': 7.24.0 - '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 17.3.2(@angular/compiler-cli@17.1.2)(typescript@5.3.3)(webpack@5.90.3) - '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.1.5) - ansi-colors: 4.1.3 - autoprefixer: 10.4.18(postcss@8.4.35) - babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.3) - babel-plugin-istanbul: 6.1.1 - browserslist: 4.24.4 - copy-webpack-plugin: 11.0.0(webpack@5.90.3) - critters: 0.0.22 - css-loader: 6.10.0(webpack@5.90.3) - esbuild-wasm: 0.20.1 - fast-glob: 3.3.2 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - https-proxy-agent: 7.0.4 - inquirer: 9.2.15 - jsonc-parser: 3.2.1 - karma-source-map-support: 1.4.0 - less: 4.2.0 - less-loader: 11.1.0(less@4.2.0)(webpack@5.90.3) - license-webpack-plugin: 4.0.2(webpack@5.90.3) - loader-utils: 3.2.1 - magic-string: 0.30.8 - mini-css-extract-plugin: 2.8.1(webpack@5.90.3) - mrmime: 2.0.0 - open: 8.4.2 - ora: 5.4.1 - parse5-html-rewriting-stream: 7.0.0 - picomatch: 4.0.1 - piscina: 4.4.0 - postcss: 8.4.35 - postcss-loader: 8.1.1(postcss@8.4.35)(typescript@5.3.3)(webpack@5.90.3) - resolve-url-loader: 5.0.0 - rxjs: 7.8.1 - sass: 1.71.1 - sass-loader: 14.1.1(sass@1.71.1)(webpack@5.90.3) - semver: 7.6.0 - source-map-loader: 5.0.0(webpack@5.90.3) - source-map-support: 0.5.21 - terser: 5.29.1 - tree-kill: 1.2.2 - tslib: 2.6.2 - typescript: 5.3.3 - undici: 6.7.1 - vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) - watchpack: 2.4.0 - webpack: 5.90.3(esbuild@0.20.1) - webpack-dev-middleware: 6.1.2(webpack@5.90.3) - webpack-dev-server: 4.15.1(webpack@5.90.3) - webpack-merge: 5.10.0 - webpack-subresource-integrity: 5.1.0(webpack@5.90.3) - optionalDependencies: - esbuild: 0.20.1 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - '@types/express' - - '@types/node' - - bufferutil - - chokidar - - debug - - html-webpack-plugin - - lightningcss - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - uglify-js - - utf-8-validate - - webpack-cli - dev: true - /@angular-devkit/build-webpack@0.1703.2(webpack-dev-server@4.15.1)(webpack@5.90.3): - resolution: {integrity: sha512-w7rVFQcZK4iTCd/MLfQWIkDkwBOfAs++txNQyS9qYID8KvLs1V+oWYd2qDBRelRv1u3YtaCIS1pQx3GFKBC3OA==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/build-webpack@0.2100.5': + resolution: {integrity: sha512-cjHBN+9vFQiy4GAlrgedsrXOIa8ghcxFeZfGpxNBcvP9jowTClFkqLeQkbeHwHkLEm9/C/QO8vz/etWoIpimEg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 - webpack-dev-server: ^4.0.0 - dependencies: - '@angular-devkit/architect': 0.1703.2 - rxjs: 7.8.1 - webpack: 5.90.3(esbuild@0.20.1) - webpack-dev-server: 4.15.1(webpack@5.90.3) - transitivePeerDependencies: - - chokidar - dev: true + webpack-dev-server: ^5.0.2 - /@angular-devkit/core@17.3.2: - resolution: {integrity: sha512-1vxKo9+pdSwTOwqPDSYQh84gZYmCJo6OgR5+AZoGLGMZSeqvi9RG5RiUcOMLQYOnuYv0arlhlWxz0ZjyR8ApKw==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/core@21.0.5': + resolution: {integrity: sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - chokidar: ^3.5.2 + chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - jsonc-parser: 3.2.1 - picomatch: 4.0.1 - rxjs: 7.8.1 - source-map: 0.7.4 - dev: true - /@angular/common@17.1.2(@angular/core@17.1.2)(rxjs@7.8.1): - resolution: {integrity: sha512-y/wD+zuPaPgK3dB80Q63qBtuu5TuryKuUgjWrOmrguBWV9oiJRhKQrcp1gVw9vVrowmbDBKGtPMS622Q4oxOWQ==} + '@angular/build@21.0.5': + resolution: {integrity: sha512-4Ejb5pA118GGyZOAGjSmZMCx5HbovRSjiqLuCmpjf9hUgs50GPNJbigWW1ewz5+KmFrc8ouEoirpgTQyaKKZ3Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler': ^21.0.0 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.0.5 + karma: ^6.4.0 + less: ^4.2.0 + ng-packagr: ^21.0.0 + postcss: ^8.4.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=5.9 <6.0' + vitest: ^4.0.8 + peerDependenciesMeta: + '@angular/core': + optional: true + '@angular/localize': + optional: true + '@angular/platform-browser': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + '@angular/ssr': + optional: true + karma: + optional: true + less: + optional: true + ng-packagr: + optional: true + postcss: + optional: true + tailwindcss: + optional: true + vitest: + optional: true + + '@angular/common@17.3.12': + resolution: {integrity: sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 17.1.2 + '@angular/core': 17.3.12 rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - rxjs: 7.8.1 - tslib: 2.6.2 - dev: true - /@angular/compiler-cli@17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3): - resolution: {integrity: sha512-4P4ttCe4IF9yq7bxCDxbVW7purN7qV0nqofP5Tth1xCsgIJeGmOMMQJN5RJCZNrAPMkvMv39eV878sgcDjbpOA==} + '@angular/compiler-cli@17.3.12': + resolution: {integrity: sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==} engines: {node: ^18.13.0 || >=20.9.0} hasBin: true peerDependencies: - '@angular/compiler': 17.1.2 - typescript: '>=5.2 <5.4' - dependencies: - '@angular/compiler': 17.1.2(@angular/core@17.1.2) - '@babel/core': 7.23.2 - '@jridgewell/sourcemap-codec': 1.4.15 - chokidar: 3.6.0 - convert-source-map: 1.9.0 - reflect-metadata: 0.1.14 - semver: 7.6.0 - tslib: 2.6.2 - typescript: 5.3.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: true + '@angular/compiler': 17.3.12 + typescript: '>=5.2 <5.5' - /@angular/compiler@17.1.2(@angular/core@17.1.2): - resolution: {integrity: sha512-1vJuQRM5V01nC6qsLvBKrHVZXpzbK0YKubwVQUXCSfDNZBcDFak3SQcwU4C2t880rU3ZvFDB1UWfk7CKn5w9Kw==} + '@angular/compiler@17.3.12': + resolution: {integrity: sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 17.1.2 + '@angular/core': 17.3.12 peerDependenciesMeta: '@angular/core': optional: true - dependencies: - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - tslib: 2.6.2 - dev: true - /@angular/core@17.1.2(rxjs@7.8.1)(zone.js@0.14.3): - resolution: {integrity: sha512-0M787BZVgYSVogHCUzo/dFrT56TgfQoEsOQngHMpyERJZv6dycXZlRdHc6TzvHUa+Uu/MNjn/RclBR8063bdWA==} + '@angular/core@17.3.12': + resolution: {integrity: sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.14.0 - dependencies: - rxjs: 7.8.1 - tslib: 2.6.2 - zone.js: 0.14.3 - dev: true - /@angular/platform-browser-dynamic@17.1.2(@angular/common@17.1.2)(@angular/compiler@17.1.2)(@angular/core@17.1.2)(@angular/platform-browser@17.1.2): - resolution: {integrity: sha512-xiWVDHbA+owDhKo5SAnzZtawA1ktGthlCl3YTI+vmkJpF6axkYOqR7YL+aEQX/y/5GSK+oR+03SgAnYcpOwKlQ==} + '@angular/platform-browser-dynamic@17.3.12': + resolution: {integrity: sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/common': 17.1.2 - '@angular/compiler': 17.1.2 - '@angular/core': 17.1.2 - '@angular/platform-browser': 17.1.2 - dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/compiler': 17.1.2(@angular/core@17.1.2) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - '@angular/platform-browser': 17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2) - tslib: 2.6.2 - dev: true + '@angular/common': 17.3.12 + '@angular/compiler': 17.3.12 + '@angular/core': 17.3.12 + '@angular/platform-browser': 17.3.12 - /@angular/platform-browser@17.1.2(@angular/common@17.1.2)(@angular/core@17.1.2): - resolution: {integrity: sha512-unfpA5OLnqDmDb/oAQR2t2iROpOg02qwZayxyFg4MUZdDdnghPCfX77L2sr6oVVa7OJfKYFlmwmBXX1H3zjcXA==} + '@angular/platform-browser@17.3.12': + resolution: {integrity: sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==} engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/animations': 17.1.2 - '@angular/common': 17.1.2 - '@angular/core': 17.1.2 + '@angular/animations': 17.3.12 + '@angular/common': 17.3.12 + '@angular/core': 17.3.12 peerDependenciesMeta: '@angular/animations': optional: true - dependencies: - '@angular/common': 17.1.2(@angular/core@17.1.2)(rxjs@7.8.1) - '@angular/core': 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) - tslib: 2.6.2 - dev: true - - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - dev: true - - /@babel/code-frame@7.26.2: - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.0.0 - dev: true - - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/compat-data@7.26.8: - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.2: - resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 -<<<<<<< HEAD - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 -======= - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.0) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 ->>>>>>> v0-1-0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.26.10: - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/core@7.23.9': + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.27.0: - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.1 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.27.0: - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.0): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - - /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.24.0): - resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.0): - resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - dev: true - - /@babel/helper-module-imports@7.18.6: + '@babel/helper-module-imports@7.18.6': resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-module-imports@7.25.9: - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-module-transforms@7.26.0(@babel/core@7.24.0): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - dev: true - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-plugin-utils@7.26.5: - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.0): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: true - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.27.0 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - /@babel/helper-string-parser@7.25.9: - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.25.9: - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.25.9: - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - dev: true - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true - /@babel/helpers@7.27.0: - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - dev: true + peerDependencies: + '@babel/core': ^7.0.0 - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - dev: true - - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.0 - - /@babel/parser@7.27.0: - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.27.0 - dev: true + peerDependencies: + '@babel/core': ^7.0.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.0) - dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0): + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.0): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.0): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.0): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true + '@babel/core': ^7.12.0 - /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.24.0): - resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - - /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.0) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: true - - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.0): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) - dev: true - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10): - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10): - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-runtime@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==} + '@babel/plugin-transform-runtime@7.28.3': + resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.0): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.26.5 - dev: true - /@babel/preset-env@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==} + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.24.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.0) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.24.0) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.0) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.0) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) - core-js-compat: 3.36.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.0): + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 - esutils: 2.0.3 - dev: true - - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - dev: true - /@babel/template@7.27.0: - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - dev: true - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + '@bart-krakowski/get-week-info-polyfill@1.0.8': + resolution: {integrity: sha512-Vkp5Skl44AkQ/w+pJ1XrCa5P5whvpK7Ix75KBoZXpGXOEp6CqLVkcAQaWfzY6+rF1R+2cwvJMkxkYF3M4B8HFw==} - /@babel/traverse@7.27.0: - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + '@commitlint/parse@19.8.1': + resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} + engines: {node: '>=v18'} - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@commitlint/types@19.8.1': + resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} + engines: {node: '>=v18'} -<<<<<<< HEAD - /@bart-krakowski/get-week-info-polyfill@1.0.5: - resolution: {integrity: sha512-TE6yg50I2W0/EJ43OAD76TNleubb/P3w8DcxsGlUZIJNODtBjyqXyxyaj9vwiftb288TBl7Sfst2alNHSp4PCQ==} - dev: false + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} - /@commitlint/parse@18.6.1: - resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} -======= - /@babel/types@7.27.0: - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - dev: true + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - /@commitlint/parse@19.8.0: - resolution: {integrity: sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==} ->>>>>>> v0-1-0 - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.8.0 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - dev: true + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - /@commitlint/types@19.8.0: - resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} - engines: {node: '>=v18'} - dependencies: - '@types/conventional-commits-parser': 5.0.1 - chalk: 5.3.0 - dev: true + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} - /@emnapi/core@1.4.3: - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - requiresBuild: true - dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 - dev: true + '@discoveryjs/json-ext@0.6.3': + resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + engines: {node: '>=14.17.0'} - /@emnapi/runtime@1.4.3: - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: true + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - /@emnapi/wasi-threads@1.0.2: - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: true + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - /@ericcornelissen/bash-parser@0.5.2: + '@ericcornelissen/bash-parser@0.5.2': resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} engines: {node: '>=4'} - dependencies: - array-last: 1.3.0 - babylon: 6.18.0 - compose-function: 3.0.3 - deep-freeze: 0.0.1 - filter-iterator: 0.0.1 - filter-obj: 1.1.0 - has-own-property: 0.1.0 - identity-function: 1.0.0 - is-iterable: 1.1.1 - iterable-lookahead: 1.0.0 - lodash.curry: 4.1.1 - magic-string: 0.16.0 - map-obj: 2.0.0 - object-pairs: 0.1.0 - object-values: 1.0.0 - reverse-arguments: 1.0.0 - shell-quote-word: 1.0.1 - to-pascal-case: 1.0.0 - unescape-js: 1.1.4 - dev: true + deprecated: Support for this package will stop 2025-12-31 - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/aix-ppc64@0.20.1: - resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.25.3: - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + '@esbuild/aix-ppc64@0.26.0': + resolution: {integrity: sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.20.1: - resolution: {integrity: sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.25.3: - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + '@esbuild/android-arm64@0.26.0': + resolution: {integrity: sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.20.1: - resolution: {integrity: sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.25.3: - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + '@esbuild/android-arm@0.26.0': + resolution: {integrity: sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA==} engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.20.1: - resolution: {integrity: sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.25.3: - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + '@esbuild/android-x64@0.26.0': + resolution: {integrity: sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A==} engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.20.1: - resolution: {integrity: sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.25.3: - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + '@esbuild/darwin-arm64@0.26.0': + resolution: {integrity: sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.20.1: - resolution: {integrity: sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.25.3: - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + '@esbuild/darwin-x64@0.26.0': + resolution: {integrity: sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.20.1: - resolution: {integrity: sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.25.3: - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + '@esbuild/freebsd-arm64@0.26.0': + resolution: {integrity: sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.20.1: - resolution: {integrity: sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.25.3: - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + '@esbuild/freebsd-x64@0.26.0': + resolution: {integrity: sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.20.1: - resolution: {integrity: sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.25.3: - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + '@esbuild/linux-arm64@0.26.0': + resolution: {integrity: sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.1: - resolution: {integrity: sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.25.3: - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + '@esbuild/linux-arm@0.26.0': + resolution: {integrity: sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.20.1: - resolution: {integrity: sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.25.3: - resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + '@esbuild/linux-ia32@0.26.0': + resolution: {integrity: sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.20.1: - resolution: {integrity: sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.25.3: - resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + '@esbuild/linux-loong64@0.26.0': + resolution: {integrity: sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.20.1: - resolution: {integrity: sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.25.3: - resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + '@esbuild/linux-mips64el@0.26.0': + resolution: {integrity: sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.20.1: - resolution: {integrity: sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.25.3: - resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + '@esbuild/linux-ppc64@0.26.0': + resolution: {integrity: sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.1: - resolution: {integrity: sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.25.3: - resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + '@esbuild/linux-riscv64@0.26.0': + resolution: {integrity: sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.20.1: - resolution: {integrity: sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.25.3: - resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + '@esbuild/linux-s390x@0.26.0': + resolution: {integrity: sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.20.1: - resolution: {integrity: sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.25.3: - resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + '@esbuild/linux-x64@0.26.0': + resolution: {integrity: sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-arm64@0.25.3: - resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/netbsd-arm64@0.26.0': + resolution: {integrity: sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.20.1: - resolution: {integrity: sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.25.3: - resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + '@esbuild/netbsd-x64@0.26.0': + resolution: {integrity: sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-arm64@0.25.3: - resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/openbsd-arm64@0.26.0': + resolution: {integrity: sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.20.1: - resolution: {integrity: sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.25.3: - resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + '@esbuild/openbsd-x64@0.26.0': + resolution: {integrity: sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.26.0': + resolution: {integrity: sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - /@esbuild/sunos-x64@0.20.1: - resolution: {integrity: sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.25.3: - resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + '@esbuild/sunos-x64@0.26.0': + resolution: {integrity: sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.20.1: - resolution: {integrity: sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.25.3: - resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + '@esbuild/win32-arm64@0.26.0': + resolution: {integrity: sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.1: - resolution: {integrity: sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.25.3: - resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + '@esbuild/win32-ia32@0.26.0': + resolution: {integrity: sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.1: - resolution: {integrity: sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.25.3: - resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + '@esbuild/win32-x64@0.26.0': + resolution: {integrity: sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A==} engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/eslint-utils@4.6.1(eslint@8.56.0): - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@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 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@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} - dev: true - /@eslint-community/regexpp@4.12.1: - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + '@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} - dev: true - /@eslint/js@9.25.1: - resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - /@gerrit0/mini-shiki@1.27.2: + '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} - dependencies: - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - dev: true - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true + deprecated: Use @eslint/config-array instead - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} - /@isaacs/cliui@8.0.2: + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/sourcemap-codec@1.5.0: - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - dev: true + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} -<<<<<<< HEAD - /@js-temporal/polyfill@0.4.4: - resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} - engines: {node: '>=12'} - dependencies: - jsbi: 4.3.0 - tslib: 2.6.2 - dev: false + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} -======= - /@js-temporal/polyfill@0.5.1: + '@js-temporal/polyfill@0.5.1': resolution: {integrity: sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==} engines: {node: '>=12'} - dependencies: - jsbi: 4.3.2 - dev: false - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - dev: true + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: true + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' ->>>>>>> v0-1-0 - /@leichtgewicht/ip-codec@2.0.5: - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - dev: true + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@lmdb/lmdb-darwin-arm64@3.4.3': + resolution: {integrity: sha512-zR6Y45VNtW5s+A+4AyhrJk0VJKhXdkLhrySCpCu7PSdnakebsOzNxf58p5Xoq66vOSuueGAxlqDAF49HwdrSTQ==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.4.3': + resolution: {integrity: sha512-nfGm5pQksBGfaj9uMbjC0YyQreny/Pl7mIDtHtw6g7WQuCgeLullr9FNRsYyKplaEJBPrCVpEjpAznxTBIrXBw==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@3.4.3': + resolution: {integrity: sha512-uX9eaPqWb740wg5D3TCvU/js23lSRSKT7lJrrQ8IuEG/VLgpPlxO3lHDywU44yFYdGS7pElBn6ioKFKhvALZlw==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.4.3': + resolution: {integrity: sha512-Kjqomp7i0rgSbYSUmv9JnXpS55zYT/YcW3Bdf9oqOTjcH0/8tFAP8MLhu/i9V2pMKIURDZk63Ww49DTK0T3c/Q==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.4.3': + resolution: {integrity: sha512-7/8l20D55CfwdMupkc3fNxNJdn4bHsti2X0cp6PwiXlLeSFvAfWs5kCCx+2Cyje4l4GtN//LtKWjTru/9hDJQg==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-arm64@3.4.3': + resolution: {integrity: sha512-yWVR0e5Gl35EGJBsAuqPOdjtUYuN8CcTLKrqpQFoM+KsMadViVCulhKNhkcjSGJB88Am5bRPjMro4MBB9FS23Q==} + cpu: [arm64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.4.3': + resolution: {integrity: sha512-1JdBkcO0Vrua4LUgr4jAe4FUyluwCeq/pDkBrlaVjX3/BBWP1TzVjCL+TibWNQtPAL1BITXPAhlK5Ru4FBd/hg==} + cpu: [x64] + os: [win32] + + '@microsoft/api-extractor-model@7.29.6': + resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} + + '@microsoft/api-extractor@7.47.7': + resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@ngtools/webpack@21.0.5': + resolution: {integrity: sha512-m27t/Gl+AAW4jHZ0WOZTQhuYEHtI6ThfR/msKiAnOcfx9z5zR4hbR68cIuxx7KPkd/yDjL6mdi9i/vhcq9DNPg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^21.0.0 + typescript: '>=5.9 <6.0' + webpack: ^5.54.0 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.scandir@3.0.0': + resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} + engines: {node: '>=16.14.0'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@3.0.0': + resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} + engines: {node: '>=16.14.0'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@2.0.0': + resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} + engines: {node: '>=16.14.0'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.4': + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.0.0': + resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@nx/nx-darwin-arm64@20.8.0': + resolution: {integrity: sha512-A6Te2KlINtcOo/depXJzPyjbk9E0cmgbom/sm/49XdQ8G94aDfyIIY1RIdwmDCK5NVd74KFG3JIByTk5+VnAhA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nx/nx-darwin-x64@20.8.0': + resolution: {integrity: sha512-UpqayUjgalArXaDvOoshqSelTrEp42cGDsZGy0sqpxwBpm3oPQ8wE1d7oBAmRo208rAxOuFP0LZRFUqRrwGvLA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nx/nx-freebsd-x64@20.8.0': + resolution: {integrity: sha512-dUR2fsLyKZYMHByvjy2zvmdMbsdXAiP+6uTlIAuu8eHMZ2FPQCAtt7lPYLwOFUxUXChbek2AJ+uCI0gRAgK/eg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nx/nx-linux-arm-gnueabihf@20.8.0': + resolution: {integrity: sha512-GuZ7t0SzSX5ksLYva7koKZovQ5h/Kr1pFbOsQcBf3VLREBqFPSz6t7CVYpsIsMhiu/I3EKq6FZI3wDOJbee5uw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@nx/nx-linux-arm64-gnu@20.8.0': + resolution: {integrity: sha512-CiI955Q+XZmBBZ7cQqQg0MhGEFwZIgSpJnjPfWBt3iOYP8aE6nZpNOkmD7O8XcN/nEwwyeCOF8euXqEStwsk8w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-arm64-musl@20.8.0': + resolution: {integrity: sha512-Iy9DpvVisxsfNh4gOinmMQ4cLWdBlgvt1wmry1UwvcXg479p1oJQ1Kp1wksUZoWYqrAG8VPZUmkE0f7gjyHTGg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-x64-gnu@20.8.0': + resolution: {integrity: sha512-kZrrXXzVSbqwmdTmQ9xL4Jhi0/FSLrePSxYCL9oOM3Rsj0lmo/aC9kz4NBv1ZzuqT7fumpBOnhqiL1QyhOWOeQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-linux-x64-musl@20.8.0': + resolution: {integrity: sha512-0l9jEMN8NhULKYCFiDF7QVpMMNG40duya+OF8dH0OzFj52N0zTsvsgLY72TIhslCB/cC74oAzsmWEIiFslscnA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-win32-arm64-msvc@20.8.0': + resolution: {integrity: sha512-5miZJmRSwx1jybBsiB3NGocXL9TxGdT2D+dOqR2fsLklpGz0ItEWm8+i8lhDjgOdAr2nFcuQUfQMY57f9FOHrA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@nx/nx-win32-x64-msvc@20.8.0': + resolution: {integrity: sha512-0P5r+bDuSNvoWys+6C1/KqGpYlqwSHpigCcyRzR62iZpT3OooZv+nWO06RlURkxMR8LNvYXTSSLvoLkjxqM8uQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@oxc-project/types@0.96.0': + resolution: {integrity: sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/constants@7.1.1': + resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} + engines: {node: '>=16.14'} + + '@pnpm/core-loggers@9.0.6': + resolution: {integrity: sha512-iK67SGbp+06bA/elpg51wygPFjNA7JKHtKkpLxqXXHw+AjFFBC3f2OznJsCIuDK6HdGi5UhHLYqo5QxJ2gMqJQ==} + engines: {node: '>=16.14'} + peerDependencies: + '@pnpm/logger': ^5.0.0 + + '@pnpm/error@5.0.3': + resolution: {integrity: sha512-ONJU5cUeoeJSy50qOYsMZQHTA/9QKmGgh1ATfEpCLgtbdwqUiwD9MxHNeXUYYI/pocBCz6r1ZCFqiQvO+8SUKA==} + engines: {node: '>=16.14'} + + '@pnpm/fetching-types@5.0.0': + resolution: {integrity: sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q==} + engines: {node: '>=16.14'} + + '@pnpm/graceful-fs@3.2.0': + resolution: {integrity: sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==} + engines: {node: '>=16.14'} + + '@pnpm/logger@5.0.0': + resolution: {integrity: sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw==} + engines: {node: '>=12.17'} + + '@pnpm/npm-package-arg@1.0.0': + resolution: {integrity: sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw==} + engines: {node: '>=14.6'} + + '@pnpm/npm-resolver@18.1.1': + resolution: {integrity: sha512-NptzncmMD5ZMimbjWkGpMzuBRhlCY+sh7mzypPdBOTNlh5hmEQe/VaRKjNK4V9/b0C/llElkvIePL6acybu86w==} + engines: {node: '>=16.14'} + peerDependencies: + '@pnpm/logger': ^5.0.0 + + '@pnpm/ramda@0.28.1': + resolution: {integrity: sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==} + + '@pnpm/resolve-workspace-range@5.0.1': + resolution: {integrity: sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg==} + engines: {node: '>=16.14'} + + '@pnpm/resolver-base@11.1.0': + resolution: {integrity: sha512-y2qKaj18pwe1VWc3YXEitdYFo+WqOOt60aqTUuOVkJAirUzz0DzuYh3Ifct4znYWPdgUXHaN5DMphNF5iL85rA==} + engines: {node: '>=16.14'} + + '@pnpm/types@9.4.2': + resolution: {integrity: sha512-g1hcF8Nv4gd76POilz9gD4LITAPXOe5nX4ijgr8ixCbLQZfcpYiMfJ+C1RlMNRUDo8vhlNB4O3bUlxmT6EAQXA==} + engines: {node: '>=16.14'} + + '@pnpm/workspace.pkgs-graph@2.0.16': + resolution: {integrity: sha512-WNsDLkDKm7/eht91s/Iif9ELLabdshAIqpH3svCwdp/xiRxGumfUWkCCeCODjLbBCQehrsl3ugSsboIvk0xiPw==} + engines: {node: '>=16.14'} + + '@rolldown/binding-android-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.47': + resolution: {integrity: sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': + resolution: {integrity: sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': + resolution: {integrity: sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + resolution: {integrity: sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rolldown/pluginutils@1.0.0-beta.47': + resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/node-core-library@5.7.0': + resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.14.0': + resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.22.6': + resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} + + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@snyk/github-codeowners@1.1.0': + resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} + engines: {node: '>=8.10'} + hasBin: true + + '@solidjs/testing-library@0.8.10': + resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} + engines: {node: '>= 14'} + peerDependencies: + '@solidjs/router': '>=0.9.0' + solid-js: '>=1.0.0' + peerDependenciesMeta: + '@solidjs/router': + optional: true + + '@stylistic/eslint-plugin-js@4.4.1': + resolution: {integrity: sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + + '@stylistic/eslint-plugin@4.4.1': + resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + + '@tanstack/config@0.18.2': + resolution: {integrity: sha512-QuEq2Aky5pEJcDA7eZrnp4f2Fyq3X8iXPdcXmbPpanFXoBJYZCWVH9npkRuaNYNIuL2suFeaGzjwW4HhyWNq9g==} + engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@tanstack/eslint-config@0.1.0': + resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} + engines: {node: '>=18'} + + '@tanstack/eslint-config@0.2.0': + resolution: {integrity: sha512-KUJUDvYFaqxekc8IwgokZ7+yJUoR7LPFu788VSfCxtsbqP/wZyppuoaToC/74LIFjBKIHJQN+YdvBFedD2fqJg==} + engines: {node: '>=18'} + + '@tanstack/publish-config@0.1.1': + resolution: {integrity: sha512-gw46t9d8fkf4ICU+EVcQdVWWRRux3K3+DM/vO3xp3KrU4/BlQOZgP9BFEWY7znU5pqD5rJ3ozrTbv9ezw78Qyw==} + engines: {node: '>=18'} + + '@tanstack/react-store@0.4.1': + resolution: {integrity: sha512-cyriofh2I6dPOPJf2W0K+ON5q08ezevLTUhC1txiUnrJ9XFFFPr0X8CmGnXzucI2c0t0V6wYZc0GCz4zOAeptg==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + + '@tanstack/store@0.4.1': + resolution: {integrity: sha512-NvW3MomYSTzQK61AWdtWNIhWgszXFZDRgCNlvSDw/DBaoLqJIlZ0/gKLsditA8un/BGU1NR06+j0a/UNLgXA+Q==} + + '@tanstack/typedoc-config@0.2.0': + resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} + engines: {node: '>=18'} + + '@tanstack/typedoc-config@0.2.1': + resolution: {integrity: sha512-3miLBNiyWX54bQKBNnh7Fj6otWX8ZDiU6/ffOsNnikwBdKjFkA7ddrBtC5/JQkLCE6CBIqcJvtNIwI+DZu4y1Q==} + engines: {node: '>=18'} + + '@tanstack/vite-config@0.2.0': + resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} + engines: {node: '>=18'} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@14.3.1': + resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@testing-library/vue@8.1.0': + resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} + engines: {node: '>=14'} + peerDependencies: + '@vue/compiler-sfc': '>= 3' + vue: '>= 3' + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@ts-morph/common@0.22.0': + resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/conventional-commits-parser@5.0.2': + resolution: {integrity: sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.8': + resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/picomatch@2.3.3': + resolution: {integrity: sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.27': + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@8.52.0': + resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.52.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.52.0': + resolution: {integrity: sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.52.0': + resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@8.52.0': + resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.52.0': + resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@8.52.0': + resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@8.52.0': + resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.52.0': + resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@8.52.0': + resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@8.52.0': + resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-basic-ssl@2.1.0': + resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vitest/coverage-istanbul@1.6.1': + resolution: {integrity: sha512-0NWKNPrbMo1s6emwnn+UpGPxrSEd9R6VpQ3wzYz0y43esZjjDkGLb6Qkvfu6LNyQO4TAGyepaZ11imUmmIFLaw==} + peerDependencies: + vitest: 1.6.1 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + + '@vue/compiler-sfc@2.7.16': + resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==} + + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/composition-api@1.7.2': + resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} + peerDependencies: + vue: '>= 2.5 < 2.7' + + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.26': + resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + + '@vue/runtime-core@3.5.26': + resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + + '@vue/runtime-dom@3.5.26': + resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + + '@vue/server-renderer@3.5.26': + resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} + peerDependencies: + vue: 3.5.26 + + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + '@yarnpkg/parsers@3.0.2': + resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} + engines: {node: '>=18.12.0'} + + '@zkochan/js-yaml@0.0.7': + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} + hasBin: true + + '@zkochan/retry@0.2.0': + resolution: {integrity: sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw==} + engines: {node: '>=10'} + + '@zkochan/rimraf@2.1.3': + resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==} + engines: {node: '>=12.10'} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + engines: {node: '>=18'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + 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.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + arity-n@1.0.4: + resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + + 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'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + 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==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + babel-loader@10.0.0: + resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} + engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5.61.0' + + babel-plugin-jsx-dom-expressions@0.40.3: + resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-preset-solid@1.9.10: + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^1.9.10 + peerDependenciesMeta: + solid-js: + optional: true + + babylon@6.18.0: + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} + hasBin: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + beasties@0.3.5: + resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} + engines: {node: '>=14.0.0'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bole@5.0.25: + resolution: {integrity: sha512-4WsO2cOzQwN4MDCS/6krYWfz1brS3bJGKJhZQ+cr6EvcJIJiuxrWBZz/2WXbQjurFCRl+ddAzqH6SYaIzSmzsQ==} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + 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-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001763: + resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + + cli-spinners@3.3.0: + resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + engines: {node: '>=18.20'} + + cli-truncate@5.1.1: + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + engines: {node: '>=20'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + compose-function@3.0.3: + resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-webpack-plugin@13.0.1: + resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.47.0: + resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + 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'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-freeze@0.0.1: + resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + 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==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encode-registry@3.0.1: + resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==} + engines: {node: '>=10'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + 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'} + + esbuild-wasm@0.26.0: + resolution: {integrity: sha512-9rZuermDo9ZbWvKBv/vDRaRciCpR4L3rEbZLDs5kDq3TrCHRQZaQipQeV9wK/btpLBzNUBujTrd1uorDxbL/GA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.26.0: + resolution: {integrity: sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@9.1.2: + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + 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-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + 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-n@17.23.1: + resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + 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@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + 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-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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 + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + 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==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@2.1.2: + resolution: {integrity: sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==} + engines: {node: ^10.17.0 || >=12.3.0} + peerDependencies: + domexception: '*' + peerDependenciesMeta: + domexception: + optional: true + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-iterator@0.0.1: + resolution: {integrity: sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + 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} + os: [darwin] + + 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==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + 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'} + + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + 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==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + 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==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + 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'} + + has-own-property@0.1.0: + resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} + + 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'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy-middleware@3.0.5: + resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + identity-function@1.0.0: + resolution: {integrity: sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + individual@3.0.0: + resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==} + + 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.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} + engines: {node: '>= 10'} + + is-arguments@1.2.0: + 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-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-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + 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-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-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + 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'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-iterable@1.1.1: + resolution: {integrity: sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==} + engines: {node: '>= 4'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + 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'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + 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-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + 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-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + 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'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + iterable-lookahead@1.0.0: + resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} + engines: {node: '>=4'} + + 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==} + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsbi@4.3.2: + resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==} + + jsdom@24.1.3: + resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + karma-source-map-support@1.4.0: + resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + knip@4.6.0: + resolution: {integrity: sha512-6slzggzmyAuvtr97nH56ob1RNlkrG2dGF7yn8PJ/LIF8bPsoM93TRNLWTbmuOg4/E1CImilSX4qy9fok0AKJyA==} + engines: {node: '>=18.6.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4' + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + + less-loader@12.3.0: + resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.4.2: + resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} + engines: {node: '>=14'} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + license-webpack-plugin@4.0.2: + resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} + peerDependencies: + webpack: '*' + peerDependenciesMeta: + webpack: + optional: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} + engines: {node: '>=20.0.0'} + + lmdb@3.4.3: + resolution: {integrity: sha512-GWV1kVi6uhrXWqe+3NXWO73OYe8fto6q8JMo0HOpk1vf8nEyFWgo4CSNJpIFzsOxOrysVUlcO48qRbQfmKd1gA==} + hasBin: true + + load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.16.0: + resolution: {integrity: sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + map-obj@2.0.0: + resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} + engines: {node: '>=4'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + mem@6.1.1: + resolution: {integrity: sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==} + engines: {node: '>=8'} + + mem@8.1.1: + resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} + engines: {node: '>=10'} + + memfs@4.51.1: + resolution: {integrity: sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + mini-css-extract-plugin@2.9.4: + resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.8: + resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch@3.0.0-beta.9: + resolution: {integrity: sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==} + engines: {node: ^10.17 || >=12.3} + + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + engines: {node: '>= 6.13.0'} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@2.0.1: + resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-packlist@5.1.3: + resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + + nx@20.8.0: + resolution: {integrity: sha512-+BN5B5DFBB5WswD8flDDTnr4/bf1VTySXOv60aUAllHqR+KS6deT0p70TTMZF4/A2n/L2UCWDaDro37MGaYozA==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + + object-assign@4.1.1: + 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-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-pairs@0.1.0: + resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} + + object-values@1.0.0: + resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} + engines: {node: '>=0.10.0'} + + 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'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} + + ordered-binary@1.6.1: + resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-memoize@4.0.1: + resolution: {integrity: sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==} + engines: {node: '>=10'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse-npm-tarball-url@3.0.0: + resolution: {integrity: sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g==} + engines: {node: '>=8.15'} + + parse5-html-rewriting-stream@8.0.0: + resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} + + parse5-sax-parser@8.0.0: + resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + 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'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-temp@2.1.0: + resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} + engines: {node: '>=8.15'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.1: + resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} + engines: {node: '>=12'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + piscina@5.1.3: + resolution: {integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==} + engines: {node: '>=20.x'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-loader@8.2.0: + resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + 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} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@9.0.0: + resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + engines: {node: '>=18'} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + publint@0.2.12: + resolution: {integrity: sha512-YNeUtCVeM4j9nDiTT2OPczmlyzOkIXNtdDZnSuajAxS/nZ6j3t7Vs9SUB4euQNddiltIwu7Tdd3s+hr08fAsMw==} + engines: {node: '>=16'} + hasBin: true + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regex-parser@2.3.1: + resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + rename-overwrite@5.0.4: + resolution: {integrity: sha512-BOR/6Zr3F0vmTzwvkiCZaPrzv1NJZQVRhrWA4w2IQtj33owmh5Y4LRajsR4QrqdIgLlAqOLEEc1PiUf15ku9hQ==} + engines: {node: '>=12.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url-loader@5.0.0: + resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} + engines: {node: '>=12'} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + reverse-arguments@1.0.0: + resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rolldown@1.0.0-beta.47: + resolution: {integrity: sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-preserve-directives@0.4.0: + resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} + peerDependencies: + rollup: 2.x || 3.x || 4.x + + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + 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'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@16.0.5: + resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + 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'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + 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'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote-word@1.0.1: + resolution: {integrity: sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + sherif-darwin-arm64@0.7.0: + resolution: {integrity: sha512-rzWV13FwPA3h7UcO2B1o3s5lBhB4h7p1wXPB7Z0NMR/xweiTpT+hn3kls3YLdAeIL460Gc46ieJCnPFkI/rC0A==} + cpu: [arm64] + os: [darwin] + + sherif-darwin-x64@0.7.0: + resolution: {integrity: sha512-6y3cp/ZdhrbHS9e1J70POZyPJdJ1eDYc43Xck9FcRL7GTsH5JbinIqyihdNVu1ctG7ewMA2Ii1nzuQe/rt9Gig==} + cpu: [x64] + os: [darwin] + + sherif-linux-arm64@0.7.0: + resolution: {integrity: sha512-DRfXTJuQ3CkF41+vDtCsptKjcvZg+PM9C+btJbZnAhbLSP8kSDWNmOIyH5/LQOBpntbEe6obqPFsBTjpkATkQw==} + cpu: [arm64] + os: [linux] + + sherif-linux-x64@0.7.0: + resolution: {integrity: sha512-4KM7P/V1jy8WKuGax8hOaRNWLTkwY10+MzVeof4UbTfcZxKibAHpSKtNmmzYFHKlFxOLXRGqDgXYmj5iuXB4bQ==} + cpu: [x64] + os: [linux] + + sherif-windows-arm64@0.7.0: + resolution: {integrity: sha512-WZ62t+YQ39XO6TuMTSWZJwiJTtKaoverhAk0F1MwlCkTZu2xZvlMMWKIN9wtMJvvrNYqTsjrv2xEH1EQNUDfhg==} + cpu: [arm64] + os: [win32] + + sherif-windows-x64@0.7.0: + resolution: {integrity: sha512-x5464tDL2VhuLgddbVL33ekMYoTxTDkIsI018o0VaD2V675Bw6RiFrmpzd/HqjXdVRCOh0LCBfH43G3C0NN0Uw==} + cpu: [x64] + os: [win32] + + sherif@0.7.0: + resolution: {integrity: sha512-2ofYRtx6L4O1EFzUIxD4aSs4tqbE6/oes5/UTjjADHhLIBoq0SbxstPbpxLfz18EKdSDCDr5ZBQBinfm8k8bSQ==} + hasBin: true + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + 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'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.30.0: + resolution: {integrity: sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + smol-toml@1.1.4: + resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} + engines: {node: '>= 18', pnpm: '>= 8'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + solid-js@1.9.10: + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-loader@5.0.0: + resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.72.1 + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + string.fromcodepoint@0.2.1: + resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} + + 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.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + 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-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + engines: {node: '>=14.16'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + summary@2.1.0: + resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + to-no-case@1.0.2: + resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} + + to-pascal-case@1.0.0: + resolution: {integrity: sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-space-case@1.0.0: + resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + ts-morph@21.0.1: + resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + 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'} + + typed-assert@1.0.9: + resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + + typedoc-plugin-frontmatter@1.2.1: + resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} + peerDependencies: + typedoc-plugin-markdown: '>=4.4.2' + + typedoc-plugin-markdown@4.4.2: + resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.27.x + + typedoc@0.27.9: + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + + typesafe-actions@5.1.0: + resolution: {integrity: sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==} + engines: {node: '>= 4'} + + typescript-eslint@8.52.0: + resolution: {integrity: sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.2: + resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + + unescape-js@1.1.4: + resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@4.0.0: + resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + version-selector-type@3.0.0: + resolution: {integrity: sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA==} + engines: {node: '>=10.13'} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@4.2.3: + resolution: {integrity: sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-externalize-deps@0.9.0: + resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + + vite-plugin-solid@2.11.10: + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.2.2: + resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vlq@0.2.3: + resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue@2.6.14: + resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==} + deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. + + vue@2.7.16: + resolution: {integrity: sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==} + deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. + + vue@3.5.26: + resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-subresource-integrity@5.1.0: + resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} + engines: {node: '>= 12'} + peerDependencies: + html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + webpack: ^5.12.0 + peerDependenciesMeta: + html-webpack-plugin: + optional: true + + webpack@5.104.0: + resolution: {integrity: sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + 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==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-validation-error@3.0.0: + resolution: {integrity: sha512-x+agsJJG9rvC7axF0xqTEdZhJkLHyIZkdOAWDJSmwGPzxNHMHwtU6w2yDOAAP6yuSfTAUhAMJRBfhVGY64ySEQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zone.js@0.14.10: + resolution: {integrity: sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==} + +snapshots: + + '@adobe/css-tools@4.4.4': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@analogjs/vite-plugin-angular@0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2))': + dependencies: + '@angular-devkit/build-angular': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2) + ts-morph: 21.0.1 + + '@angular-devkit/architect@0.2100.5(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 21.0.5(chokidar@4.0.3) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) + '@angular-devkit/build-webpack': 0.2100.5(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.104.0(esbuild@0.26.0)))(webpack@5.104.0(esbuild@0.26.0)) + '@angular-devkit/core': 21.0.5(chokidar@4.0.3) + '@angular/build': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2) + '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.28.4) + '@babel/preset-env': 7.28.3(@babel/core@7.28.4) + '@babel/runtime': 7.28.4 + '@discoveryjs/json-ext': 0.6.3 + '@ngtools/webpack': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.0(esbuild@0.26.0)) + ansi-colors: 4.1.3 + autoprefixer: 10.4.21(postcss@8.5.6) + babel-loader: 10.0.0(@babel/core@7.28.4)(webpack@5.104.0(esbuild@0.26.0)) + browserslist: 4.28.1 + copy-webpack-plugin: 13.0.1(webpack@5.104.0(esbuild@0.26.0)) + css-loader: 7.1.2(webpack@5.104.0(esbuild@0.26.0)) + esbuild-wasm: 0.26.0 + http-proxy-middleware: 3.0.5 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + karma-source-map-support: 1.4.0 + less: 4.4.2 + less-loader: 12.3.0(less@4.4.2)(webpack@5.104.0(esbuild@0.26.0)) + license-webpack-plugin: 4.0.2(webpack@5.104.0(esbuild@0.26.0)) + loader-utils: 3.3.1 + mini-css-extract-plugin: 2.9.4(webpack@5.104.0(esbuild@0.26.0)) + open: 10.2.0 + ora: 9.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + postcss: 8.5.6 + postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.0(esbuild@0.26.0)) + resolve-url-loader: 5.0.0 + rxjs: 7.8.2 + sass: 1.93.2 + sass-loader: 16.0.5(sass@1.93.2)(webpack@5.104.0(esbuild@0.26.0)) + semver: 7.7.3 + source-map-loader: 5.0.0(webpack@5.104.0(esbuild@0.26.0)) + source-map-support: 0.5.21 + terser: 5.44.0 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + tslib: 2.8.1 + typescript: 5.9.3 + webpack: 5.104.0(esbuild@0.26.0) + webpack-dev-middleware: 7.4.5(webpack@5.104.0(esbuild@0.26.0)) + webpack-dev-server: 5.2.2(webpack@5.104.0(esbuild@0.26.0)) + webpack-merge: 6.0.1 + webpack-subresource-integrity: 5.1.0(webpack@5.104.0(esbuild@0.26.0)) + optionalDependencies: + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + esbuild: 0.26.0 + transitivePeerDependencies: + - '@angular/compiler' + - '@rspack/core' + - '@swc/core' + - '@types/node' + - bufferutil + - chokidar + - debug + - html-webpack-plugin + - jiti + - lightningcss + - node-sass + - sass-embedded + - stylus + - sugarss + - supports-color + - tsx + - uglify-js + - utf-8-validate + - vitest + - webpack-cli + - yaml + + '@angular-devkit/build-webpack@0.2100.5(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.104.0(esbuild@0.26.0)))(webpack@5.104.0(esbuild@0.26.0))': + dependencies: + '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) + rxjs: 7.8.2 + webpack: 5.104.0(esbuild@0.26.0) + webpack-dev-server: 5.2.2(webpack@5.104.0(esbuild@0.26.0)) + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@21.0.5(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.3 + rxjs: 7.8.2 + source-map: 0.7.6 + optionalDependencies: + chokidar: 4.0.3 + + '@angular/build@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) + '@angular/compiler': 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.19(@types/node@18.19.130) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + beasties: 0.3.5 + browserslist: 4.28.1 + esbuild: 0.26.0 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + rolldown: 1.0.0-beta.47 + sass: 1.93.2 + semver: 7.7.3 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.3 + undici: 7.16.0 + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + watchpack: 2.4.4 + optionalDependencies: + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + less: 4.4.2 + lmdb: 3.4.3 + postcss: 8.5.6 + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2)': + dependencies: + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3)': + dependencies: + '@angular/compiler': 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + '@babel/core': 7.23.9 + '@jridgewell/sourcemap-codec': 1.5.5 + chokidar: 3.6.0 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.7.3 + tslib: 2.8.1 + typescript: 5.9.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))': + dependencies: + tslib: 2.8.1 + optionalDependencies: + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + + '@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)': + dependencies: + rxjs: 7.8.2 + tslib: 2.8.1 + zone.js: 0.14.10 + + '@angular/platform-browser-dynamic@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))': + dependencies: + '@angular/common': 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) + '@angular/compiler': 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) + tslib: 2.8.1 + + '@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))': + dependencies: + '@angular/common': 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) + '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) + tslib: 2.8.1 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.23.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.23.9) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.47.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.5 + esutils: 2.0.3 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bart-krakowski/get-week-info-polyfill@1.0.8': {} + + '@commitlint/parse@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/types@19.8.1': + dependencies: + '@types/conventional-commits-parser': 5.0.2 + chalk: 5.6.2 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@discoveryjs/json-ext@0.6.3': {} + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + + '@ericcornelissen/bash-parser@0.5.2': + dependencies: + array-last: 1.3.0 + babylon: 6.18.0 + compose-function: 3.0.3 + deep-freeze: 0.0.1 + filter-iterator: 0.0.1 + filter-obj: 1.1.0 + has-own-property: 0.1.0 + identity-function: 1.0.0 + is-iterable: 1.1.1 + iterable-lookahead: 1.0.0 + lodash.curry: 4.1.1 + magic-string: 0.16.0 + map-obj: 2.0.0 + object-pairs: 0.1.0 + object-values: 1.0.0 + reverse-arguments: 1.0.0 + shell-quote-word: 1.0.1 + to-pascal-case: 1.0.0 + unescape-js: 1.1.4 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.26.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.26.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.26.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.26.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.26.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.26.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.26.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.26.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.26.0': + optional: true - /@ljharb/through@2.3.13: - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.26.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.26.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.26.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.26.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.26.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.26.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.26.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.26.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.26.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.26.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.26.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.26.0': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.26.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.26.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.26.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.26.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.26.0': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: - call-bind: 1.0.7 - dev: true + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 - /@microsoft/api-extractor-model@7.29.6(@types/node@18.19.3): - resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + 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.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@eslint/js@9.39.2': {} + + '@gerrit0/mini-shiki@1.27.2': + dependencies: + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.19(@types/node@18.19.130)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@18.19.130) + '@inquirer/type': 3.0.10(@types/node@18.19.130) + optionalDependencies: + '@types/node': 18.19.130 + + '@inquirer/core@10.3.2(@types/node@18.19.130)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@18.19.130) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 18.19.130 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/type@3.0.10(@types/node@18.19.130)': + optionalDependencies: + '@types/node': 18.19.130 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@js-temporal/polyfill@0.5.1': + dependencies: + jsbi: 4.3.2 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@lmdb/lmdb-darwin-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-darwin-x64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm@3.4.3': + optional: true + + '@lmdb/lmdb-linux-x64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-x64@3.4.3': + optional: true + + '@microsoft/api-extractor-model@7.29.6(@types/node@18.19.130)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.130) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.47.7(@types/node@18.19.130)': dependencies: + '@microsoft/api-extractor-model': 7.29.6(@types/node@18.19.130) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.130) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.0(@types/node@18.19.130) + '@rushstack/ts-command-line': 4.22.6(@types/node@18.19.130) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - dev: true - /@microsoft/api-extractor@7.47.7(@types/node@18.19.3): - resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@18.19.3) - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@18.19.3) - '@rushstack/ts-command-line': 4.22.6(@types/node@18.19.3) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - dev: true + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.15.1': {} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true - /@microsoft/tsdoc-config@0.17.1: - resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} - dependencies: - '@microsoft/tsdoc': 0.15.1 - ajv: 8.12.0 - jju: 1.4.0 - resolve: 1.22.8 - dev: true + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true - /@microsoft/tsdoc@0.15.1: - resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - dev: true + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true - /@napi-rs/wasm-runtime@0.2.4: - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.9.0 - dev: true - /@napi-rs/wasm-runtime@0.2.9: - resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} - requiresBuild: true + '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 - dev: true + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 optional: true - /@ngtools/webpack@17.3.2(@angular/compiler-cli@17.1.2)(typescript@5.3.3)(webpack@5.90.3): - resolution: {integrity: sha512-E8zejFF4aJ8l2XcF+GgnE/1IqsZepnPT1xzulLB4LXtjVuXLFLoF9xkHQwxs7cJWWZsxd/SlNsCIcn/ezrYBcQ==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^17.0.0 - typescript: '>=5.2 <5.5' - webpack: ^5.54.0 + '@ngtools/webpack@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.0(esbuild@0.26.0))': dependencies: - '@angular/compiler-cli': 17.1.2(@angular/compiler@17.1.2)(typescript@5.3.3) - typescript: 5.3.3 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) + typescript: 5.9.3 + webpack: 5.104.0(esbuild@0.26.0) - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.scandir@3.0.0: - resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} - engines: {node: '>=16.14.0'} + '@nodelib/fs.scandir@3.0.0': dependencies: '@nodelib/fs.stat': 3.0.0 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.stat@3.0.0: - resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} - engines: {node: '>=16.14.0'} - dev: true + '@nodelib/fs.stat@3.0.0': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true + fastq: 1.20.1 - /@nodelib/fs.walk@2.0.0: - resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} - engines: {node: '>=16.14.0'} + '@nodelib/fs.walk@2.0.0': dependencies: '@nodelib/fs.scandir': 3.0.0 - fastq: 1.17.1 - dev: true + fastq: 1.20.1 - /@npmcli/git@5.0.4: - resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@nolyfill/is-core-module@1.0.39': {} + + '@npmcli/git@5.0.8': dependencies: - '@npmcli/promise-spawn': 7.0.1 - lru-cache: 10.2.0 - npm-pick-manifest: 9.0.0 - proc-log: 3.0.0 + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.6.0 which: 4.0.0 transitivePeerDependencies: - bluebird - dev: true - /@npmcli/map-workspaces@3.0.4: - resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/map-workspaces@3.0.4': dependencies: '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.10 - minimatch: 9.0.3 + glob: 10.5.0 + minimatch: 9.0.5 read-package-json-fast: 3.0.2 - dev: true - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@npmcli/name-from-folder@2.0.0': {} - /@npmcli/package-json@5.0.0: - resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/package-json@5.0.0': dependencies: - '@npmcli/git': 5.0.4 - glob: 10.3.10 - hosted-git-info: 7.0.1 - json-parse-even-better-errors: 3.0.1 - normalize-package-data: 6.0.0 + '@npmcli/git': 5.0.8 + glob: 10.5.0 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 proc-log: 3.0.0 semver: 7.6.0 transitivePeerDependencies: - bluebird - dev: true - /@npmcli/promise-spawn@7.0.1: - resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/promise-spawn@7.0.2': dependencies: which: 4.0.0 - dev: true - /@nx/nx-darwin-arm64@20.8.0: - resolution: {integrity: sha512-A6Te2KlINtcOo/depXJzPyjbk9E0cmgbom/sm/49XdQ8G94aDfyIIY1RIdwmDCK5NVd74KFG3JIByTk5+VnAhA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@nx/nx-darwin-arm64@20.8.0': optional: true - /@nx/nx-darwin-x64@20.8.0: - resolution: {integrity: sha512-UpqayUjgalArXaDvOoshqSelTrEp42cGDsZGy0sqpxwBpm3oPQ8wE1d7oBAmRo208rAxOuFP0LZRFUqRrwGvLA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@nx/nx-darwin-x64@20.8.0': optional: true - /@nx/nx-freebsd-x64@20.8.0: - resolution: {integrity: sha512-dUR2fsLyKZYMHByvjy2zvmdMbsdXAiP+6uTlIAuu8eHMZ2FPQCAtt7lPYLwOFUxUXChbek2AJ+uCI0gRAgK/eg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@nx/nx-freebsd-x64@20.8.0': optional: true - /@nx/nx-linux-arm-gnueabihf@20.8.0: - resolution: {integrity: sha512-GuZ7t0SzSX5ksLYva7koKZovQ5h/Kr1pFbOsQcBf3VLREBqFPSz6t7CVYpsIsMhiu/I3EKq6FZI3wDOJbee5uw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm-gnueabihf@20.8.0': optional: true - /@nx/nx-linux-arm64-gnu@20.8.0: - resolution: {integrity: sha512-CiI955Q+XZmBBZ7cQqQg0MhGEFwZIgSpJnjPfWBt3iOYP8aE6nZpNOkmD7O8XcN/nEwwyeCOF8euXqEStwsk8w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm64-gnu@20.8.0': optional: true - /@nx/nx-linux-arm64-musl@20.8.0: - resolution: {integrity: sha512-Iy9DpvVisxsfNh4gOinmMQ4cLWdBlgvt1wmry1UwvcXg479p1oJQ1Kp1wksUZoWYqrAG8VPZUmkE0f7gjyHTGg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm64-musl@20.8.0': optional: true - /@nx/nx-linux-x64-gnu@20.8.0: - resolution: {integrity: sha512-kZrrXXzVSbqwmdTmQ9xL4Jhi0/FSLrePSxYCL9oOM3Rsj0lmo/aC9kz4NBv1ZzuqT7fumpBOnhqiL1QyhOWOeQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-x64-gnu@20.8.0': optional: true - /@nx/nx-linux-x64-musl@20.8.0: - resolution: {integrity: sha512-0l9jEMN8NhULKYCFiDF7QVpMMNG40duya+OF8dH0OzFj52N0zTsvsgLY72TIhslCB/cC74oAzsmWEIiFslscnA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-x64-musl@20.8.0': optional: true - /@nx/nx-win32-arm64-msvc@20.8.0: - resolution: {integrity: sha512-5miZJmRSwx1jybBsiB3NGocXL9TxGdT2D+dOqR2fsLklpGz0ItEWm8+i8lhDjgOdAr2nFcuQUfQMY57f9FOHrA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@nx/nx-win32-arm64-msvc@20.8.0': optional: true - /@nx/nx-win32-x64-msvc@20.8.0: - resolution: {integrity: sha512-0P5r+bDuSNvoWys+6C1/KqGpYlqwSHpigCcyRzR62iZpT3OooZv+nWO06RlURkxMR8LNvYXTSSLvoLkjxqM8uQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@nx/nx-win32-x64-msvc@20.8.0': optional: true - /@one-ini/wasm@0.1.1: - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: true + '@one-ini/wasm@0.1.1': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@oxc-project/types@0.96.0': {} + + '@parcel/watcher-android-arm64@2.5.1': optional: true - /@pnpm/constants@7.1.1: - resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} - engines: {node: '>=16.14'} - dev: true + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true - /@pnpm/core-loggers@9.0.6(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-iK67SGbp+06bA/elpg51wygPFjNA7JKHtKkpLxqXXHw+AjFFBC3f2OznJsCIuDK6HdGi5UhHLYqo5QxJ2gMqJQ==} - engines: {node: '>=16.14'} - peerDependencies: - '@pnpm/logger': ^5.0.0 + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/constants@7.1.1': {} + + '@pnpm/core-loggers@9.0.6(@pnpm/logger@5.0.0)': dependencies: '@pnpm/logger': 5.0.0 '@pnpm/types': 9.4.2 - dev: true - /@pnpm/error@5.0.3: - resolution: {integrity: sha512-ONJU5cUeoeJSy50qOYsMZQHTA/9QKmGgh1ATfEpCLgtbdwqUiwD9MxHNeXUYYI/pocBCz6r1ZCFqiQvO+8SUKA==} - engines: {node: '>=16.14'} + '@pnpm/error@5.0.3': dependencies: '@pnpm/constants': 7.1.1 - dev: true - /@pnpm/fetching-types@5.0.0: - resolution: {integrity: sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q==} - engines: {node: '>=16.14'} + '@pnpm/fetching-types@5.0.0': dependencies: '@zkochan/retry': 0.2.0 node-fetch: 3.0.0-beta.9 transitivePeerDependencies: - domexception - dev: true - /@pnpm/graceful-fs@3.2.0: - resolution: {integrity: sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==} - engines: {node: '>=16.14'} + '@pnpm/graceful-fs@3.2.0': dependencies: graceful-fs: 4.2.11 - dev: true - /@pnpm/logger@5.0.0: - resolution: {integrity: sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw==} - engines: {node: '>=12.17'} + '@pnpm/logger@5.0.0': dependencies: - bole: 5.0.11 + bole: 5.0.25 ndjson: 2.0.0 - dev: true - /@pnpm/npm-package-arg@1.0.0: - resolution: {integrity: sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw==} - engines: {node: '>=14.6'} + '@pnpm/npm-package-arg@1.0.0': dependencies: hosted-git-info: 4.1.0 - semver: 7.7.1 + semver: 7.6.0 validate-npm-package-name: 4.0.0 - dev: true - /@pnpm/npm-resolver@18.1.1(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-NptzncmMD5ZMimbjWkGpMzuBRhlCY+sh7mzypPdBOTNlh5hmEQe/VaRKjNK4V9/b0C/llElkvIePL6acybu86w==} - engines: {node: '>=16.14'} - peerDependencies: - '@pnpm/logger': ^5.0.0 + '@pnpm/npm-resolver@18.1.1(@pnpm/logger@5.0.0)': dependencies: '@pnpm/core-loggers': 9.0.6(@pnpm/logger@5.0.0) '@pnpm/error': 5.0.3 @@ -3507,2348 +9025,1471 @@ packages: '@zkochan/retry': 0.2.0 encode-registry: 3.0.1 load-json-file: 6.2.0 - lru-cache: 10.2.0 + lru-cache: 10.4.3 normalize-path: 3.0.0 p-limit: 3.1.0 p-memoize: 4.0.1 parse-npm-tarball-url: 3.0.0 path-temp: 2.1.0 - ramda: /@pnpm/ramda@0.28.1 - rename-overwrite: 5.0.0 - semver: 7.7.1 + ramda: '@pnpm/ramda@0.28.1' + rename-overwrite: 5.0.4 + semver: 7.6.0 ssri: 10.0.5 version-selector-type: 3.0.0 transitivePeerDependencies: - domexception - dev: true - /@pnpm/ramda@0.28.1: - resolution: {integrity: sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==} - dev: true + '@pnpm/ramda@0.28.1': {} - /@pnpm/resolve-workspace-range@5.0.1: - resolution: {integrity: sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg==} - engines: {node: '>=16.14'} + '@pnpm/resolve-workspace-range@5.0.1': dependencies: - semver: 7.7.1 - dev: true + semver: 7.6.0 - /@pnpm/resolver-base@11.1.0: - resolution: {integrity: sha512-y2qKaj18pwe1VWc3YXEitdYFo+WqOOt60aqTUuOVkJAirUzz0DzuYh3Ifct4znYWPdgUXHaN5DMphNF5iL85rA==} - engines: {node: '>=16.14'} + '@pnpm/resolver-base@11.1.0': dependencies: '@pnpm/types': 9.4.2 - dev: true - /@pnpm/types@9.4.2: - resolution: {integrity: sha512-g1hcF8Nv4gd76POilz9gD4LITAPXOe5nX4ijgr8ixCbLQZfcpYiMfJ+C1RlMNRUDo8vhlNB4O3bUlxmT6EAQXA==} - engines: {node: '>=16.14'} - dev: true + '@pnpm/types@9.4.2': {} - /@pnpm/workspace.pkgs-graph@2.0.15(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-Txxd5FzzVfBfGCTngISaxFlJzZhzdS8BUrCEtAWJfZOFbQzpWy27rzkaS7TaWW2dHiFcCVYzPI/2vgxfeRansA==} - engines: {node: '>=16.14'} + '@pnpm/workspace.pkgs-graph@2.0.16(@pnpm/logger@5.0.0)': dependencies: '@pnpm/npm-package-arg': 1.0.0 '@pnpm/npm-resolver': 18.1.1(@pnpm/logger@5.0.0) '@pnpm/resolve-workspace-range': 5.0.1 - ramda: /@pnpm/ramda@0.28.1 + '@pnpm/types': 9.4.2 + ramda: '@pnpm/ramda@0.28.1' transitivePeerDependencies: - '@pnpm/logger' - domexception - dev: true - /@rollup/pluginutils@5.1.0(rollup@4.40.0): - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 4.40.0 - dev: true + '@rolldown/binding-android-arm64@1.0.0-beta.47': + optional: true - /@rollup/rollup-android-arm-eabi@4.13.1: - resolution: {integrity: sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': optional: true - /@rollup/rollup-android-arm-eabi@4.40.0: - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rolldown/binding-darwin-x64@1.0.0-beta.47': optional: true - /@rollup/rollup-android-arm64@4.13.1: - resolution: {integrity: sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': optional: true - /@rollup/rollup-android-arm64@4.40.0: - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': optional: true - /@rollup/rollup-darwin-arm64@4.13.1: - resolution: {integrity: sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': optional: true - /@rollup/rollup-darwin-arm64@4.40.0: - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': optional: true - /@rollup/rollup-darwin-x64@4.13.1: - resolution: {integrity: sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': optional: true - /@rollup/rollup-darwin-x64@4.40.0: - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': optional: true - /@rollup/rollup-freebsd-arm64@4.40.0: - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': optional: true - /@rollup/rollup-freebsd-x64@4.40.0: - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.1: - resolution: {integrity: sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.40.0: - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': optional: true - /@rollup/rollup-linux-arm-musleabihf@4.40.0: - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.1: - resolution: {integrity: sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.0-beta.47': {} + + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.55.1 + + '@rollup/rollup-android-arm-eabi@4.55.1': optional: true - /@rollup/rollup-linux-arm64-gnu@4.40.0: - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.55.1': optional: true - /@rollup/rollup-linux-arm64-musl@4.13.1: - resolution: {integrity: sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.55.1': optional: true - /@rollup/rollup-linux-arm64-musl@4.40.0: - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.55.1': optional: true - /@rollup/rollup-linux-loongarch64-gnu@4.40.0: - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.40.0: - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.1: - resolution: {integrity: sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.40.0: - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - /@rollup/rollup-linux-riscv64-musl@4.40.0: - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - /@rollup/rollup-linux-s390x-gnu@4.13.1: - resolution: {integrity: sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - /@rollup/rollup-linux-s390x-gnu@4.40.0: - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - /@rollup/rollup-linux-x64-gnu@4.13.1: - resolution: {integrity: sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - /@rollup/rollup-linux-x64-gnu@4.40.0: - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - /@rollup/rollup-linux-x64-musl@4.13.1: - resolution: {integrity: sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - /@rollup/rollup-linux-x64-musl@4.40.0: - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.1: - resolution: {integrity: sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - /@rollup/rollup-win32-arm64-msvc@4.40.0: - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.1: - resolution: {integrity: sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - /@rollup/rollup-win32-ia32-msvc@4.40.0: - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - /@rollup/rollup-win32-x64-msvc@4.13.1: - resolution: {integrity: sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - /@rollup/rollup-win32-x64-msvc@4.40.0: - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true - /@rushstack/node-core-library@5.7.0(@types/node@18.19.3): - resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@rtsao/scc@1.1.0': {} + + '@rushstack/node-core-library@5.7.0(@types/node@18.19.130)': dependencies: - '@types/node': 18.19.3 ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.11 semver: 7.5.4 - dev: true + optionalDependencies: + '@types/node': 18.19.130 - /@rushstack/rig-package@0.5.3: - resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + '@rushstack/rig-package@0.5.3': dependencies: - resolve: 1.22.8 + resolve: 1.22.11 strip-json-comments: 3.1.1 - dev: true - /@rushstack/terminal@0.14.0(@types/node@18.19.3): - resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@rushstack/terminal@0.14.0(@types/node@18.19.130)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@18.19.3) - '@types/node': 18.19.3 + '@rushstack/node-core-library': 5.7.0(@types/node@18.19.130) supports-color: 8.1.1 - dev: true + optionalDependencies: + '@types/node': 18.19.130 - /@rushstack/ts-command-line@4.22.6(@types/node@18.19.3): - resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} + '@rushstack/ts-command-line@4.22.6(@types/node@18.19.130)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@18.19.3) + '@rushstack/terminal': 0.14.0(@types/node@18.19.130) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - dev: true - /@shikijs/engine-oniguruma@1.29.2: - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - dev: true - /@shikijs/types@1.29.2: - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - dev: true - /@shikijs/vscode-textmate@10.0.2: - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - dev: true + '@shikijs/vscode-textmate@10.0.2': {} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@snyk/github-codeowners@1.1.0: - resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} - engines: {node: '>=8.10'} - hasBin: true + '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 - ignore: 5.3.1 + ignore: 5.3.2 p-map: 4.0.0 - dev: true - /@solidjs/router@0.13.1(solid-js@1.7.8): - resolution: {integrity: sha512-Rz5Lf0ssWMuN+Wm2GFO0vwZoO/KSwYFSuCUzWrRAvje5M0ZYZrMk5FZxuzdJT+zg8KuqWJQlRALks5E0r+FjAA==} - peerDependencies: - solid-js: ^1.8.6 + '@solidjs/testing-library@0.8.10(solid-js@1.9.10)': dependencies: - solid-js: 1.7.8 - dev: true + '@testing-library/dom': 10.4.1 + solid-js: 1.9.10 - /@solidjs/testing-library@0.8.6(@solidjs/router@0.13.1)(solid-js@1.7.8): - resolution: {integrity: sha512-MnDGfUw38SjE+lmCDZ44HeZq5WbDU7s/BTa7uvqv55GKatddoWiJmHanUAbuEtmwMdEv+fFQQzftkqrFXEn1BQ==} - engines: {node: '>= 14'} - peerDependencies: - '@solidjs/router': '>=0.9.0' - solid-js: '>=1.0.0' + '@stylistic/eslint-plugin-js@4.4.1(eslint@8.57.1)': dependencies: - '@solidjs/router': 0.13.1(solid-js@1.7.8) - '@testing-library/dom': 9.3.4 - solid-js: 1.7.8 - dev: true + eslint: 8.57.1 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 - /@stylistic/eslint-plugin-js@4.2.0(eslint@8.56.0): - resolution: {integrity: sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=9.0.0' + '@stylistic/eslint-plugin@4.4.1(eslint@8.57.1)(typescript@5.9.3)': dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - dev: true + '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + transitivePeerDependencies: + - supports-color + - typescript - /@tanstack/config@0.18.0(@types/node@18.19.3)(eslint@8.56.0)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3): - resolution: {integrity: sha512-yHn8bj7ztyH5V3ilbm9J+G630qk5EIc5dRljM3lGqwrrpgbVIgN5vH0RhEr86ATW98T20VhYc5B3yLf/bE45bw==} - engines: {node: '>=18'} + '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': dependencies: - '@tanstack/eslint-config': 0.1.0(eslint@8.56.0)(typescript@5.8.3) - '@tanstack/publish-config': 0.1.0 - '@tanstack/typedoc-config': 0.2.0(typescript@5.8.3) - '@tanstack/vite-config': 0.2.0(@types/node@18.19.3)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3) + '@tanstack/eslint-config': 0.2.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) + '@tanstack/publish-config': 0.1.1 + '@tanstack/typedoc-config': 0.2.0(typescript@5.9.3) + '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' + - '@typescript-eslint/utils' - eslint + - eslint-import-resolver-node - rollup - supports-color - typescript - vite - dev: true - /@tanstack/eslint-config@0.1.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} - engines: {node: '>=18'} + '@tanstack/eslint-config@0.1.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@eslint/js': 9.25.1 - '@stylistic/eslint-plugin-js': 4.2.0(eslint@8.56.0) - eslint-plugin-import-x: 4.11.0(eslint@8.56.0)(typescript@5.8.3) - eslint-plugin-n: 17.17.0(eslint@8.56.0) - globals: 16.0.0 - typescript-eslint: 8.31.0(eslint@8.56.0)(typescript@5.8.3) - vue-eslint-parser: 9.4.3(eslint@8.56.0) + '@eslint/js': 9.39.2 + '@stylistic/eslint-plugin-js': 4.4.1(eslint@8.57.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-plugin-n: 17.23.1(eslint@8.57.1)(typescript@5.9.3) + globals: 16.5.0 + typescript-eslint: 8.52.0(eslint@8.57.1)(typescript@5.9.3) + vue-eslint-parser: 9.4.3(eslint@8.57.1) transitivePeerDependencies: + - '@typescript-eslint/utils' - eslint + - eslint-import-resolver-node - supports-color - typescript - dev: true - /@tanstack/publish-config@0.1.0: - resolution: {integrity: sha512-nI4F7/SpT6BMoigq1VmrrNe3A6Hsua9XcZNql+qzK2zJUOcKBRqMvC22n3eKcjsbZuWIFvkIC0ThsuBVYCKXfA==} - engines: {node: '>=18'} + '@tanstack/eslint-config@0.2.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint/js': 9.39.2 + '@stylistic/eslint-plugin': 4.4.1(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-plugin-n: 17.23.1(eslint@8.57.1)(typescript@5.9.3) + globals: 16.5.0 + typescript-eslint: 8.52.0(eslint@8.57.1)(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@8.57.1) + transitivePeerDependencies: + - '@typescript-eslint/utils' + - eslint + - eslint-import-resolver-node + - supports-color + - typescript + + '@tanstack/publish-config@0.1.1': dependencies: - '@commitlint/parse': 19.8.0 - jsonfile: 6.1.0 - semver: 7.7.1 - simple-git: 3.27.0 + '@commitlint/parse': 19.8.1 + jsonfile: 6.2.0 + semver: 7.7.3 + simple-git: 3.30.0 transitivePeerDependencies: - supports-color - dev: true - /@tanstack/typedoc-config@0.2.0(typescript@5.8.3): - resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} - engines: {node: '>=18'} + '@tanstack/react-store@0.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/store': 0.4.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + + '@tanstack/store@0.4.1': {} + + '@tanstack/typedoc-config@0.2.0(typescript@5.9.3)': dependencies: - typedoc: 0.27.9(typescript@5.8.3) - typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2) - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9) + typedoc: 0.27.9(typescript@5.9.3) + typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) transitivePeerDependencies: - typescript - dev: true - /@tanstack/vite-config@0.2.0(@types/node@18.19.3)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3): - resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} - engines: {node: '>=18'} + '@tanstack/typedoc-config@0.2.1(typescript@5.9.3)': + dependencies: + typedoc: 0.27.9(typescript@5.9.3) + typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@tanstack/vite-config@0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.40.0) - vite-plugin-dts: 4.2.3(@types/node@18.19.3)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.3) - vite-tsconfig-paths: 5.1.4(typescript@5.8.3)(vite@6.3.3) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.55.1) + vite-plugin-dts: 4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - rollup - supports-color - typescript - vite - dev: true - /@tanstack/react-store@0.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cyriofh2I6dPOPJf2W0K+ON5q08ezevLTUhC1txiUnrJ9XFFFPr0X8CmGnXzucI2c0t0V6wYZc0GCz4zOAeptg==} - peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@testing-library/dom@10.4.1': dependencies: - '@tanstack/store': 0.4.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - - /@tanstack/store@0.4.1: - resolution: {integrity: sha512-NvW3MomYSTzQK61AWdtWNIhWgszXFZDRgCNlvSDw/DBaoLqJIlZ0/gKLsditA8un/BGU1NR06+j0a/UNLgXA+Q==} - dev: false + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.1 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/jest-dom@6.4.2(vitest@1.6.1): - resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true + '@testing-library/jest-dom@6.9.1': dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.1 - aria-query: 5.3.0 - chalk: 3.0.0 + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + picocolors: 1.1.1 redent: 3.0.0 - vitest: 1.6.1(@types/node@18.19.3)(jsdom@24.0.0) - dev: true - /@testing-library/react@14.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@14.3.1(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.28.4 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.0.5 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: - '@testing-library/dom': 9.3.4 - dev: true + '@testing-library/dom': 10.4.1 - /@testing-library/vue@8.0.2(vue@3.3.4): - resolution: {integrity: sha512-A8wWX+qQn0o0izpQWnGCpwQt8wAdpsVP8vPP2h5Q/jcGhZ5yKXz9PPUqhQv+45LTFaWlyRf8bArTVaB/KFFd5A==} - engines: {node: '>=14'} - peerDependencies: - '@vue/compiler-sfc': '>= 3' - vue: '>= 3' - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.26)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.28.4 '@testing-library/dom': 9.3.4 - '@vue/test-utils': 2.4.5 - vue: 3.3.4 - dev: true + '@vue/test-utils': 2.4.6 + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + '@vue/compiler-sfc': 3.5.26 - /@ts-morph/common@0.22.0: - resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} + '@ts-morph/common@0.22.0': dependencies: - fast-glob: 3.3.2 - minimatch: 9.0.3 + fast-glob: 3.3.3 + minimatch: 9.0.5 mkdirp: 3.0.1 path-browserify: 1.0.1 - dev: true - /@tybys/wasm-util@0.9.0: - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - requiresBuild: true + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 - dev: true + optional: true - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + '@types/argparse@1.0.38': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 - dev: true + '@types/babel__traverse': 7.28.0 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.24.0 - dev: true + '@babel/types': 7.28.5 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - dev: true + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.24.0 - dev: true + '@babel/types': 7.28.5 - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.26 - dev: true - - /@types/bonjour@3.5.13: - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - dependencies: - '@types/node': 18.19.26 - dev: true + '@types/node': 18.19.130 - /@types/connect-history-api-fallback@1.5.4: - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@types/bonjour@3.5.13': dependencies: - '@types/express-serve-static-core': 4.17.43 - '@types/node': 18.19.26 - dev: true + '@types/node': 18.19.130 - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/node': 18.19.26 - dev: true + '@types/express-serve-static-core': 4.19.8 + '@types/node': 18.19.130 - /@types/conventional-commits-parser@5.0.1: - resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.26 - dev: true + '@types/node': 18.19.130 - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/conventional-commits-parser@5.0.2': dependencies: - '@types/eslint': 8.56.6 - '@types/estree': 1.0.7 - dev: true + '@types/node': 18.19.130 - /@types/eslint@8.56.2: - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/eslint-scope@3.7.7': dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true + '@types/eslint': 8.56.12 + '@types/estree': 1.0.8 - /@types/eslint@8.56.6: - resolution: {integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==} + '@types/eslint@8.56.12': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/estree@1.0.7: - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - dev: true + '@types/estree@1.0.8': {} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 18.19.26 - '@types/qs': 6.9.14 + '@types/node': 18.19.130 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - dev: true + '@types/send': 1.2.1 - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.25': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.14 - '@types/serve-static': 1.15.5 - dev: true + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.8 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 - dev: true - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.5': {} - /@types/http-proxy@1.17.14: - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + '@types/http-proxy@1.17.17': dependencies: - '@types/node': 18.19.26 - dev: true - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/node': 18.19.130 - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true + '@types/json5@0.0.29': {} - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - dependencies: - '@types/node': 18.19.26 - dev: true + '@types/mime@1.3.5': {} - /@types/node@18.19.26: - resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} + '@types/node-forge@1.3.14': dependencies: - undici-types: 5.26.5 - dev: true + '@types/node': 18.19.130 - /@types/node@18.19.3: - resolution: {integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==} + '@types/node@18.19.130': dependencies: undici-types: 5.26.5 - dev: true - /@types/picomatch@2.3.3: - resolution: {integrity: sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==} - dev: true + '@types/picomatch@2.3.3': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: true + '@types/prop-types@15.7.15': {} - /@types/qs@6.9.14: - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} - dev: true + '@types/qs@6.14.0': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/react-dom@18.0.5: - resolution: {integrity: sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==} + '@types/react-dom@18.3.7(@types/react@18.3.27)': dependencies: - '@types/react': 18.2.45 - dev: true + '@types/react': 18.3.27 - /@types/react@18.2.45: - resolution: {integrity: sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==} + '@types/react@18.3.27': dependencies: - '@types/prop-types': 15.7.12 - '@types/scheduler': 0.23.0 - csstype: 3.1.3 - dev: true + '@types/prop-types': 15.7.15 + csstype: 3.2.3 - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true + '@types/retry@0.12.2': {} - /@types/scheduler@0.23.0: - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - dev: true + '@types/semver@7.7.1': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.26 - dev: true + '@types/node': 18.19.130 - /@types/serve-index@1.9.4: - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + '@types/send@1.2.1': dependencies: - '@types/express': 4.17.21 - dev: true + '@types/node': 18.19.130 - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-index@1.9.4': dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 18.19.26 - dev: true + '@types/express': 4.17.25 - /@types/sockjs@0.3.36: - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/serve-static@1.15.10': dependencies: - '@types/node': 18.19.26 - dev: true + '@types/http-errors': 2.0.5 + '@types/node': 18.19.130 + '@types/send': 0.17.6 - /@types/unist@3.0.3: - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - dev: true + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 18.19.130 - /@types/use-sync-external-store@0.0.3: - resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} - dev: true + '@types/unist@3.0.3': {} - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/use-sync-external-store@0.0.3': {} + + '@types/ws@8.18.1': dependencies: - '@types/node': 18.19.26 - dev: true + '@types/node': 18.19.130 - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - eslint: 8.56.0 + debug: 4.4.3 + eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0)(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.31.0 - '@typescript-eslint/type-utils': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.31.0 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.2 + '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 + eslint: 8.57.1 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.8.3 + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@8.31.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - dependencies: - '@typescript-eslint/scope-manager': 8.31.0 - '@typescript-eslint/types': 8.31.0 - '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.31.0 - debug: 4.4.0 - eslint: 8.56.0 - typescript: 5.8.3 + '@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 + debug: 4.4.3 + eslint: 8.57.1 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - /@typescript-eslint/scope-manager@8.31.0: - resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.52.0': dependencies: - '@typescript-eslint/types': 8.31.0 - '@typescript-eslint/visitor-keys': 8.31.0 - dev: true + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.8.3) - debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.3.0(typescript@5.8.3) - typescript: 5.8.3 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/type-utils@8.31.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - dependencies: - '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - debug: 4.4.0 - eslint: 8.56.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@typescript-eslint/type-utils@8.52.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/types@8.31.0: - resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@typescript-eslint/types@8.52.0': {} - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3): - resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.31.0 - '@typescript-eslint/visitor-keys': 8.31.0 - debug: 4.4.0 - fast-glob: 3.3.2 - is-glob: 4.0.3 + '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 + debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 + '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 8.56.0 - semver: 7.6.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + eslint: 8.57.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/utils@8.31.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.56.0) - '@typescript-eslint/scope-manager': 8.31.0 - '@typescript-eslint/types': 8.31.0 - '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) - eslint: 8.56.0 - typescript: 5.8.3 + '@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@8.31.0: - resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.52.0': dependencies: - '@typescript-eslint/types': 8.31.0 - eslint-visitor-keys: 4.2.0 - dev: true + '@typescript-eslint/types': 8.52.0 + eslint-visitor-keys: 4.2.1 - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.3.0': {} - /@unrs/resolver-binding-darwin-arm64@1.7.0: - resolution: {integrity: sha512-vIWAU56r2lZAmUsljp6m9+hrTlwNkZH6pqnSPff2WxzofV+jWRSHLmZRUS+g+VE+LlyPByifmGGHpJmhWetatg==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - /@unrs/resolver-binding-darwin-x64@1.7.0: - resolution: {integrity: sha512-+bShFLgtdwuNteQbKq3X230754AouNMXSLDZ56EssgDyckDt6Ld7wRaJjZF0pY671HnY2pk9/amO4amAFzfN1A==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - /@unrs/resolver-binding-freebsd-x64@1.7.0: - resolution: {integrity: sha512-HJjXb3aIptDZQ0saSmk2S4W1pWNVZ2iNpAbNGZOfsUXbi8xwCmHdVjErNS92hRp7djuDLup1OLrzOMtTdw5BmA==} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - /@unrs/resolver-binding-linux-arm-gnueabihf@1.7.0: - resolution: {integrity: sha512-NF3lk7KHulLD97UE+MHjH0mrOjeZG8Hz10h48YcFz2V0rlxBdRSRcMbGer8iH/1mIlLqxtvXJfGLUr4SMj0XZg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - /@unrs/resolver-binding-linux-arm-musleabihf@1.7.0: - resolution: {integrity: sha512-Gn1c/t24irDgU8yYj4vVG6qHplwUM42ti9/zYWgfmFjoXCH6L4Ab9hh6HuO7bfDSvGDRGWQt1IVaBpgbKHdh3Q==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true - /@unrs/resolver-binding-linux-arm64-gnu@1.7.0: - resolution: {integrity: sha512-XRrVXRIUP++qyqAqgiXUpOv0GP3cHx7aA7NrzVFf6Cc8FoYuwtnmT+vctfSo4wRZN71MNU4xq2BEFxI4qvSerg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true - /@unrs/resolver-binding-linux-arm64-musl@1.7.0: - resolution: {integrity: sha512-Sligg+vTDAYTXkUtgviPjGEFIh57pkvlfdyRw21i9gkjp/eCNOAi2o5e7qLGTkoYdJHZJs5wVMViPEmAbw2/Tg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true - /@unrs/resolver-binding-linux-ppc64-gnu@1.7.0: - resolution: {integrity: sha512-Apek8/x+7Rg33zUJlQV44Bvq8/t1brfulk0veNJrk9wprF89bCYFMUHF7zQYcpf2u+m1+qs3mYQrBd43fGXhMA==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true - /@unrs/resolver-binding-linux-riscv64-gnu@1.7.0: - resolution: {integrity: sha512-kBale8CFX5clfV9VmI9EwKw2ZACMEx1ecjV92F9SeWTUoxl9d+LGzS6zMSX3kGYqcfJB3NXMwLCTwIDBLG1y4g==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true - /@unrs/resolver-binding-linux-riscv64-musl@1.7.0: - resolution: {integrity: sha512-s/Q33xQjeFHSCvGl1sZztFZF6xhv7coMvFz6wa/x/ZlEArjiQoMMwGa/Aieq1Kp/6+S13iU3/IJF0ga6/451ow==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true - /@unrs/resolver-binding-linux-s390x-gnu@1.7.0: - resolution: {integrity: sha512-7PuNXAo97ydaxVNrIYJzPipvINJafDpB8pt5CoZHfu8BmqcU6d7kl6/SABTnqNffNkd6Cfhuo70jvGB2P7oJ/Q==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true - /@unrs/resolver-binding-linux-x64-gnu@1.7.0: - resolution: {integrity: sha512-fNosEzDMYItA4It+R0tioHwKlEfx/3TkkJdP2x9B5o9R946NDC4ZZj5ZjA+Y4NQD2V/imB3QPAKmeh3vHQGQyA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true - /@unrs/resolver-binding-linux-x64-musl@1.7.0: - resolution: {integrity: sha512-gHIw42dmnVcw7osjNPRybaXhONhggWkkzqiOZzXco1q3OKkn4KsbDylATeemnq3TP+L1BrzSqzl0H9UTJ6ji+w==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true - /@unrs/resolver-binding-wasm32-wasi@1.7.0: - resolution: {integrity: sha512-yq7POusv63/yTkNTaNsnXU/SAcBzckHyk1oYrDXqjS1m/goaWAaU9J9HrsovgTHkljxTcDd6PMAsJ5WZVBuGEQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - requiresBuild: true + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.9 - dev: true + '@napi-rs/wasm-runtime': 0.2.12 optional: true - /@unrs/resolver-binding-win32-arm64-msvc@1.7.0: - resolution: {integrity: sha512-/IPZPbdri9jglHonwB3F7EpQZvBK3ObH+g4ma/KDrqTEAECwvgE10Unvo0ox3LQFR/iMMAkVY+sGNMrMiIV/QQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true - /@unrs/resolver-binding-win32-ia32-msvc@1.7.0: - resolution: {integrity: sha512-NGVKbHEdrLuJdpcuGqV5zXO3v8t4CWOs0qeCGjO47RiwwufOi/yYcrtxtCzZAaMPBrffHL7c6tJ1Hxr17cPUGg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true - /@unrs/resolver-binding-win32-x64-msvc@1.7.0: - resolution: {integrity: sha512-Jf14pKofg58DIwcZv4Wt9AyVVe7bSJP8ODz+EP9nG/rho08FQzan0VOJk1g6/BNE1RkoYd+lRTWK+/BgH12qoQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - /@vitejs/plugin-basic-ssl@1.1.0(vite@5.1.5): - resolution: {integrity: sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==} - engines: {node: '>=14.6.0'} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: - vite: 5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) - dev: true + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - /@vitejs/plugin-react@4.4.1(vite@6.3.3): - resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.3(@types/node@18.19.3) + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - dev: true - /@vitejs/plugin-vue@5.0.2(vite@5.2.6)(vue@3.3.4): - resolution: {integrity: sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 - vue: ^3.2.25 + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 5.2.6(@types/node@18.19.3) - vue: 3.3.4 - dev: true + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) - /@vitest/coverage-istanbul@1.3.1(vitest@1.6.1): - resolution: {integrity: sha512-aBVgQ2eY9gzrxBJjGKbWgatTU2w1CacEx0n8OMctPzl9836KqoM5X/WigJpjM7wZEtX2N0ZTE5KDGPmVM+o2Wg==} - peerDependencies: - vitest: 1.3.1 + '@vitest/coverage-istanbul@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))': dependencies: - debug: 4.3.4 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - magicast: 0.3.3 - picocolors: 1.0.0 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magicast: 0.3.5 + picocolors: 1.1.1 test-exclude: 6.0.0 - vitest: 1.6.1(@types/node@18.19.3)(jsdom@24.0.0) + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) transitivePeerDependencies: - supports-color - dev: true - /@vitest/expect@1.6.1: - resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + '@vitest/expect@1.6.1': dependencies: '@vitest/spy': 1.6.1 '@vitest/utils': 1.6.1 chai: 4.5.0 - dev: true - /@vitest/runner@1.6.1: - resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + '@vitest/runner@1.6.1': dependencies: '@vitest/utils': 1.6.1 p-limit: 5.0.0 pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.6.1: - resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + '@vitest/snapshot@1.6.1': dependencies: - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.6.1: - resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + '@vitest/spy@1.6.1': dependencies: tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.6.1: - resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + '@vitest/utils@1.6.1': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - dev: true - /@volar/language-core@2.4.13: - resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} + '@volar/language-core@2.4.27': dependencies: - '@volar/source-map': 2.4.13 - dev: true + '@volar/source-map': 2.4.27 - /@volar/source-map@2.4.13: - resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} - dev: true + '@volar/source-map@2.4.27': {} - /@volar/typescript@2.4.13: - resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} + '@volar/typescript@2.4.27': dependencies: - '@volar/language-core': 2.4.13 + '@volar/language-core': 2.4.27 path-browserify: 1.0.1 vscode-uri: 3.1.0 - dev: true - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + '@vue/compiler-core@3.5.26': dependencies: - '@babel/parser': 7.24.1 - '@vue/shared': 3.3.4 + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 - - /@vue/compiler-core@3.4.21: - resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} - dependencies: - '@babel/parser': 7.27.0 - '@vue/shared': 3.4.21 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - dev: true - - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} - dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + source-map-js: 1.2.1 - /@vue/compiler-dom@3.4.21: - resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + '@vue/compiler-dom@3.5.26': dependencies: - '@vue/compiler-core': 3.4.21 - '@vue/shared': 3.4.21 - dev: true + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 - /@vue/compiler-sfc@2.7.0: - resolution: {integrity: sha512-hPOI15RsXO1G8aK6FNF93ld9C/D4e/uAJBE59K8NnL8giuKqeVksvamgu4jKhCJ9f9bbUpj5BuSV3sufIx2hmw==} + '@vue/compiler-sfc@2.7.16': dependencies: - '@babel/parser': 7.24.1 - postcss: 8.4.38 + '@babel/parser': 7.28.5 + postcss: 8.5.6 source-map: 0.6.1 - dev: true + optionalDependencies: + prettier: 2.8.8 - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + '@vue/compiler-sfc@3.5.26': dependencies: - '@babel/parser': 7.24.1 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.26 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 estree-walker: 2.0.2 - magic-string: 0.30.8 - postcss: 8.4.38 - source-map-js: 1.2.0 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + '@vue/compiler-ssr@3.5.26': dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 - /@vue/compiler-vue2@2.7.16: - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - dev: true - /@vue/composition-api@1.7.2(vue@3.3.4): - resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} - peerDependencies: - vue: '>= 2.5 < 2.7' + '@vue/composition-api@1.7.2(vue@3.5.26(typescript@5.9.3))': dependencies: - vue: 3.3.4 + vue: 3.5.26(typescript@5.9.3) - /@vue/language-core@2.1.6(typescript@5.8.3): - resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.4.13 - '@vue/compiler-dom': 3.4.21 + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.4.21 + '@vue/shared': 3.5.26 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 - typescript: 5.8.3 - dev: true - - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} - dependencies: - '@babel/parser': 7.24.1 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.8 + optionalDependencies: + typescript: 5.9.3 - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + '@vue/reactivity@3.5.26': dependencies: - '@vue/shared': 3.3.4 + '@vue/shared': 3.5.26 - /@vue/runtime-core@3.3.4: - resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + '@vue/runtime-core@3.5.26': dependencies: - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/reactivity': 3.5.26 + '@vue/shared': 3.5.26 - /@vue/runtime-dom@3.3.4: - resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + '@vue/runtime-dom@3.5.26': dependencies: - '@vue/runtime-core': 3.3.4 - '@vue/shared': 3.3.4 - csstype: 3.1.3 + '@vue/reactivity': 3.5.26 + '@vue/runtime-core': 3.5.26 + '@vue/shared': 3.5.26 + csstype: 3.2.3 - /@vue/server-renderer@3.3.4(vue@3.3.4): - resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} - peerDependencies: - vue: 3.3.4 + '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@5.9.3))': dependencies: - '@vue/compiler-ssr': 3.3.4 - '@vue/shared': 3.3.4 - vue: 3.3.4 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26(typescript@5.9.3) - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + '@vue/shared@3.5.26': {} - /@vue/shared@3.4.21: - resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - dev: true - - /@vue/test-utils@2.4.5: - resolution: {integrity: sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg==} + '@vue/test-utils@2.4.6': dependencies: - js-beautify: 1.15.1 - vue-component-type-helpers: 2.0.7 - dev: true + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.12 - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.14.1': dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.13.2': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - dev: true + '@webassemblyjs/helper-buffer@1.14.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.13.2': dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 - dev: true + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 - dev: true - - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - dev: true - - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - dependencies: - '@webassemblyjs/ast': 1.12.1 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - dev: true - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true + '@yarnpkg/lockfile@1.1.0': {} - /@yarnpkg/parsers@3.0.2: - resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} - engines: {node: '>=18.12.0'} + '@yarnpkg/parsers@3.0.2': dependencies: - js-yaml: 3.14.1 + js-yaml: 3.14.2 tslib: 2.8.1 - dev: true - /@zkochan/js-yaml@0.0.7: - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} - hasBin: true + '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 - dev: true - /@zkochan/retry@0.2.0: - resolution: {integrity: sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw==} - engines: {node: '>=10'} - dev: true + '@zkochan/retry@0.2.0': {} - /@zkochan/rimraf@2.1.3: - resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==} - engines: {node: '>=12.10'} + '@zkochan/rimraf@2.1.3': dependencies: rimraf: 3.0.2 - dev: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + abbrev@2.0.0: {} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.14.1): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - deprecated: package has been renamed to acorn-import-attributes - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.14.1 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-import-phases@1.0.4(acorn@8.15.0): dependencies: - acorn: 8.11.3 - dev: true + acorn: 8.15.0 - /acorn-jsx@5.3.2(acorn@8.14.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 - dev: true + acorn: 8.15.0 - /acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 - dev: true + acorn: 8.15.0 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.15.0: {} - /adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 - regex-parser: 2.3.0 - dev: true + regex-parser: 2.3.1 - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - dev: true + agent-base@7.1.4: {} - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ajv-draft-04@1.0.0(ajv@8.13.0): - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: ajv: 8.13.0 - dev: true - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - /ajv-formats@2.1.1(ajv@8.13.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.13.0 - dev: true + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 - /ajv-formats@3.0.1(ajv@8.13.0): - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: ajv: 8.13.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 - /ajv-keywords@5.1.0(ajv@8.13.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: - ajv: 8.13.0 + ajv: 8.17.1 fast-deep-equal: 3.1.3 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.13.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ajv@8.17.1: dependencies: - type-fest: 0.21.3 - dev: true + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: true + ansi-colors@4.1.3: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-escapes@7.2.0: + dependencies: + environment: 1.1.0 - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-html-community@0.0.8: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true + ansi-regex@5.0.1: {} - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.3: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /arity-n@1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - dev: true + aria-query@5.3.2: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + arity-n@1.0.4: {} + + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: true + call-bound: 1.0.4 + is-array-buffer: 3.0.5 - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true + array-flatten@1.1.1: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-ify@1.0.0: {} - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - dev: true + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 - /array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} + array-last@1.3.0: dependencies: is-number: 4.0.0 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - dev: true + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-shim-unscopables: 1.0.2 - dev: true + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-shim-unscopables: 1.0.2 - dev: true + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 + 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.1 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - dev: true + es-shim-unscopables: 1.1.0 - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: true + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + async-function@1.0.0: {} - /autoprefixer@10.4.18(postcss@8.4.35): - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + asynckit@0.4.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001715 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001763 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.35 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 - dev: true + possible-typed-array-names: 1.1.0 - /axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.13.2: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - - /babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.90.3): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - dependencies: - '@babel/core': 7.24.0 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.1) - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-loader@10.0.0(@babel/core@7.28.4)(webpack@5.104.0(esbuild@0.26.0)): dependencies: - '@babel/helper-plugin-utils': 7.26.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/core': 7.28.4 + find-up: 5.0.0 + webpack: 5.104.0(esbuild@0.26.0) - /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.3): - resolution: {integrity: sha512-nef2eLpWBgFggwrYwN6O3dNKn3RnlX6n4DIamNEAeHwp03kVQUaKUiLaEPnHPJHwxie1KwPelyIY9QikU03vUA==} - peerDependencies: - '@babel/core': ^7.20.12 + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5): dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/types': 7.24.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 html-entities: 2.3.3 - validate-html-nesting: 1.2.2 - dev: true + parse5: 7.3.0 - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.0): - resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4): dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.0) + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.24.0): - resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) - core-js-compat: 3.36.1 + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.47.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.24.0): - resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4): dependencies: - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - dev: true - /babel-preset-solid@1.8.16(@babel/core@7.24.3): - resolution: {integrity: sha512-b4HFg/xaKM+H3Tu5iUlZ/43TJOZnhi85xrm3JrXDQ0s4cmtmU37bXXYzb2m55G4QKiFjxLAjvb7sUorPrAMs5w==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10): dependencies: - '@babel/core': 7.24.3 - babel-plugin-jsx-dom-expressions: 0.37.19(@babel/core@7.24.3) - dev: true + '@babel/core': 7.28.5 + babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.5) + optionalDependencies: + solid-js: 1.9.10 - /babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - dev: true + babylon@6.18.0: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true + baseline-browser-mapping@2.9.14: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true + batch@0.6.1: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true + beasties@0.3.5: + dependencies: + css-select: 6.0.0 + css-what: 7.0.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 10.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-media-query-parser: 0.2.3 - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.4: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 + qs: 6.14.1 + raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /bole@5.0.11: - resolution: {integrity: sha512-KB0Ye0iMAW5BnNbnLfMSQcnI186hKUzE2fpkZWqcxsoTR7eqzlTidSOMYPHJOn/yR7VGH7uSZp37qH9q2Et0zQ==} + bole@5.0.25: dependencies: fast-safe-stringify: 2.1.1 individual: 3.0.0 - dev: true - /bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + bonjour-service@1.3.0: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - dev: true - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + braces@3.0.3: dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.719 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true + fill-range: 7.1.1 - /browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001715 - electron-to-chromium: 1.5.142 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) - dev: true + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001763 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.1.0: dependencies: - semver: 7.7.1 - dev: true + semver: 7.6.0 - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + 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 - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - /caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} - dev: true + callsites@3.1.0: {} - /caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} - dev: true + caniuse-lite@1.0.30001763: {} - /chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -5857,54 +10498,22 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.1.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chalk@5.6.2: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -5912,1318 +10521,837 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + chrome-trace-event@1.0.4: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.6.1: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-spinners@3.3.0: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cli-truncate@5.1.1: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.0 + + cli-width@4.1.0: {} + + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - requiresBuild: true - dev: true - /code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - dev: true + clone@1.0.4: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true + code-block-writer@12.0.0: {} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: true - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@10.0.1: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@2.20.3: {} - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true + commander@4.1.1: {} - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true + comment-parser@1.4.1: {} - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - dev: true + compare-versions@6.1.1: {} - /compose-function@3.0.3: - resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} + compose-function@3.0.3: dependencies: arity-n: 1.0.4 - dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: - mime-db: 1.52.0 - dev: true + mime-db: 1.54.0 - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.8.1: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true + computeds@0.0.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + confbox@0.1.8: {} + + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: true - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: true + connect-history-api-fallback@2.0.0: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.5: {} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true + cookie-signature@1.0.7: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.7.2: {} - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@2.0.6: dependencies: is-what: 3.14.1 - dev: true - /copy-webpack-plugin@11.0.0(webpack@5.90.3): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 + copy-webpack-plugin@13.0.1(webpack@5.104.0(esbuild@0.26.0)): dependencies: - fast-glob: 3.3.2 glob-parent: 6.0.2 - globby: 13.2.2 normalize-path: 3.0.0 - schema-utils: 4.2.0 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + tinyglobby: 0.2.15 + webpack: 5.104.0(esbuild@0.26.0) - /core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js-compat@3.47.0: dependencies: - browserslist: 4.24.4 - dev: true + browserslist: 4.28.1 - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cosmiconfig@9.0.0(typescript@5.3.3): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 + import-fresh: 3.3.1 + js-yaml: 4.1.1 parse-json: 5.2.0 - typescript: 5.3.3 - dev: true - - /critters@0.0.22: - resolution: {integrity: sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==} - dependencies: - chalk: 4.1.2 - css-select: 5.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - htmlparser2: 8.0.2 -<<<<<<< HEAD - postcss: 8.4.38 -======= - postcss: 8.5.3 ->>>>>>> v0-1-0 - postcss-media-query-parser: 0.2.3 - dev: true + optionalDependencies: + typescript: 5.9.3 - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: true + crypto-random-string@2.0.0: {} - /css-loader@6.10.0(webpack@5.90.3): - resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + css-loader@7.1.2(webpack@5.104.0(esbuild@0.26.0)): dependencies: -<<<<<<< HEAD - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) - postcss-modules-scope: 3.1.1(postcss@8.4.38) - postcss-modules-values: 4.0.0(postcss@8.4.38) -======= - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-modules-extract-imports: 3.0.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.0.4(postcss@8.5.3) - postcss-modules-scope: 3.1.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) ->>>>>>> v0-1-0 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.1 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + semver: 7.7.3 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@6.0.0: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 7.0.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 - dev: true - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true + css-what@7.0.0: {} - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + css.escape@1.5.1: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true + cssesc@3.0.0: {} - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + cssstyle@4.6.0: dependencies: - rrweb-cssom: 0.6.0 - dev: true + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: {} - /data-uri-to-buffer@3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} - dev: true + data-uri-to-buffer@3.0.1: {} - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - dev: true + whatwg-url: 14.2.0 - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + is-data-view: 1.0.2 - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + is-data-view: 1.0.2 - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + is-data-view: 1.0.2 - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true + de-indent@1.0.2: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - /debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.4.3: dependencies: ms: 2.1.3 - dev: true - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + decimal.js@10.6.0: {} - /deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 - dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 - dev: true + which-typed-array: 1.1.19 - /deep-freeze@0.0.1: - resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} - dev: true + deep-freeze@0.0.1: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-browser-id@5.0.1: {} + + default-browser@5.4.0: dependencies: - execa: 5.1.1 - dev: true + bundle-name: 4.1.0 + default-browser-id: 5.0.1 - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - requiresBuild: true + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 - dev: true + gopd: 1.2.0 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + delayed-stream@1.0.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true + depd@2.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + dequal@2.0.3: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true + destroy@1.2.0: {} - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true + detect-libc@1.0.3: + optional: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + detect-libc@2.1.2: + optional: true - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + detect-node@2.1.0: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + dom-accessibility-api@0.5.16: {} - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true + dom-accessibility-api@0.6.3: {} - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} + dotenv-expand@11.0.7: dependencies: dotenv: 16.4.7 - dev: true - /dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - dev: true + dotenv@16.4.7: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - /easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + eastasianwidth@0.2.0: {} + + easy-table@1.2.0: dependencies: ansi-regex: 5.0.1 optionalDependencies: wcwidth: 1.0.1 - dev: true - /editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true + editorconfig@1.0.4: dependencies: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.1 - dev: true + semver: 7.7.3 - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true + ee-first@1.1.1: {} - /electron-to-chromium@1.4.719: - resolution: {integrity: sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==} - dev: true + electron-to-chromium@1.5.267: {} - /electron-to-chromium@1.5.142: - resolution: {integrity: sha512-Ah2HgkTu/9RhTDNThBtzu2Wirdy4DC9b0sMT1pUhbkZQ5U/iwmE+PHZX1MpjD5IkJCc2wSghgGG/B04szAx07w==} - dev: true + emoji-regex@10.6.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true + emojis-list@3.0.0: {} - /encode-registry@3.0.1: - resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==} - engines: {node: '>=10'} + encode-registry@3.0.1: dependencies: mem: 8.1.1 - dev: true - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true + encodeurl@2.0.0: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: dependencies: once: 1.4.0 - dev: true - - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true + tapable: 2.3.0 - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + entities@6.0.1: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true + entities@7.0.0: {} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true + env-paths@2.2.1: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true optional: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} - engines: {node: '>= 0.4'} + es-abstract@1.24.1: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + 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.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 + 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.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 + is-data-view: 1.0.2 is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 + 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.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + 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.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true + 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-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-define-property@1.0.1: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + is-arguments: 1.2.0 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.0.7 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true + stop-iteration-iterator: 1.1.0 - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.2.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - dev: true - - /es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - dev: true - - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + 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@2.0.0: {} + + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true + is-date-object: 1.1.0 + is-symbol: 1.1.1 - /esbuild-wasm@0.20.1: - resolution: {integrity: sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==} - engines: {node: '>=12'} - hasBin: true - dev: true + esbuild-wasm@0.26.0: {} - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /esbuild@0.20.1: - resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.1 - '@esbuild/android-arm': 0.20.1 - '@esbuild/android-arm64': 0.20.1 - '@esbuild/android-x64': 0.20.1 - '@esbuild/darwin-arm64': 0.20.1 - '@esbuild/darwin-x64': 0.20.1 - '@esbuild/freebsd-arm64': 0.20.1 - '@esbuild/freebsd-x64': 0.20.1 - '@esbuild/linux-arm': 0.20.1 - '@esbuild/linux-arm64': 0.20.1 - '@esbuild/linux-ia32': 0.20.1 - '@esbuild/linux-loong64': 0.20.1 - '@esbuild/linux-mips64el': 0.20.1 - '@esbuild/linux-ppc64': 0.20.1 - '@esbuild/linux-riscv64': 0.20.1 - '@esbuild/linux-s390x': 0.20.1 - '@esbuild/linux-x64': 0.20.1 - '@esbuild/netbsd-x64': 0.20.1 - '@esbuild/openbsd-x64': 0.20.1 - '@esbuild/sunos-x64': 0.20.1 - '@esbuild/win32-arm64': 0.20.1 - '@esbuild/win32-ia32': 0.20.1 - '@esbuild/win32-x64': 0.20.1 - dev: true - - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.26.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - dev: true - - /esbuild@0.25.3: - resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true + '@esbuild/aix-ppc64': 0.26.0 + '@esbuild/android-arm': 0.26.0 + '@esbuild/android-arm64': 0.26.0 + '@esbuild/android-x64': 0.26.0 + '@esbuild/darwin-arm64': 0.26.0 + '@esbuild/darwin-x64': 0.26.0 + '@esbuild/freebsd-arm64': 0.26.0 + '@esbuild/freebsd-x64': 0.26.0 + '@esbuild/linux-arm': 0.26.0 + '@esbuild/linux-arm64': 0.26.0 + '@esbuild/linux-ia32': 0.26.0 + '@esbuild/linux-loong64': 0.26.0 + '@esbuild/linux-mips64el': 0.26.0 + '@esbuild/linux-ppc64': 0.26.0 + '@esbuild/linux-riscv64': 0.26.0 + '@esbuild/linux-s390x': 0.26.0 + '@esbuild/linux-x64': 0.26.0 + '@esbuild/netbsd-arm64': 0.26.0 + '@esbuild/netbsd-x64': 0.26.0 + '@esbuild/openbsd-arm64': 0.26.0 + '@esbuild/openbsd-x64': 0.26.0 + '@esbuild/openharmony-arm64': 0.26.0 + '@esbuild/sunos-x64': 0.26.0 + '@esbuild/win32-arm64': 0.26.0 + '@esbuild/win32-ia32': 0.26.0 + '@esbuild/win32-x64': 0.26.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + semver: 7.7.3 + + eslint-config-prettier@9.1.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.0 + stable-hash-x: 0.2.0 optionalDependencies: - '@esbuild/aix-ppc64': 0.25.3 - '@esbuild/android-arm': 0.25.3 - '@esbuild/android-arm64': 0.25.3 - '@esbuild/android-x64': 0.25.3 - '@esbuild/darwin-arm64': 0.25.3 - '@esbuild/darwin-x64': 0.25.3 - '@esbuild/freebsd-arm64': 0.25.3 - '@esbuild/freebsd-x64': 0.25.3 - '@esbuild/linux-arm': 0.25.3 - '@esbuild/linux-arm64': 0.25.3 - '@esbuild/linux-ia32': 0.25.3 - '@esbuild/linux-loong64': 0.25.3 - '@esbuild/linux-mips64el': 0.25.3 - '@esbuild/linux-ppc64': 0.25.3 - '@esbuild/linux-riscv64': 0.25.3 - '@esbuild/linux-s390x': 0.25.3 - '@esbuild/linux-x64': 0.25.3 - '@esbuild/netbsd-arm64': 0.25.3 - '@esbuild/netbsd-x64': 0.25.3 - '@esbuild/openbsd-arm64': 0.25.3 - '@esbuild/openbsd-x64': 0.25.3 - '@esbuild/sunos-x64': 0.25.3 - '@esbuild/win32-arm64': 0.25.3 - '@esbuild/win32-ia32': 0.25.3 - '@esbuild/win32-x64': 0.25.3 - dev: true - - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: true - - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + unrs-resolver: 1.11.1 - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-compat-utils@0.5.1(eslint@8.56.0): - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - eslint: 8.56.0 - semver: 7.7.1 - dev: true - - /eslint-config-prettier@9.1.0(eslint@8.56.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.56.0 - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: - debug: 4.3.4 - enhanced-resolve: 5.16.0 - eslint: 8.56.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.3 - is-core-module: 2.13.1 - is-glob: 4.0.3 + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 8.57.1 + get-tsconfig: 4.13.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - 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-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) debug: 3.2.7 - eslint: 8.56.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-es-x@7.8.0(eslint@8.56.0): - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' + eslint-plugin-es-x@7.8.0(eslint@8.57.1): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.56.0) - '@eslint-community/regexpp': 4.12.1 - eslint: 8.56.0 - eslint-compat-utils: 0.5.1(eslint@8.56.0) - dev: true + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) - /eslint-plugin-import-x@4.11.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-NAaYY49342gj09QGvwnFFl5KcD5aLzjAz97Lo+upnN8MzjEGSIlmL5sxCYGqtIeMjw8fSRDFZIp2xjRLT+yl4Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: - '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/types': 8.52.0 comment-parser: 1.4.1 - debug: 4.4.0 - eslint: 8.56.0 - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.10.0 + debug: 4.4.3 + eslint: 8.57.1 + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - stable-hash: 0.0.5 - tslib: 2.8.1 - unrs-resolver: 1.7.0 + minimatch: 10.1.1 + semver: 7.7.3 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - - typescript - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + '@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.56.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-n@17.17.0(eslint@8.56.0): - resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' + eslint-plugin-n@17.23.1(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.56.0) - enhanced-resolve: 5.18.1 - eslint: 8.56.0 - eslint-plugin-es-x: 7.8.0(eslint@8.56.0) - get-tsconfig: 4.10.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + enhanced-resolve: 5.18.4 + eslint: 8.57.1 + eslint-plugin-es-x: 7.8.0(eslint@8.57.1) + get-tsconfig: 4.13.0 globals: 15.15.0 + globrex: 0.1.2 ignore: 5.3.2 - minimatch: 9.0.5 - semver: 7.7.1 - dev: true + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript - /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - 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-hooks@4.6.2(eslint@8.57.1): dependencies: - eslint: 8.56.0 - dev: true + eslint: 8.57.1 - /eslint-plugin-react@7.33.2(eslint@8.56.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.3 + 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.0.18 - eslint: 8.56.0 + es-iterator-helpers: 1.2.2 + eslint: 8.57.1 estraverse: 5.3.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 - object.hasown: 1.1.4 - object.values: 1.2.0 + 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.11 - dev: true + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /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-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /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} - dev: true + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 - /eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint-visitor-keys@4.2.1: {} + + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 + cross-spawn: 7.0.6 + debug: 4.4.3 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -7231,119 +11359,67 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 + 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.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - dev: true + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.7.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@2.0.2: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 - dev: true + '@types/estree': 1.0.8 - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true + etag@1.8.1: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true + eventemitter3@4.0.7: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + eventemitter3@5.0.1: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true + events@3.3.0: {} - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -7352,414 +11428,253 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + express@4.22.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.4 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 + cookie: 0.7.2 + cookie-signature: 1.0.7 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.2 fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.2 + serve-static: 1.16.3 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: 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.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + 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-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.1.0: {} + + fastq@1.20.1: dependencies: - reusify: 1.0.4 - dev: true + reusify: 1.1.0 - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 - dev: true - /fdir@6.4.4(picomatch@4.0.2): - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: - picomatch: 4.0.2 - dev: true + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 - /fetch-blob@2.1.2: - resolution: {integrity: sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==} - engines: {node: ^10.17.0 || >=12.3.0} - peerDependencies: - domexception: '*' - peerDependenciesMeta: - domexception: - optional: true - dev: true + fetch-blob@2.1.2: {} - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - /filter-iterator@0.0.1: - resolution: {integrity: sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==} - dev: true + filter-iterator@0.0.1: {} - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true + filter-obj@1.1.0: {} - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.3.2: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true + flat@5.0.2: {} - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.3: {} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true + forwarded@0.2.0: {} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true + fraction.js@4.3.7: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true + fresh@0.5.2: {} - /front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + front-matter@4.0.2: dependencies: - js-yaml: 3.14.1 - dev: true + js-yaml: 3.14.2 - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true + fs-constants@1.0.0: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 functions-have-names: 1.2.3 - dev: true + hasown: 2.0.2 + is-callable: 1.2.7 - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + generator-function@2.0.1: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + gensync@1.0.0-beta.2: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-east-asian-width@1.4.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true + get-intrinsic: 1.3.0 - /get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + glob-parent@5.1.2: dependencies: - resolve-pkg-maps: 1.0.0 - dev: true + is-glob: 4.0.3 - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0(tslib@2.8.1): dependencies: - is-glob: 4.0.3 - dev: true + tslib: 2.8.1 - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.5.0: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.2 - dev: true + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7767,1071 +11682,620 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - dev: true + globals@15.15.0: {} - /globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} - engines: {node: '>=18'} - dev: true + globals@16.5.0: {} - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 - dev: true + gopd: 1.2.0 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true + slash: 3.0.0 - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: true + globrex@0.1.2: {} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + gopd@1.2.0: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graceful-fs@4.2.11: {} - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true + graphemer@1.4.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + handle-thing@2.0.1: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-bigints@1.1.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-own-property@0.1.0: - resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} - dev: true + has-own-property@0.1.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - dev: true + es-define-property: 1.0.1 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.1.0: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 - dev: true + has-symbols: 1.1.0 - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + he@1.2.0: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} - engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@7.0.2: dependencies: - lru-cache: 10.2.0 - dev: true + lru-cache: 10.4.3 - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 - dev: true - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - dev: true - - /html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - dev: true - /html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} - dev: true + html-entities@2.3.3: {} - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true + domutils: 3.2.2 + entities: 6.0.1 - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true + http-deceiver@1.2.7: {} - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.1: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 - dev: true - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true + http-parser-js@0.5.10: {} - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - dev: true - /http-proxy-middleware@2.0.6(@types/express@4.17.21): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: - '@types/express': 4.17.21 - '@types/http-proxy': 1.17.14 - http-proxy: 1.18.1 + '@types/http-proxy': 1.17.17 + http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.5 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.25 transitivePeerDependencies: - debug - dev: true - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy-middleware@3.0.5: + dependencies: + '@types/http-proxy': 1.17.17 + debug: 4.4.3 + http-proxy: 1.18.1(debug@4.4.3) + is-glob: 4.0.3 + is-plain-object: 5.0.0 + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color + + http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.6 + follow-redirects: 1.15.11(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@5.0.0: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + hyperdyperid@1.2.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true -<<<<<<< HEAD - /icss-utils@5.1.0(postcss@8.4.38): -======= - /icss-utils@5.1.0(postcss@8.5.3): ->>>>>>> v0-1-0 - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + icss-utils@5.1.0(postcss@8.5.6): dependencies: -<<<<<<< HEAD - postcss: 8.4.38 -======= - postcss: 8.5.3 ->>>>>>> v0-1-0 - dev: true + postcss: 8.5.6 - /identity-function@1.0.0: - resolution: {integrity: sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==} - dev: true + identity-function@1.0.0: {} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ignore-walk@5.0.1: dependencies: minimatch: 5.1.6 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.2: {} - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true + ignore@7.0.5: {} - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true + image-size@0.5.5: optional: true - /immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} - dev: true + immutable@5.1.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + import-lazy@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /individual@3.0.0: - resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==} - dev: true + individual@3.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /inquirer@9.2.15: - resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} - engines: {node: '>=18'} - dependencies: - '@ljharb/through': 2.3.13 - ansi-escapes: 4.3.2 - chalk: 5.3.0 - cli-cursor: 3.1.0 - cli-width: 4.1.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true + ini@4.1.3: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 - dev: true + side-channel: 1.1.0 - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true + ipaddr.js@1.9.1: {} - /ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - dev: true + ipaddr.js@2.3.0: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.2.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 has-tostringtag: 1.0.2 - dev: true + safe-regex-test: 1.1.0 - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 - dev: true + has-bigints: 1.1.0 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-callable@1.2.7: {} + + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 - dev: true + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.1.0: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-docker@3.0.0: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 - dev: true + call-bound: 1.0.4 - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-fullwidth-code-point@5.1.0: dependencies: + get-east-asian-width: 1.4.0 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 has-tostringtag: 1.0.2 - dev: true + safe-regex-test: 1.1.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 - /is-iterable@1.1.1: - resolution: {integrity: sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==} - engines: {node: '>= 4'} - dev: true + is-interactive@1.0.0: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-interactive@2.0.0: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-iterable@1.1.1: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-network-error@1.3.0: {} + + is-number-object@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: true + is-number@4.0.0: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true + is-plain-obj@3.0.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-plain-object@5.0.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + gopd: 1.2.0 has-tostringtag: 1.0.2 - dev: true + hasown: 2.0.2 - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 - dev: true + call-bound: 1.0.4 - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 - dev: true + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 - dev: true + which-typed-array: 1.1.19 - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 - dev: true + call-bound: 1.0.4 - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true + is-what@3.14.1: {} - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: true + is-what@4.1.16: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@1.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isarray@2.0.5: {} - /isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - dev: true + isexe@2.0.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isexe@3.1.1: {} - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + isobject@3.0.1: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: -<<<<<<< HEAD - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 -======= - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 ->>>>>>> v0-1-0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.7.3 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@5.0.6: dependencies: - debug: 4.3.4 + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /iterable-lookahead@1.0.0: - resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} - engines: {node: '>=4'} - dev: true + iterable-lookahead@1.0.0: {} - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + 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 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-get-type@29.6.3: {} - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.130 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + jiti@1.21.0: {} - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + jiti@2.6.1: {} - /js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true + jju@1.4.0: {} + + js-beautify@1.15.4: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.3.10 + glob: 10.5.0 js-cookie: 3.0.5 - nopt: 7.2.0 - dev: true + nopt: 7.2.1 - /js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - dev: true + js-cookie@3.0.5: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - dev: true + js-tokens@9.0.1: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true -<<<<<<< HEAD - /jsbi@4.3.0: - resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} -======= - /jsbi@4.3.2: - resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==} ->>>>>>> v0-1-0 - dev: false + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 - /jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + jsbi@4.3.2: {} + + jsdom@24.1.3: dependencies: - cssstyle: 4.0.1 + cssstyle: 4.6.0 data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 + decimal.js: 10.6.0 + form-data: 4.0.5 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 + nwsapi: 2.2.23 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.16.0 + whatwg-url: 14.2.0 + ws: 8.19.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@3.1.0: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true + jsonc-parser@3.3.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - dev: true + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 - /karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true + kind-of@6.0.3: {} - /knip@4.6.0(@types/node@18.19.3)(typescript@5.8.3): - resolution: {integrity: sha512-6slzggzmyAuvtr97nH56ob1RNlkrG2dGF7yn8PJ/LIF8bPsoM93TRNLWTbmuOg4/E1CImilSX4qy9fok0AKJyA==} - engines: {node: '>=18.6.0'} - hasBin: true - peerDependencies: - '@types/node': '>=18' - typescript: '>=5.0.4' + knip@4.6.0(@types/node@18.19.130)(typescript@5.9.3): dependencies: '@ericcornelissen/bash-parser': 0.5.2 '@nodelib/fs.walk': 2.0.0 '@npmcli/map-workspaces': 3.0.4 '@npmcli/package-json': 5.0.0 '@pnpm/logger': 5.0.0 - '@pnpm/workspace.pkgs-graph': 2.0.15(@pnpm/logger@5.0.0) + '@pnpm/workspace.pkgs-graph': 2.0.16(@pnpm/logger@5.0.0) '@snyk/github-codeowners': 1.1.0 - '@types/node': 18.19.3 + '@types/node': 18.19.130 '@types/picomatch': 2.3.3 easy-table: 1.2.0 fast-glob: 3.3.2 @@ -8846,41 +12310,27 @@ packages: smol-toml: 1.1.4 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.8.3 + typescript: 5.9.3 zod: 3.22.4 zod-validation-error: 3.0.0(zod@3.22.4) transitivePeerDependencies: - bluebird - domexception - dev: true - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true + kolorist@1.8.0: {} - /launch-editor@2.6.1: - resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + launch-editor@2.12.0: dependencies: picocolors: 1.1.1 - shell-quote: 1.8.1 - dev: true + shell-quote: 1.8.3 - /less-loader@11.1.0(less@4.2.0)(webpack@5.90.3): - resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} - engines: {node: '>= 14.15.0'} - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 + less-loader@12.3.0(less@4.4.2)(webpack@5.104.0(esbuild@0.26.0)): dependencies: - klona: 2.0.6 - less: 4.2.0 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + less: 4.4.2 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) - /less@4.2.0: - resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} - engines: {node: '>=6'} - hasBin: true + less@4.4.2: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -8893,222 +12343,161 @@ packages: mime: 1.6.0 needle: 3.3.1 source-map: 0.6.1 - dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /license-webpack-plugin@4.0.2(webpack@5.90.3): - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} - peerDependencies: - webpack: '*' - peerDependenciesMeta: - webpack: - optional: true + license-webpack-plugin@4.0.2(webpack@5.104.0(esbuild@0.26.0)): dependencies: - webpack: 5.90.3(esbuild@0.20.1) - webpack-sources: 3.2.3 - dev: true + webpack-sources: 3.3.3 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lines-and-columns@2.0.3: {} - /linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - dev: true - /load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} + listr2@9.0.5: + dependencies: + cli-truncate: 5.1.1 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + lmdb@3.4.3: + dependencies: + msgpackr: 1.11.8 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.4.3 + '@lmdb/lmdb-darwin-x64': 3.4.3 + '@lmdb/lmdb-linux-arm': 3.4.3 + '@lmdb/lmdb-linux-arm64': 3.4.3 + '@lmdb/lmdb-linux-x64': 3.4.3 + '@lmdb/lmdb-win32-arm64': 3.4.3 + '@lmdb/lmdb-win32-x64': 3.4.3 + optional: true + + load-json-file@6.2.0: dependencies: graceful-fs: 4.2.11 parse-json: 5.2.0 strip-bom: 4.0.0 type-fest: 0.6.0 - dev: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.1: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - - /loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} - engines: {node: '>= 12.13.0'} - dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true + loader-utils@3.3.1: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + local-pkg@0.5.1: dependencies: - p-locate: 4.1.0 - dev: true + mlly: 1.8.0 + pkg-types: 1.3.1 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: 6.0.0 - dev: true - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: true + lodash.curry@4.1.1: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true + lodash.debounce@4.0.8: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.2.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.4.3: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true + lunr@2.3.9: {} - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true + lz-string@1.5.0: {} - /magic-string@0.16.0: - resolution: {integrity: sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==} + magic-string@0.16.0: dependencies: vlq: 0.2.3 - dev: true - /magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.19: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - dev: true + '@jridgewell/sourcemap-codec': 1.5.5 - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 - /magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + magicast@0.3.5: dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - source-map-js: 1.2.0 - dev: true + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 - dev: true optional: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: - semver: 7.6.0 - dev: true + semver: 7.7.3 - /map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} + map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 - dev: true - /map-obj@2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} - dev: true + map-obj@2.0.0: {} - /markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true + markdown-it@14.1.0: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -9116,462 +12505,281 @@ packages: mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - dev: true - /mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: true + math-intrinsics@1.1.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + mdurl@2.0.0: {} - /mem@6.1.1: - resolution: {integrity: sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==} - engines: {node: '>=8'} + media-typer@0.3.0: {} + + mem@6.1.1: dependencies: map-age-cleaner: 0.1.3 mimic-fn: 3.1.0 - dev: true - /mem@8.1.1: - resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} - engines: {node: '>=10'} + mem@8.1.1: dependencies: map-age-cleaner: 0.1.3 mimic-fn: 3.1.0 - dev: true - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@4.51.1: dependencies: - fs-monkey: 1.0.5 - dev: true + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /merge-anything@5.1.7: - resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} - engines: {node: '>=12.13'} + merge-anything@5.1.7: dependencies: is-what: 4.1.16 - dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + merge-descriptors@1.0.3: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mime@1.6.0: {} - /mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@3.1.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + mimic-fn@4.0.0: {} - /mini-css-extract-plugin@2.8.1(webpack@5.90.3): - resolution: {integrity: sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + mimic-function@5.0.1: {} + + min-indent@1.0.1: {} + + mini-css-extract-plugin@2.9.4(webpack@5.104.0(esbuild@0.26.0)): dependencies: - schema-utils: 4.2.0 - tapable: 2.2.1 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.104.0(esbuild@0.26.0) - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true + minimalistic-assert@1.0.1: {} - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@10.1.1: dependencies: - brace-expansion: 1.1.11 - dev: true + '@isaacs/brace-expansion': 5.0.0 - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.0.8: dependencies: - brace-expansion: 1.1.11 - dev: true + brace-expansion: 1.1.12 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.1 - dev: true + brace-expansion: 1.1.12 - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 - dev: true + brace-expansion: 2.0.2 - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.1: dependencies: - brace-expansion: 2.0.1 - dev: true + brace-expansion: 2.0.2 - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: - brace-expansion: 2.0.1 - dev: true + brace-expansion: 2.0.2 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minimist@1.2.8: {} - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true + minipass@7.1.2: {} - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + mkdirp@3.0.1: {} + + mlly@1.8.0: dependencies: - acorn: 8.14.1 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 - dev: true + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.2 - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - dev: true + mrmime@2.0.1: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.3: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true - /muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - dev: true + msgpackr@1.11.8: + optionalDependencies: + msgpackr-extract: 3.0.3 + optional: true - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + muggle-string@0.4.1: {} + + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 thunky: 1.1.0 - dev: true - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + mute-stream@2.0.0: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.11: {} - /napi-postinstall@0.1.6: - resolution: {integrity: sha512-w1bClprmjwpybo+7M1Rd0N4QK5Ein8kH/1CQ0Wv8Q9vrLbDMakxc4rZpv8zYc8RVErUELJlFhM8UzOF3IqlYKw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - dev: true + napi-postinstall@0.3.4: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true + ndjson@2.0.0: dependencies: json-stringify-safe: 5.0.1 minimist: 1.2.8 readable-stream: 3.6.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true + needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.3.0 - dev: true + sax: 1.4.4 optional: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + negotiator@0.6.4: {} - /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} - os: ['!win32'] - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.8.0 - dev: true + neo-async@2.6.2: {} + + node-addon-api@6.1.0: optional: true - /node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - requiresBuild: true - dev: true + node-addon-api@7.1.1: optional: true - /node-fetch@3.0.0-beta.9: - resolution: {integrity: sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==} - engines: {node: ^10.17 || >=12.3} + node-fetch@3.0.0-beta.9: dependencies: data-uri-to-buffer: 3.0.1 fetch-blob: 2.1.2 transitivePeerDependencies: - domexception - dev: true - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true + node-forge@1.3.3: {} - /node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} - hasBin: true - requiresBuild: true - dev: true + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 optional: true - /node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true + node-machine-id@1.1.12: {} - /node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - dev: true + node-releases@2.0.27: {} - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.1: dependencies: abbrev: 2.0.0 - dev: true - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} - engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@6.0.2: dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.13.1 - semver: 7.7.1 + hosted-git-info: 7.0.2 + semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /npm-bundled@2.0.1: - resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-bundled@2.0.1: dependencies: npm-normalize-package-bin: 2.0.0 - dev: true - /npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.3.0: dependencies: - semver: 7.7.1 - dev: true + semver: 7.6.0 - /npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true + npm-normalize-package-bin@2.0.0: {} - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.1: {} - /npm-package-arg@11.0.1: - resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@11.0.3: dependencies: - hosted-git-info: 7.0.1 - proc-log: 3.0.0 - semver: 7.7.1 - validate-npm-package-name: 5.0.0 - dev: true + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.0 + validate-npm-package-name: 5.0.1 - /npm-packlist@5.1.3: - resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + npm-packlist@5.1.3: dependencies: glob: 8.1.0 ignore-walk: 5.0.1 npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 - dev: true - /npm-pick-manifest@9.0.0: - resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-pick-manifest@9.1.0: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.1 - semver: 7.7.1 - dev: true + npm-package-arg: 11.0.3 + semver: 7.6.0 - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true + nwsapi@2.2.23: {} - /nx@20.8.0: - resolution: {integrity: sha512-+BN5B5DFBB5WswD8flDDTnr4/bf1VTySXOv60aUAllHqR+KS6deT0p70TTMZF4/A2n/L2UCWDaDro37MGaYozA==} - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true + nx@20.8.0: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.9.0 + axios: 1.13.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -9592,13 +12800,13 @@ packages: open: 8.4.2 ora: 5.3.0 resolve.exports: 2.0.3 - semver: 7.7.1 + semver: 7.7.3 string-width: 4.2.3 tar-stream: 2.2.0 - tmp: 0.2.3 + tmp: 0.2.5 tsconfig-paths: 4.2.0 tslib: 2.8.1 - yaml: 2.7.1 + yaml: 2.8.2 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: @@ -9614,779 +12822,422 @@ packages: '@nx/nx-win32-x64-msvc': 20.8.0 transitivePeerDependencies: - debug - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.4: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-is@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object-pairs@0.1.0: - resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} - dev: true + object-pairs@0.1.0: {} - /object-values@1.0.0: - resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} - engines: {node: '>=0.10.0'} - dev: true + object-values@1.0.0: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - dev: true - - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-object-atoms: 1.0.0 - dev: true + es-object-atoms: 1.1.1 - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 - dev: true + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 - /object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-object-atoms: 1.0.0 - dev: true + es-abstract: 1.24.1 - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + es-object-atoms: 1.1.1 - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true + obuf@1.1.2: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true + on-headers@1.1.0: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true + word-wrap: 1.2.5 - /ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} + ora@5.3.0: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.2 + cli-spinners: 2.6.1 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@9.0.0: dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - dev: true + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.3.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.2.2 + string-width: 8.1.0 + strip-ansi: 7.1.2 - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true + ordered-binary@1.6.1: + optional: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + own-keys@1.0.1: dependencies: - yocto-queue: 0.1.0 - dev: true + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true + p-defer@1.0.0: {} - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@3.1.0: dependencies: - yocto-queue: 1.0.0 - dev: true + yocto-queue: 0.1.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-limit@5.0.0: dependencies: - p-limit: 2.3.0 - dev: true + yocto-queue: 1.2.2 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: 4.0.0 - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-memoize@4.0.1: - resolution: {integrity: sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==} - engines: {node: '>=10'} + p-memoize@4.0.1: dependencies: mem: 6.1.1 mimic-fn: 3.1.0 - dev: true - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@6.2.1: dependencies: - '@types/retry': 0.12.0 + '@types/retry': 0.12.2 + is-network-error: 1.3.0 retry: 0.13.1 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + package-json-from-dist@1.0.1: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - dev: true + parse-ms@4.0.0: {} - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true + parse-node-version@1.0.1: {} - /parse-npm-tarball-url@3.0.0: - resolution: {integrity: sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g==} - engines: {node: '>=8.15'} + parse-npm-tarball-url@3.0.0: dependencies: semver: 6.3.1 - dev: true - /parse5-html-rewriting-stream@7.0.0: - resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + parse5-html-rewriting-stream@8.0.0: dependencies: - entities: 4.5.0 - parse5: 7.1.2 - parse5-sax-parser: 7.0.0 - dev: true + entities: 6.0.1 + parse5: 8.0.0 + parse5-sax-parser: 8.0.0 - /parse5-sax-parser@7.0.0: - resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} + parse5-sax-parser@8.0.0: dependencies: - parse5: 7.1.2 - dev: true + parse5: 8.0.0 - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.3.0: dependencies: - entities: 4.5.0 - dev: true + entities: 6.0.1 - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true + parse5@8.0.0: + dependencies: + entities: 6.0.1 - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + parseurl@1.3.3: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-browserify@1.0.1: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 - dev: true + lru-cache: 10.4.3 + minipass: 7.1.2 - /path-temp@2.1.0: - resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} - engines: {node: '>=8.15'} + path-temp@2.1.0: dependencies: unique-string: 2.0.0 - dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + path-to-regexp@0.1.12: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathe@2.0.3: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pathval@1.1.1: {} - /picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.1.1: {} - /picomatch@4.0.1: - resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} - engines: {node: '>=12'} - dev: true + picomatch@2.3.1: {} - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true + picomatch@4.0.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - requiresBuild: true - dev: true + picomatch@4.0.3: {} + + pify@4.0.1: optional: true - /piscina@4.4.0: - resolution: {integrity: sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==} + piscina@5.1.3: optionalDependencies: - nice-napi: 1.0.2 - dev: true + '@napi-rs/nice': 1.1.1 - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - dependencies: - find-up: 6.3.0 - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.3.1: dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.1.0: {} - /postcss-loader@8.1.1(postcss@8.4.35)(typescript@5.3.3)(webpack@5.90.3): - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.0(esbuild@0.26.0)): dependencies: - cosmiconfig: 9.0.0(typescript@5.3.3) - jiti: 1.21.0 - postcss: 8.4.35 - semver: 7.7.1 - webpack: 5.90.3(esbuild@0.20.1) + cosmiconfig: 9.0.0(typescript@5.9.3) + jiti: 2.6.1 + postcss: 8.5.6 + semver: 7.7.3 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) transitivePeerDependencies: - typescript - dev: true - /postcss-media-query-parser@0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - dev: true - -<<<<<<< HEAD - /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): -======= - /postcss-modules-extract-imports@3.0.0(postcss@8.5.3): ->>>>>>> v0-1-0 - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: -<<<<<<< HEAD - postcss: 8.4.38 - dev: true + postcss-media-query-parser@0.2.3: {} - /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): -======= - postcss: 8.5.3 - dev: true + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 - /postcss-modules-local-by-default@4.0.4(postcss@8.5.3): ->>>>>>> v0-1-0 - resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: -<<<<<<< HEAD - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 -======= - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 ->>>>>>> v0-1-0 - postcss-selector-parser: 6.0.16 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - dev: true - -<<<<<<< HEAD - /postcss-modules-scope@3.1.1(postcss@8.4.38): -======= - /postcss-modules-scope@3.1.1(postcss@8.5.3): ->>>>>>> v0-1-0 - resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: -<<<<<<< HEAD - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: true - /postcss-modules-values@4.0.0(postcss@8.4.38): -======= - postcss: 8.5.3 - postcss-selector-parser: 6.0.16 - dev: true + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 - /postcss-modules-values@4.0.0(postcss@8.5.3): ->>>>>>> v0-1-0 - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: -<<<<<<< HEAD - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 -======= - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 ->>>>>>> v0-1-0 - dev: true - - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - dev: true - - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - /postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - dev: true + prelude-ls@1.2.1: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prettier@2.8.8: + optional: true - /prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.5.3: {} - /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} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true + react-is: 18.3.1 - /pretty-ms@9.0.0: - resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} - engines: {node: '>=18'} + pretty-ms@9.0.0: dependencies: parse-ms: 4.0.0 - dev: true - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@3.0.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + proc-log@4.2.0: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true + process-nextick-args@2.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: true - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: true + proto-list@1.2.4: {} - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true + prr@1.0.1: optional: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + psl@1.15.0: + dependencies: + punycode: 2.3.1 - /publint@0.2.7: - resolution: {integrity: sha512-tLU4ee3110BxWfAmCZggJmCUnYWgPTr0QLnx08sqpLYa8JHRiOudd+CgzdpfU5x5eOaW2WMkpmOrFshRFYK7Mw==} - engines: {node: '>=16'} - hasBin: true + publint@0.2.12: dependencies: npm-packlist: 5.1.3 - picocolors: 1.0.0 + picocolors: 1.1.1 sade: 1.8.1 - dev: true - /punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - dev: true + punycode.js@2.3.1: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.14.1: dependencies: - side-channel: 1.0.6 - dev: true + side-channel: 1.1.0 - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.1: {} - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.3: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true + react-is@16.13.1: {} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true + react-is@17.0.2: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.3.1: {} - /react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.17.0: {} - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: - json-parse-even-better-errors: 3.0.1 + json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -10395,496 +13246,318 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + readdirp@4.1.2: {} + + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} - dev: true + reflect-metadata@0.2.2: {} - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - dev: true + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 - dev: true - - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.24.1 - dev: true + regenerate@1.4.2: {} - /regex-parser@2.3.0: - resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} - dev: true + regex-parser@2.3.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 + 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 - dev: true - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@6.4.0: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: true + unicode-match-property-value-ecmascript: 2.2.1 - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsgen@0.8.0: {} + + regjsparser@0.13.0: dependencies: - jsesc: 0.5.0 - dev: true + jsesc: 3.1.0 - /rename-overwrite@5.0.0: - resolution: {integrity: sha512-vSxE5Ww7Jnyotvaxi3Dj0vOMoojH8KMkBfs9xYeW/qNfJiLTcC1fmwTjrbGUq3mQSOCxkG0DbdcvwTUrpvBN4w==} - engines: {node: '>=12.10'} + rename-overwrite@5.0.4: dependencies: '@zkochan/rimraf': 2.1.3 fs-extra: 10.1.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + require-from-string@2.0.2: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + requires-port@1.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@4.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} + resolve-url-loader@5.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 -<<<<<<< HEAD - postcss: 8.4.38 -======= - postcss: 8.5.3 ->>>>>>> v0-1-0 + postcss: 8.5.6 source-map: 0.6.1 - dev: true - /resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - dev: true + resolve.exports@2.0.3: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.11: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true + retry@0.12.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + retry@0.13.1: {} - /reverse-arguments@1.0.0: - resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} - dev: true + reusify@1.1.0: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true + reverse-arguments@1.0.0: {} - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 10.3.10 - dev: true + rfdc@1.4.1: {} - /rollup-plugin-preserve-directives@0.4.0(rollup@4.40.0): - resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} - peerDependencies: - rollup: 2.x || 3.x || 4.x + rimraf@3.0.2: dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.40.0) - magic-string: 0.30.17 - rollup: 4.40.0 - dev: true + glob: 7.2.3 - /rollup@4.13.1: - resolution: {integrity: sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rimraf@5.0.10: dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.1 - '@rollup/rollup-android-arm64': 4.13.1 - '@rollup/rollup-darwin-arm64': 4.13.1 - '@rollup/rollup-darwin-x64': 4.13.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.1 - '@rollup/rollup-linux-arm64-gnu': 4.13.1 - '@rollup/rollup-linux-arm64-musl': 4.13.1 - '@rollup/rollup-linux-riscv64-gnu': 4.13.1 - '@rollup/rollup-linux-s390x-gnu': 4.13.1 - '@rollup/rollup-linux-x64-gnu': 4.13.1 - '@rollup/rollup-linux-x64-musl': 4.13.1 - '@rollup/rollup-win32-arm64-msvc': 4.13.1 - '@rollup/rollup-win32-ia32-msvc': 4.13.1 - '@rollup/rollup-win32-x64-msvc': 4.13.1 - fsevents: 2.3.3 - dev: true + glob: 10.5.0 - /rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rolldown@1.0.0-beta.47: dependencies: - '@types/estree': 1.0.7 + '@oxc-project/types': 0.96.0 + '@rolldown/pluginutils': 1.0.0-beta.47 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-x64': 1.0.0-beta.47 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.47 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.47 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.47 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.47 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.47 + + rollup-plugin-preserve-directives@0.4.0(rollup@4.55.1): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + magic-string: 0.30.21 + rollup: 4.55.1 + + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 - dev: true - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true + rrweb-cssom@0.7.1: {} - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + rrweb-cssom@0.8.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-applescript@7.1.0: {} + + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: dependencies: tslib: 2.8.1 - dev: true - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true + isarray: 2.0.5 - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 - /sass-loader@14.1.1(sass@1.71.1)(webpack@5.90.3): - resolution: {integrity: sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - webpack: - optional: true + safer-buffer@2.1.2: {} + + sass-loader@16.0.5(sass@1.93.2)(webpack@5.104.0(esbuild@0.26.0)): dependencies: neo-async: 2.6.2 - sass: 1.71.1 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + optionalDependencies: + sass: 1.93.2 + webpack: 5.104.0(esbuild@0.26.0) - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} - engines: {node: '>=14.0.0'} - hasBin: true + sass@1.93.2: dependencies: - chokidar: 3.6.0 - immutable: 4.3.5 + chokidar: 4.0.3 + immutable: 5.1.4 source-map-js: 1.2.1 - dev: true + optionalDependencies: + '@parcel/watcher': 2.5.1 - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - requiresBuild: true - dev: true + sax@1.4.4: optional: true - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.13.0 - ajv-formats: 2.1.1(ajv@8.13.0) - ajv-keywords: 5.1.0(ajv@8.13.0) - dev: true + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true + select-hose@2.0.0: {} - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - dev: true + '@types/node-forge': 1.3.14 + node-forge: 1.3.3 - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - requiresBuild: true - dev: true + semver@5.7.2: optional: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - dev: true + semver@7.7.3: {} - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.19.2: dependencies: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /seroval@0.5.1: - resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} - engines: {node: '>=10'} - dev: true + seroval-plugins@1.3.3(seroval@1.3.2): + dependencies: + seroval: 1.3.2 - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + seroval@1.3.2: {} + + serve-index@1.9.1: dependencies: accepts: 1.3.8 batch: 0.6.1 @@ -10895,128 +13568,75 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.16.3: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.2 transitivePeerDependencies: - supports-color - dev: true - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + 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 - dev: true - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true + setprototypeof@1.1.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shell-quote-word@1.0.1: - resolution: {integrity: sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==} - dev: true + shell-quote-word@1.0.1: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.3: {} - /sherif-darwin-arm64@0.7.0: - resolution: {integrity: sha512-rzWV13FwPA3h7UcO2B1o3s5lBhB4h7p1wXPB7Z0NMR/xweiTpT+hn3kls3YLdAeIL460Gc46ieJCnPFkI/rC0A==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + sherif-darwin-arm64@0.7.0: optional: true - /sherif-darwin-x64@0.7.0: - resolution: {integrity: sha512-6y3cp/ZdhrbHS9e1J70POZyPJdJ1eDYc43Xck9FcRL7GTsH5JbinIqyihdNVu1ctG7ewMA2Ii1nzuQe/rt9Gig==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + sherif-darwin-x64@0.7.0: optional: true - /sherif-linux-arm64@0.7.0: - resolution: {integrity: sha512-DRfXTJuQ3CkF41+vDtCsptKjcvZg+PM9C+btJbZnAhbLSP8kSDWNmOIyH5/LQOBpntbEe6obqPFsBTjpkATkQw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + sherif-linux-arm64@0.7.0: optional: true - /sherif-linux-x64@0.7.0: - resolution: {integrity: sha512-4KM7P/V1jy8WKuGax8hOaRNWLTkwY10+MzVeof4UbTfcZxKibAHpSKtNmmzYFHKlFxOLXRGqDgXYmj5iuXB4bQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + sherif-linux-x64@0.7.0: optional: true - /sherif-windows-arm64@0.7.0: - resolution: {integrity: sha512-WZ62t+YQ39XO6TuMTSWZJwiJTtKaoverhAk0F1MwlCkTZu2xZvlMMWKIN9wtMJvvrNYqTsjrv2xEH1EQNUDfhg==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + sherif-windows-arm64@0.7.0: optional: true - /sherif-windows-x64@0.7.0: - resolution: {integrity: sha512-x5464tDL2VhuLgddbVL33ekMYoTxTDkIsI018o0VaD2V675Bw6RiFrmpzd/HqjXdVRCOh0LCBfH43G3C0NN0Uw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + sherif-windows-x64@0.7.0: optional: true - /sherif@0.7.0: - resolution: {integrity: sha512-2ofYRtx6L4O1EFzUIxD4aSs4tqbE6/oes5/UTjjADHhLIBoq0SbxstPbpxLfz18EKdSDCDr5ZBQBinfm8k8bSQ==} - hasBin: true + sherif@0.7.0: optionalDependencies: sherif-darwin-arm64: 0.7.0 sherif-darwin-x64: 0.7.0 @@ -11024,145 +13644,113 @@ packages: sherif-linux-x64: 0.7.0 sherif-windows-arm64: 0.7.0 sherif-windows-x64: 0.7.0 - dev: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true + object-inspect: 1.13.4 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + 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 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + 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 - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + 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 - /simple-git@3.27.0: - resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-git@3.30.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color - dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - /smol-toml@1.1.4: - resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} - engines: {node: '>= 18', pnpm: '>= 8'} - dev: true + smol-toml@1.1.4: {} - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - dev: true - /solid-js@1.7.8: - resolution: {integrity: sha512-XHBWk1FvFd0JMKljko7FfhefJMTSgYEuVKcQ2a8hzRXfiuSJAGsrPPafqEo+f6l+e8Oe3cROSpIL6kbzjC1fjQ==} + solid-js@1.9.10: dependencies: - csstype: 3.1.3 - seroval: 0.5.1 - dev: true + csstype: 3.2.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) - /solid-refresh@0.6.3(solid-js@1.7.8): - resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} - peerDependencies: - solid-js: ^1.3 + solid-refresh@0.6.3(solid-js@1.9.10): dependencies: - '@babel/generator': 7.24.1 - '@babel/helper-module-imports': 7.24.3 - '@babel/types': 7.24.0 - solid-js: 1.7.8 - dev: true - - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + '@babel/generator': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/types': 7.28.5 + solid-js: 1.9.10 + transitivePeerDependencies: + - supports-color - /source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.1: {} - /source-map-loader@5.0.0(webpack@5.90.3): - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.72.1 + source-map-loader@5.0.0(webpack@5.104.0(esbuild@0.26.0)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + webpack: 5.104.0(esbuild@0.26.0) - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.6: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true + spdx-license-ids: 3.0.22 - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true + spdx-license-ids: 3.0.22 - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.22: {} - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + spdy-transport@3.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -11170,1121 +13758,614 @@ packages: wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: true - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + spdy@4.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /ssri@10.0.5: - resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@10.0.5: dependencies: - minipass: 7.0.4 - dev: true + minipass: 7.1.2 - /stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - dev: true + stable-hash-x@0.2.0: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stable-hash@0.0.5: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true + stackback@0.0.2: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true + statuses@1.5.0: {} - /std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - dev: true + statuses@2.0.2: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + std-env@3.10.0: {} + + stdin-discarder@0.2.2: {} + + stop-iteration-iterator@1.1.0: dependencies: - internal-slot: 1.0.7 - dev: true + es-errors: 1.3.0 + internal-slot: 1.1.0 - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true + strip-ansi: 7.1.2 - /string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - dev: true + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.fromcodepoint@0.2.1: {} + + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.24.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + 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.0.6 - dev: true + side-channel: 1.1.0 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.repeat@1.0.0: dependencies: - call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 - es-object-atoms: 1.0.0 - dev: true + es-abstract: 1.24.1 - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + es-object-atoms: 1.1.1 - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + 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.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + ansi-regex: 6.2.2 - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /strip-json-comments@5.0.1: - resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} - engines: {node: '>=14.16'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strip-json-comments@5.0.1: {} + + strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 - dev: true - - /summary@2.1.0: - resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true + summary@2.1.0: {} - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.3.0: {} - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /terser-webpack-plugin@5.3.10(esbuild@0.20.1)(webpack@5.90.3): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.16(esbuild@0.26.0)(webpack@5.104.0(esbuild@0.26.0)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 - esbuild: 0.20.1 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.29.1 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + terser: 5.44.0 + webpack: 5.104.0(esbuild@0.26.0) + optionalDependencies: + esbuild: 0.26.0 - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true + thunky@1.1.0: {} - /tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - dev: true + tinybench@2.9.0: {} - /tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - dev: true - - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true + tinypool@0.8.4: {} - /tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - dev: true + tinyspy@2.2.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tmp@0.2.5: {} - /to-no-case@1.0.2: - resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} - dev: true + to-no-case@1.0.2: {} - /to-pascal-case@1.0.0: - resolution: {integrity: sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==} + to-pascal-case@1.0.0: dependencies: to-space-case: 1.0.0 - dev: true - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /to-space-case@1.0.0: - resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} + to-space-case@1.0.0: dependencies: to-no-case: 1.0.2 - dev: true - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true + toidentifier@1.0.1: {} - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@5.1.1: dependencies: punycode: 2.3.1 - dev: true - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 - /ts-api-utils@1.3.0(typescript@5.8.3): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + tree-kill@1.2.2: {} + + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: - typescript: 5.8.3 - dev: true + typescript: 5.9.3 - /ts-api-utils@2.1.0(typescript@5.8.3): - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 - dev: true + typescript: 5.9.3 - /ts-morph@21.0.1: - resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} + ts-declaration-location@1.0.7(typescript@5.9.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.9.3 + + ts-morph@21.0.1: dependencies: '@ts-morph/common': 0.22.0 code-block-writer: 12.0.0 - dev: true - /tsconfck@3.0.3(typescript@5.8.3): - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.8.3 - dev: true + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - dev: true + tslib@2.8.1: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - - /type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-detect@4.1.0: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true + is-typed-array: 1.1.15 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true + 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.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true - - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - dev: true + 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-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - dev: true + 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 -<<<<<<< HEAD - /typesafe-actions@5.1.0: - resolution: {integrity: sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==} - engines: {node: '>= 4'} - dev: false + typed-assert@1.0.9: {} - /typescript@4.9.3: - resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} - engines: {node: '>=4.2.0'} -======= - /typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2): - resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} - peerDependencies: - typedoc-plugin-markdown: '>=4.4.2' + typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))): dependencies: - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9) - yaml: 2.7.1 - dev: true + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) + yaml: 2.8.2 - /typedoc-plugin-markdown@4.4.2(typedoc@0.27.9): - resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} - engines: {node: '>= 18'} - peerDependencies: - typedoc: 0.27.x + typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3)): dependencies: - typedoc: 0.27.9(typescript@5.8.3) - dev: true + typedoc: 0.27.9(typescript@5.9.3) - /typedoc@0.27.9(typescript@5.8.3): - resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} - engines: {node: '>= 18'} ->>>>>>> v0-1-0 - hasBin: true - peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + typedoc@0.27.9(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.8.3 - yaml: 2.7.1 - dev: true + typescript: 5.9.3 + yaml: 2.8.2 - /typescript-eslint@8.31.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typesafe-actions@5.1.0: {} + + typescript-eslint@8.52.0(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.31.0(@typescript-eslint/parser@8.31.0)(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.0(eslint@8.56.0)(typescript@5.8.3) - eslint: 8.56.0 - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - dev: true - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true + typescript@5.0.4: {} - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.1.6: {} - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.2.2: {} - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.3.3: {} - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.4.2: {} - /typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.9.3: {} - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: true + uc.micro@2.1.0: {} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true + ufo@1.6.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@5.26.5: {} - /undici@6.7.1: - resolution: {integrity: sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==} - engines: {node: '>=18.0'} - dev: true + undici@7.16.0: {} - /unescape-js@1.1.4: - resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} + unescape-js@1.1.4: dependencies: string.fromcodepoint: 0.2.1 - dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true + unicode-canonical-property-names-ecmascript@2.0.1: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: true + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true + unicode-match-property-value-ecmascript@2.2.1: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true + unicode-property-aliases-ecmascript@2.2.0: {} - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.1.2: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + unpipe@1.0.0: {} - /unrs-resolver@1.7.0: - resolution: {integrity: sha512-b76tVoT9KPniDY1GoYghDUQX20gjzXm/TONfHfgayLaiuo+oGyT9CsQkGCEJs+1/uryVBEOGOt3yYWDXbJhL7g==} - requiresBuild: true + unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.1.6 + napi-postinstall: 0.3.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.7.0 - '@unrs/resolver-binding-darwin-x64': 1.7.0 - '@unrs/resolver-binding-freebsd-x64': 1.7.0 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.0 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.0 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.0 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.0 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.0 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.0 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.0 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.0 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.0 - '@unrs/resolver-binding-linux-x64-musl': 1.7.0 - '@unrs/resolver-binding-wasm32-wasi': 1.7.0 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.0 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.0 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.0 - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 - dev: true - - /update-browserslist-db@1.1.3(browserslist@4.24.4): - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.24.4 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.6.0(react@18.3.1): dependencies: - react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + react: 18.3.1 - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true + util-deprecate@1.0.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + utils-merge@1.0.1: {} - /validate-html-nesting@1.2.2: - resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - dev: true + uuid@8.3.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@4.0.0: - resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + validate-npm-package-name@4.0.0: dependencies: - builtins: 5.0.1 - dev: true + builtins: 5.1.0 - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - builtins: 5.0.1 - dev: true + validate-npm-package-name@5.0.1: {} - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true + vary@1.1.2: {} - /version-selector-type@3.0.0: - resolution: {integrity: sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA==} - engines: {node: '>=10.13'} + version-selector-type@3.0.0: dependencies: - semver: 7.7.1 - dev: true + semver: 7.6.0 - /vite-node@1.6.1(@types/node@18.19.3): - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.6.1(@types/node@18.19.130): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.3 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.2.6(@types/node@18.19.3) + vite: 5.4.21(@types/node@18.19.130) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - /vite-plugin-dts@4.2.3(@types/node@18.19.3)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.3): - resolution: {integrity: sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vite-plugin-dts@4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@18.19.3) - '@rollup/pluginutils': 5.1.0(rollup@4.40.0) - '@volar/typescript': 2.4.13 - '@vue/language-core': 2.1.6(typescript@5.8.3) + '@microsoft/api-extractor': 7.47.7(@types/node@18.19.130) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@volar/typescript': 2.4.27 + '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.0 + debug: 4.4.3 kolorist: 1.8.0 - local-pkg: 0.5.0 - magic-string: 0.30.17 - typescript: 5.8.3 - vite: 6.3.3(@types/node@18.19.3) + local-pkg: 0.5.1 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - dev: true - - /vite-plugin-externalize-deps@0.9.0(vite@6.3.3): - resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - dependencies: - vite: 6.3.3(@types/node@18.19.3) - dev: true - - /vite-plugin-solid@2.10.1(@testing-library/jest-dom@6.4.2)(solid-js@1.7.8)(vite@5.2.6): - resolution: {integrity: sha512-kfVdNLWaJqaJVL52U6iCCKNW/nXE7bS1VVGOWPGllOkJfcNILymVSY0LCBLSnyy0iYnRtrXpiHm14rMuzeC7CA==} - peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true - dependencies: - '@babel/core': 7.24.3 - '@testing-library/jest-dom': 6.4.2(vitest@1.6.1) - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.8.16(@babel/core@7.24.3) - merge-anything: 5.1.7 - solid-js: 1.7.8 - solid-refresh: 0.6.3(solid-js@1.7.8) - vite: 5.2.6(@types/node@18.19.3) - vitefu: 0.2.5(vite@5.2.6) - transitivePeerDependencies: - - supports-color - dev: true - /vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.3): - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): dependencies: - debug: 4.4.0 - globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.8.3) - vite: 6.3.3(@types/node@18.19.3) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /vite@5.1.5(@types/node@18.19.3)(less@4.2.0)(sass@1.71.1)(terser@5.29.1): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): dependencies: - '@types/node': 18.19.3 - esbuild: 0.19.12 - less: 4.2.0 - postcss: 8.5.3 - rollup: 4.40.0 - sass: 1.71.1 - terser: 5.29.1 + '@babel/core': 7.28.5 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.10) + merge-anything: 5.1.7 + solid-js: 1.9.10 + solid-refresh: 0.6.3(solid-js@1.9.10) + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) optionalDependencies: - fsevents: 2.3.3 - dev: true + '@testing-library/jest-dom': 6.9.1 + transitivePeerDependencies: + - supports-color - /vite@5.2.6(@types/node@18.19.3): - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.21(@types/node@18.19.130): dependencies: - '@types/node': 18.19.3 - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.13.1 + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.55.1 optionalDependencies: + '@types/node': 18.19.130 fsevents: 2.3.3 - dev: true - /vite@6.3.3(@types/node@18.19.3): - resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2): dependencies: - '@types/node': 18.19.3 - esbuild: 0.25.3 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.13 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 18.19.130 fsevents: 2.3.3 - dev: true + jiti: 1.21.0 + yaml: 2.8.2 - /vitefu@0.2.5(vite@5.2.6): - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: - optional: true + vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): dependencies: - vite: 5.2.6(@types/node@18.19.3) - dev: true + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 18.19.130 + fsevents: 2.3.3 + jiti: 2.6.1 + less: 4.4.2 + sass: 1.93.2 + terser: 5.44.0 + yaml: 2.8.2 - /vitest@1.6.1(@types/node@18.19.3)(jsdom@24.0.0): - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitefu@1.1.1(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + optionalDependencies: + vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + + vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3): dependencies: - '@types/node': 18.19.3 '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 '@vitest/snapshot': 1.6.1 @@ -12292,507 +14373,352 @@ packages: '@vitest/utils': 1.6.1 acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.4.0 + debug: 4.4.3 execa: 8.0.1 - jsdom: 24.0.0 - local-pkg: 0.5.0 - magic-string: 0.30.17 + local-pkg: 0.5.1 + magic-string: 0.30.21 pathe: 1.1.2 picocolors: 1.1.1 - std-env: 3.9.0 + std-env: 3.10.0 strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.2.6(@types/node@18.19.3) - vite-node: 1.6.1(@types/node@18.19.3) + vite: 5.4.21(@types/node@18.19.130) + vite-node: 1.6.1(@types/node@18.19.130) why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.130 + jsdom: 24.1.3 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - /vlq@0.2.3: - resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} - dev: true + vlq@0.2.3: {} - /vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - dev: true + vscode-uri@3.1.0: {} - /vue-component-type-helpers@2.0.7: - resolution: {integrity: sha512-7e12Evdll7JcTIocojgnCgwocX4WzIYStGClBQ+QuWPinZo/vQolv2EMq4a3lg16TKfwWafLimG77bxb56UauA==} - dev: true + vue-component-type-helpers@2.2.12: {} - /vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4): - resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vue-demi@0.14.10(@vue/composition-api@1.7.2(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)): + dependencies: + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + '@vue/composition-api': 1.7.2(vue@3.5.26(typescript@5.9.3)) + + vue-eslint-parser@10.2.0(eslint@8.57.1): dependencies: - '@vue/composition-api': 1.7.2(vue@3.3.4) - vue: 3.3.4 - dev: false + debug: 4.4.3 + eslint: 8.57.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color - /vue-eslint-parser@9.4.3(eslint@8.56.0): - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' + vue-eslint-parser@9.4.3(eslint@8.57.1): dependencies: - debug: 4.4.0 - eslint: 8.56.0 + debug: 4.4.3 + eslint: 8.57.1 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.7.0 lodash: 4.17.21 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color - dev: true - /vue@2.6.0: - resolution: {integrity: sha512-QSKHpmV17wqDmS5jVCc8X9LyTcCCQP4M1RTRpLBO+hRveePduJaGz1FGjVpRVcE6cKYbhsooz6RW7GWLGNjKGg==} - deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. - dev: true + vue@2.6.14: {} - /vue@2.7.0: - resolution: {integrity: sha512-su25f1hocH+QNkVEqk+Oj7B+mkDIWU70l0YY7nYSJFEs3Z64njXxo65RUXnWH46ooEhKmEWyLdW6HcYn8coNrg==} - deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. + vue@2.7.16: dependencies: - '@vue/compiler-sfc': 2.7.0 - csstype: 3.1.3 - dev: true + '@vue/compiler-sfc': 2.7.16 + csstype: 3.2.3 - /vue@3.3.4: - resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + vue@3.5.26(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/runtime-dom': 3.3.4 - '@vue/server-renderer': 3.3.4(vue@3.3.4) - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-sfc': 3.5.26 + '@vue/runtime-dom': 3.5.26 + '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@5.9.3)) + '@vue/shared': 3.5.26 + optionalDependencies: + typescript: 5.9.3 - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + watchpack@2.5.0: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: dependencies: minimalistic-assert: 1.0.1 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + weak-lru-cache@1.2.2: + optional: true - /webpack-dev-middleware@5.3.4(webpack@5.90.3): - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + webidl-conversions@7.0.0: {} - /webpack-dev-middleware@6.1.2(webpack@5.90.3): - resolution: {integrity: sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true + webpack-dev-middleware@7.4.5(webpack@5.104.0(esbuild@0.26.0)): dependencies: colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 + memfs: 4.51.1 + mime-types: 3.0.2 + on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) - /webpack-dev-server@4.15.1(webpack@5.90.3): - resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + webpack-dev-server@5.2.2(webpack@5.104.0(esbuild@0.26.0)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 + '@types/ws': 8.18.1 ansi-html-community: 0.0.8 - bonjour-service: 1.2.1 + bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.7.4 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.19.2 + express: 4.22.1 graceful-fs: 4.2.11 - html-entities: 2.5.2 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - ipaddr.js: 2.1.0 - launch-editor: 2.6.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + launch-editor: 2.12.0 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.90.3(esbuild@0.20.1) - webpack-dev-middleware: 5.3.4(webpack@5.90.3) - ws: 8.16.0 + webpack-dev-middleware: 7.4.5(webpack@5.104.0(esbuild@0.26.0)) + ws: 8.19.0 + optionalDependencies: + webpack: 5.104.0(esbuild@0.26.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - dev: true - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@6.0.1: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - dev: true - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.3.3: {} - /webpack-subresource-integrity@5.1.0(webpack@5.90.3): - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} - peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' - webpack: ^5.12.0 - peerDependenciesMeta: - html-webpack-plugin: - optional: true + webpack-subresource-integrity@5.1.0(webpack@5.104.0(esbuild@0.26.0)): dependencies: typed-assert: 1.0.9 - webpack: 5.90.3(esbuild@0.20.1) - dev: true + webpack: 5.104.0(esbuild@0.26.0) - /webpack@5.90.3(esbuild@0.20.1): - resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.104.0(esbuild@0.26.0): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.14.1 - acorn-import-assertions: 1.9.0(acorn@8.14.1) - browserslist: 4.24.4 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.7.0 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.20.1)(webpack@5.90.3) - watchpack: 2.4.0 - webpack-sources: 3.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(esbuild@0.26.0)(webpack@5.104.0(esbuild@0.26.0)) + watchpack: 2.5.0 + webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + websocket-driver@0.7.4: dependencies: - http-parser-js: 0.5.8 + http-parser-js: 0.5.10 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - dev: true - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true + websocket-extensions@0.1.4: {} - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.2.0: dependencies: - tr46: 5.0.0 + tr46: 5.1.1 webidl-conversions: 7.0.0 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true + 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.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.2.1: dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.4 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 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.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 - dev: true + which-typed-array: 1.1.19 - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + 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.3 - dev: true + is-weakset: 2.0.4 - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true + which@4.0.0: dependencies: isexe: 3.1.1 - dev: true - /why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true + wildcard@2.0.1: {} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true + strip-ansi: 7.1.2 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + wrappy@1.0.2: {} - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + ws@8.19.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + xml-name-validator@5.0.0: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + xmlchars@2.2.0: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + y18n@5.0.8: {} - /yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yallist@3.1.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yallist@4.0.0: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.2.2: {} - /zod-validation-error@3.0.0(zod@3.22.4): - resolution: {integrity: sha512-x+agsJJG9rvC7axF0xqTEdZhJkLHyIZkdOAWDJSmwGPzxNHMHwtU6w2yDOAAP6yuSfTAUhAMJRBfhVGY64ySEQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + + zod-validation-error@3.0.0(zod@3.22.4): dependencies: zod: 3.22.4 - dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: true + zod@3.22.4: {} - /zone.js@0.14.3: - resolution: {integrity: sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA==} - dependencies: - tslib: 2.6.2 - dev: true + zone.js@0.14.10: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 600b4bb4..6edbe516 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,5 @@ packages: - 'packages/**' + +catalog: + '@js-temporal/polyfill': 0.5.1 From 23881aaba6b02ec97304db1e5f8eac4eb149bec5 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 17:48:31 +0100 Subject: [PATCH 146/163] chore: resolve conflicts --- packages/time/package.json | 3 +- packages/time/src/calendar/groupDaysBy.ts | 103 +++++++++--------- .../time/src/calendar/splitMultiDayEvents.ts | 15 ++- packages/time/src/core/calendar.ts | 1 - packages/time/src/tests/calendar-core.test.ts | 56 ++++------ packages/time/src/tests/endOf.test.ts | 74 +++++++++---- packages/time/src/tests/startOf.test.ts | 62 +++++++---- packages/time/src/utils/dateDefaults.ts | 1 + packages/time/src/utils/getFirstDayOfWeek.ts | 13 ++- packages/time/src/utils/parseDate.ts | 4 +- packages/time/src/utils/startOf.ts | 16 +-- .../{parse.test.ts => parseDate.test.ts} | 0 packages/time/vite.config.ts | 2 +- 13 files changed, 205 insertions(+), 145 deletions(-) rename packages/time/tests/{parse.test.ts => parseDate.test.ts} (100%) diff --git a/packages/time/package.json b/packages/time/package.json index 6fb8b862..0f6d9d0f 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -57,7 +57,8 @@ "dependencies": { "@bart-krakowski/get-week-info-polyfill": "^1.0.6", "@js-temporal/polyfill": "catalog:", - "@tanstack/store": "^0.4.1" + "@tanstack/store": "^0.4.1", + "zod": "^3.24.4" }, "devDependencies": { "csstype": "^3.2.3" diff --git a/packages/time/src/calendar/groupDaysBy.ts b/packages/time/src/calendar/groupDaysBy.ts index b739c344..113050a5 100644 --- a/packages/time/src/calendar/groupDaysBy.ts +++ b/packages/time/src/calendar/groupDaysBy.ts @@ -1,29 +1,29 @@ -import { Temporal } from '@js-temporal/polyfill'; -import type { Day, Event, Resource } from './types'; +import { Temporal } from '@js-temporal/polyfill' +import type { Day, Event, Resource } from './types' interface GroupDaysByBaseProps< TResource extends Resource, TEvent extends Event = Event, > { - days: (Day | null)[]; - weekStartsOn: number; - locale: string; + days: (Day | null)[] + weekStartsOn: number + locale: string } type GroupDaysByMonthProps< TResource extends Resource, TEvent extends Event = Event, > = GroupDaysByBaseProps & { - unit: 'month'; - fillMissingDays?: never; + unit: 'month' + fillMissingDays?: never } type GroupDaysByWeekProps< TResource extends Resource, TEvent extends Event = Event, > = GroupDaysByBaseProps & { - unit: 'week' | 'workWeek'; - fillMissingDays?: boolean; + unit: 'week' | 'workWeek' + fillMissingDays?: boolean } export type GroupDaysByProps< @@ -31,7 +31,7 @@ export type GroupDaysByProps< TEvent extends Event = Event, > = | GroupDaysByMonthProps - | GroupDaysByWeekProps; + | GroupDaysByWeekProps export const groupDaysBy = < TResource extends Resource, @@ -46,37 +46,37 @@ export const groupDaysBy = < TResource, TEvent > | null)[][] => { - const groups: (Day | null)[][] = []; - const loc = new Intl.Locale(locale); - const { weekend } = loc.getWeekInfo(); + const groups: (Day | null)[][] = [] + const loc = new Intl.Locale(locale) + const { weekend } = loc.getWeekInfo() switch (unit) { case 'month': { - let currentMonth: (Day | null)[] = []; + let currentMonth: (Day | null)[] = [] days.forEach((day) => { if ( currentMonth.length > 0 && day?.date.month !== currentMonth[0]?.date.month ) { - groups.push(currentMonth); - currentMonth = []; + groups.push(currentMonth) + currentMonth = [] } - currentMonth.push(day); - }); + currentMonth.push(day) + }) if (currentMonth.length > 0) { - groups.push(currentMonth); + groups.push(currentMonth) } - break; + break } case 'week': { - const weeks: (Day | null)[][] = []; - let currentWeek: (Day | null)[] = []; + const weeks: (Day | null)[][] = [] + let currentWeek: (Day | null)[] = [] days.forEach((day) => { if (currentWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 for (let i = 0; i < dayOfWeek; i++) { currentWeek.push( fillMissingDays @@ -87,22 +87,22 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ); + ) } } } - currentWeek.push(day); + currentWeek.push(day) if (currentWeek.length === 7) { - weeks.push(currentWeek); - currentWeek = []; + weeks.push(currentWeek) + currentWeek = [] } - }); + }) if (currentWeek.length > 0) { while (currentWeek.length < 7) { const lastDate = currentWeek[currentWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01'); + Temporal.PlainDate.from('2024-01-01') currentWeek.push( fillMissingDays ? { @@ -112,24 +112,27 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ); + ) } - weeks.push(currentWeek); + weeks.push(currentWeek) } - return weeks; + return weeks } case 'workWeek': { - const workWeeks: (Day | null)[][] = []; - let currentWorkWeek: (Day | null)[] = []; + const workWeeks: (Day | null)[][] = [] + let currentWorkWeek: (Day | null)[] = [] days.forEach((day) => { - if (currentWorkWeek.length === 0 && day?.date.dayOfWeek !== weekStartsOn) { + if ( + currentWorkWeek.length === 0 && + day?.date.dayOfWeek !== weekStartsOn + ) { if (day) { - const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7; + const dayOfWeek = (day.date.dayOfWeek - weekStartsOn + 7) % 7 for (let i = 0; i < dayOfWeek; i++) { - const newDay = day.date.subtract({ days: dayOfWeek - i }); + const newDay = day.date.subtract({ days: dayOfWeek - i }) if (!weekend.includes(newDay.dayOfWeek)) { currentWorkWeek.push( fillMissingDays @@ -140,26 +143,26 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ); + ) } } } } if (day && !weekend.includes(day.date.dayOfWeek)) { - currentWorkWeek.push(day); + currentWorkWeek.push(day) } if (currentWorkWeek.length === 5) { - workWeeks.push(currentWorkWeek); - currentWorkWeek = []; + workWeeks.push(currentWorkWeek) + currentWorkWeek = [] } - }); + }) if (currentWorkWeek.length > 0) { while (currentWorkWeek.length < 5) { const lastDate = currentWorkWeek[currentWorkWeek.length - 1]?.date ?? - Temporal.PlainDate.from('2024-01-01'); - const nextDate = lastDate.add({ days: 1 }); + Temporal.PlainDate.from('2024-01-01') + const nextDate = lastDate.add({ days: 1 }) if (!weekend.includes(nextDate.dayOfWeek)) { currentWorkWeek.push( fillMissingDays @@ -170,17 +173,17 @@ export const groupDaysBy = < isInCurrentPeriod: false, } : null, - ); + ) } } - workWeeks.push(currentWorkWeek); + workWeeks.push(currentWorkWeek) } - return workWeeks; + return workWeeks } default: - break; + break } - return groups; -}; + return groups +} diff --git a/packages/time/src/calendar/splitMultiDayEvents.ts b/packages/time/src/calendar/splitMultiDayEvents.ts index 376460eb..17cdc860 100644 --- a/packages/time/src/calendar/splitMultiDayEvents.ts +++ b/packages/time/src/calendar/splitMultiDayEvents.ts @@ -9,8 +9,12 @@ export const splitMultiDayEvents = < event: TEvent, timeZone: Temporal.TimeZoneLike, ): TEvent[] => { - const startDate = Temporal.PlainDateTime.from(event.start).toZonedDateTime(timeZone) - const endDate = Temporal.PlainDateTime.from(event.end).toZonedDateTime(timeZone) + const startDate = Temporal.PlainDateTime.from(event.start).toZonedDateTime( + timeZone, + ) + const endDate = Temporal.PlainDateTime.from(event.end).toZonedDateTime( + timeZone, + ) const events: TEvent[] = [] let currentDay = startDate @@ -20,7 +24,10 @@ export const splitMultiDayEvents = < ? startDate : startOf({ date: currentDay, unit: 'day' }) const eventEnd = - Temporal.ZonedDateTime.compare(endDate, endOf({ date: currentDay, unit: 'day' })) < 0 + Temporal.ZonedDateTime.compare( + endDate, + endOf({ date: currentDay, unit: 'day' }), + ) < 0 ? endDate : endOf({ date: currentDay, unit: 'day' }) @@ -34,4 +41,4 @@ export const splitMultiDayEvents = < } return events -} \ No newline at end of file +} diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 43aec57c..252e9b68 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -134,7 +134,6 @@ export class CalendarCore< }) } - private getFirstDayOfMonth() { return getFirstDayOfMonth( this.store.state.currentPeriod diff --git a/packages/time/src/tests/calendar-core.test.ts b/packages/time/src/tests/calendar-core.test.ts index 1d68f72e..195899d0 100644 --- a/packages/time/src/tests/calendar-core.test.ts +++ b/packages/time/src/tests/calendar-core.test.ts @@ -13,27 +13,17 @@ describe('CalendarCore', () => { beforeEach(() => { vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate) vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime) - vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue( - Temporal.ZonedDateTime.from({ - timeZone: mockTimeZone, - year: 2024, - month: 6, - day: 15, - hour: 10, - minute: 0, - second: 0, - }), - ) + const mockZonedDateTime = Temporal.ZonedDateTime.from({ + timeZone: mockTimeZone, + year: 2024, + month: 6, + day: 15, + hour: 10, + minute: 0, + second: 0, + }) vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue( - Temporal.ZonedDateTime.from({ - timeZone: mockTimeZone, - year: 2024, - month: 6, - day: 15, - hour: 10, - minute: 0, - second: 0, - }), + mockZonedDateTime, ) options = { @@ -128,13 +118,12 @@ describe('CalendarCore', () => { overlappingEvents: [ { ...options.events![2], - start: - Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( - mockTimeZone, - ).toString(), - end: Temporal.PlainDateTime.from( - '2024-06-12T13:00', - ).toZonedDateTime(mockTimeZone).toString(), + start: Temporal.PlainDateTime.from('2024-06-12T11:00') + .toZonedDateTime(mockTimeZone) + .toString(), + end: Temporal.PlainDateTime.from('2024-06-12T13:00') + .toZonedDateTime(mockTimeZone) + .toString(), }, ], }) @@ -144,13 +133,12 @@ describe('CalendarCore', () => { overlappingEvents: [ { ...options.events![1], - start: - Temporal.PlainDateTime.from('2024-06-12T11:00').toZonedDateTime( - mockTimeZone, - ).toString(), - end: Temporal.PlainDateTime.from( - '2024-06-12T12:00', - ).toZonedDateTime(mockTimeZone).toString(), + start: Temporal.PlainDateTime.from('2024-06-12T11:00') + .toZonedDateTime(mockTimeZone) + .toString(), + end: Temporal.PlainDateTime.from('2024-06-12T12:00') + .toZonedDateTime(mockTimeZone) + .toString(), }, ], }) diff --git a/packages/time/src/tests/endOf.test.ts b/packages/time/src/tests/endOf.test.ts index f8db8332..490e9c8a 100644 --- a/packages/time/src/tests/endOf.test.ts +++ b/packages/time/src/tests/endOf.test.ts @@ -4,92 +4,128 @@ import { endOf } from '../utils' describe('endOf', () => { test('should get the end of the given day', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'day', }) - const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999+01:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2023-07-16T23:59:59.999999999+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the end of the given week', () => { - const date = Temporal.ZonedDateTime.from('2023-07-13T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-13T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'week', }) - const expected = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999+01:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2023-07-16T23:59:59.999999999+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the end of the given month', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'month', }) - const expected = Temporal.ZonedDateTime.from('2023-07-31T23:59:59.999999999+01:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2023-07-31T23:59:59.999999999+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the end of the given year', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'year', }) - const expected = Temporal.ZonedDateTime.from('2023-12-31T23:59:59.999999999+00:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2023-12-31T23:59:59.999999999+00:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the end of the given work week', () => { - const date = Temporal.ZonedDateTime.from('2023-07-10T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-10T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'workWeek', }) - const expected = Temporal.ZonedDateTime.from('2023-07-14T23:59:59.999999999+01:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2023-07-14T23:59:59.999999999+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the end of the given decade', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) const result = endOf({ date, unit: 'decade', }) - const expected = Temporal.ZonedDateTime.from('2029-12-31T23:59:59.999999999+00:00[Europe/London]') + const expected = Temporal.ZonedDateTime.from( + '2029-12-31T23:59:59.999999999+00:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should handle daylight saving time changes', () => { // Test for a date just before the DST change - const dateBeforeDST = Temporal.ZonedDateTime.from('2023-10-28T12:00:00+01:00[Europe/London]') + const dateBeforeDST = Temporal.ZonedDateTime.from( + '2023-10-28T12:00:00+01:00[Europe/London]', + ) const resultBeforeDST = endOf({ date: dateBeforeDST, unit: 'day', }) - const expectedBeforeDST = Temporal.ZonedDateTime.from('2023-10-28T23:59:59.999999999+01:00[Europe/London]') + const expectedBeforeDST = Temporal.ZonedDateTime.from( + '2023-10-28T23:59:59.999999999+01:00[Europe/London]', + ) expect(resultBeforeDST.equals(expectedBeforeDST)).toBe(true) // Test for a date just after the DST change - const dateAfterDST = Temporal.ZonedDateTime.from('2023-10-29T12:00:00+00:00[Europe/London]') + const dateAfterDST = Temporal.ZonedDateTime.from( + '2023-10-29T12:00:00+00:00[Europe/London]', + ) const resultAfterDST = endOf({ date: dateAfterDST, unit: 'day', }) - const expectedAfterDST = Temporal.ZonedDateTime.from('2023-10-29T23:59:59.999999999+00:00[Europe/London]') + const expectedAfterDST = Temporal.ZonedDateTime.from( + '2023-10-29T23:59:59.999999999+00:00[Europe/London]', + ) expect(resultAfterDST.equals(expectedAfterDST)).toBe(true) }) test('should handle different time zones', () => { - const dateNY = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789-04:00[America/New_York]') + const dateNY = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789-04:00[America/New_York]', + ) const resultNY = endOf({ date: dateNY, unit: 'day', }) - const expectedNY = Temporal.ZonedDateTime.from('2023-07-16T23:59:59.999999999-04:00[America/New_York]') + const expectedNY = Temporal.ZonedDateTime.from( + '2023-07-16T23:59:59.999999999-04:00[America/New_York]', + ) expect(resultNY.equals(expectedNY)).toBe(true) }) -}) \ No newline at end of file +}) diff --git a/packages/time/src/tests/startOf.test.ts b/packages/time/src/tests/startOf.test.ts index ca26f904..5c221636 100644 --- a/packages/time/src/tests/startOf.test.ts +++ b/packages/time/src/tests/startOf.test.ts @@ -1,49 +1,71 @@ - import { Temporal } from '@js-temporal/polyfill' import { describe, expect, test } from 'vitest' import { startOf } from '../utils' describe('startOf', () => { test('should get the start of the given day', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'day') - const expected = Temporal.ZonedDateTime.from('2023-07-16T00:00:00.000+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'day' }) + const expected = Temporal.ZonedDateTime.from( + '2023-07-16T00:00:00.000+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the start of the given week', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'week') - const expected = Temporal.ZonedDateTime.from('2023-07-10T00:00:00.000+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'week' }) + const expected = Temporal.ZonedDateTime.from( + '2023-07-10T00:00:00.000+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the start of the given month', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'month') - const expected = Temporal.ZonedDateTime.from('2023-07-01T00:00:00.000+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'month' }) + const expected = Temporal.ZonedDateTime.from( + '2023-07-01T00:00:00.000+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the start of the given year', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'year') - console.log('result', result.toString()) - const expected = Temporal.ZonedDateTime.from('2023-01-01T00:00:00.000+00:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'year' }) + const expected = Temporal.ZonedDateTime.from( + '2023-01-01T00:00:00.000+00:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the start of the given work week', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'workWeek') - const expected = Temporal.ZonedDateTime.from('2023-07-10T00:00:00.000+01:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'workWeek' }) + const expected = Temporal.ZonedDateTime.from( + '2023-07-10T00:00:00.000+01:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) test('should get the start of the given decade', () => { - const date = Temporal.ZonedDateTime.from('2023-07-16T12:34:56.789+01:00[Europe/London]') - const result = startOf(date, 'decade') - const expected = Temporal.ZonedDateTime.from('2020-01-01T00:00:00.000+00:00[Europe/London]') + const date = Temporal.ZonedDateTime.from( + '2023-07-16T12:34:56.789+01:00[Europe/London]', + ) + const result = startOf({ date, unit: 'decade' }) + const expected = Temporal.ZonedDateTime.from( + '2020-01-01T00:00:00.000+00:00[Europe/London]', + ) expect(result.equals(expected)).toBe(true) }) }) diff --git a/packages/time/src/utils/dateDefaults.ts b/packages/time/src/utils/dateDefaults.ts index 8caa36ae..5c854dc4 100644 --- a/packages/time/src/utils/dateDefaults.ts +++ b/packages/time/src/utils/dateDefaults.ts @@ -1,4 +1,5 @@ import type { Temporal } from '@js-temporal/polyfill' +import { Locale } from '../formatter/shared' export interface IDateDefaults { calendar: Temporal.CalendarLike diff --git a/packages/time/src/utils/getFirstDayOfWeek.ts b/packages/time/src/utils/getFirstDayOfWeek.ts index 31224f1a..2c43fae0 100644 --- a/packages/time/src/utils/getFirstDayOfWeek.ts +++ b/packages/time/src/utils/getFirstDayOfWeek.ts @@ -1,8 +1,11 @@ import { Temporal } from '@js-temporal/polyfill' -export const getFirstDayOfWeek = (currWeek: string, locale: Intl.UnicodeBCP47LocaleIdentifier | Intl.Locale = 'en-US') => { - const date = Temporal.PlainDate.from(currWeek); - const loc = new Intl.Locale(locale); - const { firstDay } = loc.getWeekInfo(); - return date.subtract({ days: (date.dayOfWeek - firstDay + 7) % 7 }); +export const getFirstDayOfWeek = ( + currWeek: string, + locale: Intl.UnicodeBCP47LocaleIdentifier | Intl.Locale = 'en-US', +) => { + const date = Temporal.PlainDate.from(currWeek) + const loc = new Intl.Locale(locale) + const { firstDay } = loc.getWeekInfo() + return date.subtract({ days: (date.dayOfWeek - firstDay + 7) % 7 }) } diff --git a/packages/time/src/utils/parseDate.ts b/packages/time/src/utils/parseDate.ts index be15482e..584fa52e 100644 --- a/packages/time/src/utils/parseDate.ts +++ b/packages/time/src/utils/parseDate.ts @@ -1,7 +1,7 @@ import { z } from 'zod' -import type { ZodSafeParseResult } from 'zod' +import type { SafeParseReturnType } from 'zod' -type ParseDateResult = ZodSafeParseResult +type ParseDateResult = SafeParseReturnType export type PossibleDate = string | number | Date diff --git a/packages/time/src/utils/startOf.ts b/packages/time/src/utils/startOf.ts index 67c492bf..d564e92c 100644 --- a/packages/time/src/utils/startOf.ts +++ b/packages/time/src/utils/startOf.ts @@ -16,7 +16,7 @@ interface StartOfParams { export function startOf({ date, unit, - firstDayOfWeek = 1 + firstDayOfWeek = 1, }: StartOfParams): Temporal.ZonedDateTime { let startDate: Temporal.ZonedDateTime @@ -28,7 +28,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break case 'week': { @@ -39,7 +39,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break } @@ -51,7 +51,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break case 'year': @@ -63,7 +63,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break case 'workWeek': { @@ -74,7 +74,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break } @@ -88,7 +88,7 @@ export function startOf({ second: 0, millisecond: 0, microsecond: 0, - nanosecond: 0 + nanosecond: 0, }) break default: @@ -96,4 +96,4 @@ export function startOf({ } return startDate -} \ No newline at end of file +} diff --git a/packages/time/tests/parse.test.ts b/packages/time/tests/parseDate.test.ts similarity index 100% rename from packages/time/tests/parse.test.ts rename to packages/time/tests/parseDate.test.ts diff --git a/packages/time/vite.config.ts b/packages/time/vite.config.ts index 563b01ac..5b360ab1 100644 --- a/packages/time/vite.config.ts +++ b/packages/time/vite.config.ts @@ -7,7 +7,7 @@ const config = defineConfig({ dir: './tests', watch: false, environment: 'jsdom', - setupFiles: ['./vitest-setup.js'], + setupFiles: ['./test-setup.ts'], coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, typecheck: { enabled: true }, }, From d2a89c7106d42850dc17c83d5a075d7a4734512a Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 17:55:29 +0100 Subject: [PATCH 147/163] test: update temporal mocks --- .../react-time/src/tests/useCalendar.test.tsx | 173 ++++++++++-------- 1 file changed, 95 insertions(+), 78 deletions(-) diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 006e5d40..727aab37 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -1,23 +1,23 @@ -import { Temporal } from '@js-temporal/polyfill'; -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { act, renderHook } from '@testing-library/react'; -import { CalendarCore } from '@tanstack/time'; -import { useStore } from '@tanstack/react-store'; -import { useCalendar } from '../useCalendar'; -import type { Mock } from 'vitest'; -import type { Event } from '@tanstack/time'; +import { Temporal } from '@js-temporal/polyfill' +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { act, renderHook } from '@testing-library/react' +import { CalendarCore } from '@tanstack/time' +import { useStore } from '@tanstack/react-store' +import { useCalendar } from '../useCalendar' +import type { Mock } from 'vitest' +import type { Event } from '@tanstack/time' vi.mock('@tanstack/time', () => { return { CalendarCore: vi.fn(), - }; -}); + } +}) vi.mock('@tanstack/react-store', () => { return { useStore: vi.fn(), - }; -}); + } +}) describe('useCalendar', () => { const events: Event[] = [ @@ -33,20 +33,23 @@ describe('useCalendar', () => { end: '2024-06-02T16:00:00', title: 'Event 2', }, - ]; + ] - const mockDate = Temporal.PlainDate.from('2024-06-15'); - const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00'); - const mockTimeZone = 'America/New_York'; + const mockDate = Temporal.PlainDate.from('2024-06-15') + const mockDateTime = Temporal.PlainDateTime.from('2024-06-15T10:00') + const mockTimeZone = 'America/New_York' - let mockStore: any; - let calendarCoreInstance: any; + let mockStore: any + let calendarCoreInstance: any beforeEach(() => { - vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate); - vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime); - vi.spyOn(Temporal.Now, 'zonedDateTime').mockReturnValue(Temporal.Now.zonedDateTime('gregory', mockTimeZone)); - vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue(Temporal.Now.zonedDateTimeISO()); + vi.spyOn(Temporal.Now, 'plainDateISO').mockReturnValue(mockDate) + vi.spyOn(Temporal.Now, 'plainDateTimeISO').mockReturnValue(mockDateTime) + const mockZonedDateTime = + Temporal.Now.zonedDateTimeISO(mockTimeZone).withCalendar('gregory') + vi.spyOn(Temporal.Now, 'zonedDateTimeISO').mockReturnValue( + mockZonedDateTime, + ) mockStore = { subscribe: vi.fn(), @@ -55,7 +58,7 @@ describe('useCalendar', () => { activeDate: mockDate, viewMode: { value: 1, unit: 'month' }, }, - }; + } calendarCoreInstance = { getDaysWithEvents: vi.fn().mockReturnValue([]), @@ -68,120 +71,134 @@ describe('useCalendar', () => { getEventProps: vi.fn().mockReturnValue({}), groupDaysBy: vi.fn().mockReturnValue([]), store: mockStore, - }; - - (CalendarCore as Mock).mockImplementation(() => calendarCoreInstance); - - (useStore as Mock).mockImplementation((store) => store.state); - }); + } + ;(CalendarCore as Mock).mockImplementation(() => calendarCoreInstance) + ;(useStore as Mock).mockImplementation((store) => store.state) + }) test('should initialize CalendarCore with provided options', () => { renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, timeZone: mockTimeZone }), - ); + useCalendar({ + events, + viewMode: { value: 1, unit: 'month' }, + timeZone: mockTimeZone, + }), + ) expect(CalendarCore).toHaveBeenCalledWith({ events, viewMode: { value: 1, unit: 'month' }, timeZone: mockTimeZone, - }); - }); + }) + }) test('should call goToPreviousPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) act(() => { - result.current.goToPreviousPeriod(); - }); + result.current.goToPreviousPeriod() + }) - expect(calendarCoreInstance.goToPreviousPeriod).toHaveBeenCalled(); - }); + expect(calendarCoreInstance.goToPreviousPeriod).toHaveBeenCalled() + }) test('should call goToNextPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) act(() => { - result.current.goToNextPeriod(); - }); + result.current.goToNextPeriod() + }) - expect(calendarCoreInstance.goToNextPeriod).toHaveBeenCalled(); - }); + expect(calendarCoreInstance.goToNextPeriod).toHaveBeenCalled() + }) test('should call changeViewMode on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) act(() => { - result.current.changeViewMode({ value: 1, unit: 'week' }); - }); + result.current.changeViewMode({ value: 1, unit: 'week' }) + }) - expect(calendarCoreInstance.changeViewMode).toHaveBeenCalledWith({ value: 1, unit: 'week' }); - }); + expect(calendarCoreInstance.changeViewMode).toHaveBeenCalledWith({ + value: 1, + unit: 'week', + }) + }) test('should call goToSpecificPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) - const specificDate = '2024-06-01'; + const specificDate = '2024-06-01' act(() => { - result.current.goToSpecificPeriod(specificDate); - }); + result.current.goToSpecificPeriod(specificDate) + }) - expect(calendarCoreInstance.goToSpecificPeriod).toHaveBeenCalledWith(specificDate); - }); + expect(calendarCoreInstance.goToSpecificPeriod).toHaveBeenCalledWith( + specificDate, + ) + }) test('should call goToCurrentPeriod on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) act(() => { - result.current.goToNextPeriod(); - result.current.goToCurrentPeriod(); - }); + result.current.goToNextPeriod() + result.current.goToCurrentPeriod() + }) - expect(calendarCoreInstance.goToCurrentPeriod).toHaveBeenCalled(); - }); + expect(calendarCoreInstance.goToCurrentPeriod).toHaveBeenCalled() + }) test('should call getEventProps on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'week' } }), - ); + ) act(() => { - result.current.getEventProps('1'); - }); + result.current.getEventProps('1') + }) - expect(calendarCoreInstance.getEventProps).toHaveBeenCalledWith('1'); - }); + expect(calendarCoreInstance.getEventProps).toHaveBeenCalledWith('1') + }) test('should call getDaysNames on CalendarCore instance', () => { const { result } = renderHook(() => - useCalendar({ events, viewMode: { value: 1, unit: 'month' }, locale: 'en-US' }), - ); + useCalendar({ + events, + viewMode: { value: 1, unit: 'month' }, + locale: 'en-US', + }), + ) act(() => { - result.current.getDaysNames('short'); - }); + result.current.getDaysNames('short') + }) - expect(calendarCoreInstance.getDaysNames).toHaveBeenCalledWith('short'); - }); + expect(calendarCoreInstance.getDaysNames).toHaveBeenCalledWith('short') + }) test('should call groupDaysBy on CalendarCore instance', () => { const { result } = renderHook(() => useCalendar({ events, viewMode: { value: 1, unit: 'month' } }), - ); + ) act(() => { - result.current.groupDaysBy({ days: [], unit: 'month' }); - }); - - expect(calendarCoreInstance.groupDaysBy).toHaveBeenCalledWith({ days: [], unit: 'month' }); - }); -}); + result.current.groupDaysBy({ days: [], unit: 'month' }) + }) + + expect(calendarCoreInstance.groupDaysBy).toHaveBeenCalledWith({ + days: [], + unit: 'month', + }) + }) +}) From dc32b51d24722d3c241e898cafc3db8fd3385ce1 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 17:56:46 +0100 Subject: [PATCH 148/163] chore: update the lock file --- pnpm-lock.yaml | 106 ++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7154c396..7452d6d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: version: 0.8.10(solid-js@1.9.10) '@tanstack/config': specifier: ^0.18.0 - version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) '@tanstack/eslint-config': specifier: ^0.1.0 version: 0.1.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) @@ -65,7 +65,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/coverage-istanbul': specifier: ^1.3.1 - version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)) + version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)) eslint: specifier: ^8.56.0 version: 8.57.1 @@ -131,10 +131,10 @@ importers: version: typescript@5.3.3 vite: specifier: ^6.3.3 - version: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) vitest: specifier: ^1.3.1 - version: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) + version: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) vue: specifier: ^3.3.4 version: 3.5.26(typescript@5.9.3) @@ -147,7 +147,7 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^0.2.32 - version: 0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)) + version: 0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)) '@angular/common': specifier: ^17.1.2 version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) @@ -199,7 +199,7 @@ importers: version: 0.0.3 '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.7.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) packages/solid-time: dependencies: @@ -212,7 +212,7 @@ importers: version: 1.9.10 vite-plugin-solid: specifier: ^2.10.1 - version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) packages/time: dependencies: @@ -225,6 +225,9 @@ importers: '@tanstack/store': specifier: ^0.4.1 version: 0.4.1 + zod: + specifier: ^3.24.4 + version: 3.25.76 devDependencies: csstype: specifier: ^3.2.3 @@ -241,7 +244,7 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.2 - version: 5.2.4(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) '@vue/composition-api': specifier: ^1.7.2 version: 1.7.2(vue@3.5.26(typescript@5.9.3)) @@ -7191,6 +7194,9 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zone.js@0.14.10: resolution: {integrity: sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==} @@ -7203,9 +7209,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2))': + '@analogjs/vite-plugin-angular@0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2))': dependencies: - '@angular-devkit/build-angular': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2) + '@angular-devkit/build-angular': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) ts-morph: 21.0.1 '@angular-devkit/architect@0.2100.5(chokidar@4.0.3)': @@ -7215,13 +7221,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)': + '@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.2100.5(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.104.0(esbuild@0.26.0)))(webpack@5.104.0(esbuild@0.26.0)) '@angular-devkit/core': 21.0.5(chokidar@4.0.3) - '@angular/build': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2) + '@angular/build': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -7320,7 +7326,7 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular/build@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))(yaml@2.8.2)': + '@angular/build@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) @@ -7359,7 +7365,7 @@ snapshots: less: 4.4.2 lmdb: 3.4.3 postcss: 8.5.6 - vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - chokidar @@ -7459,7 +7465,7 @@ snapshots: '@babel/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helpers': 7.28.4 @@ -9272,12 +9278,12 @@ snapshots: - supports-color - typescript - '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': + '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: '@tanstack/eslint-config': 0.2.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) '@tanstack/publish-config': 0.1.1 '@tanstack/typedoc-config': 0.2.0(typescript@5.9.3) - '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -9354,12 +9360,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': + '@tanstack/vite-config@0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.55.1) - vite-plugin-dts: 4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) - vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + vite-plugin-dts: 4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - rollup @@ -9828,7 +9834,7 @@ snapshots: dependencies: vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -9836,16 +9842,16 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) vue: 3.5.26(typescript@5.9.3) - '@vitest/coverage-istanbul@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3))': + '@vitest/coverage-istanbul@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))': dependencies: debug: 4.4.3 istanbul-lib-coverage: 3.2.2 @@ -9856,7 +9862,7 @@ snapshots: magicast: 0.3.5 picocolors: 1.1.1 test-exclude: 6.0.0 - vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3) + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -14253,13 +14259,13 @@ snapshots: dependencies: semver: 7.6.0 - vite-node@1.6.1(@types/node@18.19.130): + vite-node@1.6.1(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): dependencies: cac: 6.7.14 debug: 4.4.3 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@18.19.130) + vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - less @@ -14271,7 +14277,7 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@18.19.130) '@rollup/pluginutils': 5.3.0(rollup@4.55.1) @@ -14284,17 +14290,17 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 @@ -14302,25 +14308,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.10 solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@18.19.130): + vite@5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -14328,8 +14334,11 @@ snapshots: optionalDependencies: '@types/node': 18.19.130 fsevents: 2.3.3 + less: 4.4.2 + sass: 1.93.2 + terser: 5.44.0 - vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -14340,7 +14349,10 @@ snapshots: optionalDependencies: '@types/node': 18.19.130 fsevents: 2.3.3 - jiti: 1.21.0 + jiti: 2.6.1 + less: 4.4.2 + sass: 1.93.2 + terser: 5.44.0 yaml: 2.8.2 vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): @@ -14360,11 +14372,11 @@ snapshots: terser: 5.44.0 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@1.21.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3): + vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -14383,8 +14395,8 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.21(@types/node@18.19.130) - vite-node: 1.6.1(@types/node@18.19.130) + vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + vite-node: 1.6.1(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.130 @@ -14721,4 +14733,6 @@ snapshots: zod@3.22.4: {} + zod@3.25.76: {} + zone.js@0.14.10: {} From e2b5cb76053aa0179ac89a8ffa24c93b90d8d8d4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 18:26:18 +0100 Subject: [PATCH 149/163] fix: lint --- packages/react-time/.eslintrc.cjs | 13 - packages/react-time/eslint.config.js | 33 + packages/react-time/package.json | 5 +- .../react-time/src/tests/useCalendar.test.tsx | 2 +- .../react-time/src/useCalendar/useCalendar.ts | 69 +- pnpm-lock.yaml | 595 +++++++++++++++++- 6 files changed, 667 insertions(+), 50 deletions(-) delete mode 100644 packages/react-time/.eslintrc.cjs create mode 100644 packages/react-time/eslint.config.js diff --git a/packages/react-time/.eslintrc.cjs b/packages/react-time/.eslintrc.cjs deleted file mode 100644 index 5f504cf4..00000000 --- a/packages/react-time/.eslintrc.cjs +++ /dev/null @@ -1,13 +0,0 @@ -// @ts-check - -/** @type {import('eslint').Linter.Config} */ -const config = { - extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'], - rules: { - 'react/jsx-key': ['error', { checkFragmentShorthand: true }], - 'react-hooks/exhaustive-deps': 'error', - 'react/no-children-prop': 'off', - }, -} - -module.exports = config diff --git a/packages/react-time/eslint.config.js b/packages/react-time/eslint.config.js new file mode 100644 index 00000000..ec5db3c6 --- /dev/null +++ b/packages/react-time/eslint.config.js @@ -0,0 +1,33 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +import pluginReactCompiler from 'eslint-plugin-react-compiler' +import pluginReactHooks from 'eslint-plugin-react-hooks' +import rootConfig from '../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + 'react-compiler': pluginReactCompiler, + }, + rules: { + '@eslint-react/dom/no-missing-button-type': 'off', + 'react-compiler/react-compiler': 'error', + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + }, + }, + { + files: ['**/__tests__/**'], + rules: { + // 'react-compiler/react-compiler': 'off', + }, + }, +] diff --git a/packages/react-time/package.json b/packages/react-time/package.json index a5218020..4b6f206f 100644 --- a/packages/react-time/package.json +++ b/packages/react-time/package.json @@ -68,6 +68,9 @@ }, "devDependencies": { "@types/use-sync-external-store": "^0.0.3", - "@vitejs/plugin-react": "^4.4.1" + "@vitejs/plugin-react": "^5.1.2", + "eslint-plugin-react-compiler": "19.1.0-rc.2", + "@eslint-react/eslint-plugin": "^2.5.1", + "eslint-plugin-react-hooks": "^7.0.1" } } diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index 727aab37..f2aa1c56 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -20,7 +20,7 @@ vi.mock('@tanstack/react-store', () => { }) describe('useCalendar', () => { - const events: Event[] = [ + const events: Array> = [ { id: '1', start: '2024-06-01T10:00:00', diff --git a/packages/react-time/src/useCalendar/useCalendar.ts b/packages/react-time/src/useCalendar/useCalendar.ts index 23441b09..eb31e4e7 100644 --- a/packages/react-time/src/useCalendar/useCalendar.ts +++ b/packages/react-time/src/useCalendar/useCalendar.ts @@ -1,16 +1,28 @@ import { useCallback, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' -import { CalendarCore, type Event } from '@tanstack/time' -import type { CalendarApi, CalendarCoreOptions, Resource } from '@tanstack/time' +import { CalendarCore } from '@tanstack/time' +import type { + CalendarApi, + CalendarCoreOptions, + Event, + Resource, +} from '@tanstack/time' -export const useCalendar = = Event>( +export const useCalendar = < + TResource extends Resource, + TEvent extends Event = Event, +>( options: CalendarCoreOptions, ): CalendarApi & { isPending: boolean } => { - const [calendarCore] = useState(() => new CalendarCore(options)) + const [calendarCore] = useState( + () => new CalendarCore(options), + ) const state = useStore(calendarCore.store) const [isPending, startTransition] = useTransition() - const goToPreviousPeriod = useCallback(() => { + const goToPreviousPeriod = useCallback< + typeof calendarCore.goToPreviousPeriod + >(() => { startTransition(() => { calendarCore.goToPreviousPeriod() }) @@ -22,29 +34,48 @@ export const useCalendar = (() => { + const goToCurrentPeriod = useCallback< + typeof calendarCore.goToCurrentPeriod + >(() => { startTransition(() => { calendarCore.goToCurrentPeriod() }) }, [calendarCore, startTransition]) - const goToSpecificPeriod = useCallback((date) => { - startTransition(() => { - calendarCore.goToSpecificPeriod(date) - }) - }, [calendarCore, startTransition]) + const goToSpecificPeriod = useCallback< + typeof calendarCore.goToSpecificPeriod + >( + (date) => { + startTransition(() => { + calendarCore.goToSpecificPeriod(date) + }) + }, + [calendarCore, startTransition], + ) - const changeViewMode = useCallback((newViewMode) => { - startTransition(() => { - calendarCore.changeViewMode(newViewMode) - }) - }, [calendarCore, startTransition]) + const changeViewMode = useCallback( + (newViewMode) => { + startTransition(() => { + calendarCore.changeViewMode(newViewMode) + }) + }, + [calendarCore, startTransition], + ) - const getEventProps = useCallback((id) => calendarCore.getEventProps(id), [calendarCore]) + const getEventProps = useCallback( + (id) => calendarCore.getEventProps(id), + [calendarCore], + ) - const groupDaysBy = useCallback((props) => calendarCore.groupDaysBy(props), [calendarCore]) + const groupDaysBy = useCallback( + (props) => calendarCore.groupDaysBy(props), + [calendarCore], + ) - const getDaysNames = useCallback((props) => calendarCore.getDaysNames(props), [calendarCore]) + const getDaysNames = useCallback( + (props) => calendarCore.getDaysNames(props), + [calendarCore], + ) return { activeDate: state.activeDate.toString(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7452d6d9..efab6dcc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,12 +194,21 @@ importers: specifier: ^1.2.0 version: 1.6.0(react@18.3.1) devDependencies: + '@eslint-react/eslint-plugin': + specifier: ^2.5.1 + version: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@types/use-sync-external-store': specifier: ^0.0.3 version: 0.0.3 '@vitejs/plugin-react': - specifier: ^4.4.1 - version: 4.7.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + specifier: ^5.1.2 + version: 5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + eslint-plugin-react-compiler: + specifier: 19.1.0-rc.2 + version: 19.1.0-rc.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) packages/solid-time: dependencies: @@ -600,6 +609,13 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -1498,10 +1514,65 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-react/ast@2.5.4': + resolution: {integrity: sha512-msXiopenLUSCW7rMlL0bML2mbHxHiFISHqcIk84+yY+uHYJkBIPRjR+l9F7VQNoLoKXRK979JLY5X/Un308S5w==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/core@2.5.4': + resolution: {integrity: sha512-gt095e07n88b3PlohgFTqxOBep5KiAxyaoSXVLclx0xYFr8y+iFd47tpAf33NBGpwASxAWrvUa2tWdlQJFRBRw==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/eff@2.5.4': + resolution: {integrity: sha512-d8ilwpRaOSBaFsO0SNQWvZWrDSla7NXMAMUsH/ibaxc0CwxhrTWyOd4webgiIW16Gyg3maf1NlOZpE934LcFEg==} + engines: {node: '>=20.19.0'} + + '@eslint-react/eslint-plugin@2.5.4': + resolution: {integrity: sha512-kuX/92aUC3nNlcH8/HckjVyClZnZSQWZekm+KYnJYX3zaf96ixzs79WnS/iqFoVunEUHrhzkGbRZyfcI7/c8Dg==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/shared@2.5.4': + resolution: {integrity: sha512-8vkcQ9vAVFwD0xR2jGaj3CmTjhbmMserZZgAePPYIQ4MwSToPpMZX1Jhh1gpmzOHKvm+PXwLHVRqzzTkWD6i3A==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/var@2.5.4': + resolution: {integrity: sha512-R9+n5BR47ovUlLnRA2q00QIGy3l+rvIRrXmVul4R7XS1ay7OHgPJ4UI8+jDtfjMqBysHM2R4Xw6nFaDyQcpX4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@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} @@ -1510,9 +1581,25 @@ packages: resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1526,6 +1613,10 @@ packages: 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'} + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -2188,12 +2279,12 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.47': resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -2817,9 +2908,9 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@5.1.2': + resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3255,6 +3346,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3978,12 +4072,59 @@ packages: peerDependencies: eslint: '>=8.23.0' + eslint-plugin-react-compiler@19.1.0-rc.2: + resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react-dom@2.5.4: + resolution: {integrity: sha512-qCKGfmQKD9mBolJh8hS/RmiAYSk6QUfUOc5cagve40WrPygUP/ExSE3y5xMc0uI30QHKkbY8wivljfadU3Q0VQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-hooks-extra@2.5.4: + resolution: {integrity: sha512-lkhwvhCvsWmUsE7ouqp+DFNnDwE2pYRiuLTQB5FhXezxKb4EwcC2K4Sy19UzYwMyb/FXWQPDEgk3iBh7SsoIdQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + 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-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-naming-convention@2.5.4: + resolution: {integrity: sha512-8VaukpMxQ4msJAIKDawA2wPsMML0Mmcfwn31+viBUIMy8R03AkYP1KhOfeOy5uVqL0EZMsQIQHPn0Qs4ITK7Pg==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-web-api@2.5.4: + resolution: {integrity: sha512-JS/FF74b9clGFF80KR9J1Gb+s8XPH9USdwFMBFmYZW7KqN9XhECaKck7X3qmyg5nIsDGeIn4d/Sl0dHdfsKn/w==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-x@2.5.4: + resolution: {integrity: sha512-rrI6/LZ0NZJ9j0ogYY8jZxh+kLCgXez1HgipaN2QBgwvFhfABc449GkzCfSDqzHBN8NuVwlJZD3OuHdXV9rj9g==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} @@ -4016,6 +4157,16 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4133,6 +4284,10 @@ packages: 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==} engines: {node: '>=8'} @@ -4156,6 +4311,10 @@ packages: 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@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -4299,6 +4458,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -4365,6 +4528,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -4604,6 +4773,12 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-immutable-type@5.0.1: + resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==} + peerDependencies: + eslint: '*' + typescript: '>=4.7.4' + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -5791,8 +5966,8 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} react@18.3.1: @@ -6290,6 +6465,9 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-ts@2.3.1: + resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6516,6 +6694,9 @@ packages: ts-morph@21.0.1: resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -7191,12 +7372,21 @@ packages: peerDependencies: zod: ^3.18.0 + zod-validation-error@3.5.4: + resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.24.4 + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + zone.js@0.14.10: resolution: {integrity: sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==} @@ -7543,6 +7733,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -7632,6 +7835,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.5 @@ -7701,6 +7913,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -8489,8 +8709,102 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} + '@eslint-react/ast@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.5.4 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + string-ts: 2.3.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/core@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + birecord: 0.1.1 + eslint: 9.39.2(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/eff@2.5.4': {} + + '@eslint-react/eslint-plugin@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-react-dom: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/shared@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.5.4 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + zod: 4.3.5 + transitivePeerDependencies: + - supports-color + + '@eslint-react/var@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -8505,16 +8819,44 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} '@eslint/js@9.39.2': {} + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@gerrit0/mini-shiki@1.27.2': dependencies: '@shikijs/engine-oniguruma': 1.29.2 '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -8527,6 +8869,8 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} + '@inquirer/ansi@1.0.2': {} '@inquirer/confirm@5.1.19(@types/node@18.19.130)': @@ -9112,10 +9456,10 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.47': {} + '@rolldown/pluginutils@1.0.0-beta.53': {} + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 @@ -9700,6 +10044,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/types@8.52.0': {} @@ -9759,6 +10115,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -9834,14 +10201,14 @@ snapshots: dependencies: vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - '@vitejs/plugin-react@4.7.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 + react-refresh: 0.18.0 vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -10399,6 +10766,8 @@ snapshots: binary-extensions@2.3.0: {} + birecord@0.1.1: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -11293,10 +11662,126 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.5) + eslint: 9.39.2(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 3.5.4(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-dom@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + compare-versions: 6.1.1 + eslint: 9.39.2(jiti@2.6.1) + string-ts: 2.3.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks-extra@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + string-ts: 2.3.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 3.5.4(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-naming-convention@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + compare-versions: 6.1.1 + eslint: 9.39.2(jiti@2.6.1) + string-ts: 2.3.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-web-api@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + string-ts: 2.3.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-x@2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.4 + '@eslint-react/shared': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + compare-versions: 6.1.1 + eslint: 9.39.2(jiti@2.6.1) + is-immutable-type: 5.0.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + string-ts: 2.3.1 + ts-api-utils: 2.4.0(typescript@5.9.3) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -11381,6 +11866,47 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -11519,6 +12045,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -11550,6 +12080,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flat@5.0.2: {} flatted@3.3.3: {} @@ -11701,6 +12236,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + globals@15.15.0: {} globals@16.5.0: {} @@ -11755,6 +12292,12 @@ snapshots: he@1.2.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 @@ -12001,6 +12544,16 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-immutable-type@5.0.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + ts-declaration-location: 1.0.7(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -13232,7 +13785,7 @@ snapshots: react-is@18.3.1: {} - react-refresh@0.17.0: {} + react-refresh@0.18.0: {} react@18.3.1: dependencies: @@ -13808,6 +14361,8 @@ snapshots: string-argv@0.3.2: {} + string-ts@2.3.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -14039,6 +14594,8 @@ snapshots: '@ts-morph/common': 0.22.0 code-block-writer: 12.0.0 + ts-pattern@5.9.0: {} + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -14731,8 +15288,14 @@ snapshots: dependencies: zod: 3.22.4 + zod-validation-error@3.5.4(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.22.4: {} zod@3.25.76: {} + zod@4.3.5: {} + zone.js@0.14.10: {} From 40f58d3eba6e59475bb77b74eb3c558c1026deee Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 18:50:17 +0100 Subject: [PATCH 150/163] fix: lint --- eslint.config.js | 7 +- package.json | 4 +- packages/react-time/eslint.config.js | 14 +- pnpm-lock.yaml | 436 ++++++++------------------- 4 files changed, 128 insertions(+), 333 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 298f5e10..3e219887 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,8 +1,3 @@ import { tanstackConfig } from '@tanstack/eslint-config' -export default [ - ...tanstackConfig, - { - // Custom rules go here - }, -] +export default [...tanstackConfig, {}] diff --git a/package.json b/package.json index c7629c8a..5aa23643 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@solidjs/testing-library": "^0.8.6", "@tanstack/config": "^0.18.0", - "@tanstack/eslint-config": "^0.1.0", + "@tanstack/eslint-config": "^0.3.4", "@tanstack/publish-config": "^0.1.0", "@tanstack/typedoc-config": "^0.2.0", "@testing-library/jest-dom": "^6.4.2", @@ -53,7 +53,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitest/coverage-istanbul": "^1.3.1", - "eslint": "^8.56.0", + "eslint": "^9.36.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", diff --git a/packages/react-time/eslint.config.js b/packages/react-time/eslint.config.js index ec5db3c6..dd590b56 100644 --- a/packages/react-time/eslint.config.js +++ b/packages/react-time/eslint.config.js @@ -1,11 +1,10 @@ // @ts-check import pluginReact from '@eslint-react/eslint-plugin' -import pluginReactCompiler from 'eslint-plugin-react-compiler' +import reactCompiler from 'eslint-plugin-react-compiler' import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from '../../eslint.config.js' -/** @type {import('eslint').Linter.Config[]} */ export default [ ...rootConfig, { @@ -15,19 +14,12 @@ export default [ { plugins: { 'react-hooks': pluginReactHooks, - 'react-compiler': pluginReactCompiler, + 'react-compiler': reactCompiler, }, rules: { - '@eslint-react/dom/no-missing-button-type': 'off', - 'react-compiler/react-compiler': 'error', 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', - }, - }, - { - files: ['**/__tests__/**'], - rules: { - // 'react-compiler/react-compiler': 'off', + 'react-compiler/react-compiler': 'error', }, }, ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efab6dcc..0164d674 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,10 +23,10 @@ importers: version: 0.8.10(solid-js@1.9.10) '@tanstack/config': specifier: ^0.18.0 - version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) '@tanstack/eslint-config': - specifier: ^0.1.0 - version: 0.1.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) + specifier: ^0.3.4 + version: 0.3.4(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@tanstack/publish-config': specifier: ^0.1.0 version: 0.1.1 @@ -59,31 +59,31 @@ importers: version: 18.3.7(@types/react@18.3.27) '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-istanbul': specifier: ^1.3.1 version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)) eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: ^9.36.0 + version: 9.39.2(jiti@2.6.1) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.2(eslint@8.57.1) + version: 9.1.2(eslint@9.39.2(jiti@2.6.1)) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1) + version: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-import: specifier: ^2.29.1 - version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: specifier: ^7.33.2 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + version: 4.6.2(eslint@9.39.2(jiti@2.6.1)) jsdom: specifier: ^24.0.0 version: 24.1.3 @@ -1565,18 +1565,10 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@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/js@9.39.2': resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1600,19 +1592,10 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@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'} @@ -2471,14 +2454,14 @@ packages: '@solidjs/router': optional: true - '@stylistic/eslint-plugin-js@4.4.1': - resolution: {integrity: sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==} + '@stylistic/eslint-plugin@4.4.1': + resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' - '@stylistic/eslint-plugin@4.4.1': - resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} + '@stylistic/eslint-plugin@5.7.0': + resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -2488,14 +2471,16 @@ packages: engines: {node: '>=18'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@tanstack/eslint-config@0.1.0': - resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} - engines: {node: '>=18'} - '@tanstack/eslint-config@0.2.0': resolution: {integrity: sha512-KUJUDvYFaqxekc8IwgokZ7+yJUoR7LPFu788VSfCxtsbqP/wZyppuoaToC/74LIFjBKIHJQN+YdvBFedD2fqJg==} engines: {node: '>=18'} + '@tanstack/eslint-config@0.3.4': + resolution: {integrity: sha512-5Ou1XWJRCTx5G8WoCbT7+6nQ4iNdsISzBAc4lXpFy2fEOO7xioOSPvcPIv+r9V0drPPETou2tr6oLGZZ909FKg==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 + '@tanstack/publish-config@0.1.1': resolution: {integrity: sha512-gw46t9d8fkf4ICU+EVcQdVWWRRux3K3+DM/vO3xp3KrU4/BlQOZgP9BFEWY7znU5pqD5rJ3ozrTbv9ezw78Qyw==} engines: {node: '>=18'} @@ -2804,9 +2789,6 @@ packages: resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3788,10 +3770,6 @@ packages: 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==} @@ -4135,10 +4113,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - 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-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4151,11 +4125,9 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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 + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} @@ -4171,9 +4143,9 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - 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.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -4280,10 +4252,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - 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'} @@ -4307,10 +4275,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - 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'} @@ -4454,10 +4418,6 @@ packages: engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -4824,10 +4784,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - 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'} @@ -6602,9 +6558,6 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thingies@2.5.0: resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} @@ -6725,10 +6678,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -7129,12 +7078,6 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - vue-eslint-parser@9.4.3: - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - vue@2.6.14: resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==} deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. @@ -8704,11 +8647,6 @@ snapshots: '@esbuild/win32-x64@0.26.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) @@ -8805,20 +8743,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - 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.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 @@ -8833,8 +8757,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - '@eslint/js@9.39.2': {} '@eslint/object-schema@2.1.7': {} @@ -8857,18 +8779,8 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} '@inquirer/ansi@1.0.2': {} @@ -9604,16 +9516,10 @@ snapshots: '@testing-library/dom': 10.4.1 solid-js: 1.9.10 - '@stylistic/eslint-plugin-js@4.4.1(eslint@8.57.1)': + '@stylistic/eslint-plugin@4.4.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - - '@stylistic/eslint-plugin@4.4.1(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -9622,9 +9528,19 @@ snapshots: - supports-color - typescript - '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@2.6.1))': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/types': 8.52.0 + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + + '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: - '@tanstack/eslint-config': 0.2.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3) + '@tanstack/eslint-config': 0.2.0(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@tanstack/publish-config': 0.1.1 '@tanstack/typedoc-config': 0.2.0(typescript@5.9.3) '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) @@ -9638,15 +9554,15 @@ snapshots: - typescript - vite - '@tanstack/eslint-config@0.1.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3)': + '@tanstack/eslint-config@0.2.0(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.2 - '@stylistic/eslint-plugin-js': 4.4.1(eslint@8.57.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - eslint-plugin-n: 17.23.1(eslint@8.57.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 4.4.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.52.0(eslint@8.57.1)(typescript@5.9.3) - vue-eslint-parser: 9.4.3(eslint@8.57.1) + typescript-eslint: 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -9654,18 +9570,18 @@ snapshots: - supports-color - typescript - '@tanstack/eslint-config@0.2.0(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.2 - '@stylistic/eslint-plugin': 4.4.1(eslint@8.57.1)(typescript@5.9.3) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - eslint-plugin-n: 17.23.1(eslint@8.57.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.7.0(eslint@9.39.2(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.52.0(eslint@8.57.1)(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@8.57.1) + typescript-eslint: 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - - eslint - eslint-import-resolver-node - supports-color - typescript @@ -9936,16 +9852,16 @@ snapshots: dependencies: '@types/node': 18.19.130 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9956,15 +9872,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/type-utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.52.0 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -9972,27 +9888,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.52.0 '@typescript-eslint/types': 8.52.0 '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10020,30 +9936,18 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.52.0(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.52.0 @@ -10090,31 +9994,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -10136,8 +10029,6 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -10833,7 +10724,7 @@ snapshots: builtins@5.1.0: dependencies: - semver: 7.6.0 + semver: 7.7.3 bundle-name@4.1.0: dependencies: @@ -11224,10 +11115,6 @@ snapshots: 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: {} @@ -11542,14 +11429,14 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.1): + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) semver: 7.7.3 - eslint-config-prettier@9.1.2(eslint@8.57.1): + eslint-config-prettier@9.1.2(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -11566,46 +11453,46 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/parser': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@8.57.1): + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) + eslint: 9.39.2(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@typescript-eslint/types': 8.52.0 comment-parser: 1.4.1 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.1.1 @@ -11613,12 +11500,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11627,9 +11514,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11641,18 +11528,18 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.23.1(eslint@8.57.1)(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) enhanced-resolve: 5.18.4 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 @@ -11710,9 +11597,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): dependencies: @@ -11782,7 +11669,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -11790,7 +11677,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -11809,11 +11696,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -11823,48 +11705,7 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - 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.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color + eslint-visitor-keys@5.0.0: {} eslint@9.39.2(jiti@2.6.1): dependencies: @@ -11913,11 +11754,11 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@9.6.1: + espree@11.0.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 5.0.0 esprima@4.0.1: {} @@ -12041,10 +11882,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -12074,12 +11911,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -12232,10 +12063,6 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@15.15.0: {} @@ -12581,8 +12408,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@3.0.0: {} is-plain-object@2.0.4: @@ -13291,7 +13116,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.6.0 + semver: 7.7.3 npm-normalize-package-bin@2.0.0: {} @@ -13301,7 +13126,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.6.0 + semver: 7.7.3 validate-npm-package-name: 5.0.1 npm-packlist@5.1.3: @@ -13316,7 +13141,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.3 - semver: 7.6.0 + semver: 7.7.3 npm-run-path@4.0.1: dependencies: @@ -14516,8 +14341,6 @@ snapshots: text-extensions@2.4.0: {} - text-table@0.2.0: {} - thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -14621,8 +14444,6 @@ snapshots: type-detect@4.1.0: {} - type-fest@0.20.2: {} - type-fest@0.6.0: {} type-is@1.6.18: @@ -14685,13 +14506,13 @@ snapshots: typesafe-actions@5.1.0: {} - typescript-eslint@8.52.0(eslint@8.57.1)(typescript@5.9.3): + typescript-eslint@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.52.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14814,7 +14635,7 @@ snapshots: version-selector-type@3.0.0: dependencies: - semver: 7.6.0 + semver: 7.7.3 vite-node@1.6.1(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): dependencies: @@ -14980,10 +14801,10 @@ snapshots: optionalDependencies: '@vue/composition-api': 1.7.2(vue@3.5.26(typescript@5.9.3)) - vue-eslint-parser@10.2.0(eslint@8.57.1): + vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -14992,19 +14813,6 @@ snapshots: transitivePeerDependencies: - supports-color - vue-eslint-parser@9.4.3(eslint@8.57.1): - dependencies: - debug: 4.4.3 - eslint: 8.57.1 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - lodash: 4.17.21 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - vue@2.6.14: {} vue@2.7.16: From e536094ece0a7606d132cfd36fabb816281ee699 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 18:53:21 +0100 Subject: [PATCH 151/163] fix: lint --- packages/time/tests/setup.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/time/tests/setup.ts b/packages/time/tests/setup.ts index 4b75b9e3..471fa900 100644 --- a/packages/time/tests/setup.ts +++ b/packages/time/tests/setup.ts @@ -1,3 +1 @@ -// Set timezone for all tests process.env.TZ = 'America/New_York' - From e1785a4d593668d797a264df0a086c6e6b587c6c Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 23:10:30 +0100 Subject: [PATCH 152/163] feat: basic example --- examples/react/index.html | 15 +++ examples/react/package.json | 39 +++++++ examples/react/src/index.css | 1 + examples/react/src/index.tsx | 196 ++++++++++++++++++++++++++++++++++ examples/react/tsconfig.json | 24 +++++ examples/react/vite.config.ts | 7 ++ 6 files changed, 282 insertions(+) create mode 100644 examples/react/index.html create mode 100644 examples/react/package.json create mode 100644 examples/react/src/index.css create mode 100644 examples/react/src/index.tsx create mode 100644 examples/react/tsconfig.json create mode 100644 examples/react/vite.config.ts diff --git a/examples/react/index.html b/examples/react/index.html new file mode 100644 index 00000000..aac08d95 --- /dev/null +++ b/examples/react/index.html @@ -0,0 +1,15 @@ + + + + + + + + TanStack Time React Example App + + + +

+ + + diff --git a/examples/react/package.json b/examples/react/package.json new file mode 100644 index 00000000..424b953e --- /dev/null +++ b/examples/react/package.json @@ -0,0 +1,39 @@ +{ + "name": "@tanstack/time-example-react", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsc" + }, + "dependencies": { + "@js-temporal/polyfill": "catalog:", + "@tailwindcss/vite": "^4.1.18", + "@tanstack/react-store": "^0.4.1", + "@tanstack/react-time": "workspace:*", + "@tanstack/time": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@types/react": "^18.2.45", + "@types/react-dom": "^18.0.5", + "@vitejs/plugin-react": "^5.1.2", + "vite": "^6.3.3" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/react/src/index.css b/examples/react/src/index.css new file mode 100644 index 00000000..d4b50785 --- /dev/null +++ b/examples/react/src/index.css @@ -0,0 +1 @@ +@import 'tailwindcss'; diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx new file mode 100644 index 00000000..0c47c54a --- /dev/null +++ b/examples/react/src/index.tsx @@ -0,0 +1,196 @@ +import * as React from 'react' +import { createRoot } from 'react-dom/client' +import { Temporal } from '@js-temporal/polyfill' +import { useCalendar } from '@tanstack/react-time' +import type { Event } from '@tanstack/time' +import './index.css' + +const sampleEvents: Event[] = [ + { + id: '1', + start: '2024-06-10T09:00:00', + end: '2024-06-10T10:00:00', + title: 'Team Meeting', + }, + { + id: '2', + start: '2024-06-12T11:00:00', + end: '2024-06-12T12:00:00', + title: 'Project Review', + }, + { + id: '3', + start: '2024-06-12T14:00:00', + end: '2024-06-12T15:30:00', + title: 'Client Call', + }, + { + id: '4', + start: '2024-06-15T10:00:00', + end: '2024-06-15T11:00:00', + title: 'Workshop', + }, + { + id: '5', + start: '2024-06-20T09:00:00', + end: '2024-06-22T17:00:00', + title: 'Multi-day Conference', + }, +] + +export default function App() { + const calendar = useCalendar({ + events: sampleEvents, + viewMode: { value: 1, unit: 'month' }, + locale: 'en-US', + }) + + const daysNames = calendar.getDaysNames('short') + + return ( +
+

+ TanStack Time Calendar Example +

+ +
+
+ + + +
+ {Temporal.PlainDate.from(calendar.currentPeriod).toLocaleString( + 'en-US', + { + month: 'long', + year: 'numeric', + }, + )} +
+
+ +
+ + + +
+
+ +
+ {daysNames.map((dayName: string) => ( +
+ {dayName} +
+ ))} + + {calendar.days.map((day: (typeof calendar.days)[0]) => { + const dateStr = day.date.toString() + const isToday = day.isToday + const isInCurrentPeriod = day.isInCurrentPeriod + + return ( +
+
+ {day.date.day} +
+
+ {day.events.map((event: Event) => { + const eventProps = calendar.getEventProps(event.id) + const hasOverlappingEvents = + (eventProps?.overlappingEvents.length ?? 0) > 0 + return ( +
+ {event.title} +
+ ) + })} +
+
+ ) + })} +
+ + {calendar.isPending && ( +
Loading...
+ )} +
+ ) +} + +const rootElement = document.getElementById('root')! + +createRoot(rootElement).render( + + + , +) diff --git a/examples/react/tsconfig.json b/examples/react/tsconfig.json new file mode 100644 index 00000000..79af5f23 --- /dev/null +++ b/examples/react/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/examples/react/vite.config.ts b/examples/react/vite.config.ts new file mode 100644 index 00000000..0616e595 --- /dev/null +++ b/examples/react/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + plugins: [react(), tailwindcss()], +}) From 5ad20ac92137d053fbd96444d4859c08a1f5fe85 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 23:10:55 +0100 Subject: [PATCH 153/163] feat: basic example --- pnpm-lock.yaml | 440 +++++++++++++++++++++++++++++++++++++++----- pnpm-workspace.yaml | 1 + 2 files changed, 390 insertions(+), 51 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0164d674..74186b40 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: version: 0.8.10(solid-js@1.9.10) '@tanstack/config': specifier: ^0.18.0 - version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + version: 0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) '@tanstack/eslint-config': specifier: ^0.3.4 version: 0.3.4(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -65,7 +65,7 @@ importers: version: 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-istanbul': specifier: ^1.3.1 - version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)) + version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)) eslint: specifier: ^9.36.0 version: 9.39.2(jiti@2.6.1) @@ -131,14 +131,54 @@ importers: version: typescript@5.3.3 vite: specifier: ^6.3.3 - version: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + version: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) vitest: specifier: ^1.3.1 - version: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + version: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) vue: specifier: ^3.3.4 version: 3.5.26(typescript@5.9.3) + examples/react: + dependencies: + '@js-temporal/polyfill': + specifier: 'catalog:' + version: 0.5.1 + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + '@tanstack/react-store': + specifier: ^0.4.1 + version: 0.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-time': + specifier: workspace:* + version: link:../../packages/react-time + '@tanstack/time': + specifier: workspace:* + version: link:../../packages/time + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + devDependencies: + '@types/react': + specifier: ^18.2.45 + version: 18.3.27 + '@types/react-dom': + specifier: ^18.0.5 + version: 18.3.7(@types/react@18.3.27) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.2(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite: + specifier: ^6.3.3 + version: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + packages/angular-time: dependencies: '@tanstack/time': @@ -147,7 +187,7 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^0.2.32 - version: 0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)) + version: 0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tailwindcss@4.1.18)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)) '@angular/common': specifier: ^17.1.2 version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) @@ -202,7 +242,7 @@ importers: version: 0.0.3 '@vitejs/plugin-react': specifier: ^5.1.2 - version: 5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + version: 5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@9.39.2(jiti@2.6.1)) @@ -221,7 +261,7 @@ importers: version: 1.9.10 vite-plugin-solid: specifier: ^2.10.1 - version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) packages/time: dependencies: @@ -253,7 +293,7 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.2 - version: 5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) '@vue/composition-api': specifier: ^1.7.2 version: 1.7.2(vue@3.5.26(typescript@5.9.3)) @@ -2466,6 +2506,96 @@ packages: peerDependencies: eslint: '>=9.0.0' + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.18': + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + '@tanstack/config@0.18.2': resolution: {integrity: sha512-QuEq2Aky5pEJcDA7eZrnp4f2Fyq3X8iXPdcXmbPpanFXoBJYZCWVH9npkRuaNYNIuL2suFeaGzjwW4HhyWNq9g==} engines: {node: '>=18'} @@ -5086,6 +5216,76 @@ packages: webpack: optional: true + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -6521,6 +6721,9 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -7342,9 +7545,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2))': + '@analogjs/vite-plugin-angular@0.2.45(@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tailwindcss@4.1.18)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2))': dependencies: - '@angular-devkit/build-angular': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) + '@angular-devkit/build-angular': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tailwindcss@4.1.18)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) ts-morph: 21.0.1 '@angular-devkit/architect@0.2100.5(chokidar@4.0.3)': @@ -7354,13 +7557,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': + '@angular-devkit/build-angular@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tailwindcss@4.1.18)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.2100.5(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.104.0(esbuild@0.26.0)))(webpack@5.104.0(esbuild@0.26.0)) '@angular-devkit/core': 21.0.5(chokidar@4.0.3) - '@angular/build': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) + '@angular/build': 21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2) '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3) '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -7416,6 +7619,7 @@ snapshots: '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) '@angular/platform-browser': 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)) esbuild: 0.26.0 + tailwindcss: 4.1.18 transitivePeerDependencies: - '@angular/compiler' - '@rspack/core' @@ -7459,7 +7663,7 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular/build@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': + '@angular/build@21.0.5(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(typescript@5.9.3))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.14.10)))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))(yaml@2.8.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2100.5(chokidar@4.0.3) @@ -7469,7 +7673,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.19(@types/node@18.19.130) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) beasties: 0.3.5 browserslist: 4.28.1 esbuild: 0.26.0 @@ -7490,7 +7694,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.16.0 - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) watchpack: 2.4.4 optionalDependencies: '@angular/core': 17.3.12(rxjs@7.8.2)(zone.js@0.14.10) @@ -7498,7 +7702,8 @@ snapshots: less: 4.4.2 lmdb: 3.4.3 postcss: 8.5.6 - vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + tailwindcss: 4.1.18 + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - chokidar @@ -9538,12 +9743,80 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 - '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + + '@tanstack/config@0.18.2(@types/node@18.19.130)(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: '@tanstack/eslint-config': 0.2.0(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@tanstack/publish-config': 0.1.1 '@tanstack/typedoc-config': 0.2.0(typescript@5.9.3) - '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + '@tanstack/vite-config': 0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -9620,12 +9893,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@tanstack/vite-config@0.2.0(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.55.1) - vite-plugin-dts: 4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) - vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite-plugin-dts: 4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - rollup @@ -10088,11 +10361,11 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - '@vitejs/plugin-react@5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.2(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -10100,16 +10373,28 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-react@5.1.2(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))': dependencies: - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.53 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.4(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) vue: 3.5.26(typescript@5.9.3) - '@vitest/coverage-istanbul@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))': + '@vitest/coverage-istanbul@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0))': dependencies: debug: 4.4.3 istanbul-lib-coverage: 3.2.2 @@ -10120,7 +10405,7 @@ snapshots: magicast: 0.3.5 picocolors: 1.1.1 test-exclude: 6.0.0 - vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + vitest: 1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -11096,8 +11381,7 @@ snapshots: detect-libc@1.0.3: optional: true - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} detect-node@2.1.0: {} @@ -12739,6 +13023,55 @@ snapshots: optionalDependencies: webpack: 5.104.0(esbuild@0.26.0) + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lines-and-columns@1.2.4: {} lines-and-columns@2.0.3: {} @@ -14305,6 +14638,8 @@ snapshots: symbol-tree@3.2.4: {} + tailwindcss@4.1.18: {} + tapable@2.3.0: {} tar-stream@2.2.0: @@ -14637,13 +14972,13 @@ snapshots: dependencies: semver: 7.7.3 - vite-node@1.6.1(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): + vite-node@1.6.1(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0): dependencies: cac: 6.7.14 debug: 4.4.3 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - less @@ -14655,7 +14990,7 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): + vite-plugin-dts@4.2.3(@types/node@18.19.130)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@18.19.130) '@rollup/pluginutils': 5.3.0(rollup@4.55.1) @@ -14668,17 +15003,17 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): + vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 @@ -14686,25 +15021,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.10 solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): + vite@5.4.21(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -14713,10 +15048,11 @@ snapshots: '@types/node': 18.19.130 fsevents: 2.3.3 less: 4.4.2 + lightningcss: 1.30.2 sass: 1.93.2 terser: 5.44.0 - vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): + vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -14729,11 +15065,12 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 + lightningcss: 1.30.2 sass: 1.93.2 terser: 5.44.0 yaml: 2.8.2 - vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): + vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -14746,15 +15083,16 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 + lightningcss: 1.30.2 sass: 1.93.2 terser: 5.44.0 yaml: 2.8.2 - vitefu@1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)): optionalDependencies: - vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) - vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(sass@1.93.2)(terser@5.44.0): + vitest@1.6.1(@types/node@18.19.130)(jsdom@24.1.3)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -14773,8 +15111,8 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) - vite-node: 1.6.1(@types/node@18.19.130)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) + vite: 5.4.21(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) + vite-node: 1.6.1(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.130 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6edbe516..66b45d3b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - 'packages/**' + - 'examples/**' catalog: '@js-temporal/polyfill': 0.5.1 From 07ef4417a3cc2e3b3baf7a7fcedc268c585e0ef4 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sat, 10 Jan 2026 23:34:08 +0100 Subject: [PATCH 154/163] feat: basic example --- examples/react/src/index.tsx | 141 ++++++++++++++++++---------- examples/react/tsconfig.json | 1 + packages/time/src/calendar/index.ts | 2 +- packages/time/src/index.ts | 1 + 4 files changed, 95 insertions(+), 50 deletions(-) diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx index 0c47c54a..7e430200 100644 --- a/examples/react/src/index.tsx +++ b/examples/react/src/index.tsx @@ -47,6 +47,21 @@ export default function App() { const daysNames = calendar.getDaysNames('short') + const groupedWeeks = + calendar.viewMode.unit === 'month' + ? calendar.groupDaysBy({ + days: calendar.days, + unit: 'week', + fillMissingDays: true, + }) + : calendar.viewMode.unit === 'week' + ? calendar.groupDaysBy({ + days: calendar.days, + unit: 'week', + fillMissingDays: true, + }) + : [[...calendar.days]] + return (

@@ -121,63 +136,91 @@ export default function App() {

-
- {daysNames.map((dayName: string) => ( -
- {dayName} -
- ))} - - {calendar.days.map((day: (typeof calendar.days)[0]) => { - const dateStr = day.date.toString() - const isToday = day.isToday - const isInCurrentPeriod = day.isInCurrentPeriod +
+
+ {daysNames.map((dayName: string) => ( +
+ {dayName} +
+ ))} +
- return ( + {groupedWeeks.map( + ( + week: Array<(typeof calendar.days)[0] | null>, + weekIndex: number, + ) => (
-
- {day.date.day} -
-
- {day.events.map((event: Event) => { - const eventProps = calendar.getEventProps(event.id) - const hasOverlappingEvents = - (eventProps?.overlappingEvents.length ?? 0) > 0 + {week.map((day: (typeof calendar.days)[0] | null) => { + if (!day) { return (
+ ) + } + + const dateStr = day.date.toString() + const isToday = day.isToday + const isInCurrentPeriod = day.isInCurrentPeriod + + return ( +
+
- {event.title} + {day.date.day}
- ) - })} -
+
+ {day.events.map((event: Event) => { + const eventProps = calendar.getEventProps(event.id) + const hasOverlappingEvents = + (eventProps?.overlappingEvents.length ?? 0) > 0 + return ( +
+ {event.title} +
+ ) + })} +
+
+ ) + })}
- ) - })} + ), + )}
{calendar.isPending && ( diff --git a/examples/react/tsconfig.json b/examples/react/tsconfig.json index 79af5f23..31f76ac1 100644 --- a/examples/react/tsconfig.json +++ b/examples/react/tsconfig.json @@ -13,6 +13,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, + "jsx": "react-jsx", /* Linting */ "strict": true, diff --git a/packages/time/src/calendar/index.ts b/packages/time/src/calendar/index.ts index a16de01b..2355a017 100644 --- a/packages/time/src/calendar/index.ts +++ b/packages/time/src/calendar/index.ts @@ -2,4 +2,4 @@ export * from './types' export * from './splitMultiDayEvents' export * from './generateDateRange' export * from './getEventProps' -export * from './groupDaysBy' \ No newline at end of file +export * from './groupDaysBy' diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 0e4c6531..e763977a 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -3,3 +3,4 @@ */ export * from './utils' export * from './core' +export * from './calendar' From bad6db82d9730d45e35a168f1bcc47eaf3097481 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 11 Jan 2026 18:40:50 +0100 Subject: [PATCH 155/163] feat: calendar --- examples/react/src/index.tsx | 76 +++++---- examples/react/vite.config.ts | 14 ++ packages/time/package.json | 1 + .../time/src/calendar/generateDateRange.ts | 4 - packages/time/src/calendar/types.ts | 6 + packages/time/src/core/calendar.ts | 153 +++++++++++------- .../src/tests/constrainDateToRange.test.ts | 128 +++++++++++++++ packages/time/src/tests/isDateInRange.test.ts | 150 +++++++++++++++++ packages/time/src/tests/isValidDate.test.ts | 16 -- .../time/src/tests/parseDateRange.test.ts | 147 +++++++++++++++++ .../time/src/utils/buildFinalFormatter.ts | 45 ------ packages/time/src/utils/dateRange.ts | 119 ++++++++++++++ packages/time/src/utils/index.ts | 3 +- packages/time/src/utils/isValidDate.ts | 12 -- packages/time/src/utils/parse.ts | 138 ---------------- packages/time/src/utils/validateDate.ts | 27 ---- packages/time/tests/validateDate.test.ts | 15 -- 17 files changed, 702 insertions(+), 352 deletions(-) create mode 100644 packages/time/src/tests/constrainDateToRange.test.ts create mode 100644 packages/time/src/tests/isDateInRange.test.ts delete mode 100644 packages/time/src/tests/isValidDate.test.ts create mode 100644 packages/time/src/tests/parseDateRange.test.ts delete mode 100644 packages/time/src/utils/buildFinalFormatter.ts create mode 100644 packages/time/src/utils/dateRange.ts delete mode 100644 packages/time/src/utils/isValidDate.ts delete mode 100644 packages/time/src/utils/parse.ts delete mode 100644 packages/time/src/utils/validateDate.ts delete mode 100644 packages/time/tests/validateDate.test.ts diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx index 7e430200..0b7b41a7 100644 --- a/examples/react/src/index.tsx +++ b/examples/react/src/index.tsx @@ -39,28 +39,40 @@ const sampleEvents: Event[] = [ ] export default function App() { - const calendar = useCalendar({ + const { + changeViewMode, + getEventProps, + groupDaysBy, + getDaysNames, + days, + viewMode, + isPending, + goToPreviousPeriod, + goToNextPeriod, + goToCurrentPeriod, + currentPeriod, + } = useCalendar({ events: sampleEvents, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', }) - const daysNames = calendar.getDaysNames('short') + const daysNames = getDaysNames('short') const groupedWeeks = - calendar.viewMode.unit === 'month' - ? calendar.groupDaysBy({ - days: calendar.days, + viewMode.unit === 'month' + ? groupDaysBy({ + days: days, unit: 'week', fillMissingDays: true, }) - : calendar.viewMode.unit === 'week' - ? calendar.groupDaysBy({ - days: calendar.days, + : viewMode.unit === 'week' + ? groupDaysBy({ + days: days, unit: 'week', fillMissingDays: true, }) - : [[...calendar.days]] + : [[...days]] return (
@@ -71,42 +83,39 @@ export default function App() {
- {Temporal.PlainDate.from(calendar.currentPeriod).toLocaleString( - 'en-US', - { - month: 'long', - year: 'numeric', - }, - )} + {Temporal.PlainDate.from(currentPeriod).toLocaleString('en-US', { + month: 'long', + year: 'numeric', + })}
{groupedWeeks.map( - ( - week: Array<(typeof calendar.days)[0] | null>, - weekIndex: number, - ) => ( + (week: Array<(typeof days)[0] | null>, weekIndex: number) => (
- {week.map((day: (typeof calendar.days)[0] | null) => { + {week.map((day: (typeof days)[0] | null) => { if (!day) { return (
{day.events.map((event: Event) => { - const eventProps = calendar.getEventProps(event.id) + const eventProps = getEventProps(event.id) const hasOverlappingEvents = (eventProps?.overlappingEvents.length ?? 0) > 0 return ( @@ -223,7 +229,7 @@ export default function App() { )}
- {calendar.isPending && ( + {isPending && (
Loading...
)}
diff --git a/examples/react/vite.config.ts b/examples/react/vite.config.ts index 0616e595..a0516d38 100644 --- a/examples/react/vite.config.ts +++ b/examples/react/vite.config.ts @@ -1,7 +1,21 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' +import path from 'path' export default defineConfig({ plugins: [react(), tailwindcss()], + resolve: { + conditions: ['development', 'import', 'module', 'browser', 'default'], + alias: { + '@tanstack/react-time': path.resolve( + __dirname, + '../../packages/react-time/src/index.ts', + ), + '@tanstack/time': path.resolve( + __dirname, + '../../packages/time/src/index.ts', + ), + }, + }, }) diff --git a/packages/time/package.json b/packages/time/package.json index 0f6d9d0f..371738e1 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -38,6 +38,7 @@ "type": "module", "exports": { ".": { + "development": "./src/index.ts", "import": { "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.js" diff --git a/packages/time/src/calendar/generateDateRange.ts b/packages/time/src/calendar/generateDateRange.ts index 7aeaaca7..9a13c062 100644 --- a/packages/time/src/calendar/generateDateRange.ts +++ b/packages/time/src/calendar/generateDateRange.ts @@ -1,13 +1,9 @@ import { Temporal } from '@js-temporal/polyfill' -import { validateDate } from '../utils/validateDate' export const generateDateRange = ( start: string, end: string, ): Temporal.PlainDate[] => { - validateDate({ date: start }) - validateDate({ date: end }) - const startDate = Temporal.PlainDate.from(start) const endDate = Temporal.PlainDate.from(end) const dates: Temporal.PlainDate[] = [] diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index 5d7b8886..b6bd5f72 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -1,4 +1,5 @@ import type { Temporal } from '@js-temporal/polyfill' +import { PossibleDate } from '../utils/parseDate' export type Resource = string | null @@ -28,3 +29,8 @@ export type Day< isToday: boolean isInCurrentPeriod: boolean } + +export interface DateRange { + start: PossibleDate | null + end: PossibleDate | null +} diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index 252e9b68..0111b345 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -1,13 +1,26 @@ import { Store } from '@tanstack/store' import { Temporal } from '@js-temporal/polyfill' -import { getFirstDayOfMonth, getFirstDayOfWeek } from '../utils' +import { + getFirstDayOfMonth, + getFirstDayOfWeek, + parseDateRange, + constrainDateToRange, + isDateInRange, +} from '../utils' import { generateDateRange } from '../calendar/generateDateRange' import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents' import { getEventProps } from '../calendar/getEventProps' import { groupDaysBy } from '../calendar/groupDaysBy' import { getDateDefaults } from '../utils/dateDefaults' import type { GroupDaysByProps } from '../calendar/groupDaysBy' -import type { CalendarStore, Day, Event, Resource } from '../calendar/types' +import type { + CalendarStore, + DateRange, + Day, + Event, + Resource, +} from '../calendar/types' +import type { ParsedDateRange } from '../utils/dateRange' import '@bart-krakowski/get-week-info-polyfill' @@ -45,6 +58,8 @@ export interface CalendarCoreOptions< calendar?: Temporal.CalendarLike /** Optional resources to be used in the calendar. */ resources?: TResource[] | null + /** Optional range of dates to be used in the calendar. */ + range?: DateRange } /** @@ -108,28 +123,45 @@ export interface CalendarApi< * such as navigating through time periods, handling events, and adjusting settings. * @template TEvent - The type of events managed by the calendar. */ +interface ParsedCalendarCoreOptions< + TResource extends Resource, + TEvent extends Event, +> extends Omit>, 'range'> { + range: ParsedDateRange +} + export class CalendarCore< TResource extends Resource, TEvent extends Event, > implements CalendarActions { store: Store - options: Required> + options: ParsedCalendarCoreOptions constructor(options: CalendarCoreOptions) { const defaults = getDateDefaults() + const parsedRange = parseDateRange({ + range: options.range, + calendar: defaults.calendar, + }) + this.options = { ...defaults, ...options, events: options.events || null, resources: options.resources || null, + range: parsedRange, } const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) + const initialDate = constrainDateToRange({ + date: now, + range: this.options.range, + }) this.store = new Store({ - currentPeriod: now, - activeDate: now, + currentPeriod: initialDate, + activeDate: initialDate, viewMode: options.viewMode, }) } @@ -205,11 +237,19 @@ export class CalendarCore< ).daysInMonth, }) - return allDays.filter( + const filteredDays = allDays.filter( (day) => Temporal.PlainDate.compare(day, startMonthDate) >= 0 && Temporal.PlainDate.compare(day, endMonthDate) <= 0, ) + + if (this.options.range.start || this.options.range.end) { + return filteredDays.filter((day) => + isDateInRange({ date: day, range: this.options.range }), + ) + } + + return filteredDays } private getEventMap() { @@ -284,121 +324,116 @@ export class CalendarCore< } goToPreviousPeriod() { + let newActiveDate: Temporal.PlainDate + switch (this.store.state.viewMode.unit) { case 'month': { - const newActiveDate = this.store.state.activeDate.subtract({ + newActiveDate = this.store.state.activeDate.subtract({ months: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'week': { - const newActiveDate = this.store.state.activeDate.subtract({ + newActiveDate = this.store.state.activeDate.subtract({ weeks: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'day': { - const newActiveDate = this.store.state.activeDate.subtract({ + newActiveDate = this.store.state.activeDate.subtract({ days: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'workWeek': { - const newActiveDate = this.store.state.activeDate.subtract({ + newActiveDate = this.store.state.activeDate.subtract({ days: 5, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } } + + const constrainedDate = constrainDateToRange({ + date: newActiveDate, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) } goToNextPeriod() { + let newActiveDate: Temporal.PlainDate + switch (this.store.state.viewMode.unit) { case 'month': { - const newActiveDate = this.store.state.activeDate.add({ + newActiveDate = this.store.state.activeDate.add({ months: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'week': { - const newActiveDate = this.store.state.activeDate.add({ + newActiveDate = this.store.state.activeDate.add({ weeks: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'day': { - const newActiveDate = this.store.state.activeDate.add({ + newActiveDate = this.store.state.activeDate.add({ days: this.store.state.viewMode.value, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } case 'workWeek': { - const newActiveDate = this.store.state.activeDate.add({ + newActiveDate = this.store.state.activeDate.add({ days: 5, }) - this.store.setState((prev) => ({ - ...prev, - activeDate: newActiveDate, - currentPeriod: newActiveDate, - })) break } } + + const constrainedDate = constrainDateToRange({ + date: newActiveDate, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) } goToCurrentPeriod() { - const now = Temporal.Now.plainDateISO() + const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) + const constrainedDate = constrainDateToRange({ + date: now, + range: this.options.range, + }) this.store.setState((prev) => ({ ...prev, - activeDate: now, - currentPeriod: now, + activeDate: constrainedDate, + currentPeriod: constrainedDate, })) } goToSpecificPeriod(date: string) { + const targetDate = Temporal.PlainDate.from(date).withCalendar( + this.options.calendar, + ) + const constrainedDate = constrainDateToRange({ + date: targetDate, + range: this.options.range, + }) this.store.setState((prev) => ({ ...prev, - activeDate: Temporal.PlainDate.from(date), - currentPeriod: Temporal.PlainDate.from(date), + activeDate: constrainedDate, + currentPeriod: constrainedDate, })) } diff --git a/packages/time/src/tests/constrainDateToRange.test.ts b/packages/time/src/tests/constrainDateToRange.test.ts new file mode 100644 index 00000000..037aa71d --- /dev/null +++ b/packages/time/src/tests/constrainDateToRange.test.ts @@ -0,0 +1,128 @@ +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { constrainDateToRange } from '../utils' +import type { ParsedDateRange } from '../utils' + +describe('constrainDateToRange', () => { + test('should return date unchanged when range is not specified', () => { + const date = Temporal.PlainDate.from('2024-06-15') + const range: ParsedDateRange = { + start: null, + end: null, + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + }) + + test('should constrain date before range start', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-06-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(range.start) + }) + + test('should constrain date after range end', () => { + const date = Temporal.PlainDate.from('2025-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(range.end) + }) + + test('should return date unchanged when within range', () => { + const date = Temporal.PlainDate.from('2024-06-15') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + }) + + test('should constrain to start when only start is specified', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-06-01'), + end: null, + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(range.start) + }) + + test('should not constrain when date is after start and only start is specified', () => { + const date = Temporal.PlainDate.from('2024-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-06-01'), + end: null, + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + }) + + test('should constrain to end when only end is specified', () => { + const date = Temporal.PlainDate.from('2025-01-01') + const range: ParsedDateRange = { + start: null, + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(range.end) + }) + + test('should not constrain when date is before end and only end is specified', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: null, + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + }) + + test('should constrain to start when date equals start', () => { + const date = Temporal.PlainDate.from('2024-06-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-06-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + expect(result).toEqual(range.start) + }) + + test('should constrain to end when date equals end', () => { + const date = Temporal.PlainDate.from('2024-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = constrainDateToRange({ date, range }) + + expect(result).toEqual(date) + expect(result).toEqual(range.end) + }) +}) diff --git a/packages/time/src/tests/isDateInRange.test.ts b/packages/time/src/tests/isDateInRange.test.ts new file mode 100644 index 00000000..a4b708cb --- /dev/null +++ b/packages/time/src/tests/isDateInRange.test.ts @@ -0,0 +1,150 @@ +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { isDateInRange } from '../utils' +import type { ParsedDateRange } from '../utils' + +describe('isDateInRange', () => { + test('should return true when range is not specified', () => { + const date = Temporal.PlainDate.from('2024-06-15') + const range: ParsedDateRange = { + start: null, + end: null, + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return true when date is within range', () => { + const date = Temporal.PlainDate.from('2024-06-15') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return false when date is before range start', () => { + const date = Temporal.PlainDate.from('2023-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(false) + }) + + test('should return false when date is after range end', () => { + const date = Temporal.PlainDate.from('2025-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(false) + }) + + test('should return true when date equals range start', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return true when date equals range end', () => { + const date = Temporal.PlainDate.from('2024-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return true when date is after start and only start is specified', () => { + const date = Temporal.PlainDate.from('2024-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: null, + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return false when date is before start and only start is specified', () => { + const date = Temporal.PlainDate.from('2023-12-31') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: null, + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(false) + }) + + test('should return true when date is before end and only end is specified', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: null, + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return false when date is after end and only end is specified', () => { + const date = Temporal.PlainDate.from('2025-01-01') + const range: ParsedDateRange = { + start: null, + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(false) + }) + + test('should return true when date equals start and only start is specified', () => { + const date = Temporal.PlainDate.from('2024-01-01') + const range: ParsedDateRange = { + start: Temporal.PlainDate.from('2024-01-01'), + end: null, + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) + + test('should return true when date equals end and only end is specified', () => { + const date = Temporal.PlainDate.from('2024-12-31') + const range: ParsedDateRange = { + start: null, + end: Temporal.PlainDate.from('2024-12-31'), + } + + const result = isDateInRange({ date, range }) + + expect(result).toBe(true) + }) +}) diff --git a/packages/time/src/tests/isValidDate.test.ts b/packages/time/src/tests/isValidDate.test.ts deleted file mode 100644 index 01afdc69..00000000 --- a/packages/time/src/tests/isValidDate.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {describe, expect, test} from 'vitest'; -import {isValidDate} from '../utils/isValidDate'; - -describe('isValidDate', () => { - test('should return true for a valid date', () => { - expect(isValidDate(new Date())).toBe(true); - }) - - test('should return false for an invalid date', () => { - expect(isValidDate(new Date("invalid"))).toBe(false); - }); - - test("should return false for null", () => { - expect(isValidDate(null)).toBe(false); - }); -}); diff --git a/packages/time/src/tests/parseDateRange.test.ts b/packages/time/src/tests/parseDateRange.test.ts new file mode 100644 index 00000000..d2488ed0 --- /dev/null +++ b/packages/time/src/tests/parseDateRange.test.ts @@ -0,0 +1,147 @@ +import { Temporal } from '@js-temporal/polyfill' +import { describe, expect, test } from 'vitest' +import { parseDateRange } from '../utils' + +describe('parseDateRange', () => { + const calendar = 'gregory' + + test('should parse a valid date range with string dates', () => { + const result = parseDateRange({ + range: { + start: '2024-01-01', + end: '2024-12-31', + }, + calendar, + }) + + expect(result.start).toEqual( + Temporal.PlainDate.from('2024-01-01').withCalendar(calendar), + ) + expect(result.end).toEqual( + Temporal.PlainDate.from('2024-12-31').withCalendar(calendar), + ) + }) + + test('should parse a valid date range with Date objects', () => { + const result = parseDateRange({ + range: { + start: new Date('2024-01-01'), + end: new Date('2024-12-31'), + }, + calendar, + }) + + expect(result.start).toEqual( + Temporal.PlainDate.from('2024-01-01').withCalendar(calendar), + ) + expect(result.end).toEqual( + Temporal.PlainDate.from('2024-12-31').withCalendar(calendar), + ) + }) + + test('should parse a range with only start date', () => { + const result = parseDateRange({ + range: { + start: '2024-01-01', + end: null, + }, + calendar, + }) + + expect(result.start).toEqual( + Temporal.PlainDate.from('2024-01-01').withCalendar(calendar), + ) + expect(result.end).toBeNull() + }) + + test('should parse a range with only end date', () => { + const result = parseDateRange({ + range: { + start: null, + end: '2024-12-31', + }, + calendar, + }) + + expect(result.start).toBeNull() + expect(result.end).toEqual( + Temporal.PlainDate.from('2024-12-31').withCalendar(calendar), + ) + }) + + test('should parse an undefined range', () => { + const result = parseDateRange({ + range: undefined, + calendar, + }) + + expect(result.start).toBeNull() + expect(result.end).toBeNull() + }) + + test('should parse a range with equal start and end dates', () => { + const result = parseDateRange({ + range: { + start: '2024-06-15', + end: '2024-06-15', + }, + calendar, + }) + + expect(result.start).toEqual( + Temporal.PlainDate.from('2024-06-15').withCalendar(calendar), + ) + expect(result.end).toEqual( + Temporal.PlainDate.from('2024-06-15').withCalendar(calendar), + ) + }) + + test('should throw error when start date is invalid', () => { + expect(() => + parseDateRange({ + range: { + start: 'invalid-date', + end: '2024-12-31', + }, + calendar, + }), + ).toThrow('Invalid date range') + }) + + test('should throw error when end date is invalid', () => { + expect(() => + parseDateRange({ + range: { + start: '2024-01-01', + end: 'invalid-date', + }, + calendar, + }), + ).toThrow('Invalid date range') + }) + + test('should throw error when start is after end', () => { + expect(() => + parseDateRange({ + range: { + start: '2024-12-31', + end: '2024-01-01', + }, + calendar, + }), + ).toThrow('Invalid date range: start must be before or equal to end') + }) + + test('should apply calendar system to parsed dates', () => { + const result = parseDateRange({ + range: { + start: '2024-01-01', + end: '2024-12-31', + }, + calendar: 'japanese', + }) + + expect(result.start?.calendarId).toBe('japanese') + expect(result.end?.calendarId).toBe('japanese') + }) +}) diff --git a/packages/time/src/utils/buildFinalFormatter.ts b/packages/time/src/utils/buildFinalFormatter.ts deleted file mode 100644 index 251b6e3c..00000000 --- a/packages/time/src/utils/buildFinalFormatter.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { validateDate } from './validateDate' -import { parse as parser } from './parse' - -export interface BuildFinalFormatterOptions { - formatter: Intl.DateTimeFormat - formatterName: string - parse?: (value: string | number | Date) => Date | undefined - forRange?: boolean -} - -/** - * buildFinalFormatter - takes an Intl.DateTimeFormat object and returns a - * basic format function. When calling the format function, it will validate - * the given input date(s) and return the formatted date string. - */ -export function buildFinalFormatter({ - formatter, - formatterName, - parse = parser, - forRange = false, -}: BuildFinalFormatterOptions): ( - date: string | number | Date, - date2?: string | number | Date, -) => string { - return ( - date: string | number | Date, - date2?: string | number | Date, - ): string => { - if (!date) return '' - const trueDate = validateDate({ - date, - parse, - errorMessage: `[${formatterName}] date "${date}" is Invalid.`, - }) - if (!forRange || !date2) { - return formatter.format(trueDate) - } - const endDate = validateDate({ - date: date2, - parse, - errorMessage: `[${formatterName}] second date "${date2}" is Invalid.`, - }) - return formatter.formatRange(trueDate, endDate) - } -} diff --git a/packages/time/src/utils/dateRange.ts b/packages/time/src/utils/dateRange.ts new file mode 100644 index 00000000..be949139 --- /dev/null +++ b/packages/time/src/utils/dateRange.ts @@ -0,0 +1,119 @@ +import { Temporal } from '@js-temporal/polyfill' +import { parseDate } from './parseDate' +import type { DateRange } from '../calendar/types' + +export interface ParsedDateRange { + start: Temporal.PlainDate | null + end: Temporal.PlainDate | null +} + +interface ParseDateRangeParams { + range: DateRange | undefined + calendar: Temporal.CalendarLike +} + +/** + * Parses and validates a date range, converting input dates to Temporal.PlainDate. + * @param {ParseDateRangeParams} params - The parameters for parsing the date range. + * @returns {ParsedDateRange} The parsed date range with Temporal.PlainDate values. + * @throws {Error} If the date range is invalid or start is after end. + */ +export function parseDateRange({ + range, + calendar, +}: ParseDateRangeParams): ParsedDateRange { + const rangeStart = range?.start ? parseDate(range.start) : null + const rangeEnd = range?.end ? parseDate(range.end) : null + + if ((rangeStart && !rangeStart.success) || (rangeEnd && !rangeEnd.success)) { + throw new Error('Invalid date range') + } + + const parsedRangeStart = rangeStart?.success + ? Temporal.PlainDate.from( + rangeStart.data.toISOString().split('T')[0]!, + ).withCalendar(calendar) + : null + + const parsedRangeEnd = rangeEnd?.success + ? Temporal.PlainDate.from( + rangeEnd.data.toISOString().split('T')[0]!, + ).withCalendar(calendar) + : null + + if ( + parsedRangeStart && + parsedRangeEnd && + Temporal.PlainDate.compare(parsedRangeStart, parsedRangeEnd) > 0 + ) { + throw new Error('Invalid date range: start must be before or equal to end') + } + + return { + start: parsedRangeStart, + end: parsedRangeEnd, + } +} + +interface ConstrainDateToRangeParams { + date: Temporal.PlainDate + range: ParsedDateRange +} + +/** + * Constrains a date to be within the specified range. + * If the date is before the range start, returns the start date. + * If the date is after the range end, returns the end date. + * @param {ConstrainDateToRangeParams} params - The parameters for constraining the date. + * @returns {Temporal.PlainDate} The constrained date. + */ +export function constrainDateToRange({ + date, + range, +}: ConstrainDateToRangeParams): Temporal.PlainDate { + if (!range.start && !range.end) { + return date + } + + let constrainedDate = date + + if (range.start) { + if (Temporal.PlainDate.compare(constrainedDate, range.start) < 0) { + constrainedDate = range.start + } + } + + if (range.end) { + if (Temporal.PlainDate.compare(constrainedDate, range.end) > 0) { + constrainedDate = range.end + } + } + + return constrainedDate +} + +interface IsDateInRangeParams { + date: Temporal.PlainDate + range: ParsedDateRange +} + +/** + * Checks if a date is within the specified range. + * @param {IsDateInRangeParams} params - The parameters for checking the date. + * @returns {boolean} True if the date is within the range, false otherwise. + */ +export function isDateInRange({ date, range }: IsDateInRangeParams): boolean { + if (!range.start && !range.end) { + return true + } + + if (range.start && Temporal.PlainDate.compare(date, range.start) < 0) { + return false + } + + if (range.end && Temporal.PlainDate.compare(date, range.end) > 0) { + return false + } + + return true +} diff --git a/packages/time/src/utils/index.ts b/packages/time/src/utils/index.ts index a744ffac..785ca88b 100644 --- a/packages/time/src/utils/index.ts +++ b/packages/time/src/utils/index.ts @@ -1,5 +1,6 @@ -export * from './parse' +export * from './parseDate' export * from './getFirstDayOfMonth' export * from './getFirstDayOfWeek' export * from './startOf' export * from './endOf' +export * from './dateRange' diff --git a/packages/time/src/utils/isValidDate.ts b/packages/time/src/utils/isValidDate.ts deleted file mode 100644 index bbcac2f9..00000000 --- a/packages/time/src/utils/isValidDate.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * isValidDate - * Verifies if a date is a JS Date object and is valid - * @param date Date - * @returns boolean - */ -export function isValidDate(date: any): boolean { - if (Object.prototype.toString.call(date) !== '[object Date]') { - return false - } - return date.getTime() === date.getTime() -} diff --git a/packages/time/src/utils/parse.ts b/packages/time/src/utils/parse.ts deleted file mode 100644 index c7cabd1c..00000000 --- a/packages/time/src/utils/parse.ts +++ /dev/null @@ -1,138 +0,0 @@ -/** - * rfc3339DateTimeOptionalTimeRegex - * Regular expression to match RFC3339 date/time strings with all optional parts - */ -const rfc3339DateTimeOptionalTimeRegex = - /^(?(?\d{4})(?:-(?0[1-9]|1[0-2])(?:-(?0[1-9]|[12][0-9]|3[01]))))(?:(?:T| )(?(?[01][0-9]|2[0-3])(?::(?[0-5][0-9])(?::(?[0-5][0-9])(?:\.(?\d+))?)?)?)?(?Z|[+-](?:2[0-3]|[01][0-9]:[0-5][0-9]))?)?$/i - -/** - * timeOnlyRegex - * Regular expression to match time-only strings - */ -const timeOnlyRegex = - /^((?(?:2[0-3]|[0-1][0-9]))(?::(?[0-5][0-9])(?::(?[0-5][0-9])(?:\.(?\d+))?)?)?)(?:\s(?(?:AM|PM)))?$/i - -/** - * dateOnlyRegex - * Regular expression to match date-only strings - */ -const dateOnlyRegex = - /^(?\d{4})(-(?0[1-9]|1[0-2]))?(-(?0[1-9]|[12][0-9]|3[01]))?(?T| )?(?Z|[+-](?:2[0-3]|[01][0-9]:[0-5][0-9]))?$/i - -/** - * isValidEpoch - * Verifies if a numeric value is a valid epoch date - * @param {number} value - * @returns boolean - */ -function isValidEpoch(value: number): boolean { - return value >= -8.64e12 && value <= +8.64e12 -} - -/** - * parseEpochDateTime - * Parses a numeric value as a date/time epoch - * @param {number} value - * @returns Date - */ -function parseEpochDateTime(value: number): Date { - // if it's a floating point number, assume it's a unix timestamp - const toParse = Number.isInteger(value) ? value : value * 1000 - // but verify - if (isValidEpoch(toParse)) { - return new Date(toParse) - } - throw new Error(`"${value}" is an invalid epoch date value`) -} - -/** - * parseDateTimeString - * Parses a string as a date/time string - * @param {string} value - * @returns Date - */ -function parseDateTimeString(value: string): Date { - const match = - rfc3339DateTimeOptionalTimeRegex.exec(value) ?? dateOnlyRegex.exec(value) - - if (match?.groups) { - const { - year, - month = '01', - day = '01', - hour = '00', - minute = '00', - second = '00', - millisecond = '000', - timezone = '', - } = match.groups - - return new Date( - `${year}-${month}-${day}T${hour}:${minute}:${second}.${millisecond}${timezone}`, - ) - } - throw new Error(`"${value}" is an invalid RFC339 Internet Date Time string`) -} - -/** - * parseTimeOnlyString - * Parses a string as a time-only string - * @param {string} value - * @returns Date - */ -function parseTimeOnlyString(value: string): Date { - const match = timeOnlyRegex.exec(value) - if (match?.groups) { - const now = new Date() - const { - hour = '00', - minute = '00', - second = '00', - millisecond = '000', - meridiem, - } = match.groups - // convert 12 hour time to 24 - let trueHour = Number(hour) - if (meridiem) { - if (trueHour > 12) { - throw new Error(`"${value}" is an invalid time string`) - } - if (meridiem.toLowerCase() === 'pm' && trueHour < 12) { - trueHour += 12 - } - } - now.setHours(trueHour, Number(minute), Number(second), Number(millisecond)) - return now - } - throw new Error(`"${value}" is an invalid time string`) -} - -/** - * parseDateOrTimeString - * Parses a string as a date/time or time string - * @param {string} value - * @returns Date - */ -function parseDateOrTimeString(value: string): Date { - const match = timeOnlyRegex.exec(value) - if (match) { - return parseTimeOnlyString(value) - } - return parseDateTimeString(value) -} - -/** - * parse - * Parses a string, number or Date object as a Date - * @param {string | number | Date} value - * @returns Date | undefined - */ -export function parse(value: string | number | Date): Date | undefined { - if (!value) return undefined - if (typeof value === 'string') { - return parseDateOrTimeString(value) - } else if (typeof value === 'number') { - return parseEpochDateTime(value) - } - return value -} diff --git a/packages/time/src/utils/validateDate.ts b/packages/time/src/utils/validateDate.ts deleted file mode 100644 index dd07aad5..00000000 --- a/packages/time/src/utils/validateDate.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { isValidDate } from './isValidDate' -import { parse as parser } from './parse' - -export interface ValidateDateOptions { - date: string | number | Date - parse?: (value: string | number | Date) => Date | undefined - errorMessage?: string -} - -/** - * validateDate - * Verifies if a date is, or can be, a valid JS Date object - * @param {string | number | Date} date - a value that can be converted to a Date object - * @param {string} errorMessage - error message to throw if date is invalid - * @returns Date - */ -export function validateDate({ - date, - parse = parser, - errorMessage = `Invalid Date: "${date}"`, -}: ValidateDateOptions): Date { - const d = parse(date) - if (!isValidDate(d)) { - throw new Error(`${errorMessage}: "${date}"`) - } - return d as Date -} diff --git a/packages/time/tests/validateDate.test.ts b/packages/time/tests/validateDate.test.ts deleted file mode 100644 index 9b401aeb..00000000 --- a/packages/time/tests/validateDate.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { describe, expect, test } from 'vitest' -import { validateDate } from '../src/utils/validateDate' - -describe('validateDate', () => { - test('should return a valid date', () => { - const date = new Date() - expect(validateDate({ date }).toString()).toBe(date.toString()) - }) - - test('should throw an error for an invalid date', () => { - expect(() => validateDate({ date: new Date('45-92-12') })).toThrowError( - 'Invalid Date: "Invalid Date"', - ) - }) -}) From cbfc28ae55d9dbf0d77a2ec7170c2d080a579d20 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 11 Jan 2026 18:40:56 +0100 Subject: [PATCH 156/163] feat: calendar --- examples/react/src/index.tsx | 4 ++++ examples/react/tsconfig.json | 8 ++++++-- examples/react/vite.config.ts | 1 - 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx index 0b7b41a7..0217cb29 100644 --- a/examples/react/src/index.tsx +++ b/examples/react/src/index.tsx @@ -55,6 +55,10 @@ export default function App() { events: sampleEvents, viewMode: { value: 1, unit: 'month' }, locale: 'en-US', + range: { + start: '2024-05-10', + end: '2024-06-20', + }, }) const daysNames = getDaysNames('short') diff --git a/examples/react/tsconfig.json b/examples/react/tsconfig.json index 31f76ac1..8f168adb 100644 --- a/examples/react/tsconfig.json +++ b/examples/react/tsconfig.json @@ -7,15 +7,19 @@ "lib": ["ES2020", "DOM", "DOM.Iterable"], "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "Bundler", + "baseUrl": ".", "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - /* Linting */ + "paths": { + "@tanstack/react-time": ["../../packages/react-time/src/index.ts"], + "@tanstack/time": ["../../packages/time/src/index.ts"] + }, + "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/examples/react/vite.config.ts b/examples/react/vite.config.ts index a0516d38..33d5d95f 100644 --- a/examples/react/vite.config.ts +++ b/examples/react/vite.config.ts @@ -6,7 +6,6 @@ import path from 'path' export default defineConfig({ plugins: [react(), tailwindcss()], resolve: { - conditions: ['development', 'import', 'module', 'browser', 'default'], alias: { '@tanstack/react-time': path.resolve( __dirname, From 7bb371cac54d0bfe3d6525e6496c2f1214e963ee Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 11 Jan 2026 18:51:35 +0100 Subject: [PATCH 157/163] feat: calendar --- examples/react/src/index.tsx | 27 +++++++++++++++++-- .../react-time/src/tests/useCalendar.test.tsx | 4 +-- packages/time/src/calendar/types.ts | 5 +++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx index 0217cb29..a90135d0 100644 --- a/examples/react/src/index.tsx +++ b/examples/react/src/index.tsx @@ -11,12 +11,17 @@ const sampleEvents: Event[] = [ start: '2024-06-10T09:00:00', end: '2024-06-10T10:00:00', title: 'Team Meeting', + resources: [{ id: 'room-1', label: 'Room 201' }], }, { id: '2', start: '2024-06-12T11:00:00', end: '2024-06-12T12:00:00', title: 'Project Review', + resources: [ + { id: 'room-2', label: 'Room 305' }, + { id: 'person-1', label: 'John Doe' }, + ], }, { id: '3', @@ -29,12 +34,17 @@ const sampleEvents: Event[] = [ start: '2024-06-15T10:00:00', end: '2024-06-15T11:00:00', title: 'Workshop', + resources: [{ id: 'room-3', label: 'Auditorium' }], }, { id: '5', start: '2024-06-20T09:00:00', end: '2024-06-22T17:00:00', title: 'Multi-day Conference', + resources: [ + { id: 'room-4', label: 'Room 101' }, + { id: 'person-2', label: 'Jane Smith' }, + ], }, ] @@ -57,7 +67,7 @@ export default function App() { locale: 'en-US', range: { start: '2024-05-10', - end: '2024-06-20', + end: '2024-08-20', }, }) @@ -220,7 +230,20 @@ export default function App() { } ${eventProps?.isSplitEvent ? 'opacity-70' : 'opacity-100'}`} title={event.title} > - {event.title} +
{event.title}
+ {event.resources && event.resources.length > 0 && ( +
+ {event.resources.map((resource) => ( + + {resource.label} + + ))} +
+ )}
) })} diff --git a/packages/react-time/src/tests/useCalendar.test.tsx b/packages/react-time/src/tests/useCalendar.test.tsx index f2aa1c56..a19d96f2 100644 --- a/packages/react-time/src/tests/useCalendar.test.tsx +++ b/packages/react-time/src/tests/useCalendar.test.tsx @@ -5,7 +5,7 @@ import { CalendarCore } from '@tanstack/time' import { useStore } from '@tanstack/react-store' import { useCalendar } from '../useCalendar' import type { Mock } from 'vitest' -import type { Event } from '@tanstack/time' +import type { Event, Resource } from '@tanstack/time' vi.mock('@tanstack/time', () => { return { @@ -20,7 +20,7 @@ vi.mock('@tanstack/react-store', () => { }) describe('useCalendar', () => { - const events: Array> = [ + const events: Array> = [ { id: '1', start: '2024-06-01T10:00:00', diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index b6bd5f72..a42de522 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -1,7 +1,10 @@ import type { Temporal } from '@js-temporal/polyfill' import { PossibleDate } from '../utils/parseDate' -export type Resource = string | null +export interface Resource { + id: string + label: string +} export interface Event { id: string From 227a2dfff2f1a3d01ef8e4ab5e93e0fb0f614918 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Sun, 11 Jan 2026 18:59:18 +0100 Subject: [PATCH 158/163] feat: calendar --- examples/react/src/index.tsx | 6 +- .../react-time/src/useCalendar/useCalendar.ts | 11 ++++ packages/time/src/core/calendar.ts | 66 +++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/examples/react/src/index.tsx b/examples/react/src/index.tsx index a90135d0..92241a00 100644 --- a/examples/react/src/index.tsx +++ b/examples/react/src/index.tsx @@ -60,6 +60,8 @@ export default function App() { goToPreviousPeriod, goToNextPeriod, goToCurrentPeriod, + canGoPreviousPeriod, + canGoNextPeriod, currentPeriod, } = useCalendar({ events: sampleEvents, @@ -98,7 +100,7 @@ export default function App() {
+ + +
+ {Temporal.PlainDate.from(currentPeriod).toLocaleString('en-US', { + month: 'long', + year: 'numeric', + })} +
+
+ +
+ + +
+
+ +
+
+ {daysNames.map((dayName: string) => ( +
+ {dayName} +
+ ))} +
+ + {groupedWeeks.map( + (week: Array<(typeof days)[0] | null>, weekIndex: number) => ( +
+ {week.map((day: (typeof days)[0] | null) => { + if (!day) { + return ( +
+ ) + } + + const dateStr = day.date.toString() + const isToday = day.isToday + const isInCurrentPeriod = day.isInCurrentPeriod + const isSelected = selectedDates.includes(dateStr) + const isDisabled = + selectableRange.start || selectableRange.end + ? !isDateInRange({ + date: day.date, + range: { + start: rangeStart, + end: rangeEnd, + }, + }) + : false + + return ( + + ) + })} +
+ ), + )} +
+ + {isPending && ( +
Loading...
+ )} +
+ ) +} + +const rootElement = document.getElementById('root')! + +createRoot(rootElement).render( + + + , +) diff --git a/examples/react/date-picker/tsconfig.json b/examples/react/date-picker/tsconfig.json new file mode 100644 index 00000000..f232c145 --- /dev/null +++ b/examples/react/date-picker/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + "moduleResolution": "Bundler", + "baseUrl": ".", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + "paths": { + "@tanstack/react-time": ["../../../packages/react-time/src/index.ts"], + "@tanstack/time": ["../../../packages/time/src/index.ts"] + }, + + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/examples/react/date-picker/vite.config.ts b/examples/react/date-picker/vite.config.ts new file mode 100644 index 00000000..12574b83 --- /dev/null +++ b/examples/react/date-picker/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' +import path from 'path' + +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + '@tanstack/react-time': path.resolve( + __dirname, + '../../../packages/react-time/src/index.ts', + ), + '@tanstack/time': path.resolve( + __dirname, + '../../../packages/time/src/index.ts', + ), + }, + }, +}) diff --git a/packages/react-time/src/index.ts b/packages/react-time/src/index.ts index 5ba2e09d..05da723d 100644 --- a/packages/react-time/src/index.ts +++ b/packages/react-time/src/index.ts @@ -1 +1,3 @@ export { useCalendar } from './useCalendar' +export { useDatePicker } from './useDatePicker' +export type { UseDatePickerApi } from './useDatePicker' diff --git a/packages/react-time/src/useDatePicker/index.ts b/packages/react-time/src/useDatePicker/index.ts new file mode 100644 index 00000000..ed373afb --- /dev/null +++ b/packages/react-time/src/useDatePicker/index.ts @@ -0,0 +1,2 @@ +export { useDatePicker } from './useDatePicker' +export type { UseDatePickerApi } from './useDatePicker' diff --git a/packages/react-time/src/useDatePicker/useDatePicker.ts b/packages/react-time/src/useDatePicker/useDatePicker.ts new file mode 100644 index 00000000..4997ef67 --- /dev/null +++ b/packages/react-time/src/useDatePicker/useDatePicker.ts @@ -0,0 +1,139 @@ +import { useCallback, useState, useTransition } from 'react' +import { useStore } from '@tanstack/react-store' +import { Temporal } from '@js-temporal/polyfill' +import { DatePickerCore } from '@tanstack/time' +import { groupDaysBy } from '@tanstack/time' +import type { DatePickerOptions } from '@tanstack/time' + +export const useDatePicker = (options: DatePickerOptions) => { + const [datePickerCore] = useState(() => new DatePickerCore(options)) + const state = useStore(datePickerCore.store) + const datePickerState = useStore(datePickerCore.datePickerStore) + const [isPending, startTransition] = useTransition() + + const goToPreviousPeriod = useCallback< + typeof datePickerCore.goToPreviousPeriod + >(() => { + startTransition(() => { + datePickerCore.goToPreviousPeriod() + }) + }, [datePickerCore, startTransition]) + + const goToNextPeriod = useCallback< + typeof datePickerCore.goToNextPeriod + >(() => { + startTransition(() => { + datePickerCore.goToNextPeriod() + }) + }, [datePickerCore, startTransition]) + + const goToCurrentPeriod = useCallback< + typeof datePickerCore.goToCurrentPeriod + >(() => { + startTransition(() => { + datePickerCore.goToCurrentPeriod() + }) + }, [datePickerCore, startTransition]) + + const goToSpecificPeriod = useCallback< + typeof datePickerCore.goToSpecificPeriod + >( + (date) => { + startTransition(() => { + datePickerCore.goToSpecificPeriod(date) + }) + }, + [datePickerCore, startTransition], + ) + + const changeViewMode = useCallback( + (newViewMode) => { + startTransition(() => { + datePickerCore.changeViewMode(newViewMode) + }) + }, + [datePickerCore, startTransition], + ) + + const getEventProps = useCallback(() => null, []) + + const groupDaysByCallback = useCallback( + (props: { + days: Array<{ + date: Temporal.PlainDate + events: never[] + isToday: boolean + isInCurrentPeriod: boolean + }> + unit: 'week' | 'month' | 'day' + fillMissingDays?: boolean + }) => { + const daysWithMetadata = props.days.map((day) => ({ + date: day.date, + events: [], + isToday: day.isToday, + isInCurrentPeriod: day.isInCurrentPeriod, + })) + const unit = + props.unit === 'day' + ? 'week' + : props.unit === 'month' + ? 'month' + : 'week' + return groupDaysBy({ + days: daysWithMetadata, + unit: unit as 'month' | 'week' | 'workWeek', + fillMissingDays: props.fillMissingDays ?? true, + weekStartsOn: datePickerCore.getWeekStartsOn(), + locale: datePickerCore.options.locale, + } as any) + }, + [datePickerCore], + ) + + const getDaysNames = useCallback( + (props) => datePickerCore.getDaysNames(props), + [datePickerCore], + ) + + const canGoPreviousPeriod = useCallback< + typeof datePickerCore.canGoPreviousPeriod + >(() => datePickerCore.canGoPreviousPeriod(), [datePickerCore]) + + const canGoNextPeriod = useCallback( + () => datePickerCore.canGoNextPeriod(), + [datePickerCore], + ) + + const selectDate = useCallback( + (date: string) => { + datePickerCore.selectDate(Temporal.PlainDate.from(date)) + }, + [datePickerCore], + ) + + const getSelectedDates = useCallback(() => { + return datePickerCore.getSelectedDates().map((date) => date.toString()) + }, [datePickerCore]) + + return { + activeDate: state.activeDate.toString(), + currentPeriod: state.currentPeriod.toString(), + viewMode: state.viewMode, + days: datePickerCore.getDaysWithEvents(), + getDaysNames, + goToPreviousPeriod, + goToNextPeriod, + goToCurrentPeriod, + goToSpecificPeriod, + canGoPreviousPeriod, + canGoNextPeriod, + changeViewMode, + getEventProps, + isPending, + groupDaysBy: groupDaysByCallback, + selectedDates: Array.from(datePickerState.selectedDates.keys()), + selectDate, + getSelectedDates, + } +} diff --git a/packages/time/src/core/base-date-core.ts b/packages/time/src/core/base-date-core.ts new file mode 100644 index 00000000..187046de --- /dev/null +++ b/packages/time/src/core/base-date-core.ts @@ -0,0 +1,376 @@ +import { Store } from '@tanstack/store' +import { Temporal } from '@js-temporal/polyfill' +import { + getFirstDayOfMonth, + getFirstDayOfWeek, + parseDateRange, + constrainDateToRange, + isDateInRange, +} from '../utils' +import { generateDateRange } from '../calendar/generateDateRange' +import { getDateDefaults } from '../utils/dateDefaults' +import type { CalendarStore, DateRange } from '../calendar/types' +import type { ParsedDateRange } from '../utils/dateRange' + +/** + * Base options interface for date-related core classes. + */ +export interface BaseDateCoreOptions { + /** The initial view mode configuration. */ + viewMode: CalendarStore['viewMode'] + /** Optional locale for date formatting. Uses a BCP 47 language tag. */ + locale?: Intl.UnicodeBCP47LocaleIdentifier + /** Optional time zone specification. */ + timeZone?: Temporal.TimeZoneLike + /** Optional calendar system to be used. */ + calendar?: Temporal.CalendarLike + /** Optional range of dates to be used. */ + range?: DateRange +} + +/** + * Parsed options interface with all required fields and parsed range. + */ +export interface ParsedBaseDateCoreOptions + extends Omit, 'range'> { + range: ParsedDateRange +} + +/** + * Base actions interface for date-related core classes. + */ +export interface BaseDateActions { + /** Navigates to the previous period according to the current view mode. */ + goToPreviousPeriod: () => void + /** Navigates to the next period according to the current view mode. */ + goToNextPeriod: () => void + /** Resets the view to the current period based on today's date. */ + goToCurrentPeriod: () => void + /** Navigates to a specific date. */ + goToSpecificPeriod: (date: string) => void + /** Checks if navigation to the previous period is allowed within the range. */ + canGoPreviousPeriod: () => boolean + /** Checks if navigation to the next period is allowed within the range. */ + canGoNextPeriod: () => boolean + /** Changes the current view mode. */ + changeViewMode: (newViewMode: CalendarStore['viewMode']) => void + /** Retrieves the names of the days of the week, based on the current locale. */ + getDaysNames: (weekday?: 'long' | 'short') => string[] +} + +export abstract class BaseDateCore implements BaseDateActions { + store: Store + options: ParsedBaseDateCoreOptions + + constructor(options: BaseDateCoreOptions) { + const defaults = getDateDefaults() + const parsedRange = parseDateRange({ + range: options.range, + calendar: defaults.calendar, + }) + + this.options = { + locale: options.locale ?? defaults.locale, + timeZone: options.timeZone ?? defaults.timeZone, + calendar: options.calendar ?? defaults.calendar, + viewMode: options.viewMode, + range: parsedRange, + } + + const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) + const initialDate = constrainDateToRange({ + date: now, + range: this.options.range, + }) + + this.store = new Store({ + currentPeriod: initialDate, + activeDate: initialDate, + viewMode: options.viewMode, + }) + } + + protected getFirstDayOfMonth() { + return getFirstDayOfMonth( + this.store.state.currentPeriod + .toString({ calendarName: 'auto' }) + .substring(0, 7), + ) + } + + protected getFirstDayOfWeek() { + return getFirstDayOfWeek( + this.store.state.currentPeriod.toString(), + this.options.locale, + ) + } + + getWeekStartsOn() { + return this.getFirstDayOfWeek().dayOfWeek + } + + protected getCalendarDays() { + const start = + this.store.state.viewMode.unit === 'month' + ? this.getFirstDayOfMonth().subtract({ + days: + (this.getFirstDayOfMonth().dayOfWeek - + (this.getFirstDayOfWeek().dayOfWeek + 1) + + 7) % + 7, + }) + : this.store.state.currentPeriod + + let end: Temporal.PlainDate + switch (this.store.state.viewMode.unit) { + case 'month': { + const lastDayOfMonth = this.getFirstDayOfMonth() + .add({ months: this.store.state.viewMode.value }) + .subtract({ days: 1 }) + const lastDayOfMonthWeekDay = + (lastDayOfMonth.dayOfWeek - + (this.getFirstDayOfWeek().dayOfWeek + 1) + + 7) % + 7 + end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) + break + } + case 'week': { + end = this.getFirstDayOfWeek().add({ + days: 7 * this.store.state.viewMode.value - 1, + }) + break + } + case 'day': { + end = this.store.state.currentPeriod.add({ + days: this.store.state.viewMode.value - 1, + }) + break + } + case 'workWeek': { + end = start.add({ days: 4 }) + break + } + } + + const allDays = generateDateRange(start.toString(), end.toString()) + const startMonthDate = this.store.state.currentPeriod.with({ day: 1 }) + const endMonthDate = this.store.state.currentPeriod + .add({ + months: this.store.state.viewMode.value - 1, + }) + .with({ + day: Temporal.PlainDate.from( + this.store.state.currentPeriod.toString({ calendarName: 'auto' }), + ).daysInMonth, + }) + + const filteredDays = allDays.filter( + (day) => + Temporal.PlainDate.compare(day, startMonthDate) >= 0 && + Temporal.PlainDate.compare(day, endMonthDate) <= 0, + ) + + if (this.options.range.start || this.options.range.end) { + return filteredDays.filter((day) => + isDateInRange({ date: day, range: this.options.range }), + ) + } + + return filteredDays + } + + getDaysNames(weekday: 'long' | 'short' = 'short') { + const baseDate = Temporal.PlainDate.from('2024-01-01') + const firstDayOfWeek = this.getFirstDayOfWeek().dayOfWeek + + return Array.from({ length: 7 }).map((_, i) => + baseDate + .add({ days: (i + (firstDayOfWeek - 1)) % 7 }) + .toLocaleString(this.options.locale, { weekday: weekday }), + ) + } + + changeViewMode(newViewMode: CalendarStore['viewMode']) { + this.store.setState((prev) => ({ + ...prev, + viewMode: newViewMode, + })) + } + + goToPreviousPeriod() { + let newActiveDate: Temporal.PlainDate + + switch (this.store.state.viewMode.unit) { + case 'month': { + newActiveDate = this.store.state.activeDate.subtract({ + months: this.store.state.viewMode.value, + }) + break + } + + case 'week': { + newActiveDate = this.store.state.activeDate.subtract({ + weeks: this.store.state.viewMode.value, + }) + break + } + + case 'day': { + newActiveDate = this.store.state.activeDate.subtract({ + days: this.store.state.viewMode.value, + }) + break + } + case 'workWeek': { + newActiveDate = this.store.state.activeDate.subtract({ + days: 5, + }) + break + } + } + + const constrainedDate = constrainDateToRange({ + date: newActiveDate, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) + } + + goToNextPeriod() { + let newActiveDate: Temporal.PlainDate + + switch (this.store.state.viewMode.unit) { + case 'month': { + newActiveDate = this.store.state.activeDate.add({ + months: this.store.state.viewMode.value, + }) + break + } + + case 'week': { + newActiveDate = this.store.state.activeDate.add({ + weeks: this.store.state.viewMode.value, + }) + break + } + + case 'day': { + newActiveDate = this.store.state.activeDate.add({ + days: this.store.state.viewMode.value, + }) + break + } + case 'workWeek': { + newActiveDate = this.store.state.activeDate.add({ + days: 5, + }) + break + } + } + + const constrainedDate = constrainDateToRange({ + date: newActiveDate, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) + } + + goToCurrentPeriod() { + const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) + const constrainedDate = constrainDateToRange({ + date: now, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) + } + + goToSpecificPeriod(date: string) { + const targetDate = Temporal.PlainDate.from(date).withCalendar( + this.options.calendar, + ) + const constrainedDate = constrainDateToRange({ + date: targetDate, + range: this.options.range, + }) + this.store.setState((prev) => ({ + ...prev, + activeDate: constrainedDate, + currentPeriod: constrainedDate, + })) + } + + canGoPreviousPeriod(): boolean { + let previousDate: Temporal.PlainDate + + switch (this.store.state.viewMode.unit) { + case 'month': { + previousDate = this.store.state.activeDate.subtract({ + months: this.store.state.viewMode.value, + }) + break + } + case 'week': { + previousDate = this.store.state.activeDate.subtract({ + weeks: this.store.state.viewMode.value, + }) + break + } + case 'day': { + previousDate = this.store.state.activeDate.subtract({ + days: this.store.state.viewMode.value, + }) + break + } + case 'workWeek': { + previousDate = this.store.state.activeDate.subtract({ days: 5 }) + break + } + } + + return isDateInRange({ date: previousDate, range: this.options.range }) + } + + canGoNextPeriod(): boolean { + let nextDate: Temporal.PlainDate + + switch (this.store.state.viewMode.unit) { + case 'month': { + nextDate = this.store.state.activeDate.add({ + months: this.store.state.viewMode.value, + }) + break + } + case 'week': { + nextDate = this.store.state.activeDate.add({ + weeks: this.store.state.viewMode.value, + }) + break + } + case 'day': { + nextDate = this.store.state.activeDate.add({ + days: this.store.state.viewMode.value, + }) + break + } + case 'workWeek': { + nextDate = this.store.state.activeDate.add({ days: 5 }) + break + } + } + + return isDateInRange({ date: nextDate, range: this.options.range }) + } +} diff --git a/packages/time/src/core/calendar.ts b/packages/time/src/core/calendar.ts index df618de9..1bb5edb7 100644 --- a/packages/time/src/core/calendar.ts +++ b/packages/time/src/core/calendar.ts @@ -1,30 +1,15 @@ -import { Store } from '@tanstack/store' import { Temporal } from '@js-temporal/polyfill' -import { - getFirstDayOfMonth, - getFirstDayOfWeek, - parseDateRange, - constrainDateToRange, - isDateInRange, -} from '../utils' -import { generateDateRange } from '../calendar/generateDateRange' import { splitMultiDayEvents } from '../calendar/splitMultiDayEvents' import { getEventProps } from '../calendar/getEventProps' import { groupDaysBy } from '../calendar/groupDaysBy' -import { getDateDefaults } from '../utils/dateDefaults' +import { BaseDateCore, type BaseDateCoreOptions } from './base-date-core' import type { GroupDaysByProps } from '../calendar/groupDaysBy' -import type { - CalendarStore, - DateRange, - Day, - Event, - Resource, -} from '../calendar/types' -import type { ParsedDateRange } from '../utils/dateRange' +import type { CalendarStore, Day, Event, Resource } from '../calendar/types' import '@bart-krakowski/get-week-info-polyfill' export type * from '../calendar/types' +export * from './base-date-core' /** * Represents the configuration for the current viewing mode of a calendar, @@ -45,21 +30,11 @@ export interface ViewMode { export interface CalendarCoreOptions< TResource extends Resource, TEvent extends Event, -> { +> extends BaseDateCoreOptions { /** An optional array of events to be handled by the calendar. */ events?: TEvent[] | null - /** The initial view mode configuration of the calendar. */ - viewMode: CalendarStore['viewMode'] - /** Optional locale for date formatting. Uses a BCP 47 language tag. */ - locale?: Intl.UnicodeBCP47LocaleIdentifier - /** Optional time zone specification for the calendar. */ - timeZone?: Temporal.TimeZoneLike - /** Optional calendar system to be used. */ - calendar?: Temporal.CalendarLike /** Optional resources to be used in the calendar. */ resources?: TResource[] | null - /** Optional range of dates to be used in the calendar. */ - range?: DateRange } /** @@ -127,133 +102,33 @@ export interface CalendarApi< * such as navigating through time periods, handling events, and adjusting settings. * @template TEvent - The type of events managed by the calendar. */ -interface ParsedCalendarCoreOptions< +type ParsedCalendarCoreOptions< TResource extends Resource, TEvent extends Event, -> extends Omit>, 'range'> { - range: ParsedDateRange +> = import('./base-date-core').ParsedBaseDateCoreOptions & { + events: TEvent[] | null + resources: TResource[] | null } export class CalendarCore< - TResource extends Resource, - TEvent extends Event, -> implements CalendarActions + TResource extends Resource, + TEvent extends Event, + > + extends BaseDateCore + implements CalendarActions { - store: Store - options: ParsedCalendarCoreOptions + declare options: ParsedCalendarCoreOptions constructor(options: CalendarCoreOptions) { - const defaults = getDateDefaults() - const parsedRange = parseDateRange({ - range: options.range, - calendar: defaults.calendar, - }) - - this.options = { - ...defaults, - ...options, + super(options) + Object.assign(this.options, { events: options.events || null, resources: options.resources || null, - range: parsedRange, - } - - const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) - const initialDate = constrainDateToRange({ - date: now, - range: this.options.range, - }) - - this.store = new Store({ - currentPeriod: initialDate, - activeDate: initialDate, - viewMode: options.viewMode, }) } - private getFirstDayOfMonth() { - return getFirstDayOfMonth( - this.store.state.currentPeriod - .toString({ calendarName: 'auto' }) - .substring(0, 7), - ) - } - - private getFirstDayOfWeek() { - return getFirstDayOfWeek( - this.store.state.currentPeriod.toString(), - this.options.locale, - ) - } - - private getCalendarDays() { - const start = - this.store.state.viewMode.unit === 'month' - ? this.getFirstDayOfMonth().subtract({ - days: - (this.getFirstDayOfMonth().dayOfWeek - - (this.getFirstDayOfWeek().dayOfWeek + 1) + - 7) % - 7, - }) - : this.store.state.currentPeriod - - let end: Temporal.PlainDate - switch (this.store.state.viewMode.unit) { - case 'month': { - const lastDayOfMonth = this.getFirstDayOfMonth() - .add({ months: this.store.state.viewMode.value }) - .subtract({ days: 1 }) - const lastDayOfMonthWeekDay = - (lastDayOfMonth.dayOfWeek - - (this.getFirstDayOfWeek().dayOfWeek + 1) + - 7) % - 7 - end = lastDayOfMonth.add({ days: 6 - lastDayOfMonthWeekDay }) - break - } - case 'week': { - end = this.getFirstDayOfWeek().add({ - days: 7 * this.store.state.viewMode.value - 1, - }) - break - } - case 'day': { - end = this.store.state.currentPeriod.add({ - days: this.store.state.viewMode.value - 1, - }) - break - } - case 'workWeek': { - end = start.add({ days: 4 }) - break - } - } - - const allDays = generateDateRange(start.toString(), end.toString()) - const startMonthDate = this.store.state.currentPeriod.with({ day: 1 }) - const endMonthDate = this.store.state.currentPeriod - .add({ - months: this.store.state.viewMode.value - 1, - }) - .with({ - day: Temporal.PlainDate.from( - this.store.state.currentPeriod.toString({ calendarName: 'auto' }), - ).daysInMonth, - }) - - const filteredDays = allDays.filter( - (day) => - Temporal.PlainDate.compare(day, startMonthDate) >= 0 && - Temporal.PlainDate.compare(day, endMonthDate) <= 0, - ) - - if (this.options.range.start || this.options.range.end) { - return filteredDays.filter((day) => - isDateInRange({ date: day, range: this.options.range }), - ) - } - - return filteredDays + protected getCalendarDays() { + return super.getCalendarDays() } private getEventMap() { @@ -309,200 +184,6 @@ export class CalendarCore< }) } - getDaysNames(weekday: 'long' | 'short' = 'short') { - const baseDate = Temporal.PlainDate.from('2024-01-01') - const firstDayOfWeek = this.getFirstDayOfWeek().dayOfWeek - - return Array.from({ length: 7 }).map((_, i) => - baseDate - .add({ days: (i + (firstDayOfWeek - 1)) % 7 }) - .toLocaleString(this.options.locale, { weekday: weekday }), - ) - } - - changeViewMode(newViewMode: CalendarStore['viewMode']) { - this.store.setState((prev) => ({ - ...prev, - viewMode: newViewMode, - })) - } - - goToPreviousPeriod() { - let newActiveDate: Temporal.PlainDate - - switch (this.store.state.viewMode.unit) { - case 'month': { - newActiveDate = this.store.state.activeDate.subtract({ - months: this.store.state.viewMode.value, - }) - break - } - - case 'week': { - newActiveDate = this.store.state.activeDate.subtract({ - weeks: this.store.state.viewMode.value, - }) - break - } - - case 'day': { - newActiveDate = this.store.state.activeDate.subtract({ - days: this.store.state.viewMode.value, - }) - break - } - case 'workWeek': { - newActiveDate = this.store.state.activeDate.subtract({ - days: 5, - }) - break - } - } - - const constrainedDate = constrainDateToRange({ - date: newActiveDate, - range: this.options.range, - }) - this.store.setState((prev) => ({ - ...prev, - activeDate: constrainedDate, - currentPeriod: constrainedDate, - })) - } - - goToNextPeriod() { - let newActiveDate: Temporal.PlainDate - - switch (this.store.state.viewMode.unit) { - case 'month': { - newActiveDate = this.store.state.activeDate.add({ - months: this.store.state.viewMode.value, - }) - break - } - - case 'week': { - newActiveDate = this.store.state.activeDate.add({ - weeks: this.store.state.viewMode.value, - }) - break - } - - case 'day': { - newActiveDate = this.store.state.activeDate.add({ - days: this.store.state.viewMode.value, - }) - break - } - case 'workWeek': { - newActiveDate = this.store.state.activeDate.add({ - days: 5, - }) - break - } - } - - const constrainedDate = constrainDateToRange({ - date: newActiveDate, - range: this.options.range, - }) - this.store.setState((prev) => ({ - ...prev, - activeDate: constrainedDate, - currentPeriod: constrainedDate, - })) - } - - goToCurrentPeriod() { - const now = Temporal.Now.plainDateISO().withCalendar(this.options.calendar) - const constrainedDate = constrainDateToRange({ - date: now, - range: this.options.range, - }) - this.store.setState((prev) => ({ - ...prev, - activeDate: constrainedDate, - currentPeriod: constrainedDate, - })) - } - - goToSpecificPeriod(date: string) { - const targetDate = Temporal.PlainDate.from(date).withCalendar( - this.options.calendar, - ) - const constrainedDate = constrainDateToRange({ - date: targetDate, - range: this.options.range, - }) - this.store.setState((prev) => ({ - ...prev, - activeDate: constrainedDate, - currentPeriod: constrainedDate, - })) - } - - canGoPreviousPeriod(): boolean { - let previousDate: Temporal.PlainDate - - switch (this.store.state.viewMode.unit) { - case 'month': { - previousDate = this.store.state.activeDate.subtract({ - months: this.store.state.viewMode.value, - }) - break - } - case 'week': { - previousDate = this.store.state.activeDate.subtract({ - weeks: this.store.state.viewMode.value, - }) - break - } - case 'day': { - previousDate = this.store.state.activeDate.subtract({ - days: this.store.state.viewMode.value, - }) - break - } - case 'workWeek': { - previousDate = this.store.state.activeDate.subtract({ days: 5 }) - break - } - } - - return isDateInRange({ date: previousDate, range: this.options.range }) - } - - canGoNextPeriod(): boolean { - let nextDate: Temporal.PlainDate - - switch (this.store.state.viewMode.unit) { - case 'month': { - nextDate = this.store.state.activeDate.add({ - months: this.store.state.viewMode.value, - }) - break - } - case 'week': { - nextDate = this.store.state.activeDate.add({ - weeks: this.store.state.viewMode.value, - }) - break - } - case 'day': { - nextDate = this.store.state.activeDate.add({ - days: this.store.state.viewMode.value, - }) - break - } - case 'workWeek': { - nextDate = this.store.state.activeDate.add({ days: 5 }) - break - } - } - - return isDateInRange({ date: nextDate, range: this.options.range }) - } - getEventProps(id: Event['id']) { return getEventProps( this.getEventMap(), @@ -520,7 +201,7 @@ export class CalendarCore< days, unit, fillMissingDays, - weekStartsOn: this.getFirstDayOfWeek().dayOfWeek, + weekStartsOn: this.getWeekStartsOn(), locale: this.options.locale, } as GroupDaysByProps) } diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts index a238f2cf..e2c77641 100644 --- a/packages/time/src/core/date-picker.ts +++ b/packages/time/src/core/date-picker.ts @@ -1,26 +1,16 @@ import { Store } from '@tanstack/store' import { Temporal } from '@js-temporal/polyfill' -import { getDateDefaults } from '../utils/dateDefaults' -import { CalendarCore } from './calendar' -import type { CalendarCoreOptions, CalendarStore } from './calendar' +import { isDateInRange, ParsedDateRange } from '../utils' +import { BaseDateCore, type BaseDateCoreOptions } from './base-date-core' +import type { CalendarStore } from './calendar' -export interface DatePickerOptions extends CalendarCoreOptions { - /** - * The earliest date that can be selected. Null if no minimum constraint. - */ - minDate?: Temporal.PlainDate | null - /** - * The latest date that can be selected. Null if no maximum constraint. - */ - maxDate?: Temporal.PlainDate | null - /** - * Allows selection of multiple dates. - */ - multiple?: boolean +export type DatePickerMode = 'single' | 'multiple' | 'range' + +export interface DatePickerOptions extends BaseDateCoreOptions { /** - * Allows selection of a range of dates. + * Selection mode: 'single' for single date, 'multiple' for multiple dates, 'range' for date range. */ - range?: boolean + mode?: DatePickerMode /** * Initial set of selected dates. */ @@ -34,26 +24,19 @@ export interface DatePickerCoreState extends CalendarStore { selectedDates: Map } -export class DatePickerCore extends CalendarCore { +export class DatePickerCore extends BaseDateCore { datePickerStore: Store - options: Required + declare options: Required & { + range: ParsedDateRange + } constructor(options: DatePickerOptions) { super(options) - const defaults = getDateDefaults() - this.options = { - ...options, - multiple: options.multiple ?? false, - range: options.range ?? false, - minDate: options.minDate ?? null, - maxDate: options.maxDate ?? null, + Object.assign(this.options, { + mode: options.mode ?? 'single', selectedDates: options.selectedDates ?? [], - events: options.events ?? [], - locale: options.locale ?? defaults.locale, - timeZone: options.timeZone ?? defaults.timeZone, - calendar: options.calendar ?? defaults.calendar, - } + }) this.datePickerStore = new Store({ ...this.store.state, selectedDates: new Map( @@ -66,25 +49,66 @@ export class DatePickerCore extends CalendarCore { return Array.from(this.datePickerStore.state.selectedDates.values()) } + getDaysWithEvents() { + const calendarDays = this.getCalendarDays() + return calendarDays.map((day) => { + const currentMonthRange = Array.from( + { length: this.store.state.viewMode.value }, + (_, i) => this.store.state.currentPeriod.add({ months: i }).month, + ) + const isInCurrentPeriod = currentMonthRange.includes(day.month) + return { + date: day, + events: [] as never[], + isToday: + Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, + isInCurrentPeriod, + } + }) + } + selectDate(date: Temporal.PlainDate) { - const { multiple, range, minDate, maxDate } = this.options + const { mode } = this.options - if (minDate && Temporal.PlainDate.compare(date, minDate) < 0) return - if (maxDate && Temporal.PlainDate.compare(date, maxDate) > 0) return + if (this.options.range.start || this.options.range.end) { + if (!isDateInRange({ date, range: this.options.range })) return + } const selectedDates = new Map(this.datePickerStore.state.selectedDates) - if (range && selectedDates.size === 1) { - selectedDates.set(date.toString(), date) - } else if (multiple) { - if (selectedDates.has(date.toString())) { - selectedDates.delete(date.toString()) - } else { + switch (mode) { + case 'range': { + if (selectedDates.size === 0) { + selectedDates.set(date.toString(), date) + } else if (selectedDates.size === 1) { + const firstDate = Array.from(selectedDates.values())[0] + if (firstDate && Temporal.PlainDate.compare(date, firstDate) < 0) { + selectedDates.clear() + selectedDates.set(date.toString(), date) + selectedDates.set(firstDate.toString(), firstDate) + } else { + selectedDates.set(date.toString(), date) + } + } else { + selectedDates.clear() + selectedDates.set(date.toString(), date) + } + break + } + case 'multiple': { + if (selectedDates.has(date.toString())) { + selectedDates.delete(date.toString()) + } else { + selectedDates.set(date.toString(), date) + } + break + } + case 'single': + default: { + selectedDates.clear() selectedDates.set(date.toString(), date) + break } - } else { - selectedDates.clear() - selectedDates.set(date.toString(), date) } this.datePickerStore.setState((prev) => ({ diff --git a/packages/time/src/core/index.ts b/packages/time/src/core/index.ts index e00be3cf..7902364b 100644 --- a/packages/time/src/core/index.ts +++ b/packages/time/src/core/index.ts @@ -1 +1,3 @@ +export * from './base-date-core' export * from './calendar' +export * from './date-picker' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74186b40..3cd3ebc2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,7 +139,7 @@ importers: specifier: ^3.3.4 version: 3.5.26(typescript@5.9.3) - examples/react: + examples/react/calendar: dependencies: '@js-temporal/polyfill': specifier: 'catalog:' @@ -152,10 +152,50 @@ importers: version: 0.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-time': specifier: workspace:* - version: link:../../packages/react-time + version: link:../../../packages/react-time '@tanstack/time': specifier: workspace:* - version: link:../../packages/time + version: link:../../../packages/time + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + devDependencies: + '@types/react': + specifier: ^18.2.45 + version: 18.3.27 + '@types/react-dom': + specifier: ^18.0.5 + version: 18.3.7(@types/react@18.3.27) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.2(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + vite: + specifier: ^6.3.3 + version: 6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2) + + examples/react/date-picker: + dependencies: + '@js-temporal/polyfill': + specifier: 'catalog:' + version: 0.5.1 + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18(vite@6.4.1(@types/node@18.19.130)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.2)) + '@tanstack/react-store': + specifier: ^0.4.1 + version: 0.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-time': + specifier: workspace:* + version: link:../../../packages/react-time + '@tanstack/time': + specifier: workspace:* + version: link:../../../packages/time react: specifier: ^18.2.0 version: 18.3.1 From cb6bfce7b34505f94884a29357b4b3c95ce0b783 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 12 Jan 2026 14:36:50 +0100 Subject: [PATCH 162/163] feat: date picker --- examples/react/date-picker/package.json | 1 + examples/react/date-picker/src/index.tsx | 137 ++++++++++++----------- 2 files changed, 74 insertions(+), 64 deletions(-) diff --git a/examples/react/date-picker/package.json b/examples/react/date-picker/package.json index bcdec7dc..79596b61 100644 --- a/examples/react/date-picker/package.json +++ b/examples/react/date-picker/package.json @@ -14,6 +14,7 @@ "@tanstack/react-store": "^0.4.1", "@tanstack/react-time": "workspace:*", "@tanstack/time": "workspace:*", + "clsx": "^2.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "tailwindcss": "^4.1.18" diff --git a/examples/react/date-picker/src/index.tsx b/examples/react/date-picker/src/index.tsx index b9a5da53..4aa67005 100644 --- a/examples/react/date-picker/src/index.tsx +++ b/examples/react/date-picker/src/index.tsx @@ -1,10 +1,17 @@ import * as React from 'react' +import { useMemo } from 'react' import { createRoot } from 'react-dom/client' import { Temporal } from '@js-temporal/polyfill' import { useDatePicker } from '@tanstack/react-time' import { isDateInRange } from '@tanstack/time' +import { clsx } from 'clsx' +import type { ClassValue } from 'clsx' import './index.css' +export function cn(...inputs: ClassValue[]) { + return clsx(inputs) +} + export default function App() { const today = Temporal.Now.plainDateISO() const rangeStart = today.subtract({ months: 1 }) @@ -26,7 +33,6 @@ export default function App() { canGoPreviousPeriod, canGoNextPeriod, currentPeriod, - selectedDates, selectDate, getSelectedDates, groupDaysBy, @@ -39,11 +45,15 @@ export default function App() { const daysNames = getDaysNames('short') - const groupedWeeks = groupDaysBy({ - days: days, - unit: 'week', - fillMissingDays: true, - }) + const groupedWeeks = useMemo( + () => + groupDaysBy({ + days: days, + unit: 'week', + fillMissingDays: true, + }), + [groupDaysBy, days], + ) const selectedDatesList = getSelectedDates() @@ -59,10 +69,10 @@ export default function App() {
{selectedDatesList.map((date) => ( - {Temporal.PlainDate.from(date).toLocaleString('en-US', { + {date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', @@ -147,64 +157,63 @@ export default function App() { ))}
- {groupedWeeks.map( - (week: Array<(typeof days)[0] | null>, weekIndex: number) => ( -
- {week.map((day: (typeof days)[0] | null) => { - if (!day) { - return ( -
- ) - } - - const dateStr = day.date.toString() - const isToday = day.isToday - const isInCurrentPeriod = day.isInCurrentPeriod - const isSelected = selectedDates.includes(dateStr) - const isDisabled = - selectableRange.start || selectableRange.end - ? !isDateInRange({ - date: day.date, - range: { - start: rangeStart, - end: rangeEnd, - }, - }) - : false - + {groupedWeeks.map((week, weekIndex) => ( +
+ {week.map((day) => { + if (!day) { return ( - +
) - })} -
- ), - )} + } + + const dateStr = day.date.toString() + const isToday = day.isToday + const isInCurrentPeriod = day.isInCurrentPeriod + const isSelected = day.isSelected + const isBetweenDates = day.isBetweenDates + + return ( + + ) + })} +
+ ))}
{isPending && ( From f01f1bd2c63b3e95d78f96d0f1042323db30e308 Mon Sep 17 00:00:00 2001 From: Bart Krakowski Date: Mon, 12 Jan 2026 14:37:09 +0100 Subject: [PATCH 163/163] feat: date picker --- .../src/useDatePicker/useDatePicker.ts | 62 +++---- packages/time/src/calendar/types.ts | 4 +- packages/time/src/core/base-date-core.ts | 24 ++- packages/time/src/core/date-picker.ts | 159 ++++++++++++++++-- pnpm-lock.yaml | 9 + 5 files changed, 198 insertions(+), 60 deletions(-) diff --git a/packages/react-time/src/useDatePicker/useDatePicker.ts b/packages/react-time/src/useDatePicker/useDatePicker.ts index 4997ef67..c6e6f533 100644 --- a/packages/react-time/src/useDatePicker/useDatePicker.ts +++ b/packages/react-time/src/useDatePicker/useDatePicker.ts @@ -1,14 +1,15 @@ -import { useCallback, useState, useTransition } from 'react' +import { useCallback, useMemo, useState, useTransition } from 'react' import { useStore } from '@tanstack/react-store' -import { Temporal } from '@js-temporal/polyfill' import { DatePickerCore } from '@tanstack/time' -import { groupDaysBy } from '@tanstack/time' import type { DatePickerOptions } from '@tanstack/time' export const useDatePicker = (options: DatePickerOptions) => { const [datePickerCore] = useState(() => new DatePickerCore(options)) const state = useStore(datePickerCore.store) const datePickerState = useStore(datePickerCore.datePickerStore) + const selectedDatesKeys = useStore(datePickerCore.datePickerStore, (s) => + Array.from(s.selectedDates.keys()).sort().join(','), + ) const [isPending, startTransition] = useTransition() const goToPreviousPeriod = useCallback< @@ -35,10 +36,8 @@ export const useDatePicker = (options: DatePickerOptions) => { }) }, [datePickerCore, startTransition]) - const goToSpecificPeriod = useCallback< - typeof datePickerCore.goToSpecificPeriod - >( - (date) => { + const goToSpecificPeriod = useCallback( + (date: string | number | Date) => { startTransition(() => { datePickerCore.goToSpecificPeriod(date) }) @@ -59,36 +58,17 @@ export const useDatePicker = (options: DatePickerOptions) => { const groupDaysByCallback = useCallback( (props: { - days: Array<{ - date: Temporal.PlainDate - events: never[] - isToday: boolean - isInCurrentPeriod: boolean - }> + days: ReturnType unit: 'week' | 'month' | 'day' fillMissingDays?: boolean }) => { - const daysWithMetadata = props.days.map((day) => ({ - date: day.date, - events: [], - isToday: day.isToday, - isInCurrentPeriod: day.isInCurrentPeriod, - })) - const unit = - props.unit === 'day' - ? 'week' - : props.unit === 'month' - ? 'month' - : 'week' - return groupDaysBy({ - days: daysWithMetadata, - unit: unit as 'month' | 'week' | 'workWeek', - fillMissingDays: props.fillMissingDays ?? true, - weekStartsOn: datePickerCore.getWeekStartsOn(), - locale: datePickerCore.options.locale, - } as any) + const unit = props.unit === 'day' ? 'week' : props.unit + return datePickerCore.groupDaysBy({ + ...props, + unit: unit as 'week' | 'month', + }) }, - [datePickerCore], + [datePickerCore, selectedDatesKeys], ) const getDaysNames = useCallback( @@ -107,20 +87,27 @@ export const useDatePicker = (options: DatePickerOptions) => { const selectDate = useCallback( (date: string) => { - datePickerCore.selectDate(Temporal.PlainDate.from(date)) + startTransition(() => { + datePickerCore.selectDate(date) + }) }, - [datePickerCore], + [datePickerCore, startTransition], ) const getSelectedDates = useCallback(() => { - return datePickerCore.getSelectedDates().map((date) => date.toString()) + return datePickerCore.getSelectedDates() }, [datePickerCore]) + const days = useMemo( + () => datePickerCore.getDaysWithEvents(), + [datePickerCore, selectedDatesKeys, state.currentPeriod, state.viewMode], + ) + return { activeDate: state.activeDate.toString(), currentPeriod: state.currentPeriod.toString(), viewMode: state.viewMode, - days: datePickerCore.getDaysWithEvents(), + days, getDaysNames, goToPreviousPeriod, goToNextPeriod, @@ -132,7 +119,6 @@ export const useDatePicker = (options: DatePickerOptions) => { getEventProps, isPending, groupDaysBy: groupDaysByCallback, - selectedDates: Array.from(datePickerState.selectedDates.keys()), selectDate, getSelectedDates, } diff --git a/packages/time/src/calendar/types.ts b/packages/time/src/calendar/types.ts index a42de522..c01e4340 100644 --- a/packages/time/src/calendar/types.ts +++ b/packages/time/src/calendar/types.ts @@ -6,6 +6,8 @@ export interface Resource { label: string } +export type ViewMode = 'month' | 'week' | 'workWeek' | 'day' + export interface Event { id: string start: string @@ -19,7 +21,7 @@ export interface CalendarStore { activeDate: Temporal.PlainDate viewMode: { value: number - unit: 'month' | 'week' | 'workWeek' | 'day' + unit: ViewMode } } diff --git a/packages/time/src/core/base-date-core.ts b/packages/time/src/core/base-date-core.ts index 187046de..1119af5e 100644 --- a/packages/time/src/core/base-date-core.ts +++ b/packages/time/src/core/base-date-core.ts @@ -12,6 +12,23 @@ import { getDateDefaults } from '../utils/dateDefaults' import type { CalendarStore, DateRange } from '../calendar/types' import type { ParsedDateRange } from '../utils/dateRange' +export type DateInput = string | number | Date | Temporal.PlainDate + +function toTemporalPlainDateString( + date: DateInput, +): string { + if (date instanceof Temporal.PlainDate) { + return date.toString({ calendarName: 'never' }) + } + if (date instanceof Date) { + return date.toISOString().split('T')[0]! + } + if (typeof date === 'number') { + return new Date(date).toISOString().split('T')[0]! + } + return date +} + /** * Base options interface for date-related core classes. */ @@ -47,7 +64,7 @@ export interface BaseDateActions { /** Resets the view to the current period based on today's date. */ goToCurrentPeriod: () => void /** Navigates to a specific date. */ - goToSpecificPeriod: (date: string) => void + goToSpecificPeriod: (date: DateInput) => void /** Checks if navigation to the previous period is allowed within the range. */ canGoPreviousPeriod: () => boolean /** Checks if navigation to the next period is allowed within the range. */ @@ -297,8 +314,9 @@ export abstract class BaseDateCore implements BaseDateActions { })) } - goToSpecificPeriod(date: string) { - const targetDate = Temporal.PlainDate.from(date).withCalendar( + goToSpecificPeriod(date: DateInput) { + const dateStr = toTemporalPlainDateString(date) + const targetDate = Temporal.PlainDate.from(dateStr).withCalendar( this.options.calendar, ) const constrainedDate = constrainDateToRange({ diff --git a/packages/time/src/core/date-picker.ts b/packages/time/src/core/date-picker.ts index e2c77641..3e6a5ff2 100644 --- a/packages/time/src/core/date-picker.ts +++ b/packages/time/src/core/date-picker.ts @@ -1,11 +1,47 @@ import { Store } from '@tanstack/store' import { Temporal } from '@js-temporal/polyfill' import { isDateInRange, ParsedDateRange } from '../utils' -import { BaseDateCore, type BaseDateCoreOptions } from './base-date-core' +import { + BaseDateCore, + type BaseDateCoreOptions, + type DateInput, +} from './base-date-core' import type { CalendarStore } from './calendar' +import { groupDaysBy as baseGroupDaysBy } from '../calendar/groupDaysBy' +import type { GroupDaysByProps } from '../calendar/groupDaysBy' +import type { Resource, Event } from '../calendar/types' export type DatePickerMode = 'single' | 'multiple' | 'range' +function toTemporalPlainDate( + date: DateInput, + calendar?: Temporal.CalendarLike, +): Temporal.PlainDate { + if (date instanceof Temporal.PlainDate) { + return calendar ? date.withCalendar(calendar) : date + } + if (date instanceof Date) { + const isoString = date.toISOString().split('T')[0]! + return calendar + ? Temporal.PlainDate.from(isoString).withCalendar(calendar) + : Temporal.PlainDate.from(isoString) + } + if (typeof date === 'number') { + const dateObj = new Date(date) + const isoString = dateObj.toISOString().split('T')[0]! + return calendar + ? Temporal.PlainDate.from(isoString).withCalendar(calendar) + : Temporal.PlainDate.from(isoString) + } + return calendar + ? Temporal.PlainDate.from(date).withCalendar(calendar) + : Temporal.PlainDate.from(date) +} + +function toDate(temporalDate: Temporal.PlainDate): Date { + return new Date(temporalDate.year, temporalDate.month - 1, temporalDate.day) +} + export interface DatePickerOptions extends BaseDateCoreOptions { /** * Selection mode: 'single' for single date, 'multiple' for multiple dates, 'range' for date range. @@ -14,7 +50,7 @@ export interface DatePickerOptions extends BaseDateCoreOptions { /** * Initial set of selected dates. */ - selectedDates?: Temporal.PlainDate[] + selectedDates?: DateInput[] } export interface DatePickerCoreState extends CalendarStore { @@ -26,6 +62,7 @@ export interface DatePickerCoreState extends CalendarStore { export class DatePickerCore extends BaseDateCore { datePickerStore: Store + declare options: Required & { range: ParsedDateRange } @@ -40,73 +77,123 @@ export class DatePickerCore extends BaseDateCore { this.datePickerStore = new Store({ ...this.store.state, selectedDates: new Map( - options.selectedDates?.map((date) => [date.toString(), date]) ?? [], + options.selectedDates?.map((date) => { + const temporalDate = toTemporalPlainDate(date, this.options.calendar) + return [ + temporalDate.toString({ calendarName: 'never' }), + temporalDate, + ] + }) ?? [], ), }) } - getSelectedDates() { - return Array.from(this.datePickerStore.state.selectedDates.values()) + getSelectedDates(): Date[] { + return Array.from(this.datePickerStore.state.selectedDates.values()).map( + toDate, + ) } getDaysWithEvents() { const calendarDays = this.getCalendarDays() + const selectedDates = this.datePickerStore.state.selectedDates return calendarDays.map((day) => { const currentMonthRange = Array.from( { length: this.store.state.viewMode.value }, (_, i) => this.store.state.currentPeriod.add({ months: i }).month, ) const isInCurrentPeriod = currentMonthRange.includes(day.month) + const dayKey = day.toString({ calendarName: 'never' }) return { date: day, - events: [] as never[], + events: [], isToday: Temporal.PlainDate.compare(day, Temporal.Now.plainDateISO()) === 0, isInCurrentPeriod, + isSelected: selectedDates.has(dayKey), + isBetweenDates: this.isBetweenDates(day), } }) } - selectDate(date: Temporal.PlainDate) { + groupDaysBy({ + days, + unit, + fillMissingDays = true, + }: Omit< + GroupDaysByProps>, + 'weekStartsOn' | 'locale' + >) { + const grouped = baseGroupDaysBy>({ + days, + unit, + fillMissingDays, + weekStartsOn: this.getWeekStartsOn(), + locale: this.options.locale, + } as GroupDaysByProps>) + + return grouped.map((group) => + group.map((day) => { + if (!day) return null + const dayKey = day.date.toString({ calendarName: 'never' }) + return { + ...day, + isSelected: this.datePickerStore.state.selectedDates.has(dayKey), + isBetweenDates: this.isBetweenDates(day.date), + } + }), + ) + } + + selectDate(date: DateInput) { const { mode } = this.options + const temporalDate = toTemporalPlainDate(date, this.options.calendar) if (this.options.range.start || this.options.range.end) { - if (!isDateInRange({ date, range: this.options.range })) return + if (!isDateInRange({ date: temporalDate, range: this.options.range })) + return } const selectedDates = new Map(this.datePickerStore.state.selectedDates) + const dateKey = temporalDate.toString({ calendarName: 'never' }) switch (mode) { case 'range': { if (selectedDates.size === 0) { - selectedDates.set(date.toString(), date) + selectedDates.set(dateKey, temporalDate) } else if (selectedDates.size === 1) { const firstDate = Array.from(selectedDates.values())[0] - if (firstDate && Temporal.PlainDate.compare(date, firstDate) < 0) { + if ( + firstDate && + Temporal.PlainDate.compare(temporalDate, firstDate) < 0 + ) { selectedDates.clear() - selectedDates.set(date.toString(), date) - selectedDates.set(firstDate.toString(), firstDate) + selectedDates.set(dateKey, temporalDate) + selectedDates.set( + firstDate.toString({ calendarName: 'never' }), + firstDate, + ) } else { - selectedDates.set(date.toString(), date) + selectedDates.set(dateKey, temporalDate) } } else { selectedDates.clear() - selectedDates.set(date.toString(), date) + selectedDates.set(dateKey, temporalDate) } break } case 'multiple': { - if (selectedDates.has(date.toString())) { - selectedDates.delete(date.toString()) + if (selectedDates.has(dateKey)) { + selectedDates.delete(dateKey) } else { - selectedDates.set(date.toString(), date) + selectedDates.set(dateKey, temporalDate) } break } case 'single': default: { selectedDates.clear() - selectedDates.set(date.toString(), date) + selectedDates.set(dateKey, temporalDate) break } } @@ -116,4 +203,40 @@ export class DatePickerCore extends BaseDateCore { selectedDates, })) } + + isBetweenDates(date: DateInput): boolean { + if (this.options.mode !== 'range') { + return false + } + + const selectedDates = Array.from( + this.datePickerStore.state.selectedDates.values(), + ) + + if (selectedDates.length !== 2) { + return false + } + + const temporalDate = toTemporalPlainDate(date, this.options.calendar) + const dateKey = temporalDate.toString({ calendarName: 'never' }) + + if (this.datePickerStore.state.selectedDates.has(dateKey)) { + return false + } + + const sortedDates = selectedDates.sort((a, b) => + Temporal.PlainDate.compare(a, b), + ) + const startDate = sortedDates[0] + const endDate = sortedDates[1] + + if (!startDate || !endDate) { + return false + } + + const compareToStart = Temporal.PlainDate.compare(temporalDate, startDate) + const compareToEnd = Temporal.PlainDate.compare(temporalDate, endDate) + + return compareToStart > 0 && compareToEnd < 0 + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cd3ebc2..56e2a913 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,6 +196,9 @@ importers: '@tanstack/time': specifier: workspace:* version: link:../../../packages/time + clsx: + specifier: ^2.1.1 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -3639,6 +3642,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} @@ -11154,6 +11161,8 @@ snapshots: clone@1.0.4: {} + clsx@2.1.1: {} + code-block-writer@12.0.0: {} color-convert@2.0.1: