From 862161f0aa4bf875a28daac455d23ab6d81d2b44 Mon Sep 17 00:00:00 2001 From: knowledgecode Date: Wed, 6 May 2026 11:18:46 +0900 Subject: [PATCH 1/4] feat: add defaultDate option to parse/isValid for partial date string support Introduce ParsedComponents interface in parser.ts and refactor PreparseResult to extend it. Add defaultDate option to ParserOptions so callers can supply fallback values for components missing from the format string. - toGregorianYear/getDefaultDate helpers extracted in isValid.ts for reuse - validatePreparseResult now validates defaultDate components (e.g. H, Z) - parse() merges parsed values with defaultDate, respecting precedence rules: defaultDate.Z takes precedence over options.timeZone --- src/isValid.ts | 56 ++++++++++++++++++++++++++++++++++++---------- src/parse.ts | 48 +++++++++++++++++++++++----------------- src/parser.ts | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ src/preparse.ts | 57 ++++------------------------------------------- 4 files changed, 135 insertions(+), 85 deletions(-) diff --git a/src/isValid.ts b/src/isValid.ts index 554cec9..67481d5 100644 --- a/src/isValid.ts +++ b/src/isValid.ts @@ -1,9 +1,39 @@ import { preparse } from './preparse.ts'; import { getDaysInMonth } from './utils.ts'; import type { CompiledObject } from './compile.ts'; -import type { ParserOptions } from './parser.ts'; +import type { ParsedComponents, ParserOptions } from './parser.ts'; import type { PreparseResult } from './preparse.ts'; +/** + * Converts a year to the Gregorian calendar year based on the specified calendar system in the parser options. + * @param year - The year to convert, which may be in a non-Gregorian calendar system (e.g., Buddhist calendar) + * @param [options] - Optional parser options that may specify the calendar system to use for conversion + * @returns The corresponding Gregorian calendar year, or undefined if the input year is undefined + */ +export const toGregorianYear = (year: number | undefined, options?: ParserOptions) => { + return year === undefined ? year : year - (options?.calendar === 'buddhist' ? 543 : 0); +}; + +/** + * Gets the default date components to use when certain components are missing from the input string. + * @param [defaultDate] - An object containing default date components (year, month, day, hour, minute, second, millisecond, timezone offset) + * @returns An object with all date components filled in, using the provided default values or fallback defaults (e.g., year defaults to 1970) + */ +export const getDefaultDate = (defaultDate: ParsedComponents = {}) => { + return { + Y: defaultDate.Y ?? 1970, + M: defaultDate.M ?? 1, + D: defaultDate.D ?? 1, + H: defaultDate.H, + A: defaultDate.A, + h: defaultDate.h, + m: defaultDate.m ?? 0, + s: defaultDate.s ?? 0, + S: defaultDate.S ?? 0, + Z: defaultDate.Z + }; +}; + /** * Validates whether a preparse result object is valid. * @param pr - The preparse result object to validate @@ -11,25 +41,27 @@ import type { PreparseResult } from './preparse.ts'; * @returns True if the preparse result is valid, false otherwise */ export function validatePreparseResult(pr: PreparseResult, options?: ParserOptions) { - const y = pr.Y === undefined ? 1970 : pr.Y - (options?.calendar === 'buddhist' ? 543 : 0); const [min12, max12] = options?.hour12 === 'h11' ? [0, 11] : [1, 12]; const [min24, max24] = options?.hour24 === 'h24' ? [1, 24] : [0, 23]; const range = (value: number | undefined, min: number, max: number) => value === undefined || value >= min && value <= max; + const base = getDefaultDate(options?.defaultDate); + const year = toGregorianYear(pr.Y, options) ?? base.Y; + const month = pr.M ?? base.M; return pr._index > 0 && pr._length > 0 && pr._index === pr._length && pr._match > 0 - && range(y, 1, 9999) - && range(pr.M, 1, 12) - && range(pr.D, 1, getDaysInMonth(y, pr.M ?? 1)) - && range(pr.H, min24, max24) - && range(pr.A, 0, 1) - && range(pr.h, min12, max12) - && range(pr.m, 0, 59) - && range(pr.s, 0, 59) - && range(pr.S, 0, 999) - && range(pr.Z, -913, 956); + && range(year, 1, 9999) + && range(month, 1, 12) + && range(pr.D ?? base.D, 1, getDaysInMonth(year, month)) + && range(pr.H ?? base.H, min24, max24) + && range(pr.A ?? base.A, 0, 1) + && range(pr.h ?? base.h, min12, max12) + && range(pr.m ?? base.m, 0, 59) + && range(pr.s ?? base.s, 0, 59) + && range(pr.S ?? base.S, 0, 999) + && range(pr.Z ?? base.Z, -913, 956); } /** diff --git a/src/parse.ts b/src/parse.ts index a07b745..844d969 100644 --- a/src/parse.ts +++ b/src/parse.ts @@ -1,10 +1,21 @@ -import { createTimezoneDate } from './zone.ts'; +import { createTimezoneDate, TimeZone } from './zone.ts'; import { isUTC } from './datetime.ts'; import { preparse } from './preparse.ts'; -import { validatePreparseResult } from './isValid.ts'; +import { toGregorianYear, getDefaultDate, validatePreparseResult } from './isValid.ts'; import type { CompiledObject } from './compile.ts'; import type { ParserOptions } from './parser.ts'; +const convert = (Y: number, M: number, D: number, H: number, m: number, s: number, S: number, timeZone?: string | TimeZone) => { + // If a specific time zone is provided in the options, use it to create the date. + if (timeZone) { + const naiveUTC = Date.UTC(Y, M - 1, D, H, m, s, S); + // If the specified time zone is UTC, create the date directly in UTC. Otherwise, create the date using the specified time zone. + return isUTC(timeZone) ? new Date(naiveUTC) : createTimezoneDate(naiveUTC, timeZone); + } + // If no time zone is provided, create the date in the local time zone. + return new Date(Y, M - 1, D, H, m, s, S); +}; + /** * Parses a date string according to the specified format. * @param dateString - The date string to parse @@ -18,23 +29,20 @@ export function parse(dateString: string, arg: string | CompiledObject, options? if (!validatePreparseResult(pr, options)) { return new Date(NaN); } - // Normalize date components (year, month, day, hour, minute, second, millisecond) - pr.Y = pr.Y ? pr.Y - (options?.calendar === 'buddhist' ? 543 : 0) : 1970; - pr.M = (pr.M ?? 1) - (pr.Y < 100 ? 1900 * 12 + 1 : 1); - pr.D ??= 1; - pr.H = ((pr.H ?? 0) % 24) || ((pr.A ?? 0) * 12 + (pr.h ?? 0) % 12); - pr.m ??= 0; - pr.s ??= 0; - pr.S ??= 0; - // If the preparse result contains a timezone offset (Z), use it to create the date. - if (isUTC(options?.timeZone) || 'Z' in pr) { - return new Date(Date.UTC(pr.Y, pr.M, pr.D, pr.H, pr.m + (pr.Z ?? 0), pr.s, pr.S)); - } - // If a specific time zone is provided in the options, use it to create the date. - if (options?.timeZone) { - return createTimezoneDate(Date.UTC(pr.Y, pr.M, pr.D, pr.H, pr.m, pr.s, pr.S), options.timeZone); - } - // If no time zone information is available, create the date in the local time zone. - return new Date(pr.Y, pr.M, pr.D, pr.H, pr.m, pr.s, pr.S); + const base = getDefaultDate(options?.defaultDate); + const year = toGregorianYear(pr.Y, options) ?? base.Y; + // When a Z offset exists (from the parsed string or defaultDate.Z), it takes precedence over options.timeZone. + const offset = pr.Z ?? base.Z; + + return convert( + year, + (pr.M ?? base.M) - (year < 100 ? 1900 * 12 : 0), + pr.D ?? base.D, + ((pr.H ?? base.H ?? 0) % 24) || ((pr.A ?? base.A ?? 0) * 12 + (pr.h ?? base.h ?? 0) % 12), + (pr.m ?? base.m) + (offset ?? 0), + pr.s ?? base.s, + pr.S ?? base.S, + typeof offset === 'number' ? 'UTC' : options?.timeZone + ); } diff --git a/src/parser.ts b/src/parser.ts index 3d611ea..9016aad 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -5,6 +5,58 @@ import type { TimeZone } from './zone.ts'; type ParserToken = 'Y' | 'M' | 'D' | 'H' | 'A' | 'h' | 'm' | 's' | 'S' | 'Z'; +export interface ParsedComponents { + /** + * Year component + */ + Y?: number; + + /** + * Month component (1-12) + */ + M?: number; + + /** + * Day component + */ + D?: number; + + /** + * Hour in 24-hour format + */ + H?: number; + + /** + * Meridiem indicator (0:AM / 1:PM) + */ + A?: number; + + /** + * Hour in 12-hour format + */ + h?: number; + + /** + * Minute component + */ + m?: number; + + /** + * Second component + */ + s?: number; + + /** + * Millisecond component + */ + S?: number; + + /** + * Timezone offset in minutes + */ + Z?: number; +} + export interface ParserPluginOptions { /** * The hour format to use for parsing. @@ -51,6 +103,13 @@ export interface ParserPluginOptions { * This is an object that provides methods to get localized month names, day names, and meridiems. */ locale: Locale; + + /** + * Default date components to use when certain components are missing from the input string. + * This allows the parser to fill in missing components with default values, which can be useful for parsing partial date strings. + * For example, if the input string only contains a month and day, the parser can use the default year from this object. + */ + defaultDate: ParsedComponents; } export interface ParseResult { diff --git a/src/preparse.ts b/src/preparse.ts index 57ca2d6..e6aa77f 100644 --- a/src/preparse.ts +++ b/src/preparse.ts @@ -4,59 +4,9 @@ import { parser as defaultParser, validateToken } from './parser.ts'; import en from './locales/en.ts'; import latn from './numerals/latn.ts'; import type { CompiledObject } from './compile.ts'; -import type { ParserOptions } from './parser.ts'; - -export interface PreparseResult { - /** - * Year component - */ - Y?: number; - - /** - * Month component (1-12) - */ - M?: number; - - /** - * Day component - */ - D?: number; - - /** - * Hour in 24-hour format - */ - H?: number; - - /** - * Meridiem indicator (0:AM/1:PM) - */ - A?: number; - - /** - * Hour in 12-hour format - */ - h?: number; - - /** - * Minute component - */ - m?: number; - - /** - * Second component - */ - s?: number; - - /** - * Millisecond component - */ - S?: number; - - /** - * Timezone offset in minutes - */ - Z?: number; +import type { ParsedComponents, ParserOptions } from './parser.ts'; +export interface PreparseResult extends ParsedComponents { /** * Current parsing position */ @@ -95,7 +45,8 @@ export function preparse(dateString: string, arg: string | CompiledObject, optio timeZone: isTimeZone(options?.timeZone) || typeof options?.timeZone === 'string' ? options.timeZone || undefined : undefined, - locale: options?.locale ?? en + locale: options?.locale ?? en, + defaultDate: options?.defaultDate ?? {} }; const pr: PreparseResult = { _index: 0, From 1c0ddebf8ab5a220f78621d0fa5d55dfb5e0b564 Mon Sep 17 00:00:00 2001 From: knowledgecode Date: Wed, 6 May 2026 11:18:55 +0900 Subject: [PATCH 2/4] test: add tests for defaultDate option in parse() and isValid() Cover leap-day validation, day-range validation, timezone offset precedence, 12-hour component defaults, buddhist calendar interaction, and regression for hour24:h24 with defaultDate.H missing from format. --- tests/isValid.spec.ts | 26 ++++++++++++++++++++++++++ tests/parse.spec.ts | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/tests/isValid.spec.ts b/tests/isValid.spec.ts index 6fa1d04..9a98bb6 100644 --- a/tests/isValid.spec.ts +++ b/tests/isValid.spec.ts @@ -149,4 +149,30 @@ describe('options', () => { const dateString = format(new Date(-3944621033000), 'YYYY-MM-DD[T]HH:mm:ss ZZ'); expect(isValid(dateString, 'YYYY-MM-DD[T]HH:mm:ss ZZ')).toBe(true); }); + + test('defaultDate: year for leap day validation', () => { + expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2024 } })).toBe(true); + expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2023 } })).toBe(false); + expect(isValid('02-29', 'MM-DD')).toBe(false); // defaults to 1970 (non-leap year) + }); + + test('defaultDate: month for day range validation', () => { + expect(isValid('29', 'D', { defaultDate: { Y: 2024, M: 2 } })).toBe(true); + expect(isValid('29', 'D', { defaultDate: { Y: 2023, M: 2 } })).toBe(false); + expect(isValid('31', 'D', { defaultDate: { Y: 2024, M: 4 } })).toBe(false); // April has 30 days + }); + + test('defaultDate: timezone offset (Z) validation', () => { + expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: 0 } })).toBe(true); + expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: -999 } })).toBe(false); + }); + + test('defaultDate: H out of range', () => { + expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 25 } })).toBe(false); + expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 0 } })).toBe(true); + }); + + test('defaultDate: H not in format with hour24: h24 (regression)', () => { + expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1 }, hour24: 'h24' })).toBe(true); + }); }); diff --git a/tests/parse.spec.ts b/tests/parse.spec.ts index 2944e46..a34315c 100644 --- a/tests/parse.spec.ts +++ b/tests/parse.spec.ts @@ -558,6 +558,41 @@ describe('options', () => { expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: dummyTimeZone }).getTime())).toBe(true); expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'dummyTimeZone' }).getTime())).toBe(true); }); + + test('defaultDate: date components', () => { + expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15 } })) + .toEqual(new Date(2024, 2, 15, 12, 30)); + expect(parse('03-15', 'MM-DD', { defaultDate: { Y: 2024 } })) + .toEqual(new Date(2024, 2, 15)); + }); + + test('defaultDate: time components', () => { + expect(parse('2024-03-15', 'YYYY-MM-DD', { defaultDate: { H: 10, m: 30, s: 45 } })) + .toEqual(new Date(2024, 2, 15, 10, 30, 45)); + }); + + test('defaultDate: timezone offset (Z)', () => { + // Z: -540 means UTC+9 (JST): minutes become 30+(-540)=-510, so Date.UTC(2024,2,15,12,-510) = 03:30 UTC + expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 } })) + .toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30))); + }); + + test('defaultDate: Z takes precedence over timeZone option', () => { + // Z: -540 (UTC+9) overrides timeZone: 'UTC'; 12:30 local → 03:30 UTC + expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 }, timeZone: 'UTC' })) + .toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30))); + }); + + test('defaultDate: 12-hour components (h and A)', () => { + // base.A=1 (PM), base.h=2 → hour = 1*12 + 2 = 14 (2 PM) + expect(parse('30', 'mm', { defaultDate: { Y: 2024, M: 3, D: 15, h: 2, A: 1 } })) + .toEqual(new Date(2024, 2, 15, 14, 30)); + }); + + test('defaultDate: calendar: buddhist interaction', () => { + expect(parse('2567-03-15', 'YYYY-MM-DD', { calendar: 'buddhist' })) + .toEqual(new Date(2024, 2, 15)); + }); }); describe('timeZone Los_Angeles', () => { From a231669559ffc916a94828c97106921008c57e15 Mon Sep 17 00:00:00 2001 From: knowledgecode Date: Wed, 6 May 2026 11:19:02 +0900 Subject: [PATCH 3/4] docs: document defaultDate option and add inline interface definitions - parse.md: add ParserOptions interface block, document defaultDate with examples, move ignoreCase after hour24 to match source order - isValid.md: add defaultDate validation section with leap-year examples - format.md: add FormatterOptions interface block - index.md: remove now-redundant Types/Interfaces section - preparse.md: fix anchor link, mention defaultDate in options summary --- docs/api/format.md | 12 +++++ docs/api/index.md | 82 --------------------------------- docs/api/isValid.md | 19 ++++++++ docs/api/parse.md | 106 ++++++++++++++++++++++++++++++++++--------- docs/api/preparse.md | 4 +- 5 files changed, 117 insertions(+), 106 deletions(-) diff --git a/docs/api/format.md b/docs/api/format.md index b969e52..773be53 100644 --- a/docs/api/format.md +++ b/docs/api/format.md @@ -119,6 +119,18 @@ For available plugins, see the [`plugins`](#plugins) option in FormatterOptions. The `FormatterOptions` object allows you to customize the formatting behavior: +```typescript +interface FormatterOptions { + locale?: Locale; + timeZone?: TimeZone | string; + numeral?: Numeral; + calendar?: 'gregory' | 'buddhist'; + hour12?: 'h11' | 'h12'; + hour24?: 'h23' | 'h24'; + plugins?: FormatterPlugin[]; +} +``` + ### locale **Type**: `Locale` diff --git a/docs/api/index.md b/docs/api/index.md index a799ad2..7332c77 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -73,88 +73,6 @@ format(new Date(), 'YYYY年M月D日(ddd) HH:mm', { // => 2025年8月23日(土) 23:30 ``` -## Types and Interfaces - -### Option Types - -#### FormatterOptions - -```typescript -interface FormatterOptions { - locale?: Locale; // Locale object for localized formatting - timeZone?: TimeZone | string; // Timezone object or IANA timezone name string - numeral?: Numeral; // Numeral system for number formatting - calendar?: 'gregory' | 'buddhist'; // Calendar system - hour12?: 'h11' | 'h12'; // 12-hour format type - hour24?: 'h23' | 'h24'; // 24-hour format type -} -``` - -#### ParserOptions - -```typescript -interface ParserOptions { - locale?: Locale; // Locale object for localized parsing - timeZone?: TimeZone | string; // Timezone object or IANA timezone name string - numeral?: Numeral; // Numeral system for number parsing - calendar?: 'gregory' | 'buddhist'; // Calendar system - hour12?: 'h11' | 'h12'; // 12-hour format type - hour24?: 'h23' | 'h24'; // 24-hour format type - ignoreCase?: boolean; // Case-insensitive parsing -} -``` - -## Format Tokens - -### Date Tokens - -| Token | Meaning | Output Examples | -|--------|----------------------------|-------------------| -| `YYYY` | 4-digit year | 0999, 2015 | -| `YY` | 2-digit year | 99, 01, 15 | -| `Y` | Year without zero padding | 2, 44, 888, 2015 | -| `MMMM` | Full month name | January, December | -| `MMM` | Short month name | Jan, Dec | -| `MM` | Month | 01, 12 | -| `M` | Month without zero padding | 1, 12 | -| `DD` | Day | 02, 31 | -| `D` | Day without zero padding | 2, 31 | - -### Time Tokens - -| Token | Meaning | Output Examples | -|-------|---------------------------------------------|-----------------| -| `HH` | Hour in 24-hour format | 23, 08 | -| `H` | Hour in 24-hour format without zero padding | 23, 8 | -| `hh` | Hour in 12-hour format | 11, 08 | -| `h` | Hour in 12-hour format without zero padding | 11, 8 | -| `mm` | Minutes | 14, 07 | -| `m` | Minutes without zero padding | 14, 7 | -| `ss` | Seconds | 05, 10 | -| `s` | Seconds without zero padding | 5, 10 | -| `SSS` | 3-digit milliseconds | 753, 022 | -| `SS` | 2-digit milliseconds | 75, 02 | -| `S` | 1-digit milliseconds | 7, 0 | - -### Day of Week Tokens - -| Token | Meaning | Output Examples | -|--------|---------------------|-----------------| -| `dddd` | Full day name | Friday, Sunday | -| `ddd` | Short day name | Fri, Sun | -| `dd` | Very short day name | Fr, Su | - -### AM/PM and Timezone Tokens - -| Token | Meaning | Output Examples | -|-------|--------------------------------|-----------------| -| `A` | Uppercase AM/PM | AM, PM | -| `AA` | Uppercase AM/PM (with periods) | A.M., P.M. | -| `a` | Lowercase AM/PM | am, pm | -| `aa` | Lowercase AM/PM (with periods) | a.m., p.m. | -| `Z` | Timezone offset | +0100, -0800 | -| `ZZ` | Timezone offset with colon | +01:00, -08:00 | - ## Supported Locales date-and-time supports 40+ locales. Import only the ones you need: diff --git a/docs/api/isValid.md b/docs/api/isValid.md index 6f05df7..d7be5de 100644 --- a/docs/api/isValid.md +++ b/docs/api/isValid.md @@ -72,6 +72,25 @@ isValid('august 23, 2025', 'MMMM D, YYYY', { ignoreCase: true }); // => true isValid('August 23, 2025', 'MMMM D, YYYY'); // => true (correct case) ``` +### defaultDate Validation + +Use `defaultDate` to provide context for validation of partial date strings. The most practical use case is leap year-aware validation of month-day strings. + +```typescript +import { isValid } from 'date-and-time'; + +// Leap day validation — result depends on the year +isValid('02-29', 'MM-DD', { defaultDate: { Y: 2024 } }); // => true (2024 is a leap year) +isValid('02-29', 'MM-DD', { defaultDate: { Y: 2023 } }); // => false (2023 is not a leap year) +isValid('02-29', 'MM-DD'); // => false (default year 1970 is not a leap year) + +// Day range validation — depends on both year and month +isValid('29', 'D', { defaultDate: { Y: 2024, M: 2 } }); // => true (Feb 2024 has 29 days) +isValid('31', 'D', { defaultDate: { Y: 2024, M: 4 } }); // => false (April has 30 days) +``` + +**Note**: Values provided in `defaultDate` are also subject to range validation. For example, an out-of-range `H` value in `defaultDate` will cause `isValid()` to return `false`. + ## Advanced Validation Patterns ### Multiple Format Validation diff --git a/docs/api/parse.md b/docs/api/parse.md index c6eb586..f6f0817 100644 --- a/docs/api/parse.md +++ b/docs/api/parse.md @@ -124,6 +124,22 @@ For available plugins, see the [`plugins`](#plugins) option in ParserOptions. ## ParserOptions +The `ParserOptions` object allows you to customize the parsing behavior: + +```typescript +interface ParserOptions { + locale?: Locale; + timeZone?: TimeZone | string; + numeral?: Numeral; + calendar?: 'gregory' | 'buddhist'; + hour12?: 'h11' | 'h12'; + hour24?: 'h23' | 'h24'; + ignoreCase?: boolean; + defaultDate?: ParsedComponents; + plugins?: ParserPlugin[]; +} +``` + ### locale **Type**: `Locale` @@ -220,28 +236,6 @@ parse('August 23, 2568', 'MMMM D, YYYY', { calendar: 'buddhist' }); // => Fri Aug 23 2025 00:00:00 GMT-0700 ``` -### ignoreCase - -**Type**: `boolean` -**Default**: `false` - -Enables case-insensitive parsing for text elements. - -```typescript -import { parse } from 'date-and-time'; - -// Case-sensitive (default) -parse('august 23, 2025', 'MMMM D, YYYY'); -// => Invalid Date - -// Case-insensitive -parse('AUGUST 23, 2025', 'MMMM D, YYYY', { ignoreCase: true }); -// => Fri Aug 23 2025 00:00:00 GMT-0700 - -parse('fri aug 23 2025', 'ddd MMM DD YYYY', { ignoreCase: true }); -// => Fri Aug 23 2025 00:00:00 GMT-0700 -``` - ### hour12 **Type**: `"h11" | "h12"` @@ -280,6 +274,72 @@ parse('24:30', 'H:mm', { hour24: 'h24' }); // => Thu Jan 01 1970 00:30:00 GMT-0800 ``` +### ignoreCase + +**Type**: `boolean` +**Default**: `false` + +Enables case-insensitive parsing for text elements. + +```typescript +import { parse } from 'date-and-time'; + +// Case-sensitive (default) +parse('august 23, 2025', 'MMMM D, YYYY'); +// => Invalid Date + +// Case-insensitive +parse('AUGUST 23, 2025', 'MMMM D, YYYY', { ignoreCase: true }); +// => Fri Aug 23 2025 00:00:00 GMT-0700 + +parse('fri aug 23 2025', 'ddd MMM DD YYYY', { ignoreCase: true }); +// => Fri Aug 23 2025 00:00:00 GMT-0700 +``` + +### defaultDate + +**Type**: `ParsedComponents` +**Default**: `{ Y: 1970, M: 1, D: 1, m: 0, s: 0, S: 0 }` + +Specifies default values for date/time components that are missing from the format string. This is useful when parsing partial strings such as time-only or month-day formats. + +```typescript +interface ParsedComponents { + Y?: number; // Year + M?: number; // Month (1-12) + D?: number; // Day + H?: number; // Hour (24-hour) + A?: number; // Meridiem (0: AM, 1: PM) + h?: number; // Hour (12-hour) + m?: number; // Minute + s?: number; // Second + S?: number; // Millisecond + Z?: number; // Timezone offset in minutes (e.g., UTC+9 = -540) +} +``` + +**Note**: If `defaultDate.Z` is set, it takes precedence over the `timeZone` option. `Z` is in minutes, using the same sign convention as the `Z` / `ZZ` format tokens (e.g., UTC+9 = `-540`). + +```typescript +import { parse } from 'date-and-time'; + +// Parse time-only string — fill in date from defaultDate +parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15 } }); +// => Fri Mar 15 2024 12:30:00 + +// Parse month-day only — fill in year from defaultDate +parse('03-15', 'MM-DD', { defaultDate: { Y: 2024 } }); +// => Fri Mar 15 2024 00:00:00 + +// Fill in time components for a date-only format +parse('2024-03-15', 'YYYY-MM-DD', { defaultDate: { H: 10, m: 30, s: 45 } }); +// => Fri Mar 15 2024 10:30:45 + +// defaultDate.Z takes precedence over timeZone option +parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 }, timeZone: 'UTC' }); +// => Fri Mar 15 2024 03:30:00 UTC (interpreted as UTC+9; timeZone: 'UTC' is ignored) +``` + ### plugins **Type**: `ParserPlugin[]` @@ -340,6 +400,8 @@ parse('2025', 'YYYY'); // => Wed Jan 01 2025 00:00:00 GMT-0800 ``` +To customize these defaults, use the [`defaultDate`](#defaultdate) option. + ### Date Range Limitations The parsable maximum date is `December 31, 9999`, and the minimum date is `January 1, 0001`. diff --git a/docs/api/preparse.md b/docs/api/preparse.md index 8a3de15..8bc945d 100644 --- a/docs/api/preparse.md +++ b/docs/api/preparse.md @@ -16,7 +16,7 @@ preparse(dateString, formatString[, options]) |----------------|----------------------------|----------|--------------------------------------------------------------------------| | `dateString` | `string` | Yes | The date string to parse | | `formatString` | `string \| CompiledObject` | Yes | Format pattern string or compiled object | -| `options` | `ParserOptions` | No | Parsing options for customization (see [`parse()`](./parse) for details) | +| `options` | `ParserOptions` | No | Parsing options for customization (see [`parse()`](./parse#parseroptions) for details) | ### Returns @@ -94,7 +94,7 @@ console.log(result); ## ParserOptions -The `options` parameter accepts the same `ParserOptions` as the [`parse()`](./parse#parseroptions) function. This includes locale, timezone, numeral system, calendar, case sensitivity, and hour format settings. Refer to the parse documentation for complete details on all available options. +The `options` parameter accepts the same `ParserOptions` as the [`parse()`](./parse#parseroptions) function. This includes locale, timezone, numeral system, calendar, case sensitivity, hour format settings, and `defaultDate`. Refer to the parse documentation for complete details on all available options. ## Use Cases From 702ef4cff4d329a00bd2d26d6005fa1873277c0f Mon Sep 17 00:00:00 2001 From: knowledgecode Date: Wed, 6 May 2026 11:19:07 +0900 Subject: [PATCH 4/4] chore: bump version to 4.5.0 and update dev dependencies Update @astrojs/starlight, astro, eslint, rollup, and typescript-eslint to latest patch/minor versions. --- package-lock.json | 593 ++++++++++++++++++++++------------------------ package.json | 12 +- 2 files changed, 292 insertions(+), 313 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3156962..ab88374 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,30 +1,30 @@ { "name": "date-and-time", - "version": "4.4.0", + "version": "4.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "date-and-time", - "version": "4.4.0", + "version": "4.5.0", "license": "MIT", "devDependencies": { - "@astrojs/starlight": "^0.38.4", + "@astrojs/starlight": "^0.38.5", "@eslint/js": "^10.0.1", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-terser": "^1.0.0", "@stylistic/eslint-plugin": "^5.10.0", "@types/node": "^25.6.0", "@vitest/coverage-v8": "^4.1.5", - "astro": "^6.1.10", - "eslint": "^10.2.1", + "astro": "^6.2.2", + "eslint": "^10.3.0", "glob": "^13.0.6", "prettier": "^3.8.3", - "rollup": "^4.60.2", + "rollup": "^4.60.3", "rollup-plugin-dts": "^6.4.1", "rollup-plugin-esbuild": "^6.2.1", "tsx": "^4.21.0", - "typescript-eslint": "^8.59.1", + "typescript-eslint": "^8.59.2", "vitest": "^4.1.5" }, "engines": { @@ -32,7 +32,9 @@ } }, "node_modules/@astrojs/compiler": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz", + "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==", "dev": true, "license": "MIT" }, @@ -120,40 +122,40 @@ } }, "node_modules/@astrojs/starlight": { - "version": "0.38.4", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.38.4.tgz", - "integrity": "sha512-TGFIr2aVC+gcZCPQzJOO4ZnA/yL3jRnsUDcKlVdEhxhxaOQnWr9lZ9MRScg9zU6uh3HVeZAmmjkLCdTlHdcaZA==", + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.38.5.tgz", + "integrity": "sha512-35xLSOtZDAMAilHG2zAEZoJ4AaPb+doYOvxuuRTAnmIBSOvujffOAHv3/rr6W/LJtkhBU38PjRDJ4i8QT1uGVw==", "dev": true, "license": "MIT", "dependencies": { - "@astrojs/markdown-remark": "^7.0.0", - "@astrojs/mdx": "^5.0.0", - "@astrojs/sitemap": "^3.7.1", + "@astrojs/markdown-remark": "^7.1.1", + "@astrojs/mdx": "^5.0.4", + "@astrojs/sitemap": "^3.7.2", "@pagefind/default-ui": "^1.3.0", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.6", + "astro-expressive-code": "^0.42.0", "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-select": "^6.0.4", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", "i18next": "^23.11.5", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", + "magic-string": "^0.30.21", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", "mdast-util-to-string": "^4.0.0", "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", + "rehype": "^13.0.2", + "rehype-format": "^5.0.1", + "remark-directive": "^4.0.0", "ultrahtml": "^1.6.0", "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^6.0.0" @@ -286,6 +288,8 @@ }, "node_modules/@ctrl/tinycolor": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", "dev": true, "license": "MIT", "engines": { @@ -882,7 +886,9 @@ } }, "node_modules/@expressive-code/core": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.42.0.tgz", + "integrity": "sha512-MN11+9nfmaC7sYu2BZJXAXqwkBRt8t1xTSqP+Ti1NfTEskgl6xUnzDxoaiQkg0BMzpglA0pys4dpDKquP/cyIw==", "dev": true, "license": "MIT", "dependencies": { @@ -898,98 +904,34 @@ } }, "node_modules/@expressive-code/plugin-frames": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.42.0.tgz", + "integrity": "sha512-XtkPm+941Uta7Y+81Acv+OA/20F1NJmJhCX6UYGKpqEIGqplNh3PTOhcURp6tcruhlzJcWcvpWy6Oigz3SrjqA==", "dev": true, "license": "MIT", "dependencies": { - "@expressive-code/core": "^0.41.7" + "@expressive-code/core": "^0.42.0" } }, "node_modules/@expressive-code/plugin-shiki": { - "version": "0.41.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.41.7", - "shiki": "^3.2.2" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/core": { - "version": "3.23.0", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.42.0.tgz", + "integrity": "sha512-PMKey/kLmewttAHQezL+Y5Fx3vVssfDi3+FJOYQQS2mXP3tQspFELtKKAfsXfmSXdToZYgwoO69HJndqfE+09g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-javascript": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/langs": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/themes": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/types": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@expressive-code/plugin-shiki/node_modules/shiki": { - "version": "3.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.23.0", - "@shikijs/engine-javascript": "3.23.0", - "@shikijs/engine-oniguruma": "3.23.0", - "@shikijs/langs": "3.23.0", - "@shikijs/themes": "3.23.0", - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@expressive-code/core": "^0.42.0", + "shiki": "^4.0.2" } }, "node_modules/@expressive-code/plugin-text-markers": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.42.0.tgz", + "integrity": "sha512-l59lUx8fq1v5g6SpmbDjiU0+7IdfbiWnAyRmtTVSpfhyq+nZMN4UcmYyu2b9Mynhzt7Gr+O+cXyEPDNb2AVWVQ==", "dev": true, "license": "MIT", "dependencies": { - "@expressive-code/core": "^0.41.7" + "@expressive-code/core": "^0.42.0" } }, "node_modules/@humanfs/core": { @@ -1840,9 +1782,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", "cpu": [ "arm" ], @@ -1854,9 +1796,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", "cpu": [ "arm64" ], @@ -1868,7 +1810,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", "cpu": [ "arm64" ], @@ -1880,9 +1824,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", "cpu": [ "x64" ], @@ -1894,9 +1838,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", "cpu": [ "arm64" ], @@ -1908,9 +1852,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", "cpu": [ "x64" ], @@ -1922,9 +1866,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", "cpu": [ "arm" ], @@ -1939,9 +1883,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", "cpu": [ "arm" ], @@ -1956,9 +1900,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", "cpu": [ "arm64" ], @@ -1973,9 +1917,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", "cpu": [ "arm64" ], @@ -1990,9 +1934,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", "cpu": [ "loong64" ], @@ -2007,9 +1951,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", "cpu": [ "loong64" ], @@ -2024,9 +1968,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", "cpu": [ "ppc64" ], @@ -2041,9 +1985,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", "cpu": [ "ppc64" ], @@ -2058,9 +2002,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", "cpu": [ "riscv64" ], @@ -2075,9 +2019,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", "cpu": [ "riscv64" ], @@ -2092,9 +2036,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", "cpu": [ "s390x" ], @@ -2109,9 +2053,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", "cpu": [ "x64" ], @@ -2126,9 +2070,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", "cpu": [ "x64" ], @@ -2143,9 +2087,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", "cpu": [ "x64" ], @@ -2157,9 +2101,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", "cpu": [ "arm64" ], @@ -2171,9 +2115,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", "cpu": [ "arm64" ], @@ -2185,9 +2129,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", "cpu": [ "ia32" ], @@ -2199,9 +2143,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", "cpu": [ "x64" ], @@ -2213,9 +2157,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", "cpu": [ "x64" ], @@ -2452,17 +2396,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", - "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", + "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/type-utils": "8.59.1", - "@typescript-eslint/utils": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/type-utils": "8.59.2", + "@typescript-eslint/utils": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2475,7 +2419,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.1", + "@typescript-eslint/parser": "^8.59.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -2491,16 +2435,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", - "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", + "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3" }, "engines": { @@ -2516,14 +2460,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", + "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.59.2", + "@typescript-eslint/types": "^8.59.2", "debug": "^4.4.3" }, "engines": { @@ -2538,14 +2482,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", + "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2556,9 +2500,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", + "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", "dev": true, "license": "MIT", "engines": { @@ -2573,15 +2517,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", - "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz", + "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/utils": "8.59.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2598,9 +2542,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", + "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", "dev": true, "license": "MIT", "engines": { @@ -2612,16 +2556,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", + "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.2", + "@typescript-eslint/tsconfig-utils": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2640,16 +2584,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", - "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz", + "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1" + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2664,13 +2608,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", + "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2940,13 +2884,13 @@ } }, "node_modules/astro": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.1.10.tgz", - "integrity": "sha512-jQAIki6c862oxRr7OXXC+h3n4wg1EpmKgCH3vv1FtXM9VFmD2iTjlaxrfb0I6eQCwtUjSBxfJBFBDSXHu7Wing==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-6.2.2.tgz", + "integrity": "sha512-zkne2lZU+iTZPBK8F4gbMfrw5f11bT4VXiBxcdFHcPvYyH+Hox7V1sZu97RDpvwmHi+wQ0efKv89KY5744a0jQ==", "dev": true, "license": "MIT", "dependencies": { - "@astrojs/compiler": "^3.0.1", + "@astrojs/compiler": "^4.0.0", "@astrojs/internal-helpers": "0.9.0", "@astrojs/markdown-remark": "7.1.1", "@astrojs/telemetry": "3.3.1", @@ -2967,10 +2911,12 @@ "esbuild": "^0.27.3", "flattie": "^1.1.1", "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", @@ -2989,7 +2935,6 @@ "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", - "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unist-util-visit": "^5.1.0", @@ -3018,11 +2963,13 @@ } }, "node_modules/astro-expressive-code": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.42.0.tgz", + "integrity": "sha512-aiTePi2Cn0mJPYWZSzP1GcxCinX9mNtJyCCshVVPSg1yRwM7ADvFJOx0FnS440M9t65hp8JH//dc2qr22Bm4ag==", "dev": true, "license": "MIT", "dependencies": { - "rehype-expressive-code": "^0.41.7" + "rehype-expressive-code": "^0.42.0" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" @@ -3508,6 +3455,22 @@ "@esbuild/win32-x64": "0.27.7" } }, + "node_modules/astro/node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "dev": true, @@ -3549,6 +3512,8 @@ }, "node_modules/bcp-47-match": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", "dev": true, "license": "MIT", "funding": { @@ -3760,6 +3725,8 @@ }, "node_modules/css-selector-parser": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", "dev": true, "funding": [ { @@ -3798,6 +3765,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -3924,6 +3893,8 @@ }, "node_modules/direction": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", "dev": true, "license": "MIT", "bin": { @@ -4108,9 +4079,9 @@ } }, "node_modules/eslint": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", - "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", + "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", "dev": true, "license": "MIT", "dependencies": { @@ -4370,14 +4341,16 @@ } }, "node_modules/expressive-code": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.42.0.tgz", + "integrity": "sha512-V5DtJLEKuj4wf9O6IRtPtRObkMVy2ggR+S0MdjrTw6m58krZnDioyhW1si3Y04c5YPeooP4nd85Yq9NwEVHS4g==", "dev": true, "license": "MIT", "dependencies": { - "@expressive-code/core": "^0.41.7", - "@expressive-code/plugin-frames": "^0.41.7", - "@expressive-code/plugin-shiki": "^0.41.7", - "@expressive-code/plugin-text-markers": "^0.41.7" + "@expressive-code/core": "^0.42.0", + "@expressive-code/plugin-frames": "^0.42.0", + "@expressive-code/plugin-shiki": "^0.42.0", + "@expressive-code/plugin-text-markers": "^0.42.0" } }, "node_modules/extend": { @@ -4761,6 +4734,8 @@ }, "node_modules/hast-util-select": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", "dev": true, "license": "MIT", "dependencies": { @@ -4880,6 +4855,8 @@ }, "node_modules/hast-util-to-string": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", "dev": true, "license": "MIT", "dependencies": { @@ -5215,6 +5192,13 @@ "dev": true, "license": "MIT" }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "dev": true, @@ -5342,6 +5326,8 @@ }, "node_modules/mdast-util-directive": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5715,7 +5701,9 @@ } }, "node_modules/micromark-extension-directive": { - "version": "3.0.2", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", "dev": true, "license": "MIT", "dependencies": { @@ -6746,6 +6734,8 @@ }, "node_modules/postcss-nested": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "funding": [ { @@ -6770,6 +6760,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -6946,11 +6938,13 @@ } }, "node_modules/rehype-expressive-code": { - "version": "0.41.7", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.42.0.tgz", + "integrity": "sha512-8rp/1YMEVVSYbtz+bFBx+uSx3vA4i4T8RwRm5Q/IWbucQnnQqQ0hDqtmKOr8tv+59Cik6cu5aH3WPo0I7csuTA==", "dev": true, "license": "MIT", "dependencies": { - "expressive-code": "^0.41.7" + "expressive-code": "^0.42.0" } }, "node_modules/rehype-format": { @@ -7023,13 +7017,15 @@ } }, "node_modules/remark-directive": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", "unified": "^11.0.0" }, "funding": { @@ -7192,9 +7188,9 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", "dev": true, "license": "MIT", "dependencies": { @@ -7208,31 +7204,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", "fsevents": "~2.3.2" } }, @@ -7678,25 +7674,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/tsconfck": { - "version": "3.1.6", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -8230,16 +8207,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz", - "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.2.tgz", + "integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.1", - "@typescript-eslint/parser": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1" + "@typescript-eslint/eslint-plugin": "8.59.2", + "@typescript-eslint/parser": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/utils": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8547,6 +8524,8 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 9908481..82fd58a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "date-and-time", - "version": "4.4.0", + "version": "4.5.0", "description": "The simplest, most intuitive date and time library", "keywords": [ "date", @@ -87,22 +87,22 @@ "type": "module", "sideEffects": false, "devDependencies": { - "@astrojs/starlight": "^0.38.4", + "@astrojs/starlight": "^0.38.5", "@eslint/js": "^10.0.1", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-terser": "^1.0.0", "@stylistic/eslint-plugin": "^5.10.0", "@types/node": "^25.6.0", "@vitest/coverage-v8": "^4.1.5", - "astro": "^6.1.10", - "eslint": "^10.2.1", + "astro": "^6.2.2", + "eslint": "^10.3.0", "glob": "^13.0.6", "prettier": "^3.8.3", - "rollup": "^4.60.2", + "rollup": "^4.60.3", "rollup-plugin-dts": "^6.4.1", "rollup-plugin-esbuild": "^6.2.1", "tsx": "^4.21.0", - "typescript-eslint": "^8.59.1", + "typescript-eslint": "^8.59.2", "vitest": "^4.1.5" } }