diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml index 7a6d0a1c..38e05c67 100644 --- a/.github/workflows/analysis.yml +++ b/.github/workflows/analysis.yml @@ -39,12 +39,12 @@ jobs: - name: ๐Ÿ“ฆ Setup pnpm uses: pnpm/action-setup@v3 - with: { version: 9 } + with: { version: 10 } - name: ๐Ÿ—๏ธ Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: ๐Ÿ“‚ Install dependencies diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d5d42ad..61523a37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,12 +40,12 @@ jobs: - name: ๐Ÿ“ฆ Setup pnpm uses: pnpm/action-setup@v3 - with: { version: 9 } + with: { version: 10 } - name: ๐Ÿ—๏ธ Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24 cache: pnpm - name: ๐Ÿ“‚ Install dependencies diff --git a/.npmrc b/.npmrc index 39d6df63..5403cba5 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -package-manager=pnpm@9.1.0 \ No newline at end of file +package-manager=pnpm@10.24.0 diff --git a/apps/web/.eslintrc.cjs b/apps/web/.eslintrc.cjs index bed6168e..6c640b3e 100644 --- a/apps/web/.eslintrc.cjs +++ b/apps/web/.eslintrc.cjs @@ -1,29 +1,11 @@ -// apps/web/.eslintrc.js module.exports = { root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - project: './tsconfig.json', - }, - ignorePatterns: ['stylelint.config.js', 'postcss.config.mjs', '**/__tests__/e2e/**', 'server.mjs'], - extends: [ - 'next', - 'next/core-web-vitals', - 'plugin:@typescript-eslint/recommended', - ], - overrides: [ - { - // ์ด ํŒจํ„ด์— ๊ฑธ๋ฆฌ๋Š” ํŒŒ์ผ์€ ํƒ€์ž… ๊ฒ€์‚ฌ(parserOptions.project) ํ•˜์ง€ ์•Š์Œ - files: [ - 'next.config.js', - 'postcss.config.cjs', - 'tailwind.config.js', - '.eslintrc.js', - ], - parserOptions: { - project: null, // or [] - }, - }, + extends: ['next', 'next/core-web-vitals'], + ignorePatterns: [ + 'stylelint.config.js', + 'postcss.config.mjs', + '**/__tests__/e2e/**', + 'server.mjs', ], rules: { // ๊ธฐ์กด ๊ทœ์น™ diff --git a/apps/web/package.json b/apps/web/package.json index f389374f..f6ea12e4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -48,6 +48,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@lhci/cli": "^0.15.1", + "eslint": "^8.56.0", "@next/bundle-analyzer": "^15.5.3", "@playwright/test": "^1.56.1", "@stylistic/stylelint-config": "^2.0.0", @@ -58,7 +59,7 @@ "@testing-library/react": "^14.3.1", "@testing-library/user-event": "^14.5.2", "@types/js-cookie": "^3.0.6", - "@types/node": "^20", + "@types/node": "^24", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "@vitejs/plugin-react": "^4.3.3", diff --git a/package.json b/package.json index 84fe647f..278221b5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "", "main": "index.js", - "packageManager": "pnpm@9.15.9", + "packageManager": "pnpm@10.24.0", "scripts": { "dev": " turbo run dev --parallel", "dev:web": "pnpm --filter web dev:https", @@ -26,13 +26,29 @@ }, "keywords": [], "author": "", - "license": "ISC", + "license": "Apache-2.0", "private": true, + "engines": { + "node": "^24", + "pnpm": "^10" + }, "workspaces": [ "apps/*", "packages/*", "tools/*" ], + "pnpm": { + "overrides": { + "@types/node": "^24" + }, + "peerDependencyRules": { + "allowedVersions": { + "@typescript-eslint/eslint-plugin": "8", + "@typescript-eslint/parser": "8", + "eslint-plugin-react-hooks": "5" + } + } + }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix", @@ -49,6 +65,7 @@ "@changesets/cli": "^2.29.8", "@commitlint/cli": "^19.8.1", "@commitlint/config-conventional": "^19.8.1", + "@types/node": "24.10.1", "@typescript-eslint/eslint-plugin": "^8.35.1", "@typescript-eslint/parser": "^8.35.1", "eslint": "^8.56.0", diff --git a/packages/eslint-config/library.cjs b/packages/eslint-config/library.cjs index 59cd74ed..e548aabc 100644 --- a/packages/eslint-config/library.cjs +++ b/packages/eslint-config/library.cjs @@ -36,5 +36,15 @@ module.exports = { devDependencies: true, }, ], + // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” props spreading ํ—ˆ์šฉ (์œ ์—ฐํ•œ API๋ฅผ ์œ„ํ•ด) + 'react/jsx-props-no-spreading': 'off', + // TypeScript ์‚ฌ์šฉ ์‹œ defaultProps ๋ถˆํ•„์š” (optional props ์‚ฌ์šฉ) + 'react/require-default-props': 'off', + // named export๋ฅผ ์„ ํ˜ธ (Tree-shaking์— ์œ ๋ฆฌ) + 'import/prefer-default-export': 'off', + // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์Šคํƒ€์ผ ์ž์œ ๋กญ๊ฒŒ + 'arrow-body-style': 'off', + // useEffect cleanup ํ•จ์ˆ˜ ๋“ฑ์—์„œ ์œ ์—ฐํ•œ return ํ—ˆ์šฉ + 'consistent-return': 'off', }, }; diff --git a/packages/ui/.eslintignore b/packages/ui/.eslintignore new file mode 100644 index 00000000..7334bbb4 --- /dev/null +++ b/packages/ui/.eslintignore @@ -0,0 +1,3 @@ +dist +node_modules +*.config.ts diff --git a/packages/ui/.eslintrc.cjs b/packages/ui/.eslintrc.cjs new file mode 100644 index 00000000..fa48183d --- /dev/null +++ b/packages/ui/.eslintrc.cjs @@ -0,0 +1,17 @@ +const path = require('path'); + +module.exports = { + root: true, + extends: [require.resolve('@soso/eslint-config/library.cjs')], + parserOptions: { + project: path.resolve(__dirname, './tsconfig.json'), + tsconfigRootDir: __dirname, + }, + ignorePatterns: [ + 'dist', + '*.config.ts', + '*.config.js', + '*.config.mjs', + '.eslintrc.*', + ], +}; diff --git a/packages/ui/.npmignore b/packages/ui/.npmignore new file mode 100644 index 00000000..59f3c5d2 --- /dev/null +++ b/packages/ui/.npmignore @@ -0,0 +1,38 @@ +# Source files +src/ +*.ts +*.tsx +!*.d.ts + +# Config files +tsconfig.json +tsup.config.ts +vitest.config.ts +.eslintrc.cjs + +# Test files +**/*.test.* +**/*.spec.* +src/test/ +__tests__/ +tests/ +coverage/ + +# Development +.turbo/ +node_modules/ +.DS_Store +*.log + +# Git +.git/ +.gitignore + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Misc +.changeset/ diff --git a/packages/ui/README.md b/packages/ui/README.md new file mode 100644 index 00000000..f1776514 --- /dev/null +++ b/packages/ui/README.md @@ -0,0 +1,89 @@ +# @soso/ui + +SOSO UI component library - Production-grade React components for SOSO applications. + +## Installation + +```bash +# Using pnpm +pnpm add @soso/ui + +# Using npm +npm install @soso/ui + +# Using yarn +yarn add @soso/ui +``` + +## Usage + +```tsx +import { Button } from '@soso/ui'; + +function App() { + return ( + + ); +} +``` + +## Development + +### Prerequisites + +- Node.js 18+ +- pnpm 8+ + +### Setup + +```bash +# Install dependencies +pnpm install + +# Run tests +pnpm test + +# Run tests in watch mode +pnpm test:watch + +# Build the library +pnpm build + +# Type check +pnpm typecheck + +# Lint +pnpm lint +``` + +### Scripts + +- `pnpm build` - Build the library (ESM + CJS + TypeScript declarations) +- `pnpm dev` - Build in watch mode +- `pnpm test` - Run unit tests +- `pnpm test:watch` - Run tests in watch mode +- `pnpm test:coverage` - Generate coverage report +- `pnpm test:ui` - Open Vitest UI +- `pnpm typecheck` - Run TypeScript type checking +- `pnpm lint` - Lint the codebase +- `pnpm clean` - Clean build artifacts + +## Features + +- โœ… **TypeScript**: Full TypeScript support with type definitions +- โœ… **Tree-shakeable**: ESM and CJS builds with tree-shaking support +- โœ… **Tested**: Comprehensive unit tests with Vitest +- โœ… **Accessible**: Built with accessibility in mind +- โœ… **Modern**: Uses latest React patterns and best practices + +## Components + +_(Component documentation will be added as components are developed)_ + +## License + +MIT + +## Contributing + +See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details. diff --git a/packages/ui/package.json b/packages/ui/package.json index a27ada7c..ef02fff0 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1 +1,91 @@ -{ "name": "@soso/ui", "version": "0.0.0", "private": true } +{ + "name": "@soso/ui", + "version": "0.0.0", + "description": "SOSO UI component library", + "author": "SOSO Team", + "license": "MIT", + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./components/*": { + "import": { + "types": "./dist/components/*.d.mts", + "default": "./dist/components/*.mjs" + }, + "require": { + "types": "./dist/components/*.d.ts", + "default": "./dist/components/*.js" + } + } + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "README.md", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:ui": "vitest --ui", + "typecheck": "tsc --noEmit", + "lint": "eslint .", + "clean": "rm -rf dist" + }, + "dependencies": { + "clsx": "^2.1.1", + "motion": "^12.23.24", + "tailwind-merge": "^3.3.1" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@soso/eslint-config": "workspace:*", + "@soso/tsconfig": "workspace:*", + "@testing-library/jest-dom": "^6.6.1", + "@testing-library/react": "^14.3.1", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@vitejs/plugin-react": "^4.3.3", + "@vitest/coverage-v8": "^3.2.4", + "@vitest/ui": "^3.2.4", + "eslint": "^8.56.0", + "jsdom": "^25.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tsup": "^8.3.5", + "typescript": "^5.4.2", + "vitest": "^3.2.4" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + }, + "keywords": [ + "react", + "components", + "ui", + "design-system", + "soso" + ] +} diff --git a/packages/ui/src/components/Button/Button.test.tsx b/packages/ui/src/components/Button/Button.test.tsx new file mode 100644 index 00000000..db7666f5 --- /dev/null +++ b/packages/ui/src/components/Button/Button.test.tsx @@ -0,0 +1,192 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Button } from './Button'; + +/** + * Button ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ + * + * ๋กœ์ง, ์ด๋ฒคํŠธ, ์ ‘๊ทผ์„ฑ, props ๊ฒ€์ฆ + */ + +describe('Button', () => { + describe('๊ธฐ๋ณธ ๋ Œ๋”๋ง', () => { + it('ํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ๋ Œ๋”๋ง๋œ๋‹ค', () => { + render(); + expect( + screen.getByRole('button', { name: /click me/i }), + ).toBeInTheDocument(); + }); + + it('๊ธฐ๋ณธ type์€ button์ด๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveAttribute( + 'type', + 'button', + ); + }); + + it('type ์†์„ฑ์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveAttribute( + 'type', + 'submit', + ); + }); + + it('ref๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค', () => { + const ref = vi.fn(); + render(); + expect(ref).toHaveBeenCalled(); + }); + }); + + describe('์ธํ„ฐ๋ž™์…˜', () => { + it('ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค', async () => { + const handleClick = vi.fn(); + const user = userEvent.setup(); + + render(); + + const button = screen.getByRole('button', { + name: /click me/i, + }); + await user.click(button); + + expect(handleClick).toHaveBeenCalledTimes(1); + }); + + it('disabled ์ƒํƒœ์ผ ๋•Œ onClick์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค', async () => { + const handleClick = vi.fn(); + const user = userEvent.setup(); + + render( + , + ); + + const button = screen.getByRole('button', { + name: /disabled button/i, + }); + await user.click(button); + + expect(handleClick).not.toHaveBeenCalled(); + }); + }); + + describe('variant ์Šคํƒ€์ผ', () => { + it('๊ธฐ๋ณธ variant๋Š” filled์ด๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveClass('bg-soso-500'); + }); + + it('variant prop์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋œ๋‹ค', () => { + const { rerender } = render( + , + ); + expect(screen.getByRole('button')).toHaveClass('bg-soso-500'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass( + 'border-soso-600', + ); + }); + }); + + describe('size ์Šคํƒ€์ผ', () => { + it('๊ธฐ๋ณธ size๋Š” md์ด๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveClass('h-10'); + }); + + it('size prop์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋œ๋‹ค', () => { + const { rerender } = render(); + expect(screen.getByRole('button')).toHaveClass('h-8'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass('h-12'); + }); + }); + + describe('disabled ์ƒํƒœ', () => { + it('disabled ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค', () => { + render(); + const button = screen.getByRole('button', { + name: /disabled button/i, + }); + expect(button).toBeDisabled(); + }); + + it('disabled ์Šคํƒ€์ผ์„ ์ ์šฉํ•œ๋‹ค', () => { + render( + , + ); + const button = screen.getByRole('button'); + expect(button).toHaveClass('disabled:bg-neutral-0'); + }); + }); + + describe('loading ์ƒํƒœ', () => { + it('loading ์‹œ aria-busy ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveAttribute('aria-busy'); + }); + + it('loading ์‹œ pointer-events-none ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toHaveClass( + 'pointer-events-none', + ); + }); + + it('loading ์‹œ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š”๋‹ค', () => { + const handleClick = vi.fn(); + + render( + , + ); + + const button = screen.getByRole('button'); + + // isLoading์ผ ๋•Œ๋Š” useTap bind๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ (๋กœ์ง ๊ฒ€์ฆ) + // pointer-events-none์˜ ์‹ค์ œ ๋™์ž‘์€ Storybook์—์„œ ๊ฒ€์ฆ + expect(button).toHaveClass('pointer-events-none'); + }); + }); + + describe('์ปค์Šคํ…€ ์Šคํƒ€์ผ', () => { + it('์‚ฌ์šฉ์ž ์ •์˜ className์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค', () => { + render(); + const button = screen.getByRole('button'); + expect(button).toHaveClass('custom-class'); + // ๊ธฐ๋ณธ ์Šคํƒ€์ผ๋„ ์œ ์ง€๋˜์–ด์•ผ ํ•จ + expect(button).toHaveClass('rounded-lg'); + }); + }); + + describe('์ ‘๊ทผ์„ฑ', () => { + it('button role์„ ๊ฐ€์ง„๋‹ค', () => { + render(); + expect(screen.getByRole('button')).toBeInTheDocument(); + }); + + it('ํฌ์ปค์Šค ๊ฐ€๋Šฅํ•˜๋‹ค', () => { + render(); + const button = screen.getByRole('button'); + button.focus(); + expect(button).toHaveFocus(); + }); + + it('disabled ์ƒํƒœ์—์„œ๋Š” ํฌ์ปค์Šค๋˜์ง€ ์•Š๋Š”๋‹ค', () => { + render(); + const button = screen.getByRole('button'); + button.focus(); + expect(button).not.toHaveFocus(); + }); + }); +}); diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx new file mode 100644 index 00000000..9b1c4fb1 --- /dev/null +++ b/packages/ui/src/components/Button/Button.tsx @@ -0,0 +1,153 @@ +import React from 'react'; +import { motion } from 'motion/react'; +import { useTap } from '../../hooks/useTap'; +import { cn } from '../../utils/cn'; +import { Pressable } from '../Pressable'; +import { useLoadingDelay } from '../../hooks/useLoadingDelay'; + +/** + * ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ + * - variant: ๋ฒ„ํŠผ์˜ ์‹œ๊ฐ์  ๋ณ€ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. + * - size: ๋ฒ„ํŠผ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. + * - isLoading: ๋ฒ„ํŠผ์ด ๋กœ๋”ฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. + */ +/* ---------- 1. ํƒ€์ž… ---------- */ + +type Variant = 'filled' | 'outlined' | 'bottom' | 'ghost'; +type Size = 'sm' | 'md' | 'lg'; + +export interface ButtonProps + extends React.ButtonHTMLAttributes { + /** ์ƒ‰์ƒยทํ…Œ๋งˆ */ + variant?: Variant; + /** ํฌ๊ธฐ */ + size?: Size; + /** ๋กœ๋”ฉ ์ƒํƒœ */ + isLoading?: boolean; +} + +/* ---------- 2. ์Šคํƒ€์ผ ํ† ํฐ ---------- */ + +/** ๋ณ€ํ˜•๋ณ„ Tailwind ํด๋ž˜์Šค */ +const variantMap: Record = { + filled: 'bg-soso-500 text-white hover:bg-soso-600', + outlined: + 'bg-white text-soso-600 border border-soso-600 hover:bg-soso-600 hover:text-white', + bottom: + 'bg-white text-fontColor-gray2 hover:bg-neutral-100 active:text-fontColor-gray3 active:ring-neutral-600', + + ghost: + 'bg-transparent rounded-1 text-neutral-500 hover:text-neutral-400 active:text-neutral-700', +}; + +/** ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ ํด๋ž˜์Šค */ +const disabledMap: Record = { + filled: 'disabled:bg-neutral-0 disabled:text-neutral-600', + outlined: + 'disabled:border-neutral-300 disabled:text-neutral-300 disabled:bg-transparent', + bottom: 'disabled:bg-neutral-0 disabled:text-fontColor-gray1', + + ghost: 'bg-neutral-0 text-fontColor-gray1', +}; + +/** ํฌ๊ธฐ๋ณ„ ํด๋ž˜์Šค */ +const sizeMap: Record = { + sm: 'h-8 px-3 text-sm gap-1.5', + md: 'h-10 px-4 text-base gap-2', + lg: 'h-12 px-6 text-lg gap-2.5', +}; + +/** ํฌ์ปค์Šค ์Šคํƒ€์ผ */ +const FOCUS_STYLE = { + enabled: + 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2', + disabled: + 'disabled:pointer-events-none disabled:cursor-not-allowed', +}; + +/* ---------- 3. ์ปดํฌ๋„ŒํŠธ ---------- */ + +export const Button = React.forwardRef< + HTMLButtonElement, + ButtonProps +>( + ( + { + variant = 'filled', + size = 'md', + isLoading = false, + className, + disabled, + children, + ...rest + }, + ref, + ) => { + /* tap ์• ๋‹ˆ๋ฉ”์ด์…˜ */ + const [pressed, bind] = useTap(); + + const { isDelayedLoading } = useLoadingDelay({ + isLoading, + delayMs: 200, + }); + + const isDisabled = disabled; + + const classes = cn( + 'relative inline-flex items-center justify-center rounded-lg font-medium select-none overflow-hidden', + 'transition-transform duration-150 ease-out', + // ๊ธฐ๋ณธ variant ์Šคํƒ€์ผ + variantMap[variant], + // ํฌ์ปค์Šค ์Šคํƒ€์ผ + FOCUS_STYLE[isDisabled ? 'disabled' : 'enabled'], + // disabled ์Šคํƒ€์ผ + isDisabled && disabledMap[variant], + // ๋กœ๋”ฉ ์ƒํƒœ: ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ ๋ง‰๊ธฐ + isLoading && 'pointer-events-none', + // ํฌ๊ธฐ ์Šคํƒ€์ผ + sizeMap[size], + className, + ); + + return ( + + + + ); + }, +); + +Button.displayName = 'Button'; diff --git a/packages/ui/src/components/Button/index.ts b/packages/ui/src/components/Button/index.ts new file mode 100644 index 00000000..fa3c8a51 --- /dev/null +++ b/packages/ui/src/components/Button/index.ts @@ -0,0 +1,2 @@ +export { Button } from './Button'; +export type { ButtonProps } from './Button'; diff --git a/packages/ui/src/components/Pressable/Pressable.tsx b/packages/ui/src/components/Pressable/Pressable.tsx new file mode 100644 index 00000000..e8d201cb --- /dev/null +++ b/packages/ui/src/components/Pressable/Pressable.tsx @@ -0,0 +1,117 @@ +/** + * Pressable ์ปดํฌ๋„ŒํŠธ + * + * ๋ชจ๋“  interactive ์š”์†Œ์— ์ผ๊ด€๋œ press ํšจ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฒ”์šฉ ์ปดํฌ๋„ŒํŠธ + * Button, Card, Input ๋“ฑ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ + */ + +import React from 'react'; +import { motion, type HTMLMotionProps } from 'motion/react'; +import { twMerge } from 'tailwind-merge'; +import { PRESS_ANIMATION } from '../../constants/animation'; + +// ============================================ +// Types +// ============================================ + +/** + * Pressable ์ปดํฌ๋„ŒํŠธ์˜ Props + */ +export interface PressableProps extends HTMLMotionProps<'div'> { + /** + * ์ž์‹ ์š”์†Œ + */ + children: React.ReactNode; + + /** + * ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€ + * true์ผ ๊ฒฝ์šฐ press ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค + * @default false + */ + disabled?: boolean; + + /** + * press ์‹œ ์Šค์ผ€์ผ ๋น„์œจ + * @default 0.98 + * @example + * pressScale={0.95} // ๋” ๊ฐ•ํ•œ ํšจ๊ณผ + * pressScale={0.99} // ๋” ์•ฝํ•œ ํšจ๊ณผ + */ + pressScale?: number; + + /** + * press ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์† ์‹œ๊ฐ„ (ms) + * @default 150 + */ + pressDuration?: number; +} + +// ============================================ +// Component +// ============================================ + +/** + * Pressable ์ปดํฌ๋„ŒํŠธ + * + * ๋ชจ๋“  interactive ์š”์†Œ์— ์ผ๊ด€๋œ press ํšจ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + * useTap ํ›…์„ ๋‚ด์žฅํ•˜์—ฌ ํ„ฐ์น˜/๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + * + * ์ฃผ์š” ๊ธฐ๋Šฅ: + * - ์ž๋™ press ์ƒํƒœ ๊ด€๋ฆฌ (useTap) + * - ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅํ•œ ์Šค์ผ€์ผ ํšจ๊ณผ + * - disabled ์ƒํƒœ ์ง€์› + * - ๋‹ค์–‘ํ•œ HTML ์š”์†Œ๋กœ ๋ Œ๋”๋ง ๊ฐ€๋Šฅ (polymorphic) + * - Framer Motion ์• ๋‹ˆ๋ฉ”์ด์…˜ + * + * @component + * @example + * // ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (div๋กœ ๋ Œ๋”๋ง) + * + * ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ์˜์—ญ + * + * + * @example + * // ์ปค์Šคํ…€ ์Šค์ผ€์ผ + * + * ๊ฐ•ํ•œ press ํšจ๊ณผ + * + * + * @example + * // ๋น„ํ™œ์„ฑํ™” + * + * ๋น„ํ™œ์„ฑํ™”๋œ ์˜์—ญ + * + */ +export function Pressable({ + children, + disabled = false, + pressScale = PRESS_ANIMATION.scale, + pressDuration = PRESS_ANIMATION.duration, + className, + ...props +}: PressableProps) { + return ( + + {children} + + ); +} + +Pressable.displayName = 'Pressable'; diff --git a/packages/ui/src/components/Pressable/index.ts b/packages/ui/src/components/Pressable/index.ts new file mode 100644 index 00000000..00171953 --- /dev/null +++ b/packages/ui/src/components/Pressable/index.ts @@ -0,0 +1,2 @@ +export { Pressable } from './Pressable'; +export type { PressableProps } from './Pressable'; diff --git a/packages/ui/src/constants/animation.ts b/packages/ui/src/constants/animation.ts new file mode 100644 index 00000000..d70b3c22 --- /dev/null +++ b/packages/ui/src/constants/animation.ts @@ -0,0 +1,19 @@ +/** + * ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ† ํฐ + * + * ์ „์ฒด ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ด€๋ จ ์ƒ์ˆ˜ ์ •์˜ + * ์ผ๊ด€๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ ๋ชจ์Œ + */ + +/** + * Pressable ํšจ๊ณผ ์„ค์ • + * ๋ฒ„ํŠผ, ์นด๋“œ, Input ๋“ฑ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์˜ ๋ˆŒ๋ฆผ ํšจ๊ณผ + */ +export const PRESS_ANIMATION = { + /** ๋ˆŒ๋ ธ์„ ๋•Œ ์Šค์ผ€์ผ ๋น„์œจ */ + scale: 0.98, + /** ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์† ์‹œ๊ฐ„ (ms) */ + duration: 150, + /** ์• ๋‹ˆ๋ฉ”์ด์…˜ easing */ + ease: 'ease-out', +} as const; diff --git a/packages/ui/src/hooks/useLoadingDelay.ts b/packages/ui/src/hooks/useLoadingDelay.ts new file mode 100644 index 00000000..0486b9cd --- /dev/null +++ b/packages/ui/src/hooks/useLoadingDelay.ts @@ -0,0 +1,47 @@ +import { useState, useEffect } from 'react'; + +// ์ง€์—ฐํ•  ์‹œ๊ฐ„ ํƒ€์ž… (0 ์ด์ƒ์˜ ๋ฐ€๋ฆฌ์ดˆ) +type Delay = number; + +export interface UseLoadingDelayOptions { + isLoading: boolean; + /** ๋กœ๋”ฉ ์ƒํƒœ๊ฐ€ true๋กœ ๋ณ€๊ฒฝ๋œ ํ›„ ์ง€์—ฐ ์‹œ๊ฐ„ (ms) */ + delayMs?: Delay | Delay[]; +} + +export interface UseLoadingDelayReturn { + /** ์ง€์—ฐ์ด ์ ์šฉ๋œ ๋กœ๋”ฉ ์ƒํƒœ */ + isDelayedLoading: boolean; + /** ํ˜„์žฌ ์ง€์—ฐ ๋‹จ๊ณ„ (0๋ถ€ํ„ฐ ์‹œ์ž‘) */ + stage: number; +} + +export const useLoadingDelay = ({ + isLoading, + delayMs = 300, +}: UseLoadingDelayOptions): UseLoadingDelayReturn => { + const [isDelayedLoading, setIsDelayedLoading] = useState(false); + const [stage, setStage] = useState(0); + + useEffect(() => { + if (!isLoading) { + setIsDelayedLoading(false); + setStage(0); + return; + } + + const delays = Array.isArray(delayMs) ? delayMs : [delayMs]; + const timers = delays.map((delay, index) => { + return setTimeout(() => { + if (index === 0) { + setIsDelayedLoading(true); + } + setStage(index + 1); + }, delay); + }); + + return () => timers.forEach((timer) => clearTimeout(timer)); + }, [isLoading, delayMs]); + + return { isDelayedLoading, stage }; +}; diff --git a/packages/ui/src/hooks/useTap.ts b/packages/ui/src/hooks/useTap.ts new file mode 100644 index 00000000..9b64a719 --- /dev/null +++ b/packages/ui/src/hooks/useTap.ts @@ -0,0 +1,24 @@ +import { useState, useCallback } from 'react'; + +/** + * ๐Ÿ”ง useTap + * - pressed: ํ˜„์žฌ '๋ˆŒ๋ฆผ' ์—ฌ๋ถ€ + * - bind: JSX์— ๋ฐ”๋กœ ํŽผ์น  ์ˆ˜ ์žˆ๋Š” pointer ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ + */ +export function useTap() { + const [pressed, setPressed] = useState(false); + + /* ํฌ์ธํ„ฐ(ํ„ฐ์น˜ยท๋งˆ์šฐ์Šค) ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ */ + const handleDown = useCallback(() => setPressed(true), []); + const handleUp = useCallback(() => setPressed(false), []); + + return [ + pressed, + { + onPointerDown: handleDown, + onPointerUp: handleUp, + onPointerLeave: handleUp, + onPointerCancel: handleUp, + } as const, + ] as const; +} diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts new file mode 100644 index 00000000..f31e7e8a --- /dev/null +++ b/packages/ui/src/index.ts @@ -0,0 +1,20 @@ +// Components +export { Button } from './components/Button'; +export type { ButtonProps } from './components/Button'; + +export { Pressable } from './components/Pressable'; +export type { PressableProps } from './components/Pressable'; + +// Hooks +export { useTap } from './hooks/useTap'; +export { useLoadingDelay } from './hooks/useLoadingDelay'; +export type { + UseLoadingDelayOptions, + UseLoadingDelayReturn, +} from './hooks/useLoadingDelay'; + +// Utils +export { cn } from './utils/cn'; + +// Constants +export { PRESS_ANIMATION } from './constants/animation'; diff --git a/packages/ui/src/test/setup.ts b/packages/ui/src/test/setup.ts new file mode 100644 index 00000000..a0e9e183 --- /dev/null +++ b/packages/ui/src/test/setup.ts @@ -0,0 +1,11 @@ +import { expect, afterEach } from 'vitest'; +import { cleanup } from '@testing-library/react'; +import * as matchers from '@testing-library/jest-dom/matchers'; + +// Extend Vitest's expect method with methods from @testing-library/jest-dom +expect.extend(matchers); + +// Run a cleanup after each test case (e.g. clearing jsdom) +afterEach(() => { + cleanup(); +}); diff --git a/packages/ui/src/utils/cn.ts b/packages/ui/src/utils/cn.ts new file mode 100644 index 00000000..78214f02 --- /dev/null +++ b/packages/ui/src/utils/cn.ts @@ -0,0 +1,15 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +/** + * className ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ + * clsx์™€ tailwind-merge๋ฅผ ์กฐํ•ฉํ•˜์—ฌ className์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. + * + * @example + * cn('px-2 py-1', 'px-4') // 'py-1 px-4' (tailwind-merge๋กœ ์ถฉ๋Œ ํ•ด๊ฒฐ) + * cn('text-red-500', { 'text-blue-500': true }) // 'text-blue-500' + * cn('base-class', condition && 'conditional-class') // clsx ์กฐ๊ฑด๋ถ€ ์ง€์› + */ +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 00000000..ae374ed7 --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@soso/tsconfig/react-library.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "incremental": false, + "types": ["vitest/globals", "@testing-library/jest-dom"] + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts new file mode 100644 index 00000000..17161f7e --- /dev/null +++ b/packages/ui/tsup.config.ts @@ -0,0 +1,42 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + // Entry points + entry: ['src/index.ts'], + + // Output formats + format: ['esm', 'cjs'], + + // Generate TypeScript declaration files + dts: true, + + // Code splitting for better tree-shaking + splitting: true, + + // Source maps for debugging + sourcemap: true, + + // Clean output directory before build + clean: true, + + // Minify output + minify: false, + + // External dependencies (not bundled) + external: ['react', 'react-dom'], + + // Tree-shaking + treeshake: true, + + // Target environment + target: 'es2020', + + // Output directory + outDir: 'dist', + + // TypeScript config + tsconfig: './tsconfig.json', + + // Skip node_modules bundling + skipNodeModulesBundle: true, +}); diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts new file mode 100644 index 00000000..e7179e2d --- /dev/null +++ b/packages/ui/vitest.config.ts @@ -0,0 +1,54 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + test: { + // Use jsdom for DOM testing + environment: 'jsdom', + + // Setup files for global test configuration + setupFiles: ['./src/test/setup.ts'], + + // Enable global test APIs (describe, it, expect, etc.) + globals: true, + + // Enable CSS processing in tests + css: true, + + // Test file patterns + include: ['src/**/*.{test,spec}.{ts,tsx}'], + + // Exclude patterns + exclude: [ + '**/node_modules/**', + '**/dist/**', + '**/coverage/**', + '**/.{idea,git,cache,output,temp}/**', + ], + + // Coverage configuration + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'json-summary'], + include: ['src/**/*.{ts,tsx}'], + exclude: [ + 'src/**/*.d.ts', + 'src/**/*.{test,spec}.{ts,tsx}', + 'src/test/**', + 'src/**/index.ts', // Barrel exports + ], + thresholds: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80, + }, + }, + }, + + // Reporters + reporters: ['verbose'], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dea4b713..709d2e7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,19 +4,25 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@types/node': ^24 + importers: .: devDependencies: '@changesets/cli': specifier: ^2.29.8 - version: 2.29.8(@types/node@24.0.7) + version: 2.29.8(@types/node@24.10.1) '@commitlint/cli': specifier: ^19.8.1 - version: 19.8.1(@types/node@24.0.7)(typescript@5.8.3) + version: 19.8.1(@types/node@24.10.1)(typescript@5.8.3) '@commitlint/config-conventional': specifier: ^19.8.1 version: 19.8.1 + '@types/node': + specifier: ^24 + version: 24.10.1 '@typescript-eslint/eslint-plugin': specifier: ^8.35.1 version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -158,13 +164,13 @@ importers: version: 14.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.6.1(@testing-library/dom@10.4.0) + version: 14.6.1(@testing-library/dom@10.4.1) '@types/js-cookie': specifier: ^3.0.6 version: 3.0.6 '@types/node': - specifier: ^20 - version: 20.19.7 + specifier: ^24 + version: 24.10.1 '@types/react': specifier: ^18.2.0 version: 18.3.23 @@ -173,7 +179,7 @@ importers: version: 18.3.7(@types/react@18.3.23) '@vitejs/plugin-react': specifier: ^4.3.3 - version: 4.6.0(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.6.0(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -183,6 +189,9 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) + eslint: + specifier: ^8.56.0 + version: 8.57.1 eslint-config-next: specifier: ^14.2.3 version: 14.2.30(eslint@8.57.1)(typescript@5.8.3) @@ -215,7 +224,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.7)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) webpack-bundle-analyzer: specifier: ^4.10.2 version: 4.10.2 @@ -224,7 +233,69 @@ importers: packages/tsconfig: {} - packages/ui: {} + packages/ui: + dependencies: + clsx: + specifier: ^2.1.1 + version: 2.1.1 + motion: + specifier: ^12.23.24 + version: 12.23.24(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + devDependencies: + '@soso/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@soso/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@testing-library/jest-dom': + specifier: ^6.6.1 + version: 6.8.0 + '@testing-library/react': + specifier: ^14.3.1 + version: 14.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.6.1(@testing-library/dom@10.4.1) + '@types/react': + specifier: ^18.2.0 + version: 18.3.23 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.7(@types/react@18.3.23) + '@vitejs/plugin-react': + specifier: ^4.3.3 + version: 4.6.0(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/coverage-v8': + specifier: ^3.2.4 + version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + '@vitest/ui': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) + eslint: + specifier: ^8.56.0 + version: 8.57.1 + jsdom: + specifier: ^25.0.1 + version: 25.0.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + tsup: + specifier: ^8.3.5 + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + typescript: + specifier: ^5.4.2 + version: 5.8.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) packages/utils: {} @@ -823,6 +894,10 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1054,6 +1129,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.10': resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} @@ -1066,6 +1147,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.10': resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} @@ -1078,6 +1165,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.10': resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} @@ -1090,6 +1183,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.10': resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} @@ -1102,6 +1201,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.10': resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} @@ -1114,6 +1219,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.10': resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} @@ -1126,6 +1237,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.10': resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} @@ -1138,6 +1255,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.10': resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} @@ -1150,6 +1273,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.10': resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} @@ -1162,6 +1291,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.10': resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} @@ -1174,6 +1309,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.10': resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} @@ -1186,6 +1327,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.10': resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} @@ -1198,6 +1345,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.10': resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} @@ -1210,6 +1363,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.10': resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} @@ -1222,6 +1381,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.10': resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} @@ -1234,6 +1399,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.10': resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} @@ -1246,6 +1417,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.10': resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} @@ -1258,6 +1435,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.10': resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} @@ -1270,6 +1453,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.10': resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} @@ -1282,6 +1471,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.10': resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} @@ -1294,6 +1489,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.10': resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} @@ -1306,6 +1507,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.10': resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} @@ -1318,6 +1525,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.10': resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} @@ -1330,6 +1543,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.10': resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} @@ -1342,6 +1561,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.10': resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} @@ -1354,6 +1579,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1427,7 +1658,7 @@ packages: resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: - '@types/node': '>=18' + '@types/node': ^24 peerDependenciesMeta: '@types/node': optional: true @@ -1447,16 +1678,22 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} @@ -2292,8 +2529,8 @@ packages: '@tanstack/virtual-core@3.13.12': resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} '@testing-library/dom@9.3.4': @@ -2381,14 +2618,8 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.19.7': - resolution: {integrity: sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==} - - '@types/node@24.0.7': - resolution: {integrity: sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} @@ -2749,6 +2980,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2970,6 +3204,12 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -3139,6 +3379,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -3160,6 +3404,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} @@ -3171,6 +3418,10 @@ packages: confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -3209,7 +3460,7 @@ packages: resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} engines: {node: '>=v18'} peerDependencies: - '@types/node': '*' + '@types/node': ^24 cosmiconfig: '>=9' typescript: '>=5' @@ -3589,6 +3840,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3881,6 +4137,9 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4461,6 +4720,10 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -4705,6 +4968,10 @@ packages: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -4823,6 +5090,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -4956,6 +5226,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} @@ -4996,6 +5269,9 @@ packages: mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nano-spawn@1.0.2: resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} engines: {node: '>=20.17'} @@ -5338,6 +5614,13 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + playwright-core@1.56.1: resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} engines: {node: '>=18'} @@ -5356,6 +5639,24 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-resolve-nested-selector@0.1.6: resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} @@ -5771,6 +6072,10 @@ packages: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5813,6 +6118,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -5971,6 +6280,11 @@ packages: engines: {node: '>=18.12.0'} hasBin: true + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6052,6 +6366,13 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + third-party-web@0.26.7: resolution: {integrity: sha512-buUzX4sXC4efFX6xg2bw6/eZsCUh8qQwSavC4D9HpONMFlRbcHhD8Je5qwYdCpViR6q0qla2wPP+t91a2vgolg==} @@ -6146,6 +6467,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfck@2.1.2: resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} @@ -6165,6 +6489,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + turbo-darwin-64@2.5.4: resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] @@ -6264,15 +6607,15 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -6363,7 +6706,7 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^24 jiti: '>=1.21.0' less: ^4.0.0 lightningcss: ^1.21.0 @@ -6405,7 +6748,7 @@ packages: peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^24 '@vitest/browser': 3.2.4 '@vitest/ui': 3.2.4 happy-dom: '*' @@ -7424,6 +7767,8 @@ snapshots: '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -7483,7 +7828,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.8(@types/node@24.0.7)': + '@changesets/cli@2.29.8(@types/node@24.10.1)': dependencies: '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 @@ -7499,7 +7844,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@24.0.7) + '@inquirer/external-editor': 1.0.3(@types/node@24.10.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -7602,11 +7947,11 @@ snapshots: dependencies: commander: 14.0.1 - '@commitlint/cli@19.8.1(@types/node@24.0.7)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@24.10.1)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@24.0.7)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@24.10.1)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -7653,7 +7998,7 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@24.0.7)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@24.10.1)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -7661,7 +8006,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.0.7)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@24.10.1)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7780,156 +8125,234 @@ snapshots: '@esbuild/aix-ppc64@0.25.6': optional: true + '@esbuild/aix-ppc64@0.27.0': + optional: true + '@esbuild/android-arm64@0.25.10': optional: true '@esbuild/android-arm64@0.25.6': optional: true + '@esbuild/android-arm64@0.27.0': + optional: true + '@esbuild/android-arm@0.25.10': optional: true '@esbuild/android-arm@0.25.6': optional: true + '@esbuild/android-arm@0.27.0': + optional: true + '@esbuild/android-x64@0.25.10': optional: true '@esbuild/android-x64@0.25.6': optional: true + '@esbuild/android-x64@0.27.0': + optional: true + '@esbuild/darwin-arm64@0.25.10': optional: true '@esbuild/darwin-arm64@0.25.6': optional: true + '@esbuild/darwin-arm64@0.27.0': + optional: true + '@esbuild/darwin-x64@0.25.10': optional: true '@esbuild/darwin-x64@0.25.6': optional: true + '@esbuild/darwin-x64@0.27.0': + optional: true + '@esbuild/freebsd-arm64@0.25.10': optional: true '@esbuild/freebsd-arm64@0.25.6': optional: true + '@esbuild/freebsd-arm64@0.27.0': + optional: true + '@esbuild/freebsd-x64@0.25.10': optional: true '@esbuild/freebsd-x64@0.25.6': optional: true + '@esbuild/freebsd-x64@0.27.0': + optional: true + '@esbuild/linux-arm64@0.25.10': optional: true '@esbuild/linux-arm64@0.25.6': optional: true + '@esbuild/linux-arm64@0.27.0': + optional: true + '@esbuild/linux-arm@0.25.10': optional: true '@esbuild/linux-arm@0.25.6': optional: true + '@esbuild/linux-arm@0.27.0': + optional: true + '@esbuild/linux-ia32@0.25.10': optional: true '@esbuild/linux-ia32@0.25.6': optional: true + '@esbuild/linux-ia32@0.27.0': + optional: true + '@esbuild/linux-loong64@0.25.10': optional: true '@esbuild/linux-loong64@0.25.6': optional: true + '@esbuild/linux-loong64@0.27.0': + optional: true + '@esbuild/linux-mips64el@0.25.10': optional: true '@esbuild/linux-mips64el@0.25.6': optional: true + '@esbuild/linux-mips64el@0.27.0': + optional: true + '@esbuild/linux-ppc64@0.25.10': optional: true '@esbuild/linux-ppc64@0.25.6': optional: true + '@esbuild/linux-ppc64@0.27.0': + optional: true + '@esbuild/linux-riscv64@0.25.10': optional: true '@esbuild/linux-riscv64@0.25.6': optional: true + '@esbuild/linux-riscv64@0.27.0': + optional: true + '@esbuild/linux-s390x@0.25.10': optional: true '@esbuild/linux-s390x@0.25.6': optional: true + '@esbuild/linux-s390x@0.27.0': + optional: true + '@esbuild/linux-x64@0.25.10': optional: true '@esbuild/linux-x64@0.25.6': optional: true + '@esbuild/linux-x64@0.27.0': + optional: true + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-arm64@0.25.6': optional: true + '@esbuild/netbsd-arm64@0.27.0': + optional: true + '@esbuild/netbsd-x64@0.25.10': optional: true '@esbuild/netbsd-x64@0.25.6': optional: true + '@esbuild/netbsd-x64@0.27.0': + optional: true + '@esbuild/openbsd-arm64@0.25.10': optional: true '@esbuild/openbsd-arm64@0.25.6': optional: true + '@esbuild/openbsd-arm64@0.27.0': + optional: true + '@esbuild/openbsd-x64@0.25.10': optional: true '@esbuild/openbsd-x64@0.25.6': optional: true + '@esbuild/openbsd-x64@0.27.0': + optional: true + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/openharmony-arm64@0.25.6': optional: true + '@esbuild/openharmony-arm64@0.27.0': + optional: true + '@esbuild/sunos-x64@0.25.10': optional: true '@esbuild/sunos-x64@0.25.6': optional: true + '@esbuild/sunos-x64@0.27.0': + optional: true + '@esbuild/win32-arm64@0.25.10': optional: true '@esbuild/win32-arm64@0.25.6': optional: true + '@esbuild/win32-arm64@0.27.0': + optional: true + '@esbuild/win32-ia32@0.25.10': optional: true '@esbuild/win32-ia32@0.25.6': optional: true + '@esbuild/win32-ia32@0.27.0': + optional: true + '@esbuild/win32-x64@0.25.10': optional: true '@esbuild/win32-x64@0.25.6': optional: true + '@esbuild/win32-x64@0.27.0': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -8039,12 +8462,12 @@ snapshots: transitivePeerDependencies: - encoding - '@inquirer/external-editor@1.0.3(@types/node@24.0.7)': + '@inquirer/external-editor@1.0.3(@types/node@24.10.1)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.0.7 + '@types/node': 24.10.1 '@isaacs/cliui@8.0.2': dependencies: @@ -8066,16 +8489,25 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + optional: true + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.10': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 optional: true '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': + optional: true + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -8147,7 +8579,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.27.6 - '@types/node': 12.20.55 + '@types/node': 24.10.1 find-up: 4.1.0 fs-extra: 8.1.0 @@ -9185,15 +9617,15 @@ snapshots: '@tanstack/virtual-core@3.13.12': {} - '@testing-library/dom@10.4.0': + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 - chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 + picocolors: 1.1.1 pretty-format: 27.5.1 '@testing-library/dom@9.3.4': @@ -9226,9 +9658,9 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: - '@testing-library/dom': 10.4.0 + '@testing-library/dom': 10.4.1 '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -9268,11 +9700,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 '@types/debug@4.1.12': dependencies: @@ -9283,7 +9715,7 @@ snapshots: '@types/es-aggregate-error@1.0.6': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 '@types/estree@1.0.8': {} @@ -9302,17 +9734,11 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 20.19.7 - - '@types/node@12.20.55': {} - - '@types/node@20.19.7': - dependencies: - undici-types: 6.21.0 + '@types/node': 24.10.1 - '@types/node@24.0.7': + '@types/node@24.10.1': dependencies: - undici-types: 7.8.0 + undici-types: 7.16.0 '@types/pg-pool@2.0.6': dependencies: @@ -9320,7 +9746,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -9339,7 +9765,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 '@types/unist@3.0.3': {} @@ -9347,7 +9773,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 optional: true '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': @@ -9503,7 +9929,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -9511,20 +9937,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4)': dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/utils': 3.2.4 - magic-string: 0.30.17 - sirv: 3.0.1 + magic-string: 0.30.21 + sirv: 3.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.7)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) ws: 8.18.3 optionalDependencies: playwright: 1.56.1 @@ -9550,9 +9976,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.7)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -9564,13 +9990,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -9601,7 +10027,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.7)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -9693,6 +10119,8 @@ snapshots: ansi-styles@6.2.1: {} + any-promise@1.3.0: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -9965,6 +10393,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bundle-require@5.1.0(esbuild@0.27.0): + dependencies: + esbuild: 0.27.0 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -10046,7 +10479,7 @@ snapshots: chrome-launcher@0.13.4: dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 escape-string-regexp: 1.0.5 is-wsl: 2.2.0 lighthouse-logger: 1.2.0 @@ -10057,7 +10490,7 @@ snapshots: chrome-launcher@1.2.0: dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -10132,6 +10565,8 @@ snapshots: commander@2.20.3: optional: true + commander@4.1.1: {} + commander@7.2.0: {} compare-func@2.0.0: @@ -10159,6 +10594,8 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + configstore@5.0.1: dependencies: dot-prop: 5.3.0 @@ -10177,6 +10614,8 @@ snapshots: confusing-browser-globals@1.0.11: {} + consola@3.4.2: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -10208,9 +10647,9 @@ snapshots: dependencies: browserslist: 4.25.3 - cosmiconfig-typescript-loader@6.1.0(@types/node@24.0.7)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@24.10.1)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 24.0.7 + '@types/node': 24.10.1 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 typescript: 5.8.3 @@ -10690,6 +11129,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.6 '@esbuild/win32-x64': 0.25.6 + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -10743,7 +11211,7 @@ snapshots: '@typescript-eslint/parser': 8.36.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -10767,7 +11235,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 @@ -10782,14 +11250,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.36.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10804,7 +11272,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11109,6 +11577,12 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.8.0 + rollup: 4.45.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -11700,6 +12174,8 @@ snapshots: jiti@2.6.1: {} + joycon@3.1.1: {} + jpeg-js@0.4.4: {} js-cookie@3.0.5: {} @@ -12003,6 +12479,8 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 + load-tsconfig@0.2.5: {} + localforage@1.10.0: dependencies: lie: 3.1.1 @@ -12099,6 +12577,11 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + optional: true + magicast@0.3.5: dependencies: '@babel/parser': 7.28.0 @@ -12201,6 +12684,13 @@ snapshots: mkdirp@3.0.1: {} + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + module-details-from-path@1.0.4: {} motion-dom@12.23.23: @@ -12228,6 +12718,12 @@ snapshots: mute-stream@0.0.7: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nano-spawn@1.0.2: {} nanoid@3.3.11: {} @@ -12607,6 +13103,14 @@ snapshots: pify@4.0.1: {} + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + playwright-core@1.56.1: {} playwright@1.56.1: @@ -12619,6 +13123,14 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.6.1 + postcss: 8.5.6 + yaml: 2.8.1 + postcss-resolve-nested-selector@0.1.6: {} postcss-safe-parser@7.0.1(postcss@8.5.6): @@ -13104,6 +13616,13 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + optional: true + slash@3.0.0: {} slice-ansi@4.0.0: @@ -13153,6 +13672,8 @@ snapshots: source-map@0.6.1: optional: true + source-map@0.7.6: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -13160,7 +13681,7 @@ snapshots: speedline-core@1.4.3: dependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 image-ssim: 0.2.0 jpeg-js: 0.4.4 @@ -13366,6 +13887,16 @@ snapshots: - supports-color - typescript + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.14 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -13459,7 +13990,7 @@ snapshots: terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.10 + '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -13481,6 +14012,14 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + third-party-web@0.26.7: {} third-party-web@0.27.0: {} @@ -13554,6 +14093,8 @@ snapshots: dependencies: typescript: 5.8.3 + ts-interface-checker@0.1.13: {} + tsconfck@2.1.2(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 @@ -13569,6 +14110,34 @@ snapshots: tslib@2.8.1: {} + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.0 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) + resolve-from: 5.0.0 + rollup: 4.45.0 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + turbo-darwin-64@2.5.4: optional: true @@ -13669,6 +14238,8 @@ snapshots: uc.micro@2.1.0: {} + ufo@1.6.1: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -13676,9 +14247,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} - - undici-types@7.8.0: {} + undici-types@7.16.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -13762,13 +14331,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -13783,7 +14352,7 @@ snapshots: - tsx - yaml - vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -13792,18 +14361,18 @@ snapshots: rollup: 4.45.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 20.19.7 + '@types/node': 24.10.1 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.1 terser: 5.43.1 yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.7)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -13821,13 +14390,13 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 20.19.7 - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@20.19.7)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + '@types/node': 24.10.1 + '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.0.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 25.0.1 transitivePeerDependencies: