From 0885b84edf4c60013fb082f06072e3daddd5e645 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Mon, 9 Mar 2026 22:32:08 +0530 Subject: [PATCH 01/92] chore: add ESLint configuration and npm scripts - Add ESLint with TypeScript and React plugins for code quality - Include linting npm scripts for manual and auto-fix runs - Configure ESLint to ignore build and storybook directories --- eslint.config.js | 41 + package-lock.json | 4294 ++++++++++++++--- package.json | 11 +- src/Calendar.tsx | 2 +- .../core/month_event_item/MonthEventItem.tsx | 14 +- src/components/layout/Header.tsx | 4 +- src/components/ui/popover/Popover.tsx | 4 +- src/components/views/month_view/MonthView.tsx | 4 +- src/hooks/useMonthGrid.ts | 3 +- 9 files changed, 3601 insertions(+), 776 deletions(-) create mode 100644 eslint.config.js diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..0253cc1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,41 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactPlugin from 'eslint-plugin-react' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist', 'node_modules', 'playground', 'storybook-static', 'src/stories'] }, + js.configs.recommended, + ...tseslint.configs.recommended, + { + files: ['**/*.{js,jsx,ts,tsx}'], + plugins: { + react: reactPlugin, + 'react-hooks': reactHooks, + }, + settings: { + react: { + version: '19.2', + }, + }, + languageOptions: { + ecmaVersion: 2020, + globals: { + ...globals.browser, + ...globals.node, + }, + }, + rules: { + ...reactPlugin.configs.recommended.rules, + ...reactPlugin.configs['jsx-runtime'].rules, + ...reactHooks.configs.recommended.rules, + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-empty-object-type': 'off', + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks/refs': 'warn', + }, + }, +) diff --git a/package-lock.json b/package-lock.json index 161e5f1..789e3ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "calendar-simple", - "version": "1.1.1", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "calendar-simple", - "version": "1.1.1", + "version": "1.2.0", "license": "MIT", "dependencies": { "calendarize": "^1.1.1", @@ -15,6 +15,7 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", + "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@storybook/addon-docs": "^10.2.8", @@ -22,11 +23,17 @@ "@types/node": "^25.2.3", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "ajv": "^8.18.0", "esbuild": "^0.27.3", + "eslint": "^10.0.3", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "globals": "^17.4.0", "prettier": "^3.8.1", "semantic-release": "^25.0.3", "storybook": "^10.2.8", "typescript": "^5.8.2", + "typescript-eslint": "^8.56.1", "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4" }, @@ -181,16 +188,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -293,17 +290,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", @@ -860,37 +846,184 @@ "node": ">=18" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": "20 || >=22" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { @@ -982,22 +1115,22 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.56.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.56.3.tgz", - "integrity": "sha512-fRqok4aRNq5GpgGBv2fKlSSKbirPKTJ75vQefthB5x9dwt4Zz+AezUzdc1p/AG4wUBIgmhjcEwn/Rj+N4Wh4Mw==", + "version": "7.57.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.6.tgz", + "integrity": "sha512-0rFv/D8Grzw1Mjs2+8NGUR+o4h9LVm5zKRtMeWnpdB5IMJF4TeHCL1zR5LMCIudkOvyvjbhMG5Wjs0B5nqsrRQ==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/api-extractor-model": "7.33.4", "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.1", - "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.21.0", - "@rushstack/ts-command-line": "5.2.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3", + "@rushstack/rig-package": "0.7.2", + "@rushstack/terminal": "0.22.3", + "@rushstack/ts-command-line": "5.3.3", "diff": "~8.0.2", "lodash": "~4.17.23", - "minimatch": "10.1.2", + "minimatch": "10.2.1", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", @@ -1008,15 +1141,15 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", - "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.4.tgz", + "integrity": "sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.1" + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3" } }, "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { @@ -1033,13 +1166,13 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", + "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": "20 || >=22" @@ -1064,6 +1197,20 @@ "node": ">=10" } }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@microsoft/api-extractor/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -1079,14 +1226,14 @@ "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", - "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.12.0", + "ajv": "~8.18.0", "jju": "~1.4.0", "resolve": "~1.22.2" } @@ -1145,9 +1292,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -1197,9 +1344,9 @@ } }, "node_modules/@octokit/plugin-retry": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", - "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", + "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", "dev": true, "license": "MIT", "dependencies": { @@ -1232,16 +1379,17 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", - "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1588,13 +1736,13 @@ } }, "node_modules/@rushstack/node-core-library": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", - "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "version": "5.20.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.20.3.tgz", + "integrity": "sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "~8.13.0", + "ajv": "~8.18.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", "fs-extra": "~11.3.0", @@ -1612,23 +1760,6 @@ } } }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1666,9 +1797,9 @@ "license": "ISC" }, "node_modules/@rushstack/problem-matcher": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", - "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1681,9 +1812,9 @@ } }, "node_modules/@rushstack/rig-package": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", - "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.2.tgz", + "integrity": "sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==", "dev": true, "license": "MIT", "dependencies": { @@ -1705,14 +1836,14 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.21.0.tgz", - "integrity": "sha512-cLaI4HwCNYmknM5ns4G+drqdEB6q3dCPV423+d3TZeBusYSSm09+nR7CnhzJMjJqeRcdMAaLnrA4M/3xDz4R3w==", + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.22.3.tgz", + "integrity": "sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.19.1", - "@rushstack/problem-matcher": "0.1.1", + "@rushstack/node-core-library": "5.20.3", + "@rushstack/problem-matcher": "0.2.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -1741,13 +1872,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.2.0.tgz", - "integrity": "sha512-lYxCX0nDdkDtCkVpvF0m25ymf66SaMWuppbD6b7MdkIzvGXKBXNIVZlwBH/C0YfkanrupnICWf2n4z3AKSfaHw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.3.tgz", + "integrity": "sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.21.0", + "@rushstack/terminal": "0.22.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -1920,6 +2051,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/github/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -1934,9 +2078,9 @@ } }, "node_modules/@semantic-release/npm": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.4.tgz", - "integrity": "sha512-z5Fn9ftK1QQgFxMSuOd3DtYbTl4hWI2trCEvZcEJMQJy1/OBR0WHcxqzfVun455FSkHML8KgvPxJEa9MtZIBsg==", + "version": "13.1.5", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.5.tgz", + "integrity": "sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==", "dev": true, "license": "MIT", "dependencies": { @@ -1948,7 +2092,7 @@ "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", + "normalize-url": "^9.0.0", "npm": "^11.6.2", "rc": "^1.2.8", "read-pkg": "^10.0.0", @@ -2006,6 +2150,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/execa": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", @@ -2336,6 +2493,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2363,16 +2533,16 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.2.8.tgz", - "integrity": "sha512-cEoWqQrLzrxOwZFee5zrD4cYrdEWKV80POb7jUZO0r5vfl2DuslIr3n/+RfLT52runCV4aZcFEfOfP/IWHNPxg==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.2.16.tgz", + "integrity": "sha512-tdndvqYqUybCFb3co+IfpInfD37mMWtsC9OBBRLEHhHODH/6c16n6iSdzEEOIJhc4rfjxvwNYsTq7jddplAT4g==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "10.2.8", + "@storybook/csf-plugin": "10.2.16", "@storybook/icons": "^2.0.1", - "@storybook/react-dom-shim": "10.2.8", + "@storybook/react-dom-shim": "10.2.16", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -2382,17 +2552,17 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.2.8" + "storybook": "^10.2.16" } }, "node_modules/@storybook/builder-vite": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.2.8.tgz", - "integrity": "sha512-+6/Lwi7W0YIbzHDh798GPp0IHUYDwp0yv0Y1eVNK/StZD0tnv4/1C28NKyP+O7JOsFsuWI1qHiDhw8kNURugZw==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.2.16.tgz", + "integrity": "sha512-fP+fjvHC2oh2mJue3594AscGKY01wnM80+1s5EVQcSJ8hOk69qPKwN+97SUC5XfoZXg4ZMP0eglzY7TT3i2erA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.2.8", + "@storybook/csf-plugin": "10.2.16", "ts-dedent": "^2.0.0" }, "funding": { @@ -2400,14 +2570,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.2.8", + "storybook": "^10.2.16", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.2.8.tgz", - "integrity": "sha512-kKkLYhRXb33YtIPdavD2DU25sb14sqPYdcQFpyqu4TaD9truPPqW8P5PLTUgERydt/eRvRlnhauPHavU1kjsnA==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.2.16.tgz", + "integrity": "sha512-4p4ZFloO70BQwwLYXSH7N1FdZEXISVxJW16941MLSBDtHBqZxVLL+507424hCATi7d65yPKFL2460WVNodTXig==", "dev": true, "license": "MIT", "dependencies": { @@ -2420,7 +2590,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.2.8", + "storybook": "^10.2.16", "vite": "*", "webpack": "*" }, @@ -2458,14 +2628,14 @@ } }, "node_modules/@storybook/react": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.2.8.tgz", - "integrity": "sha512-nMFqQFUXq6Zg2O5SeuomyWnrIx61QfpNQMrfor8eCEzHrWNnXrrvVsz2RnHIgXN8RVyaWGDPh1srAECu/kDHXw==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.2.16.tgz", + "integrity": "sha512-0MQJaeHvjBHnDGpsyxujjvvcgPlXeoF4bTtOhB1vYrdxO5Rozjf7hs9K/gY9hx9v95lTttNsU4Qib5L+K6XK+Q==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.2.8", + "@storybook/react-dom-shim": "10.2.16", "react-docgen": "^8.0.2" }, "funding": { @@ -2475,7 +2645,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.2.8", + "storybook": "^10.2.16", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -2485,9 +2655,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.2.8.tgz", - "integrity": "sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.2.16.tgz", + "integrity": "sha512-waDfcEx8OW78qH8COQLKD2nDtDEXzw1zwXm47VPrRKiyhdea5z8OwO/SIk3y1lcoFMCT1RVJKBdYUPeVAoIB6w==", "dev": true, "license": "MIT", "funding": { @@ -2497,20 +2667,20 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.2.8" + "storybook": "^10.2.16" } }, "node_modules/@storybook/react-vite": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.2.8.tgz", - "integrity": "sha512-x5kmw+TPhxkQV84n4e9X0q6/rA5T8V2QQFolMuN+U93q1HX1r+GZ6g/nXaaq9ox168PhHUJZQnn+LzSQKGCMBA==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.2.16.tgz", + "integrity": "sha512-4HZnBn/XJlbXk/heaV3Gr/zt+NFWn+8ph8ewfMFLWe/oi1PXeXQKBSujreqGz4C8SvBGgrzQ4ORdmycsaESWMg==", "dev": true, "license": "MIT", "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.3", + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.4", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.2.8", - "@storybook/react": "10.2.8", + "@storybook/builder-vite": "10.2.16", + "@storybook/react": "10.2.16", "empathic": "^2.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.0", @@ -2524,31 +2694,10 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.2.8", + "storybook": "^10.2.16", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", @@ -2569,13 +2718,6 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, "node_modules/@testing-library/user-event": { "version": "14.6.1", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", @@ -2608,14 +2750,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2686,6 +2820,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2693,6 +2834,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", @@ -2701,13 +2849,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz", + "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/normalize-package-data": { @@ -2744,57 +2892,300 @@ "dev": true, "license": "MIT" }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, @@ -2832,28 +3223,28 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", - "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.28", + "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", - "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" } }, "node_modules/@vue/compiler-vue2": { @@ -2910,13 +3301,13 @@ } }, "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2926,16 +3317,16 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", - "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", "dev": true, "license": "MIT" }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2945,6 +3336,16 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -2970,16 +3371,16 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3056,14 +3457,13 @@ } }, "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -3091,13 +3491,30 @@ "license": "MIT" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-ify": { @@ -3107,6 +3524,127 @@ "dev": true, "license": "MIT" }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -3130,27 +3668,53 @@ "node": ">=4" } }, - "node_modules/balanced-match": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", - "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { - "jackspeak": "^4.2.3" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/before-after-hook": { @@ -3168,16 +3732,16 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -3252,6 +3816,56 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3263,9 +3877,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", "dev": true, "funding": [ { @@ -3604,6 +4218,13 @@ "dev": true, "license": "MIT" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/confbox": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", @@ -3623,9 +4244,9 @@ } }, "node_modules/conventional-changelog-angular": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", - "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", + "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", "dev": true, "license": "ISC", "dependencies": { @@ -3636,12 +4257,13 @@ } }, "node_modules/conventional-changelog-writer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", - "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", + "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", "dev": true, "license": "MIT", "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", "conventional-commits-filter": "^5.0.0", "handlebars": "^4.7.7", "meow": "^13.0.0", @@ -3678,12 +4300,13 @@ } }, "node_modules/conventional-commits-parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", - "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", + "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", "dev": true, "license": "MIT", "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { @@ -3721,9 +4344,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3805,6 +4428,60 @@ "dev": true, "license": "MIT" }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", @@ -3856,6 +4533,13 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/default-browser": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", @@ -3886,6 +4570,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -3899,14 +4601,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/detect-libc": { @@ -3943,25 +4653,24 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dot-prop": { "version": "5.3.0", @@ -3976,6 +4685,21 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -3987,9 +4711,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", "dev": true, "license": "ISC" }, @@ -4221,6 +4945,183 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -4274,65 +5175,339 @@ } }, "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=4" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" @@ -4372,6 +5547,37 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -4406,6 +5612,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/filesize": { "version": "10.1.6", "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", @@ -4430,16 +5649,20 @@ } }, "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-up-simple": { @@ -4472,6 +5695,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.0.tgz", + "integrity": "sha512-kC6Bb+ooptOIvWj5B63EQWkF0FEnNjV2ZNkLMLZRDDduIiWeFF4iKnslwhiWxjAdbg4NzTNo6h0qLuvFrcx+Sw==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4484,9 +5744,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -4536,6 +5796,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4557,9 +5858,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -4569,21 +5870,78 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/git-log-parser": { - "version": "1.2.1", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.1", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", "dev": true, @@ -4598,23 +5956,79 @@ } }, "node_modules/glob": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz", - "integrity": "sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.2.0", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4644,6 +6058,19 @@ "uglify-js": "^3.1.4" } }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4654,6 +6081,64 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4677,6 +6162,23 @@ "he": "bin/he" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -4713,6 +6215,16 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -4751,6 +6263,16 @@ "node": ">=10.17.0" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -4813,6 +6335,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -4850,6 +6382,21 @@ "dev": true, "license": "ISC" }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/into-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", @@ -4867,6 +6414,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4874,6 +6439,72 @@ "dev": true, "license": "MIT" }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -4890,6 +6521,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -4906,6 +6572,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -4913,91 +6605,312 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -5011,9 +6924,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, @@ -5041,20 +6954,22 @@ "node": "^18.17 || >=20.6.1" } }, - "node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^9.0.0" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, "node_modules/java-properties": { @@ -5107,6 +7022,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5128,6 +7050,20 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.7.tgz", + "integrity": "sha512-7ei3MdAI5+fJPVnKlW77TKNKwQ5ppSzWvhPuSuINT/GYW9ZOC1eRKOuhV9yHG5aEsUPj9BBx5JIekkmoLHxZOw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -5154,6 +7090,32 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", @@ -5161,6 +7123,20 @@ "dev": true, "license": "MIT" }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lightningcss": { "version": "1.31.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", @@ -5478,17 +7454,19 @@ } }, "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -5540,6 +7518,19 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", @@ -5548,24 +7539,13 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/magic-string": { @@ -5579,15 +7559,15 @@ } }, "node_modules/make-asynchronous": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.0.1.tgz", - "integrity": "sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", + "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", "dev": true, "license": "MIT", "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", - "web-worker": "1.2.0" + "web-worker": "^1.5.0" }, "engines": { "node": ">=18" @@ -5644,6 +7624,16 @@ "marked": ">=1 <16" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", @@ -5728,16 +7718,16 @@ } }, "node_modules/minimatch": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", - "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5754,26 +7744,26 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/mlly/node_modules/confbox": { @@ -5840,6 +7830,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5870,10 +7867,29 @@ "node": ">=18" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "dev": true, "license": "MIT" }, @@ -5906,22 +7922,22 @@ } }, "node_modules/normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.0.tgz", + "integrity": "sha512-z9nC87iaZXXySbWWtTHfCFJyFvKaUAW6lODhikG7ILSbVgmwuFjUqkgnheHvAUcGedO29e2QGBRXMUD64aurqQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.10.0.tgz", - "integrity": "sha512-i8hE43iSIAMFuYVi8TxsEISdELM4fIza600aLjJ0ankGPLqd0oTPKMJqAcO/QWm307MbSlWGzJcNZ0lGMQgHPA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.11.0.tgz", + "integrity": "sha512-82gRxKrh/eY5UnNorkTFcdBQAGpgjWehkfGVqAGlJjejEtJZGGJUqjo3mbBTNbc5BTnPKGVtGPBZGhElujX5cw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -5939,7 +7955,6 @@ "cacache", "chalk", "ci-info", - "cli-columns", "fastest-levenshtein", "fs-minipass", "glob", @@ -6001,12 +8016,12 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.3.0", - "@npmcli/config": "^10.7.0", + "@npmcli/arborist": "^9.4.0", + "@npmcli/config": "^10.7.1", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", - "@npmcli/package-json": "^7.0.4", + "@npmcli/package-json": "^7.0.5", "@npmcli/promise-spawn": "^9.0.1", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.3", @@ -6016,29 +8031,28 @@ "cacache": "^20.0.3", "chalk": "^5.6.2", "ci-info": "^4.4.0", - "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^13.0.2", + "glob": "^13.0.6", "graceful-fs": "^4.2.11", "hosted-git-info": "^9.0.2", "ini": "^6.0.0", - "init-package-json": "^8.2.4", + "init-package-json": "^8.2.5", "is-cidr": "^6.0.3", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.1", - "libnpmexec": "^10.2.1", - "libnpmfund": "^7.0.15", + "libnpmdiff": "^8.1.3", + "libnpmexec": "^10.2.3", + "libnpmfund": "^7.0.17", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.1", + "libnpmpack": "^9.1.3", "libnpmpublish": "^11.1.3", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.3", - "minimatch": "^10.1.1", - "minipass": "^7.1.1", + "make-fetch-happen": "^15.0.4", + "minimatch": "^10.2.2", + "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^12.2.0", @@ -6051,7 +8065,7 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.3.1", + "pacote": "^21.4.0", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", @@ -6060,7 +8074,7 @@ "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.7", + "tar": "^7.5.9", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", @@ -6088,25 +8102,25 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/@isaacs/balanced-match": { - "version": "4.0.1", + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT", + "dependencies": { + "retry": "^0.13.1" + }, "engines": { - "node": "20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", + "node_modules/npm/node_modules/@gar/promise-retry/node_modules/retry": { + "version": "0.13.1", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, "engines": { - "node": "20 || >=22" + "node": ">= 4" } }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { @@ -6144,7 +8158,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.3.0", + "version": "9.4.0", "dev": true, "inBundle": true, "license": "ISC", @@ -6191,7 +8205,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.7.0", + "version": "10.7.1", "dev": true, "inBundle": true, "license": "ISC", @@ -6222,17 +8236,17 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.1", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" }, @@ -6306,7 +8320,7 @@ } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.4", + "version": "7.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6317,7 +8331,7 @@ "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -6487,15 +8501,6 @@ "node": ">= 14" } }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/aproba": { "version": "2.1.0", "dev": true, @@ -6508,6 +8513,15 @@ "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/npm/node_modules/bin-links": { "version": "6.0.0", "dev": true, @@ -6536,6 +8550,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/npm/node_modules/cacache": { "version": "20.0.3", "dev": true, @@ -6595,28 +8621,12 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "5.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 10" + "node": ">=20" } }, "node_modules/npm/node_modules/cmd-shim": { @@ -6675,22 +8685,6 @@ "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", "dev": true, @@ -6734,17 +8728,17 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "13.0.2", + "version": "13.0.6", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6801,7 +8795,7 @@ } }, "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", + "version": "0.7.2", "dev": true, "inBundle": true, "license": "MIT", @@ -6811,6 +8805,10 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/npm/node_modules/ignore-walk": { @@ -6844,7 +8842,7 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.4", + "version": "8.2.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6854,7 +8852,6 @@ "promzard": "^3.0.1", "read": "^5.0.1", "semver": "^7.7.2", - "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^7.0.0" }, "engines": { @@ -6870,18 +8867,6 @@ "node": ">= 12" } }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm/node_modules/is-cidr": { "version": "6.0.3", "dev": true, @@ -6894,15 +8879,6 @@ "node": ">=20" } }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/isexe": { "version": "4.0.0", "dev": true, @@ -6965,12 +8941,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.1", + "version": "8.1.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.0", + "@npmcli/arborist": "^9.4.0", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", @@ -6984,19 +8960,19 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.2.1", + "version": "10.2.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.0", + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.4.0", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "read": "^5.0.1", "semver": "^7.3.7", "signal-exit": "^4.1.0", @@ -7007,12 +8983,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.15", + "version": "7.0.17", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.0" + "@npmcli/arborist": "^9.4.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -7032,12 +9008,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.1", + "version": "9.1.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.0", + "@npmcli/arborist": "^9.4.0", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -7116,11 +9092,12 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.3", + "version": "15.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", @@ -7130,7 +9107,6 @@ "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "ssri": "^13.0.0" }, "engines": { @@ -7138,25 +9114,25 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "10.1.2", + "version": "10.2.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", + "version": "7.1.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7174,7 +9150,7 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -7187,7 +9163,7 @@ "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" } }, "node_modules/npm/node_modules/minipass-flush": { @@ -7214,6 +9190,12 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", "dev": true, @@ -7238,6 +9220,12 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/minipass-sized": { "version": "2.0.0", "dev": true, @@ -7383,7 +9371,7 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.3", + "version": "10.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -7464,11 +9452,12 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "21.3.1", + "version": "21.4.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", @@ -7482,7 +9471,6 @@ "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" @@ -7509,7 +9497,7 @@ } }, "node_modules/npm/node_modules/path-scurry": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -7518,7 +9506,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7722,26 +9710,6 @@ "node": ">= 14" } }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.5.0", "dev": true, @@ -7759,7 +9727,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.22", + "version": "3.0.23", "dev": true, "inBundle": true, "license": "CC0-1.0" @@ -7776,32 +9744,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/supports-color": { "version": "10.2.2", "dev": true, @@ -7815,7 +9757,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.7", + "version": "7.5.9", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -7830,15 +9772,6 @@ "node": ">=18" } }, - "node_modules/npm/node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -7949,26 +9882,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "7.0.2", "dev": true, @@ -8016,10 +9929,13 @@ } }, "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/object-assign": { "version": "4.1.1", @@ -8031,6 +9947,104 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -8066,6 +10080,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -8122,29 +10172,35 @@ } }, "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -8270,13 +10326,13 @@ "license": "MIT" }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-key": { @@ -8297,9 +10353,9 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -8307,12 +10363,22 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8384,6 +10450,69 @@ "node": ">=4" } }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/pkg-types": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", @@ -8396,10 +10525,20 @@ "pathe": "^2.0.3" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -8425,6 +10564,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", @@ -8441,33 +10590,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pretty-ms": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", @@ -8491,6 +10613,18 @@ "dev": true, "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -8545,6 +10679,7 @@ "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8582,10 +10717,24 @@ "typescript": ">= 4.3.x" } }, + "node_modules/react-docgen/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/react-dom": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -8595,12 +10744,11 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/read-package-up": { "version": "12.0.0", @@ -8687,6 +10835,13 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/recast": { "version": "0.23.11", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", @@ -8731,6 +10886,50 @@ "node": ">=8" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/registry-auth-token": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", @@ -8840,6 +11039,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -8847,10 +11066,46 @@ "dev": true, "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, "license": "MIT" }, "node_modules/semantic-release": { @@ -8939,6 +11194,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/execa": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", @@ -9137,6 +11405,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9147,17 +11464,93 @@ "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { @@ -9343,9 +11736,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, @@ -9366,10 +11759,24 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/storybook": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.2.8.tgz", - "integrity": "sha512-885uSIn8NQw2ZG7vy84K45lHCOSyz1DVsDV8pHiHQj3J0riCuWLNeO50lK9z98zE8kjhgTtxAAkMTy5nkmNRKQ==", + "version": "10.2.16", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.2.16.tgz", + "integrity": "sha512-Az1Qro0XjCBttsuO55H2aIGPYqGx00T8O3o29rLQswOyZhgAVY9H2EnJiVsfmSG1Kwt8qYTVv7VxzLlqDxropA==", "dev": true, "license": "MIT", "dependencies": { @@ -9484,14 +11891,112 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9792,6 +12297,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -9834,6 +12352,19 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", @@ -9850,10 +12381,88 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9864,6 +12473,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", @@ -9885,6 +12518,25 @@ "node": ">=0.8.0" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici": { "version": "7.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", @@ -9896,9 +12548,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -10165,9 +12817,9 @@ "license": "MIT" }, "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", "dev": true, "license": "Apache-2.0" }, @@ -10194,6 +12846,105 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -10219,19 +12970,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -10375,6 +13113,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", @@ -10387,6 +13138,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/package.json b/package.json index 8963ce5..3d18947 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "scripts": { "build": "rmdir /s /q dist & vite build", "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" + "build-storybook": "storybook build", + "lint": "eslint src", + "lint:fix": "eslint src --fix" }, "keywords": [ "calendar", @@ -43,6 +45,7 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", + "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@storybook/addon-docs": "^10.2.8", @@ -50,11 +53,17 @@ "@types/node": "^25.2.3", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "ajv": "^8.18.0", "esbuild": "^0.27.3", + "eslint": "^10.0.3", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "globals": "^17.4.0", "prettier": "^3.8.1", "semantic-release": "^25.0.3", "storybook": "^10.2.8", "typescript": "^5.8.2", + "typescript-eslint": "^8.56.1", "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4" }, diff --git a/src/Calendar.tsx b/src/Calendar.tsx index 14964e6..59e8bd6 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -45,7 +45,7 @@ function CalendarContent({ if (restProps.view) { dispatch({ type: "SET_VIEW", payload: restProps.view }); } - }, [restProps.view]); + }, [restProps.view, dispatch]); const getViewComponent = (view: ECalendarViewType) => { const commonProps = { diff --git a/src/components/core/month_event_item/MonthEventItem.tsx b/src/components/core/month_event_item/MonthEventItem.tsx index 3e97a57..b891e32 100644 --- a/src/components/core/month_event_item/MonthEventItem.tsx +++ b/src/components/core/month_event_item/MonthEventItem.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef } from "react"; +import React, { useState } from "react"; import cx from "classnames"; import { CalendarContentProps, @@ -51,7 +51,7 @@ function MonthEventItem({ is12Hour, }: MonthEventItemProps) { const [showPopover, setShowPopover] = useState(false); - const moreButtonRef = useRef(null); + const [anchorEl, setAnchorEl] = useState(null); const styleSource = isSelected ? { ...defaultTheme.selected, ...theme?.selected } @@ -137,23 +137,25 @@ function MonthEventItem({ {hiddenEventsCount > 0 && (
- {showPopover && ( + {showPopover && anchorEl && ( setShowPopover(false)} - anchorEl={moreButtonRef.current} + anchorEl={anchorEl} is12Hour={is12Hour} /> )} diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index b05827e..c17ab2e 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -116,7 +116,7 @@ function Header({ let minDate = dateFn(events[0].startDate); let maxDate = minDate; - events.forEach((event: any) => { + events.forEach((event) => { const sd = dateFn(event.startDate); const ed = event.endDate ? dateFn(event.endDate) : sd; if (sd.isBefore(minDate)) minDate = sd; @@ -173,7 +173,7 @@ function Header({ value={view} onChange={onViewDropdownClick} > - {VIEW_OPTIONS.map((option: any) => ( + {VIEW_OPTIONS.map((option) => ( diff --git a/src/components/ui/popover/Popover.tsx b/src/components/ui/popover/Popover.tsx index fd75963..c0f1258 100644 --- a/src/components/ui/popover/Popover.tsx +++ b/src/components/ui/popover/Popover.tsx @@ -52,7 +52,7 @@ function Popover({ const PADDING = 10; // Base position: bottom-left of the anchor - let top = anchorRect.bottom + 4; // 4px gap + const top = anchorRect.bottom + 4; // 4px gap let left = anchorRect.left; // Available space in viewport @@ -62,7 +62,7 @@ function Popover({ const spaceBelow = viewportHeight - top; const spaceAbove = anchorRect.top - PADDING; - let newStyle: CSSProperties = { + const newStyle: CSSProperties = { visibility: "visible", position: "fixed", top: `${top}px`, diff --git a/src/components/views/month_view/MonthView.tsx b/src/components/views/month_view/MonthView.tsx index b0a534b..a09353a 100644 --- a/src/components/views/month_view/MonthView.tsx +++ b/src/components/views/month_view/MonthView.tsx @@ -91,9 +91,9 @@ function MonthView({ - {calendarGrid.map((week: any[], weekIndex: number) => ( + {calendarGrid.map((week, weekIndex) => ( - {week.map((dayInfo: any, dayIndex: number) => ( + {week.map((dayInfo, dayIndex) => ( { - let currentDate = dateFn(selectedDate); + let currentDate: DateType; let isCurrentMonth = true; let displayDay = day; From 0bbf3f87a30fc092fb4fdf7569823d8b4a1f30d6 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Tue, 10 Mar 2026 23:48:11 +0530 Subject: [PATCH 02/92] chore: set legacy-peer-deps to true in npm config This resolves potential dependency conflicts when installing packages with mismatched peer dependencies, ensuring a smoother installation process. --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index 7eff787..a467a11 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,4 @@ +legacy-peer-deps = true //npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN} # registry=https://npm.pkg.github.com registry=https://registry.npmjs.org \ No newline at end of file From 640e529aebb2f1d6b3effab2d165aac9bd175722 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Wed, 11 Mar 2026 22:00:21 +0530 Subject: [PATCH 03/92] chore: add prettier configuration and format code - Add .prettierrc with formatting rules and .prettierignore file - Integrate eslint-config-prettier to avoid conflicts between ESLint and Prettier - Update package.json with format scripts and add eslint-config-prettier dependency - Apply Prettier formatting to existing code (quotes, semicolons, trailing commas) - Fix missing newline at end of file in index.css and preview.ts --- .prettierignore | 15 +++++++++++++++ .prettierrc | 12 ++++++++++++ .storybook/preview.ts | 12 ++++++------ eslint.config.js | 2 ++ package-lock.json | 17 +++++++++++++++++ package.json | 5 ++++- playground/README.md | 22 +++++++++++----------- playground/src/index.css | 2 +- playground/src/main.tsx | 12 ++++++------ src/declarations.d.ts | 2 +- 10 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1a92dbd --- /dev/null +++ b/.prettierignore @@ -0,0 +1,15 @@ +# Ignore Artifacts +node_modules +dist +storybook-static +coverage +.cache + +# Misc +.env +.npmrc +eslint.config.js +package-lock.json + +# Ignore generated documentation +docs/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..1832759 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "trailingComma": "all", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 073582e..3b80344 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,11 +1,11 @@ -import type { Preview } from '@storybook/react-vite' +import type { Preview } from "@storybook/react-vite"; const preview: Preview = { parameters: { controls: { matchers: { - color: /(background|color)$/i, - date: /Date$/i, + color: /(background|color)$/i, + date: /Date$/i, }, }, @@ -13,9 +13,9 @@ const preview: Preview = { // 'todo' - show a11y violations in the test UI only // 'error' - fail CI on a11y violations // 'off' - skip a11y checks entirely - test: 'todo' - } + test: "todo", + }, }, }; -export default preview; \ No newline at end of file +export default preview; diff --git a/eslint.config.js b/eslint.config.js index 0253cc1..e895233 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,6 +3,7 @@ import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactPlugin from 'eslint-plugin-react' import tseslint from 'typescript-eslint' +import eslintConfigPrettier from 'eslint-config-prettier' export default tseslint.config( { ignores: ['dist', 'node_modules', 'playground', 'storybook-static', 'src/stories'] }, @@ -38,4 +39,5 @@ export default tseslint.config( 'react-hooks/refs': 'warn', }, }, + eslintConfigPrettier, ) diff --git a/package-lock.json b/package-lock.json index 789e3ef..4aa6434 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "ajv": "^8.18.0", "esbuild": "^0.27.3", "eslint": "^10.0.3", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.4.0", @@ -5243,6 +5244,22 @@ } } }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", diff --git a/package.json b/package.json index 3d18947..f9f820d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,9 @@ "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "lint": "eslint src", - "lint:fix": "eslint src --fix" + "lint:fix": "eslint src --fix", + "format": "prettier --write .", + "format:check": "prettier --check ." }, "keywords": [ "calendar", @@ -56,6 +58,7 @@ "ajv": "^8.18.0", "esbuild": "^0.27.3", "eslint": "^10.0.3", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.4.0", diff --git a/playground/README.md b/playground/README.md index d2e7761..8c2d760 100644 --- a/playground/README.md +++ b/playground/README.md @@ -17,9 +17,9 @@ If you are developing a production application, we recommend updating the config ```js export default defineConfig([ - globalIgnores(['dist']), + globalIgnores(["dist"]), { - files: ['**/*.{ts,tsx}'], + files: ["**/*.{ts,tsx}"], extends: [ // Other configs... @@ -34,40 +34,40 @@ export default defineConfig([ ], languageOptions: { parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], + project: ["./tsconfig.node.json", "./tsconfig.app.json"], tsconfigRootDir: import.meta.dirname, }, // other options... }, }, -]) +]); ``` You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: ```js // eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' +import reactX from "eslint-plugin-react-x"; +import reactDom from "eslint-plugin-react-dom"; export default defineConfig([ - globalIgnores(['dist']), + globalIgnores(["dist"]), { - files: ['**/*.{ts,tsx}'], + files: ["**/*.{ts,tsx}"], extends: [ // Other configs... // Enable lint rules for React - reactX.configs['recommended-typescript'], + reactX.configs["recommended-typescript"], // Enable lint rules for React DOM reactDom.configs.recommended, ], languageOptions: { parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], + project: ["./tsconfig.node.json", "./tsconfig.app.json"], tsconfigRootDir: import.meta.dirname, }, // other options... }, }, -]) +]); ``` diff --git a/playground/src/index.css b/playground/src/index.css index bbf4f9b..274bfb3 100644 --- a/playground/src/index.css +++ b/playground/src/index.css @@ -3,4 +3,4 @@ justify-content: center; align-items: center; height: 100vh; -} \ No newline at end of file +} diff --git a/playground/src/main.tsx b/playground/src/main.tsx index bef5202..eff7ccc 100644 --- a/playground/src/main.tsx +++ b/playground/src/main.tsx @@ -1,10 +1,10 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; -createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById("root")!).render( , -) +); diff --git a/src/declarations.d.ts b/src/declarations.d.ts index 3d673e2..f2d12bb 100644 --- a/src/declarations.d.ts +++ b/src/declarations.d.ts @@ -1,4 +1,4 @@ -declare module '*.module.css' { +declare module "*.module.css" { const classes: { [key: string]: string }; export default classes; } From 8efb08ef149151b901cc7c5784197cc652edf227 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Thu, 12 Mar 2026 22:36:22 +0530 Subject: [PATCH 04/92] chore: implement husky, commitlint and lint-staged --- .husky/commit-msg | 1 + .husky/pre-commit | 1 + commitlint.config.js | 3 + package-lock.json | 874 ++++++++++++++++++++++++++++++++++++++++++- package.json | 16 +- 5 files changed, 890 insertions(+), 5 deletions(-) create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 commitlint.config.js diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..0398b7a --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..b29b5ae --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +export default { + extends: ["@commitlint/config-conventional"], +}; diff --git a/package-lock.json b/package-lock.json index 4aa6434..9927590 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,8 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", + "@commitlint/cli": "^20.4.4", + "@commitlint/config-conventional": "^20.4.4", "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", @@ -30,6 +32,8 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.3.3", "prettier": "^3.8.1", "semantic-release": "^25.0.3", "storybook": "^10.2.8", @@ -371,6 +375,416 @@ "node": ">=0.1.90" } }, + "node_modules/@commitlint/cli": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.4.tgz", + "integrity": "sha512-GLMNQHYGcn0ohL2HMlAnXcD1PS2vqBBGbYKlhrRPOYsWiRoLWtrewsR3uKRb9v/IdS+qOS0vqJQ64n1g8VPKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^20.4.4", + "@commitlint/lint": "^20.4.4", + "@commitlint/load": "^20.4.4", + "@commitlint/read": "^20.4.4", + "@commitlint/types": "^20.4.4", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.4.tgz", + "integrity": "sha512-Usg+XXbPNG2GtFWTgRURNWCge1iH1y6jQIvvklOdAbyn2t8ajfVwZCnf5t5X4gUsy17BOiY+myszGsSMIvhOVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "conventional-changelog-conventionalcommits": "^9.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.4.tgz", + "integrity": "sha512-K8hMS9PTLl7EYe5vWtSFQ/sgsV2PHUOtEnosg8k3ZQxCyfKD34I4C7FxWEfRTR54rFKeUYmM3pmRQqBNQeLdlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.4.tgz", + "integrity": "sha512-QivV0M1MGL867XCaF+jJkbVXEPKBALhUUXdjae66hes95aY1p3vBJdrcl3x8jDv2pdKWvIYIz+7DFRV/v0dRkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", + "integrity": "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.4.tgz", + "integrity": "sha512-jLi/JBA4GEQxc5135VYCnkShcm1/rarbXMn2Tlt3Si7DHiiNKHm4TaiJCLnGbZ1r8UfwDRk+qrzZ80kwh08Aow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.4.tgz", + "integrity": "sha512-y76rT8yq02x+pMDBI2vY4y/ByAwmJTkta/pASbgo8tldBiKLduX8/2NCRTSCjb3SumE5FBeopERKx3oMIm8RTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.4.tgz", + "integrity": "sha512-svOEW+RptcNpXKE7UllcAsV0HDIdOck9reC2TP1QA6K5Fo0xxQV+QPjV8Zqx9g6X/hQBkF2S9ZQZ78Xrv1Eiog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^20.4.4", + "@commitlint/parse": "^20.4.4", + "@commitlint/rules": "^20.4.4", + "@commitlint/types": "^20.4.4" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.4.tgz", + "integrity": "sha512-kvFrzvoIACa/fMjXEP0LNEJB1joaH3q3oeMJsLajXE5IXjYrNGVcW1ZFojXUruVJ7odTZbC3LdE/6+ONW4f2Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.4.4", + "@commitlint/execute-rule": "^20.0.0", + "@commitlint/resolve-extends": "^20.4.4", + "@commitlint/types": "^20.4.4", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "is-plain-obj": "^4.1.0", + "lodash.mergewith": "^4.6.2", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/message": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", + "integrity": "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.4.tgz", + "integrity": "sha512-AjfgOgrjEozeQNzhFu1KL5N0nDx4JZmswVJKNfOTLTUGp6xODhZHCHqb//QUHKOzx36If5DQ7tci2o7szYxu1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.4", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.4.tgz", + "integrity": "sha512-jvgdAQDdEY6L8kCxOo21IWoiAyNFzvrZb121wU2eBxI1DzWAUZgAq+a8LlJRbT0Qsj9INhIPVWgdaBbEzlF0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^20.4.3", + "@commitlint/types": "^20.4.4", + "git-raw-commits": "^5.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.4.tgz", + "integrity": "sha512-pyOf+yX3c3m/IWAn2Jop+7s0YGKPQ8YvQaxt9IQxnLIM3yZAlBdkKiQCT14TnrmZTkVGTXiLtckcnFTXYwlY0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.4.4", + "@commitlint/types": "^20.4.4", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.4.tgz", + "integrity": "sha512-PmUp8QPLICn9w05dAx5r1rdOYoTk7SkfusJJh5tP3TqHwo2mlQ9jsOm8F0HSXU9kuLfgTEGNrunAx/dlK/RyPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^20.4.4", + "@commitlint/message": "^20.4.3", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.4.4" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", + "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.4.tgz", + "integrity": "sha512-dwTGzyAblFXHJNBOgrTuO5Ee48ioXpS5XPRLLatxhQu149DFAHUcB3f0Q5eea3RM4USSsP1+WVT2dBtLVod4fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.6.0.tgz", + "integrity": "sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.3.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@conventional-changelog/git-client/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@emnapi/core": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", @@ -2494,6 +2908,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, "node_modules/@simple-libs/stream-utils": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", @@ -3988,6 +4418,22 @@ "node": ">=6" } }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-highlight": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", @@ -4132,13 +4578,47 @@ "dev": true, "license": "MIT", "dependencies": { - "string-width": "^4.2.0" + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=20" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { @@ -4201,6 +4681,23 @@ "dev": true, "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -4257,6 +4754,19 @@ "node": ">=18" } }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.0.tgz", + "integrity": "sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/conventional-changelog-writer": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", @@ -4371,6 +4881,24 @@ } } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz", + "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "^2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -5509,6 +6037,13 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5972,6 +6507,23 @@ "traverse": "0.6.8" } }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -6003,6 +6555,32 @@ "node": ">=10.13.0" } }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/globals": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", @@ -6280,6 +6858,22 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -6999,6 +7593,16 @@ "node": ">= 0.6.0" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -7422,6 +8026,48 @@ "dev": true, "license": "MIT" }, + "node_modules/lint-staged": { + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.3.tgz", + "integrity": "sha512-RLq2koZ5fGWrx7tcqx2tSTMQj4lRkfNJaebO/li/uunhCJbtZqwTuwPHpgIimAHHi/2nZIiGrkCHDCOeR1onxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.2", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -7500,6 +8146,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -7528,6 +8181,34 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", @@ -7535,6 +8216,66 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7724,6 +8465,19 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -11011,6 +11765,59 @@ "node": ">=8" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rolldown": { "version": "1.0.0-beta.53", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.53.tgz", @@ -11696,6 +12503,39 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12251,6 +13091,16 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -13077,6 +13927,22 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", diff --git a/package.json b/package.json index f9f820d..1650793 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,17 @@ "lint": "eslint src", "lint:fix": "eslint src --fix", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "prepare": "husky" + }, + "lint-staged": { + "*.{js,ts,jsx,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,css,md}": [ + "prettier --write" + ] }, "keywords": [ "calendar", @@ -47,6 +57,8 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", + "@commitlint/cli": "^20.4.4", + "@commitlint/config-conventional": "^20.4.4", "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", @@ -62,6 +74,8 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.3.3", "prettier": "^3.8.1", "semantic-release": "^25.0.3", "storybook": "^10.2.8", From 338fe09aabac43e18c3cd1cd8f236794f3ea742c Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Fri, 13 Mar 2026 22:17:50 +0530 Subject: [PATCH 05/92] ci: add github actions workflow for pull requests --- .github/workflows/ci.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..39af0de --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +name: CI Pipeline + +on: + pull_request: + +jobs: + build_and_test: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x, 22.x] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Check code formatting + run: npm run format:check + + - name: Run ESLint + run: npm run lint + + - name: Verify build + run: npm run build From 9f00c150a6e13c268590d3f6f7ebaa02a67dcb7d Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Sun, 15 Mar 2026 23:14:34 +0530 Subject: [PATCH 06/92] feat(calendar): add configurable week start and end days - Add weekStartsOn and weekEndsOn props to various views - Update WeekView to calculate days based on config - Modify MonthView to generate custom week range grids - Extend useMonthGrid hook to accept week boundaries - Set default values (0 for Sun, 6 for Sat) in constants --- .github/workflows/ci.yml | 30 ++++++++-------- src/Calendar.tsx | 4 +++ src/components/views/month_view/MonthView.tsx | 22 +++++++++--- src/components/views/week_view/WeekView.tsx | 24 +++++++++---- src/constants/time.ts | 4 ++- src/hooks/useMonthGrid.ts | 35 +++++++++++-------- src/types/calendar.ts | 6 +++- 7 files changed, 83 insertions(+), 42 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39af0de..4e301d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,23 +12,23 @@ jobs: node-version: [18.x, 20.x, 22.x] steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" - - name: Install dependencies - run: npm ci + - name: Install dependencies + run: npm ci - - name: Check code formatting - run: npm run format:check + - name: Check code formatting + run: npm run format:check - - name: Run ESLint - run: npm run lint + - name: Run ESLint + run: npm run lint - - name: Verify build - run: npm run build + - name: Verify build + run: npm run build diff --git a/src/Calendar.tsx b/src/Calendar.tsx index 59e8bd6..1446442 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -33,6 +33,8 @@ function CalendarContent({ showCurrentTime, maxEvents, autoScrollToCurrentTime, + weekStartsOn, + weekEndsOn, ...restProps }: CalendarContentProps) { const { @@ -58,6 +60,8 @@ function CalendarContent({ showCurrentTime, maxEvents, autoScrollToCurrentTime, + weekStartsOn, + weekEndsOn, }; switch (view) { case ECalendarViewType.day: diff --git a/src/components/views/month_view/MonthView.tsx b/src/components/views/month_view/MonthView.tsx index a09353a..989f76f 100644 --- a/src/components/views/month_view/MonthView.tsx +++ b/src/components/views/month_view/MonthView.tsx @@ -27,6 +27,8 @@ interface MonthViewProps extends Pick< | "onMoreClick" | "theme" | "classNames" + | "weekStartsOn" + | "weekEndsOn" > {} function MonthView({ @@ -40,12 +42,19 @@ function MonthView({ events, is12Hour, classNames, + weekStartsOn, + weekEndsOn, ...restProps }: MonthViewProps) { const { state, dispatch } = useCalendar(); const { selectedDate } = state; - const calendarGrid = useMonthGrid(selectedDate, events); + const calendarGrid = useMonthGrid( + selectedDate, + events, + weekStartsOn, + weekEndsOn, + ); const maxEvents = useMemo( () => @@ -68,6 +77,12 @@ function MonthView({ [selectedDate, onDateClick, selectable, dispatch], ); + const headerDays = useMemo(() => { + const list = DAY_LIST_NAME[dayType]; + const length = ((weekEndsOn - weekStartsOn + 7) % 7) + 1; + return Array.from({ length }, (_, i) => list[(weekStartsOn + i) % 7]); + }, [dayType, weekStartsOn, weekEndsOn]); + return (
- {DAY_LIST_NAME[dayType].map((day: string) => ( + {headerDays.map((day: string) => ( diff --git a/src/constants/time.ts b/src/constants/time.ts index ce515b2..797d460 100644 --- a/src/constants/time.ts +++ b/src/constants/time.ts @@ -76,6 +76,7 @@ export const defaultCalenderProps = { weekEndsOn: 6, theme: {}, classNames: {}, + showAdjacentMonths: true, }; export const DATE_FORMATS = { diff --git a/src/types/calendar.ts b/src/types/calendar.ts index 021418e..0ba0303 100644 --- a/src/types/calendar.ts +++ b/src/types/calendar.ts @@ -80,6 +80,7 @@ export interface CalendarProps { maxHour?: number; weekStartsOn?: number; // 0 (Sunday) to 6 (Saturday) weekEndsOn?: number; // 0 to 6 + showAdjacentMonths?: boolean; // --- Layout --- width?: number | string; @@ -112,6 +113,7 @@ export interface CalendarContentProps extends RequiredSome< | "maxHour" | "weekStartsOn" | "weekEndsOn" + | "showAdjacentMonths" | "width" | "height" | "theme" From 902c9977696fac9d53bc174ffecd9b0227f8a452 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Wed, 18 Mar 2026 08:15:32 +0530 Subject: [PATCH 10/92] feat(calendar): add custom days view for flexible multi-day calendar display - Introduce new `customDays` view type for displaying 1-10 consecutive days - Add `CustomDaysView` with time grid layout and configurable day count - Update CalendarContext to handle navigation for custom day ranges - Extend Header component for date range and navigation in custom views - Add Storybook stories for custom day configurations (1, 3, 5, 10 days) - Include validation to ensure customDays is between 1 and 10 inclusive --- src/Calendar.tsx | 16 +- src/components/layout/Header.tsx | 35 +++- .../CustomDaysView.module.css | 82 +++++++++ .../views/custom_days_view/CustomDaysView.tsx | 161 ++++++++++++++++++ src/context/CalendarContext.tsx | 19 +++ src/stories/CustomView.stories.tsx | 40 +++++ src/types/calendar.ts | 2 + 7 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 src/components/views/custom_days_view/CustomDaysView.module.css create mode 100644 src/components/views/custom_days_view/CustomDaysView.tsx create mode 100644 src/stories/CustomView.stories.tsx diff --git a/src/Calendar.tsx b/src/Calendar.tsx index e898a12..42a1e2d 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -15,6 +15,7 @@ import DayView from "./components/views/day_view/DayView"; import WeekView from "./components/views/week_view/WeekView"; import MonthView from "./components/views/month_view/MonthView"; import ScheduleView from "./components/views/schedule_view/ScheduleView"; +import CustomDaysView from "./components/views/custom_days_view/CustomDaysView"; import { CalendarProvider, useCalendar } from "./context/CalendarContext"; function CalendarContent({ @@ -35,6 +36,7 @@ function CalendarContent({ weekEndsOn, minHour, maxHour, + customDays, theme, classNames, ...restProps @@ -77,14 +79,17 @@ function CalendarContent({ ); case ECalendarViewType.schedule: return ; + case ECalendarViewType.customDays: + if (!customDays || customDays < 1 || customDays > 10) return null; + return ; default: return null; } @@ -107,6 +112,7 @@ function CalendarContent({ onViewChange={onViewChange} pastYearLength={pastYearLength} futureYearLength={futureYearLength} + customDays={customDays} /> {getViewComponent(view)} @@ -138,7 +144,11 @@ function Calendar({ const validEvents = useEvents(allProps.events); return ( - +
{ headerClassName?: string; } @@ -56,6 +57,7 @@ function Header({ onNavigate, onViewChange, events, + customDays, }: HeaderProps) { const { state, dispatch } = useCalendar(); const { selectedDate, view } = state; @@ -67,9 +69,17 @@ function Header({ const unit = ( view === ECalendarViewType.schedule ? "day" : view ) as ManipulateType; - const predictiveDate = isAdd - ? selectedDate.add(1, unit) - : selectedDate.subtract(1, unit); + + let predictiveDate; + if (view === ECalendarViewType.customDays) { + predictiveDate = isAdd + ? selectedDate.add(customDays || 3, "day") + : selectedDate.subtract(customDays || 3, "day"); + } else { + predictiveDate = isAdd + ? selectedDate.add(1, unit) + : selectedDate.subtract(1, unit); + } onNavigate?.(convertToDate(predictiveDate)); }; @@ -111,6 +121,20 @@ function Header({ return `${formatDate(startOfWeek, DATE_FORMATS.SHORT_MONTH)} - ${formatDate(endOfWeek, DATE_FORMATS.SHORT_MONTH_YEAR)}`; } } + if (view === ECalendarViewType.customDays) { + const days = customDays || 3; + const endDate = selectedDate.add(days - 1, "day"); + if (selectedDate.month() !== endDate.month()) { + if (selectedDate.year() !== endDate.year()) { + return `${formatDate(selectedDate, DATE_FORMATS.SHORT_MONTH_YEAR)} - ${formatDate(endDate, DATE_FORMATS.SHORT_MONTH_YEAR)}`; + } + return `${formatDate(selectedDate, DATE_FORMATS.SHORT_MONTH)} - ${formatDate(endDate, DATE_FORMATS.SHORT_MONTH_YEAR)}`; + } + if (days === 1) { + return formatDate(selectedDate, DATE_FORMATS.MONTH_DAY_YEAR); + } + return `${formatDate(selectedDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH)} - ${formatDate(endDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH)}, ${formatDate(selectedDate, "YYYY")}`; + } if (view === ECalendarViewType.schedule) { if (events && events.length > 0) { let minDate = dateFn(events[0].startDate); @@ -178,6 +202,11 @@ function Header({ {option.label} ))} + {customDays && customDays > 0 && customDays < 11 && ( + + )} onDropdownClick(e, EYearOption.month)} > @@ -223,8 +223,8 @@ function Header({
{} function WeekView({ @@ -35,18 +37,26 @@ function WeekView({ showCurrentTime, maxEvents, autoScrollToCurrentTime, + weekStartsOn, + weekEndsOn, }: WeekViewProps) { const containerRef = useRef(null); const { state } = useCalendar(); const { selectedDate } = state; - const startOfWeek = useMemo( - () => selectedDate.startOf("week"), - [selectedDate], - ); + const startOfWeek = useMemo(() => { + const currentDay = selectedDate.day(); + const diff = + currentDay >= weekStartsOn + ? weekStartsOn - currentDay + : weekStartsOn - currentDay - 7; + return selectedDate.add(diff, "day").startOf("day"); + }, [selectedDate, weekStartsOn]); const weekDays = useMemo(() => { - return Array.from({ length: 7 }, (_, i) => startOfWeek.add(i, "day")); - }, [startOfWeek]); + let length = weekEndsOn - weekStartsOn + 1; + if (length <= 0) length += 7; + return Array.from({ length }, (_, i) => startOfWeek.add(i, "day")); + }, [startOfWeek, weekStartsOn, weekEndsOn]); // Calculate events for each day of the week // The hook resolves the layout computation for all 7 days efficiently @@ -94,7 +104,7 @@ function WeekView({ className={cx(styles.dayHeader, classNames?.dayHeader)} >
- {DAY_LIST_NAME[dayType][index]} + {DAY_LIST_NAME[dayType][date.day()]}
{ // Sort events @@ -83,30 +85,35 @@ export default function useMonthGrid( ); }); - const calendarArray = calendarize(selectedDate.toDate()); + const length = ((weekEndsOn - weekStartsOn + 7) % 7) + 1; + const calendarArray = calendarize(selectedDate.toDate(), weekStartsOn); return calendarArray.map((week: number[], weekIndex: number) => { + const slicedWeek = week.slice(0, length); // ------------------------------------------------------------------------- // 1. Grid Generation: Calculate dates for the entire week first // ------------------------------------------------------------------------- - const processedWeek = week.map((day: number, dayIndex: number) => { + const processedWeek = slicedWeek.map((day: number, dayIndex: number) => { let currentDate: DateType; let isCurrentMonth = true; let displayDay = day; if (day === 0) { isCurrentMonth = false; + const startOfMonth = getStartOfMonth(selectedDate); + const startDayOfWeek = getMonthStartingDay(selectedDate); + const diffFromWeekStartToMonthStart = + (startDayOfWeek - weekStartsOn + 7) % 7; + if (weekIndex === 0) { - const startOfMonth = getStartOfMonth(selectedDate); - const startDayOfWeek = getMonthStartingDay(selectedDate); - currentDate = subDays(startOfMonth, startDayOfWeek - dayIndex); + currentDate = subDays( + startOfMonth, + diffFromWeekStartToMonthStart - dayIndex, + ); displayDay = getDate(currentDate); } else { - const startOfMonth = getStartOfMonth(selectedDate); - const startDayOfWeek = getMonthStartingDay(selectedDate); - const globalIndex = weekIndex * 7 + dayIndex; - const daysFromStart = globalIndex - startDayOfWeek; + const daysFromStart = globalIndex - diffFromWeekStartToMonthStart; currentDate = addDays(startOfMonth, daysFromStart); displayDay = getDate(currentDate); @@ -170,13 +177,13 @@ export default function useMonthGrid( // 2. Find the lowest `slotIndex` where `slots[day][slotIndex]` is empty for all days in the range. // 3. Mark that slot as used for those days. // ------------------------------------------------------------------------- - const slots: string[][] = Array(7) + const slots: string[][] = Array(length) .fill(null) .map(() => []); // slots[dayIndex][slotIndex] = eventId const eventSlots = new Map(); // Map for quick lookup later weekEvents.forEach((event, index) => { - // Determine start/end indices in this week (0..6) + // Determine start/end indices in this week (0..length-1) // We clip the event's start/end to the current week's boundaries because // we are only rendering one week at a time in this loop. const start = getStartOfDay(event.startDate); @@ -187,7 +194,7 @@ export default function useMonthGrid( // Clip to week boundaries if (startIndex < 0) startIndex = 0; - if (endIndex > 6) endIndex = 6; + if (endIndex > length - 1) endIndex = length - 1; // Find first available slot let slotIndex = 0; @@ -260,7 +267,7 @@ export default function useMonthGrid( const itemEndDate = event.endDate ? getStartOfDay(event.endDate) : getStartOfDay(event.startDate); - const endOfWeekDate = addDays(currentDate, 6 - dayIndex); + const endOfWeekDate = addDays(currentDate, length - 1 - dayIndex); let effectiveEndDate = itemEndDate; if (isAfterDate(itemEndDate, endOfWeekDate)) { @@ -294,5 +301,5 @@ export default function useMonthGrid( }; }); }); - }, [selectedDate, events]); + }, [selectedDate, events, weekStartsOn, weekEndsOn]); } diff --git a/src/types/calendar.ts b/src/types/calendar.ts index 5eeba3b..bb0464e 100644 --- a/src/types/calendar.ts +++ b/src/types/calendar.ts @@ -1,4 +1,4 @@ -import { CalendarEvent } from "./events"; +import { CalendarEvent } from "./events"; export type RequiredSome = Omit & Required>; @@ -76,6 +76,8 @@ export interface CalendarProps { futureYearLength?: number; showCurrentTime?: boolean; autoScrollToCurrentTime?: boolean; + weekStartsOn?: number; // 0 (Sunday) to 6 (Saturday) + weekEndsOn?: number; // 0 to 6 // --- Layout --- width?: number | string; @@ -104,6 +106,8 @@ export interface CalendarContentProps extends RequiredSome< | "futureYearLength" | "showCurrentTime" | "autoScrollToCurrentTime" + | "weekStartsOn" + | "weekEndsOn" | "width" | "height" | "theme" From 133af2aca985b072411caac9caace2ecbcfa7675 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Mon, 16 Mar 2026 08:20:51 +0530 Subject: [PATCH 07/92] feat(calendar): add minHour and maxHour props to limit displayed time range - Add minHour and maxHour props to Calendar component and default constants - Update TimeColumn, DayColumn, DayView, WeekView and CurrentTimeLine to respect the time boundaries - Filter events in useDayEventLayout hook to only include those within the specified hour range - Adjust event positioning and current time line calculation based on minHour offset - Hide current time line when current time is outside the displayed range --- src/Calendar.tsx | 8 +++- .../current_time_line/CurrentTimeLine.tsx | 25 +++++++++--- src/components/core/day_column/DayColumn.tsx | 22 +++++++--- .../core/time_column/TimeColumn.tsx | 18 ++++++--- src/components/views/day_view/DayView.tsx | 20 +++++++++- src/components/views/week_view/WeekView.tsx | 22 ++++++++-- src/constants/time.ts | 2 + src/hooks/useDayEventLayout.ts | 40 +++++++++++++------ src/types/calendar.ts | 4 ++ 9 files changed, 126 insertions(+), 35 deletions(-) diff --git a/src/Calendar.tsx b/src/Calendar.tsx index 1446442..e898a12 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -28,13 +28,15 @@ function CalendarContent({ onEventClick, onNavigate, onViewChange, - theme, - classNames, showCurrentTime, maxEvents, autoScrollToCurrentTime, weekStartsOn, weekEndsOn, + minHour, + maxHour, + theme, + classNames, ...restProps }: CalendarContentProps) { const { @@ -62,6 +64,8 @@ function CalendarContent({ autoScrollToCurrentTime, weekStartsOn, weekEndsOn, + minHour, + maxHour, }; switch (view) { case ECalendarViewType.day: diff --git a/src/components/core/current_time_line/CurrentTimeLine.tsx b/src/components/core/current_time_line/CurrentTimeLine.tsx index 371e1ed..972f79e 100644 --- a/src/components/core/current_time_line/CurrentTimeLine.tsx +++ b/src/components/core/current_time_line/CurrentTimeLine.tsx @@ -2,13 +2,24 @@ import React, { useEffect, useState } from "react"; import cx from "classnames"; import styles from "./CurrentTimeLine.module.css"; import { dateFn } from "../../../utils"; +import { CalendarContentProps } from "../../../types"; -interface CurrentTimeLineProps { +interface CurrentTimeLineProps extends Pick< + CalendarContentProps, + "minHour" | "maxHour" +> { className?: string; } -const CurrentTimeLine = ({ className }: CurrentTimeLineProps) => { - const [position, setPosition] = useState(0); +const CurrentTimeLine = ({ + className, + minHour, + maxHour, +}: CurrentTimeLineProps) => { + const [position, setPosition] = useState(() => { + const now = dateFn(); + return (now.hour() - minHour) * 60 + now.minute(); + }); useEffect(() => { const updatePosition = () => { @@ -16,7 +27,7 @@ const CurrentTimeLine = ({ className }: CurrentTimeLineProps) => { const hours = now.hour(); const minutes = now.minute(); // eventSlot height is 60px per hour - const totalMinutes = hours * 60 + minutes; + const totalMinutes = (hours - minHour) * 60 + minutes; setPosition(totalMinutes); }; @@ -24,7 +35,11 @@ const CurrentTimeLine = ({ className }: CurrentTimeLineProps) => { const interval = setInterval(updatePosition, 60000); // update every minute return () => clearInterval(interval); - }, []); + }, [minHour]); + + if (position < 0 || position > (maxHour - minHour) * 60) { + return null; + } return (
{ dayEvents: DayEventLayout[]; isToday?: boolean; } -const HOURS = Array.from({ length: 24 }, (_, i) => i); - function DayColumn({ dayEvents, onEventClick, @@ -23,10 +26,17 @@ function DayColumn({ classNames, isToday, showCurrentTime, + minHour, + maxHour, }: DayColumnProps) { + const hours = Array.from( + { length: maxHour - minHour }, + (_, i) => i + minHour, + ); + return ( <> - {HOURS.map((hour) => ( + {hours.map((hour) => (
))} - {isToday && showCurrentTime && } + {isToday && showCurrentTime && ( + + )} ); } diff --git a/src/components/core/time_column/TimeColumn.tsx b/src/components/core/time_column/TimeColumn.tsx index c2e6d2d..4682390 100644 --- a/src/components/core/time_column/TimeColumn.tsx +++ b/src/components/core/time_column/TimeColumn.tsx @@ -5,17 +5,25 @@ import { DATE_FORMATS } from "../../../constants"; import styles from "./TimeColumn.module.css"; import { CalendarContentProps } from "../../../types"; -const HOURS = Array.from({ length: 24 }, (_, i) => i); - interface TimeColumnProps extends Pick< CalendarContentProps, - "is12Hour" | "classNames" + "is12Hour" | "classNames" | "minHour" | "maxHour" > {} -function TimeColumn({ is12Hour, classNames }: TimeColumnProps) { +function TimeColumn({ + is12Hour, + classNames, + minHour, + maxHour, +}: TimeColumnProps) { + const hours = Array.from( + { length: maxHour - minHour }, + (_, i) => i + minHour, + ); + return (
- {HOURS.map((hour) => { + {hours.map((hour) => { const timeFormat = is12Hour ? DATE_FORMATS.HOUR_12H : DATE_FORMATS.TIME; return (
diff --git a/src/components/views/day_view/DayView.tsx b/src/components/views/day_view/DayView.tsx index 94c221f..780d5b5 100644 --- a/src/components/views/day_view/DayView.tsx +++ b/src/components/views/day_view/DayView.tsx @@ -23,6 +23,8 @@ interface DayViewProps extends Pick< | "showCurrentTime" | "maxEvents" | "autoScrollToCurrentTime" + | "minHour" + | "maxHour" > {} function DayView({ @@ -35,11 +37,18 @@ function DayView({ showCurrentTime, maxEvents, autoScrollToCurrentTime, + minHour, + maxHour, }: DayViewProps) { const containerRef = useRef(null); const { state } = useCalendar(); const { selectedDate } = state; - const dayEvents = useDayEventLayout(events, selectedDate) as DayEventLayout[]; + const dayEvents = useDayEventLayout( + events, + selectedDate, + minHour, + maxHour, + ) as DayEventLayout[]; const isToday = dateFn().isSame(selectedDate, "day"); @@ -96,7 +105,12 @@ function DayView({ />
- +
diff --git a/src/components/views/week_view/WeekView.tsx b/src/components/views/week_view/WeekView.tsx index fcb33d9..64e195c 100644 --- a/src/components/views/week_view/WeekView.tsx +++ b/src/components/views/week_view/WeekView.tsx @@ -25,6 +25,8 @@ interface WeekViewProps extends Pick< | "autoScrollToCurrentTime" | "weekStartsOn" | "weekEndsOn" + | "minHour" + | "maxHour" > {} function WeekView({ @@ -39,6 +41,8 @@ function WeekView({ autoScrollToCurrentTime, weekStartsOn, weekEndsOn, + minHour, + maxHour, }: WeekViewProps) { const containerRef = useRef(null); const { state } = useCalendar(); @@ -58,9 +62,12 @@ function WeekView({ return Array.from({ length }, (_, i) => startOfWeek.add(i, "day")); }, [startOfWeek, weekStartsOn, weekEndsOn]); - // Calculate events for each day of the week - // The hook resolves the layout computation for all 7 days efficiently - const weekEvents = useDayEventLayout(events, weekDays) as DayEventLayout[][]; + const weekEvents = useDayEventLayout( + events, + weekDays, + minHour, + maxHour, + ) as DayEventLayout[][]; const isCurrentWeek = useMemo(() => { const now = dateFn(); @@ -128,7 +135,12 @@ function WeekView({ />
- +
{weekDays.map((date, dayIndex) => { const isToday = dateFn().isSame(date, "day"); @@ -144,6 +156,8 @@ function WeekView({ classNames={classNames} isToday={isToday} showCurrentTime={showCurrentTime} + minHour={minHour} + maxHour={maxHour} />
); diff --git a/src/constants/time.ts b/src/constants/time.ts index f75afb7..ce515b2 100644 --- a/src/constants/time.ts +++ b/src/constants/time.ts @@ -70,6 +70,8 @@ export const defaultCalenderProps = { futureYearLength: 5, showCurrentTime: false, autoScrollToCurrentTime: false, + minHour: 0, + maxHour: 24, weekStartsOn: 0, weekEndsOn: 6, theme: {}, diff --git a/src/hooks/useDayEventLayout.ts b/src/hooks/useDayEventLayout.ts index 4b2cf26..622c061 100644 --- a/src/hooks/useDayEventLayout.ts +++ b/src/hooks/useDayEventLayout.ts @@ -54,6 +54,8 @@ interface ProcessedEvent { export default function useDayEventLayout( events: CalendarEvent[], currentDateOrDates: DateType | DateType[], + minHour: number, + maxHour: number, ): DayEventLayout[] | DayEventLayout[][] { return useMemo(() => { const dates = Array.isArray(currentDateOrDates) @@ -67,10 +69,23 @@ export default function useDayEventLayout( const eventsForDay = events.filter((event) => { const eventDate = dateFn(event.startDate).startOf("day"); const currentDay = dateFn(currentDate).startOf("day"); + + const startMins = + dateFn(event.startDate).hour() * 60 + + dateFn(event.startDate).minute(); + let endMins = event.endDate + ? dateFn(event.endDate).hour() * 60 + dateFn(event.endDate).minute() + : startMins + 1; + if (endMins <= startMins && event.endDate) endMins += 1440; + + const isWithinBounds = + endMins > minHour * 60 && startMins < maxHour * 60; + return ( eventDate.isSame(currentDay) && !isMultiDay(event) && - !isAllDayEvent(event) + !isAllDayEvent(event) && + isWithinBounds ); }); @@ -88,19 +103,17 @@ export default function useDayEventLayout( const processedEvents: ProcessedEvent[] = eventsForDay.map( (event, index) => { const start = getMinutes(event.startDate); - let end = event.endDate ? getMinutes(event.endDate) : start + 1; + const end = event.endDate ? getMinutes(event.endDate) : start + 1; - // Edge Case: Zero-duration event treated as 1 minute logically - if (end === start) end = start + 1; - - // Clamp end to 1440 (24h) if needed, simplified - if (end < start) end = 1440; + // Clamp start and end to boundaries for the algorithm + const clampedStart = Math.max(start, minHour * 60); + const clampedEnd = Math.min(end, maxHour * 60); return { id: `${index}-${event.title}`, - start, - end, - duration: end - start, + start: clampedStart, + end: clampedEnd, + duration: clampedEnd - clampedStart, original: event, }; }, @@ -202,9 +215,12 @@ export default function useDayEventLayout( function toLayout(event: ProcessedEvent): DayEventLayout { const rawHeight = event.end - event.start; + // Shift top by the minHour offset + const top = event.start - minHour * 60; + return { event: event.original, - top: event.start, + top: Math.max(0, top), // ensure it never renders above container height: Math.max(rawHeight, 15), left: parseFloat((event.left! * 100).toFixed(4)), width: parseFloat((event.width! * 100).toFixed(4)), @@ -219,5 +235,5 @@ export default function useDayEventLayout( return dates.map((d) => generateLayoutForDate(d)); } return generateLayoutForDate(dates[0]); - }, [events, currentDateOrDates]); + }, [events, currentDateOrDates, minHour, maxHour]); } diff --git a/src/types/calendar.ts b/src/types/calendar.ts index bb0464e..021418e 100644 --- a/src/types/calendar.ts +++ b/src/types/calendar.ts @@ -76,6 +76,8 @@ export interface CalendarProps { futureYearLength?: number; showCurrentTime?: boolean; autoScrollToCurrentTime?: boolean; + minHour?: number; + maxHour?: number; weekStartsOn?: number; // 0 (Sunday) to 6 (Saturday) weekEndsOn?: number; // 0 to 6 @@ -106,6 +108,8 @@ export interface CalendarContentProps extends RequiredSome< | "futureYearLength" | "showCurrentTime" | "autoScrollToCurrentTime" + | "minHour" + | "maxHour" | "weekStartsOn" | "weekEndsOn" | "width" From 5abf136b8244bf58b65a00aa635453e50ec7ecf9 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Mon, 16 Mar 2026 08:42:17 +0530 Subject: [PATCH 08/92] feat(stories): add storybook examples for new calendar props Add storybook examples for the newly introduced props: - WithTimeLimits story in DayView and WeekView to demonstrate minHour/maxHour - CustomWeekStartEnd story in MonthView and WeekView to show weekStartsOn/weekEndsOn Update README and FEATURES documentation to include these new props --- FEATURES.md | 5 +++-- README.md | 4 ++++ src/stories/DayView.stories.tsx | 9 +++++++++ src/stories/MonthView.stories.tsx | 9 +++++++++ src/stories/WeekView.stories.tsx | 18 ++++++++++++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/FEATURES.md b/FEATURES.md index 51e000e..f705b41 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -6,8 +6,8 @@ This document provides a comprehensive breakdown of the features available in th The calendar is designed to provide users with multiple perspectives of their schedule. You can switch between these views using the `view` prop (`ECalendarViewType`). -- **Month View (`"month"`)**: The default view, displaying a traditional grid of the entire month. Events are stacked on each day, and if there are too many events to fit, a customizable "+X more" button appears. -- **Week View (`"week"`)**: Displays a 7-day column layout with a time grid. Events are rendered as blocks spanning their respective time slots, making it easy to identify overlapping schedules and free time. +- **Month View (`"month"`)**: The default view, displaying a traditional grid of the entire month. Events are stacked on each day, and if there are too many events to fit, a customizable "+X more" button appears. You can configure which days of the week begin and end the layout (e.g., standard Monday-Friday work week) via `weekStartsOn` and `weekEndsOn`. +- **Week View (`"week"`)**: Displays a 7-day column layout (or custom range using `weekStartsOn`/`weekEndsOn`) with a time grid. Events are rendered as blocks spanning their respective time slots, making it easy to identify overlapping schedules and free time. - **Day View (`"day"`)**: Similar to the Week View but focused entirely on a single day. This is perfect for detailed daily planning and provides maximum horizontal space for event details. - **Schedule View (`"schedule"`)**: A chronological list of upcoming events grouped by date. This view is highly optimized for mobile devices or sidebars where space is limited and users just need to see "what's next." @@ -43,6 +43,7 @@ Global applications require flexible time display options. - **12-Hour vs 24-Hour**: By default, time is shown in the 24-hour format (e.g., `14:00`). By passing the `is12Hour={true}` prop, all time indicators across the Week, Day, and Schedule views, as well as event tooltips, will automatically switch to the 12-hour AM/PM format (e.g., `02:00 PM`). - **Day Name Formatting**: Use the `dayType` prop to dictate how the days of the week are displayed in the headers. Choose between `"full"` (Monday, Tuesday) or `"half"` (Mon, Tue). +- **Time Range Limits**: Use `minHour` and `maxHour` (values 0-24) to constrain the visible time lines in Day and Week views, removing unnecessary empty hours. - **Current Time Indicator**: Display a line indicating the current time in the Day and Week views by passing `showCurrentTime={true}`. You can also automatically scroll to this time when the view loads by passing `autoScrollToCurrentTime={true}`. ## 👆 Interactive Callbacks diff --git a/README.md b/README.md index abcbd9f..0add8b8 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,10 @@ const ScheduleApp = () => ( | `maxEvents` | `number` | Maximum events to show per day cell before collapsing. | Auto-calc | | `showCurrentTime` | `boolean` | Displays a line indicating the current time in day and week views. | `false` | | `autoScrollToCurrentTime` | `boolean` | Automatically scrolls to the current time line when the view is initially loaded. | `false` | +| `minHour` | `number` | Minimum hour (0-24) to display in day and week view time grids. | `0` | +| `maxHour` | `number` | Maximum hour (0-24) to display in day and week view time grids. | `24` | +| `weekStartsOn` | `number` | Start day of the week (0 = Sunday, 1 = Monday, etc.). | `0` | +| `weekEndsOn` | `number` | End day of the week (0 = Sunday, 1 = Monday, etc.). | `6` | ### Types diff --git a/src/stories/DayView.stories.tsx b/src/stories/DayView.stories.tsx index 5230c18..3b997c0 100644 --- a/src/stories/DayView.stories.tsx +++ b/src/stories/DayView.stories.tsx @@ -96,3 +96,12 @@ export const AutoScrollToCurrentTime: Story = { autoScrollToCurrentTime: true, }, }; + +export const WithTimeLimits: Story = { + args: { + events: mockEvents, + selectedDate: today.toDate(), + minHour: 8, + maxHour: 18, + }, +}; diff --git a/src/stories/MonthView.stories.tsx b/src/stories/MonthView.stories.tsx index b7d420a..ed18878 100644 --- a/src/stories/MonthView.stories.tsx +++ b/src/stories/MonthView.stories.tsx @@ -99,3 +99,12 @@ export const FullDayNames: Story = { dayType: EDayType.full, }, }; + +export const CustomWeekStartEnd: Story = { + args: { + events: mockEvents, + selectedDate: today.toDate(), + weekStartsOn: 1, // Monday + weekEndsOn: 5, // Friday + }, +}; diff --git a/src/stories/WeekView.stories.tsx b/src/stories/WeekView.stories.tsx index 980c6b9..6ac8ca0 100644 --- a/src/stories/WeekView.stories.tsx +++ b/src/stories/WeekView.stories.tsx @@ -120,3 +120,21 @@ export const AutoScrollToCurrentTime: Story = { autoScrollToCurrentTime: true, }, }; + +export const WithTimeLimits: Story = { + args: { + events: mockEvents, + selectedDate: today.toDate(), + minHour: 8, + maxHour: 18, + }, +}; + +export const CustomWeekStartEnd: Story = { + args: { + events: mockEvents, + selectedDate: today.toDate(), + weekStartsOn: 1, // Monday + weekEndsOn: 5, // Friday + }, +}; From 052317470d9d391f26be4faecffbb784aefccb0e Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Tue, 17 Mar 2026 07:45:42 +0530 Subject: [PATCH 09/92] feat(calendar): add showAdjacentMonths prop to control adjacent month display Add a new boolean prop showAdjacentMonths to CalendarProps that controls whether dates from adjacent months should be displayed in the month view. This provides users with the option to hide empty cells from previous/next months for a cleaner interface when desired. The prop defaults to true to maintain backward compatibility with existing behavior. --- .../core/month_event_item/MonthEventItem.tsx | 129 +++++++++--------- src/components/views/month_view/MonthView.tsx | 3 + src/constants/time.ts | 1 + src/types/calendar.ts | 2 + 4 files changed, 73 insertions(+), 62 deletions(-) diff --git a/src/components/core/month_event_item/MonthEventItem.tsx b/src/components/core/month_event_item/MonthEventItem.tsx index b891e32..f2df401 100644 --- a/src/components/core/month_event_item/MonthEventItem.tsx +++ b/src/components/core/month_event_item/MonthEventItem.tsx @@ -12,7 +12,7 @@ import { CALENDAR_CONSTANTS, defaultTheme } from "../../../constants"; interface MonthEventItemProps extends Pick< CalendarContentProps, - "onEventClick" | "theme" | "maxEvents" | "is12Hour" + "onEventClick" | "theme" | "maxEvents" | "is12Hour" | "showAdjacentMonths" > { dataClassName?: string; selectedClassName?: string; @@ -49,6 +49,7 @@ function MonthEventItem({ onEventClick, totalEvents = 0, is12Hour, + showAdjacentMonths, }: MonthEventItemProps) { const [showPopover, setShowPopover] = useState(false); const [anchorEl, setAnchorEl] = useState(null); @@ -95,73 +96,77 @@ function MonthEventItem({ })} >
-

{date}

+ {(isCurrentMonth || showAdjacentMonths) && ( + <> +

{date}

- {data && ( -
- {visibleEvents.map((item, index) => { - if (!item || item.isSpacer) { - return ( -
- ); - } + {data && ( +
+ {visibleEvents.map((item, index) => { + if (!item || item.isSpacer) { + return ( +
+ ); + } - let diffDates = 1; - if (item.endDateWeek) { - diffDates = - getDiffDays(item.endDateWeek, item.startDateWeek) + 1; - } - const tooltipText = generateTooltipText( - item, - ECalendarViewType.month, - is12Hour, - ); - const width = `${cellWidth * diffDates - CALENDAR_CONSTANTS.EVENT_ITEM_PADDING}px`; + let diffDates = 1; + if (item.endDateWeek) { + diffDates = + getDiffDays(item.endDateWeek, item.startDateWeek) + 1; + } + const tooltipText = generateTooltipText( + item, + ECalendarViewType.month, + is12Hour, + ); + const width = `${cellWidth * diffDates - CALENDAR_CONSTANTS.EVENT_ITEM_PADDING}px`; - return ( -
{ - e.stopPropagation(); - onEventClick?.(item); - }} - > - {item.title} -
- ); - })} - {hiddenEventsCount > 0 && ( -
- - {showPopover && anchorEl && ( - setShowPopover(false)} - anchorEl={anchorEl} - is12Hour={is12Hour} - /> + return ( +
{ + e.stopPropagation(); + onEventClick?.(item); + }} + > + {item.title} +
+ ); + })} + {hiddenEventsCount > 0 && ( +
+ + {showPopover && anchorEl && ( + setShowPopover(false)} + anchorEl={anchorEl} + is12Hour={is12Hour} + /> + )} +
)}
)} -
+ )}
diff --git a/src/components/views/month_view/MonthView.tsx b/src/components/views/month_view/MonthView.tsx index 989f76f..69a7f1c 100644 --- a/src/components/views/month_view/MonthView.tsx +++ b/src/components/views/month_view/MonthView.tsx @@ -29,6 +29,7 @@ interface MonthViewProps extends Pick< | "classNames" | "weekStartsOn" | "weekEndsOn" + | "showAdjacentMonths" > {} function MonthView({ @@ -44,6 +45,7 @@ function MonthView({ classNames, weekStartsOn, weekEndsOn, + showAdjacentMonths, ...restProps }: MonthViewProps) { const { state, dispatch } = useCalendar(); @@ -135,6 +137,7 @@ function MonthView({ is12Hour={is12Hour} onEventClick={onEventClick} onMoreClick={(d) => onMoreClick?.(convertToDate(d))} + showAdjacentMonths={showAdjacentMonths} /> ))}
+ + + + + +
, + ); + expect(screen.getByText("1")).toBeInTheDocument(); + }); + + it("renders events and more button when excess events", () => { + // Provide events with required tooltip props so it doesn't crash formatting + const data = [ + { id: "1", title: "E1", startDate: "2024-03-01", endDate: "2024-03-01" }, + { id: "2", title: "E2", startDate: "2024-03-01", endDate: "2024-03-01" }, + { id: "3", title: "E3", startDate: "2024-03-01", endDate: "2024-03-01" }, + ]; + render( + + + + + + +
, + ); + expect(screen.getByText("E1")).toBeInTheDocument(); + expect(screen.getByText("E2")).toBeInTheDocument(); + expect(screen.queryByText("E3")).not.toBeInTheDocument(); + + const moreBtn = screen.getByText("+ 1 more"); + expect(moreBtn).toBeInTheDocument(); + + // Trigger popover + fireEvent.click(moreBtn); + + // Now E3 should be in popover + expect(screen.getByText("E3")).toBeInTheDocument(); + }); +}); diff --git a/src/components/core/time_column/TimeColumn.test.tsx b/src/components/core/time_column/TimeColumn.test.tsx new file mode 100644 index 0000000..093e74f --- /dev/null +++ b/src/components/core/time_column/TimeColumn.test.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import { describe, it, expect } from "vitest"; +import TimeColumn from "./TimeColumn"; + +describe("TimeColumn Component", () => { + it("renders the correct number of hour slots", () => { + const { container } = render( + , + ); + + // Should render 10 hour slots (from 8 to 17) + expect(container.firstChild?.childNodes).toHaveLength(10); + }); + + it("formats time in 24-hour style when is12Hour is false", () => { + // Specifically mocking a date that has a deterministic timezone representation is difficult, + // so we just check if it renders the base strings cleanly. + // 14:00 + render( + , + ); + + // The rendered text will be "14:00" because of FORMATS.TIME + expect(screen.getByText("14:00")).toBeInTheDocument(); + }); + + it("formats time in 12-hour style when is12Hour is true", () => { + render( + , + ); + + // The rendered text should follow 12-hour like "02 PM" + expect(screen.getByText("02 PM")).toBeInTheDocument(); + }); +}); diff --git a/src/components/layout/Header.test.tsx b/src/components/layout/Header.test.tsx new file mode 100644 index 0000000..1387e40 --- /dev/null +++ b/src/components/layout/Header.test.tsx @@ -0,0 +1,90 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import Header from "./Header"; +import { ECalendarViewType } from "../../types"; +import { dateFn, DateType } from "../../utils"; +import * as CalendarContextModule from "../../context/CalendarContext"; + +// Simple wrapper for testing to provide mock context if needed, but here we'll just spy on the hook. +describe("Header Component", () => { + let mockDispatch: ReturnType; + let mockState: { + selectedDate: DateType; + view: ECalendarViewType; + }; + + beforeEach(() => { + mockDispatch = vi.fn(); + mockState = { + selectedDate: dateFn("2024-03-01"), + view: ECalendarViewType.month, + }; + + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: mockState, + dispatch: mockDispatch as never, + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + pastYearLength: 10, + futureYearLength: 10, + resetDateOnViewChange: false, + onNavigate: vi.fn(), + onViewChange: vi.fn(), + }; + + it("renders correctly with current date and view", () => { + render(
); + // Check Today button + expect(screen.getByText("Today")).toBeInTheDocument(); + + // Check Title + expect(screen.getByText("March 2024")).toBeInTheDocument(); + + // Check selects + expect(screen.getByDisplayValue("Month")).toBeInTheDocument(); // The view dropdown + }); + + it("dispatches actions on arrow clicks", () => { + render(
); + + // There are two buttons with icons. The previous is index 1 (since Today is an actual button text). + const buttons = screen.getAllByRole("button"); + const prevButton = buttons[1]; + const nextButton = buttons[2]; + + fireEvent.click(prevButton); + expect(mockDispatch).toHaveBeenCalledWith({ type: "PREV" }); + + fireEvent.click(nextButton); + expect(mockDispatch).toHaveBeenCalledWith({ type: "NEXT" }); + }); + + it("dispatches TODAY action when Today button is clicked", () => { + render(
); + + const todayButton = screen.getByText("Today"); + fireEvent.click(todayButton); + + expect(mockDispatch).toHaveBeenCalledWith({ type: "TODAY" }); + }); + + it("changes view when view dropdown is changed", () => { + render(
); + + const viewSelect = screen.getByDisplayValue("Month"); + fireEvent.change(viewSelect, { target: { value: ECalendarViewType.week } }); + + expect(mockDispatch).toHaveBeenCalledWith({ + type: "SET_VIEW", + payload: ECalendarViewType.week, + }); + }); +}); diff --git a/src/components/ui/popover/Popover.test.tsx b/src/components/ui/popover/Popover.test.tsx new file mode 100644 index 0000000..4df8ef4 --- /dev/null +++ b/src/components/ui/popover/Popover.test.tsx @@ -0,0 +1,112 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import Popover from "./Popover"; +import { dateFn } from "../../../utils"; +import { CalendarEvent } from "../../../types"; + +describe("Popover Component", () => { + const mockAnchorEl = document.createElement("div"); + // Set dimensions for anchorEl to aid layout effect testing + Object.defineProperty(mockAnchorEl, "getBoundingClientRect", { + value: () => ({ + top: 100, + bottom: 120, + left: 100, + right: 150, + width: 50, + height: 20, + }), + }); + + const mockOnClose = vi.fn(); + const mockOnEventClick = vi.fn(); + const dateObj = dateFn("2024-03-01"); + + const events = [ + { id: "1", title: "Event 1", startDate: "2024-03-01" }, + { id: "2", title: "Event 2", startDate: "2024-03-01" }, + ]; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("renders correctly with given events", () => { + render( + , + ); + + // Check if event titles are rendered + expect(screen.getByText("Event 1")).toBeInTheDocument(); + expect(screen.getByText("Event 2")).toBeInTheDocument(); + }); + + it("calls onEventClick and onClose when an event is clicked", () => { + render( + , + ); + + const event1 = screen.getByText("Event 1"); + // Popover content requires stopping propagation usually handled by root wrapper + fireEvent.click(event1); + + expect(mockOnEventClick).toHaveBeenCalledWith(events[0]); + expect(mockOnClose).toHaveBeenCalled(); + }); + + it("calls onClose when clicking outside", () => { + render( + , + ); + + // Trigger mousedown on document body to simulate clicking outside + fireEvent.mouseDown(document.body); + expect(mockOnClose).toHaveBeenCalled(); + }); + + it("supports custom renderEvent", () => { + const customRender = (event: CalendarEvent) => ( + Custom: {event.title} + ); + render( + , + ); + + expect(screen.getAllByTestId("custom-render")).toHaveLength(2); + expect(screen.getByText("Custom: Event 1")).toBeInTheDocument(); + }); +}); From ea255d62560b00e955d93be81f7b31b9d79f43fd Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Sun, 29 Mar 2026 19:14:14 +0530 Subject: [PATCH 32/92] test: add unit tests for all calendar view components - Add DayView test file covering header rendering, custom date cell, and event display - Add WeekView test file verifying week headers, custom rendering, and event layout - Add CustomDaysView test file for custom day range rendering and event handling - Add MonthView test file for grid headers, date clicking, and custom renderers - Add ScheduleView test file for empty state, grouped events, and click handlers --- .../custom_days_view/CustomDaysView.test.tsx | 86 +++++++++ .../views/day_view/DayView.test.tsx | 81 +++++++++ .../views/month_view/MonthView.test.tsx | 110 ++++++++++++ .../views/schedule_view/ScheduleView.test.tsx | 170 ++++++++++++++++++ .../views/week_view/WeekView.test.tsx | 87 +++++++++ 5 files changed, 534 insertions(+) create mode 100644 src/components/views/custom_days_view/CustomDaysView.test.tsx create mode 100644 src/components/views/day_view/DayView.test.tsx create mode 100644 src/components/views/month_view/MonthView.test.tsx create mode 100644 src/components/views/schedule_view/ScheduleView.test.tsx create mode 100644 src/components/views/week_view/WeekView.test.tsx diff --git a/src/components/views/custom_days_view/CustomDaysView.test.tsx b/src/components/views/custom_days_view/CustomDaysView.test.tsx new file mode 100644 index 0000000..b0c216a --- /dev/null +++ b/src/components/views/custom_days_view/CustomDaysView.test.tsx @@ -0,0 +1,86 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import CustomDaysView from "./CustomDaysView"; +import { dateFn } from "../../../utils"; +import * as CalendarContextModule from "../../../context/CalendarContext"; + +// Provide a mock ResizeObserver since child components might need it +global.ResizeObserver = vi.fn().mockImplementation(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), +})); + +describe("CustomDaysView Component", () => { + const mockDate = dateFn("2024-03-01T12:00:00Z"); // March 1, 2024 (Friday) + + beforeEach(() => { + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: { + selectedDate: mockDate, + view: "customDays", + }, + dispatch: vi.fn(), + } as never); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + dayType: "half" as const, + is12Hour: false, + theme: {}, + eventProps: {}, + classNames: {}, + showCurrentTime: true, + maxEvents: 3, + autoScrollToCurrentTime: false, + minHour: 0, + maxHour: 24, + showAllDayRow: true, + eventOverlapOffset: 0, + customDays: 3, + enableEnrichedEvents: false, + eventsAreSorted: false, + isEventOrderingEnabled: false, + }; + + it("renders the custom days headers correctly", () => { + render(); + + // Should render 3 days starting from March 1 (Friday, Saturday, Sunday) + expect(screen.getByText("Fri")).toBeInTheDocument(); + expect(screen.getByText("1")).toBeInTheDocument(); + + expect(screen.getByText("Sat")).toBeInTheDocument(); + expect(screen.getByText("2")).toBeInTheDocument(); + + expect(screen.getByText("Sun")).toBeInTheDocument(); + expect(screen.getByText("3")).toBeInTheDocument(); + }); + + it("uses custom renderDateCell if provided", () => { + const customRender = () =>
Custom Date
; + render(); + + expect(screen.getAllByTestId("custom-date")).toHaveLength(3); + }); + + it("passes events and renders them in the layout", () => { + const events = [ + { + id: "1", + title: "Test Custom Day Event", + startDate: "2024-03-02T10:00:00", + endDate: "2024-03-02T11:00:00", + }, + ]; + render(); + + expect(screen.getByText("Test Custom Day Event")).toBeInTheDocument(); + }); +}); diff --git a/src/components/views/day_view/DayView.test.tsx b/src/components/views/day_view/DayView.test.tsx new file mode 100644 index 0000000..0ccbf19 --- /dev/null +++ b/src/components/views/day_view/DayView.test.tsx @@ -0,0 +1,81 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import DayView from "./DayView"; +import { dateFn } from "../../../utils"; +import * as CalendarContextModule from "../../../context/CalendarContext"; + +// Provide a mock ResizeObserver since child components might need it +global.ResizeObserver = vi.fn().mockImplementation(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), +})); + +describe("DayView Component", () => { + const mockDate = dateFn("2024-03-01T12:00:00Z"); // March 1, 2024 is a Friday + + beforeEach(() => { + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: { + selectedDate: mockDate, + view: "day", + }, + dispatch: vi.fn(), + } as never); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + dayType: "half" as const, + is12Hour: false, + theme: {}, + eventProps: {}, + showCurrentTime: true, + maxEvents: 3, + autoScrollToCurrentTime: false, + minHour: 0, + maxHour: 24, + showAllDayRow: true, + eventOverlapOffset: 0, + enableEnrichedEvents: false, + eventsAreSorted: false, + isEventOrderingEnabled: false, + classNames: {}, + }; + + it("renders the day header correctly", () => { + render(); + + expect(screen.getByText("Fri")).toBeInTheDocument(); + expect(screen.getByText("1")).toBeInTheDocument(); + }); + + it("uses custom renderDateCell if provided", () => { + const customRender = () => ( +
Custom Date Result
+ ); + render(); + + expect(screen.getByTestId("custom-date")).toBeInTheDocument(); + expect(screen.getByText("Custom Date Result")).toBeInTheDocument(); + }); + + it("passes events and renders them in the layout", () => { + const events = [ + { + id: "1", + title: "Test Event", + startDate: "2024-03-01T10:00:00", + endDate: "2024-03-01T11:00:00", + }, + ]; + render(); + + expect(screen.getByText("Test Event")).toBeInTheDocument(); + }); +}); diff --git a/src/components/views/month_view/MonthView.test.tsx b/src/components/views/month_view/MonthView.test.tsx new file mode 100644 index 0000000..c2de782 --- /dev/null +++ b/src/components/views/month_view/MonthView.test.tsx @@ -0,0 +1,110 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import MonthView from "./MonthView"; +import { dateFn } from "../../../utils"; +import * as CalendarContextModule from "../../../context/CalendarContext"; +import { CalendarEvent, RenderDateCellProps } from "../../../types"; + +describe("MonthView Component", () => { + const mockDate = dateFn("2024-03-01T12:00:00Z"); + + beforeEach(() => { + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: { + selectedDate: mockDate, + view: "month", + }, + dispatch: vi.fn(), + } as never); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + dayType: "half" as const, + width: 800, + height: 600, + weekStartsOn: 0, + weekEndsOn: 6, + is12Hour: false, + selectable: true, + theme: {}, + eventProps: {}, + classNames: {}, + showAdjacentMonths: true, + enableEnrichedEvents: false, + eventsAreSorted: false, + isEventOrderingEnabled: false, + autoScrollToCurrentTime: false, + sortedMonthView: false, + }; + + it("renders month grid headers correctly", () => { + render(); + + expect(screen.getByText("Sun")).toBeInTheDocument(); + expect(screen.getByText("Mon")).toBeInTheDocument(); + expect(screen.getByText("Sat")).toBeInTheDocument(); + }); + + it("renders MonthEventItems and allows clicking a date", () => { + const mockOnDateClick = vi.fn(); + render(); + + // There can be multiple days with "15" rendered adjacent months config, but we just check presence + const midMonthDays = screen.getAllByText("15"); + expect(midMonthDays.length).toBeGreaterThan(0); + + // Click the actual month's day (second one or first if no prev month) + fireEvent.click(midMonthDays[0]); + expect(mockOnDateClick).toHaveBeenCalled(); + }); + + it("renders events", () => { + const events = [ + { + id: "1", + title: "Test Event", + startDate: "2024-03-15", + endDate: "2024-03-15", + }, + ]; + render(); + + expect(screen.getByText("Test Event")).toBeInTheDocument(); + }); + + it("uses custom renderEvent and renderDateCell", () => { + const customRenderEvent = (event: CalendarEvent) => ( +
{event.title}
+ ); + const customRenderDateCell = (props: RenderDateCellProps) => ( +
{props.date.getDate()}
+ ); + + const events = [ + { + id: "1", + title: "Test Event", + startDate: "2024-03-15", + endDate: "2024-03-15", + }, + ]; + + render( + , + ); + + expect(screen.getAllByTestId("custom-date").length).toBeGreaterThan(28); + expect(screen.getByTestId("custom-event")).toBeInTheDocument(); + }); +}); diff --git a/src/components/views/schedule_view/ScheduleView.test.tsx b/src/components/views/schedule_view/ScheduleView.test.tsx new file mode 100644 index 0000000..cf0a135 --- /dev/null +++ b/src/components/views/schedule_view/ScheduleView.test.tsx @@ -0,0 +1,170 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import ScheduleView from "./ScheduleView"; +import { dateFn } from "../../../utils"; +import * as CalendarContextModule from "../../../context/CalendarContext"; +import { CalendarEvent } from "../../../types"; + +describe("ScheduleView Component", () => { + const mockDate = dateFn("2024-03-01T12:00:00Z"); + + beforeEach(() => { + // Mock getBoundingClientRect for any potential coordinate lookups + Element.prototype.getBoundingClientRect = vi.fn(() => ({ + width: 500, + height: 500, + top: 0, + left: 0, + bottom: 0, + right: 0, + x: 0, + y: 0, + toJSON: () => {}, + })); + + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: { + selectedDate: mockDate, + view: "schedule", + }, + dispatch: vi.fn(), + } as never); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + is12Hour: false, + theme: {}, + eventProps: {}, + classNames: {}, + autoScrollToCurrentTime: false, + dayType: "half" as const, + }; + + it("renders empty state when no events exist", () => { + render(); + expect(screen.getByText("No events to display")).toBeInTheDocument(); + }); + + it("renders grouped events and dates correctly", () => { + const events = [ + { + id: "1", + title: "Morning Event", + startDate: "2024-03-01T09:00:00", + endDate: "2024-03-01T10:00:00", + }, + { + id: "2", + title: "Afternoon Event", + startDate: "2024-03-01T14:00:00", + endDate: "2024-03-01T15:00:00", + }, + { + id: "3", + title: "Next Day Event", + startDate: "2024-03-02T10:00:00", + endDate: "2024-03-02T11:00:00", + }, + ]; + + render(); + + // Check if the date groupings are rendered (1st date) + expect(screen.getByText("1")).toBeInTheDocument(); + expect(screen.getByText(/MAR, FRI/)).toBeInTheDocument(); // Expecting "MAR, FRI" styling + + // Check if titles are rendered + expect(screen.getByText("Morning Event")).toBeInTheDocument(); + expect(screen.getByText("Afternoon Event")).toBeInTheDocument(); + expect(screen.getByText("Next Day Event")).toBeInTheDocument(); + }); + + it("fires onEventClick when clicking an event track", () => { + const events = [ + { + id: "1", + title: "Clickable Event", + startDate: "2024-03-01T09:00:00", + endDate: "2024-03-01T10:00:00", + }, + ]; + const mockOnEventClick = vi.fn(); + + render( + , + ); + + const eventItem = screen.getByText("Clickable Event"); + fireEvent.click(eventItem); + + expect(mockOnEventClick).toHaveBeenCalledWith(events[0]); + }); + + it("supports custom renderEvent", () => { + const events = [ + { + id: "1", + title: "Test Event", + startDate: "2024-03-01T09:00:00", + endDate: "2024-03-01T10:00:00", + }, + ]; + const customRenderEvent = (event: CalendarEvent) => ( +
{event.title}
+ ); + + render( + , + ); + + expect(screen.getByTestId("custom-schedule-event")).toBeInTheDocument(); + expect(screen.getByText("Test Event")).toBeInTheDocument(); + }); + + it("supports custom schedule separator", () => { + const events = [ + { + id: "1", + title: "Today", + startDate: "2024-03-01T09:00:00", + endDate: "2024-03-01T10:00:00", + }, + { + id: "2", + title: "Tomorrow", + startDate: "2024-03-02T09:00:00", + endDate: "2024-03-02T10:00:00", + }, + ]; + + const renderScheduleSeparator = (date: Date) => ( +
+ ); + + render( + , + ); + + // Should render separator after the first date group, but not after the last + expect(screen.getByTestId("sep-1")).toBeInTheDocument(); + expect(screen.queryByTestId("sep-2")).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/views/week_view/WeekView.test.tsx b/src/components/views/week_view/WeekView.test.tsx new file mode 100644 index 0000000..e716a43 --- /dev/null +++ b/src/components/views/week_view/WeekView.test.tsx @@ -0,0 +1,87 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import WeekView from "./WeekView"; +import { dateFn } from "../../../utils"; +import * as CalendarContextModule from "../../../context/CalendarContext"; + +// Provide a mock ResizeObserver since child components might need it +global.ResizeObserver = vi.fn().mockImplementation(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), +})); + +describe("WeekView Component", () => { + const mockDate = dateFn("2024-03-01T12:00:00Z"); // March 1, 2024 (Friday) + + beforeEach(() => { + vi.spyOn(CalendarContextModule, "useCalendar").mockReturnValue({ + state: { + selectedDate: mockDate, + view: "week", + }, + dispatch: vi.fn(), + } as never); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const defaultProps = { + events: [], + dayType: "half" as const, + is12Hour: false, + theme: {}, + eventProps: {}, + showCurrentTime: true, + maxEvents: 3, + autoScrollToCurrentTime: false, + minHour: 0, + maxHour: 24, + showAllDayRow: true, + eventOverlapOffset: 0, + weekStartsOn: 0, // Sunday + weekEndsOn: 6, // Saturday + enableEnrichedEvents: false, + eventsAreSorted: false, + isEventOrderingEnabled: false, + classNames: {}, + }; + + it("renders the week headers correctly", () => { + render(); + + // Feb 25, 2024 is the Sunday of that week + expect(screen.getByText("Sun")).toBeInTheDocument(); + expect(screen.getByText("25")).toBeInTheDocument(); + + expect(screen.getByText("Fri")).toBeInTheDocument(); + expect(screen.getByText("1")).toBeInTheDocument(); + }); + + it("uses custom renderDateCell if provided", () => { + const customRender = () => ( +
Custom Date Result
+ ); + render(); + + expect(screen.getAllByTestId("custom-date")).toHaveLength(7); // 7 days in a week + expect(screen.getAllByText("Custom Date Result")).toHaveLength(7); + }); + + it("passes events and renders them in the layout", () => { + const events = [ + { + id: "1", + title: "Test Week Event", + startDate: "2024-03-01T10:00:00", + endDate: "2024-03-01T11:00:00", + }, + ]; + render(); + + expect(screen.getByText("Test Week Event")).toBeInTheDocument(); + }); +}); From 7f0720cfa05ed38c28fa2887c1fb59360c4caee6 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Mon, 30 Mar 2026 20:40:05 +0530 Subject: [PATCH 33/92] ci: add npm test step to CI workflow This ensures tests are automatically run on every commit, catching regressions early. --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e301d3..a5b3e29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,3 +32,6 @@ jobs: - name: Verify build run: npm run build + + - name: Run tests + run: npm test From e4e3eb8ee985b09a2bfa0f2107b1511ad0b94478 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Tue, 31 Mar 2026 08:21:57 +0530 Subject: [PATCH 34/92] fix: sync selectedDate prop and fix year list calculation - Sync external selectedDate prop changes to calendar context - Fix year list calculation to include current year - Add comprehensive tests for edge cases and integration scenarios - Improve type safety in CalendarContentProps interface --- src/Calendar.test.tsx | 100 ++++++++++++++++-- src/Calendar.tsx | 17 ++- .../core/all_day_banner/AllDayBanner.test.tsx | 26 +++-- .../CurrentTimeLine.test.tsx | 19 ++++ src/components/layout/Header.test.tsx | 27 +++++ src/hooks/useDayEventLayout.test.ts | 77 ++++++++++++++ src/hooks/useEvents.test.ts | 18 ++++ src/hooks/useMonthGrid.test.ts | 44 ++++++++ src/types/calendar.ts | 2 +- src/utils/date.ts | 3 +- 10 files changed, 311 insertions(+), 22 deletions(-) diff --git a/src/Calendar.test.tsx b/src/Calendar.test.tsx index 3b70e1c..a6340f4 100644 --- a/src/Calendar.test.tsx +++ b/src/Calendar.test.tsx @@ -1,6 +1,8 @@ import React from "react"; -import { render } from "@testing-library/react"; -import { expect, describe, it } from "vitest"; +import { render, fireEvent, screen } from "@testing-library/react"; +import { expect, describe, it, vi } from "vitest"; +import { dateFn } from "./utils"; +import { ECalendarViewType } from "./types"; import Calendar from "./Calendar"; // Mock ResizeObserver as it's not available in jsdom @@ -11,16 +13,96 @@ class ResizeObserverMock { } global.ResizeObserver = ResizeObserverMock; -describe("Calendar Component", () => { +describe("Calendar Component Integration", () => { it("renders the Calendar without crashing", () => { - // Basic test to ensure jsdom and react testing library are wired up const { container } = render(); - - // We check if the container has rendered something. expect(container).toBeInTheDocument(); - - // Basic assertion that an implicit structural part of the calendar is there - // If you have a specific test ID or role, we can assert that directly. expect(container.firstChild).not.toBeNull(); }); + + it("handles DisabledSelectable interactions correctly", () => { + const onDateClick = vi.fn(); + const onEventClick = vi.fn(); + + // Day view has a large clickable grid + const { container } = render( + , + ); + + // We expect the click events to be swallowed or not attached + const gridCells = container.querySelectorAll(".hourCell"); + if (gridCells.length > 0) { + fireEvent.click(gridCells[0]); + } + + const eventItem = container.querySelector(".eventBlock"); + if (eventItem) { + fireEvent.click(eventItem); + } + + expect(onDateClick).not.toHaveBeenCalled(); + expect(onEventClick).not.toHaveBeenCalled(); + }); + + it("responds to ControlledState updates", () => { + const start = dateFn("2024-03-01"); + const { rerender } = render( + , + ); + + expect(screen.getByText("March 2024")).toBeInTheDocument(); + + const newDate = dateFn("2025-06-15"); + rerender( + , + ); + + expect(screen.getByText("June 2025")).toBeInTheDocument(); + }); + + it("applies classNames and theme styling correctly", () => { + const { container } = render( + , + ); + + // The calendar root is rendered as a section element inside the wrapper div + const calendarSection = container.querySelector(".custom-root-class"); + expect(calendarSection).toBeInTheDocument(); + + const header = container.querySelector(".custom-header-class"); + expect(header).toBeInTheDocument(); + }); + + it("handles onViewChange callbacks", () => { + const onViewChange = vi.fn(); + render( + , + ); + + const viewSelect = screen.getByDisplayValue("Month"); + fireEvent.change(viewSelect, { target: { value: ECalendarViewType.week } }); + + expect(onViewChange).toHaveBeenCalledWith(ECalendarViewType.week); + }); }); diff --git a/src/Calendar.tsx b/src/Calendar.tsx index fa9f829..c1eb6e1 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -65,6 +65,13 @@ function CalendarContent({ } }, [restProps.view, dispatch]); + // Sync external date prop to context if it changes + useEffect(() => { + if (restProps.selectedDate) { + dispatch({ type: "SET_DATE", payload: dateFn(restProps.selectedDate) }); + } + }, [restProps.selectedDate, dispatch]); + const getViewComponent = (view: ECalendarViewType) => { const commonProps = { events, @@ -161,10 +168,7 @@ function CalendarContent({ ); } -function Calendar({ - selectedDate, - ...props -}: CalendarProps = defaultCalendarProps) { +function Calendar(props: CalendarProps = defaultCalendarProps) { const containerRef = useRef(null); const allProps = { ...defaultCalendarProps, ...props }; @@ -180,7 +184,10 @@ function Calendar({ (typeof mainHeight === "number" ? mainHeight : 0) - LAYOUT_CONSTANTS.HEADER_HEIGHT; - const initialDate = useMemo(() => dateFn(selectedDate), [selectedDate]); + const initialDate = useMemo( + () => dateFn(props.selectedDate), + [props.selectedDate], + ); // Filter out events where the end date is before the start date const validEvents = useEvents( diff --git a/src/components/core/all_day_banner/AllDayBanner.test.tsx b/src/components/core/all_day_banner/AllDayBanner.test.tsx index 79cadaa..7d64d72 100644 --- a/src/components/core/all_day_banner/AllDayBanner.test.tsx +++ b/src/components/core/all_day_banner/AllDayBanner.test.tsx @@ -63,21 +63,35 @@ describe("AllDayBanner Component", () => { expect(screen.getByText("All Day")).toBeInTheDocument(); }); - it("triggers expand/collapse icon click", () => { + it("triggers expand/collapse icon click and displays +X more when maxEvents is reached", () => { mockUseAllDayBanner.mockReturnValue({ - layoutEvents: [{ event: { id: "1", title: "All Day" } }], + layoutEvents: [ + { event: { id: "1", title: "All Day 1" } }, + { event: { id: "2", title: "All Day 2" } }, + ], effectiveMaxRows: 1, - hiddenCounts: [1, 0], - visibleLayoutEvents: [], + hiddenCounts: [1, 0], // Simulates 1 hidden event in the first day column + visibleLayoutEvents: [ + { + event: { id: "1", title: "All Day 1", startDate: "2024-03-01" }, + row: 0, + startIndex: 0, + endIndex: 1, + }, + ], containerHeight: "30px", showExpandCollapse: true, }); render(); + // Renders the visible event + expect(screen.getByText("All Day 1")).toBeInTheDocument(); + + // Renders the overflow '+1 more' indicator instead of 'All Day 2' const moreChip = screen.getByText("+ 1 more"); - fireEvent.click(moreChip); + expect(moreChip).toBeInTheDocument(); - // Component handles boolean state via mock... we'd normally verify visual class change on icon + fireEvent.click(moreChip); }); }); diff --git a/src/components/core/current_time_line/CurrentTimeLine.test.tsx b/src/components/core/current_time_line/CurrentTimeLine.test.tsx index 103e390..b91f3ec 100644 --- a/src/components/core/current_time_line/CurrentTimeLine.test.tsx +++ b/src/components/core/current_time_line/CurrentTimeLine.test.tsx @@ -45,4 +45,23 @@ describe("CurrentTimeLine Component", () => { expect(lineElement.style.top).toBe("751px"); }); + + it("resets vertical position seamlessly precisely at midnight across days", () => { + vi.setSystemTime(new Date(2024, 2, 1, 23, 59)); // 11:59 PM + const { container } = render(); + + // Position should be (23 - 0) * 60 + 59 = 1439px + let lineElement = container.firstChild as HTMLElement; + expect(lineElement.style.top).toBe("1439px"); + + // Fast forward 1 minute to exactly midnight (new day start) + // advancetimersByTime automatically updates the fake system time + act(() => { + vi.advanceTimersByTime(60000); // Trigger setInterval + }); + + // Position should cycle back up to (0 - 0) * 60 + 0 = 0px + lineElement = container.firstChild as HTMLElement; + expect(lineElement.style.top).toBe("0px"); + }); }); diff --git a/src/components/layout/Header.test.tsx b/src/components/layout/Header.test.tsx index 1387e40..3edb2c4 100644 --- a/src/components/layout/Header.test.tsx +++ b/src/components/layout/Header.test.tsx @@ -87,4 +87,31 @@ describe("Header Component", () => { payload: ECalendarViewType.week, }); }); + + it("limits the year dropdown options based on pastYearLength and futureYearLength", () => { + // Current state mock is 2024. With past 2 and future 2, expect 2022, 2023, 2024, 2025, 2026. + render( +
, + ); + + // There are three selects in Header: 1. View, 2. Month, 3. Year + const dropdowns = screen.getAllByRole("combobox"); + const yearDropdown = dropdowns[2]; // Index 2 is Year + + const options = Array.from(yearDropdown.querySelectorAll("option")).map( + (opt) => opt.value, + ); + + const currentYear = new Date().getFullYear(); + const expected = [ + String(currentYear - 2), + String(currentYear - 1), + String(currentYear), + String(currentYear + 1), + String(currentYear + 2), + ]; + + expect(options).toEqual(expected); + expect(options.length).toBe(5); + }); }); diff --git a/src/hooks/useDayEventLayout.test.ts b/src/hooks/useDayEventLayout.test.ts index 3c33242..ee0627d 100644 --- a/src/hooks/useDayEventLayout.test.ts +++ b/src/hooks/useDayEventLayout.test.ts @@ -219,4 +219,81 @@ describe("useDayEventLayout Hook", () => { expect(layout[1]).toHaveLength(1); expect(layout[1][0].event.id).toBe("B"); }); + + it("handles ConcurrentStress correctly grouping 5 overlapping events", () => { + const events: CalendarEvent[] = Array.from({ length: 5 }).map((_, i) => ({ + id: `Event-${i}`, + title: `Event ${i}`, + startDate: "2024-03-01T12:00:00", + endDate: "2024-03-01T13:00:00", + })); + + const { result } = renderHook(() => + useDayEventLayout(events, baseDate, 0, 24, true, 0), + ); + const layout = result.current as DayEventLayout[]; + expect(layout).toHaveLength(5); + + // Width should be divided evenly (100 / 5 = 20) + layout.forEach((l, i) => { + expect(l.width).toBe(20); + expect(l.left).toBe(i * 20); // 0, 20, 40, 60, 80 + }); + }); + + it("handles NestedOverlaps correctly (an event fully engulfed by another)", () => { + const events: CalendarEvent[] = [ + { + id: "Outer", + title: "Outer", + startDate: "2024-03-01T09:00:00", + endDate: "2024-03-01T12:00:00", + }, + { + id: "Inner", + title: "Inner", + startDate: "2024-03-01T10:00:00", + endDate: "2024-03-01T11:00:00", + }, + ]; + + const { result } = renderHook(() => + useDayEventLayout(events, baseDate, 0, 24, true, 0), + ); + + const layout = result.current as DayEventLayout[]; + const outerEvent = layout.find((l) => l.event.id === "Outer"); + const innerEvent = layout.find((l) => l.event.id === "Inner"); + + expect(outerEvent!.width).toBe(50); + expect(innerEvent!.width).toBe(50); + expect(outerEvent!.left).toBe(0); + expect(innerEvent!.left).toBe(50); + }); + + it("safely plots Zero Duration events without blowing up the layout bounds", () => { + const events: CalendarEvent[] = [ + { + id: "Zero", + title: "Exact Time Entry", + startDate: "2024-03-01T10:00:00", + endDate: "2024-03-01T10:00:00", // Exactly zero duration + }, + ]; + + const { result } = renderHook(() => + useDayEventLayout(events, baseDate, 0, 24, true, 0), + ); + + const layout = result.current as DayEventLayout[]; + expect(layout).toHaveLength(1); + const event = layout[0]; + + // Starting at 10:00 means top is (10 - 0) * 60 = 600px + expect(event.top).toBe(600); + // Usually zero duration is mapped to a minimum block height of e.g. 30px or clamped to the event duration itself. + // If it's literally 0, it shouldn't be negative or NaN. + expect(event.height).toBeGreaterThanOrEqual(0); + expect(event.width).toBe(100); + }); }); diff --git a/src/hooks/useEvents.test.ts b/src/hooks/useEvents.test.ts index 5ded4bf..9984445 100644 --- a/src/hooks/useEvents.test.ts +++ b/src/hooks/useEvents.test.ts @@ -1,5 +1,6 @@ import { renderHook } from "@testing-library/react"; import { describe, it, expect } from "vitest"; +import { CalendarEvent } from "../types"; import useEvents from "./useEvents"; describe("useEvents Hook", () => { @@ -39,4 +40,21 @@ describe("useEvents Hook", () => { expect(result.current).toHaveLength(3); expect(result.current.map((e) => e.id)).toEqual(["1", "2", "3"]); }); + + it("safely processes events missing id and title without crashing (MissingDataFields)", () => { + // Asserting that event processing doesn't crash when optional fields are omitted + // Event components down the line handle the "No Title" visual fallback natively + const rawEvents = [ + { + startDate: "2024-01-01", + }, + ]; + + const { result } = renderHook(() => + useEvents(rawEvents as unknown as CalendarEvent[]), + ); + expect(result.current).toHaveLength(1); + expect(result.current[0].startDate).toBe("2024-01-01"); + expect(result.current[0].id).toBeUndefined(); + }); }); diff --git a/src/hooks/useMonthGrid.test.ts b/src/hooks/useMonthGrid.test.ts index d17c2bb..c156092 100644 --- a/src/hooks/useMonthGrid.test.ts +++ b/src/hooks/useMonthGrid.test.ts @@ -97,4 +97,48 @@ describe("useMonthGrid Hook", () => { expect(thuEvents[0]?.id).toBe("1"); // A is shorter, put first expect(thuEvents[1]?.id).toBe("2"); // B is longer, put second }); + + it("handles DurationOddities (Extreme 5-year ranges) without infinite loop crash", () => { + const events: CalendarEvent[] = [ + { + id: "Extreme", + title: "5 Year Span", + startDate: "2020-01-01", + endDate: "2025-01-01", + }, + ]; + + // Testing a month right in the middle: Feb 2024 + const { result } = renderHook(() => + useMonthGrid(selectedDate, events, weekStartsOn, weekEndsOn), + ); + + const grid = result.current; + + // The event should be present on every single day of the month grid + for (const week of grid) { + for (const day of week) { + expect(day.events[0]?.id).toBe("Extreme"); + } + } + }); + + it("handles strictly zero-duration events", () => { + const events: CalendarEvent[] = [ + { + id: "Zero", + title: "Moment", + startDate: "2024-02-15T12:00:00", + endDate: "2024-02-15T12:00:00", + }, + ]; + + const { result } = renderHook(() => + useMonthGrid(selectedDate, events, weekStartsOn, weekEndsOn), + ); + + const thirdWeek = result.current[2]; + expect(thirdWeek[4].displayDay).toBe(15); + expect(thirdWeek[4].events[0]?.id).toBe("Zero"); + }); }); diff --git a/src/types/calendar.ts b/src/types/calendar.ts index dc15be0..4b58e4f 100644 --- a/src/types/calendar.ts +++ b/src/types/calendar.ts @@ -93,7 +93,7 @@ export interface CalendarProps { } export interface CalendarContentProps extends RequiredSome< - Omit, + CalendarProps, | "events" | "view" | "is12Hour" diff --git a/src/utils/date.ts b/src/utils/date.ts index 060b9fd..da4f89c 100644 --- a/src/utils/date.ts +++ b/src/utils/date.ts @@ -137,7 +137,8 @@ export function getYearList( futureLength: number, selectedYear: number, ): number[] { - const yearLength = pastLength + futureLength; + // length should include past years, future years, and the current year (+1) + const yearLength = pastLength + futureLength + 1; const yearStarting = dateFn().year() - pastLength; const yearList = Array.from( { length: yearLength }, From 0338286c3e8e7273f11c6e8d83fd74365950cfc0 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Wed, 1 Apr 2026 19:41:54 +0530 Subject: [PATCH 35/92] feat(testing): add testId prop for better testability Add optional testId prop to CalendarProps to allow setting data-testid attributes throughout the calendar components. This enables easier end-to-end testing by providing stable selectors for all major calendar elements including views, headers, and event items. The testId prop is propagated through the CalendarContext and used to generate consistent test identifiers across the component tree. --- src/Calendar.tsx | 3 +++ src/components/core/all_day_banner/AllDayBanner.tsx | 12 ++++++++++-- .../core/current_time_line/CurrentTimeLine.tsx | 3 +++ .../core/day_event_item/DayWeekEventItem.tsx | 3 +++ .../core/month_event_item/MonthEventItem.tsx | 3 +++ src/components/core/time_column/TimeColumn.tsx | 7 ++++++- src/components/layout/Header.tsx | 10 ++++++++-- src/components/ui/popover/Popover.tsx | 3 +++ .../views/custom_days_view/CustomDaysView.tsx | 9 +++++++-- src/components/views/day_view/DayView.tsx | 13 ++++++++++--- src/components/views/month_view/MonthView.tsx | 4 ++-- src/components/views/schedule_view/ScheduleView.tsx | 7 ++++++- src/components/views/week_view/WeekView.tsx | 9 +++++++-- src/constants/calendar.ts | 1 + src/context/CalendarContext.tsx | 5 ++++- src/types/calendar.ts | 1 + 16 files changed, 77 insertions(+), 16 deletions(-) diff --git a/src/Calendar.tsx b/src/Calendar.tsx index c1eb6e1..0d3289d 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -51,6 +51,7 @@ function CalendarContent({ eventsAreSorted, isEventOrderingEnabled, sortedMonthView, + testId, ...restProps }: CalendarContentProps) { const { @@ -127,6 +128,7 @@ function CalendarContent({ return (
+
{gmtLabel}
@@ -69,7 +74,10 @@ export default function AllDayBanner({ const totalCols = days.length; return ( -
+
{gmtLabel} {showExpandCollapse && ( diff --git a/src/components/core/current_time_line/CurrentTimeLine.tsx b/src/components/core/current_time_line/CurrentTimeLine.tsx index 972f79e..455d1f0 100644 --- a/src/components/core/current_time_line/CurrentTimeLine.tsx +++ b/src/components/core/current_time_line/CurrentTimeLine.tsx @@ -3,6 +3,7 @@ import cx from "classnames"; import styles from "./CurrentTimeLine.module.css"; import { dateFn } from "../../../utils"; import { CalendarContentProps } from "../../../types"; +import { useCalendar } from "../../../context/CalendarContext"; interface CurrentTimeLineProps extends Pick< CalendarContentProps, @@ -16,6 +17,7 @@ const CurrentTimeLine = ({ minHour, maxHour, }: CurrentTimeLineProps) => { + const { testId } = useCalendar(); const [position, setPosition] = useState(() => { const now = dateFn(); return (now.hour() - minHour) * 60 + now.minute(); @@ -45,6 +47,7 @@ const CurrentTimeLine = ({
diff --git a/src/components/core/day_event_item/DayWeekEventItem.tsx b/src/components/core/day_event_item/DayWeekEventItem.tsx index cd3c60d..4c41299 100644 --- a/src/components/core/day_event_item/DayWeekEventItem.tsx +++ b/src/components/core/day_event_item/DayWeekEventItem.tsx @@ -5,6 +5,7 @@ import { CalendarContentProps } from "../../../types"; import { DayEventLayout } from "../../../hooks/useDayEventLayout"; import { LAYOUT_CONSTANTS, DATE_FORMATS } from "../../../constants"; import styles from "./DayWeekEventItem.module.css"; +import { useCalendar } from "../../../context/CalendarContext"; interface DayWeekEventItemProps extends Pick< CalendarContentProps, @@ -20,6 +21,7 @@ export function DayWeekEventItem({ classNames, renderEvent, }: DayWeekEventItemProps) { + const { testId } = useCalendar(); const tooltipText = generateTooltipText(item.event, "day", is12Hour); const isSmall = @@ -33,6 +35,7 @@ export function DayWeekEventItem({ [styles.eventItemSmall]: isSmall, [styles.eventItemTiny]: isTiny, })} + data-testid={`${testId}-day-event-item`} style={ { top: `${item.top}px`, diff --git a/src/components/core/month_event_item/MonthEventItem.tsx b/src/components/core/month_event_item/MonthEventItem.tsx index 4129344..4adbf66 100644 --- a/src/components/core/month_event_item/MonthEventItem.tsx +++ b/src/components/core/month_event_item/MonthEventItem.tsx @@ -9,6 +9,7 @@ import { getDiffDays, generateTooltipText, DateType } from "../../../utils"; import styles from "./MonthEventItem.module.css"; import Popover from "../../ui/popover/Popover"; import { LAYOUT_CONSTANTS, defaultTheme } from "../../../constants"; +import { useCalendar } from "../../../context/CalendarContext"; interface MonthEventItemProps extends Pick< CalendarContentProps, @@ -61,6 +62,7 @@ function MonthEventItem({ renderEvent, renderDateCell, }: MonthEventItemProps) { + const { testId } = useCalendar(); const [showPopover, setShowPopover] = useState(false); const [anchorEl, setAnchorEl] = useState(null); @@ -145,6 +147,7 @@ function MonthEventItem({ key={item.id || `${item.startDate}-${index}`} className={cx(styles.eventItem, classNames?.event)} id={item.id} + data-testid={`${testId}-month-event-item`} style={{ width, backgroundColor: LAYOUT_CONSTANTS.DEFAULT_EVENT_COLOR, diff --git a/src/components/core/time_column/TimeColumn.tsx b/src/components/core/time_column/TimeColumn.tsx index 4682390..3b9c2b1 100644 --- a/src/components/core/time_column/TimeColumn.tsx +++ b/src/components/core/time_column/TimeColumn.tsx @@ -4,6 +4,7 @@ import { dateFn, formatDate } from "../../../utils"; import { DATE_FORMATS } from "../../../constants"; import styles from "./TimeColumn.module.css"; import { CalendarContentProps } from "../../../types"; +import { useCalendar } from "../../../context/CalendarContext"; interface TimeColumnProps extends Pick< CalendarContentProps, @@ -16,13 +17,17 @@ function TimeColumn({ minHour, maxHour, }: TimeColumnProps) { + const { testId } = useCalendar(); const hours = Array.from( { length: maxHour - minHour }, (_, i) => i + minHour, ); return ( -
+
{hours.map((hour) => { const timeFormat = is12Hour ? DATE_FORMATS.HOUR_12H : DATE_FORMATS.TIME; return ( diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 4f12a01..a6a971d 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -61,7 +61,7 @@ function Header({ events, resetDateOnViewChange, }: HeaderProps) { - const { state, dispatch } = useCalendar(); + const { state, dispatch, testId } = useCalendar(); const { selectedDate, view } = state; const onMonthArrowClick = (option: EMonthOption) => { @@ -169,10 +169,14 @@ function Header({ }; return ( -
+
); @@ -159,6 +161,7 @@ function CustomView({ classNames={classNames} is12Hour={is12Hour} renderEvent={renderEvent} + locale={locale} /> )}
@@ -168,6 +171,7 @@ function CustomView({ classNames={classNames} minHour={minHour} maxHour={maxHour} + locale={locale} />
{viewDays.map((date, dayIndex) => { diff --git a/src/components/views/day_view/DayView.tsx b/src/components/views/day_view/DayView.tsx index 1944404..a2100fd 100644 --- a/src/components/views/day_view/DayView.tsx +++ b/src/components/views/day_view/DayView.tsx @@ -5,7 +5,7 @@ import useDayEventLayout, { DayEventLayout, } from "../../../hooks/useDayEventLayout"; import { CalendarContentProps } from "../../../types"; -import { DAY_LIST_NAME, DATE_FORMATS } from "../../../constants"; +import { getDayListNames, DATE_FORMATS } from "../../../constants"; import styles from "./DayView.module.css"; import { useCalendar } from "../../../context/CalendarContext"; import TimeColumn from "../../core/time_column/TimeColumn"; @@ -34,6 +34,7 @@ interface DayViewProps extends Pick< | "enrichedEventsByDate" | "eventsAreSorted" | "isEventOrderingEnabled" + | "locale" > {} function DayView({ @@ -57,6 +58,7 @@ function DayView({ enrichedEventsByDate, eventsAreSorted, isEventOrderingEnabled, + locale, }: DayViewProps) { const containerRef = useRef(null); const { state, testId } = useCalendar(); @@ -119,7 +121,7 @@ function DayView({ ) : (
- {DAY_LIST_NAME[dayType][selectedDate.day()]} + {getDayListNames(dayType, locale)[selectedDate.day()]}
- {formatDate(selectedDate, DATE_FORMATS.DAY_NUMBER)} + {formatDate(selectedDate, DATE_FORMATS.DAY_NUMBER, locale)}
)} @@ -141,6 +143,7 @@ function DayView({ classNames={classNames} is12Hour={is12Hour} renderEvent={renderEvent} + locale={locale} /> )}
@@ -150,6 +153,7 @@ function DayView({ classNames={classNames} minHour={minHour} maxHour={maxHour} + locale={locale} />
{} function MonthView({ @@ -60,6 +61,7 @@ function MonthView({ eventsAreSorted, isEventOrderingEnabled, sortedMonthView, + locale, ...restProps }: MonthViewProps) { const { state, dispatch, testId } = useCalendar(); @@ -101,10 +103,10 @@ function MonthView({ ); const headerDays = useMemo(() => { - const list = DAY_LIST_NAME[dayType]; + const list = getDayListNames(dayType, locale); const length = ((weekEndsOn - weekStartsOn + 7) % 7) + 1; return Array.from({ length }, (_, i) => list[(weekStartsOn + i) % 7]); - }, [dayType, weekStartsOn, weekEndsOn]); + }, [dayType, weekStartsOn, weekEndsOn, locale]); return (
diff --git a/src/components/views/schedule_view/ScheduleView.tsx b/src/components/views/schedule_view/ScheduleView.tsx index 29361c3..9d6bf72 100644 --- a/src/components/views/schedule_view/ScheduleView.tsx +++ b/src/components/views/schedule_view/ScheduleView.tsx @@ -23,6 +23,7 @@ interface ScheduleViewProps extends Pick< | "autoScrollToCurrentTime" | "renderEvent" | "renderScheduleSeparator" + | "locale" > {} export default function ScheduleView({ @@ -34,6 +35,7 @@ export default function ScheduleView({ autoScrollToCurrentTime, renderEvent, renderScheduleSeparator, + locale, }: ScheduleViewProps) { const { testId } = useCalendar(); const { todayRef, groupedEvents, renderEventTime, renderEventTitle } = @@ -41,6 +43,7 @@ export default function ScheduleView({ events, autoScrollToCurrentTime, is12Hour, + locale, }); return ( @@ -94,6 +97,7 @@ export default function ScheduleView({ event, ECalendarViewType.schedule, is12Hour, + locale, )} > {/* Column 1: Date Info (only shown on the first event of the day) */} @@ -110,7 +114,11 @@ export default function ScheduleView({ )} style={todayStyle} > - {formatDate(dateObj, DATE_FORMATS.DAY_NUMBER)} + {formatDate( + dateObj, + DATE_FORMATS.DAY_NUMBER, + locale, + )}
diff --git a/src/components/views/week_view/WeekView.tsx b/src/components/views/week_view/WeekView.tsx index ebd8e5a..c95e834 100644 --- a/src/components/views/week_view/WeekView.tsx +++ b/src/components/views/week_view/WeekView.tsx @@ -5,7 +5,7 @@ import useDayEventLayout, { DayEventLayout, } from "../../../hooks/useDayEventLayout"; import { CalendarContentProps } from "../../../types"; -import { DAY_LIST_NAME, DATE_FORMATS } from "../../../constants"; +import { getDayListNames, DATE_FORMATS } from "../../../constants"; import styles from "./WeekView.module.css"; import { useCalendar } from "../../../context/CalendarContext"; import TimeColumn from "../../core/time_column/TimeColumn"; @@ -36,6 +36,7 @@ interface WeekViewProps extends Pick< | "enrichedEventsByDate" | "eventsAreSorted" | "isEventOrderingEnabled" + | "locale" > {} function WeekView({ @@ -61,6 +62,7 @@ function WeekView({ enrichedEventsByDate, eventsAreSorted, isEventOrderingEnabled, + locale, }: WeekViewProps) { const containerRef = useRef(null); const { state, testId } = useCalendar(); @@ -146,7 +148,7 @@ function WeekView({ className={cx(styles.dayHeader, classNames?.dayHeader)} >
- {DAY_LIST_NAME[dayType][date.day()]} + {getDayListNames(dayType, locale)[date.day()]}
- {formatDate(date, DATE_FORMATS.DAY_NUMBER)} + {formatDate(date, DATE_FORMATS.DAY_NUMBER, locale)}
); @@ -169,6 +171,7 @@ function WeekView({ classNames={classNames} is12Hour={is12Hour} renderEvent={renderEvent} + locale={locale} /> )}
@@ -178,6 +181,7 @@ function WeekView({ classNames={classNames} minHour={minHour} maxHour={maxHour} + locale={locale} />
{weekDays.map((date, dayIndex) => { diff --git a/src/constants/calendar.ts b/src/constants/calendar.ts index 2c076e2..36137a8 100644 --- a/src/constants/calendar.ts +++ b/src/constants/calendar.ts @@ -1,52 +1,25 @@ import { ECalendarViewType, EDayType, MonthListType } from "../types"; +import { dateFn } from "../utils/date"; -export const DAY_LIST = { - SUNDAY: { FULL: "Sunday", HALF: "Sun" }, - MONDAY: { FULL: "Monday", HALF: "Mon" }, - TUESDAY: { FULL: "Tuesday", HALF: "Tue" }, - WEDNESDAY: { FULL: "Wednesday", HALF: "Wed" }, - THURSDAY: { FULL: "Thursday", HALF: "Thu" }, - FRIDAY: { FULL: "Friday", HALF: "Fri" }, - SATURDAY: { FULL: "Saturday", HALF: "Sat" }, -}; - -export const DAY_LIST_NAME = { - [EDayType.full]: [ - DAY_LIST.SUNDAY.FULL, - DAY_LIST.MONDAY.FULL, - DAY_LIST.TUESDAY.FULL, - DAY_LIST.WEDNESDAY.FULL, - DAY_LIST.THURSDAY.FULL, - DAY_LIST.FRIDAY.FULL, - DAY_LIST.SATURDAY.FULL, - ], - [EDayType.half]: [ - DAY_LIST.SUNDAY.HALF, - DAY_LIST.MONDAY.HALF, - DAY_LIST.TUESDAY.HALF, - DAY_LIST.WEDNESDAY.HALF, - DAY_LIST.THURSDAY.HALF, - DAY_LIST.FRIDAY.HALF, - DAY_LIST.SATURDAY.HALF, - ], -}; - -const MONTHS = { - JAN: { label: "January", value: 0 }, - FEB: { label: "February", value: 1 }, - MAR: { label: "March", value: 2 }, - APR: { label: "April", value: 3 }, - MAY: { label: "May", value: 4 }, - JUN: { label: "June", value: 5 }, - JUL: { label: "July", value: 6 }, - AUG: { label: "August", value: 7 }, - SEP: { label: "September", value: 8 }, - OCT: { label: "October", value: 9 }, - NOV: { label: "November", value: 10 }, - DEC: { label: "December", value: 11 }, -}; +export function getDayListNames(dayType: EDayType, locale?: string): string[] { + const format = dayType === EDayType.full ? "dddd" : "ddd"; + return Array.from({ length: 7 }, (_, i) => + dateFn() + .day(i) + .locale(locale || "en") + .format(format), + ); +} -export const MONTH_LIST: MonthListType[] = Object.values(MONTHS); +export function getMonthList(locale?: string): MonthListType[] { + return Array.from({ length: 12 }, (_, i) => ({ + label: dateFn() + .month(i) + .locale(locale || "en") + .format("MMMM"), + value: i, + })); +} export const CALENDAR_STRINGS = { MONTH: "monthDropdown", @@ -63,6 +36,15 @@ export const VIEW_OPTIONS = [ export const defaultCalendarProps = { events: [], view: ECalendarViewType.month, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, is12Hour: false, selectable: false, dayType: EDayType.half, diff --git a/src/hooks/useScheduleView.ts b/src/hooks/useScheduleView.ts index 8397ee3..70ada26 100644 --- a/src/hooks/useScheduleView.ts +++ b/src/hooks/useScheduleView.ts @@ -27,6 +27,7 @@ interface UseScheduleViewProps { events: CalendarEvent[]; autoScrollToCurrentTime?: boolean; is12Hour?: boolean; + locale?: string; } /** @@ -39,6 +40,7 @@ export default function useScheduleView({ events, autoScrollToCurrentTime, is12Hour, + locale, }: UseScheduleViewProps) { const todayRef = useRef(null); @@ -64,7 +66,7 @@ export default function useScheduleView({ : current; while (current.isBefore(end) || current.isSame(end)) { - const dateKey = formatDate(current, DATE_FORMATS.DATE); + const dateKey = formatDate(current, DATE_FORMATS.DATE, locale); if (!groups[dateKey]) { groups[dateKey] = []; } @@ -74,7 +76,7 @@ export default function useScheduleView({ }); return groups; - }, [events]); + }, [events, locale]); useEffect(() => { if (autoScrollToCurrentTime && todayRef.current) { @@ -115,23 +117,23 @@ export default function useScheduleView({ if (currentDay.isSame(startDay)) { return isMidnight(event.startDate) ? "All day" - : `${formatTime(formatDate(event.startDate, timeFormat))}`; + : `${formatTime(formatDate(event.startDate, timeFormat, locale))}`; } else if (currentDay.isSame(endDay)) { return isEndOfDay(event.endDate!) ? "All day" - : `Until ${formatTime(formatDate(event.endDate!, timeFormat))}`; + : `Until ${formatTime(formatDate(event.endDate!, timeFormat, locale))}`; } else { return "All day"; } } // Normal single day time range - const startStr = formatDate(event.startDate, timeFormat); + const startStr = formatDate(event.startDate, timeFormat, locale); if (event.endDate) { if (isMidnight(event.startDate) && isEndOfDay(event.endDate)) { return "All day"; } - const endStr = formatDate(event.endDate, timeFormat); + const endStr = formatDate(event.endDate, timeFormat, locale); return `${formatTime(startStr)} – ${formatTime(endStr)}`; } return formatTime(startStr); diff --git a/src/types/calendar.ts b/src/types/calendar.ts index 1aac973..1840f5b 100644 --- a/src/types/calendar.ts +++ b/src/types/calendar.ts @@ -91,6 +91,20 @@ export interface CalendarProps { eventsAreSorted?: boolean; isEventOrderingEnabled?: boolean; sortedMonthView?: boolean | ((a: CalendarEvent, b: CalendarEvent) => number); + + // --- Localization --- + /** the dayjs locale code (e.g., 'en', 'fr', 'es-mx'). Requires importing the locale in dayjs. */ + locale?: string; + + /** Translations for built-in calendar text elements */ + localeMessages?: { + today?: string; + day?: string; + week?: string; + month?: string; + schedule?: string; + days?: string; // used in custom days dropdown like '3 Days' + }; } export interface CalendarContentProps extends RequiredSome< @@ -120,6 +134,8 @@ export interface CalendarContentProps extends RequiredSome< | "eventsAreSorted" | "isEventOrderingEnabled" | "sortedMonthView" + | "locale" + | "localeMessages" > {} export interface MonthListType { diff --git a/src/utils/date.ts b/src/utils/date.ts index da4f89c..8455e12 100644 --- a/src/utils/date.ts +++ b/src/utils/date.ts @@ -86,8 +86,14 @@ export function isSameDate(date1: DateType, date2: DateType): boolean { return dateFn(date1).isSame(dateFn(date2), "day"); } -export function formatDate(date: DateInputType, format: string): string { - return dateFn(date).format(format); +export function formatDate( + date: DateInputType, + format: string, + locale?: string, +): string { + return dateFn(date) + .locale(locale || "en") + .format(format); } export function convertToDate(dayjsDate: DateType): Date { diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts index 2c77ddd..abef340 100644 --- a/src/utils/formatting.ts +++ b/src/utils/formatting.ts @@ -1,4 +1,4 @@ -/** +/** * @file formatting.ts * @description Utilities to format data for user interface presentation. * @@ -25,6 +25,7 @@ export function generateTooltipText( event: CalendarEvent, viewType: ECalendarViewType, is12Hour?: boolean, + locale?: string, ): string { const timeFormat = is12Hour ? DATE_FORMATS.TIME_12H : DATE_FORMATS.TIME; const isMulti = @@ -40,9 +41,9 @@ export function generateTooltipText( formatStr = `${DATE_FORMATS.DATE} ${timeFormat}`; } - let tooltipText = `${event.title} (${formatDate(event.startDate, formatStr)}`; + let tooltipText = `${event.title} (${formatDate(event.startDate, formatStr, locale)}`; if (event.endDate) { - tooltipText += ` - ${formatDate(event.endDate, formatStr)}`; + tooltipText += ` - ${formatDate(event.endDate, formatStr, locale)}`; } tooltipText += `)`; From b0410025d07a384e9cfd3cb6dbe8b3170121ba9f Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Sun, 5 Apr 2026 17:17:20 +0530 Subject: [PATCH 39/92] chore: update ESLint config to use new flat config format Migrate from deprecated defineConfig API to tseslint.config with explicit plugin and rule configuration. This ensures compatibility with the latest ESLint flat config system and provides more explicit control over plugin configurations. --- playground/eslint.config.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/playground/eslint.config.js b/playground/eslint.config.js index b19330b..cb065f0 100644 --- a/playground/eslint.config.js +++ b/playground/eslint.config.js @@ -3,21 +3,27 @@ import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' -export default defineConfig([ - globalIgnores(['dist']), +export default tseslint.config( + { ignores: ['dist'] }, + js.configs.recommended, + ...tseslint.configs.recommended, { files: ['**/*.{ts,tsx}'], - extends: [ - js.configs.recommended, - tseslint.configs.recommended, - reactHooks.configs['recommended-latest'], - reactRefresh.configs.vite, - ], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, }, -]) +) From 7e9d3e3f7c5d8dc7269bf86809fb99687cf38fc2 Mon Sep 17 00:00:00 2001 From: Jaganath M S Date: Mon, 6 Apr 2026 21:25:30 +0530 Subject: [PATCH 40/92] refactor!: migrate from dayjs to luxon for date handling - Replace dayjs with luxon across all components, hooks, and utilities - Update date method calls to use luxon's API (toJSDate(), toFormat(), plus/minus, hasSame, etc.) - Adjust date format strings to match luxon's syntax (yyyy-MM-dd, HH:mm, etc.) - Update test files to use luxon-compatible assertions and mock data - Add @types/luxon to devDependencies and remove dayjs from dependencies - Fix date comparison logic to use luxon's comparison operators and methods - Update week day and month name generation to use luxon's Info utilities BREAKING CHANGE: The calendar now uses Luxon instead of Day.js for all date manipulation. --- package-lock.json | 25 ++-- package.json | 3 +- src/Calendar.test.tsx | 7 +- src/Calendar.tsx | 2 +- .../core/all_day_banner/AllDayBanner.test.tsx | 9 ++ .../current_time_line/CurrentTimeLine.tsx | 6 +- .../core/day_column/DayColumn.test.tsx | 9 ++ .../day_event_item/DayWeekEventItem.test.tsx | 9 ++ .../month_event_item/MonthEventItem.test.tsx | 9 ++ .../core/month_event_item/MonthEventItem.tsx | 2 +- .../core/time_column/TimeColumn.test.tsx | 17 ++- .../core/time_column/TimeColumn.tsx | 2 +- src/components/layout/Header.test.tsx | 2 + src/components/layout/Header.tsx | 40 +++--- .../custom_days_view/CustomDaysView.test.tsx | 9 ++ .../views/custom_days_view/CustomDaysView.tsx | 18 +-- .../views/day_view/DayView.test.tsx | 9 ++ src/components/views/day_view/DayView.tsx | 12 +- .../views/month_view/MonthView.test.tsx | 9 ++ src/components/views/month_view/MonthView.tsx | 4 +- .../views/schedule_view/ScheduleView.test.tsx | 9 ++ .../views/schedule_view/ScheduleView.tsx | 4 +- .../views/week_view/WeekView.test.tsx | 9 ++ src/components/views/week_view/WeekView.tsx | 22 ++-- src/constants/calendar.ts | 42 +++---- src/context/CalendarContext.test.tsx | 4 +- src/context/CalendarContext.tsx | 25 ++-- src/hooks/useAllDayBanner.ts | 16 +-- src/hooks/useDayEventLayout.ts | 14 +-- src/hooks/useEvents.ts | 2 +- src/hooks/useMonthGrid.ts | 2 +- src/hooks/useScheduleView.ts | 14 +-- src/stories/CustomDayView.stories.tsx | 64 +++++----- src/stories/Customization.stories.tsx | 89 ++++++++------ src/stories/DayView.stories.tsx | 48 +++++--- src/stories/Features.stories.tsx | 34 +++--- src/stories/MonthView.stories.tsx | 30 ++--- src/stories/QA/EdgeCases.stories.tsx | 114 +++++++++++++----- src/stories/QA/Interactions.stories.tsx | 17 ++- src/stories/QA/LayoutLimits.stories.tsx | 26 ++-- src/stories/QA/Performance.stories.tsx | 23 ++-- src/stories/QA/TimeFormatting.stories.tsx | 12 +- src/stories/QA/Views.stories.tsx | 12 +- src/stories/ScheduleView.stories.tsx | 76 ++++++------ src/stories/WeekView.stories.tsx | 74 +++++++----- src/types/calendar.ts | 2 +- src/utils/common.ts | 4 +- src/utils/date.test.ts | 8 +- src/utils/date.ts | 98 +++++++++------ src/utils/formatting.ts | 3 +- 50 files changed, 673 insertions(+), 427 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5d5701..7721e65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "calendarize": "^1.1.1", "classnames": "^2.5.1", - "dayjs": "^1.11.19" + "luxon": "^3.7.2" }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", @@ -26,6 +26,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", + "@types/luxon": "^3.7.1", "@types/node": "^25.2.3", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", @@ -3599,6 +3600,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", @@ -5529,12 +5537,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT" - }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -8955,6 +8957,15 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", diff --git a/package.json b/package.json index 388e9d2..3154154 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "dependencies": { "calendarize": "^1.1.1", "classnames": "^2.5.1", - "dayjs": "^1.11.19" + "luxon": "^3.7.2" }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", @@ -70,6 +70,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", + "@types/luxon": "^3.7.1", "@types/node": "^25.2.3", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", diff --git a/src/Calendar.test.tsx b/src/Calendar.test.tsx index a6340f4..19e3222 100644 --- a/src/Calendar.test.tsx +++ b/src/Calendar.test.tsx @@ -55,7 +55,10 @@ describe("Calendar Component Integration", () => { it("responds to ControlledState updates", () => { const start = dateFn("2024-03-01"); const { rerender } = render( - , + , ); expect(screen.getByText("March 2024")).toBeInTheDocument(); @@ -63,7 +66,7 @@ describe("Calendar Component Integration", () => { const newDate = dateFn("2025-06-15"); rerender( , ); diff --git a/src/Calendar.tsx b/src/Calendar.tsx index fc26878..c14104a 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -143,7 +143,7 @@ function CalendarContent({ > {restProps.renderHeader ? ( restProps.renderHeader({ - currentDate: selectedDate.toDate(), + currentDate: selectedDate.toJSDate(), view, onNavigate: (date: Date) => { dispatch({ diff --git a/src/components/core/all_day_banner/AllDayBanner.test.tsx b/src/components/core/all_day_banner/AllDayBanner.test.tsx index f6c6647..78bae68 100644 --- a/src/components/core/all_day_banner/AllDayBanner.test.tsx +++ b/src/components/core/all_day_banner/AllDayBanner.test.tsx @@ -36,6 +36,15 @@ describe("AllDayBanner Component", () => { eventProps: {}, is12Hour: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, }; it("renders empty state without failing", () => { diff --git a/src/components/core/current_time_line/CurrentTimeLine.tsx b/src/components/core/current_time_line/CurrentTimeLine.tsx index 455d1f0..d7e3b22 100644 --- a/src/components/core/current_time_line/CurrentTimeLine.tsx +++ b/src/components/core/current_time_line/CurrentTimeLine.tsx @@ -20,14 +20,14 @@ const CurrentTimeLine = ({ const { testId } = useCalendar(); const [position, setPosition] = useState(() => { const now = dateFn(); - return (now.hour() - minHour) * 60 + now.minute(); + return (now.hour - minHour) * 60 + now.minute; }); useEffect(() => { const updatePosition = () => { const now = dateFn(); - const hours = now.hour(); - const minutes = now.minute(); + const hours = now.hour; + const minutes = now.minute; // eventSlot height is 60px per hour const totalMinutes = (hours - minHour) * 60 + minutes; setPosition(totalMinutes); diff --git a/src/components/core/day_column/DayColumn.test.tsx b/src/components/core/day_column/DayColumn.test.tsx index 219d154..55ee210 100644 --- a/src/components/core/day_column/DayColumn.test.tsx +++ b/src/components/core/day_column/DayColumn.test.tsx @@ -27,6 +27,15 @@ describe("DayColumn Component", () => { dayEvents, is12Hour: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, showCurrentTime: false, minHour: 0, maxHour: 24, diff --git a/src/components/core/day_event_item/DayWeekEventItem.test.tsx b/src/components/core/day_event_item/DayWeekEventItem.test.tsx index c812d84..6707902 100644 --- a/src/components/core/day_event_item/DayWeekEventItem.test.tsx +++ b/src/components/core/day_event_item/DayWeekEventItem.test.tsx @@ -26,6 +26,15 @@ describe("DayWeekEventItem Component", () => { item: mockItem, is12Hour: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, }; it("renders the event item with correct styles and title", () => { diff --git a/src/components/core/month_event_item/MonthEventItem.test.tsx b/src/components/core/month_event_item/MonthEventItem.test.tsx index a1ce382..aaf9864 100644 --- a/src/components/core/month_event_item/MonthEventItem.test.tsx +++ b/src/components/core/month_event_item/MonthEventItem.test.tsx @@ -21,6 +21,15 @@ describe("MonthEventItem Component", () => { is12Hour: false, showAdjacentMonths: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, }; it("renders date correctly and applies selected classes", () => { diff --git a/src/components/core/month_event_item/MonthEventItem.tsx b/src/components/core/month_event_item/MonthEventItem.tsx index 855d4ac..36ee658 100644 --- a/src/components/core/month_event_item/MonthEventItem.tsx +++ b/src/components/core/month_event_item/MonthEventItem.tsx @@ -113,7 +113,7 @@ function MonthEventItem({ <> {renderDateCell ? ( renderDateCell({ - date: dateObj.toDate(), + date: dateObj.toJSDate(), isToday, isSelected, isCurrentMonth, diff --git a/src/components/core/time_column/TimeColumn.test.tsx b/src/components/core/time_column/TimeColumn.test.tsx index 72ca019..581c533 100644 --- a/src/components/core/time_column/TimeColumn.test.tsx +++ b/src/components/core/time_column/TimeColumn.test.tsx @@ -13,7 +13,13 @@ describe("TimeColumn Component", () => { initialDate={dateFn()} initialView={ECalendarViewType.week} > - + , ); @@ -35,6 +41,7 @@ describe("TimeColumn Component", () => { maxHour={15} is12Hour={false} classNames={{}} + locale="en" /> , ); @@ -49,7 +56,13 @@ describe("TimeColumn Component", () => { initialDate={dateFn()} initialView={ECalendarViewType.week} > - + , ); diff --git a/src/components/core/time_column/TimeColumn.tsx b/src/components/core/time_column/TimeColumn.tsx index 075dbf8..8a29a8b 100644 --- a/src/components/core/time_column/TimeColumn.tsx +++ b/src/components/core/time_column/TimeColumn.tsx @@ -33,7 +33,7 @@ function TimeColumn({ const timeFormat = is12Hour ? DATE_FORMATS.HOUR_12H : DATE_FORMATS.TIME; return (
- {formatDate(dateFn().hour(hour).minute(0), timeFormat, locale)} + {formatDate(dateFn().set({ hour, minute: 0 }), timeFormat, locale)}
); })} diff --git a/src/components/layout/Header.test.tsx b/src/components/layout/Header.test.tsx index 3edb2c4..612dc31 100644 --- a/src/components/layout/Header.test.tsx +++ b/src/components/layout/Header.test.tsx @@ -38,6 +38,8 @@ describe("Header Component", () => { resetDateOnViewChange: false, onNavigate: vi.fn(), onViewChange: vi.fn(), + locale: "en", + localeMessages: {}, }; it("renders correctly with current date and view", () => { diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 5da753e..34fb08c 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -21,7 +21,6 @@ import { formatDate, getMonth, getYear, - ManipulateType, } from "../../utils"; import styles from "./Header.module.css"; import LeftArrow from "../../assets/LeftArrow"; @@ -72,19 +71,21 @@ function Header({ const isAdd = option === EMonthOption.add; dispatch({ type: isAdd ? CALENDAR_ACTIONS.NEXT : CALENDAR_ACTIONS.PREV }); - const unit = ( - view === ECalendarViewType.schedule ? "day" : view - ) as ManipulateType; + const unit = (view === ECalendarViewType.schedule ? "day" : view) as + | "day" + | "week" + | "month" + | "year"; let predictiveDate; if (view === ECalendarViewType.customDays) { predictiveDate = isAdd - ? selectedDate.add(customDays || 3, "day") - : selectedDate.subtract(customDays || 3, "day"); + ? selectedDate.plus({ day: customDays || 3 }) + : selectedDate.minus({ day: customDays || 3 }); } else { predictiveDate = isAdd - ? selectedDate.add(1, unit) - : selectedDate.subtract(1, unit); + ? selectedDate.plus({ [unit]: 1 }) + : selectedDate.minus({ [unit]: 1 }); } onNavigate?.(convertToDate(predictiveDate)); @@ -124,8 +125,8 @@ function Header({ if (view === ECalendarViewType.week) { const startOfWeek = selectedDate.startOf("week"); const endOfWeek = selectedDate.endOf("week"); - if (startOfWeek.month() !== endOfWeek.month()) { - if (startOfWeek.year() !== endOfWeek.year()) { + if (startOfWeek.month !== endOfWeek.month) { + if (startOfWeek.year !== endOfWeek.year) { return `${formatDate(startOfWeek, DATE_FORMATS.SHORT_MONTH_YEAR, locale)} - ${formatDate(endOfWeek, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; } return `${formatDate(startOfWeek, DATE_FORMATS.SHORT_MONTH, locale)} - ${formatDate(endOfWeek, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; @@ -133,9 +134,9 @@ function Header({ } if (view === ECalendarViewType.customDays) { const days = customDays || 3; - const endDate = selectedDate.add(days - 1, "day"); - if (selectedDate.month() !== endDate.month()) { - if (selectedDate.year() !== endDate.year()) { + const endDate = selectedDate.plus({ day: days - 1 }); + if (selectedDate.month !== endDate.month) { + if (selectedDate.year !== endDate.year) { return `${formatDate(selectedDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)} - ${formatDate(endDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; } return `${formatDate(selectedDate, DATE_FORMATS.SHORT_MONTH, locale)} - ${formatDate(endDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; @@ -143,7 +144,7 @@ function Header({ if (days === 1) { return formatDate(selectedDate, DATE_FORMATS.MONTH_DAY_YEAR, locale); } - return `${formatDate(selectedDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH, locale)} - ${formatDate(endDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH, locale)}, ${formatDate(selectedDate, "YYYY")}`; + return `${formatDate(selectedDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH, locale)} - ${formatDate(endDate, DATE_FORMATS.DAY_DATE_SHORT_MONTH, locale)}, ${formatDate(selectedDate, "yyyy")}`; } if (view === ECalendarViewType.schedule) { if (events && events.length > 0) { @@ -153,15 +154,12 @@ function Header({ events.forEach((event) => { const sd = dateFn(event.startDate); const ed = event.endDate ? dateFn(event.endDate) : sd; - if (sd.isBefore(minDate)) minDate = sd; - if (ed.isAfter(maxDate)) maxDate = ed; + if (sd < minDate) minDate = sd; + if (ed > maxDate) maxDate = ed; }); - if ( - minDate.month() !== maxDate.month() || - minDate.year() !== maxDate.year() - ) { - if (minDate.year() !== maxDate.year()) { + if (minDate.month !== maxDate.month || minDate.year !== maxDate.year) { + if (minDate.year !== maxDate.year) { return `${formatDate(minDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)} - ${formatDate(maxDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; } return `${formatDate(minDate, DATE_FORMATS.SHORT_MONTH, locale)} - ${formatDate(maxDate, DATE_FORMATS.SHORT_MONTH_YEAR, locale)}`; diff --git a/src/components/views/custom_days_view/CustomDaysView.test.tsx b/src/components/views/custom_days_view/CustomDaysView.test.tsx index b0c216a..07f0065 100644 --- a/src/components/views/custom_days_view/CustomDaysView.test.tsx +++ b/src/components/views/custom_days_view/CustomDaysView.test.tsx @@ -36,6 +36,15 @@ describe("CustomDaysView Component", () => { theme: {}, eventProps: {}, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, showCurrentTime: true, maxEvents: 3, autoScrollToCurrentTime: false, diff --git a/src/components/views/custom_days_view/CustomDaysView.tsx b/src/components/views/custom_days_view/CustomDaysView.tsx index 8ffa78f..d40f05e 100644 --- a/src/components/views/custom_days_view/CustomDaysView.tsx +++ b/src/components/views/custom_days_view/CustomDaysView.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useEffect, useRef } from "react"; import cx from "classnames"; -import { dateFn, formatDate } from "../../../utils"; +import { getDayOfWeek, dateFn, formatDate } from "../../../utils"; import useDayEventLayout, { DayEventLayout, } from "../../../hooks/useDayEventLayout"; @@ -68,7 +68,7 @@ function CustomView({ const viewDays = useMemo(() => { return Array.from({ length: customDays }, (_, i) => - selectedDate.add(i, "day"), + selectedDate.plus({ day: i }), ); }, [selectedDate, customDays]); @@ -89,14 +89,14 @@ function CustomView({ const hasToday = useMemo(() => { const now = dateFn(); - return viewDays.some((day) => now.isSame(day, "day")); + return viewDays.some((day) => now.hasSame(day, "day")); }, [viewDays]); useEffect(() => { if (autoScrollToCurrentTime && containerRef.current && hasToday) { const now = dateFn(); - const hours = now.hour(); - const minutes = now.minute(); + const hours = now.hour; + const minutes = now.minute; const totalMinutes = hours * 60 + minutes; const container = containerRef.current; @@ -119,7 +119,7 @@ function CustomView({
{viewDays.map((date, index) => { - const isToday = dateFn().isSame(date, "day"); + const isToday = dateFn().hasSame(date, "day"); const todayStyle = isToday ? { color: theme?.today?.color, @@ -129,7 +129,7 @@ function CustomView({ return renderDateCell ? ( renderDateCell({ - date: date.toDate(), + date: date.toJSDate(), isToday, }) ) : ( @@ -138,7 +138,7 @@ function CustomView({ className={cx(styles.dayHeader, classNames?.dayHeader)} >
- {getDayListNames(dayType, locale)[date.day()]} + {getDayListNames(dayType, locale)[getDayOfWeek(date)]}
{viewDays.map((date, dayIndex) => { - const isToday = dateFn().isSame(date, "day"); + const isToday = dateFn().hasSame(date, "day"); return (
{ eventsAreSorted: false, isEventOrderingEnabled: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, }; it("renders the day header correctly", () => { diff --git a/src/components/views/day_view/DayView.tsx b/src/components/views/day_view/DayView.tsx index a2100fd..f636c72 100644 --- a/src/components/views/day_view/DayView.tsx +++ b/src/components/views/day_view/DayView.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef } from "react"; import cx from "classnames"; -import { dateFn, formatDate } from "../../../utils"; +import { getDayOfWeek, dateFn, formatDate } from "../../../utils"; import useDayEventLayout, { DayEventLayout, } from "../../../hooks/useDayEventLayout"; @@ -78,7 +78,7 @@ function DayView({ }, ) as DayEventLayout[]; - const isToday = dateFn().isSame(selectedDate, "day"); + const isToday = dateFn().hasSame(selectedDate, "day"); const todayStyle = isToday ? { @@ -90,8 +90,8 @@ function DayView({ useEffect(() => { if (autoScrollToCurrentTime && containerRef.current && isToday) { const now = dateFn(); - const hours = now.hour(); - const minutes = now.minute(); + const hours = now.hour; + const minutes = now.minute; const totalMinutes = hours * 60 + minutes; const container = containerRef.current; @@ -115,13 +115,13 @@ function DayView({
{renderDateCell ? ( renderDateCell({ - date: selectedDate.toDate(), + date: selectedDate.toJSDate(), isToday, }) ) : (
- {getDayListNames(dayType, locale)[selectedDate.day()]} + {getDayListNames(dayType, locale)[getDayOfWeek(selectedDate)]}
{ theme: {}, eventProps: {}, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, showAdjacentMonths: true, enableEnrichedEvents: false, eventsAreSorted: false, diff --git a/src/components/views/month_view/MonthView.tsx b/src/components/views/month_view/MonthView.tsx index e6c74fc..95b7c86 100644 --- a/src/components/views/month_view/MonthView.tsx +++ b/src/components/views/month_view/MonthView.tsx @@ -94,7 +94,7 @@ function MonthView({ const onClickDateHandler = useCallback( (dateInput: DateType) => { const newDate = dateFn(dateInput); - if (selectable && !newDate.isSame(selectedDate, "day")) { + if (selectable && !newDate.hasSame(selectedDate, "day")) { onDateClick?.(convertToDate(newDate)); dispatch({ type: "SET_DATE", payload: newDate }); } @@ -139,7 +139,7 @@ function MonthView({ isSelected={ selectable && dayInfo.isCurrentMonth && - dayInfo.displayDay === selectedDate.date() + dayInfo.displayDay === selectedDate.day } isToday={dayInfo.isToday} isCurrentMonth={dayInfo.isCurrentMonth} diff --git a/src/components/views/schedule_view/ScheduleView.test.tsx b/src/components/views/schedule_view/ScheduleView.test.tsx index cf0a135..67dcf23 100644 --- a/src/components/views/schedule_view/ScheduleView.test.tsx +++ b/src/components/views/schedule_view/ScheduleView.test.tsx @@ -42,6 +42,15 @@ describe("ScheduleView Component", () => { theme: {}, eventProps: {}, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, autoScrollToCurrentTime: false, dayType: "half" as const, }; diff --git a/src/components/views/schedule_view/ScheduleView.tsx b/src/components/views/schedule_view/ScheduleView.tsx index 9d6bf72..44c1361 100644 --- a/src/components/views/schedule_view/ScheduleView.tsx +++ b/src/components/views/schedule_view/ScheduleView.tsx @@ -61,7 +61,7 @@ export default function ScheduleView({ const dateObj = dateFn(dateKey); const isLastGroup = groupIndex === allKeys.length - 1; - const isToday = checkIsToday(dateObj, dateObj.date()); + const isToday = checkIsToday(dateObj, dateObj.day); const todayStyle = isToday ? { color: theme?.today?.color, @@ -187,7 +187,7 @@ export default function ScheduleView({
{!isLastGroup && renderScheduleSeparator && - renderScheduleSeparator(dateObj.toDate())} + renderScheduleSeparator(dateObj.toJSDate())} ); }) diff --git a/src/components/views/week_view/WeekView.test.tsx b/src/components/views/week_view/WeekView.test.tsx index e716a43..492cae0 100644 --- a/src/components/views/week_view/WeekView.test.tsx +++ b/src/components/views/week_view/WeekView.test.tsx @@ -48,6 +48,15 @@ describe("WeekView Component", () => { eventsAreSorted: false, isEventOrderingEnabled: false, classNames: {}, + locale: "en", + localeMessages: { + today: "Today", + day: "Day", + week: "Week", + month: "Month", + schedule: "Schedule", + days: "Days", + }, }; it("renders the week headers correctly", () => { diff --git a/src/components/views/week_view/WeekView.tsx b/src/components/views/week_view/WeekView.tsx index c95e834..b3ab48e 100644 --- a/src/components/views/week_view/WeekView.tsx +++ b/src/components/views/week_view/WeekView.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useEffect, useRef } from "react"; import cx from "classnames"; -import { dateFn, formatDate } from "../../../utils"; +import { getDayOfWeek, dateFn, formatDate } from "../../../utils"; import useDayEventLayout, { DayEventLayout, } from "../../../hooks/useDayEventLayout"; @@ -68,18 +68,18 @@ function WeekView({ const { state, testId } = useCalendar(); const { selectedDate } = state; const startOfWeek = useMemo(() => { - const currentDay = selectedDate.day(); + const currentDay = getDayOfWeek(selectedDate); const diff = currentDay >= weekStartsOn ? weekStartsOn - currentDay : weekStartsOn - currentDay - 7; - return selectedDate.add(diff, "day").startOf("day"); + return selectedDate.plus({ day: diff }).startOf("day"); }, [selectedDate, weekStartsOn]); const weekDays = useMemo(() => { let length = weekEndsOn - weekStartsOn + 1; if (length <= 0) length += 7; - return Array.from({ length }, (_, i) => startOfWeek.add(i, "day")); + return Array.from({ length }, (_, i) => startOfWeek.plus({ day: i })); }, [startOfWeek, weekStartsOn, weekEndsOn]); const weekEvents = useDayEventLayout( @@ -99,14 +99,14 @@ function WeekView({ const isCurrentWeek = useMemo(() => { const now = dateFn(); - return weekDays.some((day) => now.isSame(day, "day")); + return weekDays.some((day) => now.hasSame(day, "day")); }, [weekDays]); useEffect(() => { if (autoScrollToCurrentTime && containerRef.current && isCurrentWeek) { const now = dateFn(); - const hours = now.hour(); - const minutes = now.minute(); + const hours = now.hour; + const minutes = now.minute; const totalMinutes = hours * 60 + minutes; const container = containerRef.current; @@ -129,7 +129,7 @@ function WeekView({
{weekDays.map((date, index) => { - const isToday = dateFn().isSame(date, "day"); + const isToday = dateFn().hasSame(date, "day"); const todayStyle = isToday ? { color: theme?.today?.color, @@ -139,7 +139,7 @@ function WeekView({ return renderDateCell ? ( renderDateCell({ - date: date.toDate(), + date: date.toJSDate(), isToday, }) ) : ( @@ -148,7 +148,7 @@ function WeekView({ className={cx(styles.dayHeader, classNames?.dayHeader)} >
- {getDayListNames(dayType, locale)[date.day()]} + {getDayListNames(dayType, locale)[getDayOfWeek(date)]}
{weekDays.map((date, dayIndex) => { - const isToday = dateFn().isSame(date, "day"); + const isToday = dateFn().hasSame(date, "day"); return (
- dateFn() - .day(i) - .locale(locale || "en") - .format(format), - ); + const format = dayType === EDayType.full ? "long" : "short"; + const days = Info.weekdays(format, { locale: locale || "en" }); + // Luxon returns Mon-Sun. We need Sun-Sat to match expected 0-6 index. + return [days[6], ...days.slice(0, 6)]; } export function getMonthList(locale?: string): MonthListType[] { - return Array.from({ length: 12 }, (_, i) => ({ - label: dateFn() - .month(i) - .locale(locale || "en") - .format("MMMM"), + return Info.months("long", { locale: locale || "en" }).map((label, i) => ({ + label, value: i, })); } @@ -70,19 +64,19 @@ export const defaultCalendarProps = { }; export const DATE_FORMATS = { - DATE: "YYYY-MM-DD", + DATE: "yyyy-MM-dd", TIME: "HH:mm", - TIME_12H: "hh:mm A", - HOUR_12H: "hh A", - MONTH_YEAR: "MMMM YYYY", - DAY_INDEX: "d", - DAY_NUMBER: "D", - FULL_DATE: "dddd, MMMM D, YYYY", - MONTH_DAY_YEAR: "MMMM D, YYYY", - SHORT_MONTH_YEAR: "MMM YYYY", + TIME_12H: "hh:mm a", + HOUR_12H: "hh a", + MONTH_YEAR: "MMMM yyyy", + DAY_INDEX: "c", + DAY_NUMBER: "d", + FULL_DATE: "EEEE, MMMM d, yyyy", + MONTH_DAY_YEAR: "MMMM d, yyyy", + SHORT_MONTH_YEAR: "MMM yyyy", SHORT_MONTH: "MMM", - SHORT_DAY: "ddd", - DAY_DATE_SHORT_MONTH: "ddd, D MMM", + SHORT_DAY: "EEE", + DAY_DATE_SHORT_MONTH: "EEE, d MMM", }; export const CALENDAR_ACTIONS = { diff --git a/src/context/CalendarContext.test.tsx b/src/context/CalendarContext.test.tsx index 5cb6cfe..5e16ae0 100644 --- a/src/context/CalendarContext.test.tsx +++ b/src/context/CalendarContext.test.tsx @@ -11,7 +11,9 @@ const TestComponent = () => { return (
{state.view} - {state.selectedDate.format("YYYY-MM-DD")} + + {state.selectedDate.toFormat("yyyy-MM-dd")} +
), @@ -154,7 +156,9 @@ export const CustomRenderers: Story = { diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 69c064d..0c3adae 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -193,10 +193,11 @@ function Header(props: HeaderProps) { className={cx(styles.header, finalHeaderClassName)} data-testid={`${testId}-header`} > -
+

{getHeaderTitle()}

-
+