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 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" } } 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, 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', () => {