diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 393d9c1..2999f05 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -20,7 +20,7 @@ Fixes issue # - [ ] apps/docs - [ ] apps/showcase -- [ ] packages/example-library +- [ ] packages/rnr-ui ### Screenshots: diff --git a/.gitignore b/.gitignore index a5e18ac..8cc3d36 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ xcuserdata # VSCode .history/ +/coverage \ No newline at end of file diff --git a/.vercel/project.json b/.vercel/project.json new file mode 100644 index 0000000..812014f --- /dev/null +++ b/.vercel/project.json @@ -0,0 +1 @@ +{"neverMindDeployCard":true} \ No newline at end of file diff --git a/apps/docs/.eslintrc.json b/apps/docs/.eslintrc.json index 3722418..15ecaa1 100644 --- a/apps/docs/.eslintrc.json +++ b/apps/docs/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": ["next/core-web-vitals", "next/typescript"] + "extends": ["@rnr/config/eslint/next"] } diff --git a/apps/docs/components/blocks.tsx b/apps/docs/components/blocks.tsx index 957ded3..547c535 100644 --- a/apps/docs/components/blocks.tsx +++ b/apps/docs/components/blocks.tsx @@ -1,3 +1,3 @@ 'use client'; -export * from '@/example-library/blocks'; +export * from '@/rnr-ui/blocks'; diff --git a/apps/docs/components/examples.tsx b/apps/docs/components/examples.tsx index 9346288..8e7f795 100644 --- a/apps/docs/components/examples.tsx +++ b/apps/docs/components/examples.tsx @@ -1,4 +1,4 @@ 'use client'; -export * from '@/example-library/examples'; +export * from '@/rnr-ui/examples'; export * from './utils'; diff --git a/apps/docs/components/utils.tsx b/apps/docs/components/utils.tsx index 7154e80..7589658 100644 --- a/apps/docs/components/utils.tsx +++ b/apps/docs/components/utils.tsx @@ -1,64 +1,445 @@ 'use client'; -import { hello, helloAsync } from '@rnr/utils'; -import { useEffect, useState } from 'react'; -import { Text, View, Button } from 'react-native'; +import { hello, helloAsync, omit, pick } from '@rnr/utils'; +import type { ComponentProps, ReactNode } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { Button, Modal, Pressable, ScrollView, Text, TextInput, View } from 'react-native'; +import { Button as DocsButton } from './ui/button'; +import { Form } from '@/rnr-ui/components/ui/forms'; + +type BaseUtilityPlaygroundRenderProps = { + close: () => void; +}; + +type BaseUtilityPlaygroundProps = { + title: string; + description?: string; + triggerText: string; + triggerIcon?: ReactNode; + triggerVariant?: ComponentProps['variant']; + onOpen?: () => void; + children: ReactNode | ((helpers: BaseUtilityPlaygroundRenderProps) => ReactNode); +}; + +export function BaseUtilityPlayground({ + title, + description, + triggerText, + triggerIcon, + triggerVariant = 'outline', + onOpen, + children, +}: BaseUtilityPlaygroundProps) { + const [isOpen, setIsOpen] = useState(false); + + const closeModal = useCallback(() => { + setIsOpen(false); + }, []); + + const openModal = useCallback(() => { + setIsOpen(true); + onOpen?.(); + }, [onOpen]); + + const content = useMemo(() => { + return typeof children === 'function' ? children({ close: closeModal }) : children; + }, [children, closeModal]); + + return ( + <> + + {triggerIcon} + {triggerText} + + + + + event.stopPropagation()}> + + + + {triggerIcon} + {title} + + + Close + + + + + + {description ? ( + {description} + ) : null} + {content} + + + + + + + + ); +} + +const defaultHelloName = 'React Native'; export function HelloDemo() { - const [syncResult, setSyncResult] = useState(''); + const [name, setName] = useState(defaultHelloName); + const [syncResult, setSyncResult] = useState(() => hello(defaultHelloName)); const [asyncResult, setAsyncResult] = useState(''); const [loading, setLoading] = useState(false); - const runSyncExample = () => { - const result = hello('React Native'); - setSyncResult(result); - }; + const updateSyncResult = useCallback((value: string) => { + setSyncResult(hello(value)); + }, []); - const runAsyncExample = async () => { + const updateAsyncResult = useCallback(async (value: string) => { setLoading(true); - const result = await helloAsync('Developer'); - setAsyncResult(result); - setLoading(false); - }; + try { + const response = await helloAsync(value); + setAsyncResult(response); + } finally { + setLoading(false); + } + }, []); useEffect(() => { - runSyncExample(); - }, []); + updateSyncResult(defaultHelloName); + void updateAsyncResult(defaultHelloName); + }, [updateAsyncResult, updateSyncResult]); + + const handleRun = useCallback(() => { + const target = name.trim() || 'World'; + updateSyncResult(target); + void updateAsyncResult(target); + }, [name, updateAsyncResult, updateSyncResult]); + + const handleReset = useCallback(() => { + setName(defaultHelloName); + updateSyncResult(defaultHelloName); + void updateAsyncResult(defaultHelloName); + }, [updateAsyncResult, updateSyncResult]); + + return ( + 🧪} + title="Hello Playground" + description="Try the synchronous and asynchronous greeting helpers with your own input." + onOpen={handleReset} + > + {() => ( + <> + + Name + + + + + + Run playground + + + Reset + + + + + Results + + + Synchronous + {syncResult} + + + Asynchronous + + {loading ? 'Loading...' : asyncResult} + + + + + + )} + + ); +} + +export function ConfigUsageDemo() { + const demos = [ + { + key: 'prettier', + title: 'Prettier', + description: 'Share formatting defaults across workspaces.', + code: `// prettier.config.cjs\nmodule.exports = require('@rnr/config/prettier');`, + }, + { + key: 'eslint', + title: 'ESLint', + description: 'Extend the Next.js + TypeScript linting baseline.', + code: `// eslint.config.cjs\nmodule.exports = require('@rnr/config/eslint/next');`, + }, + { + key: 'vitest', + title: 'Vitest', + description: 'Start from a coverage-enabled testing config.', + code: `// vitest.config.ts\nimport baseConfig from '@rnr/config/vitest/base';\nimport { defineConfig, mergeConfig } from 'vitest/config';\n\nexport default mergeConfig(\n baseConfig,\n defineConfig({\n test: {\n coverage: {\n lines: 100,\n },\n },\n }),\n);`, + }, + ] as const; + + const [index, setIndex] = useState(0); + const current = demos[index]; + + const handleNext = () => setIndex((previous) => (previous + 1) % demos.length); + const handlePrev = () => setIndex((previous) => (previous - 1 + demos.length) % demos.length); return ( - - - Synchronous Example: + + + Shared Config Demo - - - Input: hello('React Native') - - - Output: "{syncResult}" - - - \n );\n}\n\nexport { RedButton, redButtonVariants, redButtonTextVariants };\nexport type { RedButtonProps };\n", "type": "registry:component" } diff --git a/apps/docs/public/r/form.json b/apps/docs/public/r/form.json index 197659d..61339a2 100644 --- a/apps/docs/public/r/form.json +++ b/apps/docs/public/r/form.json @@ -11,7 +11,7 @@ ], "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/forms.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/forms.tsx", "content": "import FormRc, { Field } from 'rc-field-form';\nimport { FieldProps } from 'rc-field-form/es/Field';\nimport React from 'react';\nimport { View } from 'react-native';\nimport { Label } from '~/components/ui/label';\nimport { Text } from '~/components/ui/text';\n\nfunction FormItem({\n name,\n label,\n children,\n ...restProps\n}: FieldProps & {\n label?: string;\n}) {\n const hasRequired = restProps.rules?.some((rule: any) => rule.required);\n return (\n \n {(control, meta, form) => {\n const hasError = meta.errors && meta.errors.length > 0;\n const errorMessage = meta.errors?.[0];\n\n // Handle function children - pass control, meta, form exactly like rc-field-form\n const childNode =\n typeof children === 'function'\n ? children(control, meta, form)\n : React.isValidElement(children)\n ? React.cloneElement(\n children as React.ReactElement,\n {\n ...control,\n // Map React Native TextInput props\n value: control.value ?? '',\n onChangeText: (text: string) => control.onChange(text),\n onBlur: control.onBlur,\n // Add error styling if needed\n className: hasError\n ? `${(children as any).props?.className || ''} border-destructive`.trim()\n : (children as any).props?.className,\n } as any\n )\n : children;\n\n // Only add UI wrapper if label or error exists\n if (!label && !errorMessage) {\n return childNode;\n }\n\n return (\n \n {label && (\n \n )}\n {childNode}\n {errorMessage && (\n \n {errorMessage}\n \n )}\n \n );\n }}\n \n );\n}\n\n// Create Form component with Item attached\nconst Form = FormRc as typeof FormRc & {\n Item: typeof FormItem;\n useForm: typeof FormRc.useForm;\n};\n\nForm.Item = FormItem;\nForm.useForm = FormRc.useForm;\n\nexport { Form };\n", "type": "registry:component" } diff --git a/apps/docs/registry.json b/apps/docs/registry.json index a816daf..336a5a6 100644 --- a/apps/docs/registry.json +++ b/apps/docs/registry.json @@ -11,7 +11,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/red-button.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/red-button.tsx", "type": "registry:component" } ], @@ -28,7 +28,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/blocks/multiple-buttons.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/blocks/multiple-buttons.tsx", "type": "registry:block" } ], @@ -46,7 +46,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/forms.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/forms.tsx", "type": "registry:component" } ], diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 2004f62..a72aa9c 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -18,8 +18,8 @@ "incremental": true, "paths": { "@docs/*": ["./*"], - "~/*": ["../../packages/example-library/reusables/*"], - "@/example-library/*": ["../../packages/example-library/src/*"] + "~/*": ["../../packages/rnr-ui/reusables/*"], + "@/rnr-ui/*": ["../../packages/rnr-ui/src/*"] }, "plugins": [ { diff --git a/apps/showcase/app/components/example-block.tsx b/apps/showcase/app/components/example-block.tsx index 4bbe013..f068a47 100644 --- a/apps/showcase/app/components/example-block.tsx +++ b/apps/showcase/app/components/example-block.tsx @@ -1,6 +1,6 @@ import { PreviewCarousel } from '@showcase/components/preview-carousel'; import * as React from 'react'; -import { MultipleButtons } from '@/example-library/blocks/multiple-buttons'; +import { MultipleButtons } from '@/rnr-ui/blocks/multiple-buttons'; const exampleBlockPreviews = [{ name: 'Multiple Buttons', component: MultipleButtons }]; diff --git a/apps/showcase/app/components/example-component.tsx b/apps/showcase/app/components/example-component.tsx index 2269a73..37f2763 100644 --- a/apps/showcase/app/components/example-component.tsx +++ b/apps/showcase/app/components/example-component.tsx @@ -1,6 +1,6 @@ import { PreviewCarousel } from '@showcase/components/preview-carousel'; import * as React from 'react'; -import { RedButtonPreview, RedButtonSecondaryPreview } from '@/example-library/examples/red-button'; +import { RedButtonPreview, RedButtonSecondaryPreview } from '@/rnr-ui/examples/red-button'; const exampleComponentPreviews = [ { name: 'Default', component: RedButtonPreview }, diff --git a/apps/showcase/app/components/form.tsx b/apps/showcase/app/components/form.tsx index 9b6507c..0cf232d 100644 --- a/apps/showcase/app/components/form.tsx +++ b/apps/showcase/app/components/form.tsx @@ -1,6 +1,6 @@ import { PreviewCarousel } from '@showcase/components/preview-carousel'; import * as React from 'react'; -import { FormBasicPreview, FormWithValidationPreview } from '@/example-library/examples'; +import { FormBasicPreview, FormWithValidationPreview } from '@/rnr-ui/examples'; const formPreviews = [ { name: 'Basic', component: FormBasicPreview }, diff --git a/apps/showcase/package.json b/apps/showcase/package.json index 3e1a22f..669aba2 100644 --- a/apps/showcase/package.json +++ b/apps/showcase/package.json @@ -16,7 +16,7 @@ "@expo-google-fonts/geist": "^0.4.0", "@react-navigation/native": "^7.0.0", "@rn-primitives/slot": "~1.2.0", - "@rnr/example-library": "workspace:*", + "@rnr/rnr-ui": "workspace:*", "@rnr/utils": "workspace:*", "@shopify/flash-list": "1.7.6", "class-variance-authority": "^0.7.0", diff --git a/apps/showcase/public/r/example-block.json b/apps/showcase/public/r/example-block.json index a9d8323..8d62bed 100644 --- a/apps/showcase/public/r/example-block.json +++ b/apps/showcase/public/r/example-block.json @@ -12,8 +12,8 @@ ], "files": [ { - "path": "./node_modules/@rnr/example-library/src/blocks/multiple-buttons.tsx", - "content": "import { View } from 'react-native';\nimport { RedButton } from '@/example-library/components/ui/red-button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card';\n\nexport function MultipleButtons() {\n return (\n \n \n \n Multiple Buttons\n \n Multiple buttons with different variants\n \n \n \n \n {}} label=\"Primary Red Button\" />\n {}} label=\"Secondary Red Button\" />\n {}} label=\"Outline Red Button\" />\n {}} label=\"Ghost Red Button\" />\n {}} label=\"Red Button Link\" />\n \n \n \n \n );\n}\n", + "path": "./node_modules/@rnr/rnr-ui/src/blocks/multiple-buttons.tsx", + "content": "import { View } from 'react-native';\nimport { RedButton } from '@/rnr-ui/components/ui/red-button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card';\n\nexport function MultipleButtons() {\n return (\n \n \n \n Multiple Buttons\n \n Multiple buttons with different variants\n \n \n \n \n {}} label=\"Primary Red Button\" />\n {}} label=\"Secondary Red Button\" />\n {}} label=\"Outline Red Button\" />\n {}} label=\"Ghost Red Button\" />\n {}} label=\"Red Button Link\" />\n \n \n \n \n );\n}\n", "type": "registry:block" } ] diff --git a/apps/showcase/public/r/example-component.json b/apps/showcase/public/r/example-component.json index 30ec90f..c4212a6 100644 --- a/apps/showcase/public/r/example-component.json +++ b/apps/showcase/public/r/example-component.json @@ -11,7 +11,7 @@ ], "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/red-button.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/red-button.tsx", "content": "import { cva } from 'class-variance-authority';\nimport { Platform } from 'react-native';\nimport { Button, type ButtonProps } from '~/components/ui/button';\nimport { Text } from '~/components/ui/text';\nimport { cn } from '~/lib/utils';\n\nconst redButtonVariants = cva('', {\n variants: {\n variant: {\n default: cn(\n 'bg-red-500 active:bg-red-500/90',\n Platform.select({\n web: 'hover:bg-red-500/90',\n })\n ),\n destructive: cn(\n 'bg-red-700 active:bg-red-700/90',\n Platform.select({\n web: 'hover:bg-red-700/90',\n })\n ),\n outline: 'border-red-400 dark:border-red-400',\n secondary: cn(\n 'bg-red-200 active:bg-red-200/80',\n Platform.select({\n web: 'hover:bg-red-200/80',\n })\n ),\n ghost: 'active:bg-red-500/10 dark:active:bg-red-500/10',\n link: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nconst redButtonTextVariants = cva('', {\n variants: {\n variant: {\n default: '',\n destructive: '',\n outline: cn(\n 'group-active:text-red-400',\n Platform.select({ web: 'group-hover:text-red-400' })\n ),\n secondary: 'text-black',\n ghost: '',\n link: 'text-red-400',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ntype RedButtonProps = ButtonProps & {\n label: string;\n};\n\nfunction RedButton({ label, className, ...props }: RedButtonProps) {\n return (\n \n );\n}\n\nexport { RedButton, redButtonVariants, redButtonTextVariants };\nexport type { RedButtonProps };\n", "type": "registry:component" } diff --git a/apps/showcase/public/r/form.json b/apps/showcase/public/r/form.json index 197659d..61339a2 100644 --- a/apps/showcase/public/r/form.json +++ b/apps/showcase/public/r/form.json @@ -11,7 +11,7 @@ ], "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/forms.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/forms.tsx", "content": "import FormRc, { Field } from 'rc-field-form';\nimport { FieldProps } from 'rc-field-form/es/Field';\nimport React from 'react';\nimport { View } from 'react-native';\nimport { Label } from '~/components/ui/label';\nimport { Text } from '~/components/ui/text';\n\nfunction FormItem({\n name,\n label,\n children,\n ...restProps\n}: FieldProps & {\n label?: string;\n}) {\n const hasRequired = restProps.rules?.some((rule: any) => rule.required);\n return (\n \n {(control, meta, form) => {\n const hasError = meta.errors && meta.errors.length > 0;\n const errorMessage = meta.errors?.[0];\n\n // Handle function children - pass control, meta, form exactly like rc-field-form\n const childNode =\n typeof children === 'function'\n ? children(control, meta, form)\n : React.isValidElement(children)\n ? React.cloneElement(\n children as React.ReactElement,\n {\n ...control,\n // Map React Native TextInput props\n value: control.value ?? '',\n onChangeText: (text: string) => control.onChange(text),\n onBlur: control.onBlur,\n // Add error styling if needed\n className: hasError\n ? `${(children as any).props?.className || ''} border-destructive`.trim()\n : (children as any).props?.className,\n } as any\n )\n : children;\n\n // Only add UI wrapper if label or error exists\n if (!label && !errorMessage) {\n return childNode;\n }\n\n return (\n \n {label && (\n \n )}\n {childNode}\n {errorMessage && (\n \n {errorMessage}\n \n )}\n \n );\n }}\n \n );\n}\n\n// Create Form component with Item attached\nconst Form = FormRc as typeof FormRc & {\n Item: typeof FormItem;\n useForm: typeof FormRc.useForm;\n};\n\nForm.Item = FormItem;\nForm.useForm = FormRc.useForm;\n\nexport { Form };\n", "type": "registry:component" } diff --git a/apps/showcase/registry.json b/apps/showcase/registry.json index a816daf..336a5a6 100644 --- a/apps/showcase/registry.json +++ b/apps/showcase/registry.json @@ -11,7 +11,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/red-button.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/red-button.tsx", "type": "registry:component" } ], @@ -28,7 +28,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/blocks/multiple-buttons.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/blocks/multiple-buttons.tsx", "type": "registry:block" } ], @@ -46,7 +46,7 @@ "author": "@gabimoncha", "files": [ { - "path": "./node_modules/@rnr/example-library/src/components/ui/forms.tsx", + "path": "./node_modules/@rnr/rnr-ui/src/components/ui/forms.tsx", "type": "registry:component" } ], diff --git a/apps/showcase/tsconfig.json b/apps/showcase/tsconfig.json index dc8e63a..2d4784c 100644 --- a/apps/showcase/tsconfig.json +++ b/apps/showcase/tsconfig.json @@ -4,8 +4,8 @@ "baseUrl": ".", "paths": { "@showcase/*": ["./*"], - "~/*": ["../../packages/example-library/reusables/*"], - "@/example-library/*": ["../../packages/example-library/src/*"] + "~/*": ["../../packages/rnr-ui/reusables/*"], + "@/rnr-ui/*": ["../../packages/rnr-ui/src/*"] }, "jsx": "react-native", "types": ["nativewind/types"], diff --git a/package.json b/package.json index 5acf514..9205bc7 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,11 @@ "clean": "turbo clean && rm -rf .turbo node_modules" }, "devDependencies": { + "@rnr/config": "workspace:*", + "eslint": "^9.39.1", "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", - "turbo": "^2.5.5", + "turbo": "^2.6.0", "typescript": "^5.8.3" }, "pnpm": { @@ -27,12 +29,18 @@ "expo-modules-*", "typescript" ] - } + }, + "onlyBuiltDependencies": [ + "esbuild", + "msw", + "sharp", + "unrs-resolver" + ] }, "engines": { "node": ">=20.11.0" }, - "packageManager": "pnpm@10.14.0", + "packageManager": "pnpm@10.20.0", "resolutions": { "lightningcss": "1.27.0" } diff --git a/packages/config/eslint/next.cjs b/packages/config/eslint/next.cjs new file mode 100644 index 0000000..045a523 --- /dev/null +++ b/packages/config/eslint/next.cjs @@ -0,0 +1,3 @@ +module.exports = { + extends: ['next/core-web-vitals', 'next/typescript'], +}; diff --git a/packages/config/index.js b/packages/config/index.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/config/index.js @@ -0,0 +1 @@ +export {}; diff --git a/packages/config/package.json b/packages/config/package.json new file mode 100644 index 0000000..2068e66 --- /dev/null +++ b/packages/config/package.json @@ -0,0 +1,19 @@ +{ + "name": "@rnr/config", + "version": "0.0.0", + "private": true, + "type": "module", + "main": "./index.js", + "exports": { + "./eslint/next": "./eslint/next.cjs", + "./prettier": "./prettier/index.cjs", + "./vitest/base": "./vitest/base.ts" + }, + "peerDependencies": { + "eslint": "^9", + "eslint-config-next": "*", + "prettier": "^3", + "prettier-plugin-tailwindcss": "*", + "vitest": "^2" + } +} diff --git a/packages/config/prettier/index.cjs b/packages/config/prettier/index.cjs new file mode 100644 index 0000000..e9c95c6 --- /dev/null +++ b/packages/config/prettier/index.cjs @@ -0,0 +1,9 @@ +/** @type {import('prettier').Config} */ +module.exports = { + arrowParens: 'always', + printWidth: 100, + semi: true, + singleQuote: true, + trailingComma: 'all', + plugins: ['prettier-plugin-tailwindcss'], +}; diff --git a/packages/config/vitest/base.ts b/packages/config/vitest/base.ts new file mode 100644 index 0000000..a8165fe --- /dev/null +++ b/packages/config/vitest/base.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export const vitestBaseConfig = defineConfig({ + test: { + coverage: { + provider: 'v8', + reporter: ['text', 'lcov'], + }, + }, +}); + +export default vitestBaseConfig; diff --git a/packages/example-library/components.json b/packages/rnr-ui/components.json similarity index 100% rename from packages/example-library/components.json rename to packages/rnr-ui/components.json diff --git a/packages/example-library/nativewind-env.d.ts b/packages/rnr-ui/nativewind-env.d.ts similarity index 100% rename from packages/example-library/nativewind-env.d.ts rename to packages/rnr-ui/nativewind-env.d.ts diff --git a/packages/example-library/package.json b/packages/rnr-ui/package.json similarity index 96% rename from packages/example-library/package.json rename to packages/rnr-ui/package.json index 8ec824e..235207d 100644 --- a/packages/example-library/package.json +++ b/packages/rnr-ui/package.json @@ -1,5 +1,5 @@ { - "name": "@rnr/example-library", + "name": "@rnr/rnr-ui", "description": "Example library for React Native Reusables Registry Template", "license": "MIT", "scripts": { diff --git a/packages/example-library/reusables/components/ui/button.tsx b/packages/rnr-ui/reusables/components/ui/button.tsx similarity index 100% rename from packages/example-library/reusables/components/ui/button.tsx rename to packages/rnr-ui/reusables/components/ui/button.tsx diff --git a/packages/example-library/reusables/components/ui/card.tsx b/packages/rnr-ui/reusables/components/ui/card.tsx similarity index 100% rename from packages/example-library/reusables/components/ui/card.tsx rename to packages/rnr-ui/reusables/components/ui/card.tsx diff --git a/packages/example-library/reusables/components/ui/label.tsx b/packages/rnr-ui/reusables/components/ui/label.tsx similarity index 100% rename from packages/example-library/reusables/components/ui/label.tsx rename to packages/rnr-ui/reusables/components/ui/label.tsx diff --git a/packages/example-library/reusables/components/ui/text.tsx b/packages/rnr-ui/reusables/components/ui/text.tsx similarity index 100% rename from packages/example-library/reusables/components/ui/text.tsx rename to packages/rnr-ui/reusables/components/ui/text.tsx diff --git a/packages/example-library/reusables/global.css b/packages/rnr-ui/reusables/global.css similarity index 100% rename from packages/example-library/reusables/global.css rename to packages/rnr-ui/reusables/global.css diff --git a/packages/example-library/reusables/lib/theme.ts b/packages/rnr-ui/reusables/lib/theme.ts similarity index 100% rename from packages/example-library/reusables/lib/theme.ts rename to packages/rnr-ui/reusables/lib/theme.ts diff --git a/packages/example-library/reusables/lib/utils.ts b/packages/rnr-ui/reusables/lib/utils.ts similarity index 100% rename from packages/example-library/reusables/lib/utils.ts rename to packages/rnr-ui/reusables/lib/utils.ts diff --git a/packages/example-library/src/blocks/index.ts b/packages/rnr-ui/src/blocks/index.ts similarity index 100% rename from packages/example-library/src/blocks/index.ts rename to packages/rnr-ui/src/blocks/index.ts diff --git a/packages/example-library/src/blocks/multiple-buttons.tsx b/packages/rnr-ui/src/blocks/multiple-buttons.tsx similarity index 94% rename from packages/example-library/src/blocks/multiple-buttons.tsx rename to packages/rnr-ui/src/blocks/multiple-buttons.tsx index 7839fd3..0e76c4e 100644 --- a/packages/example-library/src/blocks/multiple-buttons.tsx +++ b/packages/rnr-ui/src/blocks/multiple-buttons.tsx @@ -1,5 +1,5 @@ import { View } from 'react-native'; -import { RedButton } from '@/example-library/components/ui/red-button'; +import { RedButton } from '@/rnr-ui/components/ui/red-button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card'; export function MultipleButtons() { diff --git a/packages/example-library/src/components/ui/forms.tsx b/packages/rnr-ui/src/components/ui/forms.tsx similarity index 100% rename from packages/example-library/src/components/ui/forms.tsx rename to packages/rnr-ui/src/components/ui/forms.tsx diff --git a/packages/example-library/src/components/ui/red-button.tsx b/packages/rnr-ui/src/components/ui/red-button.tsx similarity index 100% rename from packages/example-library/src/components/ui/red-button.tsx rename to packages/rnr-ui/src/components/ui/red-button.tsx diff --git a/packages/example-library/src/examples/form/form-basic.tsx b/packages/rnr-ui/src/examples/form/form-basic.tsx similarity index 96% rename from packages/example-library/src/examples/form/form-basic.tsx rename to packages/rnr-ui/src/examples/form/form-basic.tsx index 7f492a2..d70e34e 100644 --- a/packages/example-library/src/examples/form/form-basic.tsx +++ b/packages/rnr-ui/src/examples/form/form-basic.tsx @@ -1,4 +1,4 @@ -import { Form } from '@/example-library/components/ui/forms'; +import { Form } from '@/rnr-ui/components/ui/forms'; import { TextInput } from 'react-native'; import { View } from 'react-native'; import { Button } from '~/components/ui/button'; diff --git a/packages/example-library/src/examples/form/form-with-validation.tsx b/packages/rnr-ui/src/examples/form/form-with-validation.tsx similarity index 97% rename from packages/example-library/src/examples/form/form-with-validation.tsx rename to packages/rnr-ui/src/examples/form/form-with-validation.tsx index 17797bf..24ab4f5 100644 --- a/packages/example-library/src/examples/form/form-with-validation.tsx +++ b/packages/rnr-ui/src/examples/form/form-with-validation.tsx @@ -1,4 +1,4 @@ -import { Form } from '@/example-library/components/ui/forms'; +import { Form } from '@/rnr-ui/components/ui/forms'; import { TextInput } from 'react-native'; import { View } from 'react-native'; import { Button } from '~/components/ui/button'; diff --git a/packages/example-library/src/examples/form/index.ts b/packages/rnr-ui/src/examples/form/index.ts similarity index 100% rename from packages/example-library/src/examples/form/index.ts rename to packages/rnr-ui/src/examples/form/index.ts diff --git a/packages/example-library/src/examples/index.ts b/packages/rnr-ui/src/examples/index.ts similarity index 100% rename from packages/example-library/src/examples/index.ts rename to packages/rnr-ui/src/examples/index.ts diff --git a/packages/example-library/src/examples/red-button/index.ts b/packages/rnr-ui/src/examples/red-button/index.ts similarity index 100% rename from packages/example-library/src/examples/red-button/index.ts rename to packages/rnr-ui/src/examples/red-button/index.ts diff --git a/packages/example-library/src/examples/red-button/red-button-primary.tsx b/packages/rnr-ui/src/examples/red-button/red-button-primary.tsx similarity index 53% rename from packages/example-library/src/examples/red-button/red-button-primary.tsx rename to packages/rnr-ui/src/examples/red-button/red-button-primary.tsx index afb1884..6ee5729 100644 --- a/packages/example-library/src/examples/red-button/red-button-primary.tsx +++ b/packages/rnr-ui/src/examples/red-button/red-button-primary.tsx @@ -1,4 +1,4 @@ -import { RedButton } from '@/example-library/components/ui/red-button'; +import { RedButton } from '@/rnr-ui/components/ui/red-button'; export function RedButtonPreview() { return ; diff --git a/packages/example-library/src/examples/red-button/red-button-secondary.tsx b/packages/rnr-ui/src/examples/red-button/red-button-secondary.tsx similarity index 62% rename from packages/example-library/src/examples/red-button/red-button-secondary.tsx rename to packages/rnr-ui/src/examples/red-button/red-button-secondary.tsx index 3570664..74cc13d 100644 --- a/packages/example-library/src/examples/red-button/red-button-secondary.tsx +++ b/packages/rnr-ui/src/examples/red-button/red-button-secondary.tsx @@ -1,4 +1,4 @@ -import { RedButton } from '@/example-library/components/ui/red-button'; +import { RedButton } from '@/rnr-ui/components/ui/red-button'; export function RedButtonSecondaryPreview() { return ; diff --git a/packages/example-library/tailwind.config.js b/packages/rnr-ui/tailwind.config.js similarity index 100% rename from packages/example-library/tailwind.config.js rename to packages/rnr-ui/tailwind.config.js diff --git a/packages/example-library/tsconfig.json b/packages/rnr-ui/tsconfig.json similarity index 87% rename from packages/example-library/tsconfig.json rename to packages/rnr-ui/tsconfig.json index 49b49c8..4a89766 100644 --- a/packages/example-library/tsconfig.json +++ b/packages/rnr-ui/tsconfig.json @@ -6,7 +6,7 @@ "baseUrl": ".", "paths": { "~/*": ["reusables/*"], - "@/example-library/*": ["src/*"] + "@/rnr-ui/*": ["src/*"] } }, "exclude": ["node_modules"] diff --git a/packages/utils/package.json b/packages/utils/package.json index cb7d076..4dbf71a 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,7 +3,8 @@ "description": "Utility functions for React Native Reusables", "license": "MIT", "scripts": { - "clean": "rm -rf node_modules" + "clean": "rm -rf node_modules", + "test": "vitest run --coverage" }, "version": "0.0.0", "type": "module", @@ -22,10 +23,14 @@ ] }, "devDependencies": { + "@rnr/config": "workspace:*", "@tsconfig/recommended": "^1.0.1", + "@types/node": "^22.10.1", "@types/react": "~19.0.14", + "@vitest/coverage-v8": "^2.1.4", "react": "19.0.0", - "react-native": "0.79.5" + "react-native": "0.79.5", + "vitest": "^2.1.4" }, "peerDependencies": { "react": "*", diff --git a/packages/utils/src/__tests__/object.test.ts b/packages/utils/src/__tests__/object.test.ts new file mode 100644 index 0000000..9b851d1 --- /dev/null +++ b/packages/utils/src/__tests__/object.test.ts @@ -0,0 +1,93 @@ +import { describe, expect, it } from 'vitest'; + +import { omit, pick } from '../object'; + +describe('pick', () => { + it('returns only the requested properties', () => { + const source = { id: 1, name: 'Alice', age: 30 }; + + const result = pick(source, ['id', 'name'] as const); + + expect(result).toStrictEqual({ id: 1, name: 'Alice' }); + expect(Object.keys(result)).toHaveLength(2); + }); + + it('ignores missing keys and prototype properties', () => { + const proto = { inherited: true }; + const source = Object.create(proto, { + present: { + value: 42, + enumerable: true, + }, + }) as { present: number; missing?: string }; + + const result = pick(source, ['present', 'missing'] as const); + + expect(result).toStrictEqual({ present: 42 }); + expect('inherited' in result).toBe(false); + }); + + it('handles nullish input gracefully', () => { + expect(pick(null, ['a'] as const)).toStrictEqual({}); + expect(pick(undefined, ['a'] as const)).toStrictEqual({}); + }); + + it('returns an empty object when no keys are provided', () => { + const source = { id: 1, name: 'Alice' }; + + const result = pick(source, [] as const); + + expect(result).toStrictEqual({}); + }); +}); + +describe('omit', () => { + it('removes specified keys', () => { + const source = { id: 1, secret: 'hidden', role: 'admin' }; + + const result = omit(source, ['secret'] as const); + + expect(result).toStrictEqual({ id: 1, role: 'admin' }); + }); + + it('preserves symbol keys unless omitted', () => { + const sym = Symbol('token'); + const source = { id: 1, [sym]: 'value' }; + + expect(omit(source, ['id'] as const)).toStrictEqual({ [sym]: 'value' }); + expect(omit(source, [sym] as const)).toStrictEqual({ id: 1 }); + }); + + it('returns a shallow clone when no keys are omitted', () => { + const source = { id: 1, count: 2 }; + + const result = omit(source, [] as const); + + expect(result).toStrictEqual(source); + expect(result).not.toBe(source); + }); + + it('handles nullish input gracefully', () => { + expect(omit(null, ['a'] as const)).toStrictEqual({}); + expect(omit(undefined, ['a'] as const)).toStrictEqual({}); + }); +}); + +describe('type inference', () => { + it('narrows the resulting type for pick and omit', () => { + const source = { id: 1, name: 'Alice', active: true }; + + const picked = pick(source, ['id'] as const); + const omitted = omit(source, ['active'] as const); + + type Picked = typeof picked; + type Omitted = typeof omitted; + + const expectPicked: Picked = { id: 1 }; + const expectOmitted: Omitted = { id: 1, name: 'Alice' }; + + expect(expectPicked).toStrictEqual({ id: 1 }); + expect(expectOmitted).toStrictEqual({ id: 1, name: 'Alice' }); + }); +}); + diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 7cefe5d..8239311 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,2 +1,3 @@ export * from './hello'; export * from './types'; +export * from './object'; diff --git a/packages/utils/src/object.ts b/packages/utils/src/object.ts new file mode 100644 index 0000000..f82ebe6 --- /dev/null +++ b/packages/utils/src/object.ts @@ -0,0 +1,81 @@ +const hasOwn = Object.prototype.hasOwnProperty; + +type AnyRecord = Record; + +/** + * Pick a subset of properties from an object. + * @param source - The source object to pick properties from. + * @param keys - The property keys to include in the resulting object. + */ +export function pick( + source: T | null | undefined, + keys: K, +): Pick { + const result: Partial> = {}; + + if (!source) { + return result as Pick; + } + + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (hasOwn.call(source, key)) { + result[key] = source[key]; + } + } + + return result as Pick; +} + +/** + * Omit a subset of properties from an object. + * @param source - The source object to omit properties from. + * @param keys - The property keys to remove from the resulting object. + */ +export function omit( + source: T | null | undefined, + keys: K, +): Omit { + if (!source) { + return {} as Omit; + } + + const keysLen = keys.length; + + // For 0-3 keys, direct comparison is faster than Set + if (keysLen === 0) { + return { ...source } as Omit; + } + + const result: Partial = {}; + + if (keysLen <= 3) { + // Fast path for small omit lists + const sourceKeys = Reflect.ownKeys(source) as (keyof T)[]; + for (let i = 0; i < sourceKeys.length; i++) { + const key = sourceKeys[i]; + let shouldOmit = false; + for (let j = 0; j < keysLen; j++) { + if (key === keys[j]) { + shouldOmit = true; + break; + } + } + if (!shouldOmit) { + result[key] = source[key]; + } + } + } else { + // Set is faster for larger omit lists + const keysToOmit = new Set(keys as readonly PropertyKey[]); + const sourceKeys = Reflect.ownKeys(source) as (keyof T)[]; + for (let i = 0; i < sourceKeys.length; i++) { + const key = sourceKeys[i]; + if (!keysToOmit.has(key)) { + result[key] = source[key]; + } + } + } + + return result as Omit; +} \ No newline at end of file diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 7572364..b0a58f6 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -4,6 +4,7 @@ "compilerOptions": { "jsx": "react-jsx", "baseUrl": ".", + "types": ["vitest/globals"], "paths": { "@/utils/*": ["src/*"] } diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts new file mode 100644 index 0000000..67aca16 --- /dev/null +++ b/packages/utils/vitest.config.ts @@ -0,0 +1,18 @@ +import baseConfig from '@rnr/config/vitest/base'; +import { defineConfig, mergeConfig } from 'vitest/config'; + +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + coverage: { + lines: 100, + functions: 100, + statements: 100, + branches: 100, + include: ['src/object.ts'], + }, + }, + }), +); + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d823188..7f10ae5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,12 @@ importers: .: devDependencies: + '@rnr/config': + specifier: workspace:* + version: link:packages/config + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@1.21.7) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -18,7 +24,7 @@ importers: specifier: ^0.6.14 version: 0.6.14(prettier@3.6.2) turbo: - specifier: ^2.5.5 + specifier: ^2.6.0 version: 2.6.0 typescript: specifier: ^5.8.3 @@ -35,9 +41,9 @@ importers: '@radix-ui/react-tabs': specifier: ^1.1.12 version: 1.1.13(@types/react-dom@19.1.5(@types/react@19.0.14))(@types/react@19.0.14)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@rnr/example-library': + '@rnr/rnr-ui': specifier: workspace:* - version: link:../../packages/example-library + version: link:../../packages/rnr-ui '@rnr/utils': specifier: workspace:* version: link:../../packages/utils @@ -102,6 +108,9 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.18) devDependencies: + '@rnr/config': + specifier: workspace:* + version: link:../../packages/config '@types/mdx': specifier: ^2.0.13 version: 2.0.13 @@ -118,11 +127,11 @@ importers: specifier: ^10.4.20 version: 10.4.21(postcss@8.5.6) eslint: - specifier: ^8 - version: 8.57.1 + specifier: ^9.39.1 + version: 9.39.1(jiti@1.21.7) eslint-config-next: specifier: 15.4.5 - version: 15.4.5(eslint@8.57.1)(typescript@5.9.3) + version: 15.4.5(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) postcss: specifier: ^8.4.49 version: 8.5.6 @@ -147,9 +156,9 @@ importers: '@rn-primitives/slot': specifier: ~1.2.0 version: 1.2.0(react-native-web@0.21.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0) - '@rnr/example-library': + '@rnr/rnr-ui': specifier: workspace:* - version: link:../../packages/example-library + version: link:../../packages/rnr-ui '@rnr/utils': specifier: workspace:* version: link:../../packages/utils @@ -242,7 +251,25 @@ importers: specifier: ^5.8.3 version: 5.9.3 - packages/example-library: + packages/config: + dependencies: + eslint: + specifier: ^9 + version: 9.39.1(jiti@1.21.7) + eslint-config-next: + specifier: '*' + version: 15.4.5(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + prettier: + specifier: ^3 + version: 3.6.2 + prettier-plugin-tailwindcss: + specifier: '*' + version: 0.6.14(prettier@3.6.2) + vitest: + specifier: ^2 + version: 2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1) + + packages/rnr-ui: dependencies: '@react-navigation/native': specifier: ^7.0.0 @@ -296,18 +323,30 @@ importers: packages/utils: devDependencies: + '@rnr/config': + specifier: workspace:* + version: link:../config '@tsconfig/recommended': specifier: ^1.0.1 version: 1.0.11 + '@types/node': + specifier: ^22.10.1 + version: 22.10.5 '@types/react': specifier: ~19.0.14 version: 19.0.14 + '@vitest/coverage-v8': + specifier: ^2.1.4 + version: 2.1.9(vitest@2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1)) react: specifier: 19.0.0 version: 19.0.0 react-native: specifier: 0.79.5 version: 0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0) + vitest: + specifier: ^2.1.4 + version: 2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1) packages: @@ -323,6 +362,10 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@antfu/ni@23.3.1': resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} hasBin: true @@ -824,6 +867,9 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@egjs/hammerjs@2.0.17': resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} engines: {node: '>=0.8.0'} @@ -837,102 +883,204 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -945,6 +1093,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -957,6 +1111,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -969,24 +1129,48 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1003,13 +1187,33 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@expo-google-fonts/geist@0.4.1': resolution: {integrity: sha512-UOBwoTJkKC0ViMOS8gjlQyUcT/5PX0phCroz/8z0DP1+7FcoD1RGGeG//nVQYWbT3y/ze4XoE63gSunml9Wdbw==} @@ -1118,18 +1322,21 @@ packages: '@formatjs/intl-localematcher@0.5.10': resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} @@ -2126,6 +2333,116 @@ packages: react-native-web: optional: true + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2444,6 +2761,44 @@ packages: peerDependencies: '@urql/core': ^5.0.0 + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + peerDependencies: + '@vitest/browser': 2.1.9 + vitest: 2.1.9 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -2663,6 +3018,10 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -2837,6 +3196,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2883,6 +3246,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2907,6 +3274,10 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3178,6 +3549,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -3245,10 +3620,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -3363,6 +3734,11 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -3469,9 +3845,9 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -3481,15 +3857,19 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -3567,6 +3947,10 @@ packages: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + expo-asset@11.1.7: resolution: {integrity: sha512-b5P8GpjUh08fRCf6m5XPVAh7ra42cQrHBIMgH2UXP+xsj4Wufl6pLy6jRF5w6U7DranUMbsXm8TOyq4EHy7ADg==} peerDependencies: @@ -3750,9 +4134,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -3778,9 +4162,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -3970,9 +4354,9 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -4060,6 +4444,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -4258,10 +4645,6 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4335,6 +4718,18 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -4586,6 +4981,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4613,6 +5011,16 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -5258,6 +5666,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -5849,6 +6264,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -5999,6 +6419,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -6059,6 +6482,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -6078,6 +6504,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6270,8 +6699,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} @@ -6286,6 +6716,12 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -6294,6 +6730,18 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tldts-core@7.0.17: resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==} @@ -6392,10 +6840,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -6568,8 +7012,69 @@ packages: vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: 1.27.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -6643,6 +7148,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wonka@6.3.5: resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} @@ -6769,6 +7279,11 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@antfu/ni@23.3.1': {} '@babel/code-frame@7.10.4': @@ -7373,6 +7888,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} + '@egjs/hammerjs@2.0.17': dependencies: '@types/hammerjs': 2.0.46 @@ -7393,97 +7910,182 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@1.21.7))': dependencies: - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.0 @@ -7492,7 +8094,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.39.1': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@expo-google-fonts/geist@0.4.1': {} @@ -7785,17 +8394,16 @@ snapshots: dependencies: tslib: 2.8.1 - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@img/colour@1.0.0': optional: true @@ -8843,6 +9451,72 @@ snapshots: react-native: 0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0) react-native-web: 0.21.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.14.1': {} @@ -9033,15 +9707,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.3 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9050,14 +9724,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.3 '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9080,13 +9754,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -9110,13 +9784,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.46.3 '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9199,6 +9873,65 @@ snapshots: '@urql/core': 5.2.0(graphql@16.12.0) wonka: 6.3.5 + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + std-env: 3.10.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(vite@5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.0(@types/node@22.10.5)(typescript@5.9.3) + vite: 5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -9456,6 +10189,8 @@ snapshots: asap@2.0.6: {} + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -9695,6 +10430,8 @@ snapshots: bytes@3.1.2: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -9734,6 +10471,14 @@ snapshots: ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -9755,6 +10500,8 @@ snapshots: character-reference-invalid@2.0.1: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -10024,6 +10771,8 @@ snapshots: decode-uri-component@0.2.2: {} + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -10075,10 +10824,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -10261,6 +11006,32 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -10302,19 +11073,19 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@15.4.5(eslint@8.57.1)(typescript@5.9.3): + eslint-config-next@15.4.5(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 15.4.5 '@rushstack/eslint-patch': 1.14.1 - '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.3(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.1(jiti@1.21.7) 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-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.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) - eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@1.21.7)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -10330,33 +11101,33 @@ 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)(eslint@9.39.1(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.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.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.3(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.1(jiti@1.21.7) 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)(eslint@9.39.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10365,9 +11136,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.3(eslint@8.57.1)(typescript@5.9.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.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10379,13 +11150,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -10395,7 +11166,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -10404,11 +11175,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@1.21.7)): dependencies: - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@1.21.7)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -10416,7 +11187,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 8.57.1 + eslint: 9.39.1(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10435,7 +11206,7 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -10444,54 +11215,52 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: + eslint@9.39.1(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.7 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -10572,6 +11341,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + expect-type@1.2.2: {} + expo-asset@11.1.7(expo@53.0.23(@babel/core@7.28.5)(@expo/metro-runtime@5.0.5(react-native@0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)))(graphql@16.12.0)(react-native@0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0): dependencies: '@expo/image-utils': 0.7.6 @@ -10843,9 +11614,9 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -10886,11 +11657,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.3: {} @@ -11102,9 +11872,7 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} globalthis@1.0.4: dependencies: @@ -11228,6 +11996,8 @@ snapshots: dependencies: lru-cache: 10.4.3 + html-escaper@2.0.2: {} + html-void-elements@3.0.0: {} http-errors@2.0.0: @@ -11417,8 +12187,6 @@ snapshots: is-obj@3.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} is-promise@4.0.0: {} @@ -11488,6 +12256,25 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -11747,6 +12534,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.2.1: {} + lru-cache@10.4.3: {} lru-cache@11.2.2: {} @@ -11769,6 +12558,20 @@ snapshots: dependencies: react: 19.0.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -12804,6 +13607,10 @@ snapshots: path-type@4.0.0: {} + pathe@1.1.2: {} + + pathval@2.0.1: {} + performance-now@2.1.0: {} picocolors@1.1.1: {} @@ -13435,6 +14242,34 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.3 @@ -13717,6 +14552,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -13762,6 +14599,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} stacktrace-parser@0.1.11: @@ -13774,6 +14613,8 @@ snapshots: statuses@2.0.2: {} + std-env@3.10.0: {} + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 @@ -14007,7 +14848,11 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-table@0.2.0: {} + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 thenify-all@1.6.0: dependencies: @@ -14021,6 +14866,10 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -14028,6 +14877,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + tldts-core@7.0.17: {} tldts@7.0.17: @@ -14113,8 +14968,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@0.7.1: {} @@ -14312,6 +15165,70 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vite-node@2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.52.5 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 + lightningcss: 1.27.0 + terser: 5.44.1 + + vitest@2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(terser@5.44.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(msw@2.12.0(@types/node@22.10.5)(typescript@5.9.3))(vite@5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.21(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1) + vite-node: 2.1.9(@types/node@22.10.5)(lightningcss@1.27.0)(terser@5.44.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.5 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vlq@1.0.1: {} walker@1.0.8: @@ -14427,6 +15344,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wonka@6.3.5: {} word-wrap@1.2.5: {} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..104e273 --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,2 @@ +module.exports = require('@rnr/config/prettier'); +