From 116c154924e364189b8b929bb920496065697728 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:23:50 -0700 Subject: [PATCH 01/19] chore: initial commit --- packages/octane-form/README.md | 109 ++ packages/octane-form/package.json | 48 + packages/octane-form/src/createFormHook.tsrx | 867 ++++++++++ .../octane-form/src/createFormHook.tsrx.d.ts | 101 ++ packages/octane-form/src/index.ts | 11 + packages/octane-form/src/types.ts | 122 ++ packages/octane-form/src/useField.tsrx | 656 +++++++ packages/octane-form/src/useField.tsrx.d.ts | 55 + packages/octane-form/src/useFieldGroup.tsrx | 252 +++ .../octane-form/src/useFieldGroup.tsrx.d.ts | 37 + packages/octane-form/src/useForm.tsrx | 296 ++++ packages/octane-form/src/useForm.tsrx.d.ts | 35 + packages/octane-form/src/useFormGroup.tsrx | 633 +++++++ .../octane-form/src/useFormGroup.tsrx.d.ts | 16 + packages/octane-form/src/useFormId.ts | 4 + .../src/useIsomorphicLayoutEffect.ts | 4 + .../tests/_fixtures/divergences.tsrx | 55 + .../_fixtures/ordinary/repo-regressions.tsrx | 87 + .../ordinary/strict-mode-divergences.tsrx | 121 ++ .../octane-form/tests/_fixtures/parity.tsrx | 62 + .../octane-form/tests/_fixtures/server.tsrx | 18 + .../_fixtures/upstream/createFormHook.tsrx | 961 +++++++++++ .../upstream/onChangeListenTo.adapter.tsrx | 141 ++ .../tests/_fixtures/upstream/useField.tsrx | 1512 +++++++++++++++++ .../tests/_fixtures/upstream/useForm.tsrx | 1092 ++++++++++++ .../_fixtures/upstream/useFormGroup.tsrx | 317 ++++ .../tests/conformance/createFormHook.test.ts | 2 + .../tests/conformance/divergences.test.ts | 28 + .../tests/conformance/exports.test.ts | 9 + .../onChangeListenTo.adapter.test.ts | 2 + .../tests/conformance/parity.test.ts | 22 + .../conformance/repo-regressions.test.ts | 21 + .../strict-mode-divergences.test.ts | 2 + .../tests/conformance/test-setup.ts | 21 + .../tests/conformance/useField.test.ts | 2 + .../tests/conformance/useForm.test.ts | 2 + .../tests/conformance/useFormGroup.test.ts | 2 + .../octane-form/tests/conformance/utils.ts | 5 + .../octane-form/tests/differential/.gitignore | 1 + .../octane-form/tests/differential/_setup.ts | 51 + .../tests/differential/parity.test.ts | 41 + packages/octane-form/tests/ssr/server.test.ts | 16 + packages/octane-form/tsconfig.json | 21 + .../typetests/createFormHook.test-d.tsx | 1044 ++++++++++++ packages/octane-form/typetests/tsconfig.json | 19 + .../octane-form/typetests/useField.test-d.tsx | 110 ++ .../octane-form/typetests/useForm.test-d.tsx | 157 ++ .../typetests/useFormGroup.test-d.tsx | 387 +++++ pnpm-lock.yaml | 1386 +++++++++++++-- 49 files changed, 10837 insertions(+), 126 deletions(-) create mode 100644 packages/octane-form/README.md create mode 100644 packages/octane-form/package.json create mode 100644 packages/octane-form/src/createFormHook.tsrx create mode 100644 packages/octane-form/src/createFormHook.tsrx.d.ts create mode 100644 packages/octane-form/src/index.ts create mode 100644 packages/octane-form/src/types.ts create mode 100644 packages/octane-form/src/useField.tsrx create mode 100644 packages/octane-form/src/useField.tsrx.d.ts create mode 100644 packages/octane-form/src/useFieldGroup.tsrx create mode 100644 packages/octane-form/src/useFieldGroup.tsrx.d.ts create mode 100644 packages/octane-form/src/useForm.tsrx create mode 100644 packages/octane-form/src/useForm.tsrx.d.ts create mode 100644 packages/octane-form/src/useFormGroup.tsrx create mode 100644 packages/octane-form/src/useFormGroup.tsrx.d.ts create mode 100644 packages/octane-form/src/useFormId.ts create mode 100644 packages/octane-form/src/useIsomorphicLayoutEffect.ts create mode 100644 packages/octane-form/tests/_fixtures/divergences.tsrx create mode 100644 packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx create mode 100644 packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx create mode 100644 packages/octane-form/tests/_fixtures/parity.tsrx create mode 100644 packages/octane-form/tests/_fixtures/server.tsrx create mode 100644 packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx create mode 100644 packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx create mode 100644 packages/octane-form/tests/_fixtures/upstream/useField.tsrx create mode 100644 packages/octane-form/tests/_fixtures/upstream/useForm.tsrx create mode 100644 packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx create mode 100644 packages/octane-form/tests/conformance/createFormHook.test.ts create mode 100644 packages/octane-form/tests/conformance/divergences.test.ts create mode 100644 packages/octane-form/tests/conformance/exports.test.ts create mode 100644 packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts create mode 100644 packages/octane-form/tests/conformance/parity.test.ts create mode 100644 packages/octane-form/tests/conformance/repo-regressions.test.ts create mode 100644 packages/octane-form/tests/conformance/strict-mode-divergences.test.ts create mode 100644 packages/octane-form/tests/conformance/test-setup.ts create mode 100644 packages/octane-form/tests/conformance/useField.test.ts create mode 100644 packages/octane-form/tests/conformance/useForm.test.ts create mode 100644 packages/octane-form/tests/conformance/useFormGroup.test.ts create mode 100644 packages/octane-form/tests/conformance/utils.ts create mode 100644 packages/octane-form/tests/differential/.gitignore create mode 100644 packages/octane-form/tests/differential/_setup.ts create mode 100644 packages/octane-form/tests/differential/parity.test.ts create mode 100644 packages/octane-form/tests/ssr/server.test.ts create mode 100644 packages/octane-form/tsconfig.json create mode 100644 packages/octane-form/typetests/createFormHook.test-d.tsx create mode 100644 packages/octane-form/typetests/tsconfig.json create mode 100644 packages/octane-form/typetests/useField.test-d.tsx create mode 100644 packages/octane-form/typetests/useForm.test-d.tsx create mode 100644 packages/octane-form/typetests/useFormGroup.test-d.tsx diff --git a/packages/octane-form/README.md b/packages/octane-form/README.md new file mode 100644 index 000000000..7a5eda6e4 --- /dev/null +++ b/packages/octane-form/README.md @@ -0,0 +1,109 @@ +# @tanstack/octane-form + +[TanStack Form](https://tanstack.com/form) bindings for the +[Octane](https://github.com/octanejs/octane) UI framework. + +## Installation + +```sh +npm install @tanstack/octane-form +pnpm add @tanstack/octane-form +``` + +This package ports `@tanstack/react-form@1.33.5` onto Octane while reusing +`@tanstack/form-core@1.33.5` unchanged. The runtime export surface matches the +React adapter, so migration starts by changing the package import: + +```ts +// before +import { useForm } from '@tanstack/react-form' + +// after +import { useForm } from '@tanstack/octane-form' +``` + +The renderer-bearing adapter modules are authored as `.tsrx` and compiled by +Octane. Matching `.tsrx.d.ts` companions are checked declaration emits of those +implementations, preserving the complete generic surface for TypeScript +consumers. Recursive contracts such as `extendForm` are named in the TSRX source +rather than manually unrolled in declarations. + +Renderer-specific public types use Octane names, including `OctaneFormApi`, +`OctaneFormExtendedApi`, `AppFieldExtendedOctaneFormApi`, and +`AppFieldExtendedOctaneFieldGroupApi`. + +```tsx +import { useForm } from '@tanstack/octane-form' + +export function ProfileForm() @{ + const form = useForm({ + defaultValues: { name: '' }, + onSubmit: ({ value }) => console.log(value), + }) + +
{ + event.preventDefault() + void form.handleSubmit() + }} + > + + value.length === 0 ? 'Name is required' : undefined, + }} + > + {(field) => ( + + )} + + state.canSubmit}> + {(canSubmit) => } + +
+} +``` + +## API + +The adapter includes `useForm`, `useField`, `useFormGroup`, `useFieldGroup`, +`createFormHook`, `createFormHookContexts`, and +`useIsomorphicLayoutEffect`. It also re-exports `@tanstack/form-core` and the +`useSelector`/`useStore` helpers from `@tanstack/octane-store`. + +Octane uses native DOM events. Text controls should call +`field.handleChange()` from `onInput`; native `change` fires only on +blur/commit. TanStack Form option names such as `onChange`, validators, and +listener keys retain their upstream spelling. + +Server rendering through `octane/server` is supported. Field and form +subscriptions render their initial snapshots without browser-only setup. + +## Verification + +The port runs TanStack Form's React adapter tests against Octane, including +validation, async validation and debounce, linked fields, arrays, form groups, +component contexts, submission, reset, and subscription behavior. A +differential test compiles the same `.tsrx` form for Octane and React and +compares its DOM after value, validation, array, and reset interactions. The +upstream compile-time suite and an SSR fixture are also included. + +Current scope and verification status are tracked in the generated +[bindings status table](../../docs/bindings-status.md), sourced from this +package's [`status.json`](./status.json). + +## License + +MIT — contains source derived from +[TanStack Form](https://github.com/TanStack/form) (MIT), adapted for Octane. diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json new file mode 100644 index 000000000..6943849b7 --- /dev/null +++ b/packages/octane-form/package.json @@ -0,0 +1,48 @@ +{ + "name": "@tanstack/octane-form", + "version": "1.30.5", + "description": "Powerful, type-safe forms for Octane.", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/form.git", + "directory": "packages/octane-form" + }, + "homepage": "https://tanstack.com/form", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "main": "src/index.ts", + "module": "src/index.ts", + "types": "src/index.ts", + "files": [ + "src", + "README.md" + ], + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "test": "vitest run" + }, + "dependencies": { + "@tanstack/form-core": "workspace:*", + "@tanstack/octane-store": "^0.12.2" + }, + "peerDependencies": { + "octane": "^0.1.51 || ^0.2.0 || ^0.3.0" + }, + "devDependencies": { + "@octanejs/testing-library": "^0.1.51", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/user-event": "^14.6.1", + "@tsrx/react": "^0.3.4", + "esbuild": "^0.28.2", + "octane": "^0.2.16", + "react": "19.1.0", + "react-dom": "19.1.0", + "vitest": "^3.2.4" + } +} diff --git a/packages/octane-form/src/createFormHook.tsrx b/packages/octane-form/src/createFormHook.tsrx new file mode 100644 index 000000000..efcfc4b9e --- /dev/null +++ b/packages/octane-form/src/createFormHook.tsrx @@ -0,0 +1,867 @@ +import { createContext, useContext, useMemo } from 'octane'; +import { useForm } from './useForm.tsrx'; +import { useFieldGroup } from './useFieldGroup.tsrx'; +import type { + AnyFieldApi, + AnyFormApi, + BaseFormOptions, + DeepKeysOfType, + FieldApi, + FieldsMap, + FormAsyncValidateOrFn, + FormOptions, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { Context } from 'octane'; +import type { FieldComponent } from './useField.tsrx'; +import type { OctaneFormExtendedApi } from './useForm.tsrx'; +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; + +type HookRenderable = unknown; +type HookPropsWithChildren

= P & { children?: HookRenderable }; +type HookFunctionComponent

= (props: P) => HookRenderable; +type HookComponentType

= HookFunctionComponent

; + +// We should never hit the `null` case here +const fieldContext = createContext(null as never); +const formContext = createContext(null as never); + +/** + * TypeScript inferencing is weird. + * + * If you have: + * + * @example + * + * interface Args { + * arg?: T + * } + * + * function test(arg?: Partial>): T { + * return 0 as any; + * } + * + * const a = test({}); + * + * Then `T` will default to `unknown`. + * + * However, if we change `test` to be: + * + * @example + * + * function test(arg?: Partial>): T; + * + * Then `T` becomes `undefined`. + * + * Here, we are checking if the passed type `T` extends `DefaultT` and **only** + * `DefaultT`, as if that's the case we assume that inferencing has not occurred. + */ +type UnwrapOrAny = [unknown] extends [T] ? any : T; +type UnwrapDefaultOrAny = [DefaultT] extends [T] + ? [T] extends [DefaultT] + ? any + : T + : T; + +function useFormContext() { + const form = useContext(formContext); + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!form) { + throw new Error( + '`formContext` only works when within a `formComponent` passed to `createFormHook`', + ); + } + + return form as OctaneFormExtendedApi< + // If you need access to the form data, you need to use `withForm` instead + Record, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + >; +} + +export function createFormHookContexts() { + function useFieldContext() { + const field = useContext(fieldContext); + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!field) { + throw new Error( + '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`', + ); + } + + return field as FieldApi< + any, + string, + TData, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + >; + } + + return { fieldContext, useFieldContext, useFormContext, formContext }; +} + +interface CreateFormHookProps< + TFieldComponents extends Record>, + TFormComponents extends Record>, +> { + fieldComponents: TFieldComponents; + fieldContext: Context; + formComponents: TFormComponents; + formContext: Context; +} + +/** + * @private + */ +export type AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + NoInfer + >; + AppForm: HookComponentType< + // Keep children optional in the renderer-facing component props. + HookPropsWithChildren<{}> + >; + }; + +export interface WithFormProps< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TRenderProps extends object = Record, +> extends FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> { + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps; + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + form: AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + >; +} + +export interface WithFieldGroupProps< + TFieldGroupData, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta, + TRenderProps extends object = Record, +> extends BaseFormOptions { + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps; + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + group: AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFieldGroupData, + string | FieldsMap, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + // this types it as 'never' in the render prop. It should prevent any + // untyped meta passed to the handleSubmit by accident. + unknown extends TSubmitMeta ? never : TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + >; +} + +type UseAppForm< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +>; + +type WithForm< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, +>( + props: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >, +) => WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny, TOnDynamicAsync>, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny +>['render']; + +type WithFieldGroup< + TComponents extends Record>, + TFormComponents extends Record>, +> = ( + props: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >, +) => < + TFormData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TFormSubmitMeta, +>( + params: HookPropsWithChildren< + NoInfer & { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >, +) => ReturnType; + +type UseTypedAppFormContext< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +>; + +type FieldComponentExtension>> = + Record> & { + [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; + }; + +type FormComponentExtension>> = + Record> & { + [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; + }; + +export interface CreateFormHookReturn< + TComponents extends Record>, + TFormComponents extends Record>, +> { + useAppForm: UseAppForm; + withForm: WithForm; + withFieldGroup: WithFieldGroup; + useTypedAppFormContext: UseTypedAppFormContext; + extendForm: < + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }) => CreateFormHookReturn; +} + +export function createFormHook< + TComponents extends Record>, + TFormComponents extends Record>, +>({ + fieldComponents, + fieldContext, + formContext, + formComponents, +}: CreateFormHookProps): CreateFormHookReturn< + TComponents, + TFormComponents +> { + const FieldContextProvider = fieldContext; + const FormContextProvider = formContext; + + function useAppForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useForm(props); + + // Keep children optional in the renderer-facing component props. + const AppForm = useMemo>>(() => { + return ({ children }) => { + return {children}; + }; + }, [form]); + + const AppField = useMemo(() => { + const AppField = (({ children, ...props }) => { + return ( + + {(field) => ( + + {children(Object.assign(field, fieldComponents))} + + )} + + ); + }) as FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents + >; + return AppField; + }, [form]); + + const extendedForm = useMemo(() => { + return Object.assign(form, { + AppField, + AppForm, + ...formComponents, + }); + }, [form, AppField, AppForm]); + + return extendedForm; + } + + function withForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, + >({ + render, + props, + }: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >): WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny, TOnDynamicAsync>, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny + >['render'] { + return function Render(innerProps) { + return render({ ...props, ...innerProps }); + }; + } + + function withFieldGroup({ + render, + props, + defaultValues, + }: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >): < + TFormData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TFormSubmitMeta, + >( + params: HookPropsWithChildren< + NoInfer & { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other field groups, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >, + ) => ReturnType { + return function Render(innerProps) { + const fieldGroupProps = useMemo(() => { + return { + form: innerProps.form, + fields: innerProps.fields, + defaultValues, + formComponents, + }; + }, [innerProps.form, innerProps.fields]); + const fieldGroupApi = useFieldGroup(fieldGroupProps as any); + + return render({ ...props, ...innerProps, group: fieldGroupApi as any }); + }; + } + + /** + * ⚠️ **Use withForm whenever possible.** + * + * Gets a typed form from the `` context. + */ + function useTypedAppFormContext< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + _props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useFormContext(); + + return form as never; + } + + function extendForm< + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }): CreateFormHookReturn { + return createFormHook({ + fieldContext, + formContext, + fieldComponents: { + ...fieldComponents, + ...extension.fieldComponents, + } as TComponents & TNewField, + formComponents: { + ...formComponents, + ...extension.formComponents, + } as TFormComponents & TNewForm, + }); + } + + return { + useAppForm, + withForm, + withFieldGroup, + useTypedAppFormContext, + extendForm, + } as CreateFormHookReturn; +} diff --git a/packages/octane-form/src/createFormHook.tsrx.d.ts b/packages/octane-form/src/createFormHook.tsrx.d.ts new file mode 100644 index 000000000..992a00121 --- /dev/null +++ b/packages/octane-form/src/createFormHook.tsrx.d.ts @@ -0,0 +1,101 @@ +// Declaration companion generated from createFormHook.tsrx. +import type { AnyFieldApi, AnyFormApi, BaseFormOptions, DeepKeysOfType, FieldApi, FieldsMap, FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core'; +import type { Context } from 'octane'; +import type { FieldComponent } from './useField.tsrx'; +import type { OctaneFormExtendedApi } from './useForm.tsrx'; +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; +type HookRenderable = unknown; +type HookPropsWithChildren

= P & { + children?: HookRenderable; +}; +type HookFunctionComponent

= (props: P) => HookRenderable; +type HookComponentType

= HookFunctionComponent

; +/** + * TypeScript inferencing is weird. + * + * If you have: + * + * @example + * + * interface Args { + * arg?: T + * } + * + * function test(arg?: Partial>): T { + * return 0 as any; + * } + * + * const a = test({}); + * + * Then `T` will default to `unknown`. + * + * However, if we change `test` to be: + * + * @example + * + * function test(arg?: Partial>): T; + * + * Then `T` becomes `undefined`. + * + * Here, we are checking if the passed type `T` extends `DefaultT` and **only** + * `DefaultT`, as if that's the case we assume that inferencing has not occurred. + */ +type UnwrapOrAny = [unknown] extends [T] ? any : T; +type UnwrapDefaultOrAny = [DefaultT] extends [T] ? [T] extends [DefaultT] ? any : T : T; +declare function useFormContext(): OctaneFormExtendedApi, any, any, any, any, any, any, any, any, any, any, any>; +export declare function createFormHookContexts(): { + fieldContext: Context; + useFieldContext: () => FieldApi; + useFormContext: typeof useFormContext; + formContext: Context; +}; +interface CreateFormHookProps>, TFormComponents extends Record>> { + fieldComponents: TFieldComponents; + fieldContext: Context; + formComponents: TFormComponents; + formContext: Context; +} +/** + * @private + */ +export type AppFieldExtendedOctaneFormApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = OctaneFormExtendedApi & NoInfer & { + AppField: FieldComponent>; + AppForm: HookComponentType>; +}; +export interface WithFormProps, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>, TRenderProps extends object = Record> extends FormOptions { + props?: TRenderProps; + render: HookFunctionComponent & { + form: AppFieldExtendedOctaneFormApi; + }>>; +} +export interface WithFieldGroupProps>, TFormComponents extends Record>, TSubmitMeta, TRenderProps extends object = Record> extends BaseFormOptions { + props?: TRenderProps; + render: HookFunctionComponent & { + group: AppFieldExtendedOctaneFieldGroupApi, undefined | FormValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, unknown extends TSubmitMeta ? never : TSubmitMeta, TFieldComponents, TFormComponents>; + }>>; +} +type UseAppForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; +type WithForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TRenderProps extends object = {}>(props: WithFormProps) => WithFormProps, UnwrapDefaultOrAny, TOnMount>, UnwrapDefaultOrAny, TOnChange>, UnwrapDefaultOrAny, TOnChangeAsync>, UnwrapDefaultOrAny, TOnBlur>, UnwrapDefaultOrAny, TOnBlurAsync>, UnwrapDefaultOrAny, TOnSubmit>, UnwrapDefaultOrAny, TOnSubmitAsync>, UnwrapDefaultOrAny, TOnDynamic>, UnwrapDefaultOrAny, TOnDynamicAsync>, UnwrapDefaultOrAny, TOnServer>, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny>['render']; +type WithFieldGroup>, TFormComponents extends Record>> = (props: WithFieldGroupProps) => | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TFormSubmitMeta>(params: HookPropsWithChildren & { + form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, TComponents, TFormComponents>; + fields: TFields; +}>) => ReturnType; +type UseTypedAppFormContext>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; +type FieldComponentExtension>> = Record> & { + [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; +}; +type FormComponentExtension>> = Record> & { + [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; +}; +export interface CreateFormHookReturn>, TFormComponents extends Record>> { + useAppForm: UseAppForm; + withForm: WithForm; + withFieldGroup: WithFieldGroup; + useTypedAppFormContext: UseTypedAppFormContext; + extendForm: , TNewForm extends FormComponentExtension>(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }) => CreateFormHookReturn; +} +export declare function createFormHook>, TFormComponents extends Record>>({ fieldComponents, fieldContext, formContext, formComponents, }: CreateFormHookProps): CreateFormHookReturn; +export {}; diff --git a/packages/octane-form/src/index.ts b/packages/octane-form/src/index.ts new file mode 100644 index 000000000..e287cd186 --- /dev/null +++ b/packages/octane-form/src/index.ts @@ -0,0 +1,11 @@ +export * from '@tanstack/form-core'; + +export { useSelector, useStore } from '@tanstack/octane-store'; + +export * from './createFormHook.tsrx'; +export * from './types'; +export * from './useField.tsrx'; +export * from './useFieldGroup.tsrx'; +export * from './useForm.tsrx'; +export * from './useFormGroup.tsrx'; +export * from './useIsomorphicLayoutEffect'; diff --git a/packages/octane-form/src/types.ts b/packages/octane-form/src/types.ts new file mode 100644 index 000000000..c552416c6 --- /dev/null +++ b/packages/octane-form/src/types.ts @@ -0,0 +1,122 @@ +import type { + DeepKeys, + DeepValue, + FieldApiOptions, + FieldAsyncValidateOrFn, + FieldOptions, + FieldValidateOrFn, + FormAsyncValidateOrFn, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core'; + +interface FieldOptionsMode { + mode?: 'value' | 'array'; +} + +/** + * The field options. + */ +export interface UseFieldOptions< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +> + extends + FieldApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TSubmitMeta + >, + FieldOptionsMode {} + +export interface UseFieldOptionsBound< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +> + extends + FieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + FieldOptionsMode {} + +export type ServerFormState< + TFormData, + TOnServer extends undefined | FormAsyncValidateOrFn, +> = Pick< + FormState< + TFormData, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + TOnServer + >, + 'values' | 'errors' | 'errorMap' +>; diff --git a/packages/octane-form/src/useField.tsrx b/packages/octane-form/src/useField.tsrx new file mode 100644 index 000000000..04d56be32 --- /dev/null +++ b/packages/octane-form/src/useField.tsrx @@ -0,0 +1,656 @@ +import { useMemo, useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FieldApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import type { + AnyFieldApi, + AnyFieldMeta, + DeepKeys, + DeepValue, + FieldAsyncValidateOrFn, + FieldValidateOrFn, + FieldValidators, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { UseFieldOptions, UseFieldOptionsBound } from './types'; + +type FieldRenderable = unknown; +type FieldFunctionComponent

= (props: P) => FieldRenderable; + +/** + * A type representing a hook for using a field in a form with the given form data type. + * + * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. + */ +export type UseField< + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>( + opts: UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, +) => FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +>; + +/** + * A hook for managing a field in a form. + * @param opts An object with field options. + * + * @returns The `FieldApi` instance for the specified field. + */ +export function useField< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>( + opts: UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + >, +) { + // Keep a snapshot of options so compiler optimizations do not treat + // fieldApi as immutable. + const [prevOptions, setPrevOptions] = useState(() => ({ + form: opts.form, + name: opts.name, + })); + + const [fieldApiState, setFieldApi] = useState(() => { + return new FieldApi({ + ...opts, + }); + }); + + let fieldApi = fieldApiState; + + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Adjusting state during render: create the new FieldApi and use it for the + // rest of this render so the render prop reads state at the current `name`. + // Otherwise the discarded render still runs to completion with the stale + // instance, briefly surfacing `undefined` for shifted array items on removal. + // See: https://github.com/TanStack/form/issues/2238 + fieldApi = new FieldApi({ + ...opts, + }); + setFieldApi(fieldApi); + setPrevOptions({ form: opts.form, name: opts.name }); + } + + // For array mode, only track length changes to avoid re-renders when child properties change + // See: https://github.com/TanStack/form/issues/1925 + const reactiveStateValue = useSelector( + fieldApi.store, + (opts.mode === 'array' ? (state) => state.meta._arrayVersion || 0 : (state) => state.value) as ( + state: typeof fieldApi.state, + ) => TData | number, + ); + const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched); + const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred); + const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty); + const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap); + const reactiveMetaErrorSourceMap = useSelector( + fieldApi.store, + (state) => state.meta.errorSourceMap, + ); + const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating); + + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...fieldApi, + get state() { + return { + // For array mode, reactiveStateValue is the length (for reactivity tracking), + // so we need to get the actual value from fieldApi + value: opts.mode === 'array' ? fieldApi.state.value : reactiveStateValue, + get meta() { + return { + ...fieldApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + } satisfies AnyFieldMeta; + }, + } satisfies AnyFieldApi['state']; + }, + }; + + const extendedApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > = reactiveFieldApi as never; + + return extendedApi; + }, [ + fieldApi, + opts.mode, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + ]); + + useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]); + + /** + * fieldApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + fieldApi.update(opts); + }); + + return extendedFieldApi; +} + +/** + * @param children A render function that takes a field API instance and returns a renderable value. + */ +interface FieldComponentProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, +> extends UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +> { + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable; +} + +interface FieldComponentBoundProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, +> extends UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync +> { + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable; +} + +/** + * A type alias representing a field component for a specific form data type. + */ +export type FieldComponent< + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TPatentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: FieldComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta, + ExtendedApi +>) => ReturnType; + +/** + * A type alias representing a field component for a form lens data type. + */ +export type LensFieldComponent< + in out TLensData, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: Omit< + FieldComponentBoundProps< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi + >, + 'name' | 'validators' +> & { + name: TName; + validators?: Omit< + FieldValidators< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + 'onChangeListenTo' | 'onBlurListenTo' + > & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[]; + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[]; + }; +}) => ReturnType; + +/** + * A function component that takes field options and a render function as children. + * + * The `Field` component uses the `useField` hook internally to manage the field instance. + */ +export const Field = (< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>({ + children, + ...fieldOptions +}: FieldComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +>): ReturnType => { + const fieldApi = useField(fieldOptions as any); + + const jsxToDisplay = useMemo( + () => functionalUpdate(children, fieldApi as any), + [children, fieldApi], + ); + return (<>{jsxToDisplay}) as never; +}) satisfies FieldFunctionComponent< + FieldComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +>; diff --git a/packages/octane-form/src/useField.tsrx.d.ts b/packages/octane-form/src/useField.tsrx.d.ts new file mode 100644 index 000000000..6e8256694 --- /dev/null +++ b/packages/octane-form/src/useField.tsrx.d.ts @@ -0,0 +1,55 @@ +// Declaration companion generated from useField.tsrx. +import { FieldApi } from '@tanstack/form-core'; +import type { DeepKeys, DeepValue, FieldAsyncValidateOrFn, FieldValidateOrFn, FieldValidators, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +import type { UseFieldOptions, UseFieldOptionsBound } from './types'; +type FieldRenderable = unknown; +type FieldFunctionComponent

= (props: P) => FieldRenderable; +/** + * A type representing a hook for using a field in a form with the given form data type. + * + * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. + */ +export type UseField, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>(opts: UseFieldOptionsBound) => FieldApi; +/** + * A hook for managing a field in a form. + * @param opts An object with field options. + * + * @returns The `FieldApi` instance for the specified field. + */ +export declare function useField, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>(opts: UseFieldOptions): FieldApi; +/** + * @param children A render function that takes a field API instance and returns a renderable value. + */ +interface FieldComponentProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptions { + children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; +} +interface FieldComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptionsBound { + children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; +} +/** + * A type alias representing a field component for a specific form data type. + */ +export type FieldComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: FieldComponentBoundProps) => ReturnType; +/** + * A type alias representing a field component for a form lens data type. + */ +export type LensFieldComponent = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: Omit, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi>, 'name' | 'validators'> & { + name: TName; + validators?: Omit, 'onChangeListenTo' | 'onBlurListenTo'> & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[]; + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[]; + }; +}) => ReturnType; +/** + * A function component that takes field options and a render function as children. + * + * The `Field` component uses the `useField` hook internally to manage the field instance. + */ +export declare const Field: , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>({ children, ...fieldOptions }: FieldComponentProps) => ReturnType; +export {}; diff --git a/packages/octane-form/src/useFieldGroup.tsrx b/packages/octane-form/src/useFieldGroup.tsrx new file mode 100644 index 000000000..46d73f148 --- /dev/null +++ b/packages/octane-form/src/useFieldGroup.tsrx @@ -0,0 +1,252 @@ +import { useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import type { + AnyFieldGroupApi, + DeepKeysOfType, + FieldGroupState, + FieldsMap, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; +import type { LensFieldComponent } from './useField.tsrx'; + +type FieldGroupRenderable = unknown; +type FieldGroupPropsWithChildren

= P & { children?: FieldGroupRenderable }; +type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; +type FieldGroupComponentType

= FieldGroupFunctionComponent

; + +function LocalSubscribe({ + lens, + selector = (state) => state, + children, +}: FieldGroupPropsWithChildren<{ + lens: AnyFieldGroupApi; + selector?: (state: FieldGroupState) => FieldGroupState; +}>): ReturnType { + const data = useSelector(lens.store, selector); + + return <>{functionalUpdate(children, data)}; +} + +/** + * @private + */ +export type AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = FieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: LensFieldComponent>; + AppForm: FieldGroupComponentType>; + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: LensFieldComponent; + + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: >>(props: { + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; + }) => ReturnType; + }; + +export function useFieldGroup< + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta = never, +>(opts: { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other form lenses, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + defaultValues?: TFieldGroupData; + onSubmitMeta?: TSubmitMeta; + formComponents: TFormComponents; +}): AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +> { + const [formLensApi] = useState(() => { + const api = new FieldGroupApi(opts); + const form = + opts.form instanceof FieldGroupApi + ? (opts.form.form as AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + >) + : opts.form; + + const extendedApi: AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > = api as never; + + extendedApi.AppForm = function AppForm(appFormProps) { + return ; + }; + + extendedApi.AppField = function AppField(props) { + return ; + }; + + extendedApi.Field = function Field(props) { + return ; + }; + + extendedApi.Subscribe = function Subscribe(props: any) { + return ( + + ); + }; + + return Object.assign(extendedApi, { + ...opts.formComponents, + }) as AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + >; + }); + + useIsomorphicLayoutEffect(formLensApi.mount, [formLensApi]); + + return formLensApi; +} diff --git a/packages/octane-form/src/useFieldGroup.tsrx.d.ts b/packages/octane-form/src/useFieldGroup.tsrx.d.ts new file mode 100644 index 000000000..99a2340d2 --- /dev/null +++ b/packages/octane-form/src/useFieldGroup.tsrx.d.ts @@ -0,0 +1,37 @@ +// Declaration companion generated from useFieldGroup.tsrx. +import { FieldGroupApi } from '@tanstack/form-core'; +import type { DeepKeysOfType, FieldGroupState, FieldsMap, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; +import type { LensFieldComponent } from './useField.tsrx'; +type FieldGroupRenderable = unknown; +type FieldGroupPropsWithChildren

= P & { + children?: FieldGroupRenderable; +}; +type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; +type FieldGroupComponentType

= FieldGroupFunctionComponent

; +/** + * @private + */ +export type AppFieldExtendedOctaneFieldGroupApi | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = FieldGroupApi & NoInfer & { + AppField: LensFieldComponent>; + AppForm: FieldGroupComponentType>; + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: LensFieldComponent; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: >>(props: { + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; + }) => ReturnType; +}; +export declare function useFieldGroup | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TComponents extends Record>, TFormComponents extends Record>, TSubmitMeta = never>(opts: { + form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, TSubmitMeta, TComponents, TFormComponents>; + fields: TFields; + defaultValues?: TFieldGroupData; + onSubmitMeta?: TSubmitMeta; + formComponents: TFormComponents; +}): AppFieldExtendedOctaneFieldGroupApi; +export {}; diff --git a/packages/octane-form/src/useForm.tsrx b/packages/octane-form/src/useForm.tsrx new file mode 100644 index 000000000..005e0ae62 --- /dev/null +++ b/packages/octane-form/src/useForm.tsrx @@ -0,0 +1,296 @@ +import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core'; +import { useSelector } from '@tanstack/octane-store'; +import { useMemo, useRef, useState } from 'octane'; +import { Field } from './useField.tsrx'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import { useFormId } from './useFormId'; +import { FormGroup } from './useFormGroup.tsrx'; +import type { FormGroupComponent } from './useFormGroup.tsrx'; +import type { + AnyFormApi, + AnyFormState, + FormAsyncValidateOrFn, + FormOptions, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { FieldComponent } from './useField.tsrx'; + +type FormRenderable = unknown; +type FormPropsWithChildren

= P & { children?: FormRenderable }; +type FormFunctionComponent

= (props: P) => FormRenderable; + +/** + * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` + */ +export interface OctaneFormApi< + in out TFormData, + in out TOnMount extends undefined | FormValidateOrFn, + in out TOnChange extends undefined | FormValidateOrFn, + in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TOnBlur extends undefined | FormValidateOrFn, + in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TOnSubmit extends undefined | FormValidateOrFn, + in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TOnDynamic extends undefined | FormValidateOrFn, + in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TOnServer extends undefined | FormAsyncValidateOrFn, + in out TSubmitMeta, +> { + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; + FormGroup: FormGroupComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: < + TSelected = NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + >(props: { + selector?: ( + state: NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + ) => TSelected; + children: ((state: NoInfer) => FormRenderable) | FormRenderable; + }) => ReturnType; +} + +/** + * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` + */ +export type OctaneFormExtendedApi< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +> = FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + OctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; + +function LocalSubscribe({ + form, + selector = (state) => state, + children, +}: FormPropsWithChildren<{ + form: AnyFormApi; + selector?: (state: AnyFormState) => AnyFormState; +}>): ReturnType { + const data = useSelector(form.store, selector); + + return <>{functionalUpdate(children, data)}; +} + +/** + * A custom hook that returns an extended instance of the `FormApi` class. + * + * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields + */ +export function useForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + opts?: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) { + const fallbackFormId = useFormId(); + const formId = opts?.formId ?? fallbackFormId; + const [prevFormId, setPrevFormId] = useState(formId); + + const [formApi, setFormApi] = useState(() => { + return new FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >({ ...opts, formId }); + }); + + if (prevFormId !== formId) { + setFormApi(new FormApi({ ...opts, formId })); + setPrevFormId(formId); + } + + const extendedFormApi = useMemo(() => { + const extendedApi: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > = { + ...formApi, + handleSubmit: ((...props: never[]) => { + return formApi._handleSubmit(...props); + }) as typeof formApi.handleSubmit, + // We must add all `get`ters from `core`'s `FormApi` here, as otherwise the spread operator won't catch those + get formId(): string { + return formApi._formId; + }, + get state() { + return formApi.store.state; + }, + } as never; + + extendedApi.Field = function APIField(props) { + return ; + }; + + extendedApi.FormGroup = function APIFormGroup(props) { + return ; + }; + + extendedApi.Subscribe = function Subscribe(props: any) { + return ; + }; + + return extendedApi; + }, [formApi]); + + useIsomorphicLayoutEffect(formApi.mount, [formApi]); + + /** + * formApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + formApi.update(opts); + }); + + const hasRan = useRef(false); + + useIsomorphicLayoutEffect(() => { + if (!hasRan.current) return; + if (!opts?.transform) return; + mergeAndUpdate(formApi, opts.transform as never); + }, [formApi, opts?.transform]); + + useIsomorphicLayoutEffect(() => { + hasRan.current = true; + }); + + return extendedFormApi; +} diff --git a/packages/octane-form/src/useForm.tsrx.d.ts b/packages/octane-form/src/useForm.tsrx.d.ts new file mode 100644 index 000000000..6b62b9d77 --- /dev/null +++ b/packages/octane-form/src/useForm.tsrx.d.ts @@ -0,0 +1,35 @@ +// Declaration companion generated from useForm.tsrx. +import { FormApi } from '@tanstack/form-core'; +import type { FormGroupComponent } from './useFormGroup.tsrx'; +import type { FormAsyncValidateOrFn, FormOptions, FormState, FormValidateOrFn } from '@tanstack/form-core'; +import type { FieldComponent } from './useField.tsrx'; +type FormRenderable = unknown; +type FormFunctionComponent

= (props: P) => FormRenderable; +/** + * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` + */ +export interface OctaneFormApi, in out TOnChange extends undefined | FormValidateOrFn, in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TOnBlur extends undefined | FormValidateOrFn, in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TOnSubmit extends undefined | FormValidateOrFn, in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TOnDynamic extends undefined | FormValidateOrFn, in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TOnServer extends undefined | FormAsyncValidateOrFn, in out TSubmitMeta> { + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent; + FormGroup: FormGroupComponent; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: >>(props: { + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FormRenderable) | FormRenderable; + }) => ReturnType; +} +/** + * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` + */ +export type OctaneFormExtendedApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta> = FormApi & OctaneFormApi; +/** + * A custom hook that returns an extended instance of the `FormApi` class. + * + * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields + */ +export declare function useForm, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(opts?: FormOptions): OctaneFormExtendedApi; +export {}; diff --git a/packages/octane-form/src/useFormGroup.tsrx b/packages/octane-form/src/useFormGroup.tsrx new file mode 100644 index 000000000..f37d0c530 --- /dev/null +++ b/packages/octane-form/src/useFormGroup.tsrx @@ -0,0 +1,633 @@ +import { useMemo, useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FormGroupApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import type { + DeepKeys, + DeepValue, + FormAsyncValidateOrFn, + FormGroupApiOptions, + FormGroupAsyncValidateOrFn, + FormGroupOptions, + FormGroupValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; + +type FormGroupRenderable = unknown; +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; + +export type UseFormGroup< + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>( + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, +) => FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +>; + +export function useFormGroup< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>( + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, +) { + // Keep a snapshot of options so compiler optimizations do not treat + // formGroupApi as immutable. + const [prevOptions, setPrevOptions] = useState(() => ({ + form: opts.form, + name: opts.name, + })); + + const [formGroupApiState, setFormGroupApi] = useState(() => { + return new FormGroupApi({ + ...opts, + }); + }); + let formGroupApi = formGroupApiState; + + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Use the replacement for the rest of this render so selectors and the + // render prop never observe state from the previous form or group name. + formGroupApi = new FormGroupApi({ + ...opts, + }); + setFormGroupApi(formGroupApi); + setPrevOptions({ form: opts.form, name: opts.name }); + } + + const reactiveStateValue = useSelector(formGroupApi.store, (state) => state.value); + + const reactiveMetaIsTouched = useSelector(formGroupApi.store, (state) => state.meta.isTouched); + const reactiveMetaIsBlurred = useSelector(formGroupApi.store, (state) => state.meta.isBlurred); + const reactiveMetaIsDirty = useSelector(formGroupApi.store, (state) => state.meta.isDirty); + const reactiveMetaErrorMap = useSelector(formGroupApi.store, (state) => state.meta.errorMap); + const reactiveMetaErrorSourceMap = useSelector( + formGroupApi.store, + (state) => state.meta.errorSourceMap, + ); + const reactiveMetaIsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isValidating, + ); + + // Submission lifecycle and aggregated validity now live on `state.meta` + // (mirroring `FieldApi.state.meta`). Subscribe to the fields callers + // typically read so the compiled renderer tracks them as dependencies. + const reactiveMetaIsSubmitting = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitting, + ); + const reactiveMetaIsSubmitted = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitted, + ); + const reactiveMetaSubmissionAttempts = useSelector( + formGroupApi.store, + (state) => state.meta.submissionAttempts, + ); + const reactiveMetaIsSubmitSuccessful = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitSuccessful, + ); + const reactiveMetaCanSubmit = useSelector(formGroupApi.store, (state) => state.meta.canSubmit); + const reactiveMetaIsValid = useSelector(formGroupApi.store, (state) => state.meta.isValid); + const reactiveMetaIsFieldsValid = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValid, + ); + const reactiveMetaIsFieldsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValidating, + ); + const reactiveMetaIsGroupValid = useSelector( + formGroupApi.store, + (state) => state.meta.isGroupValid, + ); + + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...formGroupApi, + handleSubmit: ((...props: never[]) => { + return formGroupApi._handleSubmit(...props); + }) as typeof formGroupApi.handleSubmit, + get state() { + return { + ...formGroupApi.state, + value: reactiveStateValue, + get meta() { + return { + ...formGroupApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + isSubmitting: reactiveMetaIsSubmitting, + isSubmitted: reactiveMetaIsSubmitted, + submissionAttempts: reactiveMetaSubmissionAttempts, + isSubmitSuccessful: reactiveMetaIsSubmitSuccessful, + canSubmit: reactiveMetaCanSubmit, + isValid: reactiveMetaIsValid, + isFieldsValid: reactiveMetaIsFieldsValid, + isFieldsValidating: reactiveMetaIsFieldsValidating, + isGroupValid: reactiveMetaIsGroupValid, + } satisfies typeof formGroupApi.state.meta; + }, + } satisfies typeof formGroupApi.state; + }, + }; + + const extendedApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > = reactiveFieldApi as never; + + return extendedApi; + }, [ + formGroupApi, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + reactiveMetaIsSubmitting, + reactiveMetaIsSubmitted, + reactiveMetaSubmissionAttempts, + reactiveMetaIsSubmitSuccessful, + reactiveMetaCanSubmit, + reactiveMetaIsValid, + reactiveMetaIsFieldsValid, + reactiveMetaIsFieldsValidating, + reactiveMetaIsGroupValid, + ]); + + useIsomorphicLayoutEffect(formGroupApi.mount, [formGroupApi]); + + useIsomorphicLayoutEffect(() => { + formGroupApi.update(opts); + }); + + return extendedFieldApi; +} + +interface FormGroupComponentProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, +> extends FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> { + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable; +} + +interface FormGroupComponentBoundProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, +> extends FormGroupOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> { + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable; +} + +export type FormGroupComponent< + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta, + ExtendedApi +>) => ReturnType; + +export const FormGroup = (< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +>): ReturnType => { + const formGroupApi = useFormGroup(formGroupOptions as any); + + const jsxToDisplay = useMemo( + () => functionalUpdate(children, formGroupApi as any), + [children, formGroupApi], + ); + return (<>{jsxToDisplay}) as never; +}) satisfies FormGroupFunctionComponent< + FormGroupComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +>; diff --git a/packages/octane-form/src/useFormGroup.tsrx.d.ts b/packages/octane-form/src/useFormGroup.tsrx.d.ts new file mode 100644 index 000000000..8bd12aa1f --- /dev/null +++ b/packages/octane-form/src/useFormGroup.tsrx.d.ts @@ -0,0 +1,16 @@ +// Declaration companion generated from useFormGroup.tsrx. +import { FormGroupApi } from '@tanstack/form-core'; +import type { DeepKeys, DeepValue, FormAsyncValidateOrFn, FormGroupApiOptions, FormGroupAsyncValidateOrFn, FormGroupOptions, FormGroupValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +type FormGroupRenderable = unknown; +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; +export type UseFormGroup, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>(opts: FormGroupApiOptions) => FormGroupApi; +export declare function useFormGroup, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>(opts: FormGroupApiOptions): FormGroupApi; +interface FormGroupComponentProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupApiOptions { + children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; +} +interface FormGroupComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupOptions { + children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; +} +export type FormGroupComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentBoundProps) => ReturnType; +export declare const FormGroup: , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentProps) => ReturnType; +export {}; diff --git a/packages/octane-form/src/useFormId.ts b/packages/octane-form/src/useFormId.ts new file mode 100644 index 000000000..5d4379ee4 --- /dev/null +++ b/packages/octane-form/src/useFormId.ts @@ -0,0 +1,4 @@ +import { useId } from 'octane'; + +// Generated IDs remain opaque and stable across SSR and hydration. +export const useFormId = useId; diff --git a/packages/octane-form/src/useIsomorphicLayoutEffect.ts b/packages/octane-form/src/useIsomorphicLayoutEffect.ts new file mode 100644 index 000000000..27d0a71c8 --- /dev/null +++ b/packages/octane-form/src/useIsomorphicLayoutEffect.ts @@ -0,0 +1,4 @@ +import { useEffect, useLayoutEffect } from 'octane'; + +export const useIsomorphicLayoutEffect = + typeof window !== 'undefined' ? useLayoutEffect : useEffect; diff --git a/packages/octane-form/tests/_fixtures/divergences.tsrx b/packages/octane-form/tests/_fixtures/divergences.tsrx new file mode 100644 index 000000000..7e0a4f78d --- /dev/null +++ b/packages/octane-form/tests/_fixtures/divergences.tsrx @@ -0,0 +1,55 @@ +import { fireEvent, render } from '@octanejs/testing-library'; +import { createFormHook, createFormHookContexts, useForm } from '../../src/index'; + +export function renderRegisteredFieldComponent() { + const { fieldContext, formContext, useFieldContext } = createFormHookContexts(); + + function TextField({ label }: { label: string }) { + const field = useFieldContext(); + return ; + } + + const { useAppForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: {}, + fieldContext, + formContext, + }); + + function App() { + const form = useAppForm({ defaultValues: { name: 'Ada' } }); + return + {(field) => } + ; + } + + return render().getByLabelText('Name'); +} + +export function renderNativeEventForm() { + let observedEvent: Event | undefined; + + function App() { + const form = useForm({ defaultValues: { name: '' } }); + return + {(field) => { + observedEvent = event; + field.handleChange(event.target.value); + }} + />} + ; + } + + const input = render().getByLabelText('Name'); + fireEvent.input(input, { target: { value: 'Grace' } }); + return { input, observedEvent }; +} diff --git a/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx b/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx new file mode 100644 index 000000000..1a695d207 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx @@ -0,0 +1,87 @@ +// Repository-authored regressions that are not present in the pinned upstream +// suite. Keep them outside react-parity ownership so ordinary shards execute +// them. +import { describe, expect, it } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useReducer, useState } from 'octane'; +import { useForm } from '@tanstack/octane-form'; + +const user = userEvent.setup(); + +describe('tanstack-form repository regressions', () => { + it('mounts a replacement form when an explicit formId is removed', async () => { + const mountedIds: string[] = []; + + function Comp() { + const [formId, setFormId] = useState('first'); + const [, forceRender] = useReducer((count) => count + 1, 0); + const form = useForm({ + formId, + listeners: { + onMount: () => mountedIds.push(formId ?? 'fallback'), + }, + }); + + return <> + {form.formId} + + + ; + } + + const { getByTestId } = render(); + const id = getByTestId('dynamic-form-id'); + expect(id).toHaveTextContent('first'); + expect(mountedIds).toEqual(['first']); + + await user.click(getByTestId('clear-form-id')); + await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); + expect(id).not.toHaveTextContent('first'); + const fallbackId = id.textContent; + expect(fallbackId).not.toBe(''); + + await user.click(getByTestId('rerender-form')); + expect(id).toHaveTextContent(fallbackId!); + expect(mountedIds).toEqual(['first', 'fallback']); + }); + + it('uses the current group state throughout a name change render', async () => { + const observedValues: string[] = []; + + function Comp() { + const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); + const form = useForm({ + defaultValues: { + step1: { label: 'first' }, + step2: { label: 'second' }, + }, + }); + + return <> + + + {(group) => { + observedValues.push(group.state.value.label); + return {group.state.value.label}; + }} + + ; + } + + const { getByTestId } = render(); + expect(getByTestId('group-label')).toHaveTextContent('first'); + + observedValues.length = 0; + await user.click(getByTestId('change-group')); + + expect(getByTestId('group-label')).toHaveTextContent('second'); + expect(observedValues).not.toContain('first'); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx b/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx new file mode 100644 index 000000000..ad77a01e0 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx @@ -0,0 +1,121 @@ +// OCTANE DIVERGENCE: upstream wraps these scenarios in to prove +// double-invoke behavior. Octane has no StrictMode double-invoke, so the cases +// run without that wrapper as ordinary package coverage rather than React +// parity evidence. +import { describe, expect, it } from 'vitest'; +import { render } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useState } from 'octane'; +import { useForm } from '@tanstack/octane-form'; +import type { AnyFieldApi } from '@tanstack/octane-form'; + +const user = userEvent.setup(); + +describe('useField StrictMode divergences', () => { + it('should handle strict mode properly with conditional fields', async () => { + function FieldInfo({ field }: { field: AnyFieldApi }) { + return <> + {field.state.meta.isTouched && field.state.meta.errors.length + ? {field.state.meta.errors.join(',')} + : null} + {field.state.meta.isValidating ? 'Validating...' : null} + ; + } + + function Comp() { + const [showField, setShowField] = useState(true); + + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async () => {}, + }); + + return

+
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > +
+ {/* A type-safe field component*/} + {showField + ? (!value ? 'A first name is required' : undefined), + }} + children={(field) => { + // Avoid hasty abstractions. Render props are great! + return <> + + field.handleChange(e.target.value)} + /> + + ; + }} + /> + : null} +
+
+ <> + + field.handleChange(e.target.value)} + /> + + } + /> +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + + +
; + } + + const { getByText, findByText, queryByText } = render(); + + await user.click(getByText('Submit')); + expect(await findByText('A first name is required')).toBeInTheDocument(); + await user.click(getByText('Hide field')); + await user.click(getByText('Submit')); + expect(queryByText('A first name is required')).not.toBeInTheDocument(); + }); + + it('should handle deeply nested values', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: { first: 'Test', last: 'User' }, + }, + }); + + return

{field.state.value}

} />; + } + + const { queryByText, findByText } = render(); + + expect(queryByText('Test')).not.toBeInTheDocument(); + expect(await findByText('User')).toBeInTheDocument(); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/parity.tsrx b/packages/octane-form/tests/_fixtures/parity.tsrx new file mode 100644 index 000000000..56a5c3e7c --- /dev/null +++ b/packages/octane-form/tests/_fixtures/parity.tsrx @@ -0,0 +1,62 @@ +import { useForm } from '@tanstack/octane-form'; + +export function FormParity() @{ + const form = useForm({ + defaultValues: { + name: 'Ada', + tags: ['compiler'], + }, + }); + +
{ + event.preventDefault(); + void form.handleSubmit(); + }} + > + (value.length === 0 ? 'Name is required' : undefined), + }} + > + {(field) => } + + + + {(field) =>
+ + +
} +
+ + state.values}> + {(values) => {JSON.stringify(values)}} + + state.canSubmit}> + {(canSubmit) => } + + +
+} diff --git a/packages/octane-form/tests/_fixtures/server.tsrx b/packages/octane-form/tests/_fixtures/server.tsrx new file mode 100644 index 000000000..79e8a9959 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/server.tsrx @@ -0,0 +1,18 @@ +import { useForm } from '@tanstack/octane-form'; + +export function ServerForm() @{ + const form = useForm({ + defaultValues: { + name: 'Server Ada', + }, + }); + +
+ + {(field) => } + + state.values.name}> + {(name) => {name}} + +
+} diff --git a/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx b/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx new file mode 100644 index 000000000..1b96ec4f5 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx @@ -0,0 +1,961 @@ +// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. +import { describe, expect, it } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { formOptions } from '@tanstack/form-core'; +import userEvent from '@testing-library/user-event'; +import { createFormHook, createFormHookContexts, useStore } from '@tanstack/octane-form'; + +const user = userEvent.setup(); + +const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); + +function TextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); +} + +function SubscribeButton({ label }: { label: string }) { + const form = useFormContext(); + return ( + state.isSubmitting}> + {(isSubmitting) => } + + ); +} + +const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = createFormHook({ + fieldComponents: { + TextField, + }, + formComponents: { + SubscribeButton, + }, + fieldContext, + formContext, +}); + +describe('createFormHook', () => { + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + } + /> + + ); + } + + const { getByLabelText } = render(); + const input = getByLabelText('Testing'); + expect(input).toHaveValue('FirstName'); + }); + + it('should handle withForm types properly', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'John', + lastName: 'Doe', + }, + }); + + const ChildForm = withForm({ + ...formOpts, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ form, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('First Name'); + expect(input).toHaveValue('John'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should handle withFieldGroup types properly', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ group, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('First Name'); + expect(input).toHaveValue('John'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should use the correct field name in Field with withFieldGroup', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + people: [ + { + firstName: 'Jane', + lastName: 'Doe', + }, + { + firstName: 'Robert', + lastName: 'Doe', + }, + ], + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ } + /> + + + +
+ ); + }, + }); + const ChildFormAsArray = withFieldGroup({ + defaultValues: [formOpts.defaultValues.person], + props: { + title: '', + }, + render: ({ group, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ( + <> + + + + + ); + }; + + const { getByLabelText, getByText } = render(); + const inputField1 = getByLabelText('person.firstName'); + const inputArray = getByLabelText('people[0].firstName'); + const inputField2 = getByLabelText('people[1].firstName'); + expect(inputField1).toHaveValue('John'); + expect(inputArray).toHaveValue('Jane'); + expect(inputField2).toHaveValue('Robert'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should forward Field and Subscribe to the form', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ ( + + )} + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('person.firstName'); + expect(input).toHaveValue('John'); + expect(getByText('Doe')).toBeInTheDocument(); + }); + + it('should not lose focus on update with withFieldGroup', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: function Render({ group }) { + const firstName = useStore(group.store, (state) => state.values.firstName); + return ( +
+

{firstName}

+ ( + + )} + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByLabelText } = render(); + + const input = getByLabelText('person.firstName'); + input.focus(); + expect(input).toHaveFocus(); + + await user.clear(input); + await user.type(input, 'Something'); + + expect(input).toHaveFocus(); + }); + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render({ group }) { + return {(field) =>

{field.name}

}
; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + defaultValues, + }); + return ; + }; + + const { getByText } = render(); + + expect(getByText('form.field.firstName')).toBeInTheDocument(); + }); + + it('should allow mapping withFieldGroup to different values', () => { + const formOpts = formOptions({ + defaultValues: { + unrelated: 'John', + values: '', + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: { firstName: '', lastName: '' }, + render: ({ group }) => { + return ( +
+ } + /> +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ( + + ); + }; + + const { getByLabelText } = render(); + const inputField1 = getByLabelText('unrelated'); + expect(inputField1).toHaveValue('John'); + }); + + it('should remap FieldGroupApi.Field validators to the correct names', () => { + const FieldGroupString = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return ( + null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'account.password', + ]); + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'account.confirmPassword', + ]); + return <>; + }} + + ); + }, + }); + + const FieldGroupObject = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return ( + null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual(['userPassword']); + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'userConfirmPassword', + ]); + return <>; + }} + + ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + defaultValues: { + account: { + password: '', + confirmPassword: '', + }, + userPassword: '', + userConfirmPassword: '', + }, + }); + + return ( + <> + + + + ); + }; + + render(); + }); + + it('should accept formId and return it', async () => { + function Submit() { + const form = useFormContext(); + + return ( + + ); + } + + function Comp() { + const form = useAppForm({ + formId: 'test', + }); + + return ( + +
{ + e.preventDefault(); + form.handleSubmit(); + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => ( + {submissionAttempts} + )} + /> + + +
+ ); + } + + const { getByTestId } = render(); + const target = getByTestId('formId-target'); + const result = getByTestId('formId-result'); + + expect(target).toHaveAttribute('form', 'test'); + expect(target).toHaveTextContent('test'); + await user.click(target); + expect(result).toHaveTextContent('1'); + }); + + it('should allow using typed app form', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ( + } /> + ); + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + + + + ); + } + + const { getByLabelText } = render(); + const input = getByLabelText('Testing'); + expect(input).toHaveValue('FirstName'); + }); + + it('should throw if `useTypedAppFormContext` is used without AppForm', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ( + } /> + ); + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ; + } + + expect(() => render()).toThrow(); + }); + + it('should allow using typed app form with form components', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ; + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + + + + ); + } + + const { getByText } = render(); + const button = getByText('Testing'); + expect(button).toBeInTheDocument(); + }); + + describe('extendForm', () => { + it('should include both parent and extended field components', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }); + + return ( + <> + } + /> + } + /> + + ); + } + + const { getByLabelText, getByTestId } = render(); + expect(getByLabelText('First Name')).toHaveValue('John'); + expect(getByTestId('extended-input')).toHaveValue('Doe'); + }); + + it('should include both parent and extended form components', () => { + function ExtendedSubmit({ label }: { label: string }) { + const form = useFormContext(); + return ( + state.isSubmitting}> + {(isSubmitting) => ( + + )} + + ); + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + formComponents: { ExtendedSubmit }, + }); + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John' }, + }); + + return ( + + + + + ); + } + + const { getByText, getByTestId } = render(); + expect(getByText('Submit')).toBeInTheDocument(); + expect(getByTestId('extended-submit')).toHaveTextContent('Extended Submit'); + }); + + it('should support chaining multiple extendForm calls', () => { + function FieldA({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + function FieldB({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: {}, + fieldContext, + formContext, + }); + + const { useAppForm: useChainedForm } = base + .extendForm({ fieldComponents: { FieldA } }) + .extendForm({ fieldComponents: { FieldB } }); + + function Comp() { + const form = useChainedForm({ + defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, + }); + + return ( + <> + } /> + } /> + } /> + + ); + } + + const { getByLabelText } = render(); + expect(getByLabelText('A')).toHaveValue('valueA'); + expect(getByLabelText('B')).toHaveValue('valueB'); + expect(getByLabelText('C')).toHaveValue('valueC'); + }); + + it('should work with withForm after extendForm', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const { useAppForm: useExtendedForm, withForm: withExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + const ChildForm = withExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + render: function Render({ form }) { + return ( + <> + } + /> + } + /> + + ); + }, + }); + + function Parent() { + const form = useExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + }); + return ; + } + + const { getByLabelText } = render(); + expect(getByLabelText('First Name')).toHaveValue('Jane'); + expect(getByLabelText('Last Name')).toHaveValue('Smith'); + }); + + it('should return a new extendForm from the extended hook', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }); + + const extended = base.extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + // extendForm should itself expose extendForm + expect(typeof extended.extendForm).toBe('function'); + }); + }); + + it('should render FieldGroup Subscribe without selector (default identity)', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ ( + + )} + /> + ( + {state.values.lastName} + )} + /> +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByTestId } = render(); + const input = getByTestId('lastName'); + const stateLastName = getByTestId('state-lastName'); + + expect(stateLastName).toHaveTextContent('LastName'); + + await user.clear(input); + await user.type(input, 'Updated'); + await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx b/packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx new file mode 100644 index 000000000..1356974aa --- /dev/null +++ b/packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx @@ -0,0 +1,141 @@ +// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. +// OCTANE DIVERGENCE: upstream renders this sole scenario under . +// Octane has no StrictMode double-invoke, so this file stays ordinary coverage. +import { describe, expect, it, vi } from 'vitest'; +import { act, fireEvent, render } from '@octanejs/testing-library'; +import { useSelector } from '@tanstack/octane-store'; +import { useForm } from '@tanstack/octane-form'; +import { sleep } from '../../conformance/utils'; +import type { ReadonlyStore } from '@tanstack/octane-store'; + +function DebugSubscribe({ store }: { store: ReadonlyStore }) { + const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating); + return {String(isFieldsValidating)}; +} + +describe('Octane adapter - onChangeListenTo race', () => { + it('does not leave linked fields stuck in isValidating when multiple rapid updates occur', async () => { + vi.useFakeTimers(); + + const validationFn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + street: '', + houseNo: '', + zipCode: '', + city: '', + }, + }); + + return ( + <> + { + await sleep(500); + validationFn(); + return undefined; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> + {String(field.state.meta.isValidating)} +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + + {String(field.state.meta.isValidating)} + +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + + {String(field.state.meta.isValidating)} + +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + {String(field.state.meta.isValidating)} +
+ )} + /> + + + + ); + } + + const { getByTestId } = render(); + + const street = getByTestId('street') as HTMLInputElement; + const houseNo = getByTestId('houseNo') as HTMLInputElement; + const zipCode = getByTestId('zipCode') as HTMLInputElement; + const city = getByTestId('city') as HTMLInputElement; + + await act(async () => { + // Simulate rapid updates (autofill), then run debounce + async validation. + fireEvent.input(street, { target: { value: 'Foo Street' } }); + fireEvent.input(houseNo, { target: { value: '2' } }); + fireEvent.input(zipCode, { target: { value: '12345' } }); + fireEvent.input(city, { target: { value: 'Barrington' } }); + await vi.runAllTimersAsync(); + }); + + expect(validationFn).toHaveBeenCalledTimes(1); + + // Verify validation flags are not stuck + const isFieldsValidating = getByTestId('isFieldsValidating').textContent; + const streetValidating = getByTestId('street-validating').textContent; + const houseValidating = getByTestId('houseNo-validating').textContent; + const zipValidating = getByTestId('zipCode-validating').textContent; + const cityValidating = getByTestId('city-validating').textContent; + + expect(isFieldsValidating).toBe('false'); + expect(streetValidating).toBe('false'); + expect(houseValidating).toBe('false'); + expect(zipValidating).toBe('false'); + expect(cityValidating).toBe('false'); + + vi.useRealTimers(); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/upstream/useField.tsrx b/packages/octane-form/tests/_fixtures/upstream/useField.tsrx new file mode 100644 index 000000000..eb1688fa3 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/upstream/useField.tsrx @@ -0,0 +1,1512 @@ +// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. +import { describe, expect, it, vi } from 'vitest'; +import { render, waitFor, within } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useState } from 'octane'; +import { useStore } from '@tanstack/octane-store'; +import { useForm } from '@tanstack/octane-form'; +import { sleep } from '../../conformance/utils'; + +const user = userEvent.setup(); + +describe('useField', () => { + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + expect(input).toHaveValue('FirstName'); + }); + + it('should use field default value first', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + expect(input).toHaveValue('otherName'); + }); + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? error : undefined), + }} + children={(field) => ( +
+ + field.setValue(e.target.value, { + dontUpdateMeta: true, + }) + } + /> +

{field.getMeta().errors}

+
+ )} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + expect(queryByText(error)).not.toBeInTheDocument(); + }); + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? error : undefined), + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate on change and on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? onChangeError : undefined), + onBlur: ({ value }) => (value === 'other' ? onBlurError : undefined), + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + expect(queryByText(onBlurError)).toBeInTheDocument(); + }); + + it('should properly update conditionally rendered fields', async () => { + type FormValues = { + firstField: string; + secondField: string; + showFirstField: boolean; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstField: '', + secondField: '', + showFirstField: true, + } as FormValues, + }); + + return ( + <> + + {({ handleChange, state }) => ( +
+ Show first field + { + handleChange(e.target.checked); + }} + /> +
+ )} +
+ state.values.showFirstField}> + {(someFlagChecked) => { + if (someFlagChecked) { + return ( + + {({ handleChange, state }) => ( + + )} + + ); + } + + return ( + + {({ handleChange, state }) => ( + + )} + + ); + }} + + + ); + } + + const { getByTestId } = render(); + + const showFirstFieldInput = getByTestId('show-first-field'); + + await user.type(getByTestId('first-field'), 'hello'); + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); + + await user.click(showFirstFieldInput); + await user.type(getByTestId('second-field'), 'world'); + expect((getByTestId('second-field') as HTMLInputElement).value).toBe('world'); + + await user.click(showFirstFieldInput); + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); + }); + + it('should not keep hidden field submit errors after unmount', async () => { + const onSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: ({ value }) => onSubmit(value), + }); + + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + + state.values.firstName === 'a'}> + {(showLastName) => + showLastName ? ( + (value.length >= 5 ? undefined : 'lastName too short'), + }} + > + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + ) : null + } + + + [state.canSubmit, state.isSubmitting]}> + {([canSubmit, isSubmitting]) => ( + + )} + +
+ ); + } + + const { getByTestId, queryByTestId } = render(); + + const submitButton = getByTestId('submit'); + + await user.type(getByTestId('first-name'), 'a'); + await user.type(getByTestId('last-name'), 'abc'); + await user.click(submitButton); + + await waitFor(() => expect(submitButton).toBeDisabled()); + expect(onSubmit).toHaveBeenCalledTimes(0); + + await user.clear(getByTestId('first-name')); + await user.type(getByTestId('first-name'), 'b'); + + await waitFor(() => expect(queryByTestId('last-name')).not.toBeInTheDocument()); + await waitFor(() => expect(submitButton).toBeEnabled()); + + await user.click(submitButton); + await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)); + + await user.clear(getByTestId('first-name')); + await user.type(getByTestId('first-name'), 'a'); + + const remountedLastName = await waitFor(() => getByTestId('last-name')); + expect((remountedLastName as HTMLInputElement).value).toBe('abc'); + expect(submitButton).toBeEnabled(); + }); + + it('should call onUnmount listener when a field is conditionally removed', async () => { + const fieldUnmount = vi.fn(); + const formFieldUnmount = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + show: true, + name: 'test', + }, + listeners: { + onFieldUnmount: formFieldUnmount, + }, + }); + + return ( + <> + + {(field) => ( + field.handleChange(e.target.checked)} + /> + )} + + + s.values.show}> + {(show) => + show ? ( + + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + ) : null + } + + + ); + } + + const { getByTestId, queryByTestId } = render(); + + await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()); + + const callsBefore = fieldUnmount.mock.calls.length; + const formCallsBefore = formFieldUnmount.mock.calls.length; + + await user.click(getByTestId('toggle')); + + await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()); + expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1); + expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1); + }); + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + await sleep(10); + return error; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + await sleep(10); + return onChangeError; + }, + onBlurAsync: async () => { + await sleep(10); + return onBlurError; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(onChangeError)); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + await waitFor(() => getByText(onBlurError)); + expect(getByText(onBlurError)).toBeInTheDocument(); + }); + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + mockFn(); + await sleep(10); + return error; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errors}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + expect(mockFn).toHaveBeenCalledTimes(1); + }); + + it('should handle arrays with primitive values', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array, + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => { + return ( +
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ + +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => ( + + )} + /> + +
+ ); + } + + const { getByText, findByLabelText, queryByText, findByText } = render(); + + expect(queryByText('Name for person 0')).not.toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + await user.click(getByText('Add person')); + const input = await findByLabelText('Name for person 0'); + expect(input).toBeInTheDocument(); + await user.type(input, 'John'); + + await user.click(getByText('Add person')); + const input2 = await findByLabelText('Name for person 1'); + expect(input).toBeInTheDocument(); + await user.type(input2, 'Jack'); + + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).toBeInTheDocument(); + await user.click(getByText('Remove person 1')); + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + + await user.click(await findByText('Submit')); + expect(fn).toHaveBeenCalledWith({ people: ['John'] }); + }); + + it('should handle arrays with subvalues', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array<{ age: number; name: string }>, + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => { + return ( +
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ + +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => ( + + )} + /> + +
+ ); + } + + const { getByText, findByLabelText, queryByText, findByText } = render(); + + expect(queryByText('Name for person 0')).not.toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + await user.click(getByText('Add person')); + const input = await findByLabelText('Name for person 0'); + expect(input).toBeInTheDocument(); + await user.type(input, 'John'); + + await user.click(getByText('Add person')); + const input2 = await findByLabelText('Name for person 1'); + expect(input).toBeInTheDocument(); + await user.type(input2, 'Jack'); + + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).toBeInTheDocument(); + await user.click(getByText('Remove person 1')); + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + + await user.click(await findByText('Submit')); + expect(fn).toHaveBeenCalledWith({ people: [{ name: 'John', age: 0 }] }); + }); + + it('should not surface undefined for shifted items when a non-last stably-keyed array item is removed', async () => { + // Regression test for https://github.com/TanStack/form/issues/2238 + // When array items are keyed by a stable id (not index), removing a + // non-last item changes the `name` prop of the surviving items. The field + // must read state at its current `name` on that render, never `undefined`. + const observedValues: Array = []; + + function Comp() { + const form = useForm({ + defaultValues: { + sections: [] as Array<{ id: string; title: string }>, + }, + }); + + let nextId = 0; + + return ( + + {(field) => { + return ( +
+ {field.state.value.map((section, i) => { + return ( + + {(subField) => { + observedValues.push(subField.state.value); + return ( + + ); + }} + + ); + })} + + +
+ ); + }} +
+ ); + } + + const { getByText, findByLabelText } = render(); + + await user.click(getByText('Add section')); + await user.click(getByText('Add section')); + + await findByLabelText('Title for section id-1'); + await findByLabelText('Title for section id-2'); + + observedValues.length = 0; + await user.click(getByText('Remove first section')); + + // The surviving item (previously `sections[1]`) shifts to `sections[0]`. + // Its value must remain "Section 2" and never render as `undefined`. + const survivingInput = await findByLabelText('Title for section id-2'); + expect((survivingInput as HTMLInputElement).value).toBe('Section 2'); + expect(observedValues).not.toContain(undefined); + }); + + it('should handle sync linked fields', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + password: '', + confirm_password: '', + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+ + {(field) => { + return ( +
+ +
+ ); + }} +
+ { + if (value !== fieldApi.form.getFieldValue('password')) { + return 'Passwords do not match'; + } + return undefined; + }, + }} + > + {(field) => { + return ( +
+ + {field.state.meta.errors.map((err) => { + return
{err}
; + })} +
+ ); + }} +
+
+ ); + } + + const { findByLabelText, queryByText, findByText } = render(); + + const passwordInput = await findByLabelText('Password'); + const confirmPasswordInput = await findByLabelText('Confirm Password'); + await user.type(passwordInput, 'password'); + await user.type(confirmPasswordInput, 'password'); + expect(queryByText('Passwords do not match')).not.toBeInTheDocument(); + await user.type(confirmPasswordInput, '1'); + expect(await findByText('Passwords do not match')).toBeInTheDocument(); + }); + + it('should validate async on submit without debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 1000000, + onChangeAsync: async () => { + mockFn(); + await sleep(10); + return error; + }, + }, + }); + const errors = useStore(form.store, (s) => s.errors); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
+ )} + /> + + + ); + } + + const { getByRole, getByText } = render(); + await user.click(getByRole('button', { name: 'Submit' })); + + expect(mockFn).toHaveBeenCalledTimes(1); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate allow pushvalue to implicitly set a default value', async () => { + type Person = { + people: Array; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }); + + return ( + + {(field) => { + return ( +
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ ); + } + + const { getByText, queryByText } = render(); + expect(getByText('[]')).toBeInTheDocument(); + await user.click(getByText('Add person')); + expect(getByText(`[""]`)).toBeInTheDocument(); + }); + + it('should validate allow pushvalue to implicitly set a pushed default value', async () => { + type Person = { + people: Array; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }); + + return ( + + {(field) => { + return ( +
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ ); + } + + const { getByText, queryByText } = render(); + expect(getByText('[]')).toBeInTheDocument(); + await user.click(getByText('Add person')); + expect(getByText(`["Test"]`)).toBeInTheDocument(); + }); + + it('should handle removing element from array', async () => { + type Person = { + name: string; + id: number; + }; + + const fakePeople = { + jack: { + id: 5, + name: 'Jack', + }, + molly: { + id: 6, + name: 'Molly', + }, + george: { + id: 7, + name: 'George', + }, + } satisfies Record; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [fakePeople.jack, fakePeople.molly, fakePeople.george], + }, + }); + + return ( + + {(field) => { + return ( +
+
+ {field.state.value.map((item, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} +
+ +
+ ); + }} +
+ ); + } + + const { getByText, queryByText, getByTestId } = render(); + + let exisingPeople: Person[] = [fakePeople.jack, fakePeople.molly, fakePeople.george]; + exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); + const container = getByTestId('container'); + expect(within(container).getAllByRole('textbox')).toHaveLength(3); + + await user.click(getByText('Remove person')); + + expect(within(container).getAllByRole('textbox')).toHaveLength(2); + exisingPeople = [fakePeople.jack, fakePeople.george]; + exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); + expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument(); + }); + + it('should not rerender unrelated fields', async () => { + const renderCount = { + field1: 0, + field2: 0, + }; + + function Comp() { + const form = useForm({ + defaultValues: { + field1: '', + field2: '', + }, + }); + + return ( + <> + + {(field) => { + renderCount.field1++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + + {(field) => { + renderCount.field2++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + + ); + } + + const { getByTestId } = render(); + + const field1InitialRender = renderCount.field1; + const field2InitialRender = renderCount.field2; + + await user.type(getByTestId('field1'), 'test'); + + // field1 should have rerendered + expect(renderCount.field1).toBeGreaterThan(field1InitialRender); + // field2 should not have rerendered + expect(renderCount.field2).toBe(field2InitialRender); + }); + + it('should not rerender array field when child field value changes', async () => { + // Test for https://github.com/TanStack/form/issues/1925 + // Array fields should only re-render when the array length changes, + // not when a property on an array element is mutated + const renderCount = { + arrayField: 0, + childField: 0, + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }); + + return ( + + {(arrayField) => { + renderCount.arrayField++; + return ( +
+ {arrayField.state.value.map((_, i) => ( + + {(field) => { + if (i === 0) renderCount.childField++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + ))} + +
+ ); + }} +
+ ); + } + + const { getByTestId } = render(); + + const arrayFieldInitialRender = renderCount.arrayField; + const childFieldInitialRender = renderCount.childField; + + // Type into the first child field + await user.type(getByTestId('person-0'), 'ny'); + + // Child field should have rerendered + expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender); + // Array field should NOT have rerendered (this was the bug in #1925) + expect(renderCount.arrayField).toBe(arrayFieldInitialRender); + + // Verify typing still works + expect(getByTestId('person-0')).toHaveValue('Johnny'); + + // Now add a new item - this SHOULD trigger array field re-render + const arrayFieldBeforeAdd = renderCount.arrayField; + await user.click(getByTestId('add-person')); + + // Array field should have rerendered when length changes + expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd); + }); + + it('should rerender array field on swapFieldValues even when length is unchanged', async () => { + // swapFieldValues does not change array length but must still notify the + // parent array field so subscribers see the new order. + const renderCount = { arrayField: 0 }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }); + + return ( + + {(arrayField) => { + renderCount.arrayField++; + return ( +
+
    + {arrayField.state.value.map((person, i) => ( +
  1. + {person.name} +
  2. + ))} +
+ +
+ ); + }} +
+ ); + } + + const { getByTestId } = render(); + + expect(getByTestId('item-0')).toHaveTextContent('John'); + expect(getByTestId('item-1')).toHaveTextContent('Jane'); + + const before = renderCount.arrayField; + await user.click(getByTestId('swap')); + + expect(renderCount.arrayField).toBeGreaterThan(before); + expect(getByTestId('item-0')).toHaveTextContent('Jane'); + expect(getByTestId('item-1')).toHaveTextContent('John'); + }); + + it('should rerender array field when async defaultValues resolve', async () => { + // Regression test for https://github.com/TanStack/form/issues/2178 + // When async defaultValues arrive after initial render, array fields in + // mode="array" must re-render because _arrayVersion is used as the + // reactivity signal (not value length). + type Person = { name: string }; + type FormData = { people: Person[] }; + + function Comp({ defaultValues }: { defaultValues?: FormData }) { + const form = useForm({ defaultValues }); + + return ( + + {(field) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const val = field.state.value ?? []; + return ( +
    + {val.map((person, i) => ( +
  1. + {person.name} +
  2. + ))} +
+ ); + }} +
+ ); + } + + const { getByTestId, rerender } = render(); + expect(getByTestId('list').children).toHaveLength(0); + + rerender(); + await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)); + expect(getByTestId('item-0')).toHaveTextContent('Alice'); + }); + + it('should handle defaultValue without setstate-in-render error', async () => { + // Spy on console.error before rendering + const consoleErrorSpy = vi.spyOn(console, 'error'); + + function Comp() { + const form = useForm({ + defaultValues: { + fieldOne: '', + fieldTwo: '', + }, + }); + + const fieldOne = useStore(form.store, (state) => state.values.fieldOne); + + return ( +
+ { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + {fieldOne && ( + null} + /> + )} + + ); + } + + const { getByTestId } = render(); + await user.type(getByTestId('fieldOne'), 'John'); + + // Should not log an error + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + + it('should allow field-level defaultValue', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: undefined as string | undefined, + }, + }); + + return ( + + {(field) => { + expect(field.state.value).toEqual('a'); + return {field.state.value}; + }} + + ); + } + + const { queryByText } = render(); + + expect(queryByText('a')).toBeInTheDocument(); + expect(queryByText('never')).not.toBeInTheDocument(); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx b/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx new file mode 100644 index 000000000..a2e22e59c --- /dev/null +++ b/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx @@ -0,0 +1,1092 @@ +// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. +import { describe, expect, it, vi } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useStore } from '@tanstack/octane-store'; +import { useCallback, useEffect, useState } from 'octane'; +import { mergeForm, useForm } from '@tanstack/octane-form'; +import { sleep } from '../../conformance/utils'; + +const user = userEvent.setup(); + +describe('useForm', () => { + it('preserves field state', async () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: {} as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText('FirstName')).not.toBeInTheDocument(); + await user.type(input, 'FirstName'); + expect(input).toHaveValue('FirstName'); + }); + + it('should allow default values to be set', async () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return

{field.state.value}

; + }} + /> + + ); + } + + const { findByText, queryByText } = render(); + expect(await findByText('FirstName')).toBeInTheDocument(); + expect(queryByText('LastName')).not.toBeInTheDocument(); + }); + + it('should handle submitting properly', async () => { + function Comp() { + const [submittedData, setSubmittedData] = useState<{ + firstName: string; + } | null>(null); + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + onSubmit: ({ value }) => { + setSubmittedData(value); + }, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + placeholder={'First name'} + /> + ); + }} + /> + + {submittedData &&

Submitted data: {submittedData.firstName}

} + + ); + } + + const { findByPlaceholderText, getByText } = render(); + const input = await findByPlaceholderText('First name'); + await user.clear(input); + await user.type(input, 'OtherName'); + await user.click(getByText('Submit')); + await waitFor(() => expect(getByText('Submitted data: OtherName')).toBeInTheDocument()); + }); + + it('should run on form mount', async () => { + function Comp() { + const [formMounted, setFormMounted] = useState(false); + const [mountForm, setMountForm] = useState(false); + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + validators: { + onMount: () => { + setFormMounted(true); + return undefined; + }, + }, + }); + + return ( + <> + {mountForm ? ( + <> +

{formMounted ? 'Form mounted' : 'Not mounted'}

+ + ) : ( + + )} + + ); + } + + const { getByText } = render(); + await user.click(getByText('Mount form')); + await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()); + }); + + it('should validate async on change for the form', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange() { + return error; + }, + }, + }); + const onChangeError = useStore(form.store, (s) => s.errorMap.onChange); + return ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> +

{onChangeError?.toString()}

+ + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), + }, + }); + + const errors = useStore(form.store, (s) => s.errors); + return ( + <> + ( +
+ + field.setValue(e.target.value, { + dontUpdateMeta: true, + }) + } + /> +

{errors}

+
+ )} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + expect(queryByText(error)).not.toBeInTheDocument(); + }); + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), + }, + }); + const errors = useStore(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate on change and on blur', async () => { + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return onChangeError; + return undefined; + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return onBlurError; + return undefined; + }, + }, + }); + + const errors = useStore(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+
+ )} + /> + + ); + } + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + expect(queryByText(onBlurError)).toBeInTheDocument(); + }); + + it("should set field errors from the field's validators", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') + return { + form: 'Something went wrong', + fields: { + firstName: 'Please enter a different value (onChangeError)', + }, + }; + return undefined; + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return 'Please enter a different value (onBlurError)'; + return undefined; + }, + }, + }); + + const errors = useStore(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
+ )} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+ + ); + } + const { getByTestId } = render(); + + expect(getByTestId('form-onchange')).toHaveTextContent(''); + + const input = getByTestId('fieldinput'); + + await user.type(input, 'other'); + expect(getByTestId('form-onchange')).toHaveTextContent('Something went wrong'); + expect(getByTestId('field-onchange')).toHaveTextContent( + 'Please enter a different value (onChangeError)', + ); + + await user.click(document.body); + expect(getByTestId('form-onblur')).toHaveTextContent( + 'Please enter a different value (onBlurError)', + ); + }); + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10); + return error; + }, + }, + }); + const errors = useStore(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it("should set field errors from the form's onChangeAsync validator", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChangeAsync: async ({ value }) => { + await sleep(10); + if (value.firstName === 'other') { + return { + form: 'Invalid form values', + fields: { + firstName: 'First name cannot be "other"', + }, + }; + } + return null; + }, + }, + }); + + const errors = useStore(form.store, (s) => s.errorMap); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
+ )} + /> +

{errors.onChange?.toString()}

+ + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + const firstNameErrorElement = getByTestId('field-error'); + const formErrorElement = getByTestId('form-error'); + + expect(firstNameErrorElement).toBeEmptyDOMElement(); + expect(formErrorElement).toBeEmptyDOMElement(); + + await user.type(input, 'other'); + + await waitFor(() => { + expect(firstNameErrorElement).not.toBeEmptyDOMElement(); + }); + expect(firstNameErrorElement).toHaveTextContent('First name cannot be "other"'); + expect(formErrorElement).toHaveTextContent('Invalid form values'); + }); + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10); + return onChangeError; + }, + onBlurAsync: async () => { + await sleep(10); + return onBlurError; + }, + }, + }); + const errors = useStore(form.store, (s) => s.errorMap); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(onChangeError)); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + await waitFor(() => getByText(onBlurError)); + expect(getByText(onBlurError)).toBeInTheDocument(); + }); + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 100, + onChangeAsync: async () => { + mockFn(); + await sleep(10); + return error; + }, + }, + }); + const errors = useStore(form.store, (s) => s.errors); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + expect(mockFn).toHaveBeenCalledTimes(1); + }); + + it("should set errors on the fields from the form's onChange validator", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'Tom') { + return { + form: 'Something went wrong', + fields: { firstName: 'Please enter a different value' }, + }; + } + return null; + }, + }, + }); + + const onChangeError = useStore(form.store, (s) => s.errorMap.onChange); + + return ( + <> + ( + <> + field.handleChange(e.target.value)} + /> + +

{field.state.meta.errors.join('')}

+ + )} + /> +

{onChangeError?.toString()}

+ + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + const fieldError = getByTestId('field-error'); + const formError = getByTestId('form-error'); + + expect(queryByText('Please enter a different value')).not.toBeInTheDocument(); + expect(queryByText('Something went wrong')).not.toBeInTheDocument(); + + await user.type(input, 'Tom'); + await waitFor(() => expect(fieldError.textContent).toBe('Please enter a different value')); + await waitFor(() => expect(formError.textContent).toBe('Something went wrong')); + }); + + it('should not cause infinite re-renders when listening to state.errors', () => { + const fn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value); + }, + }); + + const { errors } = useStore(form.store, (state) => ({ + errors: state.errors, + })); + + useEffect(() => { + fn(errors); + }, [errors]); + + return null; + } + + render(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('should not cause infinite re-renders when listening to state', () => { + const fn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value); + }, + }); + + const { values } = useStore(form.store, (v) => v); + + useEffect(() => { + fn(values); + }, [values]); + + return null; + } + + render(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('form should reset default value when resetting in onSubmit', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + }, + onSubmit: ({ value }) => { + expect(value).toEqual({ name: 'another-test' }); + + form.reset(value); + }, + }); + + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + + + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + const submit = getByTestId('submit'); + const reset = getByTestId('reset'); + + await user.type(input, 'test'); + await waitFor(() => expect(input).toHaveValue('test')); + + await user.click(reset); + await waitFor(() => expect(input).toHaveValue('')); + + await user.type(input, 'another-test'); + await user.click(submit); + await waitFor(() => expect(input).toHaveValue('another-test')); + }); + + it('should accept formId and return it', async () => { + function Comp() { + const form = useForm({ + formId: 'test', + }); + + return ( + <> +
{ + e.preventDefault(); + form.handleSubmit(); + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => ( + {submissionAttempts} + )} + /> + + + + ); + } + + const { getByTestId } = render(); + const target = getByTestId('formId-target'); + const result = getByTestId('formId-result'); + + expect(target).toHaveAttribute('form', 'test'); + expect(target).toHaveTextContent('test'); + await user.click(target); + expect(result).toHaveTextContent('1'); + }); + + it('should allow custom component keys for arrays', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + foo: [ + { name: 'nameA', id: 'a' }, + { name: 'nameB', id: 'b' }, + { name: 'nameC', id: 'c' }, + ], + }, + }); + + return ( + <> + + {(arrayField) => + arrayField.state.value.map((_, i) => ( + + {(field) => { + expect(field.name).toBe(`foo[${i}].name`); + expect(field.state.value).not.toBeUndefined(); + return null; + }} + + )) + } + + + + ); + } + + const { getByTestId } = render(); + + const target = getByTestId('removeField'); + await user.click(target); + }); + + it('should not error when using deleteField in edge cases', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + const fields: Record = {}; + + if (value.firstName.length === 0) { + fields.firstName = 'Last Name is required'; + } + + return { fields }; + }, + }, + }); + + return ( +
{ + e.preventDefault(); + form.handleSubmit(); + }} + > +

Personal Information

+ ( + field.handleChange(e.target.value)} + /> + )} + /> + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + ); + } + + const { getByTestId } = render(); + const removeButton = getByTestId('remove'); + const input = getByTestId('input'); + + await user.type(input, 'a'); + await user.click(removeButton); + }); + + it('should handle stable transforms to update the base form on first render', async () => { + let renders = 0; + function Comp() { + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: 'What', + }, + }); + }, []), + }); + + renders++; + + return ( + ( +

+ {field.state.value} {renders} +

+ )} + /> + ); + } + + const { getByText } = render(); + getByText('What 1'); + }); + + it('should handle stable transforms to update the base form on subsequent renders', async () => { + function Comp() { + const [renders, setRenders] = useState(0); + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback( + (baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: renders === 0 ? 'First' : 'Another', + }, + }); + }, + [renders], + ), + }); + + return ( +
+

{field.state.value}

} /> + +
+ ); + } + + const { findByText, getByText } = render(); + await findByText('First'); + await user.click(getByText('Rerender')); + await findByText('Another'); + }); + + it('should render Subscribe without selector (default identity)', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: 'test', + }, + }); + + return ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> + + {state.values.name}} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('input'); + const stateValue = getByTestId('state-value'); + + expect(stateValue).toHaveTextContent('test'); + + await user.clear(input); + await user.type(input, 'updated'); + await waitFor(() => expect(stateValue).toHaveTextContent('updated')); + }); +}); diff --git a/packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx b/packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx new file mode 100644 index 000000000..130365a14 --- /dev/null +++ b/packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx @@ -0,0 +1,317 @@ +// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. +import { describe, expect, it, vi } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useForm } from '@tanstack/octane-form'; + +const user = userEvent.setup(); + +describe('form.FormGroup', () => { + it('should call onGroupSubmit but not the form onSubmit when submitting the group', async () => { + const onSubmit = vi.fn(); + const onGroupSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + onSubmit, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onSubmit).not.toHaveBeenCalled(); + }); + + it('should expose group state value reactively', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'initial' }, + step2: { name: 'other' }, + }, + }); + + return ( + + {(group) => ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> +
{JSON.stringify(group.state.value)}
+ + )} +
+ ); + } + + const { getByTestId } = render(); + expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}'); + + await user.clear(getByTestId('step1-name')); + await user.type(getByTestId('step1-name'), 'updated'); + + await waitFor(() => expect(getByTestId('group-value').textContent).toBe('{"name":"updated"}')); + }); + + it('should call onGroupSubmitInvalid when group-level validation fails', async () => { + const onSubmit = vi.fn(); + const onGroupSubmit = vi.fn(); + const onGroupSubmitInvalid = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { name: 'test2' }, + }, + onSubmit, + }); + + return ( + (!value.name ? 'Name is required' : undefined), + }} + onGroupSubmit={onGroupSubmit} + onGroupSubmitInvalid={onGroupSubmitInvalid} + > + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + +
+								{String(group.state.meta.errorMap.onSubmit ?? '')}
+							
+ + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)); + expect(onGroupSubmit).not.toHaveBeenCalled(); + expect(onSubmit).not.toHaveBeenCalled(); + await waitFor(() => expect(getByTestId('group-error').textContent).toBe('Name is required')); + }); + + it('should ignore form-level field errors outside the group when submitting the group', async () => { + const onGroupSubmit = vi.fn(); + const onGroupSubmitInvalid = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + validators: { + onSubmit: () => ({ + fields: { + 'step2.name': 'Required', + }, + }), + }, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onGroupSubmitInvalid).not.toHaveBeenCalled(); + }); + + it('should pass submit meta through handleSubmit', async () => { + const onGroupSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + + {(group) => ( + + )} + + ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onGroupSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + value: { name: 'test' }, + meta: { source: 'button' }, + }), + ); + }); + + it('should rerender group.state.meta.isSubmitting during an async submit', async () => { + let resolveSubmit!: () => void; + const onGroupSubmit = vi.fn( + () => + new Promise((resolve) => { + resolveSubmit = resolve; + }), + ); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + void group.handleSubmit(); + }} + > + +
+ )} +
+ ); + } + + const { getByTestId } = render(); + const button = getByTestId('submit-group') as HTMLButtonElement; + expect(button.textContent).toBe('Continue'); + expect(button.disabled).toBe(false); + + await user.click(button); + + await waitFor(() => expect(button.textContent).toBe('Saving...')); + expect(button.disabled).toBe(true); + + resolveSubmit(); + + await waitFor(() => expect(button.textContent).toBe('Continue')); + expect(button.disabled).toBe(false); + expect(onGroupSubmit).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/octane-form/tests/conformance/createFormHook.test.ts b/packages/octane-form/tests/conformance/createFormHook.test.ts new file mode 100644 index 000000000..cf810b354 --- /dev/null +++ b/packages/octane-form/tests/conformance/createFormHook.test.ts @@ -0,0 +1,2 @@ +// The renderer-bearing upstream suite lives in a TSRX fixture module. +import '../_fixtures/upstream/createFormHook.tsrx'; diff --git a/packages/octane-form/tests/conformance/divergences.test.ts b/packages/octane-form/tests/conformance/divergences.test.ts new file mode 100644 index 000000000..5cc7956cf --- /dev/null +++ b/packages/octane-form/tests/conformance/divergences.test.ts @@ -0,0 +1,28 @@ +import { renderHook } from '@octanejs/testing-library'; +import { describe, expect, it } from 'vitest'; +import { useForm } from '../../src/index'; +import { + renderNativeEventForm, + renderRegisteredFieldComponent, +} from '../_fixtures/divergences.tsrx'; + +describe('@tanstack/octane-form documented divergences', () => { + it('keeps the generated form identity stable across rerenders', () => { + const { result, rerender } = renderHook(() => useForm({ defaultValues: { name: '' } })); + const initial = result.current.formId; + rerender(); + expect(initial).toBeTruthy(); + expect(result.current.formId).toBe(initial); + }); + + it('registers and renders callable Octane field components', () => { + expect(renderRegisteredFieldComponent()).toHaveValue('Ada'); + }); + + it('receives the native input event while updating field state', () => { + const { input, observedEvent } = renderNativeEventForm(); + expect(observedEvent).toBeInstanceOf(Event); + expect('nativeEvent' in observedEvent!).toBe(false); + expect(input).toHaveValue('Grace'); + }); +}); diff --git a/packages/octane-form/tests/conformance/exports.test.ts b/packages/octane-form/tests/conformance/exports.test.ts new file mode 100644 index 000000000..3b4319a0e --- /dev/null +++ b/packages/octane-form/tests/conformance/exports.test.ts @@ -0,0 +1,9 @@ +import { describe, expect, it } from 'vitest'; +import { useSelector, useStore } from '@tanstack/octane-form'; + +describe('package exports', () => { + it('exports useSelector and useStore from @tanstack/octane-store', () => { + expect(useSelector).toBeTypeOf('function'); + expect(useStore).toBeTypeOf('function'); + }); +}); diff --git a/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts b/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts new file mode 100644 index 000000000..c4377801a --- /dev/null +++ b/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts @@ -0,0 +1,2 @@ +// The renderer-bearing upstream suite lives in a TSRX fixture module. +import '../_fixtures/upstream/onChangeListenTo.adapter.tsrx'; diff --git a/packages/octane-form/tests/conformance/parity.test.ts b/packages/octane-form/tests/conformance/parity.test.ts new file mode 100644 index 000000000..5c10bf496 --- /dev/null +++ b/packages/octane-form/tests/conformance/parity.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest'; +import * as binding from '@tanstack/octane-form'; + +describe('export surface', () => { + it('provides every runtime export of real @tanstack/react-form', async () => { + const real = await import('@tanstack/react-form'); + expect(Object.keys(binding).sort()).toEqual(Object.keys(real).sort()); + }); + + it('re-exports the same @tanstack/form-core module instance', async () => { + const core = await import('@tanstack/form-core'); + expect(binding.FormApi).toBe(core.FormApi); + expect(binding.FieldApi).toBe(core.FieldApi); + expect(binding.formOptions).toBe(core.formOptions); + }); + + it('uses the Octane TanStack Store adapter', async () => { + const store = await import('@tanstack/octane-store'); + expect(binding.useSelector).toBe(store.useSelector); + expect(binding.useStore).toBe(store.useStore); + }); +}); diff --git a/packages/octane-form/tests/conformance/repo-regressions.test.ts b/packages/octane-form/tests/conformance/repo-regressions.test.ts new file mode 100644 index 000000000..e1c1073dd --- /dev/null +++ b/packages/octane-form/tests/conformance/repo-regressions.test.ts @@ -0,0 +1,21 @@ +// Ordinary repository-authored regressions; not react-parity owned. +import '../_fixtures/ordinary/repo-regressions.tsrx'; +import { expect, it } from 'vitest'; +import { FieldApi, FormApi } from '@tanstack/octane-form'; + +it('deleting a field preserves a mounted sibling whose name shares its prefix', () => { + const form = new FormApi({ defaultValues: { name: 'Ada', nameSuffix: 'Lovelace' } }); + const unmountForm = form.mount(); + const sibling = new FieldApi({ form, name: 'nameSuffix' }); + const unmountSibling = sibling.mount(); + try { + form.deleteField('name'); + expect(form.getFieldValue('name')).toBeUndefined(); + expect(form.getFieldValue('nameSuffix')).toBe('Lovelace'); + sibling.handleChange('Byron'); + expect(form.getFieldValue('nameSuffix')).toBe('Byron'); + } finally { + unmountSibling(); + unmountForm(); + } +}); diff --git a/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts b/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts new file mode 100644 index 000000000..a35b76656 --- /dev/null +++ b/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts @@ -0,0 +1,2 @@ +// Ordinary StrictMode-divergence coverage; not react-parity owned. +import '../_fixtures/ordinary/strict-mode-divergences.tsrx'; diff --git a/packages/octane-form/tests/conformance/test-setup.ts b/packages/octane-form/tests/conformance/test-setup.ts new file mode 100644 index 000000000..0593c6c33 --- /dev/null +++ b/packages/octane-form/tests/conformance/test-setup.ts @@ -0,0 +1,21 @@ +import '@testing-library/jest-dom/vitest'; +import { cleanup } from '@octanejs/testing-library'; +import { + getIsOctaneActEnvironment, + setOctaneActEnvironment, +} from '@octanejs/testing-library/act-environment'; +import { afterAll, afterEach, beforeAll } from 'vitest'; + +// https://testing-library.com/docs/react-testing-library/api#cleanup +afterEach(() => cleanup()); + +let previousIsActEnvironment: boolean | undefined; + +beforeAll(() => { + previousIsActEnvironment = getIsOctaneActEnvironment(); + setOctaneActEnvironment(true); +}); + +afterAll(() => { + setOctaneActEnvironment(previousIsActEnvironment); +}); diff --git a/packages/octane-form/tests/conformance/useField.test.ts b/packages/octane-form/tests/conformance/useField.test.ts new file mode 100644 index 000000000..7eb5dceb5 --- /dev/null +++ b/packages/octane-form/tests/conformance/useField.test.ts @@ -0,0 +1,2 @@ +// The renderer-bearing upstream suite lives in a TSRX fixture module. +import '../_fixtures/upstream/useField.tsrx'; diff --git a/packages/octane-form/tests/conformance/useForm.test.ts b/packages/octane-form/tests/conformance/useForm.test.ts new file mode 100644 index 000000000..122b62ea4 --- /dev/null +++ b/packages/octane-form/tests/conformance/useForm.test.ts @@ -0,0 +1,2 @@ +// The renderer-bearing upstream suite lives in a TSRX fixture module. +import '../_fixtures/upstream/useForm.tsrx'; diff --git a/packages/octane-form/tests/conformance/useFormGroup.test.ts b/packages/octane-form/tests/conformance/useFormGroup.test.ts new file mode 100644 index 000000000..9a570de11 --- /dev/null +++ b/packages/octane-form/tests/conformance/useFormGroup.test.ts @@ -0,0 +1,2 @@ +// The renderer-bearing upstream suite lives in a TSRX fixture module. +import '../_fixtures/upstream/useFormGroup.tsrx'; diff --git a/packages/octane-form/tests/conformance/utils.ts b/packages/octane-form/tests/conformance/utils.ts new file mode 100644 index 000000000..863f489f4 --- /dev/null +++ b/packages/octane-form/tests/conformance/utils.ts @@ -0,0 +1,5 @@ +export function sleep(timeout: number): Promise { + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout); + }); +} diff --git a/packages/octane-form/tests/differential/.gitignore b/packages/octane-form/tests/differential/.gitignore new file mode 100644 index 000000000..e74e7ec30 --- /dev/null +++ b/packages/octane-form/tests/differential/.gitignore @@ -0,0 +1 @@ +.react-cache/ diff --git a/packages/octane-form/tests/differential/_setup.ts b/packages/octane-form/tests/differential/_setup.ts new file mode 100644 index 000000000..6004c2ce5 --- /dev/null +++ b/packages/octane-form/tests/differential/_setup.ts @@ -0,0 +1,51 @@ +import { compile as compileToReact } from '@tsrx/react'; +import { transformSync } from 'esbuild'; +import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { basename, dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const fixtureDirectory = join(dirname(fileURLToPath(import.meta.url)), '../_fixtures'); +const cacheDirectory = join(dirname(fileURLToPath(import.meta.url)), '.react-cache'); + +function hashString(value: string): string { + let hash = 5381; + for (let index = 0; index < value.length; index++) { + hash = ((hash << 5) + hash + value.charCodeAt(index)) | 0; + } + return Math.abs(hash).toString(36); +} + +function compileFixture(sourcePath: string): void { + const compiled = compileToReact(readFileSync(sourcePath, 'utf8'), sourcePath); + if (compiled.errors?.length) { + throw new Error(`Unable to compile ${sourcePath} for React:\n${compiled.errors.join('\n')}`); + } + + const transformed = transformSync(compiled.code, { + loader: 'tsx', + jsx: 'automatic', + jsxImportSource: 'react', + target: 'esnext', + format: 'esm', + sourcefile: sourcePath, + }); + const rewritten = transformed.code + .replace( + /from\s+["']@octanejs\/tanstack-form(\/[^"']*)?["']/g, + (_match, subpath) => `from "@tanstack/react-form${subpath || ''}"`, + ) + .replace(/from\s+["']octane["']/g, 'from "react"'); + const slug = basename(sourcePath).replace(/\.tsrx$/, ''); + writeFileSync(join(cacheDirectory, `${slug}-${hashString(sourcePath)}.js`), rewritten); +} + +export async function setup(): Promise { + rmSync(cacheDirectory, { recursive: true, force: true }); + mkdirSync(cacheDirectory, { recursive: true }); + const fixture = join(fixtureDirectory, 'parity.tsrx'); + if (!existsSync(fixture)) + throw new Error(`Missing declared TanStack Form parity fixture: ${fixture}`); + compileFixture(fixture); +} + +export async function teardown(): Promise {} diff --git a/packages/octane-form/tests/differential/parity.test.ts b/packages/octane-form/tests/differential/parity.test.ts new file mode 100644 index 000000000..846562d87 --- /dev/null +++ b/packages/octane-form/tests/differential/parity.test.ts @@ -0,0 +1,41 @@ +import { resolve } from 'node:path'; +import { describe, it } from 'vitest'; +import { + mountDifferential, + preloadDifferentialFixture, +} from '../../../octane/tests/differential/_rig.js'; + +const fixture = resolve(__dirname, '../_fixtures/parity.tsrx'); +const cache = resolve(__dirname, '.react-cache'); + +await Promise.all([preloadDifferentialFixture(fixture, cache)]); + +describe('differential: @tanstack/octane-form vs @tanstack/react-form', () => { + // @parity-case differential:tanstack-form-interactions + it('matches values, validation, arrays, and reset', async () => { + const differential = await mountDifferential(fixture, 'FormParity', undefined, cache); + + await differential.step('mount', () => {}); + await differential.step('validate an empty name', async (octane, react) => { + await octane.input('#name', ''); + await react.input('#name', ''); + }); + await differential.step('enter a valid name', async (octane, react) => { + await octane.input('#name', 'Grace'); + await react.input('#name', 'Grace'); + }); + await differential.step('push an array value', async (octane, react) => { + await octane.click('#push'); + await react.click('#push'); + }); + await differential.step('pop an array value', async (octane, react) => { + await octane.click('#pop'); + await react.click('#pop'); + }); + await differential.step('reset', async (octane, react) => { + await octane.click('#reset'); + await react.click('#reset'); + }); + differential.unmount(); + }); +}); diff --git a/packages/octane-form/tests/ssr/server.test.ts b/packages/octane-form/tests/ssr/server.test.ts new file mode 100644 index 000000000..3d9b1a37c --- /dev/null +++ b/packages/octane-form/tests/ssr/server.test.ts @@ -0,0 +1,16 @@ +import { describe, expect, it } from 'vitest'; +import { renderToStaticMarkup } from 'octane/server'; +import { ServerForm } from '../_fixtures/server.tsrx'; + +describe('@tanstack/octane-form SSR', () => { + it('renders field and form snapshots without a DOM', () => { + expect(typeof document).toBe('undefined'); + + const { html, css } = renderToStaticMarkup(ServerForm); + + expect(html).toBe( + '
Server Ada
', + ); + expect(css).toBe(''); + }); +}); diff --git a/packages/octane-form/tsconfig.json b/packages/octane-form/tsconfig.json new file mode 100644 index 000000000..f0bda23c9 --- /dev/null +++ b/packages/octane-form/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "esnext", + "lib": ["esnext", "dom", "dom.iterable"], + "target": "esnext", + "jsx": "react-jsx", + "noEmit": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "noEmitOnError": true, + "noErrorTruncation": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "types": ["node"], + "strict": true, + "jsxImportSource": "octane" + }, + "include": ["./src/"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/packages/octane-form/typetests/createFormHook.test-d.tsx b/packages/octane-form/typetests/createFormHook.test-d.tsx new file mode 100644 index 000000000..726c5859b --- /dev/null +++ b/packages/octane-form/typetests/createFormHook.test-d.tsx @@ -0,0 +1,1044 @@ +import { describe, expectTypeOf, it } from 'vitest'; +import { formOptions } from '@tanstack/form-core'; +import { createFormHook, createFormHookContexts } from '../src'; + +declare global { + namespace JSX { + type Element = unknown; + + interface ElementClass { + [name: string]: unknown; + } + + interface ElementChildrenAttribute { + children: {}; + } + + interface IntrinsicAttributes { + key?: unknown; + } + + interface IntrinsicElements { + [name: string]: any; + } + } +} + +const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); + +function Test() { + return null; +} + +class ClassComponent { + render() { + return null; + } +} + +createFormHook({ + fieldComponents: { + // @ts-expect-error Octane component registration accepts callable function components only. + ClassComponent, + }, + formComponents: {}, + fieldContext, + formContext, +}); + +const { useAppForm, withForm, withFieldGroup } = createFormHook({ + fieldComponents: { + Test, + }, + formComponents: { + Test, + }, + fieldContext, + formContext, +}); + +describe('createFormHook', () => { + it('should not break with an infinite type on large schemas', () => { + const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const; + type ActivityKind0 = (typeof ActivityKind0_Names)[number]; + + enum DayOfWeek { + Monday = 1, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, + } + + interface Branding { + __type?: Brand; + } + type Branded = T & Branding; + type ActivityId = Branded; + interface ActivitySelectorFormData { + includeAll: boolean; + includeActivityIds: ActivityId[]; + includeActivityKinds: Set; + excludeActivityIds: ActivityId[]; + } + + const GeneratedTypes0Visibility_Names = ['Normal', 'Advanced', 'Hidden'] as const; + type GeneratedTypes0Visibility = (typeof GeneratedTypes0Visibility_Names)[number]; + interface FormValuesBase { + key: string; + visibility: GeneratedTypes0Visibility; + } + + interface ActivityCountFormValues extends FormValuesBase { + _type: 'ActivityCount'; + activitySelector: ActivitySelectorFormData; + daysOfWeek: DayOfWeek[]; + label: string; + } + + interface PlanningTimesFormValues extends FormValuesBase { + _type: 'PlanningTimes'; + showTarget: boolean; + showPlanned: boolean; + showDiff: boolean; + } + + type EditorValues = ActivityCountFormValues | PlanningTimesFormValues; + interface EditorFormValues { + editors: Record; + ordering: string[]; + } + + const ExampleUsage = withForm({ + props: { + initialValues: '' as keyof EditorFormValues['editors'], + }, + defaultValues: {} as EditorFormValues, + render: ({ form, initialValues }) => { + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend(); + return null; + }} + + + + +
+ ); + }, + }); + + const ExampleUsage2 = withFieldGroup({ + defaultValues: {} as EditorValues, + render: ({ group }) => { + const test = group.state.values.key; + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend(); + return null; + }} + + + + +
+ ); + }, + }); + }); + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + render: ({ form }) => { + expectTypeOf(form.state.values).toEqualTypeOf(); + return ; + }, + }); + }); + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + render: ({ form }) => { + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: { test: string }): Promise; + }>; + return ; + }, + }); + }); + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string; + lastName: string; + }; + + type PersonWithAge = Person & { + age: number; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + render: ({ form }) => { + expectTypeOf(form.state.values).toExtend(); + return ; + }, + }); + }); + + it('withForm props should be properly inferred', () => { + const WithFormComponent = withForm({ + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + children?: unknown; + }>(); + + return ; + }, + }); + }); + + it('component made from withForm should have its props properly typed', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }); + + const appForm = useAppForm(formOpts); + + const WithFormComponent = withForm({ + ...formOpts, + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + }>(); + return ; + }, + }); + + const CorrectComponent = ; + + // @ts-expect-error Missing required props prop1 and prop2 + const MissingPropsComponent = ; + + const incorrectFormOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + firstNameWrong: 'FirstName', + lastNameWrong: 'LastName', + }, + }); + + const incorrectAppForm = useAppForm(incorrectFormOpts); + + const IncorrectFormOptsComponent = ( + // @ts-expect-error Incorrect form opts + + ); + }); + + it('should infer subset values and props when calling withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type ComponentProps = { + prop1: string; + prop2: number; + }; + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + }; + + const FormGroupComponent = withFieldGroup({ + defaultValues, + render: function Render({ group, children, ...props }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf(); + expectTypeOf(group.state.values.lastName).toEqualTypeOf(); + + expectTypeOf(group.state.values).toEqualTypeOf(); + expectTypeOf(children).toEqualTypeOf(); + expectTypeOf(props).toEqualTypeOf<{}>(); + return ; + }, + }); + + const FormGroupComponentWithProps = withFieldGroup({ + ...defaultValues, + props: {} as ComponentProps, + render: ({ group, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + }>(); + return ; + }, + }); + }); + + it('should allow spreading formOptions when calling withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const defaultValues: Person = { + firstName: '', + lastName: '', + }; + const formOpts = formOptions({ + defaultValues, + validators: { + onChange: () => 'Error', + }, + listeners: { + onBlur: () => 'Something', + }, + asyncAlways: true, + asyncDebounceMs: 500, + }); + + // validators and listeners are ignored, only defaultValues is acknowledged + const FormGroupComponent = withFieldGroup({ + ...formOpts, + render: function Render({ group }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf(); + expectTypeOf(group.state.values.lastName).toEqualTypeOf(); + return ; + }, + }); + + const noDefaultValuesFormOpts = formOptions({ + onSubmitMeta: { foo: '' }, + }); + + const UnknownFormGroupComponent = withFieldGroup({ + ...noDefaultValuesFormOpts, + render: function Render({ group }) { + // group.state.values can be anything. + // note that T extends unknown !== unknown extends T. + expectTypeOf().toExtend(); + + // either no submit meta or of the type in formOptions + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [{ foo: string }]>(); + return ; + }, + }); + }); + + it('should allow passing compatible forms to withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type ComponentProps = { + prop1: string; + prop2: number; + }; + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + }; + + const FormGroup = withFieldGroup({ + defaultValues, + props: {} as ComponentProps, + render: () => { + return <>; + }, + }); + + const equalAppForm = useAppForm({ + defaultValues, + }); + + // ----------------- + // Assert that an equal form is not compatible as you have no name to pass + const NoSubfield = ( + + ); + + // ----------------- + // Assert that a form extending Person in a property is allowed + + const extendedAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, address: '' }, address: '' }, + }); + // While it has other properties, it satisfies defaultValues + const CorrectComponent1 = ( + + ); + + const MissingProps = ( + // @ts-expect-error because prop1 and prop2 are not added + + ); + + // ----------------- + // Assert that a form not satisfying Person errors + const incompatibleAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, lastName: 0 } }, + }); + const IncompatibleComponent = ( + + ); + }); + + it('should require strict equal submitMeta if it is set in withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type SubmitMeta = { + correct: string; + }; + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } as Person, + }; + const onSubmitMeta: SubmitMeta = { + correct: 'Prop', + }; + + const FormLensNoMeta = withFieldGroup({ + defaultValues: {} as Person, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit(); + + // To prevent unwanted meta behaviour, handleSubmit's meta should be never if not set. + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [submitMeta: never]>(); + + return ; + }, + }); + + const FormGroupWithMeta = withFieldGroup({ + defaultValues: {} as Person, + onSubmitMeta, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit(); + + // This matches the value + group.handleSubmit({ correct: '' }); + + // This does not. + // @ts-expect-error + group.handleSubmit({ wrong: 'Meta' }); + + return ; + }, + }); + + const noMetaForm = useAppForm({ + defaultValues, + }); + + const CorrectComponent1 = ; + + const WrongComponent1 = ( + + ); + + const metaForm = useAppForm({ + defaultValues, + onSubmitMeta, + }); + + const CorrectComponent2 = ; + const CorrectComponent3 = ; + + const diffMetaForm = useAppForm({ + defaultValues, + onSubmitMeta: { ...onSubmitMeta, something: 'else' }, + }); + + const CorrectComponent4 = ; + const WrongComponent2 = ( + + ); + }); + + it('should accept any validators for withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } satisfies Person, + }; + + const formA = useAppForm({ + defaultValues, + validators: { + onChange: () => 'A', + }, + listeners: { + onChange: () => 'A', + }, + }); + const formB = useAppForm({ + defaultValues, + validators: { + onChange: () => 'B', + }, + listeners: { + onChange: () => 'B', + }, + }); + + const FormGroup = withFieldGroup({ + defaultValues: defaultValues.person, + render: function Render({ group }) { + return ; + }, + }); + + const CorrectComponent1 = ; + const CorrectComponent2 = ; + }); + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const form = useAppForm({ + defaultValues, + }); + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <>; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ +
+ ); + }, + }); + + const Component = ; + }); + + it('should not allow withFieldGroups with different metas to be nested', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const LensNestedNoMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <>; + }, + }); + const LensNestedWithMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + onSubmitMeta: { meta: '' }, + render: function Render() { + return <>; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ + +
+ ); + }, + }); + + it('should allow mapping withFieldGroup to different fields', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + }; + const defaultFields = { + first: '', + last: '', + }; + + const form = useAppForm({ + defaultValues, + }); + + const FieldGroup = withFieldGroup({ + defaultValues: defaultFields, + render: function Render() { + return <>; + }, + }); + + const Component1 = ( + + ); + + const Component2 = ( + + ); + }); + + it('should not allow fields mapping if the top level is an array', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + relativesRecord: { + something: { firstName: '', lastName: '', age: 0 }, + } as Record, + }; + const defaultFields = { + firstName: '', + lastName: '', + }; + + const form = useAppForm({ + defaultValues, + }); + + const FieldGroupRecord = withFieldGroup({ + defaultValues: { anything: defaultFields } as Record, + render: function Render() { + return <>; + }, + }); + const FieldGroupArray = withFieldGroup({ + defaultValues: [defaultFields], + render: function Render() { + return <>; + }, + }); + + const CorrectComponent1 = ; + const WrongComponent1 = ( + + ); + const CorrectComponent3 = ; + const WrongComponent2 = ( + + ); + }); + }); + + it('should allow mapping field groups to optional fields', () => { + const groupFields = { + name: '', + }; + + type WrapperValues = { + namespace: { name: string } | undefined; + namespace2: { name: string } | null; + namespace3: { name: string } | null | undefined; + nope: null | undefined; + nope2: { lastName: string } | null | undefined; + }; + + const defaultValues: WrapperValues = { + namespace: undefined, + namespace2: null, + namespace3: null, + nope: null, + nope2: null, + }; + + const FieldGroup = withFieldGroup({ + defaultValues: groupFields, + render: function Render() { + return <>; + }, + }); + + const form = useAppForm({ + defaultValues, + }); + + const Component = ; + const Component2 = ; + const Component3 = ; + // @ts-expect-error because it doesn't ever evaluate to the expected values + const Component4 = ; + // @ts-expect-error because the types don't match properly + const Component5 = ; + }); + + it('should allow interfaces without index signatures to be assigned to `props` in withForm and withFormGroup', () => { + interface TestNoSignature { + title: string; + } + + interface TestWithSignature { + title: string; + [key: string]: unknown; + } + + const WithFormComponent1 = withForm({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }); + + const WithFormComponent2 = withForm({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }); + + const WithFieldGroupComponent1 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }); + + const WithFieldGroupComponent2 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }); + + const appForm = useAppForm({ defaultValues: { name: '' } }); + + const Component1 = ; + const Component2 = ; + + const FieldGroupComponent1 = ( + + ); + const FieldGroupComponent2 = ( + + ); + }); + + it('should not allow null as prop in withForm and withFormGroup', () => { + const WithFormComponent = withForm({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }); + }); + + const WithFieldGroupComponent = withFieldGroup({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }); + + describe('extendForm', () => { + function ExtendedField() { + return null; + } + function ExtendedFormComp() { + return null; + } + + const baseHook = createFormHook({ + fieldComponents: { Test }, + formComponents: { Test }, + fieldContext, + formContext, + }); + + const { + withForm: withExtendedForm, + withFieldGroup: withExtendedFieldGroup, + extendForm, + } = baseHook.extendForm({ + fieldComponents: { ExtendedField }, + formComponents: { ExtendedFormComp }, + }); + + it('should expose extendForm on the returned hook', () => { + expectTypeOf(extendForm).toBeFunction(); + }); + + it('should include parent field components in the extended AppField render prop', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.AppField).toBeFunction(); + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + }); + + it('should include parent form components on the extended form', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.Test).toBeFunction(); + expectTypeOf(form.ExtendedFormComp).toBeFunction(); + return null; + }, + }); + }); + + it('should include parent and extended components in withFieldGroup', () => { + withExtendedFieldGroup({ + defaultValues: { name: '' }, + render: ({ group }) => { + expectTypeOf(group.Test).toBeFunction(); + expectTypeOf(group.ExtendedFormComp).toBeFunction(); + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + }); + + it('should error when a duplicate field component name is used in extendForm', () => { + baseHook.extendForm({ + fieldComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedField, + }, + }); + }); + + it('should error when a duplicate form component name is used in extendForm', () => { + baseHook.extendForm({ + formComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedFormComp, + }, + }); + }); + + it('should allow further extension of an already extended hook', () => { + function ThirdField() { + return null; + } + + const { useAppForm: useDoublyExtended } = baseHook + .extendForm({ fieldComponents: { ExtendedField } }) + .extendForm({ fieldComponents: { ThirdField } }); + + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + + const doublyExtendedForm = useDoublyExtended({ + defaultValues: { name: '' }, + }); + expectTypeOf(doublyExtendedForm.AppField).toBeFunction(); + }); + + it('should preserve its recursive type beyond the previous declaration cutoff', () => { + const deeplyExtended = baseHook + .extendForm({ fieldComponents: { Field01: Test } }) + .extendForm({ fieldComponents: { Field02: Test } }) + .extendForm({ fieldComponents: { Field03: Test } }) + .extendForm({ fieldComponents: { Field04: Test } }) + .extendForm({ fieldComponents: { Field05: Test } }) + .extendForm({ fieldComponents: { Field06: Test } }) + .extendForm({ fieldComponents: { Field07: Test } }) + .extendForm({ fieldComponents: { Field08: Test } }) + .extendForm({ fieldComponents: { Field09: Test } }) + .extendForm({ fieldComponents: { Field10: Test } }) + .extendForm({ fieldComponents: { Field11: Test } }) + .extendForm({ fieldComponents: { Field12: Test } }); + + expectTypeOf(deeplyExtended).not.toBeAny(); + expectTypeOf(deeplyExtended.extendForm).toBeFunction(); + }); + }); +}); diff --git a/packages/octane-form/typetests/tsconfig.json b/packages/octane-form/typetests/tsconfig.json new file mode 100644 index 000000000..9eecb98fa --- /dev/null +++ b/packages/octane-form/typetests/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "module": "esnext", + "target": "es2018", + "jsx": "react-jsx", + "jsxImportSource": "octane", + "moduleResolution": "bundler", + "esModuleInterop": true, + "lib": ["dom", "dom.iterable", "esnext"], + "skipLibCheck": true, + "types": ["node"], + "noEmit": true, + "noErrorTruncation": true, + "noUnusedLocals": false, + "noUnusedParameters": false + }, + "include": ["./**/*.test-d.ts", "./**/*.test-d.tsx", "./__fixtures__/**/*.ts"] +} diff --git a/packages/octane-form/typetests/useField.test-d.tsx b/packages/octane-form/typetests/useField.test-d.tsx new file mode 100644 index 000000000..0d06d8386 --- /dev/null +++ b/packages/octane-form/typetests/useField.test-d.tsx @@ -0,0 +1,110 @@ +/** @jsxImportSource octane */ +import { expectTypeOf, it } from 'vitest'; +import { useForm } from '../src/index'; + +it('should type state.value properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const); + + return ( + <> + { + expectTypeOf(field.state.value).toEqualTypeOf<'test'>(); + return null; + }} + /> + { + expectTypeOf(field.state.value).toEqualTypeOf<84>(); + return null; + }} + /> + + ); + } +}); + +it('should type onChange properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const); + + return ( + <> + { + expectTypeOf(value).toEqualTypeOf<'test'>(); + return null; + }, + }} + children={() => null} + /> + { + expectTypeOf(value).toEqualTypeOf<84>(); + return null; + }, + }} + children={() => null} + /> + + ); + } +}); + +it('should type array subfields', () => { + type FormDefinition = { + nested: { + people: { + name: string; + age: number; + }[]; + }; + }; + + function App() { + const form = useForm({ + defaultValues: { + nested: { + people: [], + }, + } as FormDefinition, + onSubmit({ value }) { + alert(JSON.stringify(value)); + }, + }); + + return ( + + {(field) => + field.state.value.map((_, i) => ( + + {(subField) => ( + subField.handleChange(event.currentTarget.value)} + /> + )} + + )) + } + + ); + } +}); diff --git a/packages/octane-form/typetests/useForm.test-d.tsx b/packages/octane-form/typetests/useForm.test-d.tsx new file mode 100644 index 000000000..7e709adf2 --- /dev/null +++ b/packages/octane-form/typetests/useForm.test-d.tsx @@ -0,0 +1,157 @@ +import { describe, expectTypeOf, it } from 'vitest'; +import { formOptions, useForm } from '../src/index'; +import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index'; +import type { OctaneFormExtendedApi } from '../src/useForm.tsrx'; + +describe('useForm', () => { + it('should type onSubmit properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + onSubmit({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>(); + }, + }); + } + }); + + it('should type a validator properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + validators: { + onChange({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>(); + return undefined; + }, + }, + }); + } + }); + + it('should not have recursion problems and type register properly', () => { + const register = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + f: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ) => f; + + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + title: '', + }, + }); + + const x = register(form); + + return null; + } + }); + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm(formOpts); + + expectTypeOf(form.state.values).toEqualTypeOf(); + }); + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + }); + + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: { test: string }): Promise; + }>(); + }); + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string; + lastName: string; + }; + + type PersonWithAge = Person & { + age: number; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + }); + + expectTypeOf(form.state.values).toExtend(); + }); +}); diff --git a/packages/octane-form/typetests/useFormGroup.test-d.tsx b/packages/octane-form/typetests/useFormGroup.test-d.tsx new file mode 100644 index 000000000..a6ff1c116 --- /dev/null +++ b/packages/octane-form/typetests/useFormGroup.test-d.tsx @@ -0,0 +1,387 @@ +import { describe, expectTypeOf, it } from 'vitest'; +import { useForm, useFormGroup } from '../src/index'; +import type { FormGroupApi } from '../src/index'; + +describe('useFormGroup form-like surface', () => { + it('should type state.value based on the selected field', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(group.name).toEqualTypeOf<'step1'>(); + } + }); + + it('should type onGroupSubmit value and meta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }, + }); + } + }); + + it('should type onGroupSubmitInvalid value and meta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + onGroupSubmitInvalid: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }, + }); + } + }); + + it('should type validators with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + onSubmit: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + }, + }); + } + }); + + it('should type listeners with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + listeners: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + }, + }, + }); + } + }); + + it('should type handleSubmit return as Promise', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.handleSubmit()).toEqualTypeOf>(); + } + }); + + it('should type handleSubmit overload when onSubmitMeta is provided', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: SubmitMeta): Promise; + }>(); + } + }); + + it('should type setValue updater', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + group.setValue({ name: 'new name' }); + group.setValue((prev) => { + expectTypeOf(prev).toEqualTypeOf<{ name: string }>(); + return { name: 'updated' }; + }); + } + }); + + it('should infer the FormGroupApi instance type for useFormGroup', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group).toMatchTypeOf< + FormGroupApi< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + >(); + } + }); +}); + +describe('useFormGroup field-like meta surface', () => { + it('should type meta booleans', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.state.meta.isTouched).toEqualTypeOf(); + expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf(); + expectTypeOf(group.state.meta.isDirty).toEqualTypeOf(); + expectTypeOf(group.state.meta.isValidating).toEqualTypeOf(); + } + }); + + it('should type errorMap entries based on validator return types', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'sync-change' as const, + onChangeAsync: async () => 'async-change' as const, + onBlur: () => 'sync-blur' as const, + onBlurAsync: async () => 'async-blur' as const, + onSubmit: () => 'sync-submit' as const, + onSubmitAsync: async () => 'async-submit' as const, + }, + }); + + expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< + 'sync-change' | 'async-change' | undefined + >(); + expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< + 'sync-blur' | 'async-blur' | undefined + >(); + expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< + 'sync-submit' | 'async-submit' | undefined + >(); + } + }); + + it('should type errors array from group validators', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'change-error' as const, + }, + }); + + expectTypeOf(group.state.meta.errors).toEqualTypeOf>(); + } + }); +}); + +describe('form.FormGroup component surface', () => { + it('should type the children render prop with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + {}}> + {(group) => { + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(group.name).toEqualTypeOf<'step1'>(); + return null; + }} + + ); + } + }); + + it('should type the children render prop with onSubmitMeta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }} + > + {(group) => { + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: SubmitMeta): Promise; + }>(); + return null; + }} + + ); + } + }); + + it('should type validators on the FormGroup component', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }); + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + }} + onGroupSubmit={() => {}} + > + {() => null} + + ); + } + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efc9b291f..172d54c56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,7 +195,7 @@ importers: version: 6.9.1 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) @@ -207,7 +207,7 @@ importers: version: 24.12.4 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0)) + version: 3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0)) eslint: specifier: 9.36.0 version: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) @@ -216,7 +216,7 @@ importers: version: 5.2.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) jsdom: specifier: ^27.2.0 - version: 27.4.0(supports-color@7.2.0) + version: 27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0) knip: specifier: ^6.37.0 version: 6.37.0 @@ -264,7 +264,7 @@ importers: version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) examples/angular/array: dependencies: @@ -307,7 +307,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(ffeda791aea3ab7b78d0c81a12bc1c94) + version: 21.2.12(0a64f068acf4e67180f9e17cce59d00c) '@angular/cli': specifier: ^21.2.12 version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) @@ -359,7 +359,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(f3d6a3cdd807604cebe7e8e92974ab1b) + version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) '@angular/cli': specifier: ^21.2.12 version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) @@ -414,7 +414,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(ecd13167f4bd33f6e977616867917e10) + version: 21.2.12(89c4ebb909596ef91f827350c543afbb) '@angular/cli': specifier: ^21.2.12 version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) @@ -466,7 +466,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(f3d6a3cdd807604cebe7e8e92974ab1b) + version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) '@angular/cli': specifier: ^21.2.12 version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) @@ -527,7 +527,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(f3d6a3cdd807604cebe7e8e92974ab1b) + version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) '@angular/cli': specifier: ^21.2.12 version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) @@ -1264,7 +1264,7 @@ importers: version: 1.170.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@tanstack/react-store': specifier: ^0.11.0 version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -1756,10 +1756,10 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^2.6.2 - version: 2.6.2(@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e))(@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) '@analogjs/vitest-angular': specifier: ^2.6.2 - version: 2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e))(@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1) + version: 2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1) '@angular/common': specifier: ^21.2.14 version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -1866,6 +1866,43 @@ importers: specifier: ^3.3.1 version: 3.3.3 + packages/octane-form: + dependencies: + '@tanstack/form-core': + specifier: workspace:* + version: link:../form-core + '@tanstack/octane-store': + specifier: ^0.12.2 + version: 0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + devDependencies: + '@octanejs/testing-library': + specifier: ^0.1.51 + version: 0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + '@testing-library/jest-dom': + specifier: ^6.8.0 + version: 6.9.1 + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.7(@testing-library/dom@10.4.1) + '@tsrx/react': + specifier: ^0.3.4 + version: 0.3.4(@typescript-eslint/types@8.59.4)(react@19.1.0) + esbuild: + specifier: ^0.28.2 + version: 0.28.2 + octane: + specifier: ^0.2.16 + version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + packages/preact-form: dependencies: '@tanstack/form-core': @@ -2008,7 +2045,7 @@ importers: devDependencies: '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@types/react': specifier: ~19.2.0 version: 19.2.17 @@ -2083,7 +2120,7 @@ importers: version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) '@testing-library/svelte': specifier: ^5.2.8 - version: 5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0)) + version: 5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0)) svelte: specifier: ^5.39.4 version: 5.55.9(@typescript-eslint/types@8.59.4) @@ -3424,6 +3461,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.6': resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} engines: {node: '>=12'} @@ -3448,6 +3491,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.6': resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} engines: {node: '>=12'} @@ -3472,6 +3521,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.6': resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} engines: {node: '>=12'} @@ -3496,6 +3551,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.6': resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} engines: {node: '>=12'} @@ -3520,6 +3581,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.6': resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} engines: {node: '>=12'} @@ -3544,6 +3611,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.6': resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} engines: {node: '>=12'} @@ -3568,6 +3641,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.6': resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} engines: {node: '>=12'} @@ -3592,6 +3671,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.6': resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} engines: {node: '>=12'} @@ -3616,6 +3701,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.6': resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} engines: {node: '>=12'} @@ -3640,6 +3731,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.6': resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} engines: {node: '>=12'} @@ -3664,6 +3761,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.6': resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} engines: {node: '>=12'} @@ -3688,6 +3791,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.6': resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} engines: {node: '>=12'} @@ -3712,6 +3821,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.6': resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} engines: {node: '>=12'} @@ -3736,6 +3851,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.6': resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} engines: {node: '>=12'} @@ -3760,6 +3881,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.6': resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} engines: {node: '>=12'} @@ -3784,6 +3911,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.6': resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} engines: {node: '>=12'} @@ -3808,6 +3941,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} @@ -3820,6 +3959,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.6': resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} engines: {node: '>=12'} @@ -3844,6 +3989,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} @@ -3856,6 +4007,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.6': resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} engines: {node: '>=12'} @@ -3880,6 +4037,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} @@ -3892,6 +4055,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.17.6': resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} engines: {node: '>=12'} @@ -3916,6 +4085,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.6': resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} engines: {node: '>=12'} @@ -3940,6 +4115,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.6': resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} engines: {node: '>=12'} @@ -3964,6 +4145,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.6': resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} engines: {node: '>=12'} @@ -3988,6 +4175,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4608,6 +4801,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -5144,6 +5340,10 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5267,6 +5467,12 @@ packages: cpu: [x64] os: [win32] + '@octanejs/testing-library@0.1.51': + resolution: {integrity: sha512-LjPRd8l/mKbO+pYcVHGeiOUQr3InaTfW+Rs9FBBTVmFCd16TfjyP/Cw/mct9bgn9sdHlEsLTRYPJS3UxcKh03g==} + engines: {node: '>=22.22.2'} + peerDependencies: + octane: ^0.2.5 + '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -5544,6 +5750,9 @@ packages: '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.140.0': + resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} + '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} @@ -5758,6 +5967,280 @@ packages: cpu: [x64] os: [win32] + '@oxfmt/binding-android-arm-eabi@0.59.0': + resolution: {integrity: sha512-bNTnfbuG7sAwb2PakMNaDukx5kXeW9duXOBeWtTOiLz3fXz3q2DlWguufPZ+c2IHEVrRXHD+M4aUgEWm841LDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.59.0': + resolution: {integrity: sha512-R/Sn7z52QtdAKNqQLLY0EK7hVMjXiz3XUlvoCFCm/60jgIzAnQtiqLKBCFaBkimCQL5rs2ezPMcicpjCsrl54Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.59.0': + resolution: {integrity: sha512-vm/ynUqE4HjC0ZIEjmXv1UJu1/GngccQ+T+TJudTMxUxm6r+GQTg1TO3E5jJfI71pBaXxSzs1+vWHIwuilGHhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.59.0': + resolution: {integrity: sha512-uTtYDpLN/obfKVWGpgEc8BqYlLZBQTPz2uYEvLRy3HPZxjZ34wiFzukUBU2bf64JuCYZI//GTV1EOMmWlPjf/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.59.0': + resolution: {integrity: sha512-e2UnxL/ifStSPy8ffBCDbdy595SYsGy+U1pur4G65TuMmWxAMBzYGG7atZo/3mp515p8rZdsflxVD/E1FAdPLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.59.0': + resolution: {integrity: sha512-LtdeZ1l0urxte3VNi3g8cocZwv1xGM1NKHSgF/fJEEVhyQmlgGh7WFWKFd/pNuO7djfvPNtNO1+MS+FEWkgVSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.59.0': + resolution: {integrity: sha512-dBTciSsj9GTMl7p+h2gMSI0hoPn2ijfc/dUsbnWsP0RbwgPl2r0C/5zkMb3Pb+gGj17LH7f1o4qLo9aes/pAvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.59.0': + resolution: {integrity: sha512-tXVdJ/JINsNWdponPHN0OuKHtC+HdpyoS9sd6IDPNiiEYsRki8b7tefRZ1iMnRkdbyT4SEbguWsr6o+5awvbPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.59.0': + resolution: {integrity: sha512-RRTq38i2zT5fnw6XGHjvT6w2mh6x/G3m6AZcAZ56OTDTT/lsOeYnG3SVjwmH40z5kPqF+lf+o35e6m6PpKy9Dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.59.0': + resolution: {integrity: sha512-lD3k7glAJSaXW0D6xzu8VOZbYbosvy+0ktOVkfLEoQF5HJlMSxTQ2KNW0JO+08ccP/1ElOKktVEMI0fqRbVB4w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.59.0': + resolution: {integrity: sha512-WH5ZP1RbuHKBO/yfPRQKpNO/ijHcEDNbnmC4VPf/Bcd3+mbMAZpRiJWRa1PL5bREdIZZHo343mk3sqlc9x7Usw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.59.0': + resolution: {integrity: sha512-743wOiaI9RZY4QVGkWkfGRavD5ZJUJ6gscFjVrVu1dP8AZh9jM+a6v3NhlR+OIzHdS6DhLM96w+gcVskskz7rw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.59.0': + resolution: {integrity: sha512-xjRXQsRnrRZCcCkIEnbd2lmsQNobtwwkJxdy2bWXhZ1lIN0ouZwsBXRsoovW3yATuziAYwr9HMiQuR/Cc75NIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.59.0': + resolution: {integrity: sha512-4hNjqq/Rbr9B+StY9zMMAfm72+mtM4v80xYL5Qkb59Qd72g2vJMI0iFlPj3kf6miMsie/yJ7rt4urJT292HBgA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.59.0': + resolution: {integrity: sha512-NH579iN8EVQYsWowUB8B5vFchcylJtwPVJ7NmUAqEQHNLfhPbDT3K56KrECNAkUN4QpF4qiMgN2vsfZwVvjm7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.59.0': + resolution: {integrity: sha512-mzZy3Z5Aj1D75Aq9FVlmoRQH5ei8Ga4o/NZmlXkKyeZ5EmPrUXRR7c6BMBteV1ZuZ/356UYDuLRLjAMxTDTiBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.59.0': + resolution: {integrity: sha512-0CpDJ1gE3jN1Gk6xms1Ie6LPfPcOtY4FAtoOmVLHQoAf8DvO2wd0DW2dIX2f7YTp5dxrr0ND8JeUEjm3DP3k5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.59.0': + resolution: {integrity: sha512-zwdKBu3pt87uW0bRcywZb0oGMS7C6n87qogwRYFUgmk44T90ZzYlPjtlFYXs/DnBFrgNCvlHwCuWKfVWLeE7kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.59.0': + resolution: {integrity: sha512-dUUbZkKgWrmAeI/puzv4bxN8lzcYaFnQVwFTFtwO2Gp8M7lZGSE2qJjC58g518+1bltJ8mizjYwD0BGHym0l/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.24.0': + resolution: {integrity: sha512-C2uMmwK5Bc4ri4ysZ6sA8Rcu+A5zBQTp6ml2u0CLLbRZp4kMFPV3yWk8B5DK9Aw7y9bbjogIm75tUwGLFzlsYQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.24.0': + resolution: {integrity: sha512-Wgvt/1lRbDxmoNqWQKKcL+UIiqLmdJ+EWLpQa1qzoNVAfNB0PJpa82/8dH1twT/3rSs4zrP5TXPWl4juB71WuQ==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.24.0': + resolution: {integrity: sha512-PB1rxII7KV83+ASY4sSkXtqvpij6ME66+QCRL49uksi/ofs2Rf/UVboYr095n0Rkbl2wgvlsHGl6DHC361jQUQ==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.24.0': + resolution: {integrity: sha512-xcz3CxKmjTQLREtE/UShh+ruWmm9nAb7UM9zKcD65BStiuYgOakAKkPHl4YS5DztpVcDrE0+HqbOolTlRKYWmw==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.24.0': + resolution: {integrity: sha512-A2i6ZGBec3i20S7RaxkgHc6r3HYtD5Mn7j/mb22NkTz14u0JuudvTu6JggAnbGMcv8+dBKQI//EasxSPJLD8pw==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.24.0': + resolution: {integrity: sha512-0ZbGd9qRB6zs82moekaKdEvncRANq49EAwfNX62JpTS46feXUhKAuoyVDvZMj6Rywejylrmmu79Wo6faYCo4Ew==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.74.0': + resolution: {integrity: sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.74.0': + resolution: {integrity: sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.74.0': + resolution: {integrity: sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.74.0': + resolution: {integrity: sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.74.0': + resolution: {integrity: sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.74.0': + resolution: {integrity: sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.74.0': + resolution: {integrity: sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.74.0': + resolution: {integrity: sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.74.0': + resolution: {integrity: sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.74.0': + resolution: {integrity: sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.74.0': + resolution: {integrity: sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.74.0': + resolution: {integrity: sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.74.0': + resolution: {integrity: sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.74.0': + resolution: {integrity: sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.74.0': + resolution: {integrity: sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.74.0': + resolution: {integrity: sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.74.0': + resolution: {integrity: sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.74.0': + resolution: {integrity: sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.74.0': + resolution: {integrity: sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@package-json/types@0.0.12': resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} @@ -6832,6 +7315,11 @@ packages: peerDependencies: acorn: ^8.9.0 + '@sveltejs/acorn-typescript@1.0.13': + resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} + peerDependencies: + acorn: ^8.9.0 + '@sveltejs/package@2.5.7': resolution: {integrity: sha512-qqD9xa9H7TDiGFrF6rz7AirOR8k15qDK/9i4MIE8te4vWsv5GEogPks61rrZcLy+yWph+aI6pIj2MdoK3YI8AQ==} engines: {node: ^16.14 || >=18} @@ -7023,6 +7511,12 @@ packages: peerDependencies: lit: ^3.0.0 + '@tanstack/octane-store@0.12.2': + resolution: {integrity: sha512-MCWaLcdfv3iOnAEYWJ2hF7G+BgxyVJpD6nUQ3ud9oXaNHX6thgSOQKkOCj/Eo6UzTnl6kKsxPYsgrgiwNympgA==} + engines: {node: '>=22'} + peerDependencies: + octane: 0.1.21 + '@tanstack/pacer-lite@0.1.1': resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} @@ -7202,6 +7696,9 @@ packages: '@tanstack/store@0.11.0': resolution: {integrity: sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw==} + '@tanstack/store@0.11.1': + resolution: {integrity: sha512-mzTOBhypOuDJAy/D8n2MfUZ1HFkXnmSETviRyhqEC8LUE7/IZQExOTxMANj3KjTofYTkFNpBY67qaVrT41YccA==} + '@tanstack/store@0.9.3': resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} @@ -7302,6 +7799,12 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@testing-library/user-event@14.6.7': + resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@testing-library/vue@8.1.0': resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} engines: {node: '>=14'} @@ -7318,6 +7821,79 @@ packages: '@tsconfig/svelte@5.0.8': resolution: {integrity: sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==} + '@tsrx/core@0.2.4': + resolution: {integrity: sha512-o07NiDB2yFeN2natoViMwwb9h0o3UDzYqGUJ7qe4w6r5Oc0WLoWFfrpRDUtWBpR+JL4Loc3lRxFdOD+Wz+0VlQ==} + + '@tsrx/oxc-darwin-arm64@0.13.0': + resolution: {integrity: sha512-wk3JP8sBJBC1gxuG/fVlT/WnR/i2E2dYFpv8NnoSMcjSdoAw4e6cobgpzEWI2E8AXp7yQ5Nlp8gD+Xvt6AJTUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@tsrx/oxc-darwin-x64@0.13.0': + resolution: {integrity: sha512-hgd/F9r92fdCW3g74tpo20OPd24Pk5z59gd5Ru1MH3b04ltRaMbyb7iJ+0RfPXmS1e6xqcPNB/ZmpForHKk/kA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@tsrx/oxc-linux-arm64-gnu@0.13.0': + resolution: {integrity: sha512-kF2S/syEGLUSx62lnfnK0XrMpWfrPapQE7Dh/BPe8vlmDJV8pR5/AAfY4fmmwGFq2ScTDz8Mh4kiQiC+Lv8kEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tsrx/oxc-linux-arm64-musl@0.13.0': + resolution: {integrity: sha512-fZxDFbcaTnme/NNlN4w2pDc/EMxGS7zolWszr4GfacEztHdwJhm14lqSsQoOngCXJRbUu2CDr8xu9UF6AQ4VcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tsrx/oxc-linux-x64-gnu@0.13.0': + resolution: {integrity: sha512-LewgSG8znyAB8jSEuAmsCsr68geEz8RAnQng6urbHY3Bej94yd1m9584u28BMaU40UKPPGC90lqpqXMbbCie6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tsrx/oxc-linux-x64-musl@0.13.0': + resolution: {integrity: sha512-JfwZgs6Ro1vO91k8KjmRsV42LJSuHizCiqIAYI7oKMO/YuqFRMrYVWNGgzQCCNQ4kX76IwxIT96uy25T4IXW7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tsrx/oxc-win32-arm64-msvc@0.13.0': + resolution: {integrity: sha512-8mrA5IysbXdmnYTUViunWfTVoyr4yZkrKB96Qghj5VxQ9XnQi6a7kMdhdhKth4zPAYA0Q6MBcwVYhNaFBVlX+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@tsrx/oxc-win32-x64-msvc@0.13.0': + resolution: {integrity: sha512-A+Z8EvdJD7uZDZYwUrqeICoMi3px7SU9Ofxcd6scBjqGfIUjtwq5RsNsrUKV+uxw9OLnrzlZbW+kcI2J6Sv9hQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@tsrx/oxc@0.13.0': + resolution: {integrity: sha512-Y8KEKepbugOuASyNVPazVulmdQy25LDYxUMw6MdiAWKmUWZ6RXzct8RgyiMqoif74LPOcKw+qpWZH3LJpeC7WA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + '@tsrx/react-runtime@0.1.10': + resolution: {integrity: sha512-Az9OMPCXHGAsnPRztq065KimTPKmWbq6SAbilJ4y5VFZfE0Wwcn9mYyft9bPD010n+nrH/w598715FLoOlNwDA==} + peerDependencies: + react: '>=18' + + '@tsrx/react@0.3.4': + resolution: {integrity: sha512-/Pel+fMfipoqMRr0N956/dnM/B1in3+IHL6V+vUkWR8KJJEVGlWDtIaGJFp+3IcmVaw/+YUyD3l1QCPYMDLYyQ==} + peerDependencies: + react: '>=18' + + '@tsrx/runtime@0.2.2': + resolution: {integrity: sha512-EsqZjTKWd/qrwEEk7AtaKrmTvPZWRz+H06rJjgNAb1Om0RC45xX2hZjDlv/tE20o4gcOgSCfc/AzKTq6qXlp1A==} + '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7793,9 +8369,19 @@ packages: '@volar/typescript@2.4.15': resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@vue/compiler-core@3.5.34': resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} @@ -7968,6 +8554,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + adjust-sourcemap-loader@4.0.0: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} @@ -8035,6 +8626,9 @@ packages: alien-signals@1.0.13: resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + alien-signals@3.2.0: + resolution: {integrity: sha512-5J9+NpCLHgic4xnZtI8SznvNagwJsZSvRFsAwoLlLw+Edaqa4upCiOC19P8Vx2DqmEvqK2qJBMtI8+9eXOEb/A==} + anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -9038,6 +9632,9 @@ packages: devalue@5.8.1: resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + diff@5.2.2: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} @@ -9228,8 +9825,8 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -9282,6 +9879,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -9543,6 +10145,14 @@ packages: '@typescript-eslint/types': optional: true + esrap@2.3.7: + resolution: {integrity: sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -10077,6 +10687,10 @@ packages: get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} + getenv@2.0.0: resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} engines: {node: '>=6'} @@ -11923,6 +12537,24 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + octane@0.2.16: + resolution: {integrity: sha512-7jMzf0WZhu++BQD2jyzlSo7bNHRObpOsSIEsLuQ0lcNABYph+Wirs3TD0XZqApvrpVdWsLzSfdYlbI3CPJNO6w==} + engines: {node: '>=22.22.2'} + peerDependencies: + react: ^19.0.0 + react-dom: ^19.0.0 + typescript: ^5.9.3 + vite: ^8.0.16 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + typescript: + optional: true + vite: + optional: true + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -12014,6 +12646,36 @@ packages: oxc-resolver@11.24.2: resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} + oxfmt@0.59.0: + resolution: {integrity: sha512-Xqk6cPZS1yMvVa7OAuenaDZUsgMDutvvbZ9/L5gSvAfW64+WN4HVhgipLj5rVERbYQt8fLs9TopyZ1rU1XEG/w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint-tsgolint@0.24.0: + resolution: {integrity: sha512-giCk5sEvG02d5tzPmFMX3hem8ndzEEu1xvGYS5OwNfO2WGl6ZVxt5LjE0yiMDoz94INI7XkXwgFAQiydPvVHDw==} + hasBin: true + + oxlint@1.74.0: + resolution: {integrity: sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.24.0' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -12536,6 +13198,11 @@ packages: peerDependencies: react: ^19.1.0 + react-dom@19.3.0: + resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} + peerDependencies: + react: ^19.3.0 + react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -12685,6 +13352,10 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + react@19.3.0: + resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} + engines: {node: '>=0.10.0'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -12985,6 +13656,9 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + schema-utils@4.3.3: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} @@ -13696,6 +14370,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -14881,7 +15559,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e))(@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': dependencies: magic-string: 0.30.21 obug: 2.1.1 @@ -14889,19 +15567,19 @@ snapshots: tinyglobby: 0.2.16 ts-morph: 21.0.1 optionalDependencies: - '@angular-devkit/build-angular': 21.2.12(825636156df100e32a721cab08b02a3e) - '@angular/build': 21.2.12(60b0737a044e59224c87543bc85cc8fb) + '@angular-devkit/build-angular': 21.2.12(900e8a9f9887169b6aa0e95c3e7c738a) + '@angular/build': 21.2.12(4f977d91d8c751136029ad7496910326) vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@analogjs/vitest-angular@2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e))(@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1)': + '@analogjs/vitest-angular@2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1)': dependencies: - '@analogjs/vite-plugin-angular': 2.6.2(@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e))(@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@analogjs/vite-plugin-angular': 2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.12(chokidar@5.0.0) - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) optionalDependencies: zone.js: 0.15.1 @@ -14912,13 +15590,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.2.12(825636156df100e32a721cab08b02a3e)': + '@angular-devkit/build-angular@21.2.12(0a64f068acf4e67180f9e17cce59d00c)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(6ce3b2d940df5673187e9a9be553d9a5) + '@angular/build': 21.2.12(53e67d10389c5d4e7144ebf9cdfd7914) '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) '@babel/core': 7.29.0(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -15006,15 +15684,14 @@ snapshots: - vitest - webpack-cli - yaml - optional: true - '@angular-devkit/build-angular@21.2.12(ecd13167f4bd33f6e977616867917e10)': + '@angular-devkit/build-angular@21.2.12(89c4ebb909596ef91f827350c543afbb)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(4a5dad358d011a8bdb0e788a8ba4d59b) + '@angular/build': 21.2.12(c1f9d3b3ae588aca96aeb28ea1ab8c76) '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) '@babel/core': 7.29.0(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -15103,13 +15780,13 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-angular@21.2.12(f3d6a3cdd807604cebe7e8e92974ab1b)': + '@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(bc21ba156c4f39184a955b848aea9045) + '@angular/build': 21.2.12(80e65ab7121f87acdd97841bae7129f6) '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) '@babel/core': 7.29.0(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -15197,14 +15874,15 @@ snapshots: - vitest - webpack-cli - yaml + optional: true - '@angular-devkit/build-angular@21.2.12(ffeda791aea3ab7b78d0c81a12bc1c94)': + '@angular-devkit/build-angular@21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(c538b6fdf77b18c9ed9237789e875a7b) + '@angular/build': 21.2.12(72c533dc1f53c8a7936ec4dfca1acb68) '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) '@babel/core': 7.29.0(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -15328,7 +16006,7 @@ snapshots: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@21.2.12(4a5dad358d011a8bdb0e788a8ba4d59b)': + '@angular/build@21.2.12(4f977d91d8c751136029ad7496910326)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) @@ -15338,7 +16016,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -15359,16 +16037,16 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.4.2 + less: 4.6.4 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + postcss: 8.5.15 + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -15383,8 +16061,9 @@ snapshots: - terser - tsx - yaml + optional: true - '@angular/build@21.2.12(60b0737a044e59224c87543bc85cc8fb)': + '@angular/build@21.2.12(53e67d10389c5d4e7144ebf9cdfd7914)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) @@ -15394,7 +16073,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -15415,16 +16094,16 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.6.4 + less: 4.4.2 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.15 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + postcss: 8.5.12 + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -15439,9 +16118,8 @@ snapshots: - terser - tsx - yaml - optional: true - '@angular/build@21.2.12(6ce3b2d940df5673187e9a9be553d9a5)': + '@angular/build@21.2.12(72c533dc1f53c8a7936ec4dfca1acb68)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) @@ -15451,7 +16129,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -15472,7 +16150,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) @@ -15481,7 +16159,7 @@ snapshots: lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -15496,9 +16174,8 @@ snapshots: - terser - tsx - yaml - optional: true - '@angular/build@21.2.12(bc21ba156c4f39184a955b848aea9045)': + '@angular/build@21.2.12(80e65ab7121f87acdd97841bae7129f6)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) @@ -15508,7 +16185,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -15529,7 +16206,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.1) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) @@ -15538,7 +16215,7 @@ snapshots: lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -15553,8 +16230,9 @@ snapshots: - terser - tsx - yaml + optional: true - '@angular/build@21.2.12(c538b6fdf77b18c9ed9237789e875a7b)': + '@angular/build@21.2.12(c1f9d3b3ae588aca96aeb28ea1ab8c76)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) @@ -15564,7 +16242,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -15585,7 +16263,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) @@ -15594,7 +16272,7 @@ snapshots: lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -17174,7 +17852,7 @@ snapshots: '@changesets/errors': 1.0.0 '@changesets/types': 7.0.0 '@manypkg/get-packages': 3.1.0 - picomatch: 4.0.4 + picomatch: 4.0.7 tinyexec: 1.1.2 '@changesets/parse@1.0.0': @@ -17208,7 +17886,7 @@ snapshots: '@clack/core@1.4.3': dependencies: - fast-wrap-ansi: 0.2.2 + fast-wrap-ansi: 0.2.0 sisteransi: 1.0.5 '@clack/core@1.5.1': @@ -17220,7 +17898,7 @@ snapshots: dependencies: '@clack/core': 1.4.3 fast-string-width: 3.0.2 - fast-wrap-ansi: 0.2.2 + fast-wrap-ansi: 0.2.0 sisteransi: 1.0.5 '@clack/prompts@1.8.1': @@ -17264,12 +17942,12 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 - optional: true '@emnapi/core@1.11.2': dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 + optional: true '@emnapi/core@1.4.5': dependencies: @@ -17279,11 +17957,11 @@ snapshots: '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 - optional: true '@emnapi/runtime@1.11.2': dependencies: tslib: 2.8.1 + optional: true '@emnapi/runtime@1.4.5': dependencies: @@ -17296,11 +17974,11 @@ snapshots: '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 - optional: true '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 + optional: true '@emotion/babel-plugin@11.13.5(supports-color@8.1.1)': dependencies: @@ -17394,6 +18072,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + '@esbuild/android-arm64@0.17.6': optional: true @@ -17406,6 +18087,9 @@ snapshots: '@esbuild/android-arm64@0.27.7': optional: true + '@esbuild/android-arm64@0.28.2': + optional: true + '@esbuild/android-arm@0.17.6': optional: true @@ -17418,6 +18102,9 @@ snapshots: '@esbuild/android-arm@0.27.7': optional: true + '@esbuild/android-arm@0.28.2': + optional: true + '@esbuild/android-x64@0.17.6': optional: true @@ -17430,6 +18117,9 @@ snapshots: '@esbuild/android-x64@0.27.7': optional: true + '@esbuild/android-x64@0.28.2': + optional: true + '@esbuild/darwin-arm64@0.17.6': optional: true @@ -17442,6 +18132,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.7': optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true + '@esbuild/darwin-x64@0.17.6': optional: true @@ -17454,6 +18147,9 @@ snapshots: '@esbuild/darwin-x64@0.27.7': optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true + '@esbuild/freebsd-arm64@0.17.6': optional: true @@ -17466,6 +18162,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.7': optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true + '@esbuild/freebsd-x64@0.17.6': optional: true @@ -17478,6 +18177,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.7': optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true + '@esbuild/linux-arm64@0.17.6': optional: true @@ -17490,6 +18192,9 @@ snapshots: '@esbuild/linux-arm64@0.27.7': optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true + '@esbuild/linux-arm@0.17.6': optional: true @@ -17502,6 +18207,9 @@ snapshots: '@esbuild/linux-arm@0.27.7': optional: true + '@esbuild/linux-arm@0.28.2': + optional: true + '@esbuild/linux-ia32@0.17.6': optional: true @@ -17514,6 +18222,9 @@ snapshots: '@esbuild/linux-ia32@0.27.7': optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true + '@esbuild/linux-loong64@0.17.6': optional: true @@ -17526,6 +18237,9 @@ snapshots: '@esbuild/linux-loong64@0.27.7': optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true + '@esbuild/linux-mips64el@0.17.6': optional: true @@ -17538,6 +18252,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.7': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + '@esbuild/linux-ppc64@0.17.6': optional: true @@ -17550,6 +18267,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.7': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + '@esbuild/linux-riscv64@0.17.6': optional: true @@ -17562,6 +18282,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.7': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + '@esbuild/linux-s390x@0.17.6': optional: true @@ -17574,6 +18297,9 @@ snapshots: '@esbuild/linux-s390x@0.27.7': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + '@esbuild/linux-x64@0.17.6': optional: true @@ -17586,12 +18312,18 @@ snapshots: '@esbuild/linux-x64@0.27.7': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + '@esbuild/netbsd-arm64@0.27.3': optional: true '@esbuild/netbsd-arm64@0.27.7': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + '@esbuild/netbsd-x64@0.17.6': optional: true @@ -17604,12 +18336,18 @@ snapshots: '@esbuild/netbsd-x64@0.27.7': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + '@esbuild/openbsd-arm64@0.27.3': optional: true '@esbuild/openbsd-arm64@0.27.7': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + '@esbuild/openbsd-x64@0.17.6': optional: true @@ -17622,12 +18360,18 @@ snapshots: '@esbuild/openbsd-x64@0.27.7': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + '@esbuild/openharmony-arm64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.27.7': optional: true + '@esbuild/openharmony-arm64@0.28.2': + optional: true + '@esbuild/sunos-x64@0.17.6': optional: true @@ -17640,6 +18384,9 @@ snapshots: '@esbuild/sunos-x64@0.27.7': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + '@esbuild/win32-arm64@0.17.6': optional: true @@ -17652,6 +18399,9 @@ snapshots: '@esbuild/win32-arm64@0.27.7': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + '@esbuild/win32-ia32@0.17.6': optional: true @@ -17664,6 +18414,9 @@ snapshots: '@esbuild/win32-ia32@0.27.7': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + '@esbuild/win32-x64@0.17.6': optional: true @@ -17676,6 +18429,9 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true + '@esbuild/win32-x64@0.28.2': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))': dependencies: eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) @@ -17841,7 +18597,9 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@exodus/bytes@1.15.1': {} + '@exodus/bytes@1.15.1(@noble/hashes@2.4.0)': + optionalDependencies: + '@noble/hashes': 2.4.0 '@expo/cli@54.0.24(expo-router@6.0.23)(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: @@ -18520,7 +19278,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -18537,6 +19295,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -18738,7 +19498,7 @@ snapshots: '@manypkg/tools@2.1.2': dependencies: jju: 1.4.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 yaml: 2.9.0 '@material/web@2.4.1': @@ -18994,8 +19754,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.9.0 '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -19053,6 +19813,8 @@ snapshots: '@noble/hashes@1.4.0': {} + '@noble/hashes@2.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -19186,6 +19948,11 @@ snapshots: '@nx/nx-win32-x64-msvc@23.2.1': optional: true + '@octanejs/testing-library@0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + dependencies: + '@testing-library/dom': 10.4.1 + octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@one-ini/wasm@0.1.1': {} '@oozcitak/dom@2.0.2': @@ -19333,6 +20100,8 @@ snapshots: '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.140.0': {} + '@oxc-project/types@0.150.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.1': @@ -19433,7 +20202,7 @@ snapshots: '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -19461,6 +20230,138 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true + '@oxfmt/binding-android-arm-eabi@0.59.0': + optional: true + + '@oxfmt/binding-android-arm64@0.59.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.59.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.59.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.59.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.59.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.59.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.59.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.59.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.59.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.59.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.59.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.59.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.59.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.59.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.59.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.59.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.59.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.59.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.24.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.24.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.24.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.24.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.74.0': + optional: true + + '@oxlint/binding-android-arm64@1.74.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.74.0': + optional: true + + '@oxlint/binding-darwin-x64@1.74.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.74.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.74.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.74.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.74.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.74.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.74.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.74.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.74.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.74.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.74.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.74.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.74.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.74.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.74.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.74.0': + optional: true + '@package-json/types@0.0.12': {} '@parcel/watcher-android-arm64@2.5.6': @@ -20586,6 +21487,10 @@ snapshots: dependencies: acorn: 8.16.0 + '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': + dependencies: + acorn: 8.18.0 + '@sveltejs/package@2.5.7(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)': dependencies: chokidar: 5.0.0 @@ -20768,6 +21673,11 @@ snapshots: '@tanstack/store': 0.11.0 lit: 3.3.3 + '@tanstack/octane-store@0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + dependencies: + '@tanstack/store': 0.11.1 + octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@tanstack/pacer-lite@0.1.1': {} '@tanstack/preact-store@0.13.1(preact@10.29.2)': @@ -20821,14 +21731,14 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/react-start-rsc@0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/react-start-rsc@0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/router-core': 1.171.14 '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) '@tanstack/start-client-core': 1.170.13 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@tanstack/start-server-core': 1.169.16 '@tanstack/start-storage-context': 1.167.16 pathe: 2.0.3 @@ -20852,15 +21762,15 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/react-start@1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-start-client': 1.168.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/react-start-rsc': 0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + '@tanstack/react-start-rsc': 0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@tanstack/react-start-server': 1.167.21(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) '@tanstack/start-client-core': 1.170.13 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@tanstack/start-server-core': 1.169.16 pathe: 2.0.3 react: 19.1.0 @@ -20916,7 +21826,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/template': 7.29.7 @@ -20931,7 +21841,7 @@ snapshots: '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) vite-plugin-solid: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - supports-color @@ -20971,14 +21881,14 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 '@tanstack/router-core': 1.171.14 '@tanstack/router-generator': 1.167.18(supports-color@8.1.1) - '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) '@tanstack/start-server-core': 1.169.16 exsolve: 1.0.8 @@ -21020,6 +21930,8 @@ snapshots: '@tanstack/store@0.11.0': {} + '@tanstack/store@0.11.1': {} + '@tanstack/store@0.9.3': {} '@tanstack/svelte-store@0.12.0(svelte@5.55.9(@typescript-eslint/types@8.59.4))': @@ -21112,12 +22024,12 @@ snapshots: '@testing-library/dom': 8.20.1 preact: 10.29.2 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) @@ -21126,19 +22038,23 @@ snapshots: dependencies: svelte: 5.55.9(@typescript-eslint/types@8.59.4) - '@testing-library/svelte@5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))': + '@testing-library/svelte@5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/svelte-core': 1.0.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) svelte: 5.55.9(@typescript-eslint/types@8.59.4) optionalDependencies: vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 + '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/vue@8.1.0(@vue/compiler-dom@3.5.34)(@vue/compiler-sfc@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': dependencies: '@babel/runtime': 7.29.7 @@ -21160,6 +22076,84 @@ snapshots: '@tsconfig/svelte@5.0.8': {} + '@tsrx/core@0.2.4(@typescript-eslint/types@8.59.4)': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@noble/hashes': 2.4.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@tsrx/runtime': 0.2.2 + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + acorn: 8.18.0 + esrap: 2.3.7(@typescript-eslint/types@8.59.4) + get-tsconfig: 5.0.0-beta.6 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + + '@tsrx/oxc-darwin-arm64@0.13.0': + optional: true + + '@tsrx/oxc-darwin-x64@0.13.0': + optional: true + + '@tsrx/oxc-linux-arm64-gnu@0.13.0': + optional: true + + '@tsrx/oxc-linux-arm64-musl@0.13.0': + optional: true + + '@tsrx/oxc-linux-x64-gnu@0.13.0': + optional: true + + '@tsrx/oxc-linux-x64-musl@0.13.0': + optional: true + + '@tsrx/oxc-win32-arm64-msvc@0.13.0': + optional: true + + '@tsrx/oxc-win32-x64-msvc@0.13.0': + optional: true + + '@tsrx/oxc@0.13.0(svelte@5.55.9(@typescript-eslint/types@8.59.4))': + dependencies: + '@oxc-project/types': 0.140.0 + oxfmt-current: oxfmt@0.59.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) + oxlint-current: oxlint@1.74.0(oxlint-tsgolint@0.24.0) + oxlint-tsgolint: 0.24.0 + pathe: 2.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@tsrx/oxc-darwin-arm64': 0.13.0 + '@tsrx/oxc-darwin-x64': 0.13.0 + '@tsrx/oxc-linux-arm64-gnu': 0.13.0 + '@tsrx/oxc-linux-arm64-musl': 0.13.0 + '@tsrx/oxc-linux-x64-gnu': 0.13.0 + '@tsrx/oxc-linux-x64-musl': 0.13.0 + '@tsrx/oxc-win32-arm64-msvc': 0.13.0 + '@tsrx/oxc-win32-x64-msvc': 0.13.0 + transitivePeerDependencies: + - svelte + - vite-plus + + '@tsrx/react-runtime@0.1.10(react@19.1.0)': + dependencies: + '@tsrx/runtime': 0.2.2 + react: 19.1.0 + + '@tsrx/react@0.3.4(@typescript-eslint/types@8.59.4)(react@19.1.0)': + dependencies: + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) + '@tsrx/react-runtime': 0.1.10(react@19.1.0) + esrap: 2.3.7(@typescript-eslint/types@8.59.4) + react: 19.1.0 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + + '@tsrx/runtime@0.2.2': {} + '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': @@ -21506,7 +22500,7 @@ snapshots: debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.5 semver: 7.8.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -21521,7 +22515,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -21739,7 +22733,7 @@ snapshots: vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) vue: 3.5.34(typescript@5.9.3) - '@vitest/coverage-istanbul@3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitest/coverage-istanbul@3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@istanbuljs/schema': 0.1.6 debug: 4.4.3(supports-color@7.2.0) @@ -21751,7 +22745,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -21809,17 +22803,21 @@ snapshots: '@volar/source-map@2.4.28': {} - '@volar/typescript@2.4.15': + '@volar/typescript@2.4.15(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.15 path-browserify: 1.0.1 vscode-uri: 3.1.0 + optionalDependencies: + typescript: 5.9.3 - '@volar/typescript@2.4.28': + '@volar/typescript@2.4.28(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 vscode-uri: 3.1.0 + optionalDependencies: + typescript: 5.9.3 '@vue/compiler-core@3.5.34': dependencies: @@ -22033,9 +23031,9 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-import-phases@1.0.4(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -22043,6 +23041,8 @@ snapshots: acorn@8.16.0: {} + acorn@8.18.0: {} + adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 @@ -22140,6 +23140,8 @@ snapshots: alien-signals@1.0.13: {} + alien-signals@3.2.0: {} + anser@1.4.10: {} ansi-colors@4.1.3: {} @@ -23039,7 +24041,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) core-js-compat@3.49.0: @@ -23302,6 +24304,8 @@ snapshots: devalue@5.8.1: {} + devalue@5.9.4: {} + diff@5.2.2: {} diff@8.0.4: {} @@ -23541,7 +24545,7 @@ snapshots: es-module-lexer@1.7.0: {} - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.2: {} es-object-atoms@1.1.1: dependencies: @@ -23686,6 +24690,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -24165,6 +25198,12 @@ snapshots: optionalDependencies: '@typescript-eslint/types': 8.59.4 + esrap@2.3.7(@typescript-eslint/types@8.59.4): + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + optionalDependencies: + '@typescript-eslint/types': 8.59.4 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -24818,6 +25857,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + getenv@2.0.0: {} glob-parent@5.1.2: @@ -24998,9 +26041,9 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - html-encoding-sniffer@6.0.0: + html-encoding-sniffer@6.0.0(@noble/hashes@2.4.0): dependencies: - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0) transitivePeerDependencies: - '@noble/hashes' @@ -25607,15 +26650,15 @@ snapshots: jsc-safe-url@0.2.4: {} - jsdom@27.4.0(supports-color@7.2.0): + jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0): dependencies: '@acemir/cssom': 0.9.31 '@asamuzakjp/dom-selector': 6.8.1 - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0) cssstyle: 5.3.7 data-urls: 6.0.1 decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0) http-proxy-agent: 7.0.2(supports-color@7.2.0) https-proxy-agent: 7.0.6(supports-color@7.2.0) is-potential-custom-element-name: 1.0.1 @@ -25635,15 +26678,15 @@ snapshots: - supports-color - utf-8-validate - jsdom@27.4.0(supports-color@8.1.1): + jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1): dependencies: '@acemir/cssom': 0.9.31 '@asamuzakjp/dom-selector': 6.8.1 - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0) cssstyle: 5.3.7 data-urls: 6.0.1 decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0) http-proxy-agent: 7.0.2(supports-color@8.1.1) https-proxy-agent: 7.0.6(supports-color@8.1.1) is-potential-custom-element-name: 1.0.1 @@ -26003,7 +27046,7 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 magicast@0.3.5: dependencies: @@ -27012,7 +28055,7 @@ snapshots: rollup-plugin-dts: 6.4.1(rollup@4.60.4)(typescript@5.9.3) rxjs: 7.8.2 sass: 1.100.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tslib: 2.8.1 typescript: 5.9.3 optionalDependencies: @@ -27358,6 +28401,29 @@ snapshots: obug@2.1.1: {} + octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + dependencies: + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) + '@tsrx/oxc': 0.13.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) + '@types/react': 19.2.17 + '@volar/language-core': 2.4.28 + '@volar/typescript': 2.4.28(typescript@5.9.3) + alien-signals: 3.2.0 + csstype: 3.2.3 + devalue: 5.9.4 + entities: 7.0.1 + es-module-lexer: 1.7.0 + esrap: 2.3.7(@typescript-eslint/types@8.59.4) + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + typescript: 5.9.3 + vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@typescript-eslint/types' + - svelte + - vite-plus + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -27582,6 +28648,63 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 + oxfmt@0.59.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)): + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.59.0 + '@oxfmt/binding-android-arm64': 0.59.0 + '@oxfmt/binding-darwin-arm64': 0.59.0 + '@oxfmt/binding-darwin-x64': 0.59.0 + '@oxfmt/binding-freebsd-x64': 0.59.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.59.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.59.0 + '@oxfmt/binding-linux-arm64-gnu': 0.59.0 + '@oxfmt/binding-linux-arm64-musl': 0.59.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.59.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.59.0 + '@oxfmt/binding-linux-riscv64-musl': 0.59.0 + '@oxfmt/binding-linux-s390x-gnu': 0.59.0 + '@oxfmt/binding-linux-x64-gnu': 0.59.0 + '@oxfmt/binding-linux-x64-musl': 0.59.0 + '@oxfmt/binding-openharmony-arm64': 0.59.0 + '@oxfmt/binding-win32-arm64-msvc': 0.59.0 + '@oxfmt/binding-win32-ia32-msvc': 0.59.0 + '@oxfmt/binding-win32-x64-msvc': 0.59.0 + svelte: 5.55.9(@typescript-eslint/types@8.59.4) + + oxlint-tsgolint@0.24.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.24.0 + '@oxlint-tsgolint/darwin-x64': 0.24.0 + '@oxlint-tsgolint/linux-arm64': 0.24.0 + '@oxlint-tsgolint/linux-x64': 0.24.0 + '@oxlint-tsgolint/win32-arm64': 0.24.0 + '@oxlint-tsgolint/win32-x64': 0.24.0 + + oxlint@1.74.0(oxlint-tsgolint@0.24.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.74.0 + '@oxlint/binding-android-arm64': 1.74.0 + '@oxlint/binding-darwin-arm64': 1.74.0 + '@oxlint/binding-darwin-x64': 1.74.0 + '@oxlint/binding-freebsd-x64': 1.74.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.74.0 + '@oxlint/binding-linux-arm-musleabihf': 1.74.0 + '@oxlint/binding-linux-arm64-gnu': 1.74.0 + '@oxlint/binding-linux-arm64-musl': 1.74.0 + '@oxlint/binding-linux-ppc64-gnu': 1.74.0 + '@oxlint/binding-linux-riscv64-gnu': 1.74.0 + '@oxlint/binding-linux-riscv64-musl': 1.74.0 + '@oxlint/binding-linux-s390x-gnu': 1.74.0 + '@oxlint/binding-linux-x64-gnu': 1.74.0 + '@oxlint/binding-linux-x64-musl': 1.74.0 + '@oxlint/binding-openharmony-arm64': 1.74.0 + '@oxlint/binding-win32-arm64-msvc': 1.74.0 + '@oxlint/binding-win32-ia32-msvc': 1.74.0 + '@oxlint/binding-win32-x64-msvc': 1.74.0 + oxlint-tsgolint: 0.24.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -28108,6 +29231,11 @@ snapshots: react: 19.1.0 scheduler: 0.26.0 + react-dom@19.3.0(react@19.3.0): + dependencies: + react: 19.3.0 + scheduler: 0.28.0 + react-fast-compare@3.2.2: {} react-freeze@1.0.4(react@19.1.0): @@ -28305,6 +29433,8 @@ snapshots: react@19.1.0: {} + react@19.3.0: {} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -28570,7 +29700,7 @@ snapshots: rollup-plugin-dts@6.4.1(rollup@4.60.4)(typescript@5.9.3): dependencies: '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 convert-source-map: 2.0.0 magic-string: 0.30.21 rollup: 4.60.4 @@ -28699,6 +29829,8 @@ snapshots: scheduler@0.26.0: {} + scheduler@0.28.0: {} + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 @@ -29427,16 +30559,16 @@ snapshots: lightningcss: 1.32.0 postcss: 8.5.12 - terser-webpack-plugin@5.6.0(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)): + terser-webpack-plugin@5.6.0(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: '@swc/core': 1.15.40 - esbuild: 0.27.7 + esbuild: 0.28.2 lightningcss: 1.32.0 postcss: 8.5.15 optional: true @@ -29451,7 +30583,7 @@ snapshots: terser@5.48.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -29509,6 +30641,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.4: {} @@ -30063,7 +31197,7 @@ snapshots: dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.12.4) '@rollup/pluginutils': 5.3.0(rollup@4.60.4) - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript@5.9.3) '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 debug: 4.4.3(supports-color@7.2.0) @@ -30161,7 +31295,7 @@ snapshots: picomatch: 4.0.7 postcss: 8.5.6 rollup: 4.60.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 @@ -30180,7 +31314,7 @@ snapshots: picomatch: 4.0.7 postcss: 8.5.6 rollup: 4.60.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 @@ -30199,7 +31333,7 @@ snapshots: picomatch: 4.0.7 postcss: 8.5.6 rollup: 4.60.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 @@ -30218,7 +31352,7 @@ snapshots: picomatch: 4.0.7 postcss: 8.5.6 rollup: 4.60.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 @@ -30273,7 +31407,7 @@ snapshots: optionalDependencies: vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 @@ -30301,7 +31435,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.13 '@types/node': 24.12.4 - jsdom: 27.4.0(supports-color@7.2.0) + jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0) transitivePeerDependencies: - jiti - less @@ -30316,7 +31450,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 @@ -30344,7 +31478,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.13 '@types/node': 24.12.4 - jsdom: 27.4.0(supports-color@8.1.1) + jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1) transitivePeerDependencies: - jiti - less @@ -30383,7 +31517,7 @@ snapshots: vue-tsc@2.2.12(typescript@5.9.3): dependencies: - '@volar/typescript': 2.4.15 + '@volar/typescript': 2.4.15(typescript@5.9.3) '@vue/language-core': 2.2.12(typescript@5.9.3) typescript: 5.9.3 @@ -30514,12 +31648,12 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) + acorn: 8.18.0 + acorn-import-phases: 1.0.4(acorn@8.18.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.22.0 - es-module-lexer: 2.1.0 + es-module-lexer: 2.3.2 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -30547,7 +31681,7 @@ snapshots: - postcss - uglify-js - webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15): + webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -30555,12 +31689,12 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) + acorn: 8.18.0 + acorn-import-phases: 1.0.4(acorn@8.18.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.22.0 - es-module-lexer: 2.1.0 + es-module-lexer: 2.3.2 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -30571,7 +31705,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.7)(lightningcss@1.32.0)(postcss@8.5.15)) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) watchpack: 2.5.1 webpack-sources: 3.5.0 transitivePeerDependencies: From 08f2ee4042c99802ec72c24c9e1942a290bd402e Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:32:04 -0700 Subject: [PATCH 02/19] chore: fix test usage --- packages/octane-form/eslint.config.js | 5 ++ packages/octane-form/package.json | 43 +++++++++++---- packages/octane-form/src/index.ts | 2 +- .../_fixtures/upstream/createFormHook.tsrx | 4 +- .../tests/_fixtures/upstream/useField.tsrx | 7 ++- .../tests/_fixtures/upstream/useForm.tsrx | 27 +++++----- .../tests/conformance/exports.test.ts | 9 ++-- .../tests/conformance/parity.test.ts | 7 +-- .../tests/conformance/test-setup.ts | 24 ++------- .../octane-form/tests/differential/.gitignore | 1 - .../octane-form/tests/differential/_setup.ts | 51 ------------------ .../tests/differential/parity.test.ts | 41 -------------- packages/octane-form/vitest.config.ts | 54 +++++++++++++++++++ 13 files changed, 125 insertions(+), 150 deletions(-) create mode 100644 packages/octane-form/eslint.config.js delete mode 100644 packages/octane-form/tests/differential/.gitignore delete mode 100644 packages/octane-form/tests/differential/_setup.ts delete mode 100644 packages/octane-form/tests/differential/parity.test.ts create mode 100644 packages/octane-form/vitest.config.ts diff --git a/packages/octane-form/eslint.config.js b/packages/octane-form/eslint.config.js new file mode 100644 index 000000000..8ce6ad05f --- /dev/null +++ b/packages/octane-form/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json index 6943849b7..f12f586a9 100644 --- a/packages/octane-form/package.json +++ b/packages/octane-form/package.json @@ -14,18 +14,43 @@ "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, - "main": "src/index.ts", - "module": "src/index.ts", - "types": "src/index.ts", + "scripts": { + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src ./tests", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", + "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js", + "test:types:ts59": "tsc", + "test:lib": "vitest", + "test:lib:dev": "vitest --watch", + "test:build": "publint --strict", + "build": "tsc -p tsconfig.build.json --noEmit" + }, + "type": "module", + "types": "./src/index.ts", + "main": "./src/index.ts", + "module": "./src/index.ts", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./package.json": "./package.json" + }, + "sideEffects": false, "files": [ - "src", - "README.md" + "src" ], - "exports": { - ".": "./src/index.ts" + "engines": { + "node": ">=22" }, - "scripts": { - "test": "vitest run" + "octane": { + "hookSlots": { + "manual": [ + "src" + ] + } }, "dependencies": { "@tanstack/form-core": "workspace:*", diff --git a/packages/octane-form/src/index.ts b/packages/octane-form/src/index.ts index e287cd186..b01174176 100644 --- a/packages/octane-form/src/index.ts +++ b/packages/octane-form/src/index.ts @@ -1,6 +1,6 @@ export * from '@tanstack/form-core'; -export { useSelector, useStore } from '@tanstack/octane-store'; +export { useSelector } from '@tanstack/octane-store'; export * from './createFormHook.tsrx'; export * from './types'; diff --git a/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx b/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx index 1b96ec4f5..a423e18a8 100644 --- a/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx +++ b/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx @@ -3,7 +3,7 @@ import { describe, expect, it } from 'vitest'; import { render, waitFor } from '@octanejs/testing-library'; import { formOptions } from '@tanstack/form-core'; import userEvent from '@testing-library/user-event'; -import { createFormHook, createFormHookContexts, useStore } from '@tanstack/octane-form'; +import { createFormHook, createFormHookContexts, useSelector } from '@tanstack/octane-form'; const user = userEvent.setup(); @@ -301,7 +301,7 @@ describe('createFormHook', () => { const ChildForm = withFieldGroup({ defaultValues: formOpts.defaultValues.person, render: function Render({ group }) { - const firstName = useStore(group.store, (state) => state.values.firstName); + const firstName = useSelector(group.store, (state) => state.values.firstName); return (

{firstName}

diff --git a/packages/octane-form/tests/_fixtures/upstream/useField.tsrx b/packages/octane-form/tests/_fixtures/upstream/useField.tsrx index eb1688fa3..541fc9cb9 100644 --- a/packages/octane-form/tests/_fixtures/upstream/useField.tsrx +++ b/packages/octane-form/tests/_fixtures/upstream/useField.tsrx @@ -3,8 +3,7 @@ import { describe, expect, it, vi } from 'vitest'; import { render, waitFor, within } from '@octanejs/testing-library'; import { userEvent } from '@testing-library/user-event'; import { useState } from 'octane'; -import { useStore } from '@tanstack/octane-store'; -import { useForm } from '@tanstack/octane-form'; +import { useForm, useSelector } from '@tanstack/octane-form'; import { sleep } from '../../conformance/utils'; const user = userEvent.setup(); @@ -996,7 +995,7 @@ describe('useField', () => { }, }, }); - const errors = useStore(form.store, (s) => s.errors); + const errors = useSelector(form.store, (s) => s.errors); return ( <> @@ -1451,7 +1450,7 @@ describe('useField', () => { }, }); - const fieldOne = useStore(form.store, (state) => state.values.fieldOne); + const fieldOne = useSelector(form.store, (state) => state.values.fieldOne); return (
diff --git a/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx b/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx index a2e22e59c..ee0cc55ae 100644 --- a/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx +++ b/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx @@ -2,9 +2,8 @@ import { describe, expect, it, vi } from 'vitest'; import { render, waitFor } from '@octanejs/testing-library'; import { userEvent } from '@testing-library/user-event'; -import { useStore } from '@tanstack/octane-store'; import { useCallback, useEffect, useState } from 'octane'; -import { mergeForm, useForm } from '@tanstack/octane-form'; +import { mergeForm, useForm, useSelector } from '@tanstack/octane-form'; import { sleep } from '../../conformance/utils'; const user = userEvent.setup(); @@ -177,7 +176,7 @@ describe('useForm', () => { }, }, }); - const onChangeError = useStore(form.store, (s) => s.errorMap.onChange); + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); return ( <> { }, }); - const errors = useStore(form.store, (s) => s.errors); + const errors = useSelector(form.store, (s) => s.errors); return ( <> { onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> { }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> { }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> { }, }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> { }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> @@ -563,7 +562,7 @@ describe('useForm', () => { }, }, }); - const errors = useStore(form.store, (s) => s.errorMap); + const errors = useSelector(form.store, (s) => s.errorMap); return ( <> @@ -624,7 +623,7 @@ describe('useForm', () => { }, }, }); - const errors = useStore(form.store, (s) => s.errors); + const errors = useSelector(form.store, (s) => s.errors); return ( <> @@ -678,7 +677,7 @@ describe('useForm', () => { }, }); - const onChangeError = useStore(form.store, (s) => s.errorMap.onChange); + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); return ( <> @@ -731,7 +730,7 @@ describe('useForm', () => { }, }); - const { errors } = useStore(form.store, (state) => ({ + const { errors } = useSelector(form.store, (state) => ({ errors: state.errors, })); @@ -762,7 +761,7 @@ describe('useForm', () => { }, }); - const { values } = useStore(form.store, (v) => v); + const { values } = useSelector(form.store, (v) => v); useEffect(() => { fn(values); diff --git a/packages/octane-form/tests/conformance/exports.test.ts b/packages/octane-form/tests/conformance/exports.test.ts index 3b4319a0e..1ff1bea4a 100644 --- a/packages/octane-form/tests/conformance/exports.test.ts +++ b/packages/octane-form/tests/conformance/exports.test.ts @@ -1,9 +1,12 @@ import { describe, expect, it } from 'vitest'; -import { useSelector, useStore } from '@tanstack/octane-form'; +import { renderHook } from '@octanejs/testing-library'; +import { act } from 'octane'; +import { FormApi, useSelector } from '@tanstack/octane-form'; describe('package exports', () => { - it('exports useSelector and useStore from @tanstack/octane-store', () => { + it('exports useSelector from the Octane Store adapter', () => { expect(useSelector).toBeTypeOf('function'); - expect(useStore).toBeTypeOf('function'); + }); +}); }); }); diff --git a/packages/octane-form/tests/conformance/parity.test.ts b/packages/octane-form/tests/conformance/parity.test.ts index 5c10bf496..c02fbbc52 100644 --- a/packages/octane-form/tests/conformance/parity.test.ts +++ b/packages/octane-form/tests/conformance/parity.test.ts @@ -2,9 +2,11 @@ import { describe, expect, it } from 'vitest'; import * as binding from '@tanstack/octane-form'; describe('export surface', () => { - it('provides every runtime export of real @tanstack/react-form', async () => { + it('provides the React runtime exports using useSelector for store subscriptions', async () => { const real = await import('@tanstack/react-form'); - expect(Object.keys(binding).sort()).toEqual(Object.keys(real).sort()); + // The Octane Store adapter uses useSelector and omits the deprecated useStore alias. + const reactExports = Object.keys(real).filter((name) => name !== 'useStore'); + expect(Object.keys(binding).sort()).toEqual(reactExports.sort()); }); it('re-exports the same @tanstack/form-core module instance', async () => { @@ -17,6 +19,5 @@ describe('export surface', () => { it('uses the Octane TanStack Store adapter', async () => { const store = await import('@tanstack/octane-store'); expect(binding.useSelector).toBe(store.useSelector); - expect(binding.useStore).toBe(store.useStore); }); }); diff --git a/packages/octane-form/tests/conformance/test-setup.ts b/packages/octane-form/tests/conformance/test-setup.ts index 0593c6c33..500ee0219 100644 --- a/packages/octane-form/tests/conformance/test-setup.ts +++ b/packages/octane-form/tests/conformance/test-setup.ts @@ -1,21 +1,3 @@ -import '@testing-library/jest-dom/vitest'; -import { cleanup } from '@octanejs/testing-library'; -import { - getIsOctaneActEnvironment, - setOctaneActEnvironment, -} from '@octanejs/testing-library/act-environment'; -import { afterAll, afterEach, beforeAll } from 'vitest'; - -// https://testing-library.com/docs/react-testing-library/api#cleanup -afterEach(() => cleanup()); - -let previousIsActEnvironment: boolean | undefined; - -beforeAll(() => { - previousIsActEnvironment = getIsOctaneActEnvironment(); - setOctaneActEnvironment(true); -}); - -afterAll(() => { - setOctaneActEnvironment(previousIsActEnvironment); -}); +import '@testing-library/jest-dom/vitest' +// Registers cleanup and the act environment using Vitest's global hooks. +import '@octanejs/testing-library' diff --git a/packages/octane-form/tests/differential/.gitignore b/packages/octane-form/tests/differential/.gitignore deleted file mode 100644 index e74e7ec30..000000000 --- a/packages/octane-form/tests/differential/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.react-cache/ diff --git a/packages/octane-form/tests/differential/_setup.ts b/packages/octane-form/tests/differential/_setup.ts deleted file mode 100644 index 6004c2ce5..000000000 --- a/packages/octane-form/tests/differential/_setup.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { compile as compileToReact } from '@tsrx/react'; -import { transformSync } from 'esbuild'; -import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; -import { basename, dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const fixtureDirectory = join(dirname(fileURLToPath(import.meta.url)), '../_fixtures'); -const cacheDirectory = join(dirname(fileURLToPath(import.meta.url)), '.react-cache'); - -function hashString(value: string): string { - let hash = 5381; - for (let index = 0; index < value.length; index++) { - hash = ((hash << 5) + hash + value.charCodeAt(index)) | 0; - } - return Math.abs(hash).toString(36); -} - -function compileFixture(sourcePath: string): void { - const compiled = compileToReact(readFileSync(sourcePath, 'utf8'), sourcePath); - if (compiled.errors?.length) { - throw new Error(`Unable to compile ${sourcePath} for React:\n${compiled.errors.join('\n')}`); - } - - const transformed = transformSync(compiled.code, { - loader: 'tsx', - jsx: 'automatic', - jsxImportSource: 'react', - target: 'esnext', - format: 'esm', - sourcefile: sourcePath, - }); - const rewritten = transformed.code - .replace( - /from\s+["']@octanejs\/tanstack-form(\/[^"']*)?["']/g, - (_match, subpath) => `from "@tanstack/react-form${subpath || ''}"`, - ) - .replace(/from\s+["']octane["']/g, 'from "react"'); - const slug = basename(sourcePath).replace(/\.tsrx$/, ''); - writeFileSync(join(cacheDirectory, `${slug}-${hashString(sourcePath)}.js`), rewritten); -} - -export async function setup(): Promise { - rmSync(cacheDirectory, { recursive: true, force: true }); - mkdirSync(cacheDirectory, { recursive: true }); - const fixture = join(fixtureDirectory, 'parity.tsrx'); - if (!existsSync(fixture)) - throw new Error(`Missing declared TanStack Form parity fixture: ${fixture}`); - compileFixture(fixture); -} - -export async function teardown(): Promise {} diff --git a/packages/octane-form/tests/differential/parity.test.ts b/packages/octane-form/tests/differential/parity.test.ts deleted file mode 100644 index 846562d87..000000000 --- a/packages/octane-form/tests/differential/parity.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { resolve } from 'node:path'; -import { describe, it } from 'vitest'; -import { - mountDifferential, - preloadDifferentialFixture, -} from '../../../octane/tests/differential/_rig.js'; - -const fixture = resolve(__dirname, '../_fixtures/parity.tsrx'); -const cache = resolve(__dirname, '.react-cache'); - -await Promise.all([preloadDifferentialFixture(fixture, cache)]); - -describe('differential: @tanstack/octane-form vs @tanstack/react-form', () => { - // @parity-case differential:tanstack-form-interactions - it('matches values, validation, arrays, and reset', async () => { - const differential = await mountDifferential(fixture, 'FormParity', undefined, cache); - - await differential.step('mount', () => {}); - await differential.step('validate an empty name', async (octane, react) => { - await octane.input('#name', ''); - await react.input('#name', ''); - }); - await differential.step('enter a valid name', async (octane, react) => { - await octane.input('#name', 'Grace'); - await react.input('#name', 'Grace'); - }); - await differential.step('push an array value', async (octane, react) => { - await octane.click('#push'); - await react.click('#push'); - }); - await differential.step('pop an array value', async (octane, react) => { - await octane.click('#pop'); - await react.click('#pop'); - }); - await differential.step('reset', async (octane, react) => { - await octane.click('#reset'); - await react.click('#reset'); - }); - differential.unmount(); - }); -}); diff --git a/packages/octane-form/vitest.config.ts b/packages/octane-form/vitest.config.ts new file mode 100644 index 000000000..3adb2b775 --- /dev/null +++ b/packages/octane-form/vitest.config.ts @@ -0,0 +1,54 @@ +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { octane } from 'octane/compiler/vite' +import { defineConfig } from 'vitest/config' + +const root = dirname(fileURLToPath(import.meta.url)) +const alias = { + '@tanstack/form-core': resolve(root, '../form-core/src/index.ts'), + '@tanstack/octane-form': resolve(root, 'src/index.ts'), + '@tanstack/react-form': resolve(root, '../react-form/src/index.ts'), +} + +export default defineConfig({ + test: { + watch: false, + projects: [ + { + plugins: [ + octane({ ssr: false, hmr: false, exclude: ['/react-form/'] }), + ], + resolve: { alias }, + test: { + name: 'octane-form', + root, + environment: 'jsdom', + globals: true, + include: ['tests/conformance/**/*.test.ts'], + setupFiles: ['tests/conformance/test-setup.ts'], + }, + }, + { + plugins: [octane({ ssr: true, hmr: false })], + resolve: { + alias: [ + { + find: /^octane$/, + replacement: fileURLToPath(import.meta.resolve('octane/server')), + }, + ...Object.entries(alias).map(([find, replacement]) => ({ + find, + replacement, + })), + ], + }, + test: { + name: 'octane-form-ssr', + root, + environment: 'node', + include: ['tests/ssr/**/*.test.ts'], + }, + }, + ], + }, +}) From 9eb082f6bd95895acabe1064c22b10c0a92c7613 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:35:58 -0700 Subject: [PATCH 03/19] chore: more tests --- packages/octane-form/README.md | 158 ++++++------------ .../tests/conformance/exports.test.ts | 36 ++-- .../tests/conformance/parity.test.ts | 38 ++--- packages/octane-form/tsconfig.build.json | 7 + packages/octane-form/tsconfig.docs.json | 4 + packages/octane-form/tsconfig.json | 28 ++-- 6 files changed, 116 insertions(+), 155 deletions(-) create mode 100644 packages/octane-form/tsconfig.build.json create mode 100644 packages/octane-form/tsconfig.docs.json diff --git a/packages/octane-form/README.md b/packages/octane-form/README.md index 7a5eda6e4..eebf951c8 100644 --- a/packages/octane-form/README.md +++ b/packages/octane-form/README.md @@ -1,109 +1,49 @@ -# @tanstack/octane-form - -[TanStack Form](https://tanstack.com/form) bindings for the -[Octane](https://github.com/octanejs/octane) UI framework. - -## Installation - -```sh -npm install @tanstack/octane-form -pnpm add @tanstack/octane-form -``` - -This package ports `@tanstack/react-form@1.33.5` onto Octane while reusing -`@tanstack/form-core@1.33.5` unchanged. The runtime export surface matches the -React adapter, so migration starts by changing the package import: - -```ts -// before -import { useForm } from '@tanstack/react-form' - -// after -import { useForm } from '@tanstack/octane-form' -``` - -The renderer-bearing adapter modules are authored as `.tsrx` and compiled by -Octane. Matching `.tsrx.d.ts` companions are checked declaration emits of those -implementations, preserving the complete generic surface for TypeScript -consumers. Recursive contracts such as `extendForm` are named in the TSRX source -rather than manually unrolled in declarations. - -Renderer-specific public types use Octane names, including `OctaneFormApi`, -`OctaneFormExtendedApi`, `AppFieldExtendedOctaneFormApi`, and -`AppFieldExtendedOctaneFieldGroupApi`. - -```tsx -import { useForm } from '@tanstack/octane-form' - -export function ProfileForm() @{ - const form = useForm({ - defaultValues: { name: '' }, - onSubmit: ({ value }) => console.log(value), - }) - - { - event.preventDefault() - void form.handleSubmit() - }} - > - - value.length === 0 ? 'Name is required' : undefined, - }} - > - {(field) => ( - - )} - - state.canSubmit}> - {(canSubmit) => } - - -} -``` - -## API - -The adapter includes `useForm`, `useField`, `useFormGroup`, `useFieldGroup`, -`createFormHook`, `createFormHookContexts`, and -`useIsomorphicLayoutEffect`. It also re-exports `@tanstack/form-core` and the -`useSelector`/`useStore` helpers from `@tanstack/octane-store`. - -Octane uses native DOM events. Text controls should call -`field.handleChange()` from `onInput`; native `change` fires only on -blur/commit. TanStack Form option names such as `onChange`, validators, and -listener keys retain their upstream spelling. - -Server rendering through `octane/server` is supported. Field and form -subscriptions render their initial snapshots without browser-only setup. - -## Verification - -The port runs TanStack Form's React adapter tests against Octane, including -validation, async validation and debounce, linked fields, arrays, form groups, -component contexts, submission, reset, and subscription behavior. A -differential test compiles the same `.tsrx` form for Octane and React and -compares its DOM after value, validation, array, and reset interactions. The -upstream compile-time suite and an SSR fixture are also included. - -Current scope and verification status are tracked in the generated -[bindings status table](../../docs/bindings-status.md), sourced from this -package's [`status.json`](./status.json). - -## License - -MIT — contains source derived from -[TanStack Form](https://github.com/TanStack/form) (MIT), adapted for Octane. + + + + + + TanStack Octane Form + + +Hooks for managing form state in Octane + + + #TanStack + + + + + + + + + + semantic-release + + Join the discussion on Github +Best of JS + + + + + Gitpod Ready-to-Code + + +Enjoy this library? Try the entire [TanStack](https://tanstack.com)! [TanStack Table](https://github.com/TanStack/table), [TanStack Router](https://github.com/tanstack/router), [TanStack Virtual](https://github.com/tanstack/virtual), [React Charts](https://github.com/TanStack/react-charts), [React Ranger](https://github.com/TanStack/ranger) + +## Visit [tanstack.com/form](https://tanstack.com/form) for docs, guides, API and more! + +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) + + diff --git a/packages/octane-form/tests/conformance/exports.test.ts b/packages/octane-form/tests/conformance/exports.test.ts index 1ff1bea4a..e97973e76 100644 --- a/packages/octane-form/tests/conformance/exports.test.ts +++ b/packages/octane-form/tests/conformance/exports.test.ts @@ -1,12 +1,28 @@ -import { describe, expect, it } from 'vitest'; -import { renderHook } from '@octanejs/testing-library'; -import { act } from 'octane'; -import { FormApi, useSelector } from '@tanstack/octane-form'; +import { describe, expect, it } from 'vitest' +import { renderHook } from '@octanejs/testing-library' +import { act } from 'octane' +import { FormApi, useSelector } from '@tanstack/octane-form' describe('package exports', () => { - it('exports useSelector from the Octane Store adapter', () => { - expect(useSelector).toBeTypeOf('function'); - }); -}); - }); -}); + it('exports useSelector from the Octane Store adapter', () => { + expect(useSelector).toBeTypeOf('function') + }) +}) + +describe('useSelector', () => { + it('keeps multiple subscriptions in the same component independent', () => { + const form = new FormApi({ + defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, + }) + const { result } = renderHook(() => ({ + firstName: useSelector(form.store, (state) => state.values.firstName), + lastName: useSelector(form.store, (state) => state.values.lastName), + })) + + expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }) + act(() => form.setFieldValue('firstName', 'Grace')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }) + act(() => form.setFieldValue('lastName', 'Hopper')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }) + }) +}) diff --git a/packages/octane-form/tests/conformance/parity.test.ts b/packages/octane-form/tests/conformance/parity.test.ts index c02fbbc52..68f87ccc5 100644 --- a/packages/octane-form/tests/conformance/parity.test.ts +++ b/packages/octane-form/tests/conformance/parity.test.ts @@ -1,23 +1,23 @@ -import { describe, expect, it } from 'vitest'; -import * as binding from '@tanstack/octane-form'; +import { describe, expect, it } from 'vitest' +import * as binding from '@tanstack/octane-form' describe('export surface', () => { - it('provides the React runtime exports using useSelector for store subscriptions', async () => { - const real = await import('@tanstack/react-form'); - // The Octane Store adapter uses useSelector and omits the deprecated useStore alias. - const reactExports = Object.keys(real).filter((name) => name !== 'useStore'); - expect(Object.keys(binding).sort()).toEqual(reactExports.sort()); - }); + it('provides the React runtime exports using useSelector for store subscriptions', async () => { + const real = await import('@tanstack/react-form') + // The Octane Store adapter uses useSelector and omits the deprecated useStore alias. + const reactExports = Object.keys(real).filter((name) => name !== 'useStore') + expect(Object.keys(binding).sort()).toEqual(reactExports.sort()) + }) - it('re-exports the same @tanstack/form-core module instance', async () => { - const core = await import('@tanstack/form-core'); - expect(binding.FormApi).toBe(core.FormApi); - expect(binding.FieldApi).toBe(core.FieldApi); - expect(binding.formOptions).toBe(core.formOptions); - }); + it('re-exports the same @tanstack/form-core module instance', async () => { + const core = await import('@tanstack/form-core') + expect(binding.FormApi).toBe(core.FormApi) + expect(binding.FieldApi).toBe(core.FieldApi) + expect(binding.formOptions).toBe(core.formOptions) + }) - it('uses the Octane TanStack Store adapter', async () => { - const store = await import('@tanstack/octane-store'); - expect(binding.useSelector).toBe(store.useSelector); - }); -}); + it('uses the Octane TanStack Store adapter', async () => { + const store = await import('@tanstack/octane-store') + expect(binding.useSelector).toBe(store.useSelector) + }) +}) diff --git a/packages/octane-form/tsconfig.build.json b/packages/octane-form/tsconfig.build.json new file mode 100644 index 000000000..89dadab5e --- /dev/null +++ b/packages/octane-form/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": {} + }, + "include": ["src"] +} diff --git a/packages/octane-form/tsconfig.docs.json b/packages/octane-form/tsconfig.docs.json new file mode 100644 index 000000000..b90fc83e0 --- /dev/null +++ b/packages/octane-form/tsconfig.docs.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/packages/octane-form/tsconfig.json b/packages/octane-form/tsconfig.json index f0bda23c9..edcb4eeff 100644 --- a/packages/octane-form/tsconfig.json +++ b/packages/octane-form/tsconfig.json @@ -1,21 +1,15 @@ { + "extends": "../../tsconfig.json", "compilerOptions": { - "module": "esnext", - "lib": ["esnext", "dom", "dom.iterable"], - "target": "esnext", - "jsx": "react-jsx", - "noEmit": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "noEmitOnError": true, - "noErrorTruncation": true, - "allowSyntheticDefaultImports": true, - "skipLibCheck": true, - "verbatimModuleSyntax": true, - "types": ["node"], - "strict": true, - "jsxImportSource": "octane" + "paths": { + "@tanstack/octane-form": ["./src"], + "@tanstack/form-core": ["../form-core/src"] + } }, - "include": ["./src/"], - "exclude": ["node_modules", "dist", "tests"] + "include": [ + "src", + "tests", + "eslint.config.js", + "vitest.config.ts" + ] } From a9fe1fe48c5cd90885e40417ac7622f0713653a0 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:50:46 -0700 Subject: [PATCH 04/19] chore: flatten our tests --- packages/octane-form/package.json | 6 +- .../tests/_fixtures/divergences.tsrx | 55 -------- .../_fixtures/ordinary/repo-regressions.tsrx | 87 ------------- .../ordinary/strict-mode-divergences.tsrx | 121 ------------------ .../octane-form/tests/_fixtures/parity.tsrx | 62 --------- .../octane-form/tests/_fixtures/server.tsrx | 18 --- .../tests/conformance/createFormHook.test.ts | 2 - .../tests/conformance/divergences.test.ts | 28 ---- .../tests/conformance/exports.test.ts | 28 ---- .../onChangeListenTo.adapter.test.ts | 2 - .../tests/conformance/parity.test.ts | 23 ---- .../conformance/repo-regressions.test.ts | 21 --- .../strict-mode-divergences.test.ts | 2 - .../tests/conformance/useField.test.ts | 2 - .../tests/conformance/useForm.test.ts | 2 - .../tests/conformance/useFormGroup.test.ts | 2 - .../createFormHook.test-d.tsx | 22 ---- ...FormHook.tsrx => createFormHook.test.tsrx} | 3 +- ...srx => onChangeListenTo.adapter.test.tsrx} | 7 +- .../{ssr/server.test.ts => server.test.tsrx} | 20 ++- .../tests/{conformance => }/test-setup.ts | 0 .../{typetests => tests}/useField.test-d.tsx | 0 .../useField.tsrx => useField.test.tsrx} | 22 +++- .../{typetests => tests}/useForm.test-d.tsx | 0 .../useForm.tsrx => useForm.test.tsrx} | 65 +++++++++- .../useFormGroup.test-d.tsx | 0 ...eFormGroup.tsrx => useFormGroup.test.tsrx} | 39 +++++- .../tests/{conformance => }/utils.ts | 0 packages/octane-form/tsconfig.json | 9 +- packages/octane-form/typetests/tsconfig.json | 19 --- packages/octane-form/vitest.config.ts | 26 ++-- pnpm-lock.yaml | 56 ++------ 32 files changed, 169 insertions(+), 580 deletions(-) delete mode 100644 packages/octane-form/tests/_fixtures/divergences.tsrx delete mode 100644 packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx delete mode 100644 packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx delete mode 100644 packages/octane-form/tests/_fixtures/parity.tsrx delete mode 100644 packages/octane-form/tests/_fixtures/server.tsrx delete mode 100644 packages/octane-form/tests/conformance/createFormHook.test.ts delete mode 100644 packages/octane-form/tests/conformance/divergences.test.ts delete mode 100644 packages/octane-form/tests/conformance/exports.test.ts delete mode 100644 packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts delete mode 100644 packages/octane-form/tests/conformance/parity.test.ts delete mode 100644 packages/octane-form/tests/conformance/repo-regressions.test.ts delete mode 100644 packages/octane-form/tests/conformance/strict-mode-divergences.test.ts delete mode 100644 packages/octane-form/tests/conformance/useField.test.ts delete mode 100644 packages/octane-form/tests/conformance/useForm.test.ts delete mode 100644 packages/octane-form/tests/conformance/useFormGroup.test.ts rename packages/octane-form/{typetests => tests}/createFormHook.test-d.tsx (98%) rename packages/octane-form/tests/{_fixtures/upstream/createFormHook.tsrx => createFormHook.test.tsrx} (99%) rename packages/octane-form/tests/{_fixtures/upstream/onChangeListenTo.adapter.tsrx => onChangeListenTo.adapter.test.tsrx} (92%) rename packages/octane-form/tests/{ssr/server.test.ts => server.test.tsrx} (54%) rename packages/octane-form/tests/{conformance => }/test-setup.ts (100%) rename packages/octane-form/{typetests => tests}/useField.test-d.tsx (100%) rename packages/octane-form/tests/{_fixtures/upstream/useField.tsrx => useField.test.tsrx} (98%) rename packages/octane-form/{typetests => tests}/useForm.test-d.tsx (100%) rename packages/octane-form/tests/{_fixtures/upstream/useForm.tsrx => useForm.test.tsrx} (92%) rename packages/octane-form/{typetests => tests}/useFormGroup.test-d.tsx (100%) rename packages/octane-form/tests/{_fixtures/upstream/useFormGroup.tsrx => useFormGroup.test.tsrx} (87%) rename packages/octane-form/tests/{conformance => }/utils.ts (100%) delete mode 100644 packages/octane-form/typetests/tsconfig.json diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json index f12f586a9..a2bb2c144 100644 --- a/packages/octane-form/package.json +++ b/packages/octane-form/package.json @@ -23,7 +23,7 @@ "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js", "test:types:ts59": "tsc", "test:lib": "vitest", - "test:lib:dev": "vitest --watch", + "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "tsc -p tsconfig.build.json --noEmit" }, @@ -63,11 +63,7 @@ "@octanejs/testing-library": "^0.1.51", "@testing-library/jest-dom": "^6.8.0", "@testing-library/user-event": "^14.6.1", - "@tsrx/react": "^0.3.4", - "esbuild": "^0.28.2", "octane": "^0.2.16", - "react": "19.1.0", - "react-dom": "19.1.0", "vitest": "^3.2.4" } } diff --git a/packages/octane-form/tests/_fixtures/divergences.tsrx b/packages/octane-form/tests/_fixtures/divergences.tsrx deleted file mode 100644 index 7e0a4f78d..000000000 --- a/packages/octane-form/tests/_fixtures/divergences.tsrx +++ /dev/null @@ -1,55 +0,0 @@ -import { fireEvent, render } from '@octanejs/testing-library'; -import { createFormHook, createFormHookContexts, useForm } from '../../src/index'; - -export function renderRegisteredFieldComponent() { - const { fieldContext, formContext, useFieldContext } = createFormHookContexts(); - - function TextField({ label }: { label: string }) { - const field = useFieldContext(); - return ; - } - - const { useAppForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: {}, - fieldContext, - formContext, - }); - - function App() { - const form = useAppForm({ defaultValues: { name: 'Ada' } }); - return - {(field) => } - ; - } - - return render().getByLabelText('Name'); -} - -export function renderNativeEventForm() { - let observedEvent: Event | undefined; - - function App() { - const form = useForm({ defaultValues: { name: '' } }); - return - {(field) => { - observedEvent = event; - field.handleChange(event.target.value); - }} - />} - ; - } - - const input = render().getByLabelText('Name'); - fireEvent.input(input, { target: { value: 'Grace' } }); - return { input, observedEvent }; -} diff --git a/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx b/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx deleted file mode 100644 index 1a695d207..000000000 --- a/packages/octane-form/tests/_fixtures/ordinary/repo-regressions.tsrx +++ /dev/null @@ -1,87 +0,0 @@ -// Repository-authored regressions that are not present in the pinned upstream -// suite. Keep them outside react-parity ownership so ordinary shards execute -// them. -import { describe, expect, it } from 'vitest'; -import { render, waitFor } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useReducer, useState } from 'octane'; -import { useForm } from '@tanstack/octane-form'; - -const user = userEvent.setup(); - -describe('tanstack-form repository regressions', () => { - it('mounts a replacement form when an explicit formId is removed', async () => { - const mountedIds: string[] = []; - - function Comp() { - const [formId, setFormId] = useState('first'); - const [, forceRender] = useReducer((count) => count + 1, 0); - const form = useForm({ - formId, - listeners: { - onMount: () => mountedIds.push(formId ?? 'fallback'), - }, - }); - - return <> - {form.formId} - - - ; - } - - const { getByTestId } = render(); - const id = getByTestId('dynamic-form-id'); - expect(id).toHaveTextContent('first'); - expect(mountedIds).toEqual(['first']); - - await user.click(getByTestId('clear-form-id')); - await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); - expect(id).not.toHaveTextContent('first'); - const fallbackId = id.textContent; - expect(fallbackId).not.toBe(''); - - await user.click(getByTestId('rerender-form')); - expect(id).toHaveTextContent(fallbackId!); - expect(mountedIds).toEqual(['first', 'fallback']); - }); - - it('uses the current group state throughout a name change render', async () => { - const observedValues: string[] = []; - - function Comp() { - const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); - const form = useForm({ - defaultValues: { - step1: { label: 'first' }, - step2: { label: 'second' }, - }, - }); - - return <> - - - {(group) => { - observedValues.push(group.state.value.label); - return {group.state.value.label}; - }} - - ; - } - - const { getByTestId } = render(); - expect(getByTestId('group-label')).toHaveTextContent('first'); - - observedValues.length = 0; - await user.click(getByTestId('change-group')); - - expect(getByTestId('group-label')).toHaveTextContent('second'); - expect(observedValues).not.toContain('first'); - }); -}); diff --git a/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx b/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx deleted file mode 100644 index ad77a01e0..000000000 --- a/packages/octane-form/tests/_fixtures/ordinary/strict-mode-divergences.tsrx +++ /dev/null @@ -1,121 +0,0 @@ -// OCTANE DIVERGENCE: upstream wraps these scenarios in to prove -// double-invoke behavior. Octane has no StrictMode double-invoke, so the cases -// run without that wrapper as ordinary package coverage rather than React -// parity evidence. -import { describe, expect, it } from 'vitest'; -import { render } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useState } from 'octane'; -import { useForm } from '@tanstack/octane-form'; -import type { AnyFieldApi } from '@tanstack/octane-form'; - -const user = userEvent.setup(); - -describe('useField StrictMode divergences', () => { - it('should handle strict mode properly with conditional fields', async () => { - function FieldInfo({ field }: { field: AnyFieldApi }) { - return <> - {field.state.meta.isTouched && field.state.meta.errors.length - ? {field.state.meta.errors.join(',')} - : null} - {field.state.meta.isValidating ? 'Validating...' : null} - ; - } - - function Comp() { - const [showField, setShowField] = useState(true); - - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async () => {}, - }); - - return
-
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > -
- {/* A type-safe field component*/} - {showField - ? (!value ? 'A first name is required' : undefined), - }} - children={(field) => { - // Avoid hasty abstractions. Render props are great! - return <> - - field.handleChange(e.target.value)} - /> - - ; - }} - /> - : null} -
-
- <> - - field.handleChange(e.target.value)} - /> - - } - /> -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => } - /> - - -
; - } - - const { getByText, findByText, queryByText } = render(); - - await user.click(getByText('Submit')); - expect(await findByText('A first name is required')).toBeInTheDocument(); - await user.click(getByText('Hide field')); - await user.click(getByText('Submit')); - expect(queryByText('A first name is required')).not.toBeInTheDocument(); - }); - - it('should handle deeply nested values', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: { first: 'Test', last: 'User' }, - }, - }); - - return

{field.state.value}

} />; - } - - const { queryByText, findByText } = render(); - - expect(queryByText('Test')).not.toBeInTheDocument(); - expect(await findByText('User')).toBeInTheDocument(); - }); -}); diff --git a/packages/octane-form/tests/_fixtures/parity.tsrx b/packages/octane-form/tests/_fixtures/parity.tsrx deleted file mode 100644 index 56a5c3e7c..000000000 --- a/packages/octane-form/tests/_fixtures/parity.tsrx +++ /dev/null @@ -1,62 +0,0 @@ -import { useForm } from '@tanstack/octane-form'; - -export function FormParity() @{ - const form = useForm({ - defaultValues: { - name: 'Ada', - tags: ['compiler'], - }, - }); - -
{ - event.preventDefault(); - void form.handleSubmit(); - }} - > - (value.length === 0 ? 'Name is required' : undefined), - }} - > - {(field) => } - - - - {(field) =>
- - -
} -
- - state.values}> - {(values) => {JSON.stringify(values)}} - - state.canSubmit}> - {(canSubmit) => } - - -
-} diff --git a/packages/octane-form/tests/_fixtures/server.tsrx b/packages/octane-form/tests/_fixtures/server.tsrx deleted file mode 100644 index 79e8a9959..000000000 --- a/packages/octane-form/tests/_fixtures/server.tsrx +++ /dev/null @@ -1,18 +0,0 @@ -import { useForm } from '@tanstack/octane-form'; - -export function ServerForm() @{ - const form = useForm({ - defaultValues: { - name: 'Server Ada', - }, - }); - -
- - {(field) => } - - state.values.name}> - {(name) => {name}} - -
-} diff --git a/packages/octane-form/tests/conformance/createFormHook.test.ts b/packages/octane-form/tests/conformance/createFormHook.test.ts deleted file mode 100644 index cf810b354..000000000 --- a/packages/octane-form/tests/conformance/createFormHook.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// The renderer-bearing upstream suite lives in a TSRX fixture module. -import '../_fixtures/upstream/createFormHook.tsrx'; diff --git a/packages/octane-form/tests/conformance/divergences.test.ts b/packages/octane-form/tests/conformance/divergences.test.ts deleted file mode 100644 index 5cc7956cf..000000000 --- a/packages/octane-form/tests/conformance/divergences.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { renderHook } from '@octanejs/testing-library'; -import { describe, expect, it } from 'vitest'; -import { useForm } from '../../src/index'; -import { - renderNativeEventForm, - renderRegisteredFieldComponent, -} from '../_fixtures/divergences.tsrx'; - -describe('@tanstack/octane-form documented divergences', () => { - it('keeps the generated form identity stable across rerenders', () => { - const { result, rerender } = renderHook(() => useForm({ defaultValues: { name: '' } })); - const initial = result.current.formId; - rerender(); - expect(initial).toBeTruthy(); - expect(result.current.formId).toBe(initial); - }); - - it('registers and renders callable Octane field components', () => { - expect(renderRegisteredFieldComponent()).toHaveValue('Ada'); - }); - - it('receives the native input event while updating field state', () => { - const { input, observedEvent } = renderNativeEventForm(); - expect(observedEvent).toBeInstanceOf(Event); - expect('nativeEvent' in observedEvent!).toBe(false); - expect(input).toHaveValue('Grace'); - }); -}); diff --git a/packages/octane-form/tests/conformance/exports.test.ts b/packages/octane-form/tests/conformance/exports.test.ts deleted file mode 100644 index e97973e76..000000000 --- a/packages/octane-form/tests/conformance/exports.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { renderHook } from '@octanejs/testing-library' -import { act } from 'octane' -import { FormApi, useSelector } from '@tanstack/octane-form' - -describe('package exports', () => { - it('exports useSelector from the Octane Store adapter', () => { - expect(useSelector).toBeTypeOf('function') - }) -}) - -describe('useSelector', () => { - it('keeps multiple subscriptions in the same component independent', () => { - const form = new FormApi({ - defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, - }) - const { result } = renderHook(() => ({ - firstName: useSelector(form.store, (state) => state.values.firstName), - lastName: useSelector(form.store, (state) => state.values.lastName), - })) - - expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }) - act(() => form.setFieldValue('firstName', 'Grace')) - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }) - act(() => form.setFieldValue('lastName', 'Hopper')) - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }) - }) -}) diff --git a/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts b/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts deleted file mode 100644 index c4377801a..000000000 --- a/packages/octane-form/tests/conformance/onChangeListenTo.adapter.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// The renderer-bearing upstream suite lives in a TSRX fixture module. -import '../_fixtures/upstream/onChangeListenTo.adapter.tsrx'; diff --git a/packages/octane-form/tests/conformance/parity.test.ts b/packages/octane-form/tests/conformance/parity.test.ts deleted file mode 100644 index 68f87ccc5..000000000 --- a/packages/octane-form/tests/conformance/parity.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { describe, expect, it } from 'vitest' -import * as binding from '@tanstack/octane-form' - -describe('export surface', () => { - it('provides the React runtime exports using useSelector for store subscriptions', async () => { - const real = await import('@tanstack/react-form') - // The Octane Store adapter uses useSelector and omits the deprecated useStore alias. - const reactExports = Object.keys(real).filter((name) => name !== 'useStore') - expect(Object.keys(binding).sort()).toEqual(reactExports.sort()) - }) - - it('re-exports the same @tanstack/form-core module instance', async () => { - const core = await import('@tanstack/form-core') - expect(binding.FormApi).toBe(core.FormApi) - expect(binding.FieldApi).toBe(core.FieldApi) - expect(binding.formOptions).toBe(core.formOptions) - }) - - it('uses the Octane TanStack Store adapter', async () => { - const store = await import('@tanstack/octane-store') - expect(binding.useSelector).toBe(store.useSelector) - }) -}) diff --git a/packages/octane-form/tests/conformance/repo-regressions.test.ts b/packages/octane-form/tests/conformance/repo-regressions.test.ts deleted file mode 100644 index e1c1073dd..000000000 --- a/packages/octane-form/tests/conformance/repo-regressions.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Ordinary repository-authored regressions; not react-parity owned. -import '../_fixtures/ordinary/repo-regressions.tsrx'; -import { expect, it } from 'vitest'; -import { FieldApi, FormApi } from '@tanstack/octane-form'; - -it('deleting a field preserves a mounted sibling whose name shares its prefix', () => { - const form = new FormApi({ defaultValues: { name: 'Ada', nameSuffix: 'Lovelace' } }); - const unmountForm = form.mount(); - const sibling = new FieldApi({ form, name: 'nameSuffix' }); - const unmountSibling = sibling.mount(); - try { - form.deleteField('name'); - expect(form.getFieldValue('name')).toBeUndefined(); - expect(form.getFieldValue('nameSuffix')).toBe('Lovelace'); - sibling.handleChange('Byron'); - expect(form.getFieldValue('nameSuffix')).toBe('Byron'); - } finally { - unmountSibling(); - unmountForm(); - } -}); diff --git a/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts b/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts deleted file mode 100644 index a35b76656..000000000 --- a/packages/octane-form/tests/conformance/strict-mode-divergences.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Ordinary StrictMode-divergence coverage; not react-parity owned. -import '../_fixtures/ordinary/strict-mode-divergences.tsrx'; diff --git a/packages/octane-form/tests/conformance/useField.test.ts b/packages/octane-form/tests/conformance/useField.test.ts deleted file mode 100644 index 7eb5dceb5..000000000 --- a/packages/octane-form/tests/conformance/useField.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// The renderer-bearing upstream suite lives in a TSRX fixture module. -import '../_fixtures/upstream/useField.tsrx'; diff --git a/packages/octane-form/tests/conformance/useForm.test.ts b/packages/octane-form/tests/conformance/useForm.test.ts deleted file mode 100644 index 122b62ea4..000000000 --- a/packages/octane-form/tests/conformance/useForm.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// The renderer-bearing upstream suite lives in a TSRX fixture module. -import '../_fixtures/upstream/useForm.tsrx'; diff --git a/packages/octane-form/tests/conformance/useFormGroup.test.ts b/packages/octane-form/tests/conformance/useFormGroup.test.ts deleted file mode 100644 index 9a570de11..000000000 --- a/packages/octane-form/tests/conformance/useFormGroup.test.ts +++ /dev/null @@ -1,2 +0,0 @@ -// The renderer-bearing upstream suite lives in a TSRX fixture module. -import '../_fixtures/upstream/useFormGroup.tsrx'; diff --git a/packages/octane-form/typetests/createFormHook.test-d.tsx b/packages/octane-form/tests/createFormHook.test-d.tsx similarity index 98% rename from packages/octane-form/typetests/createFormHook.test-d.tsx rename to packages/octane-form/tests/createFormHook.test-d.tsx index 726c5859b..e87e05dca 100644 --- a/packages/octane-form/typetests/createFormHook.test-d.tsx +++ b/packages/octane-form/tests/createFormHook.test-d.tsx @@ -2,28 +2,6 @@ import { describe, expectTypeOf, it } from 'vitest'; import { formOptions } from '@tanstack/form-core'; import { createFormHook, createFormHookContexts } from '../src'; -declare global { - namespace JSX { - type Element = unknown; - - interface ElementClass { - [name: string]: unknown; - } - - interface ElementChildrenAttribute { - children: {}; - } - - interface IntrinsicAttributes { - key?: unknown; - } - - interface IntrinsicElements { - [name: string]: any; - } - } -} - const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); function Test() { diff --git a/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx b/packages/octane-form/tests/createFormHook.test.tsrx similarity index 99% rename from packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx rename to packages/octane-form/tests/createFormHook.test.tsrx index a423e18a8..3d983e33f 100644 --- a/packages/octane-form/tests/_fixtures/upstream/createFormHook.tsrx +++ b/packages/octane-form/tests/createFormHook.test.tsrx @@ -1,9 +1,8 @@ -// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. import { describe, expect, it } from 'vitest'; import { render, waitFor } from '@octanejs/testing-library'; import { formOptions } from '@tanstack/form-core'; import userEvent from '@testing-library/user-event'; -import { createFormHook, createFormHookContexts, useSelector } from '@tanstack/octane-form'; +import { createFormHook, createFormHookContexts, useSelector } from '../src'; const user = userEvent.setup(); diff --git a/packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx similarity index 92% rename from packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx rename to packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx index 1356974aa..61ae0a559 100644 --- a/packages/octane-form/tests/_fixtures/upstream/onChangeListenTo.adapter.tsrx +++ b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx @@ -1,11 +1,8 @@ -// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. -// OCTANE DIVERGENCE: upstream renders this sole scenario under . -// Octane has no StrictMode double-invoke, so this file stays ordinary coverage. import { describe, expect, it, vi } from 'vitest'; import { act, fireEvent, render } from '@octanejs/testing-library'; import { useSelector } from '@tanstack/octane-store'; -import { useForm } from '@tanstack/octane-form'; -import { sleep } from '../../conformance/utils'; +import { useForm } from '../src'; +import { sleep } from './utils'; import type { ReadonlyStore } from '@tanstack/octane-store'; function DebugSubscribe({ store }: { store: ReadonlyStore }) { diff --git a/packages/octane-form/tests/ssr/server.test.ts b/packages/octane-form/tests/server.test.tsrx similarity index 54% rename from packages/octane-form/tests/ssr/server.test.ts rename to packages/octane-form/tests/server.test.tsrx index 3d9b1a37c..be8a1dbec 100644 --- a/packages/octane-form/tests/ssr/server.test.ts +++ b/packages/octane-form/tests/server.test.tsrx @@ -1,6 +1,24 @@ import { describe, expect, it } from 'vitest'; import { renderToStaticMarkup } from 'octane/server'; -import { ServerForm } from '../_fixtures/server.tsrx'; + +import { useForm } from '../src'; + +function ServerForm() @{ + const form = useForm({ + defaultValues: { + name: 'Server Ada', + }, + }); + +
+ + {(field) => } + + state.values.name}> + {(name) => {name}} + +
+} describe('@tanstack/octane-form SSR', () => { it('renders field and form snapshots without a DOM', () => { diff --git a/packages/octane-form/tests/conformance/test-setup.ts b/packages/octane-form/tests/test-setup.ts similarity index 100% rename from packages/octane-form/tests/conformance/test-setup.ts rename to packages/octane-form/tests/test-setup.ts diff --git a/packages/octane-form/typetests/useField.test-d.tsx b/packages/octane-form/tests/useField.test-d.tsx similarity index 100% rename from packages/octane-form/typetests/useField.test-d.tsx rename to packages/octane-form/tests/useField.test-d.tsx diff --git a/packages/octane-form/tests/_fixtures/upstream/useField.tsrx b/packages/octane-form/tests/useField.test.tsrx similarity index 98% rename from packages/octane-form/tests/_fixtures/upstream/useField.tsrx rename to packages/octane-form/tests/useField.test.tsrx index 541fc9cb9..314a0d0b5 100644 --- a/packages/octane-form/tests/_fixtures/upstream/useField.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -1,10 +1,9 @@ -// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. import { describe, expect, it, vi } from 'vitest'; import { render, waitFor, within } from '@octanejs/testing-library'; import { userEvent } from '@testing-library/user-event'; import { useState } from 'octane'; -import { useForm, useSelector } from '@tanstack/octane-form'; -import { sleep } from '../../conformance/utils'; +import { useForm, useSelector } from '../src'; +import { sleep } from './utils'; const user = userEvent.setup(); @@ -1508,4 +1507,21 @@ describe('useField', () => { expect(queryByText('a')).toBeInTheDocument(); expect(queryByText('never')).not.toBeInTheDocument(); }); + + it('should handle deeply nested values', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: { first: 'Test', last: 'User' }, + }, + }); + + return

{field.state.value}

} />; + } + + const { queryByText, findByText } = render(); + + expect(queryByText('Test')).not.toBeInTheDocument(); + expect(await findByText('User')).toBeInTheDocument(); + }); }); diff --git a/packages/octane-form/typetests/useForm.test-d.tsx b/packages/octane-form/tests/useForm.test-d.tsx similarity index 100% rename from packages/octane-form/typetests/useForm.test-d.tsx rename to packages/octane-form/tests/useForm.test-d.tsx diff --git a/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx b/packages/octane-form/tests/useForm.test.tsrx similarity index 92% rename from packages/octane-form/tests/_fixtures/upstream/useForm.tsrx rename to packages/octane-form/tests/useForm.test.tsrx index ee0cc55ae..9b6197388 100644 --- a/packages/octane-form/tests/_fixtures/upstream/useForm.tsrx +++ b/packages/octane-form/tests/useForm.test.tsrx @@ -1,10 +1,9 @@ -// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. import { describe, expect, it, vi } from 'vitest'; -import { render, waitFor } from '@octanejs/testing-library'; +import { render, renderHook, waitFor } from '@octanejs/testing-library'; import { userEvent } from '@testing-library/user-event'; -import { useCallback, useEffect, useState } from 'octane'; -import { mergeForm, useForm, useSelector } from '@tanstack/octane-form'; -import { sleep } from '../../conformance/utils'; +import { act, useCallback, useEffect, useReducer, useState } from 'octane'; +import { FormApi, mergeForm, useForm, useSelector } from '../src'; +import { sleep } from './utils'; const user = userEvent.setup(); @@ -1088,4 +1087,60 @@ describe('useForm', () => { await user.type(input, 'updated'); await waitFor(() => expect(stateValue).toHaveTextContent('updated')); }); + + it('mounts a replacement form when an explicit formId is removed', async () => { + const mountedIds: string[] = []; + + function Comp() { + const [formId, setFormId] = useState('first'); + const [, forceRender] = useReducer((count) => count + 1, 0); + const form = useForm({ + formId, + listeners: { + onMount: () => mountedIds.push(formId ?? 'fallback'), + }, + }); + + return <> + {form.formId} + + + ; + } + + const { getByTestId } = render(); + const id = getByTestId('dynamic-form-id'); + expect(id).toHaveTextContent('first'); + expect(mountedIds).toEqual(['first']); + + await user.click(getByTestId('clear-form-id')); + await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); + expect(id).not.toHaveTextContent('first'); + const fallbackId = id.textContent; + expect(fallbackId).not.toBe(''); + + await user.click(getByTestId('rerender-form')); + expect(id).toHaveTextContent(fallbackId!); + expect(mountedIds).toEqual(['first', 'fallback']); + }); + + it('keeps multiple subscriptions in the same component independent', () => { + const form = new FormApi({ + defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, + }); + const { result } = renderHook(() => ({ + firstName: useSelector(form.store, (state) => state.values.firstName), + lastName: useSelector(form.store, (state) => state.values.lastName), + })); + + expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }); + act(() => form.setFieldValue('firstName', 'Grace')); + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }); + act(() => form.setFieldValue('lastName', 'Hopper')); + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }); + }); }); diff --git a/packages/octane-form/typetests/useFormGroup.test-d.tsx b/packages/octane-form/tests/useFormGroup.test-d.tsx similarity index 100% rename from packages/octane-form/typetests/useFormGroup.test-d.tsx rename to packages/octane-form/tests/useFormGroup.test-d.tsx diff --git a/packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx b/packages/octane-form/tests/useFormGroup.test.tsrx similarity index 87% rename from packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx rename to packages/octane-form/tests/useFormGroup.test.tsrx index 130365a14..4e4bf25e0 100644 --- a/packages/octane-form/tests/_fixtures/upstream/useFormGroup.tsrx +++ b/packages/octane-form/tests/useFormGroup.test.tsrx @@ -1,8 +1,8 @@ -// Ported from @tanstack/react-form 1.33.2 to the Octane test renderer. import { describe, expect, it, vi } from 'vitest'; import { render, waitFor } from '@octanejs/testing-library'; import { userEvent } from '@testing-library/user-event'; -import { useForm } from '@tanstack/octane-form'; +import { useState } from 'octane'; +import { useForm } from '../src'; const user = userEvent.setup(); @@ -314,4 +314,39 @@ describe('form.FormGroup', () => { expect(button.disabled).toBe(false); expect(onGroupSubmit).toHaveBeenCalledTimes(1); }); + + it('uses the current group state throughout a name change render', async () => { + const observedValues: string[] = []; + + function Comp() { + const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); + const form = useForm({ + defaultValues: { + step1: { label: 'first' }, + step2: { label: 'second' }, + }, + }); + + return <> + + + {(group) => { + observedValues.push(group.state.value.label); + return {group.state.value.label}; + }} + + ; + } + + const { getByTestId } = render(); + expect(getByTestId('group-label')).toHaveTextContent('first'); + + observedValues.length = 0; + await user.click(getByTestId('change-group')); + + expect(getByTestId('group-label')).toHaveTextContent('second'); + expect(observedValues).not.toContain('first'); + }); }); diff --git a/packages/octane-form/tests/conformance/utils.ts b/packages/octane-form/tests/utils.ts similarity index 100% rename from packages/octane-form/tests/conformance/utils.ts rename to packages/octane-form/tests/utils.ts diff --git a/packages/octane-form/tsconfig.json b/packages/octane-form/tsconfig.json index edcb4eeff..962f4944d 100644 --- a/packages/octane-form/tsconfig.json +++ b/packages/octane-form/tsconfig.json @@ -1,15 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "octane", "paths": { "@tanstack/octane-form": ["./src"], "@tanstack/form-core": ["../form-core/src"] } }, - "include": [ - "src", - "tests", - "eslint.config.js", - "vitest.config.ts" - ] + "include": ["src", "tests", "*.config.js", "*.config.ts"] } diff --git a/packages/octane-form/typetests/tsconfig.json b/packages/octane-form/typetests/tsconfig.json deleted file mode 100644 index 9eecb98fa..000000000 --- a/packages/octane-form/typetests/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "module": "esnext", - "target": "es2018", - "jsx": "react-jsx", - "jsxImportSource": "octane", - "moduleResolution": "bundler", - "esModuleInterop": true, - "lib": ["dom", "dom.iterable", "esnext"], - "skipLibCheck": true, - "types": ["node"], - "noEmit": true, - "noErrorTruncation": true, - "noUnusedLocals": false, - "noUnusedParameters": false - }, - "include": ["./**/*.test-d.ts", "./**/*.test-d.tsx", "./__fixtures__/**/*.ts"] -} diff --git a/packages/octane-form/vitest.config.ts b/packages/octane-form/vitest.config.ts index 3adb2b775..00de88421 100644 --- a/packages/octane-form/vitest.config.ts +++ b/packages/octane-form/vitest.config.ts @@ -2,30 +2,37 @@ import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { octane } from 'octane/compiler/vite' import { defineConfig } from 'vitest/config' +import packageJson from './package.json' with { type: 'json' } const root = dirname(fileURLToPath(import.meta.url)) const alias = { '@tanstack/form-core': resolve(root, '../form-core/src/index.ts'), '@tanstack/octane-form': resolve(root, 'src/index.ts'), - '@tanstack/react-form': resolve(root, '../react-form/src/index.ts'), } export default defineConfig({ test: { watch: false, + coverage: { + enabled: true, + provider: 'istanbul', + include: ['src/**/*'], + extension: ['.ts', '.tsrx'], + }, projects: [ { - plugins: [ - octane({ ssr: false, hmr: false, exclude: ['/react-form/'] }), - ], + plugins: [octane({ ssr: false, hmr: false })], resolve: { alias }, test: { - name: 'octane-form', + name: packageJson.name, root, + dir: './tests', environment: 'jsdom', globals: true, - include: ['tests/conformance/**/*.test.ts'], - setupFiles: ['tests/conformance/test-setup.ts'], + include: ['**/*.test.{ts,tsrx}'], + exclude: ['**/server.test.tsrx'], + setupFiles: ['./tests/test-setup.ts'], + typecheck: { enabled: true }, }, }, { @@ -43,10 +50,11 @@ export default defineConfig({ ], }, test: { - name: 'octane-form-ssr', + name: `${packageJson.name}:ssr`, root, + dir: './tests', environment: 'node', - include: ['tests/ssr/**/*.test.ts'], + include: ['**/server.test.tsrx'], }, }, ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 172d54c56..9c04ae6bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1873,32 +1873,20 @@ importers: version: link:../form-core '@tanstack/octane-store': specifier: ^0.12.2 - version: 0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + version: 0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) devDependencies: '@octanejs/testing-library': specifier: ^0.1.51 - version: 0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + version: 0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) '@testing-library/jest-dom': specifier: ^6.8.0 version: 6.9.1 '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.7(@testing-library/dom@10.4.1) - '@tsrx/react': - specifier: ^0.3.4 - version: 0.3.4(@typescript-eslint/types@8.59.4)(react@19.1.0) - esbuild: - specifier: ^0.28.2 - version: 0.28.2 octane: specifier: ^0.2.16 - version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - react: - specifier: 19.1.0 - version: 19.1.0 - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) + version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) @@ -7881,16 +7869,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - '@tsrx/react-runtime@0.1.10': - resolution: {integrity: sha512-Az9OMPCXHGAsnPRztq065KimTPKmWbq6SAbilJ4y5VFZfE0Wwcn9mYyft9bPD010n+nrH/w598715FLoOlNwDA==} - peerDependencies: - react: '>=18' - - '@tsrx/react@0.3.4': - resolution: {integrity: sha512-/Pel+fMfipoqMRr0N956/dnM/B1in3+IHL6V+vUkWR8KJJEVGlWDtIaGJFp+3IcmVaw/+YUyD3l1QCPYMDLYyQ==} - peerDependencies: - react: '>=18' - '@tsrx/runtime@0.2.2': resolution: {integrity: sha512-EsqZjTKWd/qrwEEk7AtaKrmTvPZWRz+H06rJjgNAb1Om0RC45xX2hZjDlv/tE20o4gcOgSCfc/AzKTq6qXlp1A==} @@ -19948,10 +19926,10 @@ snapshots: '@nx/nx-win32-x64-msvc@23.2.1': optional: true - '@octanejs/testing-library@0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + '@octanejs/testing-library@0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': dependencies: '@testing-library/dom': 10.4.1 - octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) '@one-ini/wasm@0.1.1': {} @@ -21673,10 +21651,10 @@ snapshots: '@tanstack/store': 0.11.0 lit: 3.3.3 - '@tanstack/octane-store@0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + '@tanstack/octane-store@0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': dependencies: '@tanstack/store': 0.11.1 - octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) '@tanstack/pacer-lite@0.1.1': {} @@ -22137,21 +22115,6 @@ snapshots: - svelte - vite-plus - '@tsrx/react-runtime@0.1.10(react@19.1.0)': - dependencies: - '@tsrx/runtime': 0.2.2 - react: 19.1.0 - - '@tsrx/react@0.3.4(@typescript-eslint/types@8.59.4)(react@19.1.0)': - dependencies: - '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) - '@tsrx/react-runtime': 0.1.10(react@19.1.0) - esrap: 2.3.7(@typescript-eslint/types@8.59.4) - react: 19.1.0 - zimmerframe: 1.1.4 - transitivePeerDependencies: - - '@typescript-eslint/types' - '@tsrx/runtime@0.2.2': {} '@tufjs/canonical-json@2.0.0': {} @@ -24718,6 +24681,7 @@ snapshots: '@esbuild/win32-arm64': 0.28.2 '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + optional: true escalade@3.2.0: {} @@ -28401,7 +28365,7 @@ snapshots: obug@2.1.1: {} - octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): dependencies: '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) '@tsrx/oxc': 0.13.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) @@ -28416,7 +28380,7 @@ snapshots: esrap: 2.3.7(@typescript-eslint/types@8.59.4) optionalDependencies: react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react-dom: 19.3.0(react@19.3.0) typescript: 5.9.3 vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: From ebf4f090afe955e0410fceddf4905a1472eaacdc Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:56:16 -0700 Subject: [PATCH 05/19] chore: add some TSC tooling --- package.json | 1 + packages/octane-form/package.json | 1 + packages/octane-form/tsconfig.json | 4 +- pnpm-lock.yaml | 130 ++++++++++++++++++++--------- prettier.config.js | 1 + 5 files changed, 95 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 5dabc83e4..cf1c6fc82 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@testing-library/vue": "^8.1.0", + "@tsrx/prettier-plugin": "^0.4.6", "@types/node": "^24.1.0", "@vitest/coverage-istanbul": "^3.2.4", "eslint": "9.36.0", diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json index a2bb2c144..bcaff07df 100644 --- a/packages/octane-form/package.json +++ b/packages/octane-form/package.json @@ -63,6 +63,7 @@ "@octanejs/testing-library": "^0.1.51", "@testing-library/jest-dom": "^6.8.0", "@testing-library/user-event": "^14.6.1", + "@tsrx/typescript-plugin": "^0.4.6", "octane": "^0.2.16", "vitest": "^3.2.4" } diff --git a/packages/octane-form/tsconfig.json b/packages/octane-form/tsconfig.json index 962f4944d..39124da84 100644 --- a/packages/octane-form/tsconfig.json +++ b/packages/octane-form/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "jsx": "react-jsx", - "jsxImportSource": "octane", + "jsx": "preserve", + "plugins": [{ "name": "@tsrx/typescript-plugin" }], "paths": { "@tanstack/octane-form": ["./src"], "@tanstack/form-core": ["../form-core/src"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c04ae6bc..dd0a15e1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,6 +202,9 @@ importers: '@testing-library/vue': specifier: ^8.1.0 version: 8.1.0(@vue/compiler-dom@3.5.34)(@vue/compiler-sfc@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) + '@tsrx/prettier-plugin': + specifier: ^0.4.6 + version: 0.4.6(@typescript-eslint/types@8.59.4)(prettier@3.8.3) '@types/node': specifier: ^24.1.0 version: 24.12.4 @@ -1884,6 +1887,9 @@ importers: '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.7(@testing-library/dom@10.4.1) + '@tsrx/typescript-plugin': + specifier: ^0.4.6 + version: 0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3) octane: specifier: ^0.2.16 version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) @@ -7298,11 +7304,6 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 - '@sveltejs/acorn-typescript@1.0.10': - resolution: {integrity: sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA==} - peerDependencies: - acorn: ^8.9.0 - '@sveltejs/acorn-typescript@1.0.13': resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} peerDependencies: @@ -7869,9 +7870,39 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + '@tsrx/prettier-plugin@0.4.6': + resolution: {integrity: sha512-wMhBFA1+46if9LQyQFVMhs6uTMIJDoXgqBJT4fO3+6zZoATw7k9C1NvpUgARqNiiSdzT7qdV3JhZ4c2CWKJgvw==} + peerDependencies: + prettier: '>=2.0.0' + '@tsrx/runtime@0.2.2': resolution: {integrity: sha512-EsqZjTKWd/qrwEEk7AtaKrmTvPZWRz+H06rJjgNAb1Om0RC45xX2hZjDlv/tE20o4gcOgSCfc/AzKTq6qXlp1A==} + '@tsrx/typescript-plugin@0.4.6': + resolution: {integrity: sha512-hZOJuhZwoIPm9yR4yeeodZO5Py1ZVjED/jBesBdM7CSbKClJayaJ/WtZRiDwf5og40ElIqxp6TgscFlKRZ8KNg==} + hasBin: true + peerDependencies: + '@tsrx/preact': 0.2.4 + '@tsrx/react': 0.3.4 + '@tsrx/ripple': ^0.2.0 + '@tsrx/solid': 0.2.4 + '@tsrx/vue': 0.2.4 + octane: '*' + typescript: ^5.9.3 + peerDependenciesMeta: + '@tsrx/preact': + optional: true + '@tsrx/react': + optional: true + '@tsrx/ripple': + optional: true + '@tsrx/solid': + optional: true + '@tsrx/vue': + optional: true + octane: + optional: true + '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -10115,14 +10146,6 @@ packages: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} - esrap@2.2.9: - resolution: {integrity: sha512-4KijP+NxCWthMCUC3qHbE6n4vCjqgJS1uAYKhuT/GWfFTf1Qyive2TgOjep+gzbSzRfnNyaN/UU9YmdOt8Eg0A==} - peerDependencies: - '@typescript-eslint/types': ^8.2.0 - peerDependenciesMeta: - '@typescript-eslint/types': - optional: true - esrap@2.3.7: resolution: {integrity: sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow==} peerDependencies: @@ -16404,7 +16427,7 @@ snapshots: '@babel/core@7.29.0(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.1 + '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 @@ -16959,6 +16982,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -16977,6 +17009,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -17605,8 +17646,8 @@ snapshots: '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0(supports-color@8.1.1)) '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) @@ -21461,10 +21502,6 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.4 - '@sveltejs/acorn-typescript@1.0.10(acorn@8.16.0)': - dependencies: - acorn: 8.16.0 - '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': dependencies: acorn: 8.18.0 @@ -22056,7 +22093,7 @@ snapshots: '@tsrx/core@0.2.4(@typescript-eslint/types@8.59.4)': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@noble/hashes': 2.4.0 '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) '@tsrx/runtime': 0.2.2 @@ -22115,8 +22152,23 @@ snapshots: - svelte - vite-plus + '@tsrx/prettier-plugin@0.4.6(@typescript-eslint/types@8.59.4)(prettier@3.8.3)': + dependencies: + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) + prettier: 3.8.3 + transitivePeerDependencies: + - '@typescript-eslint/types' + '@tsrx/runtime@0.2.2': {} + '@tsrx/typescript-plugin@0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/typescript': 2.4.28(typescript@5.9.3) + typescript: 5.9.3 + optionalDependencies: + octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': @@ -23002,6 +23054,10 @@ snapshots: dependencies: acorn: 8.16.0 + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + acorn@8.16.0: {} acorn@8.18.0: {} @@ -24004,7 +24060,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) core-js-compat@3.49.0: @@ -24060,7 +24116,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.4 + semver: 7.8.1 optionalDependencies: webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) @@ -25156,12 +25212,6 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@2.2.9(@typescript-eslint/types@8.59.4): - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - optionalDependencies: - '@typescript-eslint/types': 8.59.4 - esrap@2.3.7(@typescript-eslint/types@8.59.4): dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -27638,8 +27688,8 @@ snapshots: micromark-extension-mdxjs@1.0.1: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -28908,7 +28958,7 @@ snapshots: cosmiconfig: 9.0.1(typescript@5.9.3) jiti: 2.7.0 postcss: 8.5.12 - semver: 7.7.4 + semver: 7.8.1 optionalDependencies: webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) transitivePeerDependencies: @@ -30449,17 +30499,17 @@ snapshots: svelte@5.55.9(@typescript-eslint/types@8.59.4): dependencies: '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.10(acorn@8.16.0) + '@jridgewell/sourcemap-codec': 1.6.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) '@types/estree': 1.0.9 '@types/trusted-types': 2.0.7 - acorn: 8.16.0 + acorn: 8.18.0 aria-query: 5.3.1 axobject-query: 4.1.0 clsx: 2.1.1 - devalue: 5.8.1 + devalue: 5.9.4 esm-env: 1.2.2 - esrap: 2.2.9(@typescript-eslint/types@8.59.4) + esrap: 2.3.7(@typescript-eslint/types@8.59.4) is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.21 @@ -30540,7 +30590,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -30590,8 +30640,8 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyglobby@0.2.16: dependencies: diff --git a/prettier.config.js b/prettier.config.js index 2c53b10e3..b393c9d80 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -5,6 +5,7 @@ const config = { semi: false, singleQuote: true, trailingComma: 'all', + plugins: ['@tsrx/prettier-plugin'], } export default config From 6b74d74c3e69104a23c84c9f082baef2665b7289 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:56:28 -0700 Subject: [PATCH 06/19] chore: prettier format --- packages/octane-form/src/createFormHook.tsrx | 1508 ++++----- .../octane-form/src/createFormHook.tsrx.d.ts | 526 ++- packages/octane-form/src/index.ts | 18 +- packages/octane-form/src/types.ts | 228 +- packages/octane-form/src/useField.tsrx | 1172 ++++--- packages/octane-form/src/useField.tsrx.d.ts | 573 +++- packages/octane-form/src/useFieldGroup.tsrx | 467 +-- .../octane-form/src/useFieldGroup.tsrx.d.ts | 169 +- packages/octane-form/src/useForm.tsrx | 494 ++- packages/octane-form/src/useForm.tsrx.d.ts | 201 +- packages/octane-form/src/useFormGroup.tsrx | 1207 +++---- .../octane-form/src/useFormGroup.tsrx.d.ts | 549 ++- packages/octane-form/src/useFormId.ts | 4 +- .../src/useIsomorphicLayoutEffect.ts | 4 +- .../tests/createFormHook.test-d.tsx | 2054 ++++++------ .../tests/createFormHook.test.tsrx | 1875 +++++------ .../tests/onChangeListenTo.adapter.test.tsrx | 265 +- packages/octane-form/tests/server.test.tsrx | 50 +- .../octane-form/tests/useField.test-d.tsx | 200 +- packages/octane-form/tests/useField.test.tsrx | 2975 ++++++++--------- packages/octane-form/tests/useForm.test-d.tsx | 310 +- packages/octane-form/tests/useForm.test.tsrx | 2301 ++++++------- .../octane-form/tests/useFormGroup.test-d.tsx | 764 ++--- .../octane-form/tests/useFormGroup.test.tsrx | 701 ++-- packages/octane-form/tests/utils.ts | 6 +- 25 files changed, 10125 insertions(+), 8496 deletions(-) diff --git a/packages/octane-form/src/createFormHook.tsrx b/packages/octane-form/src/createFormHook.tsrx index efcfc4b9e..f48909d32 100644 --- a/packages/octane-form/src/createFormHook.tsrx +++ b/packages/octane-form/src/createFormHook.tsrx @@ -1,30 +1,30 @@ -import { createContext, useContext, useMemo } from 'octane'; -import { useForm } from './useForm.tsrx'; -import { useFieldGroup } from './useFieldGroup.tsrx'; +import { createContext, useContext, useMemo } from 'octane' +import { useForm } from './useForm.tsrx' +import { useFieldGroup } from './useFieldGroup.tsrx' import type { - AnyFieldApi, - AnyFormApi, - BaseFormOptions, - DeepKeysOfType, - FieldApi, - FieldsMap, - FormAsyncValidateOrFn, - FormOptions, - FormValidateOrFn, -} from '@tanstack/form-core'; -import type { Context } from 'octane'; -import type { FieldComponent } from './useField.tsrx'; -import type { OctaneFormExtendedApi } from './useForm.tsrx'; -import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; - -type HookRenderable = unknown; -type HookPropsWithChildren

= P & { children?: HookRenderable }; -type HookFunctionComponent

= (props: P) => HookRenderable; -type HookComponentType

= HookFunctionComponent

; + AnyFieldApi, + AnyFormApi, + BaseFormOptions, + DeepKeysOfType, + FieldApi, + FieldsMap, + FormAsyncValidateOrFn, + FormOptions, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { Context } from 'octane' +import type { FieldComponent } from './useField.tsrx' +import type { OctaneFormExtendedApi } from './useForm.tsrx' +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx' + +type HookRenderable = unknown +type HookPropsWithChildren

= P & { children?: HookRenderable } +type HookFunctionComponent

= (props: P) => HookRenderable +type HookComponentType

= HookFunctionComponent

// We should never hit the `null` case here -const fieldContext = createContext(null as never); -const formContext = createContext(null as never); +const fieldContext = createContext(null as never) +const formContext = createContext(null as never) /** * TypeScript inferencing is weird. @@ -56,812 +56,738 @@ const formContext = createContext(null as never); * Here, we are checking if the passed type `T` extends `DefaultT` and **only** * `DefaultT`, as if that's the case we assume that inferencing has not occurred. */ -type UnwrapOrAny = [unknown] extends [T] ? any : T; -type UnwrapDefaultOrAny = [DefaultT] extends [T] - ? [T] extends [DefaultT] - ? any - : T - : T; +type UnwrapOrAny = [unknown] extends [T] ? any : T +type UnwrapDefaultOrAny = + [DefaultT] extends [T] ? [T] extends [DefaultT] ? any : T : T function useFormContext() { - const form = useContext(formContext); - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!form) { - throw new Error( - '`formContext` only works when within a `formComponent` passed to `createFormHook`', - ); - } - - return form as OctaneFormExtendedApi< - // If you need access to the form data, you need to use `withForm` instead - Record, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - >; + const form = useContext(formContext) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!form) { + throw new Error('`formContext` only works when within a `formComponent` passed to `createFormHook`') + } + + return form as + OctaneFormExtendedApi< + // If you need access to the form data, you need to use `withForm` instead + Record, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > } export function createFormHookContexts() { - function useFieldContext() { - const field = useContext(fieldContext); - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!field) { - throw new Error( - '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`', - ); - } - - return field as FieldApi< - any, - string, - TData, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - >; - } - - return { fieldContext, useFieldContext, useFormContext, formContext }; + function useFieldContext() { + const field = useContext(fieldContext) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!field) { + throw new Error('`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`') + } + + return field as FieldApi< + any, + string, + TData, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + } + + return { fieldContext, useFieldContext, useFormContext, formContext } } interface CreateFormHookProps< - TFieldComponents extends Record>, - TFormComponents extends Record>, + TFieldComponents extends Record>, + TFormComponents extends Record>, > { - fieldComponents: TFieldComponents; - fieldContext: Context; - formComponents: TFormComponents; - formContext: Context; + fieldComponents: TFieldComponents + fieldContext: Context + formComponents: TFormComponents + formContext: Context } /** * @private */ export type AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - NoInfer & { - AppField: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - NoInfer - >; - AppForm: HookComponentType< - // Keep children optional in the renderer-facing component props. - HookPropsWithChildren<{}> - >; - }; + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = + OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > & NoInfer & { + AppField: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + NoInfer + >; + AppForm: HookComponentType< + // Keep children optional in the renderer-facing component props. + HookPropsWithChildren<{}> + >; + } export interface WithFormProps< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TRenderProps extends object = Record, + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TRenderProps extends object = Record, > extends FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta > { - // Optional, but adds props to the `render` function outside of `form` - props?: TRenderProps; - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - form: AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TFieldComponents, - TFormComponents - >; - } - > - >; + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + form: AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + > } export interface WithFieldGroupProps< - TFieldGroupData, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta, - TRenderProps extends object = Record, + TFieldGroupData, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta, + TRenderProps extends object = Record, > extends BaseFormOptions { - // Optional, but adds props to the `render` function outside of `form` - props?: TRenderProps; - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - group: AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFieldGroupData, - string | FieldsMap, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - // this types it as 'never' in the render prop. It should prevent any - // untyped meta passed to the handleSubmit by accident. - unknown extends TSubmitMeta ? never : TSubmitMeta, - TFieldComponents, - TFormComponents - >; - } - > - >; + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + group: AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFieldGroupData, + string | FieldsMap, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + // this types it as 'never' in the render prop. It should prevent any + // untyped meta passed to the handleSubmit by accident. + unknown extends TSubmitMeta ? never : TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + > } type UseAppForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, ->( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, -) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents ->; + TComponents extends Record>, + TFormComponents extends Record>, +> = + (props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > type WithForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TRenderProps extends object = {}, ->( - props: WithFormProps< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents, - TRenderProps - >, -) => WithFormProps< - UnwrapOrAny, - UnwrapDefaultOrAny, TOnMount>, - UnwrapDefaultOrAny, TOnChange>, - UnwrapDefaultOrAny, TOnChangeAsync>, - UnwrapDefaultOrAny, TOnBlur>, - UnwrapDefaultOrAny, TOnBlurAsync>, - UnwrapDefaultOrAny, TOnSubmit>, - UnwrapDefaultOrAny, TOnSubmitAsync>, - UnwrapDefaultOrAny, TOnDynamic>, - UnwrapDefaultOrAny, TOnDynamicAsync>, - UnwrapDefaultOrAny, TOnServer>, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny ->['render']; + TComponents extends Record>, + TFormComponents extends Record>, +> = + (props: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >) => WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny< + undefined | FormValidateOrFn, + TOnDynamicAsync + >, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny + >['render'] type WithFieldGroup< - TComponents extends Record>, - TFormComponents extends Record>, -> = ( - props: WithFieldGroupProps< - TFieldGroupData, - TComponents, - TFormComponents, - TSubmitMeta, - TRenderProps - >, -) => < - TFormData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TFormSubmitMeta, ->( - params: HookPropsWithChildren< - NoInfer & { - form: - | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - } - >, -) => ReturnType; + TComponents extends Record>, + TFormComponents extends Record>, +> = + (props: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >) => (params: HookPropsWithChildren< + NoInfer & { + form: | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >) => ReturnType type UseTypedAppFormContext< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, ->( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, -) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents ->; - -type FieldComponentExtension>> = - Record> & { - [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; - }; - -type FormComponentExtension>> = - Record> & { - [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; - }; + TComponents extends Record>, + TFormComponents extends Record>, +> = + (props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + +type FieldComponentExtension< + TComponents extends Record>, +> = + Record< + string, + HookComponentType + > & { [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' } + +type FormComponentExtension< + TComponents extends Record>, +> = + Record< + string, + HookComponentType + > & { [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form' } export interface CreateFormHookReturn< - TComponents extends Record>, - TFormComponents extends Record>, + TComponents extends Record>, + TFormComponents extends Record>, > { - useAppForm: UseAppForm; - withForm: WithForm; - withFieldGroup: WithFieldGroup; - useTypedAppFormContext: UseTypedAppFormContext; - extendForm: < - TNewField extends FieldComponentExtension, - TNewForm extends FormComponentExtension, - >(extension: { - fieldComponents?: TNewField; - formComponents?: TNewForm; - }) => CreateFormHookReturn; + useAppForm: UseAppForm + withForm: WithForm + withFieldGroup: WithFieldGroup + useTypedAppFormContext: UseTypedAppFormContext + extendForm: (extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }) => CreateFormHookReturn< + TComponents & TNewField, + TFormComponents & TNewForm + > } export function createFormHook< - TComponents extends Record>, - TFormComponents extends Record>, + TComponents extends Record>, + TFormComponents extends Record>, >({ - fieldComponents, - fieldContext, - formContext, - formComponents, + fieldComponents, + fieldContext, + formContext, + formComponents, }: CreateFormHookProps): CreateFormHookReturn< - TComponents, - TFormComponents + TComponents, + TFormComponents > { - const FieldContextProvider = fieldContext; - const FormContextProvider = formContext; - - function useAppForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ): AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > { - const form = useForm(props); - - // Keep children optional in the renderer-facing component props. - const AppForm = useMemo>>(() => { - return ({ children }) => { - return {children}; - }; - }, [form]); - - const AppField = useMemo(() => { - const AppField = (({ children, ...props }) => { - return ( - - {(field) => ( - - {children(Object.assign(field, fieldComponents))} - - )} - - ); - }) as FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents - >; - return AppField; - }, [form]); - - const extendedForm = useMemo(() => { - return Object.assign(form, { - AppField, - AppForm, - ...formComponents, - }); - }, [form, AppField, AppForm]); - - return extendedForm; - } - - function withForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TRenderProps extends object = {}, - >({ - render, - props, - }: WithFormProps< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents, - TRenderProps - >): WithFormProps< - UnwrapOrAny, - UnwrapDefaultOrAny, TOnMount>, - UnwrapDefaultOrAny, TOnChange>, - UnwrapDefaultOrAny, TOnChangeAsync>, - UnwrapDefaultOrAny, TOnBlur>, - UnwrapDefaultOrAny, TOnBlurAsync>, - UnwrapDefaultOrAny, TOnSubmit>, - UnwrapDefaultOrAny, TOnSubmitAsync>, - UnwrapDefaultOrAny, TOnDynamic>, - UnwrapDefaultOrAny, TOnDynamicAsync>, - UnwrapDefaultOrAny, TOnServer>, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny - >['render'] { - return function Render(innerProps) { - return render({ ...props, ...innerProps }); - }; - } - - function withFieldGroup({ - render, - props, - defaultValues, - }: WithFieldGroupProps< - TFieldGroupData, - TComponents, - TFormComponents, - TSubmitMeta, - TRenderProps - >): < - TFormData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TFormSubmitMeta, - >( - params: HookPropsWithChildren< - NoInfer & { - form: - | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - // Since this only occurs if you nest it within other field groups, it can be more - // lenient with the types. - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - } - >, - ) => ReturnType { - return function Render(innerProps) { - const fieldGroupProps = useMemo(() => { - return { - form: innerProps.form, - fields: innerProps.fields, - defaultValues, - formComponents, - }; - }, [innerProps.form, innerProps.fields]); - const fieldGroupApi = useFieldGroup(fieldGroupProps as any); - - return render({ ...props, ...innerProps, group: fieldGroupApi as any }); - }; - } - - /** - * ⚠️ **Use withForm whenever possible.** - * - * Gets a typed form from the `` context. - */ - function useTypedAppFormContext< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - _props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ): AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > { - const form = useFormContext(); - - return form as never; - } - - function extendForm< - TNewField extends FieldComponentExtension, - TNewForm extends FormComponentExtension, - >(extension: { - fieldComponents?: TNewField; - formComponents?: TNewForm; - }): CreateFormHookReturn { - return createFormHook({ - fieldContext, - formContext, - fieldComponents: { - ...fieldComponents, - ...extension.fieldComponents, - } as TComponents & TNewField, - formComponents: { - ...formComponents, - ...extension.formComponents, - } as TFormComponents & TNewForm, - }); - } - - return { - useAppForm, - withForm, - withFieldGroup, - useTypedAppFormContext, - extendForm, - } as CreateFormHookReturn; + const FieldContextProvider = fieldContext + const FormContextProvider = formContext + + function useAppForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useForm(props) + + // Keep children optional in the renderer-facing component props. + const AppForm = useMemo>>( + () => { + return ({ children }) => { + return {children} + } + }, + [form], + ) + + const AppField = useMemo(() => { + const AppField = (({ children, ...props }) => { + return + {(field) => + {children( + Object.assign(field, fieldComponents), + )}} + + }) as FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents + > + return AppField + }, [form]) + + const extendedForm = useMemo(() => { + return Object.assign(form, { + AppField, + AppForm, + ...formComponents, + }) + }, [form, AppField, AppForm]) + + return extendedForm + } + + function withForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, + >({ render, props }: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >): WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny< + undefined | FormValidateOrFn, + TOnDynamicAsync + >, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny + >['render'] { + return function Render(innerProps) { + return render({ ...props, ...innerProps }) + } + } + + function withFieldGroup< + TFieldGroupData, + TSubmitMeta, + TRenderProps extends object = {}, + >({ render, props, defaultValues }: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >): (params: HookPropsWithChildren< + NoInfer & { + form: | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other field groups, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >) => ReturnType { + return function Render(innerProps) { + const fieldGroupProps = useMemo(() => { + return { + form: innerProps.form, + fields: innerProps.fields, + defaultValues, + formComponents, + } + }, [innerProps.form, innerProps.fields]) + const fieldGroupApi = useFieldGroup(fieldGroupProps as any) + + return render({ ...props, ...innerProps, group: fieldGroupApi as any }) + } + } + + /** + * ⚠️ **Use withForm whenever possible.** + * + * Gets a typed form from the `` context. + */ + function useTypedAppFormContext< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + _props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useFormContext() + + return form as never + } + + function extendForm< + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }): CreateFormHookReturn< + TComponents & TNewField, + TFormComponents & TNewForm + > { + return createFormHook({ + fieldContext, + formContext, + fieldComponents: { + ...fieldComponents, + ...extension.fieldComponents, + } as TComponents & TNewField, + formComponents: { + ...formComponents, + ...extension.formComponents, + } as TFormComponents & TNewForm, + }) + } + + return { + useAppForm, + withForm, + withFieldGroup, + useTypedAppFormContext, + extendForm, + } as CreateFormHookReturn } diff --git a/packages/octane-form/src/createFormHook.tsrx.d.ts b/packages/octane-form/src/createFormHook.tsrx.d.ts index 992a00121..36834eaa4 100644 --- a/packages/octane-form/src/createFormHook.tsrx.d.ts +++ b/packages/octane-form/src/createFormHook.tsrx.d.ts @@ -1,15 +1,25 @@ // Declaration companion generated from createFormHook.tsrx. -import type { AnyFieldApi, AnyFormApi, BaseFormOptions, DeepKeysOfType, FieldApi, FieldsMap, FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core'; -import type { Context } from 'octane'; -import type { FieldComponent } from './useField.tsrx'; -import type { OctaneFormExtendedApi } from './useForm.tsrx'; -import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; -type HookRenderable = unknown; +import type { + AnyFieldApi, + AnyFormApi, + BaseFormOptions, + DeepKeysOfType, + FieldApi, + FieldsMap, + FormAsyncValidateOrFn, + FormOptions, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { Context } from 'octane' +import type { FieldComponent } from './useField.tsrx' +import type { OctaneFormExtendedApi } from './useForm.tsrx' +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx' +type HookRenderable = unknown type HookPropsWithChildren

= P & { - children?: HookRenderable; -}; -type HookFunctionComponent

= (props: P) => HookRenderable; -type HookComponentType

= HookFunctionComponent

; + children?: HookRenderable +} +type HookFunctionComponent

= (props: P) => HookRenderable +type HookComponentType

= HookFunctionComponent

/** * TypeScript inferencing is weird. * @@ -40,62 +50,456 @@ type HookComponentType

= HookFunctionComponent

; * Here, we are checking if the passed type `T` extends `DefaultT` and **only** * `DefaultT`, as if that's the case we assume that inferencing has not occurred. */ -type UnwrapOrAny = [unknown] extends [T] ? any : T; -type UnwrapDefaultOrAny = [DefaultT] extends [T] ? [T] extends [DefaultT] ? any : T : T; -declare function useFormContext(): OctaneFormExtendedApi, any, any, any, any, any, any, any, any, any, any, any>; +type UnwrapOrAny = [unknown] extends [T] ? any : T +type UnwrapDefaultOrAny = [DefaultT] extends [T] + ? [T] extends [DefaultT] + ? any + : T + : T +declare function useFormContext(): OctaneFormExtendedApi< + Record, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any +> export declare function createFormHookContexts(): { - fieldContext: Context; - useFieldContext: () => FieldApi; - useFormContext: typeof useFormContext; - formContext: Context; -}; -interface CreateFormHookProps>, TFormComponents extends Record>> { - fieldComponents: TFieldComponents; - fieldContext: Context; - formComponents: TFormComponents; - formContext: Context; + fieldContext: Context + useFieldContext: () => FieldApi< + any, + string, + TData, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + useFormContext: typeof useFormContext + formContext: Context +} +interface CreateFormHookProps< + TFieldComponents extends Record>, + TFormComponents extends Record>, +> { + fieldComponents: TFieldComponents + fieldContext: Context + formComponents: TFormComponents + formContext: Context } /** * @private */ -export type AppFieldExtendedOctaneFormApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = OctaneFormExtendedApi & NoInfer & { - AppField: FieldComponent>; - AppForm: HookComponentType>; -}; -export interface WithFormProps, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>, TRenderProps extends object = Record> extends FormOptions { - props?: TRenderProps; - render: HookFunctionComponent & { - form: AppFieldExtendedOctaneFormApi; - }>>; +export type AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + NoInfer + > + AppForm: HookComponentType> + } +export interface WithFormProps< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TRenderProps extends object = Record, +> extends FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> { + props?: TRenderProps + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + form: AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TFieldComponents, + TFormComponents + > + } + > + > +} +export interface WithFieldGroupProps< + TFieldGroupData, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta, + TRenderProps extends object = Record, +> extends BaseFormOptions { + props?: TRenderProps + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + group: AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFieldGroupData, + string | FieldsMap, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + unknown extends TSubmitMeta ? never : TSubmitMeta, + TFieldComponents, + TFormComponents + > + } + > + > +} +type UseAppForm< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +> +type WithForm< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, +>( + props: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >, +) => WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny, TOnDynamicAsync>, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny +>['render'] +type WithFieldGroup< + TComponents extends Record>, + TFormComponents extends Record>, +> = ( + props: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >, +) => < + TFormData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TFormSubmitMeta, +>( + params: HookPropsWithChildren< + NoInfer & { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + fields: TFields + } + >, +) => ReturnType +type UseTypedAppFormContext< + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +> +type FieldComponentExtension< + TComponents extends Record>, +> = Record> & { + [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' } -export interface WithFieldGroupProps>, TFormComponents extends Record>, TSubmitMeta, TRenderProps extends object = Record> extends BaseFormOptions { - props?: TRenderProps; - render: HookFunctionComponent & { - group: AppFieldExtendedOctaneFieldGroupApi, undefined | FormValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, unknown extends TSubmitMeta ? never : TSubmitMeta, TFieldComponents, TFormComponents>; - }>>; +type FormComponentExtension< + TComponents extends Record>, +> = Record> & { + [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form' } -type UseAppForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; -type WithForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TRenderProps extends object = {}>(props: WithFormProps) => WithFormProps, UnwrapDefaultOrAny, TOnMount>, UnwrapDefaultOrAny, TOnChange>, UnwrapDefaultOrAny, TOnChangeAsync>, UnwrapDefaultOrAny, TOnBlur>, UnwrapDefaultOrAny, TOnBlurAsync>, UnwrapDefaultOrAny, TOnSubmit>, UnwrapDefaultOrAny, TOnSubmitAsync>, UnwrapDefaultOrAny, TOnDynamic>, UnwrapDefaultOrAny, TOnDynamicAsync>, UnwrapDefaultOrAny, TOnServer>, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny>['render']; -type WithFieldGroup>, TFormComponents extends Record>> = (props: WithFieldGroupProps) => | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TFormSubmitMeta>(params: HookPropsWithChildren & { - form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, TComponents, TFormComponents>; - fields: TFields; -}>) => ReturnType; -type UseTypedAppFormContext>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; -type FieldComponentExtension>> = Record> & { - [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; -}; -type FormComponentExtension>> = Record> & { - [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; -}; -export interface CreateFormHookReturn>, TFormComponents extends Record>> { - useAppForm: UseAppForm; - withForm: WithForm; - withFieldGroup: WithFieldGroup; - useTypedAppFormContext: UseTypedAppFormContext; - extendForm: , TNewForm extends FormComponentExtension>(extension: { - fieldComponents?: TNewField; - formComponents?: TNewForm; - }) => CreateFormHookReturn; +export interface CreateFormHookReturn< + TComponents extends Record>, + TFormComponents extends Record>, +> { + useAppForm: UseAppForm + withForm: WithForm + withFieldGroup: WithFieldGroup + useTypedAppFormContext: UseTypedAppFormContext + extendForm: < + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField + formComponents?: TNewForm + }) => CreateFormHookReturn< + TComponents & TNewField, + TFormComponents & TNewForm + > } -export declare function createFormHook>, TFormComponents extends Record>>({ fieldComponents, fieldContext, formContext, formComponents, }: CreateFormHookProps): CreateFormHookReturn; -export {}; +export declare function createFormHook< + TComponents extends Record>, + TFormComponents extends Record>, +>({ + fieldComponents, + fieldContext, + formContext, + formComponents, +}: CreateFormHookProps): CreateFormHookReturn< + TComponents, + TFormComponents +> +export {} diff --git a/packages/octane-form/src/index.ts b/packages/octane-form/src/index.ts index b01174176..25034e114 100644 --- a/packages/octane-form/src/index.ts +++ b/packages/octane-form/src/index.ts @@ -1,11 +1,11 @@ -export * from '@tanstack/form-core'; +export * from '@tanstack/form-core' -export { useSelector } from '@tanstack/octane-store'; +export { useSelector } from '@tanstack/octane-store' -export * from './createFormHook.tsrx'; -export * from './types'; -export * from './useField.tsrx'; -export * from './useFieldGroup.tsrx'; -export * from './useForm.tsrx'; -export * from './useFormGroup.tsrx'; -export * from './useIsomorphicLayoutEffect'; +export * from './createFormHook.tsrx' +export * from './types' +export * from './useField.tsrx' +export * from './useFieldGroup.tsrx' +export * from './useForm.tsrx' +export * from './useFormGroup.tsrx' +export * from './useIsomorphicLayoutEffect' diff --git a/packages/octane-form/src/types.ts b/packages/octane-form/src/types.ts index c552416c6..971a5692a 100644 --- a/packages/octane-form/src/types.ts +++ b/packages/octane-form/src/types.ts @@ -1,122 +1,138 @@ import type { - DeepKeys, - DeepValue, - FieldApiOptions, - FieldAsyncValidateOrFn, - FieldOptions, - FieldValidateOrFn, - FormAsyncValidateOrFn, - FormState, - FormValidateOrFn, -} from '@tanstack/form-core'; + DeepKeys, + DeepValue, + FieldApiOptions, + FieldAsyncValidateOrFn, + FieldOptions, + FieldValidateOrFn, + FormAsyncValidateOrFn, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core' interface FieldOptionsMode { - mode?: 'value' | 'array'; + mode?: 'value' | 'array' } /** * The field options. */ export interface UseFieldOptions< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, > - extends - FieldApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - >, - FieldOptionsMode {} + extends + FieldApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TSubmitMeta + >, + FieldOptionsMode {} export interface UseFieldOptionsBound< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, > - extends - FieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, - FieldOptionsMode {} + extends + FieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + FieldOptionsMode {} export type ServerFormState< - TFormData, - TOnServer extends undefined | FormAsyncValidateOrFn, + TFormData, + TOnServer extends undefined | FormAsyncValidateOrFn, > = Pick< - FormState< - TFormData, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - TOnServer - >, - 'values' | 'errors' | 'errorMap' ->; + FormState< + TFormData, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + TOnServer + >, + 'values' | 'errors' | 'errorMap' +> diff --git a/packages/octane-form/src/useField.tsrx b/packages/octane-form/src/useField.tsrx index 04d56be32..ab83369d4 100644 --- a/packages/octane-form/src/useField.tsrx +++ b/packages/octane-form/src/useField.tsrx @@ -1,22 +1,22 @@ -import { useMemo, useState } from 'octane'; -import { useSelector } from '@tanstack/octane-store'; -import { FieldApi, functionalUpdate } from '@tanstack/form-core'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import { useMemo, useState } from 'octane' +import { useSelector } from '@tanstack/octane-store' +import { FieldApi, functionalUpdate } from '@tanstack/form-core' +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' import type { - AnyFieldApi, - AnyFieldMeta, - DeepKeys, - DeepValue, - FieldAsyncValidateOrFn, - FieldValidateOrFn, - FieldValidators, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core'; -import type { UseFieldOptions, UseFieldOptionsBound } from './types'; + AnyFieldApi, + AnyFieldMeta, + DeepKeys, + DeepValue, + FieldAsyncValidateOrFn, + FieldValidateOrFn, + FieldValidators, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { UseFieldOptions, UseFieldOptionsBound } from './types' -type FieldRenderable = unknown; -type FieldFunctionComponent

= (props: P) => FieldRenderable; +type FieldRenderable = unknown +type FieldFunctionComponent

= (props: P) => FieldRenderable /** * A type representing a hook for using a field in a form with the given form data type. @@ -24,70 +24,57 @@ type FieldFunctionComponent

= (props: P) => FieldRenderable; * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. */ export type UseField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, ->( - opts: UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, -) => FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta ->; + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +> = + (opts: UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >) => FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > /** * A hook for managing a field in a form. @@ -96,472 +83,466 @@ export type UseField< * @returns The `FieldApi` instance for the specified field. */ export function useField< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, >( - opts: UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - >, + opts: UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + >, ) { - // Keep a snapshot of options so compiler optimizations do not treat - // fieldApi as immutable. - const [prevOptions, setPrevOptions] = useState(() => ({ - form: opts.form, - name: opts.name, - })); + // Keep a snapshot of options so compiler optimizations do not treat + // fieldApi as immutable. + const [prevOptions, setPrevOptions] = useState( + () => ({ + form: opts.form, + name: opts.name, + }), + ) - const [fieldApiState, setFieldApi] = useState(() => { - return new FieldApi({ - ...opts, - }); - }); + const [fieldApiState, setFieldApi] = useState(() => { + return new FieldApi({ + ...opts, + }) + }) - let fieldApi = fieldApiState; + let fieldApi = fieldApiState - // We only want to - // update on name changes since those are at risk of becoming stale. The field - // state must be up to date for the internal JSX render. - // The other options can freely be in `fieldApi.update` - if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { - // Adjusting state during render: create the new FieldApi and use it for the - // rest of this render so the render prop reads state at the current `name`. - // Otherwise the discarded render still runs to completion with the stale - // instance, briefly surfacing `undefined` for shifted array items on removal. - // See: https://github.com/TanStack/form/issues/2238 - fieldApi = new FieldApi({ - ...opts, - }); - setFieldApi(fieldApi); - setPrevOptions({ form: opts.form, name: opts.name }); - } + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Adjusting state during render: create the new FieldApi and use it for the + // rest of this render so the render prop reads state at the current `name`. + // Otherwise the discarded render still runs to completion with the stale + // instance, briefly surfacing `undefined` for shifted array items on removal. + // See: https://github.com/TanStack/form/issues/2238 + fieldApi = new FieldApi({ + ...opts, + }) + setFieldApi(fieldApi) + setPrevOptions({ form: opts.form, name: opts.name }) + } - // For array mode, only track length changes to avoid re-renders when child properties change - // See: https://github.com/TanStack/form/issues/1925 - const reactiveStateValue = useSelector( - fieldApi.store, - (opts.mode === 'array' ? (state) => state.meta._arrayVersion || 0 : (state) => state.value) as ( - state: typeof fieldApi.state, - ) => TData | number, - ); - const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched); - const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred); - const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty); - const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap); - const reactiveMetaErrorSourceMap = useSelector( - fieldApi.store, - (state) => state.meta.errorSourceMap, - ); - const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating); + // For array mode, only track length changes to avoid re-renders when child properties change + // See: https://github.com/TanStack/form/issues/1925 + const reactiveStateValue = useSelector( + fieldApi.store, + (opts.mode === 'array' + ? (state) => state.meta._arrayVersion || 0 + : (state) => state.value) as (state: typeof fieldApi.state) => | TData + | number, + ) + const reactiveMetaIsTouched = useSelector( + fieldApi.store, + (state) => state.meta.isTouched, + ) + const reactiveMetaIsBlurred = useSelector( + fieldApi.store, + (state) => state.meta.isBlurred, + ) + const reactiveMetaIsDirty = useSelector( + fieldApi.store, + (state) => state.meta.isDirty, + ) + const reactiveMetaErrorMap = useSelector( + fieldApi.store, + (state) => state.meta.errorMap, + ) + const reactiveMetaErrorSourceMap = useSelector( + fieldApi.store, + (state) => state.meta.errorSourceMap, + ) + const reactiveMetaIsValidating = useSelector( + fieldApi.store, + (state) => state.meta.isValidating, + ) - // Materialize the reactive snapshots in the extended API returned to render callbacks. - const extendedFieldApi = useMemo(() => { - const reactiveFieldApi = { - ...fieldApi, - get state() { - return { - // For array mode, reactiveStateValue is the length (for reactivity tracking), - // so we need to get the actual value from fieldApi - value: opts.mode === 'array' ? fieldApi.state.value : reactiveStateValue, - get meta() { - return { - ...fieldApi.state.meta, - isTouched: reactiveMetaIsTouched, - isBlurred: reactiveMetaIsBlurred, - isDirty: reactiveMetaIsDirty, - errorMap: reactiveMetaErrorMap, - errorSourceMap: reactiveMetaErrorSourceMap, - isValidating: reactiveMetaIsValidating, - } satisfies AnyFieldMeta; - }, - } satisfies AnyFieldApi['state']; - }, - }; + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...fieldApi, + get state() { + return { + // For array mode, reactiveStateValue is the length (for reactivity tracking), + // so we need to get the actual value from fieldApi + value: opts.mode === 'array' + ? fieldApi.state.value + : reactiveStateValue, + get meta() { + return { + ...fieldApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + } satisfies AnyFieldMeta + }, + } satisfies AnyFieldApi['state'] + }, + } - const extendedApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > = reactiveFieldApi as never; + const extendedApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > = reactiveFieldApi as never - return extendedApi; - }, [ - fieldApi, - opts.mode, - reactiveStateValue, - reactiveMetaIsTouched, - reactiveMetaIsBlurred, - reactiveMetaIsDirty, - reactiveMetaErrorMap, - reactiveMetaErrorSourceMap, - reactiveMetaIsValidating, - ]); + return extendedApi + }, [ + fieldApi, + opts.mode, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + ]) - useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]); + useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]) - /** - * fieldApi.update should not have any side effects. Think of it like a `useRef` - * that we need to keep updated every render with the most up-to-date information. - */ - useIsomorphicLayoutEffect(() => { - fieldApi.update(opts); - }); + /** + * fieldApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + fieldApi.update(opts) + }) - return extendedFieldApi; + return extendedFieldApi } /** * @param children A render function that takes a field API instance and returns a renderable value. */ interface FieldComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, > extends UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta > { - children: ( - fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & - ExtendedApi, - ) => FieldRenderable; + children: (fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & ExtendedApi) => FieldRenderable } interface FieldComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, > extends UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync > { - children: ( - fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & - ExtendedApi, - ) => FieldRenderable; + children: (fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & ExtendedApi) => FieldRenderable } /** * A type alias representing a field component for a specific form data type. */ export type FieldComponent< - in out TParentData, - in out TFormOnMount extends undefined | FormValidateOrFn, - in out TFormOnChange extends undefined | FormValidateOrFn, - in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnBlur extends undefined | FormValidateOrFn, - in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnSubmit extends undefined | FormValidateOrFn, - in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnDynamic extends undefined | FormValidateOrFn, - in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnServer extends undefined | FormAsyncValidateOrFn, - in out TPatentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, ->({ - children, - ...fieldOptions -}: FieldComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta, - ExtendedApi ->) => ReturnType; + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, +> = + ({ children, ...fieldOptions }: FieldComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta, + ExtendedApi + >) => ReturnType /** * A type alias representing a field component for a form lens data type. */ -export type LensFieldComponent< - in out TLensData, - in out TParentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, ->({ - children, - ...fieldOptions -}: Omit< - FieldComponentBoundProps< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi - >, - 'name' | 'validators' -> & { - name: TName; - validators?: Omit< - FieldValidators< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, - 'onChangeListenTo' | 'onBlurListenTo' - > & { - /** - * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes - */ - onChangeListenTo?: DeepKeys[]; - /** - * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes - */ - onBlurListenTo?: DeepKeys[]; - }; -}) => ReturnType; +export type LensFieldComponent = + ({ children, ...fieldOptions }: Omit< + FieldComponentBoundProps< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi + >, + 'name' | 'validators' + > & { + name: TName; + validators?: Omit< + FieldValidators< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + 'onChangeListenTo' | 'onBlurListenTo' + > & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[]; + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[]; + }; + }) => ReturnType /** * A function component that takes field options and a render function as children. @@ -569,88 +550,91 @@ export type LensFieldComponent< * The `Field` component uses the `useField` hook internally to manage the field instance. */ export const Field = (< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, ->({ - children, - ...fieldOptions -}: FieldComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>({ children, ...fieldOptions }: FieldComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta >): ReturnType => { - const fieldApi = useField(fieldOptions as any); + const fieldApi = useField(fieldOptions as any) - const jsxToDisplay = useMemo( - () => functionalUpdate(children, fieldApi as any), - [children, fieldApi], - ); - return (<>{jsxToDisplay}) as never; + const jsxToDisplay = useMemo( + () => functionalUpdate(children, fieldApi as any), + [children, fieldApi], + ) + return <> + {jsxToDisplay} + as never }) satisfies FieldFunctionComponent< - FieldComponentProps< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > ->; + FieldComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +> diff --git a/packages/octane-form/src/useField.tsrx.d.ts b/packages/octane-form/src/useField.tsrx.d.ts index 6e8256694..cbba2d111 100644 --- a/packages/octane-form/src/useField.tsrx.d.ts +++ b/packages/octane-form/src/useField.tsrx.d.ts @@ -1,55 +1,574 @@ // Declaration companion generated from useField.tsrx. -import { FieldApi } from '@tanstack/form-core'; -import type { DeepKeys, DeepValue, FieldAsyncValidateOrFn, FieldValidateOrFn, FieldValidators, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; -import type { UseFieldOptions, UseFieldOptionsBound } from './types'; -type FieldRenderable = unknown; -type FieldFunctionComponent

= (props: P) => FieldRenderable; +import { FieldApi } from '@tanstack/form-core' +import type { + DeepKeys, + DeepValue, + FieldAsyncValidateOrFn, + FieldValidateOrFn, + FieldValidators, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { UseFieldOptions, UseFieldOptionsBound } from './types' +type FieldRenderable = unknown +type FieldFunctionComponent

= (props: P) => FieldRenderable /** * A type representing a hook for using a field in a form with the given form data type. * * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. */ -export type UseField, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>(opts: UseFieldOptionsBound) => FieldApi; +export type UseField< + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, +>( + opts: UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, +) => FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +> /** * A hook for managing a field in a form. * @param opts An object with field options. * * @returns The `FieldApi` instance for the specified field. */ -export declare function useField, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>(opts: UseFieldOptions): FieldApi; +export declare function useField< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>( + opts: UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + >, +): FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +> /** * @param children A render function that takes a field API instance and returns a renderable value. */ -interface FieldComponentProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptions { - children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; +interface FieldComponentProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, +> extends UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +> { + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable } -interface FieldComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptionsBound { - children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; +interface FieldComponentBoundProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, +> extends UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync +> { + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable } /** * A type alias representing a field component for a specific form data type. */ -export type FieldComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: FieldComponentBoundProps) => ReturnType; +export type FieldComponent< + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TPatentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: FieldComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta, + ExtendedApi +>) => ReturnType /** * A type alias representing a field component for a form lens data type. */ -export type LensFieldComponent = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: Omit, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi>, 'name' | 'validators'> & { - name: TName; - validators?: Omit, 'onChangeListenTo' | 'onBlurListenTo'> & { - /** - * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes - */ - onChangeListenTo?: DeepKeys[]; - /** - * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes - */ - onBlurListenTo?: DeepKeys[]; - }; -}) => ReturnType; +export type LensFieldComponent< + in out TLensData, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: Omit< + FieldComponentBoundProps< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi + >, + 'name' | 'validators' +> & { + name: TName + validators?: Omit< + FieldValidators< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + 'onChangeListenTo' | 'onBlurListenTo' + > & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[] + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[] + } +}) => ReturnType /** * A function component that takes field options and a render function as children. * * The `Field` component uses the `useField` hook internally to manage the field instance. */ -export declare const Field: , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>({ children, ...fieldOptions }: FieldComponentProps) => ReturnType; -export {}; +export declare const Field: < + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends + | undefined + | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends + | undefined + | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>({ + children, + ...fieldOptions +}: FieldComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +>) => ReturnType +export {} diff --git a/packages/octane-form/src/useFieldGroup.tsrx b/packages/octane-form/src/useFieldGroup.tsrx index 46d73f148..1d0200760 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx +++ b/packages/octane-form/src/useFieldGroup.tsrx @@ -1,252 +1,269 @@ -import { useState } from 'octane'; -import { useSelector } from '@tanstack/octane-store'; -import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import { useState } from 'octane' +import { useSelector } from '@tanstack/octane-store' +import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core' +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' import type { - AnyFieldGroupApi, - DeepKeysOfType, - FieldGroupState, - FieldsMap, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core'; -import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; -import type { LensFieldComponent } from './useField.tsrx'; + AnyFieldGroupApi, + DeepKeysOfType, + FieldGroupState, + FieldsMap, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx' +import type { LensFieldComponent } from './useField.tsrx' -type FieldGroupRenderable = unknown; -type FieldGroupPropsWithChildren

= P & { children?: FieldGroupRenderable }; -type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; -type FieldGroupComponentType

= FieldGroupFunctionComponent

; +type FieldGroupRenderable = unknown +type FieldGroupPropsWithChildren

= + P & { children?: FieldGroupRenderable } +type FieldGroupFunctionComponent

= + (props: P) => FieldGroupRenderable +type FieldGroupComponentType

= FieldGroupFunctionComponent

function LocalSubscribe({ - lens, - selector = (state) => state, - children, + lens, + selector = (state) => state, + children, }: FieldGroupPropsWithChildren<{ - lens: AnyFieldGroupApi; - selector?: (state: FieldGroupState) => FieldGroupState; + lens: AnyFieldGroupApi; + selector?: (state: FieldGroupState) => FieldGroupState; }>): ReturnType { - const data = useSelector(lens.store, selector); + const data = useSelector(lens.store, selector) - return <>{functionalUpdate(children, data)}; + return <> + {functionalUpdate(children, data)} + } /** * @private */ export type AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = FieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - NoInfer & { - AppField: LensFieldComponent>; - AppForm: FieldGroupComponentType>; - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: LensFieldComponent; - - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: >>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; - }) => ReturnType; - }; + TFormData, + TFieldGroupData, + TFields extends | DeepKeysOfType< + TFormData, + TFieldGroupData | null | undefined + > + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = + FieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > & NoInfer & { + AppField: LensFieldComponent< + TFieldGroupData, + TSubmitMeta, + NoInfer + >; + AppForm: FieldGroupComponentType>; + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: LensFieldComponent; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: (props: { + selector?: (state: NoInfer< + FieldGroupState + >) => TSelected; + children: | ((state: NoInfer) => FieldGroupRenderable) + | FieldGroupRenderable; + }) => ReturnType; + } export function useFieldGroup< - TFormData, - TFieldGroupData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta = never, + TFormData, + TFieldGroupData, + TFields extends | DeepKeysOfType< + TFormData, + TFieldGroupData | null | undefined + > + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta = never, >(opts: { - form: - | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - // Since this only occurs if you nest it within other form lenses, it can be more - // lenient with the types. - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - defaultValues?: TFieldGroupData; - onSubmitMeta?: TSubmitMeta; - formComponents: TFormComponents; + form: | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other form lenses, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + defaultValues?: TFieldGroupData; + onSubmitMeta?: TSubmitMeta; + formComponents: TFormComponents; }): AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents > { - const [formLensApi] = useState(() => { - const api = new FieldGroupApi(opts); - const form = - opts.form instanceof FieldGroupApi - ? (opts.form.form as AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - >) - : opts.form; + const [formLensApi] = useState(() => { + const api = new FieldGroupApi(opts) + const form = + opts.form instanceof FieldGroupApi + ? opts.form.form as AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + : opts.form - const extendedApi: AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > = api as never; + const extendedApi: AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > = api as never - extendedApi.AppForm = function AppForm(appFormProps) { - return ; - }; + extendedApi.AppForm = function AppForm(appFormProps) { + return + } - extendedApi.AppField = function AppField(props) { - return ; - }; + extendedApi.AppField = function AppField(props) { + return + } - extendedApi.Field = function Field(props) { - return ; - }; + extendedApi.Field = function Field(props) { + return + } - extendedApi.Subscribe = function Subscribe(props: any) { - return ( - - ); - }; + extendedApi.Subscribe = function Subscribe(props: any) { + return + } - return Object.assign(extendedApi, { - ...opts.formComponents, - }) as AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - >; - }); + return Object.assign(extendedApi, { + ...opts.formComponents, + }) as AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + }) - useIsomorphicLayoutEffect(formLensApi.mount, [formLensApi]); + useIsomorphicLayoutEffect(formLensApi.mount, [formLensApi]) - return formLensApi; + return formLensApi } diff --git a/packages/octane-form/src/useFieldGroup.tsrx.d.ts b/packages/octane-form/src/useFieldGroup.tsrx.d.ts index 99a2340d2..74b957d8f 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFieldGroup.tsrx.d.ts @@ -1,37 +1,156 @@ // Declaration companion generated from useFieldGroup.tsrx. -import { FieldGroupApi } from '@tanstack/form-core'; -import type { DeepKeysOfType, FieldGroupState, FieldsMap, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; -import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; -import type { LensFieldComponent } from './useField.tsrx'; -type FieldGroupRenderable = unknown; +import { FieldGroupApi } from '@tanstack/form-core' +import type { + DeepKeysOfType, + FieldGroupState, + FieldsMap, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx' +import type { LensFieldComponent } from './useField.tsrx' +type FieldGroupRenderable = unknown type FieldGroupPropsWithChildren

= P & { - children?: FieldGroupRenderable; -}; -type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; -type FieldGroupComponentType

= FieldGroupFunctionComponent

; + children?: FieldGroupRenderable +} +type FieldGroupFunctionComponent

= ( + props: P, +) => FieldGroupRenderable +type FieldGroupComponentType

= FieldGroupFunctionComponent

/** * @private */ -export type AppFieldExtendedOctaneFieldGroupApi | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = FieldGroupApi & NoInfer & { - AppField: LensFieldComponent>; - AppForm: FieldGroupComponentType>; +export type AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = FieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: LensFieldComponent< + TFieldGroupData, + TSubmitMeta, + NoInfer + > + AppForm: FieldGroupComponentType> /** * A component to render form fields. With this, you can render and manage individual form fields. */ - Field: LensFieldComponent; + Field: LensFieldComponent /** * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. */ Subscribe: >>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; - }) => ReturnType; -}; -export declare function useFieldGroup | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TComponents extends Record>, TFormComponents extends Record>, TSubmitMeta = never>(opts: { - form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, TSubmitMeta, TComponents, TFormComponents>; - fields: TFields; - defaultValues?: TFieldGroupData; - onSubmitMeta?: TSubmitMeta; - formComponents: TFormComponents; -}): AppFieldExtendedOctaneFieldGroupApi; -export {}; + selector?: (state: NoInfer>) => TSelected + children: + | ((state: NoInfer) => FieldGroupRenderable) + | FieldGroupRenderable + }) => ReturnType + } +export declare function useFieldGroup< + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta = never, +>(opts: { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + TSubmitMeta, + TComponents, + TFormComponents + > + fields: TFields + defaultValues?: TFieldGroupData + onSubmitMeta?: TSubmitMeta + formComponents: TFormComponents +}): AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +> +export {} diff --git a/packages/octane-form/src/useForm.tsrx b/packages/octane-form/src/useForm.tsrx index 005e0ae62..6852ea5ef 100644 --- a/packages/octane-form/src/useForm.tsrx +++ b/packages/octane-form/src/useForm.tsrx @@ -1,170 +1,154 @@ -import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core'; -import { useSelector } from '@tanstack/octane-store'; -import { useMemo, useRef, useState } from 'octane'; -import { Field } from './useField.tsrx'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; -import { useFormId } from './useFormId'; -import { FormGroup } from './useFormGroup.tsrx'; -import type { FormGroupComponent } from './useFormGroup.tsrx'; +import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core' +import { useSelector } from '@tanstack/octane-store' +import { useMemo, useRef, useState } from 'octane' +import { Field } from './useField.tsrx' +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' +import { useFormId } from './useFormId' +import { FormGroup } from './useFormGroup.tsrx' +import type { FormGroupComponent } from './useFormGroup.tsrx' import type { - AnyFormApi, - AnyFormState, - FormAsyncValidateOrFn, - FormOptions, - FormState, - FormValidateOrFn, -} from '@tanstack/form-core'; -import type { FieldComponent } from './useField.tsrx'; + AnyFormApi, + AnyFormState, + FormAsyncValidateOrFn, + FormOptions, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { FieldComponent } from './useField.tsrx' -type FormRenderable = unknown; -type FormPropsWithChildren

= P & { children?: FormRenderable }; -type FormFunctionComponent

= (props: P) => FormRenderable; +type FormRenderable = unknown +type FormPropsWithChildren

= P & { children?: FormRenderable } +type FormFunctionComponent

= (props: P) => FormRenderable /** * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` */ export interface OctaneFormApi< - in out TFormData, - in out TOnMount extends undefined | FormValidateOrFn, - in out TOnChange extends undefined | FormValidateOrFn, - in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - in out TOnBlur extends undefined | FormValidateOrFn, - in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - in out TOnSubmit extends undefined | FormValidateOrFn, - in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - in out TOnDynamic extends undefined | FormValidateOrFn, - in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - in out TOnServer extends undefined | FormAsyncValidateOrFn, - in out TSubmitMeta, + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, > { - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >; - FormGroup: FormGroupComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >; - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: < - TSelected = NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - >(props: { - selector?: ( - state: NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - ) => TSelected; - children: ((state: NoInfer) => FormRenderable) | FormRenderable; - }) => ReturnType; + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > + FormGroup: FormGroupComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: (props: { + selector?: (state: NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >) => TSelected; + children: ((state: NoInfer) => FormRenderable) | FormRenderable; + }) => ReturnType } /** * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` */ export type OctaneFormExtendedApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, -> = FormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - OctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >; + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +> = + FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > & OctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > function LocalSubscribe({ - form, - selector = (state) => state, - children, + form, + selector = (state) => state, + children, }: FormPropsWithChildren<{ - form: AnyFormApi; - selector?: (state: AnyFormState) => AnyFormState; + form: AnyFormApi; + selector?: (state: AnyFormState) => AnyFormState; }>): ReturnType { - const data = useSelector(form.store, selector); + const data = useSelector(form.store, selector) - return <>{functionalUpdate(children, data)}; + return <> + {functionalUpdate(children, data)} + } /** @@ -173,124 +157,128 @@ function LocalSubscribe({ * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields */ export function useForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, >( - opts?: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, + opts?: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, ) { - const fallbackFormId = useFormId(); - const formId = opts?.formId ?? fallbackFormId; - const [prevFormId, setPrevFormId] = useState(formId); + const fallbackFormId = useFormId() + const formId = opts?.formId ?? fallbackFormId + const [prevFormId, setPrevFormId] = useState(formId) - const [formApi, setFormApi] = useState(() => { - return new FormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >({ ...opts, formId }); - }); + const [formApi, setFormApi] = useState(() => { + return new FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >({ ...opts, formId }) + }) - if (prevFormId !== formId) { - setFormApi(new FormApi({ ...opts, formId })); - setPrevFormId(formId); - } + if (prevFormId !== formId) { + setFormApi(new FormApi({ ...opts, formId })) + setPrevFormId(formId) + } - const extendedFormApi = useMemo(() => { - const extendedApi: OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > = { - ...formApi, - handleSubmit: ((...props: never[]) => { - return formApi._handleSubmit(...props); - }) as typeof formApi.handleSubmit, - // We must add all `get`ters from `core`'s `FormApi` here, as otherwise the spread operator won't catch those - get formId(): string { - return formApi._formId; - }, - get state() { - return formApi.store.state; - }, - } as never; + const extendedFormApi = useMemo(() => { + const extendedApi: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > = { + ...formApi, + handleSubmit: ((...props: never[]) => { + return formApi._handleSubmit(...props) + }) as typeof formApi.handleSubmit, + // We must add all `get`ters from `core`'s `FormApi` here, as otherwise the spread operator won't catch those + get formId(): string { + return formApi._formId + }, + get state() { + return formApi.store.state + }, + } as never - extendedApi.Field = function APIField(props) { - return ; - }; + extendedApi.Field = function APIField(props) { + return + } - extendedApi.FormGroup = function APIFormGroup(props) { - return ; - }; + extendedApi.FormGroup = function APIFormGroup(props) { + return + } - extendedApi.Subscribe = function Subscribe(props: any) { - return ; - }; + extendedApi.Subscribe = function Subscribe(props: any) { + return + } - return extendedApi; - }, [formApi]); + return extendedApi + }, [formApi]) - useIsomorphicLayoutEffect(formApi.mount, [formApi]); + useIsomorphicLayoutEffect(formApi.mount, [formApi]) - /** - * formApi.update should not have any side effects. Think of it like a `useRef` - * that we need to keep updated every render with the most up-to-date information. - */ - useIsomorphicLayoutEffect(() => { - formApi.update(opts); - }); + /** + * formApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + formApi.update(opts) + }) - const hasRan = useRef(false); + const hasRan = useRef(false) - useIsomorphicLayoutEffect(() => { - if (!hasRan.current) return; - if (!opts?.transform) return; - mergeAndUpdate(formApi, opts.transform as never); - }, [formApi, opts?.transform]); + useIsomorphicLayoutEffect(() => { + if (!hasRan.current) return + if (!opts?.transform) return + mergeAndUpdate(formApi, opts.transform as never) + }, [formApi, opts?.transform]) - useIsomorphicLayoutEffect(() => { - hasRan.current = true; - }); + useIsomorphicLayoutEffect(() => { + hasRan.current = true + }) - return extendedFormApi; + return extendedFormApi } diff --git a/packages/octane-form/src/useForm.tsrx.d.ts b/packages/octane-form/src/useForm.tsrx.d.ts index 6b62b9d77..3fb793ebd 100644 --- a/packages/octane-form/src/useForm.tsrx.d.ts +++ b/packages/octane-form/src/useForm.tsrx.d.ts @@ -1,35 +1,192 @@ // Declaration companion generated from useForm.tsrx. -import { FormApi } from '@tanstack/form-core'; -import type { FormGroupComponent } from './useFormGroup.tsrx'; -import type { FormAsyncValidateOrFn, FormOptions, FormState, FormValidateOrFn } from '@tanstack/form-core'; -import type { FieldComponent } from './useField.tsrx'; -type FormRenderable = unknown; -type FormFunctionComponent

= (props: P) => FormRenderable; +import { FormApi } from '@tanstack/form-core' +import type { FormGroupComponent } from './useFormGroup.tsrx' +import type { + FormAsyncValidateOrFn, + FormOptions, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core' +import type { FieldComponent } from './useField.tsrx' +type FormRenderable = unknown +type FormFunctionComponent

= (props: P) => FormRenderable /** * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` */ -export interface OctaneFormApi, in out TOnChange extends undefined | FormValidateOrFn, in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TOnBlur extends undefined | FormValidateOrFn, in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TOnSubmit extends undefined | FormValidateOrFn, in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TOnDynamic extends undefined | FormValidateOrFn, in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TOnServer extends undefined | FormAsyncValidateOrFn, in out TSubmitMeta> { - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: FieldComponent; - FormGroup: FormGroupComponent; - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: >>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FormRenderable) | FormRenderable; - }) => ReturnType; +export interface OctaneFormApi< + in out TFormData, + in out TOnMount extends undefined | FormValidateOrFn, + in out TOnChange extends undefined | FormValidateOrFn, + in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TOnBlur extends undefined | FormValidateOrFn, + in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TOnSubmit extends undefined | FormValidateOrFn, + in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TOnDynamic extends undefined | FormValidateOrFn, + in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TOnServer extends undefined | FormAsyncValidateOrFn, + in out TSubmitMeta, +> { + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > + FormGroup: FormGroupComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: < + TSelected = NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + >(props: { + selector?: ( + state: NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + ) => TSelected + children: ((state: NoInfer) => FormRenderable) | FormRenderable + }) => ReturnType } /** * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` */ -export type OctaneFormExtendedApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta> = FormApi & OctaneFormApi; +export type OctaneFormExtendedApi< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +> = FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + OctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > /** * A custom hook that returns an extended instance of the `FormApi` class. * * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields */ -export declare function useForm, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(opts?: FormOptions): OctaneFormExtendedApi; -export {}; +export declare function useForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + opts?: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +): OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> +export {} diff --git a/packages/octane-form/src/useFormGroup.tsrx b/packages/octane-form/src/useFormGroup.tsrx index f37d0c530..e968b40a6 100644 --- a/packages/octane-form/src/useFormGroup.tsrx +++ b/packages/octane-form/src/useFormGroup.tsrx @@ -1,633 +1,648 @@ -import { useMemo, useState } from 'octane'; -import { useSelector } from '@tanstack/octane-store'; -import { FormGroupApi, functionalUpdate } from '@tanstack/form-core'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import { useMemo, useState } from 'octane' +import { useSelector } from '@tanstack/octane-store' +import { FormGroupApi, functionalUpdate } from '@tanstack/form-core' +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' import type { - DeepKeys, - DeepValue, - FormAsyncValidateOrFn, - FormGroupApiOptions, - FormGroupAsyncValidateOrFn, - FormGroupOptions, - FormGroupValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core'; + DeepKeys, + DeepValue, + FormAsyncValidateOrFn, + FormGroupApiOptions, + FormGroupAsyncValidateOrFn, + FormGroupOptions, + FormGroupValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' -type FormGroupRenderable = unknown; -type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; +type FormGroupRenderable = unknown +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable export type UseFormGroup< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, ->( - opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >, -) => FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta ->; + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +> = + (opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >) => FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > export function useFormGroup< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, >( - opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >, + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, ) { - // Keep a snapshot of options so compiler optimizations do not treat - // formGroupApi as immutable. - const [prevOptions, setPrevOptions] = useState(() => ({ - form: opts.form, - name: opts.name, - })); + // Keep a snapshot of options so compiler optimizations do not treat + // formGroupApi as immutable. + const [prevOptions, setPrevOptions] = useState( + () => ({ + form: opts.form, + name: opts.name, + }), + ) - const [formGroupApiState, setFormGroupApi] = useState(() => { - return new FormGroupApi({ - ...opts, - }); - }); - let formGroupApi = formGroupApiState; + const [formGroupApiState, setFormGroupApi] = useState(() => { + return new FormGroupApi({ + ...opts, + }) + }) + let formGroupApi = formGroupApiState - // We only want to - // update on name changes since those are at risk of becoming stale. The field - // state must be up to date for the internal JSX render. - // The other options can freely be in `fieldApi.update` - if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { - // Use the replacement for the rest of this render so selectors and the - // render prop never observe state from the previous form or group name. - formGroupApi = new FormGroupApi({ - ...opts, - }); - setFormGroupApi(formGroupApi); - setPrevOptions({ form: opts.form, name: opts.name }); - } + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Use the replacement for the rest of this render so selectors and the + // render prop never observe state from the previous form or group name. + formGroupApi = new FormGroupApi({ + ...opts, + }) + setFormGroupApi(formGroupApi) + setPrevOptions({ form: opts.form, name: opts.name }) + } - const reactiveStateValue = useSelector(formGroupApi.store, (state) => state.value); + const reactiveStateValue = useSelector( + formGroupApi.store, + (state) => state.value, + ) - const reactiveMetaIsTouched = useSelector(formGroupApi.store, (state) => state.meta.isTouched); - const reactiveMetaIsBlurred = useSelector(formGroupApi.store, (state) => state.meta.isBlurred); - const reactiveMetaIsDirty = useSelector(formGroupApi.store, (state) => state.meta.isDirty); - const reactiveMetaErrorMap = useSelector(formGroupApi.store, (state) => state.meta.errorMap); - const reactiveMetaErrorSourceMap = useSelector( - formGroupApi.store, - (state) => state.meta.errorSourceMap, - ); - const reactiveMetaIsValidating = useSelector( - formGroupApi.store, - (state) => state.meta.isValidating, - ); + const reactiveMetaIsTouched = useSelector( + formGroupApi.store, + (state) => state.meta.isTouched, + ) + const reactiveMetaIsBlurred = useSelector( + formGroupApi.store, + (state) => state.meta.isBlurred, + ) + const reactiveMetaIsDirty = useSelector( + formGroupApi.store, + (state) => state.meta.isDirty, + ) + const reactiveMetaErrorMap = useSelector( + formGroupApi.store, + (state) => state.meta.errorMap, + ) + const reactiveMetaErrorSourceMap = useSelector( + formGroupApi.store, + (state) => state.meta.errorSourceMap, + ) + const reactiveMetaIsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isValidating, + ) - // Submission lifecycle and aggregated validity now live on `state.meta` - // (mirroring `FieldApi.state.meta`). Subscribe to the fields callers - // typically read so the compiled renderer tracks them as dependencies. - const reactiveMetaIsSubmitting = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitting, - ); - const reactiveMetaIsSubmitted = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitted, - ); - const reactiveMetaSubmissionAttempts = useSelector( - formGroupApi.store, - (state) => state.meta.submissionAttempts, - ); - const reactiveMetaIsSubmitSuccessful = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitSuccessful, - ); - const reactiveMetaCanSubmit = useSelector(formGroupApi.store, (state) => state.meta.canSubmit); - const reactiveMetaIsValid = useSelector(formGroupApi.store, (state) => state.meta.isValid); - const reactiveMetaIsFieldsValid = useSelector( - formGroupApi.store, - (state) => state.meta.isFieldsValid, - ); - const reactiveMetaIsFieldsValidating = useSelector( - formGroupApi.store, - (state) => state.meta.isFieldsValidating, - ); - const reactiveMetaIsGroupValid = useSelector( - formGroupApi.store, - (state) => state.meta.isGroupValid, - ); + // Submission lifecycle and aggregated validity now live on `state.meta` + // (mirroring `FieldApi.state.meta`). Subscribe to the fields callers + // typically read so the compiled renderer tracks them as dependencies. + const reactiveMetaIsSubmitting = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitting, + ) + const reactiveMetaIsSubmitted = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitted, + ) + const reactiveMetaSubmissionAttempts = useSelector( + formGroupApi.store, + (state) => state.meta.submissionAttempts, + ) + const reactiveMetaIsSubmitSuccessful = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitSuccessful, + ) + const reactiveMetaCanSubmit = useSelector( + formGroupApi.store, + (state) => state.meta.canSubmit, + ) + const reactiveMetaIsValid = useSelector( + formGroupApi.store, + (state) => state.meta.isValid, + ) + const reactiveMetaIsFieldsValid = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValid, + ) + const reactiveMetaIsFieldsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValidating, + ) + const reactiveMetaIsGroupValid = useSelector( + formGroupApi.store, + (state) => state.meta.isGroupValid, + ) - // Materialize the reactive snapshots in the extended API returned to render callbacks. - const extendedFieldApi = useMemo(() => { - const reactiveFieldApi = { - ...formGroupApi, - handleSubmit: ((...props: never[]) => { - return formGroupApi._handleSubmit(...props); - }) as typeof formGroupApi.handleSubmit, - get state() { - return { - ...formGroupApi.state, - value: reactiveStateValue, - get meta() { - return { - ...formGroupApi.state.meta, - isTouched: reactiveMetaIsTouched, - isBlurred: reactiveMetaIsBlurred, - isDirty: reactiveMetaIsDirty, - errorMap: reactiveMetaErrorMap, - errorSourceMap: reactiveMetaErrorSourceMap, - isValidating: reactiveMetaIsValidating, - isSubmitting: reactiveMetaIsSubmitting, - isSubmitted: reactiveMetaIsSubmitted, - submissionAttempts: reactiveMetaSubmissionAttempts, - isSubmitSuccessful: reactiveMetaIsSubmitSuccessful, - canSubmit: reactiveMetaCanSubmit, - isValid: reactiveMetaIsValid, - isFieldsValid: reactiveMetaIsFieldsValid, - isFieldsValidating: reactiveMetaIsFieldsValidating, - isGroupValid: reactiveMetaIsGroupValid, - } satisfies typeof formGroupApi.state.meta; - }, - } satisfies typeof formGroupApi.state; - }, - }; + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...formGroupApi, + handleSubmit: ((...props: never[]) => { + return formGroupApi._handleSubmit(...props) + }) as typeof formGroupApi.handleSubmit, + get state() { + return { + ...formGroupApi.state, + value: reactiveStateValue, + get meta() { + return { + ...formGroupApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + isSubmitting: reactiveMetaIsSubmitting, + isSubmitted: reactiveMetaIsSubmitted, + submissionAttempts: reactiveMetaSubmissionAttempts, + isSubmitSuccessful: reactiveMetaIsSubmitSuccessful, + canSubmit: reactiveMetaCanSubmit, + isValid: reactiveMetaIsValid, + isFieldsValid: reactiveMetaIsFieldsValid, + isFieldsValidating: reactiveMetaIsFieldsValidating, + isGroupValid: reactiveMetaIsGroupValid, + } satisfies typeof formGroupApi.state.meta + }, + } satisfies typeof formGroupApi.state + }, + } - const extendedApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > = reactiveFieldApi as never; + const extendedApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > = reactiveFieldApi as never - return extendedApi; - }, [ - formGroupApi, - reactiveStateValue, - reactiveMetaIsTouched, - reactiveMetaIsBlurred, - reactiveMetaIsDirty, - reactiveMetaErrorMap, - reactiveMetaErrorSourceMap, - reactiveMetaIsValidating, - reactiveMetaIsSubmitting, - reactiveMetaIsSubmitted, - reactiveMetaSubmissionAttempts, - reactiveMetaIsSubmitSuccessful, - reactiveMetaCanSubmit, - reactiveMetaIsValid, - reactiveMetaIsFieldsValid, - reactiveMetaIsFieldsValidating, - reactiveMetaIsGroupValid, - ]); + return extendedApi + }, [ + formGroupApi, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + reactiveMetaIsSubmitting, + reactiveMetaIsSubmitted, + reactiveMetaSubmissionAttempts, + reactiveMetaIsSubmitSuccessful, + reactiveMetaCanSubmit, + reactiveMetaIsValid, + reactiveMetaIsFieldsValid, + reactiveMetaIsFieldsValidating, + reactiveMetaIsGroupValid, + ]) - useIsomorphicLayoutEffect(formGroupApi.mount, [formGroupApi]); + useIsomorphicLayoutEffect(formGroupApi.mount, [formGroupApi]) - useIsomorphicLayoutEffect(() => { - formGroupApi.update(opts); - }); + useIsomorphicLayoutEffect(() => { + formGroupApi.update(opts) + }) - return extendedFieldApi; + return extendedFieldApi } interface FormGroupComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, > extends FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta > { - children: ( - formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & - ExtendedApi, - ) => FormGroupRenderable; + children: (formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & ExtendedApi) => FormGroupRenderable } interface FormGroupComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, > extends FormGroupOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta > { - children: ( - formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & - ExtendedApi, - ) => FormGroupRenderable; + children: (formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & ExtendedApi) => FormGroupRenderable } export type FormGroupComponent< - in out TParentData, - in out TFormOnMount extends undefined | FormValidateOrFn, - in out TFormOnChange extends undefined | FormValidateOrFn, - in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnBlur extends undefined | FormValidateOrFn, - in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnSubmit extends undefined | FormValidateOrFn, - in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnDynamic extends undefined | FormValidateOrFn, - in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - in out TFormOnServer extends undefined | FormAsyncValidateOrFn, - in out TParentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, ->({ - children, - ...formGroupOptions -}: FormGroupComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta, - ExtendedApi ->) => ReturnType; + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, +> = + ({ children, ...formGroupOptions }: FormGroupComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta, + ExtendedApi + >) => ReturnType export const FormGroup = (< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends undefined | FormGroupValidateOrFn, - TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnSubmit extends undefined | FormGroupValidateOrFn, - TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, - TOnDynamic extends undefined | FormGroupValidateOrFn, - TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, ->({ - children, - ...formGroupOptions -}: FormGroupComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>({ children, ...formGroupOptions }: FormGroupComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta >): ReturnType => { - const formGroupApi = useFormGroup(formGroupOptions as any); + const formGroupApi = useFormGroup(formGroupOptions as any) - const jsxToDisplay = useMemo( - () => functionalUpdate(children, formGroupApi as any), - [children, formGroupApi], - ); - return (<>{jsxToDisplay}) as never; + const jsxToDisplay = useMemo( + () => functionalUpdate(children, formGroupApi as any), + [children, formGroupApi], + ) + return <> + {jsxToDisplay} + as never }) satisfies FormGroupFunctionComponent< - FormGroupComponentProps< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > ->; + FormGroupComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +> diff --git a/packages/octane-form/src/useFormGroup.tsrx.d.ts b/packages/octane-form/src/useFormGroup.tsrx.d.ts index 8bd12aa1f..c9c4ddabb 100644 --- a/packages/octane-form/src/useFormGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFormGroup.tsrx.d.ts @@ -1,16 +1,539 @@ // Declaration companion generated from useFormGroup.tsrx. -import { FormGroupApi } from '@tanstack/form-core'; -import type { DeepKeys, DeepValue, FormAsyncValidateOrFn, FormGroupApiOptions, FormGroupAsyncValidateOrFn, FormGroupOptions, FormGroupValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; -type FormGroupRenderable = unknown; -type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; -export type UseFormGroup, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>(opts: FormGroupApiOptions) => FormGroupApi; -export declare function useFormGroup, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>(opts: FormGroupApiOptions): FormGroupApi; -interface FormGroupComponentProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupApiOptions { - children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; +import { FormGroupApi } from '@tanstack/form-core' +import type { + DeepKeys, + DeepValue, + FormAsyncValidateOrFn, + FormGroupApiOptions, + FormGroupAsyncValidateOrFn, + FormGroupOptions, + FormGroupValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core' +type FormGroupRenderable = unknown +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable +export type UseFormGroup< + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>( + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, +) => FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> +export declare function useFormGroup< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>( + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, +): FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> +interface FormGroupComponentProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, +> extends FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> { + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable } -interface FormGroupComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupOptions { - children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; +interface FormGroupComponentBoundProps< + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, +> extends FormGroupOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +> { + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable } -export type FormGroupComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentBoundProps) => ReturnType; -export declare const FormGroup: , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentProps) => ReturnType; -export {}; +export type FormGroupComponent< + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends + | undefined + | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta, + ExtendedApi +>) => ReturnType +export declare const FormGroup: < + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends + | undefined + | FormGroupValidateOrFn, + TOnChangeAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnSubmit extends + | undefined + | FormGroupValidateOrFn, + TOnSubmitAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TOnDynamic extends + | undefined + | FormGroupValidateOrFn, + TOnDynamicAsync extends + | undefined + | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +>) => ReturnType +export {} diff --git a/packages/octane-form/src/useFormId.ts b/packages/octane-form/src/useFormId.ts index 5d4379ee4..9149ef679 100644 --- a/packages/octane-form/src/useFormId.ts +++ b/packages/octane-form/src/useFormId.ts @@ -1,4 +1,4 @@ -import { useId } from 'octane'; +import { useId } from 'octane' // Generated IDs remain opaque and stable across SSR and hydration. -export const useFormId = useId; +export const useFormId = useId diff --git a/packages/octane-form/src/useIsomorphicLayoutEffect.ts b/packages/octane-form/src/useIsomorphicLayoutEffect.ts index 27d0a71c8..fd02eec6c 100644 --- a/packages/octane-form/src/useIsomorphicLayoutEffect.ts +++ b/packages/octane-form/src/useIsomorphicLayoutEffect.ts @@ -1,4 +1,4 @@ -import { useEffect, useLayoutEffect } from 'octane'; +import { useEffect, useLayoutEffect } from 'octane' export const useIsomorphicLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect; + typeof window !== 'undefined' ? useLayoutEffect : useEffect diff --git a/packages/octane-form/tests/createFormHook.test-d.tsx b/packages/octane-form/tests/createFormHook.test-d.tsx index e87e05dca..06f4fd639 100644 --- a/packages/octane-form/tests/createFormHook.test-d.tsx +++ b/packages/octane-form/tests/createFormHook.test-d.tsx @@ -1,1022 +1,1058 @@ -import { describe, expectTypeOf, it } from 'vitest'; -import { formOptions } from '@tanstack/form-core'; -import { createFormHook, createFormHookContexts } from '../src'; +import { describe, expectTypeOf, it } from 'vitest' +import { formOptions } from '@tanstack/form-core' +import { createFormHook, createFormHookContexts } from '../src' -const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); +const { fieldContext, useFieldContext, formContext, useFormContext } = + createFormHookContexts() function Test() { - return null; + return null } class ClassComponent { - render() { - return null; - } + render() { + return null + } } createFormHook({ - fieldComponents: { - // @ts-expect-error Octane component registration accepts callable function components only. - ClassComponent, - }, - formComponents: {}, - fieldContext, - formContext, -}); + fieldComponents: { + // @ts-expect-error Octane component registration accepts callable function components only. + ClassComponent, + }, + formComponents: {}, + fieldContext, + formContext, +}) const { useAppForm, withForm, withFieldGroup } = createFormHook({ - fieldComponents: { - Test, - }, - formComponents: { - Test, - }, - fieldContext, - formContext, -}); + fieldComponents: { + Test, + }, + formComponents: { + Test, + }, + fieldContext, + formContext, +}) describe('createFormHook', () => { - it('should not break with an infinite type on large schemas', () => { - const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const; - type ActivityKind0 = (typeof ActivityKind0_Names)[number]; - - enum DayOfWeek { - Monday = 1, - Tuesday, - Wednesday, - Thursday, - Friday, - Saturday, - Sunday, - } - - interface Branding { - __type?: Brand; - } - type Branded = T & Branding; - type ActivityId = Branded; - interface ActivitySelectorFormData { - includeAll: boolean; - includeActivityIds: ActivityId[]; - includeActivityKinds: Set; - excludeActivityIds: ActivityId[]; - } - - const GeneratedTypes0Visibility_Names = ['Normal', 'Advanced', 'Hidden'] as const; - type GeneratedTypes0Visibility = (typeof GeneratedTypes0Visibility_Names)[number]; - interface FormValuesBase { - key: string; - visibility: GeneratedTypes0Visibility; - } - - interface ActivityCountFormValues extends FormValuesBase { - _type: 'ActivityCount'; - activitySelector: ActivitySelectorFormData; - daysOfWeek: DayOfWeek[]; - label: string; - } - - interface PlanningTimesFormValues extends FormValuesBase { - _type: 'PlanningTimes'; - showTarget: boolean; - showPlanned: boolean; - showDiff: boolean; - } - - type EditorValues = ActivityCountFormValues | PlanningTimesFormValues; - interface EditorFormValues { - editors: Record; - ordering: string[]; - } - - const ExampleUsage = withForm({ - props: { - initialValues: '' as keyof EditorFormValues['editors'], - }, - defaultValues: {} as EditorFormValues, - render: ({ form, initialValues }) => { - return ( -

- - {(field) => { - expectTypeOf(field.state.value).toExtend(); - return null; - }} - - - - -
- ); - }, - }); - - const ExampleUsage2 = withFieldGroup({ - defaultValues: {} as EditorValues, - render: ({ group }) => { - const test = group.state.values.key; - return ( -
- - {(field) => { - expectTypeOf(field.state.value).toExtend(); - return null; - }} - - - - -
- ); - }, - }); - }); - - it('types should be properly inferred when using formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const WithFormComponent = withForm({ - ...formOpts, - render: ({ form }) => { - expectTypeOf(form.state.values).toEqualTypeOf(); - return ; - }, - }); - }); - - it('types should be properly inferred when passing args alongside formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const WithFormComponent = withForm({ - ...formOpts, - onSubmitMeta: { - test: 'test', - }, - render: ({ form }) => { - expectTypeOf(form.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: { test: string }): Promise; - }>; - return ; - }, - }); - }); - - it('types should be properly inferred when formOptions are being overridden', () => { - type Person = { - firstName: string; - lastName: string; - }; - - type PersonWithAge = Person & { - age: number; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const WithFormComponent = withForm({ - ...formOpts, - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - age: 10, - }, - render: ({ form }) => { - expectTypeOf(form.state.values).toExtend(); - return ; - }, - }); - }); - - it('withForm props should be properly inferred', () => { - const WithFormComponent = withForm({ - props: { - prop1: 'test', - prop2: 10, - }, - render: ({ form, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string; - prop2: number; - children?: unknown; - }>(); - - return ; - }, - }); - }); - - it('component made from withForm should have its props properly typed', () => { - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - }, - }); - - const appForm = useAppForm(formOpts); - - const WithFormComponent = withForm({ - ...formOpts, - props: { - prop1: 'test', - prop2: 10, - }, - render: ({ form, children, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string; - prop2: number; - }>(); - return ; - }, - }); - - const CorrectComponent = ; - - // @ts-expect-error Missing required props prop1 and prop2 - const MissingPropsComponent = ; - - const incorrectFormOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - firstNameWrong: 'FirstName', - lastNameWrong: 'LastName', - }, - }); - - const incorrectAppForm = useAppForm(incorrectFormOpts); - - const IncorrectFormOptsComponent = ( - // @ts-expect-error Incorrect form opts - - ); - }); - - it('should infer subset values and props when calling withFieldGroup', () => { - type Person = { - firstName: string; - lastName: string; - }; - type ComponentProps = { - prop1: string; - prop2: number; - }; - - const defaultValues: Person = { - firstName: 'FirstName', - lastName: 'LastName', - }; - - const FormGroupComponent = withFieldGroup({ - defaultValues, - render: function Render({ group, children, ...props }) { - // Existing types may be inferred - expectTypeOf(group.state.values.firstName).toEqualTypeOf(); - expectTypeOf(group.state.values.lastName).toEqualTypeOf(); - - expectTypeOf(group.state.values).toEqualTypeOf(); - expectTypeOf(children).toEqualTypeOf(); - expectTypeOf(props).toEqualTypeOf<{}>(); - return ; - }, - }); - - const FormGroupComponentWithProps = withFieldGroup({ - ...defaultValues, - props: {} as ComponentProps, - render: ({ group, children, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string; - prop2: number; - }>(); - return ; - }, - }); - }); - - it('should allow spreading formOptions when calling withFieldGroup', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const defaultValues: Person = { - firstName: '', - lastName: '', - }; - const formOpts = formOptions({ - defaultValues, - validators: { - onChange: () => 'Error', - }, - listeners: { - onBlur: () => 'Something', - }, - asyncAlways: true, - asyncDebounceMs: 500, - }); - - // validators and listeners are ignored, only defaultValues is acknowledged - const FormGroupComponent = withFieldGroup({ - ...formOpts, - render: function Render({ group }) { - // Existing types may be inferred - expectTypeOf(group.state.values.firstName).toEqualTypeOf(); - expectTypeOf(group.state.values.lastName).toEqualTypeOf(); - return ; - }, - }); - - const noDefaultValuesFormOpts = formOptions({ - onSubmitMeta: { foo: '' }, - }); - - const UnknownFormGroupComponent = withFieldGroup({ - ...noDefaultValuesFormOpts, - render: function Render({ group }) { - // group.state.values can be anything. - // note that T extends unknown !== unknown extends T. - expectTypeOf().toExtend(); - - // either no submit meta or of the type in formOptions - expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [{ foo: string }]>(); - return ; - }, - }); - }); - - it('should allow passing compatible forms to withFieldGroup', () => { - type Person = { - firstName: string; - lastName: string; - }; - type ComponentProps = { - prop1: string; - prop2: number; - }; - - const defaultValues: Person = { - firstName: 'FirstName', - lastName: 'LastName', - }; - - const FormGroup = withFieldGroup({ - defaultValues, - props: {} as ComponentProps, - render: () => { - return <>; - }, - }); - - const equalAppForm = useAppForm({ - defaultValues, - }); - - // ----------------- - // Assert that an equal form is not compatible as you have no name to pass - const NoSubfield = ( - - ); - - // ----------------- - // Assert that a form extending Person in a property is allowed - - const extendedAppForm = useAppForm({ - defaultValues: { person: { ...defaultValues, address: '' }, address: '' }, - }); - // While it has other properties, it satisfies defaultValues - const CorrectComponent1 = ( - - ); - - const MissingProps = ( - // @ts-expect-error because prop1 and prop2 are not added - - ); - - // ----------------- - // Assert that a form not satisfying Person errors - const incompatibleAppForm = useAppForm({ - defaultValues: { person: { ...defaultValues, lastName: 0 } }, - }); - const IncompatibleComponent = ( - - ); - }); - - it('should require strict equal submitMeta if it is set in withFieldGroup', () => { - type Person = { - firstName: string; - lastName: string; - }; - type SubmitMeta = { - correct: string; - }; - - const defaultValues = { - person: { firstName: 'FirstName', lastName: 'LastName' } as Person, - }; - const onSubmitMeta: SubmitMeta = { - correct: 'Prop', - }; - - const FormLensNoMeta = withFieldGroup({ - defaultValues: {} as Person, - render: function Render({ group }) { - // Since handleSubmit always allows to submit without meta, this is okay - group.handleSubmit(); - - // To prevent unwanted meta behaviour, handleSubmit's meta should be never if not set. - expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [submitMeta: never]>(); - - return ; - }, - }); - - const FormGroupWithMeta = withFieldGroup({ - defaultValues: {} as Person, - onSubmitMeta, - render: function Render({ group }) { - // Since handleSubmit always allows to submit without meta, this is okay - group.handleSubmit(); - - // This matches the value - group.handleSubmit({ correct: '' }); - - // This does not. - // @ts-expect-error - group.handleSubmit({ wrong: 'Meta' }); - - return ; - }, - }); - - const noMetaForm = useAppForm({ - defaultValues, - }); - - const CorrectComponent1 = ; - - const WrongComponent1 = ( - - ); - - const metaForm = useAppForm({ - defaultValues, - onSubmitMeta, - }); - - const CorrectComponent2 = ; - const CorrectComponent3 = ; - - const diffMetaForm = useAppForm({ - defaultValues, - onSubmitMeta: { ...onSubmitMeta, something: 'else' }, - }); - - const CorrectComponent4 = ; - const WrongComponent2 = ( - - ); - }); - - it('should accept any validators for withFieldGroup', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const defaultValues = { - person: { firstName: 'FirstName', lastName: 'LastName' } satisfies Person, - }; - - const formA = useAppForm({ - defaultValues, - validators: { - onChange: () => 'A', - }, - listeners: { - onChange: () => 'A', - }, - }); - const formB = useAppForm({ - defaultValues, - validators: { - onChange: () => 'B', - }, - listeners: { - onChange: () => 'B', - }, - }); - - const FormGroup = withFieldGroup({ - defaultValues: defaultValues.person, - render: function Render({ group }) { - return ; - }, - }); - - const CorrectComponent1 = ; - const CorrectComponent2 = ; - }); - - it('should allow nesting withFieldGroup in other withFieldGroups', () => { - type Nested = { - firstName: string; - }; - type Wrapper = { - field: Nested; - }; - type FormValues = { - form: Wrapper; - unrelated: { something: { lastName: string } }; - }; - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - }; - - const form = useAppForm({ - defaultValues, - }); - const LensNested = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render() { - return <>; - }, - }); - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- -
- ); - }, - }); - - const Component = ; - }); - - it('should not allow withFieldGroups with different metas to be nested', () => { - type Nested = { - firstName: string; - }; - type Wrapper = { - field: Nested; - }; - type FormValues = { - form: Wrapper; - unrelated: { something: { lastName: string } }; - }; - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - }; - - const LensNestedNoMeta = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render() { - return <>; - }, - }); - const LensNestedWithMeta = withFieldGroup({ - defaultValues: defaultValues.form.field, - onSubmitMeta: { meta: '' }, - render: function Render() { - return <>; - }, - }); - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- - -
- ); - }, - }); - - it('should allow mapping withFieldGroup to different fields', () => { - const defaultValues = { - firstName: '', - lastName: '', - age: 0, - relatives: [{ firstName: '', lastName: '', age: 0 }], - }; - const defaultFields = { - first: '', - last: '', - }; - - const form = useAppForm({ - defaultValues, - }); - - const FieldGroup = withFieldGroup({ - defaultValues: defaultFields, - render: function Render() { - return <>; - }, - }); - - const Component1 = ( - - ); - - const Component2 = ( - - ); - }); - - it('should not allow fields mapping if the top level is an array', () => { - const defaultValues = { - firstName: '', - lastName: '', - age: 0, - relatives: [{ firstName: '', lastName: '', age: 0 }], - relativesRecord: { - something: { firstName: '', lastName: '', age: 0 }, - } as Record, - }; - const defaultFields = { - firstName: '', - lastName: '', - }; - - const form = useAppForm({ - defaultValues, - }); - - const FieldGroupRecord = withFieldGroup({ - defaultValues: { anything: defaultFields } as Record, - render: function Render() { - return <>; - }, - }); - const FieldGroupArray = withFieldGroup({ - defaultValues: [defaultFields], - render: function Render() { - return <>; - }, - }); - - const CorrectComponent1 = ; - const WrongComponent1 = ( - - ); - const CorrectComponent3 = ; - const WrongComponent2 = ( - - ); - }); - }); - - it('should allow mapping field groups to optional fields', () => { - const groupFields = { - name: '', - }; - - type WrapperValues = { - namespace: { name: string } | undefined; - namespace2: { name: string } | null; - namespace3: { name: string } | null | undefined; - nope: null | undefined; - nope2: { lastName: string } | null | undefined; - }; - - const defaultValues: WrapperValues = { - namespace: undefined, - namespace2: null, - namespace3: null, - nope: null, - nope2: null, - }; - - const FieldGroup = withFieldGroup({ - defaultValues: groupFields, - render: function Render() { - return <>; - }, - }); - - const form = useAppForm({ - defaultValues, - }); - - const Component = ; - const Component2 = ; - const Component3 = ; - // @ts-expect-error because it doesn't ever evaluate to the expected values - const Component4 = ; - // @ts-expect-error because the types don't match properly - const Component5 = ; - }); - - it('should allow interfaces without index signatures to be assigned to `props` in withForm and withFormGroup', () => { - interface TestNoSignature { - title: string; - } - - interface TestWithSignature { - title: string; - [key: string]: unknown; - } - - const WithFormComponent1 = withForm({ - defaultValues: { name: '' }, - props: {} as TestNoSignature, - render: () => <>, - }); - - const WithFormComponent2 = withForm({ - defaultValues: { name: '' }, - props: {} as TestWithSignature, - render: () => <>, - }); - - const WithFieldGroupComponent1 = withFieldGroup({ - defaultValues: { name: '' }, - props: {} as TestNoSignature, - render: () => <>, - }); - - const WithFieldGroupComponent2 = withFieldGroup({ - defaultValues: { name: '' }, - props: {} as TestWithSignature, - render: () => <>, - }); - - const appForm = useAppForm({ defaultValues: { name: '' } }); - - const Component1 = ; - const Component2 = ; - - const FieldGroupComponent1 = ( - - ); - const FieldGroupComponent2 = ( - - ); - }); - - it('should not allow null as prop in withForm and withFormGroup', () => { - const WithFormComponent = withForm({ - defaultValues: { name: '' }, - // @ts-expect-error - props: null, - render: () => <>, - }); - }); - - const WithFieldGroupComponent = withFieldGroup({ - defaultValues: { name: '' }, - // @ts-expect-error - props: null, - render: () => <>, - }); - - describe('extendForm', () => { - function ExtendedField() { - return null; - } - function ExtendedFormComp() { - return null; - } - - const baseHook = createFormHook({ - fieldComponents: { Test }, - formComponents: { Test }, - fieldContext, - formContext, - }); - - const { - withForm: withExtendedForm, - withFieldGroup: withExtendedFieldGroup, - extendForm, - } = baseHook.extendForm({ - fieldComponents: { ExtendedField }, - formComponents: { ExtendedFormComp }, - }); - - it('should expose extendForm on the returned hook', () => { - expectTypeOf(extendForm).toBeFunction(); - }); - - it('should include parent field components in the extended AppField render prop', () => { - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - expectTypeOf(form.AppField).toBeFunction(); - - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction(); - expectTypeOf(field.ExtendedField).toBeFunction(); - return null; - }} - - ); - }, - }); - }); - - it('should include parent form components on the extended form', () => { - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - expectTypeOf(form.Test).toBeFunction(); - expectTypeOf(form.ExtendedFormComp).toBeFunction(); - return null; - }, - }); - }); - - it('should include parent and extended components in withFieldGroup', () => { - withExtendedFieldGroup({ - defaultValues: { name: '' }, - render: ({ group }) => { - expectTypeOf(group.Test).toBeFunction(); - expectTypeOf(group.ExtendedFormComp).toBeFunction(); - - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction(); - expectTypeOf(field.ExtendedField).toBeFunction(); - return null; - }} - - ); - }, - }); - }); - - it('should error when a duplicate field component name is used in extendForm', () => { - baseHook.extendForm({ - fieldComponents: { - // @ts-expect-error 'Test' already exists in the base form - Test: ExtendedField, - }, - }); - }); - - it('should error when a duplicate form component name is used in extendForm', () => { - baseHook.extendForm({ - formComponents: { - // @ts-expect-error 'Test' already exists in the base form - Test: ExtendedFormComp, - }, - }); - }); - - it('should allow further extension of an already extended hook', () => { - function ThirdField() { - return null; - } - - const { useAppForm: useDoublyExtended } = baseHook - .extendForm({ fieldComponents: { ExtendedField } }) - .extendForm({ fieldComponents: { ThirdField } }); - - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction(); - expectTypeOf(field.ExtendedField).toBeFunction(); - return null; - }} - - ); - }, - }); - - const doublyExtendedForm = useDoublyExtended({ - defaultValues: { name: '' }, - }); - expectTypeOf(doublyExtendedForm.AppField).toBeFunction(); - }); - - it('should preserve its recursive type beyond the previous declaration cutoff', () => { - const deeplyExtended = baseHook - .extendForm({ fieldComponents: { Field01: Test } }) - .extendForm({ fieldComponents: { Field02: Test } }) - .extendForm({ fieldComponents: { Field03: Test } }) - .extendForm({ fieldComponents: { Field04: Test } }) - .extendForm({ fieldComponents: { Field05: Test } }) - .extendForm({ fieldComponents: { Field06: Test } }) - .extendForm({ fieldComponents: { Field07: Test } }) - .extendForm({ fieldComponents: { Field08: Test } }) - .extendForm({ fieldComponents: { Field09: Test } }) - .extendForm({ fieldComponents: { Field10: Test } }) - .extendForm({ fieldComponents: { Field11: Test } }) - .extendForm({ fieldComponents: { Field12: Test } }); - - expectTypeOf(deeplyExtended).not.toBeAny(); - expectTypeOf(deeplyExtended.extendForm).toBeFunction(); - }); - }); -}); + it('should not break with an infinite type on large schemas', () => { + const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const + type ActivityKind0 = (typeof ActivityKind0_Names)[number] + + enum DayOfWeek { + Monday = 1, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, + } + + interface Branding { + __type?: Brand + } + type Branded = T & Branding + type ActivityId = Branded + interface ActivitySelectorFormData { + includeAll: boolean + includeActivityIds: ActivityId[] + includeActivityKinds: Set + excludeActivityIds: ActivityId[] + } + + const GeneratedTypes0Visibility_Names = [ + 'Normal', + 'Advanced', + 'Hidden', + ] as const + type GeneratedTypes0Visibility = + (typeof GeneratedTypes0Visibility_Names)[number] + interface FormValuesBase { + key: string + visibility: GeneratedTypes0Visibility + } + + interface ActivityCountFormValues extends FormValuesBase { + _type: 'ActivityCount' + activitySelector: ActivitySelectorFormData + daysOfWeek: DayOfWeek[] + label: string + } + + interface PlanningTimesFormValues extends FormValuesBase { + _type: 'PlanningTimes' + showTarget: boolean + showPlanned: boolean + showDiff: boolean + } + + type EditorValues = ActivityCountFormValues | PlanningTimesFormValues + interface EditorFormValues { + editors: Record + ordering: string[] + } + + const ExampleUsage = withForm({ + props: { + initialValues: '' as keyof EditorFormValues['editors'], + }, + defaultValues: {} as EditorFormValues, + render: ({ form, initialValues }) => { + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend() + return null + }} + + + + +
+ ) + }, + }) + + const ExampleUsage2 = withFieldGroup({ + defaultValues: {} as EditorValues, + render: ({ group }) => { + const test = group.state.values.key + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend() + return null + }} + + + + +
+ ) + }, + }) + }) + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const WithFormComponent = withForm({ + ...formOpts, + render: ({ form }) => { + expectTypeOf(form.state.values).toEqualTypeOf() + return + }, + }) + }) + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const WithFormComponent = withForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + render: ({ form }) => { + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: { test: string }): Promise + }> + return + }, + }) + }) + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string + lastName: string + } + + type PersonWithAge = Person & { + age: number + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const WithFormComponent = withForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + render: ({ form }) => { + expectTypeOf(form.state.values).toExtend() + return + }, + }) + }) + + it('withForm props should be properly inferred', () => { + const WithFormComponent = withForm({ + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string + prop2: number + children?: unknown + }>() + + return + }, + }) + }) + + it('component made from withForm should have its props properly typed', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }) + + const appForm = useAppForm(formOpts) + + const WithFormComponent = withForm({ + ...formOpts, + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string + prop2: number + }>() + return + }, + }) + + const CorrectComponent = ( + + ) + + // @ts-expect-error Missing required props prop1 and prop2 + const MissingPropsComponent = + + const incorrectFormOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + firstNameWrong: 'FirstName', + lastNameWrong: 'LastName', + }, + }) + + const incorrectAppForm = useAppForm(incorrectFormOpts) + + const IncorrectFormOptsComponent = ( + // @ts-expect-error Incorrect form opts + + ) + }) + + it('should infer subset values and props when calling withFieldGroup', () => { + type Person = { + firstName: string + lastName: string + } + type ComponentProps = { + prop1: string + prop2: number + } + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + } + + const FormGroupComponent = withFieldGroup({ + defaultValues, + render: function Render({ group, children, ...props }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf() + expectTypeOf(group.state.values.lastName).toEqualTypeOf() + + expectTypeOf(group.state.values).toEqualTypeOf() + expectTypeOf(children).toEqualTypeOf() + expectTypeOf(props).toEqualTypeOf<{}>() + return + }, + }) + + const FormGroupComponentWithProps = withFieldGroup({ + ...defaultValues, + props: {} as ComponentProps, + render: ({ group, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string + prop2: number + }>() + return + }, + }) + }) + + it('should allow spreading formOptions when calling withFieldGroup', () => { + type Person = { + firstName: string + lastName: string + } + + const defaultValues: Person = { + firstName: '', + lastName: '', + } + const formOpts = formOptions({ + defaultValues, + validators: { + onChange: () => 'Error', + }, + listeners: { + onBlur: () => 'Something', + }, + asyncAlways: true, + asyncDebounceMs: 500, + }) + + // validators and listeners are ignored, only defaultValues is acknowledged + const FormGroupComponent = withFieldGroup({ + ...formOpts, + render: function Render({ group }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf() + expectTypeOf(group.state.values.lastName).toEqualTypeOf() + return + }, + }) + + const noDefaultValuesFormOpts = formOptions({ + onSubmitMeta: { foo: '' }, + }) + + const UnknownFormGroupComponent = withFieldGroup({ + ...noDefaultValuesFormOpts, + render: function Render({ group }) { + // group.state.values can be anything. + // note that T extends unknown !== unknown extends T. + expectTypeOf().toExtend() + + // either no submit meta or of the type in formOptions + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf< + [] | [{ foo: string }] + >() + return + }, + }) + }) + + it('should allow passing compatible forms to withFieldGroup', () => { + type Person = { + firstName: string + lastName: string + } + type ComponentProps = { + prop1: string + prop2: number + } + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + } + + const FormGroup = withFieldGroup({ + defaultValues, + props: {} as ComponentProps, + render: () => { + return <> + }, + }) + + const equalAppForm = useAppForm({ + defaultValues, + }) + + // ----------------- + // Assert that an equal form is not compatible as you have no name to pass + const NoSubfield = ( + + ) + + // ----------------- + // Assert that a form extending Person in a property is allowed + + const extendedAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, address: '' }, address: '' }, + }) + // While it has other properties, it satisfies defaultValues + const CorrectComponent1 = ( + + ) + + const MissingProps = ( + // @ts-expect-error because prop1 and prop2 are not added + + ) + + // ----------------- + // Assert that a form not satisfying Person errors + const incompatibleAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, lastName: 0 } }, + }) + const IncompatibleComponent = ( + + ) + }) + + it('should require strict equal submitMeta if it is set in withFieldGroup', () => { + type Person = { + firstName: string + lastName: string + } + type SubmitMeta = { + correct: string + } + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } as Person, + } + const onSubmitMeta: SubmitMeta = { + correct: 'Prop', + } + + const FormLensNoMeta = withFieldGroup({ + defaultValues: {} as Person, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit() + + // To prevent unwanted meta behaviour, handleSubmit's meta should be never if not set. + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf< + [] | [submitMeta: never] + >() + + return + }, + }) + + const FormGroupWithMeta = withFieldGroup({ + defaultValues: {} as Person, + onSubmitMeta, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit() + + // This matches the value + group.handleSubmit({ correct: '' }) + + // This does not. + // @ts-expect-error + group.handleSubmit({ wrong: 'Meta' }) + + return + }, + }) + + const noMetaForm = useAppForm({ + defaultValues, + }) + + const CorrectComponent1 = ( + + ) + + const WrongComponent1 = ( + + ) + + const metaForm = useAppForm({ + defaultValues, + onSubmitMeta, + }) + + const CorrectComponent2 = + const CorrectComponent3 = ( + + ) + + const diffMetaForm = useAppForm({ + defaultValues, + onSubmitMeta: { ...onSubmitMeta, something: 'else' }, + }) + + const CorrectComponent4 = ( + + ) + const WrongComponent2 = ( + + ) + }) + + it('should accept any validators for withFieldGroup', () => { + type Person = { + firstName: string + lastName: string + } + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } satisfies Person, + } + + const formA = useAppForm({ + defaultValues, + validators: { + onChange: () => 'A', + }, + listeners: { + onChange: () => 'A', + }, + }) + const formB = useAppForm({ + defaultValues, + validators: { + onChange: () => 'B', + }, + listeners: { + onChange: () => 'B', + }, + }) + + const FormGroup = withFieldGroup({ + defaultValues: defaultValues.person, + render: function Render({ group }) { + return + }, + }) + + const CorrectComponent1 = + const CorrectComponent2 = + }) + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string + } + type Wrapper = { + field: Nested + } + type FormValues = { + form: Wrapper + unrelated: { something: { lastName: string } } + } + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + } + + const form = useAppForm({ + defaultValues, + }) + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <> + }, + }) + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ +
+ ) + }, + }) + + const Component = + }) + + it('should not allow withFieldGroups with different metas to be nested', () => { + type Nested = { + firstName: string + } + type Wrapper = { + field: Nested + } + type FormValues = { + form: Wrapper + unrelated: { something: { lastName: string } } + } + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + } + + const LensNestedNoMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <> + }, + }) + const LensNestedWithMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + onSubmitMeta: { meta: '' }, + render: function Render() { + return <> + }, + }) + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ + +
+ ) + }, + }) + + it('should allow mapping withFieldGroup to different fields', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + } + const defaultFields = { + first: '', + last: '', + } + + const form = useAppForm({ + defaultValues, + }) + + const FieldGroup = withFieldGroup({ + defaultValues: defaultFields, + render: function Render() { + return <> + }, + }) + + const Component1 = ( + + ) + + const Component2 = ( + + ) + }) + + it('should not allow fields mapping if the top level is an array', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + relativesRecord: { + something: { firstName: '', lastName: '', age: 0 }, + } as Record, + } + const defaultFields = { + firstName: '', + lastName: '', + } + + const form = useAppForm({ + defaultValues, + }) + + const FieldGroupRecord = withFieldGroup({ + defaultValues: { anything: defaultFields } as Record< + string, + typeof defaultFields + >, + render: function Render() { + return <> + }, + }) + const FieldGroupArray = withFieldGroup({ + defaultValues: [defaultFields], + render: function Render() { + return <> + }, + }) + + const CorrectComponent1 = ( + + ) + const WrongComponent1 = ( + + ) + const CorrectComponent3 = ( + + ) + const WrongComponent2 = ( + + ) + }) + }) + + it('should allow mapping field groups to optional fields', () => { + const groupFields = { + name: '', + } + + type WrapperValues = { + namespace: { name: string } | undefined + namespace2: { name: string } | null + namespace3: { name: string } | null | undefined + nope: null | undefined + nope2: { lastName: string } | null | undefined + } + + const defaultValues: WrapperValues = { + namespace: undefined, + namespace2: null, + namespace3: null, + nope: null, + nope2: null, + } + + const FieldGroup = withFieldGroup({ + defaultValues: groupFields, + render: function Render() { + return <> + }, + }) + + const form = useAppForm({ + defaultValues, + }) + + const Component = + const Component2 = + const Component3 = + // @ts-expect-error because it doesn't ever evaluate to the expected values + const Component4 = + // @ts-expect-error because the types don't match properly + const Component5 = + }) + + it('should allow interfaces without index signatures to be assigned to `props` in withForm and withFormGroup', () => { + interface TestNoSignature { + title: string + } + + interface TestWithSignature { + title: string + [key: string]: unknown + } + + const WithFormComponent1 = withForm({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }) + + const WithFormComponent2 = withForm({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }) + + const WithFieldGroupComponent1 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }) + + const WithFieldGroupComponent2 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }) + + const appForm = useAppForm({ defaultValues: { name: '' } }) + + const Component1 = + const Component2 = ( + + ) + + const FieldGroupComponent1 = ( + + ) + const FieldGroupComponent2 = ( + + ) + }) + + it('should not allow null as prop in withForm and withFormGroup', () => { + const WithFormComponent = withForm({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }) + }) + + const WithFieldGroupComponent = withFieldGroup({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }) + + describe('extendForm', () => { + function ExtendedField() { + return null + } + function ExtendedFormComp() { + return null + } + + const baseHook = createFormHook({ + fieldComponents: { Test }, + formComponents: { Test }, + fieldContext, + formContext, + }) + + const { + withForm: withExtendedForm, + withFieldGroup: withExtendedFieldGroup, + extendForm, + } = baseHook.extendForm({ + fieldComponents: { ExtendedField }, + formComponents: { ExtendedFormComp }, + }) + + it('should expose extendForm on the returned hook', () => { + expectTypeOf(extendForm).toBeFunction() + }) + + it('should include parent field components in the extended AppField render prop', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.AppField).toBeFunction() + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction() + expectTypeOf(field.ExtendedField).toBeFunction() + return null + }} + + ) + }, + }) + }) + + it('should include parent form components on the extended form', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.Test).toBeFunction() + expectTypeOf(form.ExtendedFormComp).toBeFunction() + return null + }, + }) + }) + + it('should include parent and extended components in withFieldGroup', () => { + withExtendedFieldGroup({ + defaultValues: { name: '' }, + render: ({ group }) => { + expectTypeOf(group.Test).toBeFunction() + expectTypeOf(group.ExtendedFormComp).toBeFunction() + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction() + expectTypeOf(field.ExtendedField).toBeFunction() + return null + }} + + ) + }, + }) + }) + + it('should error when a duplicate field component name is used in extendForm', () => { + baseHook.extendForm({ + fieldComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedField, + }, + }) + }) + + it('should error when a duplicate form component name is used in extendForm', () => { + baseHook.extendForm({ + formComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedFormComp, + }, + }) + }) + + it('should allow further extension of an already extended hook', () => { + function ThirdField() { + return null + } + + const { useAppForm: useDoublyExtended } = baseHook + .extendForm({ fieldComponents: { ExtendedField } }) + .extendForm({ fieldComponents: { ThirdField } }) + + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction() + expectTypeOf(field.ExtendedField).toBeFunction() + return null + }} + + ) + }, + }) + + const doublyExtendedForm = useDoublyExtended({ + defaultValues: { name: '' }, + }) + expectTypeOf(doublyExtendedForm.AppField).toBeFunction() + }) + + it('should preserve its recursive type beyond the previous declaration cutoff', () => { + const deeplyExtended = baseHook + .extendForm({ fieldComponents: { Field01: Test } }) + .extendForm({ fieldComponents: { Field02: Test } }) + .extendForm({ fieldComponents: { Field03: Test } }) + .extendForm({ fieldComponents: { Field04: Test } }) + .extendForm({ fieldComponents: { Field05: Test } }) + .extendForm({ fieldComponents: { Field06: Test } }) + .extendForm({ fieldComponents: { Field07: Test } }) + .extendForm({ fieldComponents: { Field08: Test } }) + .extendForm({ fieldComponents: { Field09: Test } }) + .extendForm({ fieldComponents: { Field10: Test } }) + .extendForm({ fieldComponents: { Field11: Test } }) + .extendForm({ fieldComponents: { Field12: Test } }) + + expectTypeOf(deeplyExtended).not.toBeAny() + expectTypeOf(deeplyExtended.extendForm).toBeFunction() + }) + }) +}) diff --git a/packages/octane-form/tests/createFormHook.test.tsrx b/packages/octane-form/tests/createFormHook.test.tsrx index 3d983e33f..955a75398 100644 --- a/packages/octane-form/tests/createFormHook.test.tsrx +++ b/packages/octane-form/tests/createFormHook.test.tsrx @@ -1,960 +1,937 @@ -import { describe, expect, it } from 'vitest'; -import { render, waitFor } from '@octanejs/testing-library'; -import { formOptions } from '@tanstack/form-core'; -import userEvent from '@testing-library/user-event'; -import { createFormHook, createFormHookContexts, useSelector } from '../src'; +import { describe, expect, it } from 'vitest' +import { render, waitFor } from '@octanejs/testing-library' +import { formOptions } from '@tanstack/form-core' +import userEvent from '@testing-library/user-event' +import { createFormHook, createFormHookContexts, useSelector } from '../src' -const user = userEvent.setup(); +const user = userEvent.setup() -const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); +const { fieldContext, useFieldContext, formContext, useFormContext } = + createFormHookContexts() function TextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); + const field = useFieldContext() + return } function SubscribeButton({ label }: { label: string }) { - const form = useFormContext(); - return ( - state.isSubmitting}> - {(isSubmitting) => } - - ); + const form = useFormContext() + return state.isSubmitting}> + {(isSubmitting) => } + } -const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = createFormHook({ - fieldComponents: { - TextField, - }, - formComponents: { - SubscribeButton, - }, - fieldContext, - formContext, -}); +const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = + createFormHook({ + fieldComponents: { + TextField, + }, + formComponents: { + SubscribeButton, + }, + fieldContext, + formContext, + }) describe('createFormHook', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - } - /> - - ); - } - - const { getByLabelText } = render(); - const input = getByLabelText('Testing'); - expect(input).toHaveValue('FirstName'); - }); - - it('should handle withForm types properly', () => { - const formOpts = formOptions({ - defaultValues: { - firstName: 'John', - lastName: 'Doe', - }, - }); - - const ChildForm = withForm({ - ...formOpts, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ form, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('First Name'); - expect(input).toHaveValue('John'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should handle withFieldGroup types properly', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ group, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('First Name'); - expect(input).toHaveValue('John'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should use the correct field name in Field with withFieldGroup', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - people: [ - { - firstName: 'Jane', - lastName: 'Doe', - }, - { - firstName: 'Robert', - lastName: 'Doe', - }, - ], - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- } - /> - - - -
- ); - }, - }); - const ChildFormAsArray = withFieldGroup({ - defaultValues: [formOpts.defaultValues.person], - props: { - title: '', - }, - render: ({ group, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ( - <> - - - - - ); - }; - - const { getByLabelText, getByText } = render(); - const inputField1 = getByLabelText('person.firstName'); - const inputArray = getByLabelText('people[0].firstName'); - const inputField2 = getByLabelText('people[1].firstName'); - expect(inputField1).toHaveValue('John'); - expect(inputArray).toHaveValue('Jane'); - expect(inputField2).toHaveValue('Robert'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should forward Field and Subscribe to the form', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- ( - - )} - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('person.firstName'); - expect(input).toHaveValue('John'); - expect(getByText('Doe')).toBeInTheDocument(); - }); - - it('should not lose focus on update with withFieldGroup', async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: function Render({ group }) { - const firstName = useSelector(group.store, (state) => state.values.firstName); - return ( -
-

{firstName}

- ( - - )} - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByLabelText } = render(); - - const input = getByLabelText('person.firstName'); - input.focus(); - expect(input).toHaveFocus(); - - await user.clear(input); - await user.type(input, 'Something'); - - expect(input).toHaveFocus(); - }); - - it('should allow nesting withFieldGroup in other withFieldGroups', () => { - type Nested = { - firstName: string; - }; - type Wrapper = { - field: Nested; - }; - type FormValues = { - form: Wrapper; - unrelated: { something: { lastName: string } }; - }; - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - }; - - const LensNested = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render({ group }) { - return {(field) =>

{field.name}

}
; - }, - }); - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - defaultValues, - }); - return ; - }; - - const { getByText } = render(); - - expect(getByText('form.field.firstName')).toBeInTheDocument(); - }); - - it('should allow mapping withFieldGroup to different values', () => { - const formOpts = formOptions({ - defaultValues: { - unrelated: 'John', - values: '', - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: { firstName: '', lastName: '' }, - render: ({ group }) => { - return ( -
- } - /> -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ( - - ); - }; - - const { getByLabelText } = render(); - const inputField1 = getByLabelText('unrelated'); - expect(inputField1).toHaveValue('John'); - }); - - it('should remap FieldGroupApi.Field validators to the correct names', () => { - const FieldGroupString = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return ( - null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual([ - 'account.password', - ]); - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'account.confirmPassword', - ]); - return <>; - }} - - ); - }, - }); - - const FieldGroupObject = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return ( - null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual(['userPassword']); - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'userConfirmPassword', - ]); - return <>; - }} - - ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - defaultValues: { - account: { - password: '', - confirmPassword: '', - }, - userPassword: '', - userConfirmPassword: '', - }, - }); - - return ( - <> - - - - ); - }; - - render(); - }); - - it('should accept formId and return it', async () => { - function Submit() { - const form = useFormContext(); - - return ( - - ); - } - - function Comp() { - const form = useAppForm({ - formId: 'test', - }); - - return ( - -
{ - e.preventDefault(); - form.handleSubmit(); - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => ( - {submissionAttempts} - )} - /> - - -
- ); - } - - const { getByTestId } = render(); - const target = getByTestId('formId-target'); - const result = getByTestId('formId-result'); - - expect(target).toHaveAttribute('form', 'test'); - expect(target).toHaveTextContent('test'); - await user.click(target); - expect(result).toHaveTextContent('1'); - }); - - it('should allow using typed app form', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ( - } /> - ); - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - - - - ); - } - - const { getByLabelText } = render(); - const input = getByLabelText('Testing'); - expect(input).toHaveValue('FirstName'); - }); - - it('should throw if `useTypedAppFormContext` is used without AppForm', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ( - } /> - ); - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ; - } - - expect(() => render()).toThrow(); - }); - - it('should allow using typed app form with form components', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ; - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - - - - ); - } - - const { getByText } = render(); - const button = getByText('Testing'); - expect(button).toBeInTheDocument(); - }); - - describe('extendForm', () => { - it('should include both parent and extended field components', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John', lastName: 'Doe' }, - }); - - return ( - <> - } - /> - } - /> - - ); - } - - const { getByLabelText, getByTestId } = render(); - expect(getByLabelText('First Name')).toHaveValue('John'); - expect(getByTestId('extended-input')).toHaveValue('Doe'); - }); - - it('should include both parent and extended form components', () => { - function ExtendedSubmit({ label }: { label: string }) { - const form = useFormContext(); - return ( - state.isSubmitting}> - {(isSubmitting) => ( - - )} - - ); - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - formComponents: { ExtendedSubmit }, - }); - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John' }, - }); - - return ( - - - - - ); - } - - const { getByText, getByTestId } = render(); - expect(getByText('Submit')).toBeInTheDocument(); - expect(getByTestId('extended-submit')).toHaveTextContent('Extended Submit'); - }); - - it('should support chaining multiple extendForm calls', () => { - function FieldA({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - function FieldB({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: {}, - fieldContext, - formContext, - }); - - const { useAppForm: useChainedForm } = base - .extendForm({ fieldComponents: { FieldA } }) - .extendForm({ fieldComponents: { FieldB } }); - - function Comp() { - const form = useChainedForm({ - defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, - }); - - return ( - <> - } /> - } /> - } /> - - ); - } - - const { getByLabelText } = render(); - expect(getByLabelText('A')).toHaveValue('valueA'); - expect(getByLabelText('B')).toHaveValue('valueB'); - expect(getByLabelText('C')).toHaveValue('valueC'); - }); - - it('should work with withForm after extendForm', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const { useAppForm: useExtendedForm, withForm: withExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - const ChildForm = withExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - render: function Render({ form }) { - return ( - <> - } - /> - } - /> - - ); - }, - }); - - function Parent() { - const form = useExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - }); - return ; - } - - const { getByLabelText } = render(); - expect(getByLabelText('First Name')).toHaveValue('Jane'); - expect(getByLabelText('Last Name')).toHaveValue('Smith'); - }); - - it('should return a new extendForm from the extended hook', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }); - - const extended = base.extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - // extendForm should itself expose extendForm - expect(typeof extended.extendForm).toBe('function'); - }); - }); - - it('should render FieldGroup Subscribe without selector (default identity)', async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'FirstName', - lastName: 'LastName', - }, - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- ( - - )} - /> - ( - {state.values.lastName} - )} - /> -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByTestId } = render(); - const input = getByTestId('lastName'); - const stateLastName = getByTestId('state-lastName'); - - expect(stateLastName).toHaveTextContent('LastName'); - - await user.clear(input); - await user.type(input, 'Updated'); - await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')); - }); -}); + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + } + /> + + } + + const { getByLabelText } = render() + const input = getByLabelText('Testing') + expect(input).toHaveValue('FirstName') + }) + + it('should handle withForm types properly', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'John', + lastName: 'Doe', + }, + }) + + const ChildForm = withForm({ + ...formOpts, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ form, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('First Name') + expect(input).toHaveValue('John') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should handle withFieldGroup types properly', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ group, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('First Name') + expect(input).toHaveValue('John') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should use the correct field name in Field with withFieldGroup', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + people: [ + { + firstName: 'Jane', + lastName: 'Doe', + }, + { + firstName: 'Robert', + lastName: 'Doe', + }, + ], + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + + + +
+ }, + }) + const ChildFormAsArray = withFieldGroup({ + defaultValues: [formOpts.defaultValues.person], + props: { + title: '', + }, + render: ({ group, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return <> + + + + + } + + const { getByLabelText, getByText } = render() + const inputField1 = getByLabelText('person.firstName') + const inputArray = getByLabelText('people[0].firstName') + const inputField2 = getByLabelText('people[1].firstName') + expect(inputField1).toHaveValue('John') + expect(inputArray).toHaveValue('Jane') + expect(inputField2).toHaveValue('Robert') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should forward Field and Subscribe to the form', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('person.firstName') + expect(input).toHaveValue('John') + expect(getByText('Doe')).toBeInTheDocument() + }) + + it('should not lose focus on update with withFieldGroup', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: function Render({ group }) { + const firstName = useSelector( + group.store, + (state) => state.values.firstName, + ) + return
+

{firstName}

+ } + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByLabelText } = render() + + const input = getByLabelText('person.firstName') + input.focus() + expect(input).toHaveFocus() + + await user.clear(input) + await user.type(input, 'Something') + + expect(input).toHaveFocus() + }) + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + } + type Wrapper = { + field: Nested; + } + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + } + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + } + + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render({ group }) { + return + {(field) =>

{field.name}

} +
+ }, + }) + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return
+ +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + defaultValues, + }) + return + } + + const { getByText } = render() + + expect(getByText('form.field.firstName')).toBeInTheDocument() + }) + + it('should allow mapping withFieldGroup to different values', () => { + const formOpts = formOptions({ + defaultValues: { + unrelated: 'John', + values: '', + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: { firstName: '', lastName: '' }, + render: ({ group }) => { + return
+ } + /> +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText } = render() + const inputField1 = getByLabelText('unrelated') + expect(inputField1).toHaveValue('John') + }) + + it('should remap FieldGroupApi.Field validators to the correct names', () => { + const FieldGroupString = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'account.password', + ]) + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'account.confirmPassword', + ]) + return <> + }} + + }, + }) + + const FieldGroupObject = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'userPassword', + ]) + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'userConfirmPassword', + ]) + return <> + }} + + }, + }) + + const Parent = () => { + const form = useAppForm({ + defaultValues: { + account: { + password: '', + confirmPassword: '', + }, + userPassword: '', + userConfirmPassword: '', + }, + }) + + return <> + + + + } + + render() + }) + + it('should accept formId and return it', async () => { + function Submit() { + const form = useFormContext() + + return + } + + function Comp() { + const form = useAppForm({ + formId: 'test', + }) + + return +
{ + e.preventDefault() + form.handleSubmit() + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => + {submissionAttempts}} + /> + + +
+ } + + const { getByTestId } = render() + const target = getByTestId('formId-target') + const result = getByTestId('formId-result') + + expect(target).toHaveAttribute('form', 'test') + expect(target).toHaveTextContent('test') + await user.click(target) + expect(result).toHaveTextContent('1') + }) + + it('should allow using typed app form', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return } + /> + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + + + } + + const { getByLabelText } = render() + const input = getByLabelText('Testing') + expect(input).toHaveValue('FirstName') + }) + + it('should throw if `useTypedAppFormContext` is used without AppForm', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return } + /> + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + } + + expect(() => render()).toThrow() + }) + + it('should allow using typed app form with form components', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + + + } + + const { getByText } = render() + const button = getByText('Testing') + expect(button).toBeInTheDocument() + }) + + describe('extendForm', () => { + it('should include both parent and extended field components', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }) + + return <> + } + /> + } + /> + + } + + const { getByLabelText, getByTestId } = render() + expect(getByLabelText('First Name')).toHaveValue('John') + expect(getByTestId('extended-input')).toHaveValue('Doe') + }) + + it('should include both parent and extended form components', () => { + function ExtendedSubmit({ label }: { label: string }) { + const form = useFormContext() + return state.isSubmitting}> + {(isSubmitting) => + } + + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + formComponents: { ExtendedSubmit }, + }) + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John' }, + }) + + return + + + + } + + const { getByText, getByTestId } = render() + expect(getByText('Submit')).toBeInTheDocument() + expect(getByTestId('extended-submit')).toHaveTextContent( + 'Extended Submit', + ) + }) + + it('should support chaining multiple extendForm calls', () => { + function FieldA({ label }: { label: string }) { + const field = useFieldContext() + return + } + + function FieldB({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: {}, + fieldContext, + formContext, + }) + + const { useAppForm: useChainedForm } = base.extendForm({ + fieldComponents: { FieldA }, + }).extendForm({ fieldComponents: { FieldB } }) + + function Comp() { + const form = useChainedForm({ + defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, + }) + + return <> + } + /> + } + /> + } + /> + + } + + const { getByLabelText } = render() + expect(getByLabelText('A')).toHaveValue('valueA') + expect(getByLabelText('B')).toHaveValue('valueB') + expect(getByLabelText('C')).toHaveValue('valueC') + }) + + it('should work with withForm after extendForm', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const { useAppForm: useExtendedForm, withForm: withExtendedForm } = + createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + const ChildForm = withExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + render: function Render({ form }) { + return <> + } + /> + + } + /> + + }, + }) + + function Parent() { + const form = useExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + }) + return + } + + const { getByLabelText } = render() + expect(getByLabelText('First Name')).toHaveValue('Jane') + expect(getByLabelText('Last Name')).toHaveValue('Smith') + }) + + it('should return a new extendForm from the extended hook', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }) + + const extended = base.extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + // extendForm should itself expose extendForm + expect(typeof extended.extendForm).toBe('function') + }) + }) + + it( + 'should render FieldGroup Subscribe without selector (default identity)', + async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + + {state.values.lastName}} + /> +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByTestId } = render() + const input = getByTestId('lastName') + const stateLastName = getByTestId('state-lastName') + + expect(stateLastName).toHaveTextContent('LastName') + + await user.clear(input) + await user.type(input, 'Updated') + await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')) + }, + ) +}) diff --git a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx index 61ae0a559..2edb624f8 100644 --- a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx +++ b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx @@ -1,138 +1,137 @@ -import { describe, expect, it, vi } from 'vitest'; -import { act, fireEvent, render } from '@octanejs/testing-library'; -import { useSelector } from '@tanstack/octane-store'; -import { useForm } from '../src'; -import { sleep } from './utils'; -import type { ReadonlyStore } from '@tanstack/octane-store'; +import { describe, expect, it, vi } from 'vitest' +import { act, fireEvent, render } from '@octanejs/testing-library' +import { useSelector } from '@tanstack/octane-store' +import { useForm } from '../src' +import { sleep } from './utils' +import type { ReadonlyStore } from '@tanstack/octane-store' function DebugSubscribe({ store }: { store: ReadonlyStore }) { - const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating); - return {String(isFieldsValidating)}; + const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating) + return {String( + isFieldsValidating, + )} } describe('Octane adapter - onChangeListenTo race', () => { - it('does not leave linked fields stuck in isValidating when multiple rapid updates occur', async () => { - vi.useFakeTimers(); - - const validationFn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - street: '', - houseNo: '', - zipCode: '', - city: '', - }, - }); - - return ( - <> - { - await sleep(500); - validationFn(); - return undefined; - }, - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> - {String(field.state.meta.isValidating)} -
- )} - /> - - ( -
- field.handleChange(e.target.value)} - /> - - {String(field.state.meta.isValidating)} - -
- )} - /> - - ( -
- field.handleChange(e.target.value)} - /> - - {String(field.state.meta.isValidating)} - -
- )} - /> - - ( -
- field.handleChange(e.target.value)} - /> - {String(field.state.meta.isValidating)} -
- )} - /> - - - - ); - } - - const { getByTestId } = render(); - - const street = getByTestId('street') as HTMLInputElement; - const houseNo = getByTestId('houseNo') as HTMLInputElement; - const zipCode = getByTestId('zipCode') as HTMLInputElement; - const city = getByTestId('city') as HTMLInputElement; - - await act(async () => { - // Simulate rapid updates (autofill), then run debounce + async validation. - fireEvent.input(street, { target: { value: 'Foo Street' } }); - fireEvent.input(houseNo, { target: { value: '2' } }); - fireEvent.input(zipCode, { target: { value: '12345' } }); - fireEvent.input(city, { target: { value: 'Barrington' } }); - await vi.runAllTimersAsync(); - }); - - expect(validationFn).toHaveBeenCalledTimes(1); - - // Verify validation flags are not stuck - const isFieldsValidating = getByTestId('isFieldsValidating').textContent; - const streetValidating = getByTestId('street-validating').textContent; - const houseValidating = getByTestId('houseNo-validating').textContent; - const zipValidating = getByTestId('zipCode-validating').textContent; - const cityValidating = getByTestId('city-validating').textContent; - - expect(isFieldsValidating).toBe('false'); - expect(streetValidating).toBe('false'); - expect(houseValidating).toBe('false'); - expect(zipValidating).toBe('false'); - expect(cityValidating).toBe('false'); - - vi.useRealTimers(); - }); -}); + it( + 'does not leave linked fields stuck in isValidating when multiple rapid updates occur', + async () => { + vi.useFakeTimers() + + const validationFn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + street: '', + houseNo: '', + zipCode: '', + city: '', + }, + }) + + return <> + { + await sleep(500) + validationFn() + return undefined + }, + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.target.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.target.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.target.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + + + + } + + const { getByTestId } = render() + + const street = getByTestId('street') as HTMLInputElement + const houseNo = getByTestId('houseNo') as HTMLInputElement + const zipCode = getByTestId('zipCode') as HTMLInputElement + const city = getByTestId('city') as HTMLInputElement + + await act(async () => { + // Simulate rapid updates (autofill), then run debounce + async validation. + fireEvent.input(street, { target: { value: 'Foo Street' } }) + fireEvent.input(houseNo, { target: { value: '2' } }) + fireEvent.input(zipCode, { target: { value: '12345' } }) + fireEvent.input(city, { target: { value: 'Barrington' } }) + await vi.runAllTimersAsync() + }) + + expect(validationFn).toHaveBeenCalledTimes(1) + + // Verify validation flags are not stuck + const isFieldsValidating = getByTestId('isFieldsValidating').textContent + const streetValidating = getByTestId('street-validating').textContent + const houseValidating = getByTestId('houseNo-validating').textContent + const zipValidating = getByTestId('zipCode-validating').textContent + const cityValidating = getByTestId('city-validating').textContent + + expect(isFieldsValidating).toBe('false') + expect(streetValidating).toBe('false') + expect(houseValidating).toBe('false') + expect(zipValidating).toBe('false') + expect(cityValidating).toBe('false') + + vi.useRealTimers() + }, + ) +}) diff --git a/packages/octane-form/tests/server.test.tsrx b/packages/octane-form/tests/server.test.tsrx index be8a1dbec..8c0817199 100644 --- a/packages/octane-form/tests/server.test.tsrx +++ b/packages/octane-form/tests/server.test.tsrx @@ -1,34 +1,34 @@ -import { describe, expect, it } from 'vitest'; -import { renderToStaticMarkup } from 'octane/server'; +import { describe, expect, it } from 'vitest' +import { renderToStaticMarkup } from 'octane/server' -import { useForm } from '../src'; +import { useForm } from '../src' function ServerForm() @{ - const form = useForm({ - defaultValues: { - name: 'Server Ada', - }, - }); + const form = useForm({ + defaultValues: { + name: 'Server Ada', + }, + }) -
- - {(field) => } - - state.values.name}> - {(name) => {name}} - -
+
+ + {(field) => } + + state.values.name}> + {(name) => {name}} + +
} describe('@tanstack/octane-form SSR', () => { - it('renders field and form snapshots without a DOM', () => { - expect(typeof document).toBe('undefined'); + it('renders field and form snapshots without a DOM', () => { + expect(typeof document).toBe('undefined') - const { html, css } = renderToStaticMarkup(ServerForm); + const { html, css } = renderToStaticMarkup(ServerForm) - expect(html).toBe( - '
Server Ada
', - ); - expect(css).toBe(''); - }); -}); + expect(html).toBe( + '
Server Ada
', + ) + expect(css).toBe('') + }) +}) diff --git a/packages/octane-form/tests/useField.test-d.tsx b/packages/octane-form/tests/useField.test-d.tsx index 0d06d8386..100f990e9 100644 --- a/packages/octane-form/tests/useField.test-d.tsx +++ b/packages/octane-form/tests/useField.test-d.tsx @@ -1,110 +1,112 @@ /** @jsxImportSource octane */ -import { expectTypeOf, it } from 'vitest'; -import { useForm } from '../src/index'; +import { expectTypeOf, it } from 'vitest' +import { useForm } from '../src/index' it('should type state.value properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const); + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const) - return ( - <> - { - expectTypeOf(field.state.value).toEqualTypeOf<'test'>(); - return null; - }} - /> - { - expectTypeOf(field.state.value).toEqualTypeOf<84>(); - return null; - }} - /> - - ); - } -}); + return ( + <> + { + expectTypeOf(field.state.value).toEqualTypeOf<'test'>() + return null + }} + /> + { + expectTypeOf(field.state.value).toEqualTypeOf<84>() + return null + }} + /> + + ) + } +}) it('should type onChange properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const); + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const) - return ( - <> - { - expectTypeOf(value).toEqualTypeOf<'test'>(); - return null; - }, - }} - children={() => null} - /> - { - expectTypeOf(value).toEqualTypeOf<84>(); - return null; - }, - }} - children={() => null} - /> - - ); - } -}); + return ( + <> + { + expectTypeOf(value).toEqualTypeOf<'test'>() + return null + }, + }} + children={() => null} + /> + { + expectTypeOf(value).toEqualTypeOf<84>() + return null + }, + }} + children={() => null} + /> + + ) + } +}) it('should type array subfields', () => { - type FormDefinition = { - nested: { - people: { - name: string; - age: number; - }[]; - }; - }; + type FormDefinition = { + nested: { + people: { + name: string + age: number + }[] + } + } - function App() { - const form = useForm({ - defaultValues: { - nested: { - people: [], - }, - } as FormDefinition, - onSubmit({ value }) { - alert(JSON.stringify(value)); - }, - }); + function App() { + const form = useForm({ + defaultValues: { + nested: { + people: [], + }, + } as FormDefinition, + onSubmit({ value }) { + alert(JSON.stringify(value)) + }, + }) - return ( - - {(field) => - field.state.value.map((_, i) => ( - - {(subField) => ( - subField.handleChange(event.currentTarget.value)} - /> - )} - - )) - } - - ); - } -}); + return ( + + {(field) => + field.state.value.map((_, i) => ( + + {(subField) => ( + + subField.handleChange(event.currentTarget.value) + } + /> + )} + + )) + } + + ) + } +}) diff --git a/packages/octane-form/tests/useField.test.tsrx b/packages/octane-form/tests/useField.test.tsrx index 314a0d0b5..9e06bab67 100644 --- a/packages/octane-form/tests/useField.test.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -1,1527 +1,1454 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, waitFor, within } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useState } from 'octane'; -import { useForm, useSelector } from '../src'; -import { sleep } from './utils'; +import { describe, expect, it, vi } from 'vitest' +import { render, waitFor, within } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { useState } from 'octane' +import { useForm, useSelector } from '../src' +import { sleep } from './utils' -const user = userEvent.setup(); +const user = userEvent.setup() describe('useField', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.target.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - expect(input).toHaveValue('FirstName'); - }); - - it('should use field default value first', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.target.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - expect(input).toHaveValue('otherName'); - }); - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? error : undefined), - }} - children={(field) => ( -
- - field.setValue(e.target.value, { - dontUpdateMeta: true, - }) - } - /> -

{field.getMeta().errors}

-
- )} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - expect(queryByText(error)).not.toBeInTheDocument(); - }); - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? error : undefined), - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate on change and on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? onChangeError : undefined), - onBlur: ({ value }) => (value === 'other' ? onBlurError : undefined), - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - expect(queryByText(onBlurError)).toBeInTheDocument(); - }); - - it('should properly update conditionally rendered fields', async () => { - type FormValues = { - firstField: string; - secondField: string; - showFirstField: boolean; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstField: '', - secondField: '', - showFirstField: true, - } as FormValues, - }); - - return ( - <> - - {({ handleChange, state }) => ( -
- Show first field - { - handleChange(e.target.checked); - }} - /> -
- )} -
- state.values.showFirstField}> - {(someFlagChecked) => { - if (someFlagChecked) { - return ( - - {({ handleChange, state }) => ( - - )} - - ); - } - - return ( - - {({ handleChange, state }) => ( - - )} - - ); - }} - - - ); - } - - const { getByTestId } = render(); - - const showFirstFieldInput = getByTestId('show-first-field'); - - await user.type(getByTestId('first-field'), 'hello'); - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); - - await user.click(showFirstFieldInput); - await user.type(getByTestId('second-field'), 'world'); - expect((getByTestId('second-field') as HTMLInputElement).value).toBe('world'); - - await user.click(showFirstFieldInput); - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); - }); - - it('should not keep hidden field submit errors after unmount', async () => { - const onSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: ({ value }) => onSubmit(value), - }); - - return ( -
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => ( - field.handleChange(e.target.value)} - /> - )} - - - state.values.firstName === 'a'}> - {(showLastName) => - showLastName ? ( - (value.length >= 5 ? undefined : 'lastName too short'), - }} - > - {(field) => ( - field.handleChange(e.target.value)} - /> - )} - - ) : null - } - - - [state.canSubmit, state.isSubmitting]}> - {([canSubmit, isSubmitting]) => ( - - )} - -
- ); - } - - const { getByTestId, queryByTestId } = render(); - - const submitButton = getByTestId('submit'); - - await user.type(getByTestId('first-name'), 'a'); - await user.type(getByTestId('last-name'), 'abc'); - await user.click(submitButton); - - await waitFor(() => expect(submitButton).toBeDisabled()); - expect(onSubmit).toHaveBeenCalledTimes(0); - - await user.clear(getByTestId('first-name')); - await user.type(getByTestId('first-name'), 'b'); - - await waitFor(() => expect(queryByTestId('last-name')).not.toBeInTheDocument()); - await waitFor(() => expect(submitButton).toBeEnabled()); - - await user.click(submitButton); - await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)); - - await user.clear(getByTestId('first-name')); - await user.type(getByTestId('first-name'), 'a'); - - const remountedLastName = await waitFor(() => getByTestId('last-name')); - expect((remountedLastName as HTMLInputElement).value).toBe('abc'); - expect(submitButton).toBeEnabled(); - }); - - it('should call onUnmount listener when a field is conditionally removed', async () => { - const fieldUnmount = vi.fn(); - const formFieldUnmount = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - show: true, - name: 'test', - }, - listeners: { - onFieldUnmount: formFieldUnmount, - }, - }); - - return ( - <> - - {(field) => ( - field.handleChange(e.target.checked)} - /> - )} - - - s.values.show}> - {(show) => - show ? ( - - {(field) => ( - field.handleChange(e.target.value)} - /> - )} - - ) : null - } - - - ); - } - - const { getByTestId, queryByTestId } = render(); - - await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()); - - const callsBefore = fieldUnmount.mock.calls.length; - const formCallsBefore = formFieldUnmount.mock.calls.length; - - await user.click(getByTestId('toggle')); - - await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()); - expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1); - expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1); - }); - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - await sleep(10); - return error; - }, - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - await sleep(10); - return onChangeError; - }, - onBlurAsync: async () => { - await sleep(10); - return onBlurError; - }, - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(onChangeError)); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - await waitFor(() => getByText(onBlurError)); - expect(getByText(onBlurError)).toBeInTheDocument(); - }); - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - mockFn(); - await sleep(10); - return error; - }, - }} - children={(field) => ( -
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errors}

-
- )} - /> - - ); - } - - const { getByTestId, getByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - expect(mockFn).toHaveBeenCalledTimes(1); - }); - - it('should handle arrays with primitive values', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array, - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => { - return ( -
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- - -
- ); - }} -
- ); - })} - -
- ); - }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => ( - - )} - /> - -
- ); - } - - const { getByText, findByLabelText, queryByText, findByText } = render(); - - expect(queryByText('Name for person 0')).not.toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - await user.click(getByText('Add person')); - const input = await findByLabelText('Name for person 0'); - expect(input).toBeInTheDocument(); - await user.type(input, 'John'); - - await user.click(getByText('Add person')); - const input2 = await findByLabelText('Name for person 1'); - expect(input).toBeInTheDocument(); - await user.type(input2, 'Jack'); - - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).toBeInTheDocument(); - await user.click(getByText('Remove person 1')); - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - - await user.click(await findByText('Submit')); - expect(fn).toHaveBeenCalledWith({ people: ['John'] }); - }); - - it('should handle arrays with subvalues', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array<{ age: number; name: string }>, - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => { - return ( -
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- - -
- ); - }} -
- ); - })} - -
- ); - }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => ( - - )} - /> - -
- ); - } - - const { getByText, findByLabelText, queryByText, findByText } = render(); - - expect(queryByText('Name for person 0')).not.toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - await user.click(getByText('Add person')); - const input = await findByLabelText('Name for person 0'); - expect(input).toBeInTheDocument(); - await user.type(input, 'John'); - - await user.click(getByText('Add person')); - const input2 = await findByLabelText('Name for person 1'); - expect(input).toBeInTheDocument(); - await user.type(input2, 'Jack'); - - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).toBeInTheDocument(); - await user.click(getByText('Remove person 1')); - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - - await user.click(await findByText('Submit')); - expect(fn).toHaveBeenCalledWith({ people: [{ name: 'John', age: 0 }] }); - }); - - it('should not surface undefined for shifted items when a non-last stably-keyed array item is removed', async () => { - // Regression test for https://github.com/TanStack/form/issues/2238 - // When array items are keyed by a stable id (not index), removing a - // non-last item changes the `name` prop of the surviving items. The field - // must read state at its current `name` on that render, never `undefined`. - const observedValues: Array = []; - - function Comp() { - const form = useForm({ - defaultValues: { - sections: [] as Array<{ id: string; title: string }>, - }, - }); - - let nextId = 0; - - return ( - - {(field) => { - return ( -
- {field.state.value.map((section, i) => { - return ( - - {(subField) => { - observedValues.push(subField.state.value); - return ( - - ); - }} - - ); - })} - - -
- ); - }} -
- ); - } - - const { getByText, findByLabelText } = render(); - - await user.click(getByText('Add section')); - await user.click(getByText('Add section')); - - await findByLabelText('Title for section id-1'); - await findByLabelText('Title for section id-2'); - - observedValues.length = 0; - await user.click(getByText('Remove first section')); - - // The surviving item (previously `sections[1]`) shifts to `sections[0]`. - // Its value must remain "Section 2" and never render as `undefined`. - const survivingInput = await findByLabelText('Title for section id-2'); - expect((survivingInput as HTMLInputElement).value).toBe('Section 2'); - expect(observedValues).not.toContain(undefined); - }); - - it('should handle sync linked fields', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - password: '', - confirm_password: '', - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
- - {(field) => { - return ( -
- -
- ); - }} -
- { - if (value !== fieldApi.form.getFieldValue('password')) { - return 'Passwords do not match'; - } - return undefined; - }, - }} - > - {(field) => { - return ( -
- - {field.state.meta.errors.map((err) => { - return
{err}
; - })} -
- ); - }} -
-
- ); - } - - const { findByLabelText, queryByText, findByText } = render(); - - const passwordInput = await findByLabelText('Password'); - const confirmPasswordInput = await findByLabelText('Confirm Password'); - await user.type(passwordInput, 'password'); - await user.type(confirmPasswordInput, 'password'); - expect(queryByText('Passwords do not match')).not.toBeInTheDocument(); - await user.type(confirmPasswordInput, '1'); - expect(await findByText('Passwords do not match')).toBeInTheDocument(); - }); - - it('should validate async on submit without debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 1000000, - onChangeAsync: async () => { - mockFn(); - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errors); - - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors}

-
- )} - /> - - - ); - } - - const { getByRole, getByText } = render(); - await user.click(getByRole('button', { name: 'Submit' })); - - expect(mockFn).toHaveBeenCalledTimes(1); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate allow pushvalue to implicitly set a default value', async () => { - type Person = { - people: Array; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }); - - return ( - - {(field) => { - return ( -
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} - -
- ); - }} -
- ); - } - - const { getByText, queryByText } = render(); - expect(getByText('[]')).toBeInTheDocument(); - await user.click(getByText('Add person')); - expect(getByText(`[""]`)).toBeInTheDocument(); - }); - - it('should validate allow pushvalue to implicitly set a pushed default value', async () => { - type Person = { - people: Array; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }); - - return ( - - {(field) => { - return ( -
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} - -
- ); - }} -
- ); - } - - const { getByText, queryByText } = render(); - expect(getByText('[]')).toBeInTheDocument(); - await user.click(getByText('Add person')); - expect(getByText(`["Test"]`)).toBeInTheDocument(); - }); - - it('should handle removing element from array', async () => { - type Person = { - name: string; - id: number; - }; - - const fakePeople = { - jack: { - id: 5, - name: 'Jack', - }, - molly: { - id: 6, - name: 'Molly', - }, - george: { - id: 7, - name: 'George', - }, - } satisfies Record; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [fakePeople.jack, fakePeople.molly, fakePeople.george], - }, - }); - - return ( - - {(field) => { - return ( -
-
- {field.state.value.map((item, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} -
- -
- ); - }} -
- ); - } - - const { getByText, queryByText, getByTestId } = render(); - - let exisingPeople: Person[] = [fakePeople.jack, fakePeople.molly, fakePeople.george]; - exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); - const container = getByTestId('container'); - expect(within(container).getAllByRole('textbox')).toHaveLength(3); - - await user.click(getByText('Remove person')); - - expect(within(container).getAllByRole('textbox')).toHaveLength(2); - exisingPeople = [fakePeople.jack, fakePeople.george]; - exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); - expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument(); - }); - - it('should not rerender unrelated fields', async () => { - const renderCount = { - field1: 0, - field2: 0, - }; - - function Comp() { - const form = useForm({ - defaultValues: { - field1: '', - field2: '', - }, - }); - - return ( - <> - - {(field) => { - renderCount.field1++; - return ( - field.handleChange(e.target.value)} - /> - ); - }} - - - {(field) => { - renderCount.field2++; - return ( - field.handleChange(e.target.value)} - /> - ); - }} - - - ); - } - - const { getByTestId } = render(); - - const field1InitialRender = renderCount.field1; - const field2InitialRender = renderCount.field2; - - await user.type(getByTestId('field1'), 'test'); - - // field1 should have rerendered - expect(renderCount.field1).toBeGreaterThan(field1InitialRender); - // field2 should not have rerendered - expect(renderCount.field2).toBe(field2InitialRender); - }); - - it('should not rerender array field when child field value changes', async () => { - // Test for https://github.com/TanStack/form/issues/1925 - // Array fields should only re-render when the array length changes, - // not when a property on an array element is mutated - const renderCount = { - arrayField: 0, - childField: 0, - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }); - - return ( - - {(arrayField) => { - renderCount.arrayField++; - return ( -
- {arrayField.state.value.map((_, i) => ( - - {(field) => { - if (i === 0) renderCount.childField++; - return ( - field.handleChange(e.target.value)} - /> - ); - }} - - ))} - -
- ); - }} -
- ); - } - - const { getByTestId } = render(); - - const arrayFieldInitialRender = renderCount.arrayField; - const childFieldInitialRender = renderCount.childField; - - // Type into the first child field - await user.type(getByTestId('person-0'), 'ny'); - - // Child field should have rerendered - expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender); - // Array field should NOT have rerendered (this was the bug in #1925) - expect(renderCount.arrayField).toBe(arrayFieldInitialRender); - - // Verify typing still works - expect(getByTestId('person-0')).toHaveValue('Johnny'); - - // Now add a new item - this SHOULD trigger array field re-render - const arrayFieldBeforeAdd = renderCount.arrayField; - await user.click(getByTestId('add-person')); - - // Array field should have rerendered when length changes - expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd); - }); - - it('should rerender array field on swapFieldValues even when length is unchanged', async () => { - // swapFieldValues does not change array length but must still notify the - // parent array field so subscribers see the new order. - const renderCount = { arrayField: 0 }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }); - - return ( - - {(arrayField) => { - renderCount.arrayField++; - return ( -
-
    - {arrayField.state.value.map((person, i) => ( -
  1. - {person.name} -
  2. - ))} -
- -
- ); - }} -
- ); - } - - const { getByTestId } = render(); - - expect(getByTestId('item-0')).toHaveTextContent('John'); - expect(getByTestId('item-1')).toHaveTextContent('Jane'); - - const before = renderCount.arrayField; - await user.click(getByTestId('swap')); - - expect(renderCount.arrayField).toBeGreaterThan(before); - expect(getByTestId('item-0')).toHaveTextContent('Jane'); - expect(getByTestId('item-1')).toHaveTextContent('John'); - }); - - it('should rerender array field when async defaultValues resolve', async () => { - // Regression test for https://github.com/TanStack/form/issues/2178 - // When async defaultValues arrive after initial render, array fields in - // mode="array" must re-render because _arrayVersion is used as the - // reactivity signal (not value length). - type Person = { name: string }; - type FormData = { people: Person[] }; - - function Comp({ defaultValues }: { defaultValues?: FormData }) { - const form = useForm({ defaultValues }); - - return ( - - {(field) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - const val = field.state.value ?? []; - return ( -
    - {val.map((person, i) => ( -
  1. - {person.name} -
  2. - ))} -
- ); - }} -
- ); - } - - const { getByTestId, rerender } = render(); - expect(getByTestId('list').children).toHaveLength(0); - - rerender(); - await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)); - expect(getByTestId('item-0')).toHaveTextContent('Alice'); - }); - - it('should handle defaultValue without setstate-in-render error', async () => { - // Spy on console.error before rendering - const consoleErrorSpy = vi.spyOn(console, 'error'); - - function Comp() { - const form = useForm({ - defaultValues: { - fieldOne: '', - fieldTwo: '', - }, - }); - - const fieldOne = useSelector(form.store, (state) => state.values.fieldOne); - - return ( -
- { - return ( - field.handleChange(e.target.value)} - /> - ); - }} - /> - {fieldOne && ( - null} - /> - )} - - ); - } - - const { getByTestId } = render(); - await user.type(getByTestId('fieldOne'), 'John'); - - // Should not log an error - expect(consoleErrorSpy).not.toHaveBeenCalled(); - }); - - it('should allow field-level defaultValue', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: undefined as string | undefined, - }, - }); - - return ( - - {(field) => { - expect(field.state.value).toEqual('a'); - return {field.state.value}; - }} - - ); - } - - const { queryByText } = render(); - - expect(queryByText('a')).toBeInTheDocument(); - expect(queryByText('never')).not.toBeInTheDocument(); - }); - - it('should handle deeply nested values', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: { first: 'Test', last: 'User' }, - }, - }); - - return

{field.state.value}

} />; - } - - const { queryByText, findByText } = render(); - - expect(queryByText('Test')).not.toBeInTheDocument(); - expect(await findByText('User')).toBeInTheDocument(); - }); -}); + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return field.handleChange(e.target.value)} + /> + }} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + expect(input).toHaveValue('FirstName') + }) + + it('should use field default value first', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return field.handleChange(e.target.value)} + /> + }} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + expect(input).toHaveValue('otherName') + }) + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' ? error : undefined), + }} + children={(field) =>
+ field.setValue(e.target.value, { + dontUpdateMeta: true, + })} + /> +

{field.getMeta().errors}

+
} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + expect(queryByText(error)).not.toBeInTheDocument() + }) + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' ? error : undefined), + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate on change and on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' + ? onChangeError + : undefined), + onBlur: ({ value }) => (value === 'other' + ? onBlurError + : undefined), + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + expect(queryByText(onBlurError)).toBeInTheDocument() + }) + + it('should properly update conditionally rendered fields', async () => { + type FormValues = { + firstField: string; + secondField: string; + showFirstField: boolean; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstField: '', + secondField: '', + showFirstField: true, + } as FormValues, + }) + + return <> + + {({ handleChange, state }) =>
+ Show first field + { + handleChange(e.target.checked) + }} + /> +
} +
+ state.values.showFirstField}> + {(someFlagChecked) => { + if (someFlagChecked) { + return + {({ handleChange, state }) => } + + } + + return + {({ handleChange, state }) => } + + }} + + + } + + const { getByTestId } = render() + + const showFirstFieldInput = getByTestId('show-first-field') + + await user.type(getByTestId('first-field'), 'hello') + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') + + await user.click(showFirstFieldInput) + await user.type(getByTestId('second-field'), 'world') + expect((getByTestId('second-field') as HTMLInputElement).value).toBe( + 'world', + ) + + await user.click(showFirstFieldInput) + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') + }) + + it('should not keep hidden field submit errors after unmount', async () => { + const onSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: ({ value }) => onSubmit(value), + }) + + return
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => + field.handleChange(e.target.value)} + />} + + + state.values.firstName === 'a'}> + {(showLastName) => showLastName + ? (value.length >= 5 + ? undefined + : 'lastName too short'), + }} + > + {(field) => + field.handleChange(e.target.value)} + />} + + : null} + + + [state.canSubmit, state.isSubmitting]} + > + {([canSubmit, isSubmitting]) => } + +
+ } + + const { getByTestId, queryByTestId } = render() + + const submitButton = getByTestId('submit') + + await user.type(getByTestId('first-name'), 'a') + await user.type(getByTestId('last-name'), 'abc') + await user.click(submitButton) + + await waitFor(() => expect(submitButton).toBeDisabled()) + expect(onSubmit).toHaveBeenCalledTimes(0) + + await user.clear(getByTestId('first-name')) + await user.type(getByTestId('first-name'), 'b') + + await waitFor( + () => expect(queryByTestId('last-name')).not.toBeInTheDocument(), + ) + await waitFor(() => expect(submitButton).toBeEnabled()) + + await user.click(submitButton) + await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)) + + await user.clear(getByTestId('first-name')) + await user.type(getByTestId('first-name'), 'a') + + const remountedLastName = await waitFor(() => getByTestId('last-name')) + expect((remountedLastName as HTMLInputElement).value).toBe('abc') + expect(submitButton).toBeEnabled() + }) + + it( + 'should call onUnmount listener when a field is conditionally removed', + async () => { + const fieldUnmount = vi.fn() + const formFieldUnmount = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + show: true, + name: 'test', + }, + listeners: { + onFieldUnmount: formFieldUnmount, + }, + }) + + return <> + + {(field) => + field.handleChange(e.target.checked)} + />} + + + s.values.show}> + {(show) => show + ? + {(field) => + field.handleChange(e.target.value)} + />} + + : null} + + + } + + const { getByTestId, queryByTestId } = render() + + await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()) + + const callsBefore = fieldUnmount.mock.calls.length + const formCallsBefore = formFieldUnmount.mock.calls.length + + await user.click(getByTestId('toggle')) + + await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()) + expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1) + expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1) + }, + ) + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + await sleep(10) + return error + }, + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + await sleep(10) + return onChangeError + }, + onBlurAsync: async () => { + await sleep(10) + return onBlurError + }, + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(onChangeError)) + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + await waitFor(() => getByText(onBlurError)) + expect(getByText(onBlurError)).toBeInTheDocument() + }) + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + mockFn() + await sleep(10) + return error + }, + }} + children={(field) =>
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errors}

+
} + /> + + } + + const { getByTestId, getByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + expect(mockFn).toHaveBeenCalledTimes(1) + }) + + it('should handle arrays with primitive values', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array, + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => { + return
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ + +
+ }} +
+ })} + +
+ }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + +
+ } + + const { getByText, findByLabelText, queryByText, findByText } = render( + , + ) + + expect(queryByText('Name for person 0')).not.toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + await user.click(getByText('Add person')) + const input = await findByLabelText('Name for person 0') + expect(input).toBeInTheDocument() + await user.type(input, 'John') + + await user.click(getByText('Add person')) + const input2 = await findByLabelText('Name for person 1') + expect(input).toBeInTheDocument() + await user.type(input2, 'Jack') + + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).toBeInTheDocument() + await user.click(getByText('Remove person 1')) + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + + await user.click(await findByText('Submit')) + expect(fn).toHaveBeenCalledWith({ people: ['John'] }) + }) + + it('should handle arrays with subvalues', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array<{ age: number; name: string }>, + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => { + return
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ + +
+ }} +
+ })} + +
+ }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + +
+ } + + const { getByText, findByLabelText, queryByText, findByText } = render( + , + ) + + expect(queryByText('Name for person 0')).not.toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + await user.click(getByText('Add person')) + const input = await findByLabelText('Name for person 0') + expect(input).toBeInTheDocument() + await user.type(input, 'John') + + await user.click(getByText('Add person')) + const input2 = await findByLabelText('Name for person 1') + expect(input).toBeInTheDocument() + await user.type(input2, 'Jack') + + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).toBeInTheDocument() + await user.click(getByText('Remove person 1')) + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + + await user.click(await findByText('Submit')) + expect(fn).toHaveBeenCalledWith({ + people: [ + { name: 'John', age: 0 }, + ], + }) + }) + + it( + 'should not surface undefined for shifted items when a non-last stably-keyed array item is removed', + async () => { + // Regression test for https://github.com/TanStack/form/issues/2238 + // When array items are keyed by a stable id (not index), removing a + // non-last item changes the `name` prop of the surviving items. The field + // must read state at its current `name` on that render, never `undefined`. + const observedValues: Array = [] + + function Comp() { + const form = useForm({ + defaultValues: { + sections: [] as Array<{ id: string; title: string }>, + }, + }) + + let nextId = 0 + + return + {(field) => { + return
+ {field.state.value.map((section, i) => { + return + {(subField) => { + observedValues.push(subField.state.value) + return + }} + + })} + + +
+ }} +
+ } + + const { getByText, findByLabelText } = render() + + await user.click(getByText('Add section')) + await user.click(getByText('Add section')) + + await findByLabelText('Title for section id-1') + await findByLabelText('Title for section id-2') + + observedValues.length = 0 + await user.click(getByText('Remove first section')) + + // The surviving item (previously `sections[1]`) shifts to `sections[0]`. + // Its value must remain "Section 2" and never render as `undefined`. + const survivingInput = await findByLabelText('Title for section id-2') + expect((survivingInput as HTMLInputElement).value).toBe('Section 2') + expect(observedValues).not.toContain(undefined) + }, + ) + + it('should handle sync linked fields', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + password: '', + confirm_password: '', + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+ + {(field) => { + return
+ +
+ }} +
+ { + if (value !== fieldApi.form.getFieldValue('password')) { + return 'Passwords do not match' + } + return undefined + }, + }} + > + {(field) => { + return
+ + {field.state.meta.errors.map((err) => { + return
{err}
+ })} +
+ }} +
+
+ } + + const { findByLabelText, queryByText, findByText } = render() + + const passwordInput = await findByLabelText('Password') + const confirmPasswordInput = await findByLabelText('Confirm Password') + await user.type(passwordInput, 'password') + await user.type(confirmPasswordInput, 'password') + expect(queryByText('Passwords do not match')).not.toBeInTheDocument() + await user.type(confirmPasswordInput, '1') + expect(await findByText('Passwords do not match')).toBeInTheDocument() + }) + + it('should validate async on submit without debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 1000000, + onChangeAsync: async () => { + mockFn() + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errors) + + return <> +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
} + /> + + + } + + const { getByRole, getByText } = render() + await user.click(getByRole('button', { name: 'Submit' })) + + expect(mockFn).toHaveBeenCalledTimes(1) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it( + 'should validate allow pushvalue to implicitly set a default value', + async () => { + type Person = { + people: Array; + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }) + + return + {(field) => { + return
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })} + +
+ }} +
+ } + + const { getByText, queryByText } = render() + expect(getByText('[]')).toBeInTheDocument() + await user.click(getByText('Add person')) + expect(getByText(`[""]`)).toBeInTheDocument() + }, + ) + + it( + 'should validate allow pushvalue to implicitly set a pushed default value', + async () => { + type Person = { + people: Array; + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }) + + return + {(field) => { + return
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })} + +
+ }} +
+ } + + const { getByText, queryByText } = render() + expect(getByText('[]')).toBeInTheDocument() + await user.click(getByText('Add person')) + expect(getByText(`["Test"]`)).toBeInTheDocument() + }, + ) + + it('should handle removing element from array', async () => { + type Person = { + name: string; + id: number; + } + + const fakePeople = { + jack: { + id: 5, + name: 'Jack', + }, + molly: { + id: 6, + name: 'Molly', + }, + george: { + id: 7, + name: 'George', + }, + } satisfies Record + + function Comp() { + const form = useForm({ + defaultValues: { + people: [fakePeople.jack, fakePeople.molly, fakePeople.george], + }, + }) + + return + {(field) => { + return
+
{field.state.value.map((item, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })}
+ +
+ }} +
+ } + + const { getByText, queryByText, getByTestId } = render() + + let exisingPeople: Person[] = [ + fakePeople.jack, + fakePeople.molly, + fakePeople.george, + ] + exisingPeople.forEach( + (person) => expect(getByText(person.name)).toBeInTheDocument(), + ) + const container = getByTestId('container') + expect(within(container).getAllByRole('textbox')).toHaveLength(3) + + await user.click(getByText('Remove person')) + + expect(within(container).getAllByRole('textbox')).toHaveLength(2) + exisingPeople = [fakePeople.jack, fakePeople.george] + exisingPeople.forEach( + (person) => expect(getByText(person.name)).toBeInTheDocument(), + ) + expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument() + }) + + it('should not rerender unrelated fields', async () => { + const renderCount = { + field1: 0, + field2: 0, + } + + function Comp() { + const form = useForm({ + defaultValues: { + field1: '', + field2: '', + }, + }) + + return <> + + {(field) => { + renderCount.field1++ + return field.handleChange(e.target.value)} + /> + }} + + + {(field) => { + renderCount.field2++ + return field.handleChange(e.target.value)} + /> + }} + + + } + + const { getByTestId } = render() + + const field1InitialRender = renderCount.field1 + const field2InitialRender = renderCount.field2 + + await user.type(getByTestId('field1'), 'test') + + // field1 should have rerendered + expect(renderCount.field1).toBeGreaterThan(field1InitialRender) + // field2 should not have rerendered + expect(renderCount.field2).toBe(field2InitialRender) + }) + + it( + 'should not rerender array field when child field value changes', + async () => { + // Test for https://github.com/TanStack/form/issues/1925 + // Array fields should only re-render when the array length changes, + // not when a property on an array element is mutated + const renderCount = { + arrayField: 0, + childField: 0, + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }) + + return + {(arrayField) => { + renderCount.arrayField++ + return
+ {arrayField.state.value.map( + (_, i) => + {(field) => { + if (i === 0) renderCount.childField++ + return field.handleChange(e.target.value)} + /> + }} + , + )} + +
+ }} +
+ } + + const { getByTestId } = render() + + const arrayFieldInitialRender = renderCount.arrayField + const childFieldInitialRender = renderCount.childField + + // Type into the first child field + await user.type(getByTestId('person-0'), 'ny') + + // Child field should have rerendered + expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender) + // Array field should NOT have rerendered (this was the bug in #1925) + expect(renderCount.arrayField).toBe(arrayFieldInitialRender) + + // Verify typing still works + expect(getByTestId('person-0')).toHaveValue('Johnny') + + // Now add a new item - this SHOULD trigger array field re-render + const arrayFieldBeforeAdd = renderCount.arrayField + await user.click(getByTestId('add-person')) + + // Array field should have rerendered when length changes + expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd) + }, + ) + + it( + 'should rerender array field on swapFieldValues even when length is unchanged', + async () => { + // swapFieldValues does not change array length but must still notify the + // parent array field so subscribers see the new order. + const renderCount = { arrayField: 0 } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }) + + return + {(arrayField) => { + renderCount.arrayField++ + return
+
    {arrayField.state.value.map( + (person, i) => +
  1. {person.name}
  2. , + )}
+ +
+ }} +
+ } + + const { getByTestId } = render() + + expect(getByTestId('item-0')).toHaveTextContent('John') + expect(getByTestId('item-1')).toHaveTextContent('Jane') + + const before = renderCount.arrayField + await user.click(getByTestId('swap')) + + expect(renderCount.arrayField).toBeGreaterThan(before) + expect(getByTestId('item-0')).toHaveTextContent('Jane') + expect(getByTestId('item-1')).toHaveTextContent('John') + }, + ) + + it( + 'should rerender array field when async defaultValues resolve', + async () => { + // Regression test for https://github.com/TanStack/form/issues/2178 + // When async defaultValues arrive after initial render, array fields in + // mode="array" must re-render because _arrayVersion is used as the + // reactivity signal (not value length). + type Person = { name: string } + type FormData = { people: Person[] } + + function Comp({ defaultValues }: { defaultValues?: FormData }) { + const form = useForm({ defaultValues }) + + return + {(field) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const val = field.state.value ?? [] + return
    {val.map( + (person, i) => +
  1. {person.name}
  2. , + )}
+ }} +
+ } + + const { getByTestId, rerender } = render() + expect(getByTestId('list').children).toHaveLength(0) + + rerender() + await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)) + expect(getByTestId('item-0')).toHaveTextContent('Alice') + }, + ) + + it( + 'should handle defaultValue without setstate-in-render error', + async () => { + // Spy on console.error before rendering + const consoleErrorSpy = vi.spyOn(console, 'error') + + function Comp() { + const form = useForm({ + defaultValues: { + fieldOne: '', + fieldTwo: '', + }, + }) + + const fieldOne = useSelector( + form.store, + (state) => state.values.fieldOne, + ) + + return
+ { + return field.handleChange(e.target.value)} + /> + }} + /> + {fieldOne && + null} + />} + + } + + const { getByTestId } = render() + await user.type(getByTestId('fieldOne'), 'John') + + // Should not log an error + expect(consoleErrorSpy).not.toHaveBeenCalled() + }, + ) + + it('should allow field-level defaultValue', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: undefined as string | undefined, + }, + }) + + return + {(field) => { + expect(field.state.value).toEqual('a') + return {field.state.value} + }} + + } + + const { queryByText } = render() + + expect(queryByText('a')).toBeInTheDocument() + expect(queryByText('never')).not.toBeInTheDocument() + }) + + it('should handle deeply nested values', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: { first: 'Test', last: 'User' }, + }, + }) + + return

{field.state.value}

} + /> + } + + const { queryByText, findByText } = render() + + expect(queryByText('Test')).not.toBeInTheDocument() + expect(await findByText('User')).toBeInTheDocument() + }) +}) diff --git a/packages/octane-form/tests/useForm.test-d.tsx b/packages/octane-form/tests/useForm.test-d.tsx index 7e709adf2..a7d074b6b 100644 --- a/packages/octane-form/tests/useForm.test-d.tsx +++ b/packages/octane-form/tests/useForm.test-d.tsx @@ -1,157 +1,157 @@ -import { describe, expectTypeOf, it } from 'vitest'; -import { formOptions, useForm } from '../src/index'; -import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index'; -import type { OctaneFormExtendedApi } from '../src/useForm.tsrx'; +import { describe, expectTypeOf, it } from 'vitest' +import { formOptions, useForm } from '../src/index' +import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index' +import type { OctaneFormExtendedApi } from '../src/useForm.tsrx' describe('useForm', () => { - it('should type onSubmit properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - onSubmit({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>(); - }, - }); - } - }); - - it('should type a validator properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - validators: { - onChange({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>(); - return undefined; - }, - }, - }); - } - }); - - it('should not have recursion problems and type register properly', () => { - const register = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - f: OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ) => f; - - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - title: '', - }, - }); - - const x = register(form); - - return null; - } - }); - - it('types should be properly inferred when using formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm(formOpts); - - expectTypeOf(form.state.values).toEqualTypeOf(); - }); - - it('types should be properly inferred when passing args alongside formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm({ - ...formOpts, - onSubmitMeta: { - test: 'test', - }, - }); - - expectTypeOf(form.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: { test: string }): Promise; - }>(); - }); - - it('types should be properly inferred when formOptions are being overridden', () => { - type Person = { - firstName: string; - lastName: string; - }; - - type PersonWithAge = Person & { - age: number; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm({ - ...formOpts, - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - age: 10, - }, - }); - - expectTypeOf(form.state.values).toExtend(); - }); -}); + it('should type onSubmit properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + onSubmit({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>() + }, + }) + } + }) + + it('should type a validator properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + validators: { + onChange({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>() + return undefined + }, + }, + }) + } + }) + + it('should not have recursion problems and type register properly', () => { + const register = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + f: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ) => f + + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + title: '', + }, + }) + + const x = register(form) + + return null + } + }) + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm(formOpts) + + expectTypeOf(form.state.values).toEqualTypeOf() + }) + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + }) + + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: { test: string }): Promise + }>() + }) + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string + lastName: string + } + + type PersonWithAge = Person & { + age: number + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + }) + + expectTypeOf(form.state.values).toExtend() + }) +}) diff --git a/packages/octane-form/tests/useForm.test.tsrx b/packages/octane-form/tests/useForm.test.tsrx index 9b6197388..6a38ea882 100644 --- a/packages/octane-form/tests/useForm.test.tsrx +++ b/packages/octane-form/tests/useForm.test.tsrx @@ -1,1146 +1,1161 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, renderHook, waitFor } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { act, useCallback, useEffect, useReducer, useState } from 'octane'; -import { FormApi, mergeForm, useForm, useSelector } from '../src'; -import { sleep } from './utils'; +import { describe, expect, it, vi } from 'vitest' +import { render, renderHook, waitFor } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { act, useCallback, useEffect, useReducer, useState } from 'octane' +import { FormApi, mergeForm, useForm, useSelector } from '../src' +import { sleep } from './utils' -const user = userEvent.setup(); +const user = userEvent.setup() describe('useForm', () => { - it('preserves field state', async () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: {} as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.target.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText('FirstName')).not.toBeInTheDocument(); - await user.type(input, 'FirstName'); - expect(input).toHaveValue('FirstName'); - }); - - it('should allow default values to be set', async () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return

{field.state.value}

; - }} - /> - - ); - } - - const { findByText, queryByText } = render(); - expect(await findByText('FirstName')).toBeInTheDocument(); - expect(queryByText('LastName')).not.toBeInTheDocument(); - }); - - it('should handle submitting properly', async () => { - function Comp() { - const [submittedData, setSubmittedData] = useState<{ - firstName: string; - } | null>(null); - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - onSubmit: ({ value }) => { - setSubmittedData(value); - }, - }); - - return ( - <> - { - return ( - field.handleChange(e.target.value)} - placeholder={'First name'} - /> - ); - }} - /> - - {submittedData &&

Submitted data: {submittedData.firstName}

} - - ); - } - - const { findByPlaceholderText, getByText } = render(); - const input = await findByPlaceholderText('First name'); - await user.clear(input); - await user.type(input, 'OtherName'); - await user.click(getByText('Submit')); - await waitFor(() => expect(getByText('Submitted data: OtherName')).toBeInTheDocument()); - }); - - it('should run on form mount', async () => { - function Comp() { - const [formMounted, setFormMounted] = useState(false); - const [mountForm, setMountForm] = useState(false); - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - validators: { - onMount: () => { - setFormMounted(true); - return undefined; - }, - }, - }); - - return ( - <> - {mountForm ? ( - <> -

{formMounted ? 'Form mounted' : 'Not mounted'}

- - ) : ( - - )} - - ); - } - - const { getByText } = render(); - await user.click(getByText('Mount form')); - await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()); - }); - - it('should validate async on change for the form', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange() { - return error; - }, - }, - }); - const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); - return ( - <> - ( - field.handleChange(e.target.value)} - /> - )} - /> -

{onChangeError?.toString()}

- - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), - }, - }); - - const errors = useSelector(form.store, (s) => s.errors); - return ( - <> - ( -
- - field.setValue(e.target.value, { - dontUpdateMeta: true, - }) - } - /> -

{errors}

-
- )} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - expect(queryByText(error)).not.toBeInTheDocument(); - }); - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors.onChange?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate on change and on blur', async () => { - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') return onChangeError; - return undefined; - }, - onBlur: ({ value }) => { - if (value.firstName === 'other') return onBlurError; - return undefined; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

-
- )} - /> - - ); - } - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - expect(queryByText(onBlurError)).toBeInTheDocument(); - }); - - it("should set field errors from the field's validators", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') - return { - form: 'Something went wrong', - fields: { - firstName: 'Please enter a different value (onChangeError)', - }, - }; - return undefined; - }, - onBlur: ({ value }) => { - if (value.firstName === 'other') return 'Please enter a different value (onBlurError)'; - return undefined; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{field.state.meta.errorMap.onChange}

-
- )} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

- - ); - } - const { getByTestId } = render(); - - expect(getByTestId('form-onchange')).toHaveTextContent(''); - - const input = getByTestId('fieldinput'); - - await user.type(input, 'other'); - expect(getByTestId('form-onchange')).toHaveTextContent('Something went wrong'); - expect(getByTestId('field-onchange')).toHaveTextContent( - 'Please enter a different value (onChangeError)', - ); - - await user.click(document.body); - expect(getByTestId('form-onblur')).toHaveTextContent( - 'Please enter a different value (onBlurError)', - ); - }); - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors.onChange?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it("should set field errors from the form's onChangeAsync validator", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChangeAsync: async ({ value }) => { - await sleep(10); - if (value.firstName === 'other') { - return { - form: 'Invalid form values', - fields: { - firstName: 'First name cannot be "other"', - }, - }; - } - return null; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{field.state.meta.errorMap.onChange}

-
- )} - /> -

{errors.onChange?.toString()}

- - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - const firstNameErrorElement = getByTestId('field-error'); - const formErrorElement = getByTestId('form-error'); - - expect(firstNameErrorElement).toBeEmptyDOMElement(); - expect(formErrorElement).toBeEmptyDOMElement(); - - await user.type(input, 'other'); - - await waitFor(() => { - expect(firstNameErrorElement).not.toBeEmptyDOMElement(); - }); - expect(firstNameErrorElement).toHaveTextContent('First name cannot be "other"'); - expect(formErrorElement).toHaveTextContent('Invalid form values'); - }); - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10); - return onChangeError; - }, - onBlurAsync: async () => { - await sleep(10); - return onBlurError; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(onChangeError)); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - await waitFor(() => getByText(onBlurError)); - expect(getByText(onBlurError)).toBeInTheDocument(); - }); - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 100, - onChangeAsync: async () => { - mockFn(); - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errors); - - return ( - <> - ( -
- field.handleChange(e.target.value)} - /> -

{errors}

-
- )} - /> - - ); - } - - const { getByTestId, getByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - expect(mockFn).toHaveBeenCalledTimes(1); - }); - - it("should set errors on the fields from the form's onChange validator", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'Tom') { - return { - form: 'Something went wrong', - fields: { firstName: 'Please enter a different value' }, - }; - } - return null; - }, - }, - }); - - const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); - - return ( - <> - ( - <> - field.handleChange(e.target.value)} - /> - -

{field.state.meta.errors.join('')}

- - )} - /> -

{onChangeError?.toString()}

- - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - const fieldError = getByTestId('field-error'); - const formError = getByTestId('form-error'); - - expect(queryByText('Please enter a different value')).not.toBeInTheDocument(); - expect(queryByText('Something went wrong')).not.toBeInTheDocument(); - - await user.type(input, 'Tom'); - await waitFor(() => expect(fieldError.textContent).toBe('Please enter a different value')); - await waitFor(() => expect(formError.textContent).toBe('Something went wrong')); - }); - - it('should not cause infinite re-renders when listening to state.errors', () => { - const fn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value); - }, - }); - - const { errors } = useSelector(form.store, (state) => ({ - errors: state.errors, - })); - - useEffect(() => { - fn(errors); - }, [errors]); - - return null; - } - - render(); - - expect(fn).toHaveBeenCalledTimes(1); - }); - - it('should not cause infinite re-renders when listening to state', () => { - const fn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value); - }, - }); - - const { values } = useSelector(form.store, (v) => v); - - useEffect(() => { - fn(values); - }, [values]); - - return null; - } - - render(); - - expect(fn).toHaveBeenCalledTimes(1); - }); - - it('form should reset default value when resetting in onSubmit', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - }, - onSubmit: ({ value }) => { - expect(value).toEqual({ name: 'another-test' }); - - form.reset(value); - }, - }); - - return ( -
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - ( - field.handleChange(e.target.value)} - /> - )} - /> - - - - - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - const submit = getByTestId('submit'); - const reset = getByTestId('reset'); - - await user.type(input, 'test'); - await waitFor(() => expect(input).toHaveValue('test')); - - await user.click(reset); - await waitFor(() => expect(input).toHaveValue('')); - - await user.type(input, 'another-test'); - await user.click(submit); - await waitFor(() => expect(input).toHaveValue('another-test')); - }); - - it('should accept formId and return it', async () => { - function Comp() { - const form = useForm({ - formId: 'test', - }); - - return ( - <> -
{ - e.preventDefault(); - form.handleSubmit(); - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => ( - {submissionAttempts} - )} - /> - - - - ); - } - - const { getByTestId } = render(); - const target = getByTestId('formId-target'); - const result = getByTestId('formId-result'); - - expect(target).toHaveAttribute('form', 'test'); - expect(target).toHaveTextContent('test'); - await user.click(target); - expect(result).toHaveTextContent('1'); - }); - - it('should allow custom component keys for arrays', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - foo: [ - { name: 'nameA', id: 'a' }, - { name: 'nameB', id: 'b' }, - { name: 'nameC', id: 'c' }, - ], - }, - }); - - return ( - <> - - {(arrayField) => - arrayField.state.value.map((_, i) => ( - - {(field) => { - expect(field.name).toBe(`foo[${i}].name`); - expect(field.state.value).not.toBeUndefined(); - return null; - }} - - )) - } - - - - ); - } - - const { getByTestId } = render(); - - const target = getByTestId('removeField'); - await user.click(target); - }); - - it('should not error when using deleteField in edge cases', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - const fields: Record = {}; - - if (value.firstName.length === 0) { - fields.firstName = 'Last Name is required'; - } - - return { fields }; - }, - }, - }); - - return ( -
{ - e.preventDefault(); - form.handleSubmit(); - }} - > -

Personal Information

- ( - field.handleChange(e.target.value)} - /> - )} - /> - ( - field.handleChange(e.target.value)} - /> - )} - /> - - - ); - } - - const { getByTestId } = render(); - const removeButton = getByTestId('remove'); - const input = getByTestId('input'); - - await user.type(input, 'a'); - await user.click(removeButton); - }); - - it('should handle stable transforms to update the base form on first render', async () => { - let renders = 0; - function Comp() { - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback((baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: 'What', - }, - }); - }, []), - }); - - renders++; - - return ( - ( -

- {field.state.value} {renders} -

- )} - /> - ); - } - - const { getByText } = render(); - getByText('What 1'); - }); - - it('should handle stable transforms to update the base form on subsequent renders', async () => { - function Comp() { - const [renders, setRenders] = useState(0); - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback( - (baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: renders === 0 ? 'First' : 'Another', - }, - }); - }, - [renders], - ), - }); - - return ( -
-

{field.state.value}

} /> - -
- ); - } - - const { findByText, getByText } = render(); - await findByText('First'); - await user.click(getByText('Rerender')); - await findByText('Another'); - }); - - it('should render Subscribe without selector (default identity)', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: 'test', - }, - }); - - return ( - <> - ( - field.handleChange(e.target.value)} - /> - )} - /> - - {state.values.name}} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('input'); - const stateValue = getByTestId('state-value'); - - expect(stateValue).toHaveTextContent('test'); - - await user.clear(input); - await user.type(input, 'updated'); - await waitFor(() => expect(stateValue).toHaveTextContent('updated')); - }); - - it('mounts a replacement form when an explicit formId is removed', async () => { - const mountedIds: string[] = []; - - function Comp() { - const [formId, setFormId] = useState('first'); - const [, forceRender] = useReducer((count) => count + 1, 0); - const form = useForm({ - formId, - listeners: { - onMount: () => mountedIds.push(formId ?? 'fallback'), - }, - }); - - return <> - {form.formId} - - - ; - } - - const { getByTestId } = render(); - const id = getByTestId('dynamic-form-id'); - expect(id).toHaveTextContent('first'); - expect(mountedIds).toEqual(['first']); - - await user.click(getByTestId('clear-form-id')); - await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); - expect(id).not.toHaveTextContent('first'); - const fallbackId = id.textContent; - expect(fallbackId).not.toBe(''); - - await user.click(getByTestId('rerender-form')); - expect(id).toHaveTextContent(fallbackId!); - expect(mountedIds).toEqual(['first', 'fallback']); - }); - - it('keeps multiple subscriptions in the same component independent', () => { - const form = new FormApi({ - defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, - }); - const { result } = renderHook(() => ({ - firstName: useSelector(form.store, (state) => state.values.firstName), - lastName: useSelector(form.store, (state) => state.values.lastName), - })); - - expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }); - act(() => form.setFieldValue('firstName', 'Grace')); - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }); - act(() => form.setFieldValue('lastName', 'Hopper')); - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }); - }); -}); + it('preserves field state', async () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: {} as Person, + }) + + return <> + { + return field.handleChange(e.target.value)} + /> + }} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText('FirstName')).not.toBeInTheDocument() + await user.type(input, 'FirstName') + expect(input).toHaveValue('FirstName') + }) + + it('should allow default values to be set', async () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return

{field.state.value}

+ }} + /> + + } + + const { findByText, queryByText } = render() + expect(await findByText('FirstName')).toBeInTheDocument() + expect(queryByText('LastName')).not.toBeInTheDocument() + }) + + it('should handle submitting properly', async () => { + function Comp() { + const [submittedData, setSubmittedData] = useState< + | { + firstName: string; + } + | null + >(null) + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + onSubmit: ({ value }) => { + setSubmittedData(value) + }, + }) + + return <> + { + return field.handleChange(e.target.value)} + placeholder="First name" + /> + }} + /> + + {submittedData &&

Submitted data: {submittedData.firstName}

} + + } + + const { findByPlaceholderText, getByText } = render() + const input = await findByPlaceholderText('First name') + await user.clear(input) + await user.type(input, 'OtherName') + await user.click(getByText('Submit')) + await waitFor( + () => expect(getByText('Submitted data: OtherName')).toBeInTheDocument(), + ) + }) + + it('should run on form mount', async () => { + function Comp() { + const [formMounted, setFormMounted] = useState(false) + const [mountForm, setMountForm] = useState(false) + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + validators: { + onMount: () => { + setFormMounted(true) + return undefined + }, + }, + }) + + return <> + {mountForm + ? <> +

+ {formMounted ? 'Form mounted' : 'Not mounted'} +

+ + : } + + } + + const { getByText } = render() + await user.click(getByText('Mount form')) + await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()) + }) + + it('should validate async on change for the form', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange() { + return error + }, + }, + }) + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange) + return <> + + field.handleChange(e.target.value)} + />} + /> +

+ {onChangeError?.toString()} +

+ + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' + ? error + : undefined), + }, + }) + + const errors = useSelector(form.store, (s) => s.errors) + return <> +
+ field.setValue(e.target.value, { + dontUpdateMeta: true, + })} + /> +

{errors}

+
} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + expect(queryByText(error)).not.toBeInTheDocument() + }) + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' + ? error + : undefined), + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.target.value)} + /> +

+ {errors.onChange?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate on change and on blur', async () => { + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return onChangeError + return undefined + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return onBlurError + return undefined + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.target.value)} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+
} + /> + + } + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + expect(queryByText(onBlurError)).toBeInTheDocument() + }) + + it('should set field errors from the field\'s validators', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return { + form: 'Something went wrong', + fields: { + firstName: 'Please enter a different value (onChangeError)', + }, + } + return undefined + }, + onBlur: ({ value }) => { + if ( + value.firstName === 'other' + ) return 'Please enter a different value (onBlurError)' + return undefined + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+ + } + const { getByTestId } = render() + + expect(getByTestId('form-onchange')).toHaveTextContent('') + + const input = getByTestId('fieldinput') + + await user.type(input, 'other') + expect(getByTestId('form-onchange')).toHaveTextContent( + 'Something went wrong', + ) + expect(getByTestId('field-onchange')).toHaveTextContent( + 'Please enter a different value (onChangeError)', + ) + + await user.click(document.body) + expect(getByTestId('form-onblur')).toHaveTextContent( + 'Please enter a different value (onBlurError)', + ) + }) + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.target.value)} + /> +

+ {errors.onChange?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it( + 'should set field errors from the form\'s onChangeAsync validator', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChangeAsync: async ({ value }) => { + await sleep(10) + if (value.firstName === 'other') { + return { + form: 'Invalid form values', + fields: { + firstName: 'First name cannot be "other"', + }, + } + } + return null + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + + return <> +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
} + /> +

+ {errors.onChange?.toString()} +

+ + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + const firstNameErrorElement = getByTestId('field-error') + const formErrorElement = getByTestId('form-error') + + expect(firstNameErrorElement).toBeEmptyDOMElement() + expect(formErrorElement).toBeEmptyDOMElement() + + await user.type(input, 'other') + + await waitFor(() => { + expect(firstNameErrorElement).not.toBeEmptyDOMElement() + }) + expect(firstNameErrorElement).toHaveTextContent( + 'First name cannot be "other"', + ) + expect(formErrorElement).toHaveTextContent('Invalid form values') + }, + ) + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10) + return onChangeError + }, + onBlurAsync: async () => { + await sleep(10) + return onBlurError + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + + return <> +
+ field.handleChange(e.target.value)} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(onChangeError)) + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + await waitFor(() => getByText(onBlurError)) + expect(getByText(onBlurError)).toBeInTheDocument() + }) + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 100, + onChangeAsync: async () => { + mockFn() + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errors) + + return <> +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
} + /> + + } + + const { getByTestId, getByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + expect(mockFn).toHaveBeenCalledTimes(1) + }) + + it( + 'should set errors on the fields from the form\'s onChange validator', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'Tom') { + return { + form: 'Something went wrong', + fields: { firstName: 'Please enter a different value' }, + } + } + return null + }, + }, + }) + + const onChangeError = useSelector( + form.store, + (s) => s.errorMap.onChange, + ) + + return <> + <> + field.handleChange(e.target.value)} + /> + +

{field.state.meta.errors.join( + '', + )}

+ } + /> +

+ {onChangeError?.toString()} +

+ + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + const fieldError = getByTestId('field-error') + const formError = getByTestId('form-error') + + expect( + queryByText('Please enter a different value'), + ).not.toBeInTheDocument() + expect(queryByText('Something went wrong')).not.toBeInTheDocument() + + await user.type(input, 'Tom') + await waitFor( + () => expect(fieldError.textContent).toBe( + 'Please enter a different value', + ), + ) + await waitFor( + () => expect(formError.textContent).toBe('Something went wrong'), + ) + }, + ) + + it( + 'should not cause infinite re-renders when listening to state.errors', + () => { + const fn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + const { errors } = useSelector( + form.store, + (state) => ({ + errors: state.errors, + }), + ) + + useEffect(() => { + fn(errors) + }, [errors]) + + return null + } + + render() + + expect(fn).toHaveBeenCalledTimes(1) + }, + ) + + it('should not cause infinite re-renders when listening to state', () => { + const fn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + const { values } = useSelector(form.store, (v) => v) + + useEffect(() => { + fn(values) + }, [values]) + + return null + } + + render() + + expect(fn).toHaveBeenCalledTimes(1) + }) + + it('form should reset default value when resetting in onSubmit', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + }, + onSubmit: ({ value }) => { + expect(value).toEqual({ name: 'another-test' }) + + form.reset(value) + }, + }) + + return
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + field.handleChange(e.target.value)} + />} + /> + + + + + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + const submit = getByTestId('submit') + const reset = getByTestId('reset') + + await user.type(input, 'test') + await waitFor(() => expect(input).toHaveValue('test')) + + await user.click(reset) + await waitFor(() => expect(input).toHaveValue('')) + + await user.type(input, 'another-test') + await user.click(submit) + await waitFor(() => expect(input).toHaveValue('another-test')) + }) + + it('should accept formId and return it', async () => { + function Comp() { + const form = useForm({ + formId: 'test', + }) + + return <> +
{ + e.preventDefault() + form.handleSubmit() + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => + {submissionAttempts}} + /> + + + + } + + const { getByTestId } = render() + const target = getByTestId('formId-target') + const result = getByTestId('formId-result') + + expect(target).toHaveAttribute('form', 'test') + expect(target).toHaveTextContent('test') + await user.click(target) + expect(result).toHaveTextContent('1') + }) + + it('should allow custom component keys for arrays', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + foo: [ + { name: 'nameA', id: 'a' }, + { name: 'nameB', id: 'b' }, + { name: 'nameC', id: 'c' }, + ], + }, + }) + + return <> + + {(arrayField) => arrayField.state.value.map( + (_, i) => + {(field) => { + expect(field.name).toBe(`foo[${i}].name`) + expect(field.state.value).not.toBeUndefined() + return null + }} + , + )} + + + + } + + const { getByTestId } = render() + + const target = getByTestId('removeField') + await user.click(target) + }) + + it('should not error when using deleteField in edge cases', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + const fields: Record = {} + + if (value.firstName.length === 0) { + fields.firstName = 'Last Name is required' + } + + return { fields } + }, + }, + }) + + return
{ + e.preventDefault() + form.handleSubmit() + }} + > +

Personal Information

+ + field.handleChange(e.target.value)} + />} + /> + + field.handleChange(e.target.value)} + />} + /> + + + } + + const { getByTestId } = render() + const removeButton = getByTestId('remove') + const input = getByTestId('input') + + await user.type(input, 'a') + await user.click(removeButton) + }) + + it( + 'should handle stable transforms to update the base form on first render', + async () => { + let renders = 0 + function Comp() { + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: 'What', + }, + }) + }, []), + }) + + renders++ + + return

+ {field.state.value} + + {renders} +

} + /> + } + + const { getByText } = render() + getByText('What 1') + }, + ) + + it( + 'should handle stable transforms to update the base form on subsequent renders', + async () => { + function Comp() { + const [renders, setRenders] = useState(0) + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: renders === 0 ? 'First' : 'Another', + }, + }) + }, [renders]), + }) + + return
+

{field.state.value}

} + /> + +
+ } + + const { findByText, getByText } = render() + await findByText('First') + await user.click(getByText('Rerender')) + await findByText('Another') + }, + ) + + it( + 'should render Subscribe without selector (default identity)', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: 'test', + }, + }) + + return <> + + field.handleChange(e.target.value)} + />} + /> + + + {state.values.name}} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('input') + const stateValue = getByTestId('state-value') + + expect(stateValue).toHaveTextContent('test') + + await user.clear(input) + await user.type(input, 'updated') + await waitFor(() => expect(stateValue).toHaveTextContent('updated')) + }, + ) + + it( + 'mounts a replacement form when an explicit formId is removed', + async () => { + const mountedIds: string[] = [] + + function Comp() { + const [formId, setFormId] = useState('first') + const [, forceRender] = useReducer((count) => count + 1, 0) + const form = useForm({ + formId, + listeners: { + onMount: () => mountedIds.push(formId ?? 'fallback'), + }, + }) + + return <> + {form.formId} + + + + } + + const { getByTestId } = render() + const id = getByTestId('dynamic-form-id') + expect(id).toHaveTextContent('first') + expect(mountedIds).toEqual(['first']) + + await user.click(getByTestId('clear-form-id')) + await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])) + expect(id).not.toHaveTextContent('first') + const fallbackId = id.textContent + expect(fallbackId).not.toBe('') + + await user.click(getByTestId('rerender-form')) + expect(id).toHaveTextContent(fallbackId!) + expect(mountedIds).toEqual(['first', 'fallback']) + }, + ) + + it('keeps multiple subscriptions in the same component independent', () => { + const form = new FormApi({ + defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, + }) + const { result } = renderHook( + () => ({ + firstName: useSelector(form.store, (state) => state.values.firstName), + lastName: useSelector(form.store, (state) => state.values.lastName), + }), + ) + + expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }) + act(() => form.setFieldValue('firstName', 'Grace')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }) + act(() => form.setFieldValue('lastName', 'Hopper')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }) + }) +}) diff --git a/packages/octane-form/tests/useFormGroup.test-d.tsx b/packages/octane-form/tests/useFormGroup.test-d.tsx index a6ff1c116..765ca1378 100644 --- a/packages/octane-form/tests/useFormGroup.test-d.tsx +++ b/packages/octane-form/tests/useFormGroup.test-d.tsx @@ -1,387 +1,389 @@ -import { describe, expectTypeOf, it } from 'vitest'; -import { useForm, useFormGroup } from '../src/index'; -import type { FormGroupApi } from '../src/index'; +import { describe, expectTypeOf, it } from 'vitest' +import { useForm, useFormGroup } from '../src/index' +import type { FormGroupApi } from '../src/index' describe('useFormGroup form-like surface', () => { - it('should type state.value based on the selected field', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(group.name).toEqualTypeOf<'step1'>(); - } - }); - - it('should type onGroupSubmit value and meta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }, - }); - } - }); - - it('should type onGroupSubmitInvalid value and meta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - onGroupSubmitInvalid: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }, - }); - } - }); - - it('should type validators with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - onSubmit: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - }, - }); - } - }); - - it('should type listeners with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - listeners: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - }, - }, - }); - } - }); - - it('should type handleSubmit return as Promise', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.handleSubmit()).toEqualTypeOf>(); - } - }); - - it('should type handleSubmit overload when onSubmitMeta is provided', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: SubmitMeta): Promise; - }>(); - } - }); - - it('should type setValue updater', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - group.setValue({ name: 'new name' }); - group.setValue((prev) => { - expectTypeOf(prev).toEqualTypeOf<{ name: string }>(); - return { name: 'updated' }; - }); - } - }); - - it('should infer the FormGroupApi instance type for useFormGroup', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group).toMatchTypeOf< - FormGroupApi< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > - >(); - } - }); -}); + it('should type state.value based on the selected field', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() + expectTypeOf(group.name).toEqualTypeOf<'step1'>() + } + }) + + it('should type onGroupSubmit value and meta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }, + }) + } + }) + + it('should type onGroupSubmitInvalid value and meta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + onGroupSubmitInvalid: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }, + }) + } + }) + + it('should type validators with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + onSubmit: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + }, + }) + } + }) + + it('should type listeners with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + listeners: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + }, + }, + }) + } + }) + + it('should type handleSubmit return as Promise', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.handleSubmit()).toEqualTypeOf>() + } + }) + + it('should type handleSubmit overload when onSubmitMeta is provided', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: SubmitMeta): Promise + }>() + } + }) + + it('should type setValue updater', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + group.setValue({ name: 'new name' }) + group.setValue((prev) => { + expectTypeOf(prev).toEqualTypeOf<{ name: string }>() + return { name: 'updated' } + }) + } + }) + + it('should infer the FormGroupApi instance type for useFormGroup', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group).toMatchTypeOf< + FormGroupApi< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + >() + } + }) +}) describe('useFormGroup field-like meta surface', () => { - it('should type meta booleans', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.state.meta.isTouched).toEqualTypeOf(); - expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf(); - expectTypeOf(group.state.meta.isDirty).toEqualTypeOf(); - expectTypeOf(group.state.meta.isValidating).toEqualTypeOf(); - } - }); - - it('should type errorMap entries based on validator return types', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'sync-change' as const, - onChangeAsync: async () => 'async-change' as const, - onBlur: () => 'sync-blur' as const, - onBlurAsync: async () => 'async-blur' as const, - onSubmit: () => 'sync-submit' as const, - onSubmitAsync: async () => 'async-submit' as const, - }, - }); - - expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< - 'sync-change' | 'async-change' | undefined - >(); - expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< - 'sync-blur' | 'async-blur' | undefined - >(); - expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< - 'sync-submit' | 'async-submit' | undefined - >(); - } - }); - - it('should type errors array from group validators', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'change-error' as const, - }, - }); - - expectTypeOf(group.state.meta.errors).toEqualTypeOf>(); - } - }); -}); + it('should type meta booleans', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.state.meta.isTouched).toEqualTypeOf() + expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf() + expectTypeOf(group.state.meta.isDirty).toEqualTypeOf() + expectTypeOf(group.state.meta.isValidating).toEqualTypeOf() + } + }) + + it('should type errorMap entries based on validator return types', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'sync-change' as const, + onChangeAsync: async () => 'async-change' as const, + onBlur: () => 'sync-blur' as const, + onBlurAsync: async () => 'async-blur' as const, + onSubmit: () => 'sync-submit' as const, + onSubmitAsync: async () => 'async-submit' as const, + }, + }) + + expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< + 'sync-change' | 'async-change' | undefined + >() + expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< + 'sync-blur' | 'async-blur' | undefined + >() + expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< + 'sync-submit' | 'async-submit' | undefined + >() + } + }) + + it('should type errors array from group validators', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'change-error' as const, + }, + }) + + expectTypeOf(group.state.meta.errors).toEqualTypeOf< + Array<'change-error' | undefined> + >() + } + }) +}) describe('form.FormGroup component surface', () => { - it('should type the children render prop with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - {}}> - {(group) => { - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(group.name).toEqualTypeOf<'step1'>(); - return null; - }} - - ); - } - }); - - it('should type the children render prop with onSubmitMeta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }} - > - {(group) => { - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: SubmitMeta): Promise; - }>(); - return null; - }} - - ); - } - }); - - it('should type validators on the FormGroup component', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }); - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - }} - onGroupSubmit={() => {}} - > - {() => null} - - ); - } - }); -}); + it('should type the children render prop with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return ( + {}}> + {(group) => { + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() + expectTypeOf(group.name).toEqualTypeOf<'step1'>() + return null + }} + + ) + } + }) + + it('should type the children render prop with onSubmitMeta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }} + > + {(group) => { + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: SubmitMeta): Promise + }>() + return null + }} + + ) + } + }) + + it('should type validators on the FormGroup component', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }) + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + }} + onGroupSubmit={() => {}} + > + {() => null} + + ) + } + }) +}) diff --git a/packages/octane-form/tests/useFormGroup.test.tsrx b/packages/octane-form/tests/useFormGroup.test.tsrx index 4e4bf25e0..1716d420f 100644 --- a/packages/octane-form/tests/useFormGroup.test.tsrx +++ b/packages/octane-form/tests/useFormGroup.test.tsrx @@ -1,352 +1,355 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, waitFor } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useState } from 'octane'; -import { useForm } from '../src'; +import { describe, expect, it, vi } from 'vitest' +import { render, waitFor } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { useState } from 'octane' +import { useForm } from '../src' -const user = userEvent.setup(); +const user = userEvent.setup() describe('form.FormGroup', () => { - it('should call onGroupSubmit but not the form onSubmit when submitting the group', async () => { - const onSubmit = vi.fn(); - const onGroupSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - onSubmit, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.target.value)} - /> - )} - /> - - - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onSubmit).not.toHaveBeenCalled(); - }); - - it('should expose group state value reactively', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'initial' }, - step2: { name: 'other' }, - }, - }); - - return ( - - {(group) => ( - <> - ( - field.handleChange(e.target.value)} - /> - )} - /> -
{JSON.stringify(group.state.value)}
- - )} -
- ); - } - - const { getByTestId } = render(); - expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}'); - - await user.clear(getByTestId('step1-name')); - await user.type(getByTestId('step1-name'), 'updated'); - - await waitFor(() => expect(getByTestId('group-value').textContent).toBe('{"name":"updated"}')); - }); - - it('should call onGroupSubmitInvalid when group-level validation fails', async () => { - const onSubmit = vi.fn(); - const onGroupSubmit = vi.fn(); - const onGroupSubmitInvalid = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: '' }, - step2: { name: 'test2' }, - }, - onSubmit, - }); - - return ( - (!value.name ? 'Name is required' : undefined), - }} - onGroupSubmit={onGroupSubmit} - onGroupSubmitInvalid={onGroupSubmitInvalid} - > - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.target.value)} - /> - )} - /> - -
-								{String(group.state.meta.errorMap.onSubmit ?? '')}
-							
- - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)); - expect(onGroupSubmit).not.toHaveBeenCalled(); - expect(onSubmit).not.toHaveBeenCalled(); - await waitFor(() => expect(getByTestId('group-error').textContent).toBe('Name is required')); - }); - - it('should ignore form-level field errors outside the group when submitting the group', async () => { - const onGroupSubmit = vi.fn(); - const onGroupSubmitInvalid = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - validators: { - onSubmit: () => ({ - fields: { - 'step2.name': 'Required', - }, - }), - }, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.target.value)} - /> - )} - /> - - - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onGroupSubmitInvalid).not.toHaveBeenCalled(); - }); - - it('should pass submit meta through handleSubmit', async () => { - const onGroupSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - - {(group) => ( - - )} - - ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onGroupSubmit).toHaveBeenCalledWith( - expect.objectContaining({ - value: { name: 'test' }, - meta: { source: 'button' }, - }), - ); - }); - - it('should rerender group.state.meta.isSubmitting during an async submit', async () => { - let resolveSubmit!: () => void; - const onGroupSubmit = vi.fn( - () => - new Promise((resolve) => { - resolveSubmit = resolve; - }), - ); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - void group.handleSubmit(); - }} - > - -
- )} -
- ); - } - - const { getByTestId } = render(); - const button = getByTestId('submit-group') as HTMLButtonElement; - expect(button.textContent).toBe('Continue'); - expect(button.disabled).toBe(false); - - await user.click(button); - - await waitFor(() => expect(button.textContent).toBe('Saving...')); - expect(button.disabled).toBe(true); - - resolveSubmit(); - - await waitFor(() => expect(button.textContent).toBe('Continue')); - expect(button.disabled).toBe(false); - expect(onGroupSubmit).toHaveBeenCalledTimes(1); - }); - - it('uses the current group state throughout a name change render', async () => { - const observedValues: string[] = []; - - function Comp() { - const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); - const form = useForm({ - defaultValues: { - step1: { label: 'first' }, - step2: { label: 'second' }, - }, - }); - - return <> - - - {(group) => { - observedValues.push(group.state.value.label); - return {group.state.value.label}; - }} - - ; - } - - const { getByTestId } = render(); - expect(getByTestId('group-label')).toHaveTextContent('first'); - - observedValues.length = 0; - await user.click(getByTestId('change-group')); - - expect(getByTestId('group-label')).toHaveTextContent('second'); - expect(observedValues).not.toContain('first'); - }); -}); + it( + 'should call onGroupSubmit but not the form onSubmit when submitting the group', + async () => { + const onSubmit = vi.fn() + const onGroupSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + onSubmit, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.target.value)} + />} + /> + + } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onSubmit).not.toHaveBeenCalled() + }, + ) + + it('should expose group state value reactively', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'initial' }, + step2: { name: 'other' }, + }, + }) + + return + {(group) => <> + + field.handleChange(e.target.value)} + />} + /> +
{JSON.stringify(
+            group.state.value,
+          )}
+ } +
+ } + + const { getByTestId } = render() + expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}') + + await user.clear(getByTestId('step1-name')) + await user.type(getByTestId('step1-name'), 'updated') + + await waitFor( + () => expect(getByTestId('group-value').textContent).toBe( + '{"name":"updated"}', + ), + ) + }) + + it( + 'should call onGroupSubmitInvalid when group-level validation fails', + async () => { + const onSubmit = vi.fn() + const onGroupSubmit = vi.fn() + const onGroupSubmitInvalid = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { name: 'test2' }, + }, + onSubmit, + }) + + return (!value.name + ? 'Name is required' + : undefined), + }} + onGroupSubmit={onGroupSubmit} + onGroupSubmitInvalid={onGroupSubmitInvalid} + > + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.target.value)} + />} + /> + +
{String(
+              group.state.meta.errorMap.onSubmit ?? '',
+            )}
+ } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)) + expect(onGroupSubmit).not.toHaveBeenCalled() + expect(onSubmit).not.toHaveBeenCalled() + await waitFor( + () => expect(getByTestId('group-error').textContent).toBe( + 'Name is required', + ), + ) + }, + ) + + it( + 'should ignore form-level field errors outside the group when submitting the group', + async () => { + const onGroupSubmit = vi.fn() + const onGroupSubmitInvalid = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + validators: { + onSubmit: () => ({ + fields: { + 'step2.name': 'Required', + }, + }), + }, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.target.value)} + />} + /> + + } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onGroupSubmitInvalid).not.toHaveBeenCalled() + }, + ) + + it('should pass submit meta through handleSubmit', async () => { + const onGroupSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return + {(group) => } + + } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onGroupSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + value: { name: 'test' }, + meta: { source: 'button' }, + }), + ) + }) + + it( + 'should rerender group.state.meta.isSubmitting during an async submit', + async () => { + let resolveSubmit!: () => void + const onGroupSubmit = vi.fn( + () => new Promise((resolve) => { + resolveSubmit = resolve + }), + ) + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + void group.handleSubmit() + }} + > + +
} +
+ } + + const { getByTestId } = render() + const button = getByTestId('submit-group') as HTMLButtonElement + expect(button.textContent).toBe('Continue') + expect(button.disabled).toBe(false) + + await user.click(button) + + await waitFor(() => expect(button.textContent).toBe('Saving...')) + expect(button.disabled).toBe(true) + + resolveSubmit() + + await waitFor(() => expect(button.textContent).toBe('Continue')) + expect(button.disabled).toBe(false) + expect(onGroupSubmit).toHaveBeenCalledTimes(1) + }, + ) + + it( + 'uses the current group state throughout a name change render', + async () => { + const observedValues: string[] = [] + + function Comp() { + const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1') + const form = useForm({ + defaultValues: { + step1: { label: 'first' }, + step2: { label: 'second' }, + }, + }) + + return <> + + + {(group) => { + observedValues.push(group.state.value.label) + return {group.state.value.label} + }} + + + } + + const { getByTestId } = render() + expect(getByTestId('group-label')).toHaveTextContent('first') + + observedValues.length = 0 + await user.click(getByTestId('change-group')) + + expect(getByTestId('group-label')).toHaveTextContent('second') + expect(observedValues).not.toContain('first') + }, + ) +}) diff --git a/packages/octane-form/tests/utils.ts b/packages/octane-form/tests/utils.ts index 863f489f4..1a3a619a2 100644 --- a/packages/octane-form/tests/utils.ts +++ b/packages/octane-form/tests/utils.ts @@ -1,5 +1,5 @@ export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout); - }); + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout) + }) } From 14708df93debd8bf2fe4a86ca20f2a56ee2c523f Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:59:18 -0700 Subject: [PATCH 07/19] chore: tsrx eslint --- packages/octane-form/eslint.config.js | 3 +- packages/octane-form/package.json | 2 + pnpm-lock.yaml | 54 +++++++++++++++++++-------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/packages/octane-form/eslint.config.js b/packages/octane-form/eslint.config.js index 8ce6ad05f..d90f1d492 100644 --- a/packages/octane-form/eslint.config.js +++ b/packages/octane-form/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import tsrx from '@tsrx/eslint-plugin' import rootConfig from '../../eslint.config.js' -export default [...rootConfig] +export default [...rootConfig, ...tsrx.configs.recommended] diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json index bcaff07df..32e514772 100644 --- a/packages/octane-form/package.json +++ b/packages/octane-form/package.json @@ -63,7 +63,9 @@ "@octanejs/testing-library": "^0.1.51", "@testing-library/jest-dom": "^6.8.0", "@testing-library/user-event": "^14.6.1", + "@tsrx/eslint-plugin": "^0.4.6", "@tsrx/typescript-plugin": "^0.4.6", + "eslint": "9.36.0", "octane": "^0.2.16", "vitest": "^3.2.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd0a15e1d..6afc86aae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1887,9 +1887,15 @@ importers: '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.7(@testing-library/dom@10.4.1) + '@tsrx/eslint-plugin': + specifier: ^0.4.6 + version: 0.4.6(@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) '@tsrx/typescript-plugin': specifier: ^0.4.6 version: 0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3) + eslint: + specifier: 9.36.0 + version: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) octane: specifier: ^0.2.16 version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) @@ -7813,6 +7819,20 @@ packages: '@tsrx/core@0.2.4': resolution: {integrity: sha512-o07NiDB2yFeN2natoViMwwb9h0o3UDzYqGUJ7qe4w6r5Oc0WLoWFfrpRDUtWBpR+JL4Loc3lRxFdOD+Wz+0VlQ==} + '@tsrx/eslint-parser@0.4.6': + resolution: {integrity: sha512-wSi2pLWynAzf5CQj31OMnNmiZ/MaTSR9McABlgWkSIXLmPHZQGd3mmqKrKZNEjLF2jv4fdYMwjXf1CS6RDQ6Fg==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '>=9.0.0' + + '@tsrx/eslint-plugin@0.4.6': + resolution: {integrity: sha512-q4nD0wBQwB3lf1WJ1UgflhI4uZSZKeg7Q4jbapa4cS5xRD/M3ofskEu/O5yYCILZNb6LPMViblGyWsFcNZ/5sg==} + engines: {node: '>=22.0.0'} + peerDependencies: + '@tsrx/eslint-parser': 0.4.6 + '@typescript-eslint/parser': ^8.56.1 + eslint: '>=9.0.0' + '@tsrx/oxc-darwin-arm64@0.13.0': resolution: {integrity: sha512-wk3JP8sBJBC1gxuG/fVlT/WnR/i2E2dYFpv8NnoSMcjSdoAw4e6cobgpzEWI2E8AXp7yQ5Nlp8gD+Xvt6AJTUg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8558,11 +8578,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} @@ -22107,6 +22122,19 @@ snapshots: transitivePeerDependencies: - '@typescript-eslint/types' + '@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': + dependencies: + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) + eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) + transitivePeerDependencies: + - '@typescript-eslint/types' + + '@tsrx/eslint-plugin@0.4.6(@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': + dependencies: + '@tsrx/eslint-parser': 0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) + '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) + '@tsrx/oxc-darwin-arm64@0.13.0': optional: true @@ -23050,16 +23078,10 @@ snapshots: dependencies: acorn: 8.18.0 - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 - acorn@8.16.0: {} - acorn@8.18.0: {} adjust-sourcemap-loader@4.0.0: @@ -25196,14 +25218,14 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} @@ -27939,7 +27961,7 @@ snapshots: mlly@1.8.2: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.4 From 98a7e2a4593922043a524be3377bc7f6e733569b Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 20:21:22 -0700 Subject: [PATCH 08/19] chore: revert Prettier plugin addin Can add back once https://github.com/tsrx-org/tsrx/pull/139/ is merged --- package.json | 1 - pnpm-lock.yaml | 15 --------------- prettier.config.js | 1 - 3 files changed, 17 deletions(-) diff --git a/package.json b/package.json index cf1c6fc82..5dabc83e4 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@testing-library/vue": "^8.1.0", - "@tsrx/prettier-plugin": "^0.4.6", "@types/node": "^24.1.0", "@vitest/coverage-istanbul": "^3.2.4", "eslint": "9.36.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6afc86aae..e9a6daef8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,9 +202,6 @@ importers: '@testing-library/vue': specifier: ^8.1.0 version: 8.1.0(@vue/compiler-dom@3.5.34)(@vue/compiler-sfc@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) - '@tsrx/prettier-plugin': - specifier: ^0.4.6 - version: 0.4.6(@typescript-eslint/types@8.59.4)(prettier@3.8.3) '@types/node': specifier: ^24.1.0 version: 24.12.4 @@ -7890,11 +7887,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - '@tsrx/prettier-plugin@0.4.6': - resolution: {integrity: sha512-wMhBFA1+46if9LQyQFVMhs6uTMIJDoXgqBJT4fO3+6zZoATw7k9C1NvpUgARqNiiSdzT7qdV3JhZ4c2CWKJgvw==} - peerDependencies: - prettier: '>=2.0.0' - '@tsrx/runtime@0.2.2': resolution: {integrity: sha512-EsqZjTKWd/qrwEEk7AtaKrmTvPZWRz+H06rJjgNAb1Om0RC45xX2hZjDlv/tE20o4gcOgSCfc/AzKTq6qXlp1A==} @@ -22180,13 +22172,6 @@ snapshots: - svelte - vite-plus - '@tsrx/prettier-plugin@0.4.6(@typescript-eslint/types@8.59.4)(prettier@3.8.3)': - dependencies: - '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) - prettier: 3.8.3 - transitivePeerDependencies: - - '@typescript-eslint/types' - '@tsrx/runtime@0.2.2': {} '@tsrx/typescript-plugin@0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3)': diff --git a/prettier.config.js b/prettier.config.js index b393c9d80..2c53b10e3 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -5,7 +5,6 @@ const config = { semi: false, singleQuote: true, trailingComma: 'all', - plugins: ['@tsrx/prettier-plugin'], } export default config From 6a62efa79f926f0f7dff551bafa8579118c33a1d Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 20:21:28 -0700 Subject: [PATCH 09/19] Revert "chore: prettier format" This reverts commit 4fb7e8ad9a904290ca63b56e012f4fe3754a54e0. --- packages/octane-form/src/createFormHook.tsrx | 1508 +++++---- .../octane-form/src/createFormHook.tsrx.d.ts | 526 +-- packages/octane-form/src/index.ts | 18 +- packages/octane-form/src/types.ts | 228 +- packages/octane-form/src/useField.tsrx | 1172 +++---- packages/octane-form/src/useField.tsrx.d.ts | 573 +--- packages/octane-form/src/useFieldGroup.tsrx | 467 ++- .../octane-form/src/useFieldGroup.tsrx.d.ts | 169 +- packages/octane-form/src/useForm.tsrx | 494 +-- packages/octane-form/src/useForm.tsrx.d.ts | 201 +- packages/octane-form/src/useFormGroup.tsrx | 1207 ++++--- .../octane-form/src/useFormGroup.tsrx.d.ts | 549 +-- packages/octane-form/src/useFormId.ts | 4 +- .../src/useIsomorphicLayoutEffect.ts | 4 +- .../tests/createFormHook.test-d.tsx | 2054 ++++++------ .../tests/createFormHook.test.tsrx | 1875 ++++++----- .../tests/onChangeListenTo.adapter.test.tsrx | 265 +- packages/octane-form/tests/server.test.tsrx | 50 +- .../octane-form/tests/useField.test-d.tsx | 200 +- packages/octane-form/tests/useField.test.tsrx | 2975 +++++++++-------- packages/octane-form/tests/useForm.test-d.tsx | 310 +- packages/octane-form/tests/useForm.test.tsrx | 2301 +++++++------ .../octane-form/tests/useFormGroup.test-d.tsx | 764 +++-- .../octane-form/tests/useFormGroup.test.tsrx | 701 ++-- packages/octane-form/tests/utils.ts | 6 +- 25 files changed, 8496 insertions(+), 10125 deletions(-) diff --git a/packages/octane-form/src/createFormHook.tsrx b/packages/octane-form/src/createFormHook.tsrx index f48909d32..efcfc4b9e 100644 --- a/packages/octane-form/src/createFormHook.tsrx +++ b/packages/octane-form/src/createFormHook.tsrx @@ -1,30 +1,30 @@ -import { createContext, useContext, useMemo } from 'octane' -import { useForm } from './useForm.tsrx' -import { useFieldGroup } from './useFieldGroup.tsrx' +import { createContext, useContext, useMemo } from 'octane'; +import { useForm } from './useForm.tsrx'; +import { useFieldGroup } from './useFieldGroup.tsrx'; import type { - AnyFieldApi, - AnyFormApi, - BaseFormOptions, - DeepKeysOfType, - FieldApi, - FieldsMap, - FormAsyncValidateOrFn, - FormOptions, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { Context } from 'octane' -import type { FieldComponent } from './useField.tsrx' -import type { OctaneFormExtendedApi } from './useForm.tsrx' -import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx' - -type HookRenderable = unknown -type HookPropsWithChildren

= P & { children?: HookRenderable } -type HookFunctionComponent

= (props: P) => HookRenderable -type HookComponentType

= HookFunctionComponent

+ AnyFieldApi, + AnyFormApi, + BaseFormOptions, + DeepKeysOfType, + FieldApi, + FieldsMap, + FormAsyncValidateOrFn, + FormOptions, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { Context } from 'octane'; +import type { FieldComponent } from './useField.tsrx'; +import type { OctaneFormExtendedApi } from './useForm.tsrx'; +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; + +type HookRenderable = unknown; +type HookPropsWithChildren

= P & { children?: HookRenderable }; +type HookFunctionComponent

= (props: P) => HookRenderable; +type HookComponentType

= HookFunctionComponent

; // We should never hit the `null` case here -const fieldContext = createContext(null as never) -const formContext = createContext(null as never) +const fieldContext = createContext(null as never); +const formContext = createContext(null as never); /** * TypeScript inferencing is weird. @@ -56,738 +56,812 @@ const formContext = createContext(null as never) * Here, we are checking if the passed type `T` extends `DefaultT` and **only** * `DefaultT`, as if that's the case we assume that inferencing has not occurred. */ -type UnwrapOrAny = [unknown] extends [T] ? any : T -type UnwrapDefaultOrAny = - [DefaultT] extends [T] ? [T] extends [DefaultT] ? any : T : T +type UnwrapOrAny = [unknown] extends [T] ? any : T; +type UnwrapDefaultOrAny = [DefaultT] extends [T] + ? [T] extends [DefaultT] + ? any + : T + : T; function useFormContext() { - const form = useContext(formContext) - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!form) { - throw new Error('`formContext` only works when within a `formComponent` passed to `createFormHook`') - } - - return form as - OctaneFormExtendedApi< - // If you need access to the form data, you need to use `withForm` instead - Record, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > + const form = useContext(formContext); + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!form) { + throw new Error( + '`formContext` only works when within a `formComponent` passed to `createFormHook`', + ); + } + + return form as OctaneFormExtendedApi< + // If you need access to the form data, you need to use `withForm` instead + Record, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + >; } export function createFormHookContexts() { - function useFieldContext() { - const field = useContext(fieldContext) - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!field) { - throw new Error('`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`') - } - - return field as FieldApi< - any, - string, - TData, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > - } - - return { fieldContext, useFieldContext, useFormContext, formContext } + function useFieldContext() { + const field = useContext(fieldContext); + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!field) { + throw new Error( + '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`', + ); + } + + return field as FieldApi< + any, + string, + TData, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + >; + } + + return { fieldContext, useFieldContext, useFormContext, formContext }; } interface CreateFormHookProps< - TFieldComponents extends Record>, - TFormComponents extends Record>, + TFieldComponents extends Record>, + TFormComponents extends Record>, > { - fieldComponents: TFieldComponents - fieldContext: Context - formComponents: TFormComponents - formContext: Context + fieldComponents: TFieldComponents; + fieldContext: Context; + formComponents: TFormComponents; + formContext: Context; } /** * @private */ export type AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = - OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > & NoInfer & { - AppField: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - NoInfer - >; - AppForm: HookComponentType< - // Keep children optional in the renderer-facing component props. - HookPropsWithChildren<{}> - >; - } + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + NoInfer + >; + AppForm: HookComponentType< + // Keep children optional in the renderer-facing component props. + HookPropsWithChildren<{}> + >; + }; export interface WithFormProps< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TRenderProps extends object = Record, + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TRenderProps extends object = Record, > extends FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta > { - // Optional, but adds props to the `render` function outside of `form` - props?: TRenderProps - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - form: AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TFieldComponents, - TFormComponents - >; - } - > - > + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps; + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + form: AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + >; } export interface WithFieldGroupProps< - TFieldGroupData, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta, - TRenderProps extends object = Record, + TFieldGroupData, + TFieldComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta, + TRenderProps extends object = Record, > extends BaseFormOptions { - // Optional, but adds props to the `render` function outside of `form` - props?: TRenderProps - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - group: AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFieldGroupData, - string | FieldsMap, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - // this types it as 'never' in the render prop. It should prevent any - // untyped meta passed to the handleSubmit by accident. - unknown extends TSubmitMeta ? never : TSubmitMeta, - TFieldComponents, - TFormComponents - >; - } - > - > + // Optional, but adds props to the `render` function outside of `form` + props?: TRenderProps; + render: HookFunctionComponent< + HookPropsWithChildren< + NoInfer & { + group: AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFieldGroupData, + string | FieldsMap, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + // this types it as 'never' in the render prop. It should prevent any + // untyped meta passed to the handleSubmit by accident. + unknown extends TSubmitMeta ? never : TSubmitMeta, + TFieldComponents, + TFormComponents + >; + } + > + >; } type UseAppForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = - (props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +>; type WithForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = - (props: WithFormProps< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents, - TRenderProps - >) => WithFormProps< - UnwrapOrAny, - UnwrapDefaultOrAny, TOnMount>, - UnwrapDefaultOrAny, TOnChange>, - UnwrapDefaultOrAny, TOnChangeAsync>, - UnwrapDefaultOrAny, TOnBlur>, - UnwrapDefaultOrAny, TOnBlurAsync>, - UnwrapDefaultOrAny, TOnSubmit>, - UnwrapDefaultOrAny, TOnSubmitAsync>, - UnwrapDefaultOrAny, TOnDynamic>, - UnwrapDefaultOrAny< - undefined | FormValidateOrFn, - TOnDynamicAsync - >, - UnwrapDefaultOrAny, TOnServer>, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny - >['render'] + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, +>( + props: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >, +) => WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny, TOnDynamicAsync>, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny +>['render']; type WithFieldGroup< - TComponents extends Record>, - TFormComponents extends Record>, -> = - (props: WithFieldGroupProps< - TFieldGroupData, - TComponents, - TFormComponents, - TSubmitMeta, - TRenderProps - >) => (params: HookPropsWithChildren< - NoInfer & { - form: | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - } - >) => ReturnType + TComponents extends Record>, + TFormComponents extends Record>, +> = ( + props: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >, +) => < + TFormData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TFormSubmitMeta, +>( + params: HookPropsWithChildren< + NoInfer & { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >, +) => ReturnType; type UseTypedAppFormContext< - TComponents extends Record>, - TFormComponents extends Record>, -> = - (props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - -type FieldComponentExtension< - TComponents extends Record>, -> = - Record< - string, - HookComponentType - > & { [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' } - -type FormComponentExtension< - TComponents extends Record>, -> = - Record< - string, - HookComponentType - > & { [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form' } + TComponents extends Record>, + TFormComponents extends Record>, +> = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +>( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, +) => AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents +>; + +type FieldComponentExtension>> = + Record> & { + [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; + }; + +type FormComponentExtension>> = + Record> & { + [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; + }; export interface CreateFormHookReturn< - TComponents extends Record>, - TFormComponents extends Record>, + TComponents extends Record>, + TFormComponents extends Record>, > { - useAppForm: UseAppForm - withForm: WithForm - withFieldGroup: WithFieldGroup - useTypedAppFormContext: UseTypedAppFormContext - extendForm: (extension: { - fieldComponents?: TNewField; - formComponents?: TNewForm; - }) => CreateFormHookReturn< - TComponents & TNewField, - TFormComponents & TNewForm - > + useAppForm: UseAppForm; + withForm: WithForm; + withFieldGroup: WithFieldGroup; + useTypedAppFormContext: UseTypedAppFormContext; + extendForm: < + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }) => CreateFormHookReturn; } export function createFormHook< - TComponents extends Record>, - TFormComponents extends Record>, + TComponents extends Record>, + TFormComponents extends Record>, >({ - fieldComponents, - fieldContext, - formContext, - formComponents, + fieldComponents, + fieldContext, + formContext, + formComponents, }: CreateFormHookProps): CreateFormHookReturn< - TComponents, - TFormComponents + TComponents, + TFormComponents > { - const FieldContextProvider = fieldContext - const FormContextProvider = formContext - - function useAppForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ): AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > { - const form = useForm(props) - - // Keep children optional in the renderer-facing component props. - const AppForm = useMemo>>( - () => { - return ({ children }) => { - return {children} - } - }, - [form], - ) - - const AppField = useMemo(() => { - const AppField = (({ children, ...props }) => { - return - {(field) => - {children( - Object.assign(field, fieldComponents), - )}} - - }) as FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents - > - return AppField - }, [form]) - - const extendedForm = useMemo(() => { - return Object.assign(form, { - AppField, - AppForm, - ...formComponents, - }) - }, [form, AppField, AppForm]) - - return extendedForm - } - - function withForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TRenderProps extends object = {}, - >({ render, props }: WithFormProps< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents, - TRenderProps - >): WithFormProps< - UnwrapOrAny, - UnwrapDefaultOrAny, TOnMount>, - UnwrapDefaultOrAny, TOnChange>, - UnwrapDefaultOrAny, TOnChangeAsync>, - UnwrapDefaultOrAny, TOnBlur>, - UnwrapDefaultOrAny, TOnBlurAsync>, - UnwrapDefaultOrAny, TOnSubmit>, - UnwrapDefaultOrAny, TOnSubmitAsync>, - UnwrapDefaultOrAny, TOnDynamic>, - UnwrapDefaultOrAny< - undefined | FormValidateOrFn, - TOnDynamicAsync - >, - UnwrapDefaultOrAny, TOnServer>, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny - >['render'] { - return function Render(innerProps) { - return render({ ...props, ...innerProps }) - } - } - - function withFieldGroup< - TFieldGroupData, - TSubmitMeta, - TRenderProps extends object = {}, - >({ render, props, defaultValues }: WithFieldGroupProps< - TFieldGroupData, - TComponents, - TFormComponents, - TSubmitMeta, - TRenderProps - >): (params: HookPropsWithChildren< - NoInfer & { - form: | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - // Since this only occurs if you nest it within other field groups, it can be more - // lenient with the types. - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - } - >) => ReturnType { - return function Render(innerProps) { - const fieldGroupProps = useMemo(() => { - return { - form: innerProps.form, - fields: innerProps.fields, - defaultValues, - formComponents, - } - }, [innerProps.form, innerProps.fields]) - const fieldGroupApi = useFieldGroup(fieldGroupProps as any) - - return render({ ...props, ...innerProps, group: fieldGroupApi as any }) - } - } - - /** - * ⚠️ **Use withForm whenever possible.** - * - * Gets a typed form from the `` context. - */ - function useTypedAppFormContext< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - _props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ): AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > { - const form = useFormContext() - - return form as never - } - - function extendForm< - TNewField extends FieldComponentExtension, - TNewForm extends FormComponentExtension, - >(extension: { - fieldComponents?: TNewField; - formComponents?: TNewForm; - }): CreateFormHookReturn< - TComponents & TNewField, - TFormComponents & TNewForm - > { - return createFormHook({ - fieldContext, - formContext, - fieldComponents: { - ...fieldComponents, - ...extension.fieldComponents, - } as TComponents & TNewField, - formComponents: { - ...formComponents, - ...extension.formComponents, - } as TFormComponents & TNewForm, - }) - } - - return { - useAppForm, - withForm, - withFieldGroup, - useTypedAppFormContext, - extendForm, - } as CreateFormHookReturn + const FieldContextProvider = fieldContext; + const FormContextProvider = formContext; + + function useAppForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useForm(props); + + // Keep children optional in the renderer-facing component props. + const AppForm = useMemo>>(() => { + return ({ children }) => { + return {children}; + }; + }, [form]); + + const AppField = useMemo(() => { + const AppField = (({ children, ...props }) => { + return ( + + {(field) => ( + + {children(Object.assign(field, fieldComponents))} + + )} + + ); + }) as FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents + >; + return AppField; + }, [form]); + + const extendedForm = useMemo(() => { + return Object.assign(form, { + AppField, + AppForm, + ...formComponents, + }); + }, [form, AppField, AppForm]); + + return extendedForm; + } + + function withForm< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TRenderProps extends object = {}, + >({ + render, + props, + }: WithFormProps< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents, + TRenderProps + >): WithFormProps< + UnwrapOrAny, + UnwrapDefaultOrAny, TOnMount>, + UnwrapDefaultOrAny, TOnChange>, + UnwrapDefaultOrAny, TOnChangeAsync>, + UnwrapDefaultOrAny, TOnBlur>, + UnwrapDefaultOrAny, TOnBlurAsync>, + UnwrapDefaultOrAny, TOnSubmit>, + UnwrapDefaultOrAny, TOnSubmitAsync>, + UnwrapDefaultOrAny, TOnDynamic>, + UnwrapDefaultOrAny, TOnDynamicAsync>, + UnwrapDefaultOrAny, TOnServer>, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny, + UnwrapOrAny + >['render'] { + return function Render(innerProps) { + return render({ ...props, ...innerProps }); + }; + } + + function withFieldGroup({ + render, + props, + defaultValues, + }: WithFieldGroupProps< + TFieldGroupData, + TComponents, + TFormComponents, + TSubmitMeta, + TRenderProps + >): < + TFormData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TFormSubmitMeta, + >( + params: HookPropsWithChildren< + NoInfer & { + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other field groups, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + } + >, + ) => ReturnType { + return function Render(innerProps) { + const fieldGroupProps = useMemo(() => { + return { + form: innerProps.form, + fields: innerProps.fields, + defaultValues, + formComponents, + }; + }, [innerProps.form, innerProps.fields]); + const fieldGroupApi = useFieldGroup(fieldGroupProps as any); + + return render({ ...props, ...innerProps, group: fieldGroupApi as any }); + }; + } + + /** + * ⚠️ **Use withForm whenever possible.** + * + * Gets a typed form from the `` context. + */ + function useTypedAppFormContext< + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + _props: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ): AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > { + const form = useFormContext(); + + return form as never; + } + + function extendForm< + TNewField extends FieldComponentExtension, + TNewForm extends FormComponentExtension, + >(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }): CreateFormHookReturn { + return createFormHook({ + fieldContext, + formContext, + fieldComponents: { + ...fieldComponents, + ...extension.fieldComponents, + } as TComponents & TNewField, + formComponents: { + ...formComponents, + ...extension.formComponents, + } as TFormComponents & TNewForm, + }); + } + + return { + useAppForm, + withForm, + withFieldGroup, + useTypedAppFormContext, + extendForm, + } as CreateFormHookReturn; } diff --git a/packages/octane-form/src/createFormHook.tsrx.d.ts b/packages/octane-form/src/createFormHook.tsrx.d.ts index 36834eaa4..992a00121 100644 --- a/packages/octane-form/src/createFormHook.tsrx.d.ts +++ b/packages/octane-form/src/createFormHook.tsrx.d.ts @@ -1,25 +1,15 @@ // Declaration companion generated from createFormHook.tsrx. -import type { - AnyFieldApi, - AnyFormApi, - BaseFormOptions, - DeepKeysOfType, - FieldApi, - FieldsMap, - FormAsyncValidateOrFn, - FormOptions, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { Context } from 'octane' -import type { FieldComponent } from './useField.tsrx' -import type { OctaneFormExtendedApi } from './useForm.tsrx' -import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx' -type HookRenderable = unknown +import type { AnyFieldApi, AnyFormApi, BaseFormOptions, DeepKeysOfType, FieldApi, FieldsMap, FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core'; +import type { Context } from 'octane'; +import type { FieldComponent } from './useField.tsrx'; +import type { OctaneFormExtendedApi } from './useForm.tsrx'; +import type { AppFieldExtendedOctaneFieldGroupApi } from './useFieldGroup.tsrx'; +type HookRenderable = unknown; type HookPropsWithChildren

= P & { - children?: HookRenderable -} -type HookFunctionComponent

= (props: P) => HookRenderable -type HookComponentType

= HookFunctionComponent

+ children?: HookRenderable; +}; +type HookFunctionComponent

= (props: P) => HookRenderable; +type HookComponentType

= HookFunctionComponent

; /** * TypeScript inferencing is weird. * @@ -50,456 +40,62 @@ type HookComponentType

= HookFunctionComponent

* Here, we are checking if the passed type `T` extends `DefaultT` and **only** * `DefaultT`, as if that's the case we assume that inferencing has not occurred. */ -type UnwrapOrAny = [unknown] extends [T] ? any : T -type UnwrapDefaultOrAny = [DefaultT] extends [T] - ? [T] extends [DefaultT] - ? any - : T - : T -declare function useFormContext(): OctaneFormExtendedApi< - Record, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any -> +type UnwrapOrAny = [unknown] extends [T] ? any : T; +type UnwrapDefaultOrAny = [DefaultT] extends [T] ? [T] extends [DefaultT] ? any : T : T; +declare function useFormContext(): OctaneFormExtendedApi, any, any, any, any, any, any, any, any, any, any, any>; export declare function createFormHookContexts(): { - fieldContext: Context - useFieldContext: () => FieldApi< - any, - string, - TData, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > - useFormContext: typeof useFormContext - formContext: Context -} -interface CreateFormHookProps< - TFieldComponents extends Record>, - TFormComponents extends Record>, -> { - fieldComponents: TFieldComponents - fieldContext: Context - formComponents: TFormComponents - formContext: Context + fieldContext: Context; + useFieldContext: () => FieldApi; + useFormContext: typeof useFormContext; + formContext: Context; +}; +interface CreateFormHookProps>, TFormComponents extends Record>> { + fieldComponents: TFieldComponents; + fieldContext: Context; + formComponents: TFormComponents; + formContext: Context; } /** * @private */ -export type AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - NoInfer & { - AppField: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - NoInfer - > - AppForm: HookComponentType> - } -export interface WithFormProps< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TRenderProps extends object = Record, -> extends FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> { - props?: TRenderProps - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - form: AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TFieldComponents, - TFormComponents - > - } - > - > -} -export interface WithFieldGroupProps< - TFieldGroupData, - TFieldComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta, - TRenderProps extends object = Record, -> extends BaseFormOptions { - props?: TRenderProps - render: HookFunctionComponent< - HookPropsWithChildren< - NoInfer & { - group: AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFieldGroupData, - string | FieldsMap, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - unknown extends TSubmitMeta ? never : TSubmitMeta, - TFieldComponents, - TFormComponents - > - } - > - > -} -type UseAppForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, ->( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, -) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents -> -type WithForm< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TRenderProps extends object = {}, ->( - props: WithFormProps< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents, - TRenderProps - >, -) => WithFormProps< - UnwrapOrAny, - UnwrapDefaultOrAny, TOnMount>, - UnwrapDefaultOrAny, TOnChange>, - UnwrapDefaultOrAny, TOnChangeAsync>, - UnwrapDefaultOrAny, TOnBlur>, - UnwrapDefaultOrAny, TOnBlurAsync>, - UnwrapDefaultOrAny, TOnSubmit>, - UnwrapDefaultOrAny, TOnSubmitAsync>, - UnwrapDefaultOrAny, TOnDynamic>, - UnwrapDefaultOrAny, TOnDynamicAsync>, - UnwrapDefaultOrAny, TOnServer>, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny, - UnwrapOrAny ->['render'] -type WithFieldGroup< - TComponents extends Record>, - TFormComponents extends Record>, -> = ( - props: WithFieldGroupProps< - TFieldGroupData, - TComponents, - TFormComponents, - TSubmitMeta, - TRenderProps - >, -) => < - TFormData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TFormSubmitMeta, ->( - params: HookPropsWithChildren< - NoInfer & { - form: - | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, - TComponents, - TFormComponents - > - fields: TFields - } - >, -) => ReturnType -type UseTypedAppFormContext< - TComponents extends Record>, - TFormComponents extends Record>, -> = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, ->( - props: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, -) => AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents -> -type FieldComponentExtension< - TComponents extends Record>, -> = Record> & { - [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' +export type AppFieldExtendedOctaneFormApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = OctaneFormExtendedApi & NoInfer & { + AppField: FieldComponent>; + AppForm: HookComponentType>; +}; +export interface WithFormProps, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>, TRenderProps extends object = Record> extends FormOptions { + props?: TRenderProps; + render: HookFunctionComponent & { + form: AppFieldExtendedOctaneFormApi; + }>>; } -type FormComponentExtension< - TComponents extends Record>, -> = Record> & { - [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form' +export interface WithFieldGroupProps>, TFormComponents extends Record>, TSubmitMeta, TRenderProps extends object = Record> extends BaseFormOptions { + props?: TRenderProps; + render: HookFunctionComponent & { + group: AppFieldExtendedOctaneFieldGroupApi, undefined | FormValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, unknown extends TSubmitMeta ? never : TSubmitMeta, TFieldComponents, TFormComponents>; + }>>; } -export interface CreateFormHookReturn< - TComponents extends Record>, - TFormComponents extends Record>, -> { - useAppForm: UseAppForm - withForm: WithForm - withFieldGroup: WithFieldGroup - useTypedAppFormContext: UseTypedAppFormContext - extendForm: < - TNewField extends FieldComponentExtension, - TNewForm extends FormComponentExtension, - >(extension: { - fieldComponents?: TNewField - formComponents?: TNewForm - }) => CreateFormHookReturn< - TComponents & TNewField, - TFormComponents & TNewForm - > +type UseAppForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; +type WithForm>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TRenderProps extends object = {}>(props: WithFormProps) => WithFormProps, UnwrapDefaultOrAny, TOnMount>, UnwrapDefaultOrAny, TOnChange>, UnwrapDefaultOrAny, TOnChangeAsync>, UnwrapDefaultOrAny, TOnBlur>, UnwrapDefaultOrAny, TOnBlurAsync>, UnwrapDefaultOrAny, TOnSubmit>, UnwrapDefaultOrAny, TOnSubmitAsync>, UnwrapDefaultOrAny, TOnDynamic>, UnwrapDefaultOrAny, TOnDynamicAsync>, UnwrapDefaultOrAny, TOnServer>, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny, UnwrapOrAny>['render']; +type WithFieldGroup>, TFormComponents extends Record>> = (props: WithFieldGroupProps) => | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TFormSubmitMeta>(params: HookPropsWithChildren & { + form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta, TComponents, TFormComponents>; + fields: TFields; +}>) => ReturnType; +type UseTypedAppFormContext>, TFormComponents extends Record>> = , TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(props: FormOptions) => AppFieldExtendedOctaneFormApi; +type FieldComponentExtension>> = Record> & { + [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form'; +}; +type FormComponentExtension>> = Record> & { + [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form'; +}; +export interface CreateFormHookReturn>, TFormComponents extends Record>> { + useAppForm: UseAppForm; + withForm: WithForm; + withFieldGroup: WithFieldGroup; + useTypedAppFormContext: UseTypedAppFormContext; + extendForm: , TNewForm extends FormComponentExtension>(extension: { + fieldComponents?: TNewField; + formComponents?: TNewForm; + }) => CreateFormHookReturn; } -export declare function createFormHook< - TComponents extends Record>, - TFormComponents extends Record>, ->({ - fieldComponents, - fieldContext, - formContext, - formComponents, -}: CreateFormHookProps): CreateFormHookReturn< - TComponents, - TFormComponents -> -export {} +export declare function createFormHook>, TFormComponents extends Record>>({ fieldComponents, fieldContext, formContext, formComponents, }: CreateFormHookProps): CreateFormHookReturn; +export {}; diff --git a/packages/octane-form/src/index.ts b/packages/octane-form/src/index.ts index 25034e114..b01174176 100644 --- a/packages/octane-form/src/index.ts +++ b/packages/octane-form/src/index.ts @@ -1,11 +1,11 @@ -export * from '@tanstack/form-core' +export * from '@tanstack/form-core'; -export { useSelector } from '@tanstack/octane-store' +export { useSelector } from '@tanstack/octane-store'; -export * from './createFormHook.tsrx' -export * from './types' -export * from './useField.tsrx' -export * from './useFieldGroup.tsrx' -export * from './useForm.tsrx' -export * from './useFormGroup.tsrx' -export * from './useIsomorphicLayoutEffect' +export * from './createFormHook.tsrx'; +export * from './types'; +export * from './useField.tsrx'; +export * from './useFieldGroup.tsrx'; +export * from './useForm.tsrx'; +export * from './useFormGroup.tsrx'; +export * from './useIsomorphicLayoutEffect'; diff --git a/packages/octane-form/src/types.ts b/packages/octane-form/src/types.ts index 971a5692a..c552416c6 100644 --- a/packages/octane-form/src/types.ts +++ b/packages/octane-form/src/types.ts @@ -1,138 +1,122 @@ import type { - DeepKeys, - DeepValue, - FieldApiOptions, - FieldAsyncValidateOrFn, - FieldOptions, - FieldValidateOrFn, - FormAsyncValidateOrFn, - FormState, - FormValidateOrFn, -} from '@tanstack/form-core' + DeepKeys, + DeepValue, + FieldApiOptions, + FieldAsyncValidateOrFn, + FieldOptions, + FieldValidateOrFn, + FormAsyncValidateOrFn, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core'; interface FieldOptionsMode { - mode?: 'value' | 'array' + mode?: 'value' | 'array'; } /** * The field options. */ export interface UseFieldOptions< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, > - extends - FieldApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - >, - FieldOptionsMode {} + extends + FieldApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TSubmitMeta + >, + FieldOptionsMode {} export interface UseFieldOptionsBound< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, > - extends - FieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, - FieldOptionsMode {} + extends + FieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + FieldOptionsMode {} export type ServerFormState< - TFormData, - TOnServer extends undefined | FormAsyncValidateOrFn, + TFormData, + TOnServer extends undefined | FormAsyncValidateOrFn, > = Pick< - FormState< - TFormData, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - TOnServer - >, - 'values' | 'errors' | 'errorMap' -> + FormState< + TFormData, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + TOnServer + >, + 'values' | 'errors' | 'errorMap' +>; diff --git a/packages/octane-form/src/useField.tsrx b/packages/octane-form/src/useField.tsrx index ab83369d4..04d56be32 100644 --- a/packages/octane-form/src/useField.tsrx +++ b/packages/octane-form/src/useField.tsrx @@ -1,22 +1,22 @@ -import { useMemo, useState } from 'octane' -import { useSelector } from '@tanstack/octane-store' -import { FieldApi, functionalUpdate } from '@tanstack/form-core' -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' +import { useMemo, useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FieldApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; import type { - AnyFieldApi, - AnyFieldMeta, - DeepKeys, - DeepValue, - FieldAsyncValidateOrFn, - FieldValidateOrFn, - FieldValidators, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { UseFieldOptions, UseFieldOptionsBound } from './types' + AnyFieldApi, + AnyFieldMeta, + DeepKeys, + DeepValue, + FieldAsyncValidateOrFn, + FieldValidateOrFn, + FieldValidators, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { UseFieldOptions, UseFieldOptionsBound } from './types'; -type FieldRenderable = unknown -type FieldFunctionComponent

= (props: P) => FieldRenderable +type FieldRenderable = unknown; +type FieldFunctionComponent

= (props: P) => FieldRenderable; /** * A type representing a hook for using a field in a form with the given form data type. @@ -24,57 +24,70 @@ type FieldFunctionComponent

= (props: P) => FieldRenderable * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. */ export type UseField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, -> = - (opts: UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >) => FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>( + opts: UseFieldOptionsBound< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, +) => FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta +>; /** * A hook for managing a field in a form. @@ -83,466 +96,472 @@ export type UseField< * @returns The `FieldApi` instance for the specified field. */ export function useField< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, >( - opts: UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - >, + opts: UseFieldOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + >, ) { - // Keep a snapshot of options so compiler optimizations do not treat - // fieldApi as immutable. - const [prevOptions, setPrevOptions] = useState( - () => ({ - form: opts.form, - name: opts.name, - }), - ) + // Keep a snapshot of options so compiler optimizations do not treat + // fieldApi as immutable. + const [prevOptions, setPrevOptions] = useState(() => ({ + form: opts.form, + name: opts.name, + })); - const [fieldApiState, setFieldApi] = useState(() => { - return new FieldApi({ - ...opts, - }) - }) + const [fieldApiState, setFieldApi] = useState(() => { + return new FieldApi({ + ...opts, + }); + }); - let fieldApi = fieldApiState + let fieldApi = fieldApiState; - // We only want to - // update on name changes since those are at risk of becoming stale. The field - // state must be up to date for the internal JSX render. - // The other options can freely be in `fieldApi.update` - if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { - // Adjusting state during render: create the new FieldApi and use it for the - // rest of this render so the render prop reads state at the current `name`. - // Otherwise the discarded render still runs to completion with the stale - // instance, briefly surfacing `undefined` for shifted array items on removal. - // See: https://github.com/TanStack/form/issues/2238 - fieldApi = new FieldApi({ - ...opts, - }) - setFieldApi(fieldApi) - setPrevOptions({ form: opts.form, name: opts.name }) - } + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Adjusting state during render: create the new FieldApi and use it for the + // rest of this render so the render prop reads state at the current `name`. + // Otherwise the discarded render still runs to completion with the stale + // instance, briefly surfacing `undefined` for shifted array items on removal. + // See: https://github.com/TanStack/form/issues/2238 + fieldApi = new FieldApi({ + ...opts, + }); + setFieldApi(fieldApi); + setPrevOptions({ form: opts.form, name: opts.name }); + } - // For array mode, only track length changes to avoid re-renders when child properties change - // See: https://github.com/TanStack/form/issues/1925 - const reactiveStateValue = useSelector( - fieldApi.store, - (opts.mode === 'array' - ? (state) => state.meta._arrayVersion || 0 - : (state) => state.value) as (state: typeof fieldApi.state) => | TData - | number, - ) - const reactiveMetaIsTouched = useSelector( - fieldApi.store, - (state) => state.meta.isTouched, - ) - const reactiveMetaIsBlurred = useSelector( - fieldApi.store, - (state) => state.meta.isBlurred, - ) - const reactiveMetaIsDirty = useSelector( - fieldApi.store, - (state) => state.meta.isDirty, - ) - const reactiveMetaErrorMap = useSelector( - fieldApi.store, - (state) => state.meta.errorMap, - ) - const reactiveMetaErrorSourceMap = useSelector( - fieldApi.store, - (state) => state.meta.errorSourceMap, - ) - const reactiveMetaIsValidating = useSelector( - fieldApi.store, - (state) => state.meta.isValidating, - ) + // For array mode, only track length changes to avoid re-renders when child properties change + // See: https://github.com/TanStack/form/issues/1925 + const reactiveStateValue = useSelector( + fieldApi.store, + (opts.mode === 'array' ? (state) => state.meta._arrayVersion || 0 : (state) => state.value) as ( + state: typeof fieldApi.state, + ) => TData | number, + ); + const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched); + const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred); + const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty); + const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap); + const reactiveMetaErrorSourceMap = useSelector( + fieldApi.store, + (state) => state.meta.errorSourceMap, + ); + const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating); - // Materialize the reactive snapshots in the extended API returned to render callbacks. - const extendedFieldApi = useMemo(() => { - const reactiveFieldApi = { - ...fieldApi, - get state() { - return { - // For array mode, reactiveStateValue is the length (for reactivity tracking), - // so we need to get the actual value from fieldApi - value: opts.mode === 'array' - ? fieldApi.state.value - : reactiveStateValue, - get meta() { - return { - ...fieldApi.state.meta, - isTouched: reactiveMetaIsTouched, - isBlurred: reactiveMetaIsBlurred, - isDirty: reactiveMetaIsDirty, - errorMap: reactiveMetaErrorMap, - errorSourceMap: reactiveMetaErrorSourceMap, - isValidating: reactiveMetaIsValidating, - } satisfies AnyFieldMeta - }, - } satisfies AnyFieldApi['state'] - }, - } + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...fieldApi, + get state() { + return { + // For array mode, reactiveStateValue is the length (for reactivity tracking), + // so we need to get the actual value from fieldApi + value: opts.mode === 'array' ? fieldApi.state.value : reactiveStateValue, + get meta() { + return { + ...fieldApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + } satisfies AnyFieldMeta; + }, + } satisfies AnyFieldApi['state']; + }, + }; - const extendedApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > = reactiveFieldApi as never + const extendedApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > = reactiveFieldApi as never; - return extendedApi - }, [ - fieldApi, - opts.mode, - reactiveStateValue, - reactiveMetaIsTouched, - reactiveMetaIsBlurred, - reactiveMetaIsDirty, - reactiveMetaErrorMap, - reactiveMetaErrorSourceMap, - reactiveMetaIsValidating, - ]) + return extendedApi; + }, [ + fieldApi, + opts.mode, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + ]); - useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]) + useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]); - /** - * fieldApi.update should not have any side effects. Think of it like a `useRef` - * that we need to keep updated every render with the most up-to-date information. - */ - useIsomorphicLayoutEffect(() => { - fieldApi.update(opts) - }) + /** + * fieldApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + fieldApi.update(opts); + }); - return extendedFieldApi + return extendedFieldApi; } /** * @param children A render function that takes a field API instance and returns a renderable value. */ interface FieldComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, > extends UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta > { - children: (fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & ExtendedApi) => FieldRenderable + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable; } interface FieldComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, + ExtendedApi = {}, > extends UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync > { - children: (fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & ExtendedApi) => FieldRenderable + children: ( + fieldApi: FieldApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta + > & + ExtendedApi, + ) => FieldRenderable; } /** * A type alias representing a field component for a specific form data type. */ export type FieldComponent< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, -> = - ({ children, ...fieldOptions }: FieldComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta, - ExtendedApi - >) => ReturnType + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TPatentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: FieldComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta, + ExtendedApi +>) => ReturnType; /** * A type alias representing a field component for a form lens data type. */ -export type LensFieldComponent = - ({ children, ...fieldOptions }: Omit< - FieldComponentBoundProps< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi - >, - 'name' | 'validators' - > & { - name: TName; - validators?: Omit< - FieldValidators< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, - 'onChangeListenTo' | 'onBlurListenTo' - > & { - /** - * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes - */ - onChangeListenTo?: DeepKeys[]; - /** - * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes - */ - onBlurListenTo?: DeepKeys[]; - }; - }) => ReturnType +export type LensFieldComponent< + in out TLensData, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, +>({ + children, + ...fieldOptions +}: Omit< + FieldComponentBoundProps< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + undefined | FormValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormValidateOrFn, + undefined | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi + >, + 'name' | 'validators' +> & { + name: TName; + validators?: Omit< + FieldValidators< + unknown, + string, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync + >, + 'onChangeListenTo' | 'onBlurListenTo' + > & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[]; + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[]; + }; +}) => ReturnType; /** * A function component that takes field options and a render function as children. @@ -550,91 +569,88 @@ export type LensFieldComponent = * The `Field` component uses the `useField` hook internally to manage the field instance. */ export const Field = (< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, ->({ children, ...fieldOptions }: FieldComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FieldValidateOrFn, + TOnChange extends undefined | FieldValidateOrFn, + TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, + TOnBlur extends undefined | FieldValidateOrFn, + TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, + TOnSubmit extends undefined | FieldValidateOrFn, + TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, + TOnDynamic extends undefined | FieldValidateOrFn, + TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TPatentSubmitMeta, +>({ + children, + ...fieldOptions +}: FieldComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TPatentSubmitMeta >): ReturnType => { - const fieldApi = useField(fieldOptions as any) + const fieldApi = useField(fieldOptions as any); - const jsxToDisplay = useMemo( - () => functionalUpdate(children, fieldApi as any), - [children, fieldApi], - ) - return <> - {jsxToDisplay} - as never + const jsxToDisplay = useMemo( + () => functionalUpdate(children, fieldApi as any), + [children, fieldApi], + ); + return (<>{jsxToDisplay}) as never; }) satisfies FieldFunctionComponent< - FieldComponentProps< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > -> + FieldComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +>; diff --git a/packages/octane-form/src/useField.tsrx.d.ts b/packages/octane-form/src/useField.tsrx.d.ts index cbba2d111..6e8256694 100644 --- a/packages/octane-form/src/useField.tsrx.d.ts +++ b/packages/octane-form/src/useField.tsrx.d.ts @@ -1,574 +1,55 @@ // Declaration companion generated from useField.tsrx. -import { FieldApi } from '@tanstack/form-core' -import type { - DeepKeys, - DeepValue, - FieldAsyncValidateOrFn, - FieldValidateOrFn, - FieldValidators, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { UseFieldOptions, UseFieldOptionsBound } from './types' -type FieldRenderable = unknown -type FieldFunctionComponent

= (props: P) => FieldRenderable +import { FieldApi } from '@tanstack/form-core'; +import type { DeepKeys, DeepValue, FieldAsyncValidateOrFn, FieldValidateOrFn, FieldValidators, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +import type { UseFieldOptions, UseFieldOptionsBound } from './types'; +type FieldRenderable = unknown; +type FieldFunctionComponent

= (props: P) => FieldRenderable; /** * A type representing a hook for using a field in a form with the given form data type. * * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field. */ -export type UseField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, ->( - opts: UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, -) => FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta -> +export type UseField, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>(opts: UseFieldOptionsBound) => FieldApi; /** * A hook for managing a field in a form. * @param opts An object with field options. * * @returns The `FieldApi` instance for the specified field. */ -export declare function useField< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, ->( - opts: UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - >, -): FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta -> +export declare function useField, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>(opts: UseFieldOptions): FieldApi; /** * @param children A render function that takes a field API instance and returns a renderable value. */ -interface FieldComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, -> extends UseFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta -> { - children: ( - fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & - ExtendedApi, - ) => FieldRenderable +interface FieldComponentProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptions { + children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; } -interface FieldComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, - ExtendedApi = {}, -> extends UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync -> { - children: ( - fieldApi: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > & - ExtendedApi, - ) => FieldRenderable +interface FieldComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta, ExtendedApi = {}> extends UseFieldOptionsBound { + children: (fieldApi: FieldApi & ExtendedApi) => FieldRenderable; } /** * A type alias representing a field component for a specific form data type. */ -export type FieldComponent< - in out TParentData, - in out TFormOnMount extends undefined | FormValidateOrFn, - in out TFormOnChange extends undefined | FormValidateOrFn, - in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnBlur extends undefined | FormValidateOrFn, - in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnSubmit extends undefined | FormValidateOrFn, - in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnDynamic extends undefined | FormValidateOrFn, - in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnServer extends undefined | FormAsyncValidateOrFn, - in out TPatentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, ->({ - children, - ...fieldOptions -}: FieldComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta, - ExtendedApi ->) => ReturnType +export type FieldComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: FieldComponentBoundProps) => ReturnType; /** * A type alias representing a field component for a form lens data type. */ -export type LensFieldComponent< - in out TLensData, - in out TParentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, ->({ - children, - ...fieldOptions -}: Omit< - FieldComponentBoundProps< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - undefined | FormValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormValidateOrFn, - undefined | FormAsyncValidateOrFn, - undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi - >, - 'name' | 'validators' -> & { - name: TName - validators?: Omit< - FieldValidators< - unknown, - string, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, - 'onChangeListenTo' | 'onBlurListenTo' - > & { - /** - * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes - */ - onChangeListenTo?: DeepKeys[] - /** - * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes - */ - onBlurListenTo?: DeepKeys[] - } -}) => ReturnType +export type LensFieldComponent = , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn>({ children, ...fieldOptions }: Omit, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormValidateOrFn, undefined | FormAsyncValidateOrFn, undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi>, 'name' | 'validators'> & { + name: TName; + validators?: Omit, 'onChangeListenTo' | 'onBlurListenTo'> & { + /** + * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes + */ + onChangeListenTo?: DeepKeys[]; + /** + * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes + */ + onBlurListenTo?: DeepKeys[]; + }; +}) => ReturnType; /** * A function component that takes field options and a render function as children. * * The `Field` component uses the `useField` hook internally to manage the field instance. */ -export declare const Field: < - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, ->({ - children, - ...fieldOptions -}: FieldComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta ->) => ReturnType -export {} +export declare const Field: , TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TPatentSubmitMeta>({ children, ...fieldOptions }: FieldComponentProps) => ReturnType; +export {}; diff --git a/packages/octane-form/src/useFieldGroup.tsrx b/packages/octane-form/src/useFieldGroup.tsrx index 1d0200760..46d73f148 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx +++ b/packages/octane-form/src/useFieldGroup.tsrx @@ -1,269 +1,252 @@ -import { useState } from 'octane' -import { useSelector } from '@tanstack/octane-store' -import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core' -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' +import { useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; import type { - AnyFieldGroupApi, - DeepKeysOfType, - FieldGroupState, - FieldsMap, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx' -import type { LensFieldComponent } from './useField.tsrx' + AnyFieldGroupApi, + DeepKeysOfType, + FieldGroupState, + FieldsMap, + FormAsyncValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; +import type { LensFieldComponent } from './useField.tsrx'; -type FieldGroupRenderable = unknown -type FieldGroupPropsWithChildren

= - P & { children?: FieldGroupRenderable } -type FieldGroupFunctionComponent

= - (props: P) => FieldGroupRenderable -type FieldGroupComponentType

= FieldGroupFunctionComponent

+type FieldGroupRenderable = unknown; +type FieldGroupPropsWithChildren

= P & { children?: FieldGroupRenderable }; +type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; +type FieldGroupComponentType

= FieldGroupFunctionComponent

; function LocalSubscribe({ - lens, - selector = (state) => state, - children, + lens, + selector = (state) => state, + children, }: FieldGroupPropsWithChildren<{ - lens: AnyFieldGroupApi; - selector?: (state: FieldGroupState) => FieldGroupState; + lens: AnyFieldGroupApi; + selector?: (state: FieldGroupState) => FieldGroupState; }>): ReturnType { - const data = useSelector(lens.store, selector) + const data = useSelector(lens.store, selector); - return <> - {functionalUpdate(children, data)} - + return <>{functionalUpdate(children, data)}; } /** * @private */ export type AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields extends | DeepKeysOfType< - TFormData, - TFieldGroupData | null | undefined - > - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = - FieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > & NoInfer & { - AppField: LensFieldComponent< - TFieldGroupData, - TSubmitMeta, - NoInfer - >; - AppForm: FieldGroupComponentType>; - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: LensFieldComponent; - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: (props: { - selector?: (state: NoInfer< - FieldGroupState - >) => TSelected; - children: | ((state: NoInfer) => FieldGroupRenderable) - | FieldGroupRenderable; - }) => ReturnType; - } + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + TFieldComponents extends Record>, + TFormComponents extends Record>, +> = FieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + NoInfer & { + AppField: LensFieldComponent>; + AppForm: FieldGroupComponentType>; + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: LensFieldComponent; + + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: >>(props: { + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; + }) => ReturnType; + }; export function useFieldGroup< - TFormData, - TFieldGroupData, - TFields extends | DeepKeysOfType< - TFormData, - TFieldGroupData | null | undefined - > - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta = never, + TFormData, + TFieldGroupData, + TFields extends + | DeepKeysOfType + | FieldsMap, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TComponents extends Record>, + TFormComponents extends Record>, + TSubmitMeta = never, >(opts: { - form: | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - // Since this only occurs if you nest it within other form lenses, it can be more - // lenient with the types. - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - TSubmitMeta, - TComponents, - TFormComponents - >; - fields: TFields; - defaultValues?: TFieldGroupData; - onSubmitMeta?: TSubmitMeta; - formComponents: TFormComponents; + form: + | AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > + | AppFieldExtendedOctaneFieldGroupApi< + // Since this only occurs if you nest it within other form lenses, it can be more + // lenient with the types. + unknown, + TFormData, + string | FieldsMap, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + TSubmitMeta, + TComponents, + TFormComponents + >; + fields: TFields; + defaultValues?: TFieldGroupData; + onSubmitMeta?: TSubmitMeta; + formComponents: TFormComponents; }): AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents > { - const [formLensApi] = useState(() => { - const api = new FieldGroupApi(opts) - const form = - opts.form instanceof FieldGroupApi - ? opts.form.form as AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - : opts.form + const [formLensApi] = useState(() => { + const api = new FieldGroupApi(opts); + const form = + opts.form instanceof FieldGroupApi + ? (opts.form.form as AppFieldExtendedOctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + >) + : opts.form; - const extendedApi: AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > = api as never + const extendedApi: AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + > = api as never; - extendedApi.AppForm = function AppForm(appFormProps) { - return - } + extendedApi.AppForm = function AppForm(appFormProps) { + return ; + }; - extendedApi.AppField = function AppField(props) { - return - } + extendedApi.AppField = function AppField(props) { + return ; + }; - extendedApi.Field = function Field(props) { - return - } + extendedApi.Field = function Field(props) { + return ; + }; - extendedApi.Subscribe = function Subscribe(props: any) { - return - } + extendedApi.Subscribe = function Subscribe(props: any) { + return ( + + ); + }; - return Object.assign(extendedApi, { - ...opts.formComponents, - }) as AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - }) + return Object.assign(extendedApi, { + ...opts.formComponents, + }) as AppFieldExtendedOctaneFieldGroupApi< + TFormData, + TFieldGroupData, + TFields, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta, + TComponents, + TFormComponents + >; + }); - useIsomorphicLayoutEffect(formLensApi.mount, [formLensApi]) + useIsomorphicLayoutEffect(formLensApi.mount, [formLensApi]); - return formLensApi + return formLensApi; } diff --git a/packages/octane-form/src/useFieldGroup.tsrx.d.ts b/packages/octane-form/src/useFieldGroup.tsrx.d.ts index 74b957d8f..99a2340d2 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFieldGroup.tsrx.d.ts @@ -1,156 +1,37 @@ // Declaration companion generated from useFieldGroup.tsrx. -import { FieldGroupApi } from '@tanstack/form-core' -import type { - DeepKeysOfType, - FieldGroupState, - FieldsMap, - FormAsyncValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx' -import type { LensFieldComponent } from './useField.tsrx' -type FieldGroupRenderable = unknown +import { FieldGroupApi } from '@tanstack/form-core'; +import type { DeepKeysOfType, FieldGroupState, FieldsMap, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; +import type { LensFieldComponent } from './useField.tsrx'; +type FieldGroupRenderable = unknown; type FieldGroupPropsWithChildren

= P & { - children?: FieldGroupRenderable -} -type FieldGroupFunctionComponent

= ( - props: P, -) => FieldGroupRenderable -type FieldGroupComponentType

= FieldGroupFunctionComponent

+ children?: FieldGroupRenderable; +}; +type FieldGroupFunctionComponent

= (props: P) => FieldGroupRenderable; +type FieldGroupComponentType

= FieldGroupFunctionComponent

; /** * @private */ -export type AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - TFieldComponents extends Record>, - TFormComponents extends Record>, -> = FieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - NoInfer & { - AppField: LensFieldComponent< - TFieldGroupData, - TSubmitMeta, - NoInfer - > - AppForm: FieldGroupComponentType> +export type AppFieldExtendedOctaneFieldGroupApi | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta, TFieldComponents extends Record>, TFormComponents extends Record>> = FieldGroupApi & NoInfer & { + AppField: LensFieldComponent>; + AppForm: FieldGroupComponentType>; /** * A component to render form fields. With this, you can render and manage individual form fields. */ - Field: LensFieldComponent + Field: LensFieldComponent; /** * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. */ Subscribe: >>(props: { - selector?: (state: NoInfer>) => TSelected - children: - | ((state: NoInfer) => FieldGroupRenderable) - | FieldGroupRenderable - }) => ReturnType - } -export declare function useFieldGroup< - TFormData, - TFieldGroupData, - TFields extends - | DeepKeysOfType - | FieldsMap, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TComponents extends Record>, - TFormComponents extends Record>, - TSubmitMeta = never, ->(opts: { - form: - | AppFieldExtendedOctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents - > - | AppFieldExtendedOctaneFieldGroupApi< - unknown, - TFormData, - string | FieldsMap, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - TSubmitMeta, - TComponents, - TFormComponents - > - fields: TFields - defaultValues?: TFieldGroupData - onSubmitMeta?: TSubmitMeta - formComponents: TFormComponents -}): AppFieldExtendedOctaneFieldGroupApi< - TFormData, - TFieldGroupData, - TFields, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta, - TComponents, - TFormComponents -> -export {} + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; + }) => ReturnType; +}; +export declare function useFieldGroup | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TComponents extends Record>, TFormComponents extends Record>, TSubmitMeta = never>(opts: { + form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, TSubmitMeta, TComponents, TFormComponents>; + fields: TFields; + defaultValues?: TFieldGroupData; + onSubmitMeta?: TSubmitMeta; + formComponents: TFormComponents; +}): AppFieldExtendedOctaneFieldGroupApi; +export {}; diff --git a/packages/octane-form/src/useForm.tsrx b/packages/octane-form/src/useForm.tsrx index 6852ea5ef..005e0ae62 100644 --- a/packages/octane-form/src/useForm.tsrx +++ b/packages/octane-form/src/useForm.tsrx @@ -1,154 +1,170 @@ -import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core' -import { useSelector } from '@tanstack/octane-store' -import { useMemo, useRef, useState } from 'octane' -import { Field } from './useField.tsrx' -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' -import { useFormId } from './useFormId' -import { FormGroup } from './useFormGroup.tsrx' -import type { FormGroupComponent } from './useFormGroup.tsrx' +import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core'; +import { useSelector } from '@tanstack/octane-store'; +import { useMemo, useRef, useState } from 'octane'; +import { Field } from './useField.tsrx'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; +import { useFormId } from './useFormId'; +import { FormGroup } from './useFormGroup.tsrx'; +import type { FormGroupComponent } from './useFormGroup.tsrx'; import type { - AnyFormApi, - AnyFormState, - FormAsyncValidateOrFn, - FormOptions, - FormState, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { FieldComponent } from './useField.tsrx' + AnyFormApi, + AnyFormState, + FormAsyncValidateOrFn, + FormOptions, + FormState, + FormValidateOrFn, +} from '@tanstack/form-core'; +import type { FieldComponent } from './useField.tsrx'; -type FormRenderable = unknown -type FormPropsWithChildren

= P & { children?: FormRenderable } -type FormFunctionComponent

= (props: P) => FormRenderable +type FormRenderable = unknown; +type FormPropsWithChildren

= P & { children?: FormRenderable }; +type FormFunctionComponent

= (props: P) => FormRenderable; /** * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` */ export interface OctaneFormApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, + in out TFormData, + in out TOnMount extends undefined | FormValidateOrFn, + in out TOnChange extends undefined | FormValidateOrFn, + in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TOnBlur extends undefined | FormValidateOrFn, + in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TOnSubmit extends undefined | FormValidateOrFn, + in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TOnDynamic extends undefined | FormValidateOrFn, + in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TOnServer extends undefined | FormAsyncValidateOrFn, + in out TSubmitMeta, > { - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > - FormGroup: FormGroupComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: (props: { - selector?: (state: NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >) => TSelected; - children: ((state: NoInfer) => FormRenderable) | FormRenderable; - }) => ReturnType + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; + FormGroup: FormGroupComponent< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: < + TSelected = NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + >(props: { + selector?: ( + state: NoInfer< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >, + ) => TSelected; + children: ((state: NoInfer) => FormRenderable) | FormRenderable; + }) => ReturnType; } /** * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` */ export type OctaneFormExtendedApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, -> = - FormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > & OctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, +> = FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta +> & + OctaneFormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >; function LocalSubscribe({ - form, - selector = (state) => state, - children, + form, + selector = (state) => state, + children, }: FormPropsWithChildren<{ - form: AnyFormApi; - selector?: (state: AnyFormState) => AnyFormState; + form: AnyFormApi; + selector?: (state: AnyFormState) => AnyFormState; }>): ReturnType { - const data = useSelector(form.store, selector) + const data = useSelector(form.store, selector); - return <> - {functionalUpdate(children, data)} - + return <>{functionalUpdate(children, data)}; } /** @@ -157,128 +173,124 @@ function LocalSubscribe({ * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields */ export function useForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, >( - opts?: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, + opts?: FormOptions< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, ) { - const fallbackFormId = useFormId() - const formId = opts?.formId ?? fallbackFormId - const [prevFormId, setPrevFormId] = useState(formId) + const fallbackFormId = useFormId(); + const formId = opts?.formId ?? fallbackFormId; + const [prevFormId, setPrevFormId] = useState(formId); - const [formApi, setFormApi] = useState(() => { - return new FormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >({ ...opts, formId }) - }) + const [formApi, setFormApi] = useState(() => { + return new FormApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >({ ...opts, formId }); + }); - if (prevFormId !== formId) { - setFormApi(new FormApi({ ...opts, formId })) - setPrevFormId(formId) - } + if (prevFormId !== formId) { + setFormApi(new FormApi({ ...opts, formId })); + setPrevFormId(formId); + } - const extendedFormApi = useMemo(() => { - const extendedApi: OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > = { - ...formApi, - handleSubmit: ((...props: never[]) => { - return formApi._handleSubmit(...props) - }) as typeof formApi.handleSubmit, - // We must add all `get`ters from `core`'s `FormApi` here, as otherwise the spread operator won't catch those - get formId(): string { - return formApi._formId - }, - get state() { - return formApi.store.state - }, - } as never + const extendedFormApi = useMemo(() => { + const extendedApi: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + > = { + ...formApi, + handleSubmit: ((...props: never[]) => { + return formApi._handleSubmit(...props); + }) as typeof formApi.handleSubmit, + // We must add all `get`ters from `core`'s `FormApi` here, as otherwise the spread operator won't catch those + get formId(): string { + return formApi._formId; + }, + get state() { + return formApi.store.state; + }, + } as never; - extendedApi.Field = function APIField(props) { - return - } + extendedApi.Field = function APIField(props) { + return ; + }; - extendedApi.FormGroup = function APIFormGroup(props) { - return - } + extendedApi.FormGroup = function APIFormGroup(props) { + return ; + }; - extendedApi.Subscribe = function Subscribe(props: any) { - return - } + extendedApi.Subscribe = function Subscribe(props: any) { + return ; + }; - return extendedApi - }, [formApi]) + return extendedApi; + }, [formApi]); - useIsomorphicLayoutEffect(formApi.mount, [formApi]) + useIsomorphicLayoutEffect(formApi.mount, [formApi]); - /** - * formApi.update should not have any side effects. Think of it like a `useRef` - * that we need to keep updated every render with the most up-to-date information. - */ - useIsomorphicLayoutEffect(() => { - formApi.update(opts) - }) + /** + * formApi.update should not have any side effects. Think of it like a `useRef` + * that we need to keep updated every render with the most up-to-date information. + */ + useIsomorphicLayoutEffect(() => { + formApi.update(opts); + }); - const hasRan = useRef(false) + const hasRan = useRef(false); - useIsomorphicLayoutEffect(() => { - if (!hasRan.current) return - if (!opts?.transform) return - mergeAndUpdate(formApi, opts.transform as never) - }, [formApi, opts?.transform]) + useIsomorphicLayoutEffect(() => { + if (!hasRan.current) return; + if (!opts?.transform) return; + mergeAndUpdate(formApi, opts.transform as never); + }, [formApi, opts?.transform]); - useIsomorphicLayoutEffect(() => { - hasRan.current = true - }) + useIsomorphicLayoutEffect(() => { + hasRan.current = true; + }); - return extendedFormApi + return extendedFormApi; } diff --git a/packages/octane-form/src/useForm.tsrx.d.ts b/packages/octane-form/src/useForm.tsrx.d.ts index 3fb793ebd..6b62b9d77 100644 --- a/packages/octane-form/src/useForm.tsrx.d.ts +++ b/packages/octane-form/src/useForm.tsrx.d.ts @@ -1,192 +1,35 @@ // Declaration companion generated from useForm.tsrx. -import { FormApi } from '@tanstack/form-core' -import type { FormGroupComponent } from './useFormGroup.tsrx' -import type { - FormAsyncValidateOrFn, - FormOptions, - FormState, - FormValidateOrFn, -} from '@tanstack/form-core' -import type { FieldComponent } from './useField.tsrx' -type FormRenderable = unknown -type FormFunctionComponent

= (props: P) => FormRenderable +import { FormApi } from '@tanstack/form-core'; +import type { FormGroupComponent } from './useFormGroup.tsrx'; +import type { FormAsyncValidateOrFn, FormOptions, FormState, FormValidateOrFn } from '@tanstack/form-core'; +import type { FieldComponent } from './useField.tsrx'; +type FormRenderable = unknown; +type FormFunctionComponent

= (props: P) => FormRenderable; /** * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` */ -export interface OctaneFormApi< - in out TFormData, - in out TOnMount extends undefined | FormValidateOrFn, - in out TOnChange extends undefined | FormValidateOrFn, - in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - in out TOnBlur extends undefined | FormValidateOrFn, - in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - in out TOnSubmit extends undefined | FormValidateOrFn, - in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - in out TOnDynamic extends undefined | FormValidateOrFn, - in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - in out TOnServer extends undefined | FormAsyncValidateOrFn, - in out TSubmitMeta, -> { - /** - * A component to render form fields. With this, you can render and manage individual form fields. - */ - Field: FieldComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > - FormGroup: FormGroupComponent< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > - /** - * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. - */ - Subscribe: < - TSelected = NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - >(props: { - selector?: ( - state: NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - ) => TSelected - children: ((state: NoInfer) => FormRenderable) | FormRenderable - }) => ReturnType +export interface OctaneFormApi, in out TOnChange extends undefined | FormValidateOrFn, in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TOnBlur extends undefined | FormValidateOrFn, in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TOnSubmit extends undefined | FormValidateOrFn, in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TOnDynamic extends undefined | FormValidateOrFn, in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TOnServer extends undefined | FormAsyncValidateOrFn, in out TSubmitMeta> { + /** + * A component to render form fields. With this, you can render and manage individual form fields. + */ + Field: FieldComponent; + FormGroup: FormGroupComponent; + /** + * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. + */ + Subscribe: >>(props: { + selector?: (state: NoInfer>) => TSelected; + children: ((state: NoInfer) => FormRenderable) | FormRenderable; + }) => ReturnType; } /** * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` */ -export type OctaneFormExtendedApi< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, -> = FormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> & - OctaneFormApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - > +export type OctaneFormExtendedApi, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta> = FormApi & OctaneFormApi; /** * A custom hook that returns an extended instance of the `FormApi` class. * * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields */ -export declare function useForm< - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, ->( - opts?: FormOptions< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, -): OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta -> -export {} +export declare function useForm, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TSubmitMeta>(opts?: FormOptions): OctaneFormExtendedApi; +export {}; diff --git a/packages/octane-form/src/useFormGroup.tsrx b/packages/octane-form/src/useFormGroup.tsrx index e968b40a6..f37d0c530 100644 --- a/packages/octane-form/src/useFormGroup.tsrx +++ b/packages/octane-form/src/useFormGroup.tsrx @@ -1,648 +1,633 @@ -import { useMemo, useState } from 'octane' -import { useSelector } from '@tanstack/octane-store' -import { FormGroupApi, functionalUpdate } from '@tanstack/form-core' -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' +import { useMemo, useState } from 'octane'; +import { useSelector } from '@tanstack/octane-store'; +import { FormGroupApi, functionalUpdate } from '@tanstack/form-core'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; import type { - DeepKeys, - DeepValue, - FormAsyncValidateOrFn, - FormGroupApiOptions, - FormGroupAsyncValidateOrFn, - FormGroupOptions, - FormGroupValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' + DeepKeys, + DeepValue, + FormAsyncValidateOrFn, + FormGroupApiOptions, + FormGroupAsyncValidateOrFn, + FormGroupOptions, + FormGroupValidateOrFn, + FormValidateOrFn, +} from '@tanstack/form-core'; -type FormGroupRenderable = unknown -type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable +type FormGroupRenderable = unknown; +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; export type UseFormGroup< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = - (opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >) => FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > + TParentData, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>( + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, +) => FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta +>; export function useFormGroup< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, >( - opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >, + opts: FormGroupApiOptions< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + >, ) { - // Keep a snapshot of options so compiler optimizations do not treat - // formGroupApi as immutable. - const [prevOptions, setPrevOptions] = useState( - () => ({ - form: opts.form, - name: opts.name, - }), - ) + // Keep a snapshot of options so compiler optimizations do not treat + // formGroupApi as immutable. + const [prevOptions, setPrevOptions] = useState(() => ({ + form: opts.form, + name: opts.name, + })); - const [formGroupApiState, setFormGroupApi] = useState(() => { - return new FormGroupApi({ - ...opts, - }) - }) - let formGroupApi = formGroupApiState + const [formGroupApiState, setFormGroupApi] = useState(() => { + return new FormGroupApi({ + ...opts, + }); + }); + let formGroupApi = formGroupApiState; - // We only want to - // update on name changes since those are at risk of becoming stale. The field - // state must be up to date for the internal JSX render. - // The other options can freely be in `fieldApi.update` - if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { - // Use the replacement for the rest of this render so selectors and the - // render prop never observe state from the previous form or group name. - formGroupApi = new FormGroupApi({ - ...opts, - }) - setFormGroupApi(formGroupApi) - setPrevOptions({ form: opts.form, name: opts.name }) - } + // We only want to + // update on name changes since those are at risk of becoming stale. The field + // state must be up to date for the internal JSX render. + // The other options can freely be in `fieldApi.update` + if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) { + // Use the replacement for the rest of this render so selectors and the + // render prop never observe state from the previous form or group name. + formGroupApi = new FormGroupApi({ + ...opts, + }); + setFormGroupApi(formGroupApi); + setPrevOptions({ form: opts.form, name: opts.name }); + } - const reactiveStateValue = useSelector( - formGroupApi.store, - (state) => state.value, - ) + const reactiveStateValue = useSelector(formGroupApi.store, (state) => state.value); - const reactiveMetaIsTouched = useSelector( - formGroupApi.store, - (state) => state.meta.isTouched, - ) - const reactiveMetaIsBlurred = useSelector( - formGroupApi.store, - (state) => state.meta.isBlurred, - ) - const reactiveMetaIsDirty = useSelector( - formGroupApi.store, - (state) => state.meta.isDirty, - ) - const reactiveMetaErrorMap = useSelector( - formGroupApi.store, - (state) => state.meta.errorMap, - ) - const reactiveMetaErrorSourceMap = useSelector( - formGroupApi.store, - (state) => state.meta.errorSourceMap, - ) - const reactiveMetaIsValidating = useSelector( - formGroupApi.store, - (state) => state.meta.isValidating, - ) + const reactiveMetaIsTouched = useSelector(formGroupApi.store, (state) => state.meta.isTouched); + const reactiveMetaIsBlurred = useSelector(formGroupApi.store, (state) => state.meta.isBlurred); + const reactiveMetaIsDirty = useSelector(formGroupApi.store, (state) => state.meta.isDirty); + const reactiveMetaErrorMap = useSelector(formGroupApi.store, (state) => state.meta.errorMap); + const reactiveMetaErrorSourceMap = useSelector( + formGroupApi.store, + (state) => state.meta.errorSourceMap, + ); + const reactiveMetaIsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isValidating, + ); - // Submission lifecycle and aggregated validity now live on `state.meta` - // (mirroring `FieldApi.state.meta`). Subscribe to the fields callers - // typically read so the compiled renderer tracks them as dependencies. - const reactiveMetaIsSubmitting = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitting, - ) - const reactiveMetaIsSubmitted = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitted, - ) - const reactiveMetaSubmissionAttempts = useSelector( - formGroupApi.store, - (state) => state.meta.submissionAttempts, - ) - const reactiveMetaIsSubmitSuccessful = useSelector( - formGroupApi.store, - (state) => state.meta.isSubmitSuccessful, - ) - const reactiveMetaCanSubmit = useSelector( - formGroupApi.store, - (state) => state.meta.canSubmit, - ) - const reactiveMetaIsValid = useSelector( - formGroupApi.store, - (state) => state.meta.isValid, - ) - const reactiveMetaIsFieldsValid = useSelector( - formGroupApi.store, - (state) => state.meta.isFieldsValid, - ) - const reactiveMetaIsFieldsValidating = useSelector( - formGroupApi.store, - (state) => state.meta.isFieldsValidating, - ) - const reactiveMetaIsGroupValid = useSelector( - formGroupApi.store, - (state) => state.meta.isGroupValid, - ) + // Submission lifecycle and aggregated validity now live on `state.meta` + // (mirroring `FieldApi.state.meta`). Subscribe to the fields callers + // typically read so the compiled renderer tracks them as dependencies. + const reactiveMetaIsSubmitting = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitting, + ); + const reactiveMetaIsSubmitted = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitted, + ); + const reactiveMetaSubmissionAttempts = useSelector( + formGroupApi.store, + (state) => state.meta.submissionAttempts, + ); + const reactiveMetaIsSubmitSuccessful = useSelector( + formGroupApi.store, + (state) => state.meta.isSubmitSuccessful, + ); + const reactiveMetaCanSubmit = useSelector(formGroupApi.store, (state) => state.meta.canSubmit); + const reactiveMetaIsValid = useSelector(formGroupApi.store, (state) => state.meta.isValid); + const reactiveMetaIsFieldsValid = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValid, + ); + const reactiveMetaIsFieldsValidating = useSelector( + formGroupApi.store, + (state) => state.meta.isFieldsValidating, + ); + const reactiveMetaIsGroupValid = useSelector( + formGroupApi.store, + (state) => state.meta.isGroupValid, + ); - // Materialize the reactive snapshots in the extended API returned to render callbacks. - const extendedFieldApi = useMemo(() => { - const reactiveFieldApi = { - ...formGroupApi, - handleSubmit: ((...props: never[]) => { - return formGroupApi._handleSubmit(...props) - }) as typeof formGroupApi.handleSubmit, - get state() { - return { - ...formGroupApi.state, - value: reactiveStateValue, - get meta() { - return { - ...formGroupApi.state.meta, - isTouched: reactiveMetaIsTouched, - isBlurred: reactiveMetaIsBlurred, - isDirty: reactiveMetaIsDirty, - errorMap: reactiveMetaErrorMap, - errorSourceMap: reactiveMetaErrorSourceMap, - isValidating: reactiveMetaIsValidating, - isSubmitting: reactiveMetaIsSubmitting, - isSubmitted: reactiveMetaIsSubmitted, - submissionAttempts: reactiveMetaSubmissionAttempts, - isSubmitSuccessful: reactiveMetaIsSubmitSuccessful, - canSubmit: reactiveMetaCanSubmit, - isValid: reactiveMetaIsValid, - isFieldsValid: reactiveMetaIsFieldsValid, - isFieldsValidating: reactiveMetaIsFieldsValidating, - isGroupValid: reactiveMetaIsGroupValid, - } satisfies typeof formGroupApi.state.meta - }, - } satisfies typeof formGroupApi.state - }, - } + // Materialize the reactive snapshots in the extended API returned to render callbacks. + const extendedFieldApi = useMemo(() => { + const reactiveFieldApi = { + ...formGroupApi, + handleSubmit: ((...props: never[]) => { + return formGroupApi._handleSubmit(...props); + }) as typeof formGroupApi.handleSubmit, + get state() { + return { + ...formGroupApi.state, + value: reactiveStateValue, + get meta() { + return { + ...formGroupApi.state.meta, + isTouched: reactiveMetaIsTouched, + isBlurred: reactiveMetaIsBlurred, + isDirty: reactiveMetaIsDirty, + errorMap: reactiveMetaErrorMap, + errorSourceMap: reactiveMetaErrorSourceMap, + isValidating: reactiveMetaIsValidating, + isSubmitting: reactiveMetaIsSubmitting, + isSubmitted: reactiveMetaIsSubmitted, + submissionAttempts: reactiveMetaSubmissionAttempts, + isSubmitSuccessful: reactiveMetaIsSubmitSuccessful, + canSubmit: reactiveMetaCanSubmit, + isValid: reactiveMetaIsValid, + isFieldsValid: reactiveMetaIsFieldsValid, + isFieldsValidating: reactiveMetaIsFieldsValidating, + isGroupValid: reactiveMetaIsGroupValid, + } satisfies typeof formGroupApi.state.meta; + }, + } satisfies typeof formGroupApi.state; + }, + }; - const extendedApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > = reactiveFieldApi as never + const extendedApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > = reactiveFieldApi as never; - return extendedApi - }, [ - formGroupApi, - reactiveStateValue, - reactiveMetaIsTouched, - reactiveMetaIsBlurred, - reactiveMetaIsDirty, - reactiveMetaErrorMap, - reactiveMetaErrorSourceMap, - reactiveMetaIsValidating, - reactiveMetaIsSubmitting, - reactiveMetaIsSubmitted, - reactiveMetaSubmissionAttempts, - reactiveMetaIsSubmitSuccessful, - reactiveMetaCanSubmit, - reactiveMetaIsValid, - reactiveMetaIsFieldsValid, - reactiveMetaIsFieldsValidating, - reactiveMetaIsGroupValid, - ]) + return extendedApi; + }, [ + formGroupApi, + reactiveStateValue, + reactiveMetaIsTouched, + reactiveMetaIsBlurred, + reactiveMetaIsDirty, + reactiveMetaErrorMap, + reactiveMetaErrorSourceMap, + reactiveMetaIsValidating, + reactiveMetaIsSubmitting, + reactiveMetaIsSubmitted, + reactiveMetaSubmissionAttempts, + reactiveMetaIsSubmitSuccessful, + reactiveMetaCanSubmit, + reactiveMetaIsValid, + reactiveMetaIsFieldsValid, + reactiveMetaIsFieldsValidating, + reactiveMetaIsGroupValid, + ]); - useIsomorphicLayoutEffect(formGroupApi.mount, [formGroupApi]) + useIsomorphicLayoutEffect(formGroupApi.mount, [formGroupApi]); - useIsomorphicLayoutEffect(() => { - formGroupApi.update(opts) - }) + useIsomorphicLayoutEffect(() => { + formGroupApi.update(opts); + }); - return extendedFieldApi + return extendedFieldApi; } interface FormGroupComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, > extends FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta > { - children: (formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & ExtendedApi) => FormGroupRenderable + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable; } interface FormGroupComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, + ExtendedApi = {}, > extends FormGroupOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta > { - children: (formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & ExtendedApi) => FormGroupRenderable + children: ( + formGroupApi: FormGroupApi< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta + > & + ExtendedApi, + ) => FormGroupRenderable; } export type FormGroupComponent< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, -> = - ({ children, ...formGroupOptions }: FormGroupComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta, - ExtendedApi - >) => ReturnType + in out TParentData, + in out TFormOnMount extends undefined | FormValidateOrFn, + in out TFormOnChange extends undefined | FormValidateOrFn, + in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnBlur extends undefined | FormValidateOrFn, + in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnSubmit extends undefined | FormValidateOrFn, + in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnDynamic extends undefined | FormValidateOrFn, + in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + in out TFormOnServer extends undefined | FormAsyncValidateOrFn, + in out TParentSubmitMeta, + in out ExtendedApi = {}, +> = < + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentBoundProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta, + ExtendedApi +>) => ReturnType; export const FormGroup = (< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, ->({ children, ...formGroupOptions }: FormGroupComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta + TParentData, + TName extends DeepKeys, + TData extends DeepValue, + TOnMount extends undefined | FormGroupValidateOrFn, + TOnChange extends undefined | FormGroupValidateOrFn, + TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnBlur extends undefined | FormGroupValidateOrFn, + TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnSubmit extends undefined | FormGroupValidateOrFn, + TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, + TOnDynamic extends undefined | FormGroupValidateOrFn, + TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, + TSubmitMeta, + TFormOnMount extends undefined | FormValidateOrFn, + TFormOnChange extends undefined | FormValidateOrFn, + TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TFormOnBlur extends undefined | FormValidateOrFn, + TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TFormOnSubmit extends undefined | FormValidateOrFn, + TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TFormOnDynamic extends undefined | FormValidateOrFn, + TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TFormOnServer extends undefined | FormAsyncValidateOrFn, + TParentSubmitMeta, +>({ + children, + ...formGroupOptions +}: FormGroupComponentProps< + TParentData, + TName, + TData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TSubmitMeta, + TFormOnMount, + TFormOnChange, + TFormOnChangeAsync, + TFormOnBlur, + TFormOnBlurAsync, + TFormOnSubmit, + TFormOnSubmitAsync, + TFormOnDynamic, + TFormOnDynamicAsync, + TFormOnServer, + TParentSubmitMeta >): ReturnType => { - const formGroupApi = useFormGroup(formGroupOptions as any) + const formGroupApi = useFormGroup(formGroupOptions as any); - const jsxToDisplay = useMemo( - () => functionalUpdate(children, formGroupApi as any), - [children, formGroupApi], - ) - return <> - {jsxToDisplay} - as never + const jsxToDisplay = useMemo( + () => functionalUpdate(children, formGroupApi as any), + [children, formGroupApi], + ); + return (<>{jsxToDisplay}) as never; }) satisfies FormGroupFunctionComponent< - FormGroupComponentProps< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > -> + FormGroupComponentProps< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > +>; diff --git a/packages/octane-form/src/useFormGroup.tsrx.d.ts b/packages/octane-form/src/useFormGroup.tsrx.d.ts index c9c4ddabb..8bd12aa1f 100644 --- a/packages/octane-form/src/useFormGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFormGroup.tsrx.d.ts @@ -1,539 +1,16 @@ // Declaration companion generated from useFormGroup.tsrx. -import { FormGroupApi } from '@tanstack/form-core' -import type { - DeepKeys, - DeepValue, - FormAsyncValidateOrFn, - FormGroupApiOptions, - FormGroupAsyncValidateOrFn, - FormGroupOptions, - FormGroupValidateOrFn, - FormValidateOrFn, -} from '@tanstack/form-core' -type FormGroupRenderable = unknown -type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable -export type UseFormGroup< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, ->( - opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >, -) => FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> -export declare function useFormGroup< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, ->( - opts: FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >, -): FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> -interface FormGroupComponentProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, -> extends FormGroupApiOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> { - children: ( - formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & - ExtendedApi, - ) => FormGroupRenderable +import { FormGroupApi } from '@tanstack/form-core'; +import type { DeepKeys, DeepValue, FormAsyncValidateOrFn, FormGroupApiOptions, FormGroupAsyncValidateOrFn, FormGroupOptions, FormGroupValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; +type FormGroupRenderable = unknown; +type FormGroupFunctionComponent

= (props: P) => FormGroupRenderable; +export type UseFormGroup, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>(opts: FormGroupApiOptions) => FormGroupApi; +export declare function useFormGroup, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>(opts: FormGroupApiOptions): FormGroupApi; +interface FormGroupComponentProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupApiOptions { + children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; } -interface FormGroupComponentBoundProps< - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, - ExtendedApi = {}, -> extends FormGroupOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> { - children: ( - formGroupApi: FormGroupApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & - ExtendedApi, - ) => FormGroupRenderable +interface FormGroupComponentBoundProps, TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta, ExtendedApi = {}> extends FormGroupOptions { + children: (formGroupApi: FormGroupApi & ExtendedApi) => FormGroupRenderable; } -export type FormGroupComponent< - in out TParentData, - in out TFormOnMount extends undefined | FormValidateOrFn, - in out TFormOnChange extends undefined | FormValidateOrFn, - in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnBlur extends undefined | FormValidateOrFn, - in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnSubmit extends undefined | FormValidateOrFn, - in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnDynamic extends undefined | FormValidateOrFn, - in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, - in out TFormOnServer extends undefined | FormAsyncValidateOrFn, - in out TParentSubmitMeta, - in out ExtendedApi = {}, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, ->({ - children, - ...formGroupOptions -}: FormGroupComponentBoundProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta, - ExtendedApi ->) => ReturnType -export declare const FormGroup: < - TParentData, - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FormGroupValidateOrFn, - TOnChange extends - | undefined - | FormGroupValidateOrFn, - TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnBlur extends undefined | FormGroupValidateOrFn, - TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnSubmit extends - | undefined - | FormGroupValidateOrFn, - TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TOnDynamic extends - | undefined - | FormGroupValidateOrFn, - TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, - TSubmitMeta, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, ->({ - children, - ...formGroupOptions -}: FormGroupComponentProps< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TSubmitMeta, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta ->) => ReturnType -export {} +export type FormGroupComponent, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}> = , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentBoundProps) => ReturnType; +export declare const FormGroup: , TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends undefined | FormGroupValidateOrFn, TOnChangeAsync extends undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends undefined | FormGroupValidateOrFn, TOnSubmitAsync extends undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends undefined | FormGroupValidateOrFn, TOnDynamicAsync extends undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, TFormOnBlur extends undefined | FormValidateOrFn, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, TFormOnSubmit extends undefined | FormValidateOrFn, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TFormOnDynamic extends undefined | FormValidateOrFn, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TFormOnServer extends undefined | FormAsyncValidateOrFn, TParentSubmitMeta>({ children, ...formGroupOptions }: FormGroupComponentProps) => ReturnType; +export {}; diff --git a/packages/octane-form/src/useFormId.ts b/packages/octane-form/src/useFormId.ts index 9149ef679..5d4379ee4 100644 --- a/packages/octane-form/src/useFormId.ts +++ b/packages/octane-form/src/useFormId.ts @@ -1,4 +1,4 @@ -import { useId } from 'octane' +import { useId } from 'octane'; // Generated IDs remain opaque and stable across SSR and hydration. -export const useFormId = useId +export const useFormId = useId; diff --git a/packages/octane-form/src/useIsomorphicLayoutEffect.ts b/packages/octane-form/src/useIsomorphicLayoutEffect.ts index fd02eec6c..27d0a71c8 100644 --- a/packages/octane-form/src/useIsomorphicLayoutEffect.ts +++ b/packages/octane-form/src/useIsomorphicLayoutEffect.ts @@ -1,4 +1,4 @@ -import { useEffect, useLayoutEffect } from 'octane' +import { useEffect, useLayoutEffect } from 'octane'; export const useIsomorphicLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect + typeof window !== 'undefined' ? useLayoutEffect : useEffect; diff --git a/packages/octane-form/tests/createFormHook.test-d.tsx b/packages/octane-form/tests/createFormHook.test-d.tsx index 06f4fd639..e87e05dca 100644 --- a/packages/octane-form/tests/createFormHook.test-d.tsx +++ b/packages/octane-form/tests/createFormHook.test-d.tsx @@ -1,1058 +1,1022 @@ -import { describe, expectTypeOf, it } from 'vitest' -import { formOptions } from '@tanstack/form-core' -import { createFormHook, createFormHookContexts } from '../src' +import { describe, expectTypeOf, it } from 'vitest'; +import { formOptions } from '@tanstack/form-core'; +import { createFormHook, createFormHookContexts } from '../src'; -const { fieldContext, useFieldContext, formContext, useFormContext } = - createFormHookContexts() +const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); function Test() { - return null + return null; } class ClassComponent { - render() { - return null - } + render() { + return null; + } } createFormHook({ - fieldComponents: { - // @ts-expect-error Octane component registration accepts callable function components only. - ClassComponent, - }, - formComponents: {}, - fieldContext, - formContext, -}) + fieldComponents: { + // @ts-expect-error Octane component registration accepts callable function components only. + ClassComponent, + }, + formComponents: {}, + fieldContext, + formContext, +}); const { useAppForm, withForm, withFieldGroup } = createFormHook({ - fieldComponents: { - Test, - }, - formComponents: { - Test, - }, - fieldContext, - formContext, -}) + fieldComponents: { + Test, + }, + formComponents: { + Test, + }, + fieldContext, + formContext, +}); describe('createFormHook', () => { - it('should not break with an infinite type on large schemas', () => { - const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const - type ActivityKind0 = (typeof ActivityKind0_Names)[number] - - enum DayOfWeek { - Monday = 1, - Tuesday, - Wednesday, - Thursday, - Friday, - Saturday, - Sunday, - } - - interface Branding { - __type?: Brand - } - type Branded = T & Branding - type ActivityId = Branded - interface ActivitySelectorFormData { - includeAll: boolean - includeActivityIds: ActivityId[] - includeActivityKinds: Set - excludeActivityIds: ActivityId[] - } - - const GeneratedTypes0Visibility_Names = [ - 'Normal', - 'Advanced', - 'Hidden', - ] as const - type GeneratedTypes0Visibility = - (typeof GeneratedTypes0Visibility_Names)[number] - interface FormValuesBase { - key: string - visibility: GeneratedTypes0Visibility - } - - interface ActivityCountFormValues extends FormValuesBase { - _type: 'ActivityCount' - activitySelector: ActivitySelectorFormData - daysOfWeek: DayOfWeek[] - label: string - } - - interface PlanningTimesFormValues extends FormValuesBase { - _type: 'PlanningTimes' - showTarget: boolean - showPlanned: boolean - showDiff: boolean - } - - type EditorValues = ActivityCountFormValues | PlanningTimesFormValues - interface EditorFormValues { - editors: Record - ordering: string[] - } - - const ExampleUsage = withForm({ - props: { - initialValues: '' as keyof EditorFormValues['editors'], - }, - defaultValues: {} as EditorFormValues, - render: ({ form, initialValues }) => { - return ( -

- - {(field) => { - expectTypeOf(field.state.value).toExtend() - return null - }} - - - - -
- ) - }, - }) - - const ExampleUsage2 = withFieldGroup({ - defaultValues: {} as EditorValues, - render: ({ group }) => { - const test = group.state.values.key - return ( -
- - {(field) => { - expectTypeOf(field.state.value).toExtend() - return null - }} - - - - -
- ) - }, - }) - }) - - it('types should be properly inferred when using formOptions', () => { - type Person = { - firstName: string - lastName: string - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const WithFormComponent = withForm({ - ...formOpts, - render: ({ form }) => { - expectTypeOf(form.state.values).toEqualTypeOf() - return - }, - }) - }) - - it('types should be properly inferred when passing args alongside formOptions', () => { - type Person = { - firstName: string - lastName: string - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const WithFormComponent = withForm({ - ...formOpts, - onSubmitMeta: { - test: 'test', - }, - render: ({ form }) => { - expectTypeOf(form.handleSubmit).toEqualTypeOf<{ - (): Promise - (submitMeta: { test: string }): Promise - }> - return - }, - }) - }) - - it('types should be properly inferred when formOptions are being overridden', () => { - type Person = { - firstName: string - lastName: string - } - - type PersonWithAge = Person & { - age: number - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const WithFormComponent = withForm({ - ...formOpts, - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - age: 10, - }, - render: ({ form }) => { - expectTypeOf(form.state.values).toExtend() - return - }, - }) - }) - - it('withForm props should be properly inferred', () => { - const WithFormComponent = withForm({ - props: { - prop1: 'test', - prop2: 10, - }, - render: ({ form, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string - prop2: number - children?: unknown - }>() - - return - }, - }) - }) - - it('component made from withForm should have its props properly typed', () => { - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - }, - }) - - const appForm = useAppForm(formOpts) - - const WithFormComponent = withForm({ - ...formOpts, - props: { - prop1: 'test', - prop2: 10, - }, - render: ({ form, children, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string - prop2: number - }>() - return - }, - }) - - const CorrectComponent = ( - - ) - - // @ts-expect-error Missing required props prop1 and prop2 - const MissingPropsComponent = - - const incorrectFormOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - firstNameWrong: 'FirstName', - lastNameWrong: 'LastName', - }, - }) - - const incorrectAppForm = useAppForm(incorrectFormOpts) - - const IncorrectFormOptsComponent = ( - // @ts-expect-error Incorrect form opts - - ) - }) - - it('should infer subset values and props when calling withFieldGroup', () => { - type Person = { - firstName: string - lastName: string - } - type ComponentProps = { - prop1: string - prop2: number - } - - const defaultValues: Person = { - firstName: 'FirstName', - lastName: 'LastName', - } - - const FormGroupComponent = withFieldGroup({ - defaultValues, - render: function Render({ group, children, ...props }) { - // Existing types may be inferred - expectTypeOf(group.state.values.firstName).toEqualTypeOf() - expectTypeOf(group.state.values.lastName).toEqualTypeOf() - - expectTypeOf(group.state.values).toEqualTypeOf() - expectTypeOf(children).toEqualTypeOf() - expectTypeOf(props).toEqualTypeOf<{}>() - return - }, - }) - - const FormGroupComponentWithProps = withFieldGroup({ - ...defaultValues, - props: {} as ComponentProps, - render: ({ group, children, ...props }) => { - expectTypeOf(props).toEqualTypeOf<{ - prop1: string - prop2: number - }>() - return - }, - }) - }) - - it('should allow spreading formOptions when calling withFieldGroup', () => { - type Person = { - firstName: string - lastName: string - } - - const defaultValues: Person = { - firstName: '', - lastName: '', - } - const formOpts = formOptions({ - defaultValues, - validators: { - onChange: () => 'Error', - }, - listeners: { - onBlur: () => 'Something', - }, - asyncAlways: true, - asyncDebounceMs: 500, - }) - - // validators and listeners are ignored, only defaultValues is acknowledged - const FormGroupComponent = withFieldGroup({ - ...formOpts, - render: function Render({ group }) { - // Existing types may be inferred - expectTypeOf(group.state.values.firstName).toEqualTypeOf() - expectTypeOf(group.state.values.lastName).toEqualTypeOf() - return - }, - }) - - const noDefaultValuesFormOpts = formOptions({ - onSubmitMeta: { foo: '' }, - }) - - const UnknownFormGroupComponent = withFieldGroup({ - ...noDefaultValuesFormOpts, - render: function Render({ group }) { - // group.state.values can be anything. - // note that T extends unknown !== unknown extends T. - expectTypeOf().toExtend() - - // either no submit meta or of the type in formOptions - expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf< - [] | [{ foo: string }] - >() - return - }, - }) - }) - - it('should allow passing compatible forms to withFieldGroup', () => { - type Person = { - firstName: string - lastName: string - } - type ComponentProps = { - prop1: string - prop2: number - } - - const defaultValues: Person = { - firstName: 'FirstName', - lastName: 'LastName', - } - - const FormGroup = withFieldGroup({ - defaultValues, - props: {} as ComponentProps, - render: () => { - return <> - }, - }) - - const equalAppForm = useAppForm({ - defaultValues, - }) - - // ----------------- - // Assert that an equal form is not compatible as you have no name to pass - const NoSubfield = ( - - ) - - // ----------------- - // Assert that a form extending Person in a property is allowed - - const extendedAppForm = useAppForm({ - defaultValues: { person: { ...defaultValues, address: '' }, address: '' }, - }) - // While it has other properties, it satisfies defaultValues - const CorrectComponent1 = ( - - ) - - const MissingProps = ( - // @ts-expect-error because prop1 and prop2 are not added - - ) - - // ----------------- - // Assert that a form not satisfying Person errors - const incompatibleAppForm = useAppForm({ - defaultValues: { person: { ...defaultValues, lastName: 0 } }, - }) - const IncompatibleComponent = ( - - ) - }) - - it('should require strict equal submitMeta if it is set in withFieldGroup', () => { - type Person = { - firstName: string - lastName: string - } - type SubmitMeta = { - correct: string - } - - const defaultValues = { - person: { firstName: 'FirstName', lastName: 'LastName' } as Person, - } - const onSubmitMeta: SubmitMeta = { - correct: 'Prop', - } - - const FormLensNoMeta = withFieldGroup({ - defaultValues: {} as Person, - render: function Render({ group }) { - // Since handleSubmit always allows to submit without meta, this is okay - group.handleSubmit() - - // To prevent unwanted meta behaviour, handleSubmit's meta should be never if not set. - expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf< - [] | [submitMeta: never] - >() - - return - }, - }) - - const FormGroupWithMeta = withFieldGroup({ - defaultValues: {} as Person, - onSubmitMeta, - render: function Render({ group }) { - // Since handleSubmit always allows to submit without meta, this is okay - group.handleSubmit() - - // This matches the value - group.handleSubmit({ correct: '' }) - - // This does not. - // @ts-expect-error - group.handleSubmit({ wrong: 'Meta' }) - - return - }, - }) - - const noMetaForm = useAppForm({ - defaultValues, - }) - - const CorrectComponent1 = ( - - ) - - const WrongComponent1 = ( - - ) - - const metaForm = useAppForm({ - defaultValues, - onSubmitMeta, - }) - - const CorrectComponent2 = - const CorrectComponent3 = ( - - ) - - const diffMetaForm = useAppForm({ - defaultValues, - onSubmitMeta: { ...onSubmitMeta, something: 'else' }, - }) - - const CorrectComponent4 = ( - - ) - const WrongComponent2 = ( - - ) - }) - - it('should accept any validators for withFieldGroup', () => { - type Person = { - firstName: string - lastName: string - } - - const defaultValues = { - person: { firstName: 'FirstName', lastName: 'LastName' } satisfies Person, - } - - const formA = useAppForm({ - defaultValues, - validators: { - onChange: () => 'A', - }, - listeners: { - onChange: () => 'A', - }, - }) - const formB = useAppForm({ - defaultValues, - validators: { - onChange: () => 'B', - }, - listeners: { - onChange: () => 'B', - }, - }) - - const FormGroup = withFieldGroup({ - defaultValues: defaultValues.person, - render: function Render({ group }) { - return - }, - }) - - const CorrectComponent1 = - const CorrectComponent2 = - }) - - it('should allow nesting withFieldGroup in other withFieldGroups', () => { - type Nested = { - firstName: string - } - type Wrapper = { - field: Nested - } - type FormValues = { - form: Wrapper - unrelated: { something: { lastName: string } } - } - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - } - - const form = useAppForm({ - defaultValues, - }) - const LensNested = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render() { - return <> - }, - }) - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- -
- ) - }, - }) - - const Component = - }) - - it('should not allow withFieldGroups with different metas to be nested', () => { - type Nested = { - firstName: string - } - type Wrapper = { - field: Nested - } - type FormValues = { - form: Wrapper - unrelated: { something: { lastName: string } } - } - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - } - - const LensNestedNoMeta = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render() { - return <> - }, - }) - const LensNestedWithMeta = withFieldGroup({ - defaultValues: defaultValues.form.field, - onSubmitMeta: { meta: '' }, - render: function Render() { - return <> - }, - }) - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- - -
- ) - }, - }) - - it('should allow mapping withFieldGroup to different fields', () => { - const defaultValues = { - firstName: '', - lastName: '', - age: 0, - relatives: [{ firstName: '', lastName: '', age: 0 }], - } - const defaultFields = { - first: '', - last: '', - } - - const form = useAppForm({ - defaultValues, - }) - - const FieldGroup = withFieldGroup({ - defaultValues: defaultFields, - render: function Render() { - return <> - }, - }) - - const Component1 = ( - - ) - - const Component2 = ( - - ) - }) - - it('should not allow fields mapping if the top level is an array', () => { - const defaultValues = { - firstName: '', - lastName: '', - age: 0, - relatives: [{ firstName: '', lastName: '', age: 0 }], - relativesRecord: { - something: { firstName: '', lastName: '', age: 0 }, - } as Record, - } - const defaultFields = { - firstName: '', - lastName: '', - } - - const form = useAppForm({ - defaultValues, - }) - - const FieldGroupRecord = withFieldGroup({ - defaultValues: { anything: defaultFields } as Record< - string, - typeof defaultFields - >, - render: function Render() { - return <> - }, - }) - const FieldGroupArray = withFieldGroup({ - defaultValues: [defaultFields], - render: function Render() { - return <> - }, - }) - - const CorrectComponent1 = ( - - ) - const WrongComponent1 = ( - - ) - const CorrectComponent3 = ( - - ) - const WrongComponent2 = ( - - ) - }) - }) - - it('should allow mapping field groups to optional fields', () => { - const groupFields = { - name: '', - } - - type WrapperValues = { - namespace: { name: string } | undefined - namespace2: { name: string } | null - namespace3: { name: string } | null | undefined - nope: null | undefined - nope2: { lastName: string } | null | undefined - } - - const defaultValues: WrapperValues = { - namespace: undefined, - namespace2: null, - namespace3: null, - nope: null, - nope2: null, - } - - const FieldGroup = withFieldGroup({ - defaultValues: groupFields, - render: function Render() { - return <> - }, - }) - - const form = useAppForm({ - defaultValues, - }) - - const Component = - const Component2 = - const Component3 = - // @ts-expect-error because it doesn't ever evaluate to the expected values - const Component4 = - // @ts-expect-error because the types don't match properly - const Component5 = - }) - - it('should allow interfaces without index signatures to be assigned to `props` in withForm and withFormGroup', () => { - interface TestNoSignature { - title: string - } - - interface TestWithSignature { - title: string - [key: string]: unknown - } - - const WithFormComponent1 = withForm({ - defaultValues: { name: '' }, - props: {} as TestNoSignature, - render: () => <>, - }) - - const WithFormComponent2 = withForm({ - defaultValues: { name: '' }, - props: {} as TestWithSignature, - render: () => <>, - }) - - const WithFieldGroupComponent1 = withFieldGroup({ - defaultValues: { name: '' }, - props: {} as TestNoSignature, - render: () => <>, - }) - - const WithFieldGroupComponent2 = withFieldGroup({ - defaultValues: { name: '' }, - props: {} as TestWithSignature, - render: () => <>, - }) - - const appForm = useAppForm({ defaultValues: { name: '' } }) - - const Component1 = - const Component2 = ( - - ) - - const FieldGroupComponent1 = ( - - ) - const FieldGroupComponent2 = ( - - ) - }) - - it('should not allow null as prop in withForm and withFormGroup', () => { - const WithFormComponent = withForm({ - defaultValues: { name: '' }, - // @ts-expect-error - props: null, - render: () => <>, - }) - }) - - const WithFieldGroupComponent = withFieldGroup({ - defaultValues: { name: '' }, - // @ts-expect-error - props: null, - render: () => <>, - }) - - describe('extendForm', () => { - function ExtendedField() { - return null - } - function ExtendedFormComp() { - return null - } - - const baseHook = createFormHook({ - fieldComponents: { Test }, - formComponents: { Test }, - fieldContext, - formContext, - }) - - const { - withForm: withExtendedForm, - withFieldGroup: withExtendedFieldGroup, - extendForm, - } = baseHook.extendForm({ - fieldComponents: { ExtendedField }, - formComponents: { ExtendedFormComp }, - }) - - it('should expose extendForm on the returned hook', () => { - expectTypeOf(extendForm).toBeFunction() - }) - - it('should include parent field components in the extended AppField render prop', () => { - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - expectTypeOf(form.AppField).toBeFunction() - - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction() - expectTypeOf(field.ExtendedField).toBeFunction() - return null - }} - - ) - }, - }) - }) - - it('should include parent form components on the extended form', () => { - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - expectTypeOf(form.Test).toBeFunction() - expectTypeOf(form.ExtendedFormComp).toBeFunction() - return null - }, - }) - }) - - it('should include parent and extended components in withFieldGroup', () => { - withExtendedFieldGroup({ - defaultValues: { name: '' }, - render: ({ group }) => { - expectTypeOf(group.Test).toBeFunction() - expectTypeOf(group.ExtendedFormComp).toBeFunction() - - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction() - expectTypeOf(field.ExtendedField).toBeFunction() - return null - }} - - ) - }, - }) - }) - - it('should error when a duplicate field component name is used in extendForm', () => { - baseHook.extendForm({ - fieldComponents: { - // @ts-expect-error 'Test' already exists in the base form - Test: ExtendedField, - }, - }) - }) - - it('should error when a duplicate form component name is used in extendForm', () => { - baseHook.extendForm({ - formComponents: { - // @ts-expect-error 'Test' already exists in the base form - Test: ExtendedFormComp, - }, - }) - }) - - it('should allow further extension of an already extended hook', () => { - function ThirdField() { - return null - } - - const { useAppForm: useDoublyExtended } = baseHook - .extendForm({ fieldComponents: { ExtendedField } }) - .extendForm({ fieldComponents: { ThirdField } }) - - withExtendedForm({ - defaultValues: { name: '' }, - render: ({ form }) => { - return ( - - {(field) => { - expectTypeOf(field.Test).toBeFunction() - expectTypeOf(field.ExtendedField).toBeFunction() - return null - }} - - ) - }, - }) - - const doublyExtendedForm = useDoublyExtended({ - defaultValues: { name: '' }, - }) - expectTypeOf(doublyExtendedForm.AppField).toBeFunction() - }) - - it('should preserve its recursive type beyond the previous declaration cutoff', () => { - const deeplyExtended = baseHook - .extendForm({ fieldComponents: { Field01: Test } }) - .extendForm({ fieldComponents: { Field02: Test } }) - .extendForm({ fieldComponents: { Field03: Test } }) - .extendForm({ fieldComponents: { Field04: Test } }) - .extendForm({ fieldComponents: { Field05: Test } }) - .extendForm({ fieldComponents: { Field06: Test } }) - .extendForm({ fieldComponents: { Field07: Test } }) - .extendForm({ fieldComponents: { Field08: Test } }) - .extendForm({ fieldComponents: { Field09: Test } }) - .extendForm({ fieldComponents: { Field10: Test } }) - .extendForm({ fieldComponents: { Field11: Test } }) - .extendForm({ fieldComponents: { Field12: Test } }) - - expectTypeOf(deeplyExtended).not.toBeAny() - expectTypeOf(deeplyExtended.extendForm).toBeFunction() - }) - }) -}) + it('should not break with an infinite type on large schemas', () => { + const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const; + type ActivityKind0 = (typeof ActivityKind0_Names)[number]; + + enum DayOfWeek { + Monday = 1, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, + } + + interface Branding { + __type?: Brand; + } + type Branded = T & Branding; + type ActivityId = Branded; + interface ActivitySelectorFormData { + includeAll: boolean; + includeActivityIds: ActivityId[]; + includeActivityKinds: Set; + excludeActivityIds: ActivityId[]; + } + + const GeneratedTypes0Visibility_Names = ['Normal', 'Advanced', 'Hidden'] as const; + type GeneratedTypes0Visibility = (typeof GeneratedTypes0Visibility_Names)[number]; + interface FormValuesBase { + key: string; + visibility: GeneratedTypes0Visibility; + } + + interface ActivityCountFormValues extends FormValuesBase { + _type: 'ActivityCount'; + activitySelector: ActivitySelectorFormData; + daysOfWeek: DayOfWeek[]; + label: string; + } + + interface PlanningTimesFormValues extends FormValuesBase { + _type: 'PlanningTimes'; + showTarget: boolean; + showPlanned: boolean; + showDiff: boolean; + } + + type EditorValues = ActivityCountFormValues | PlanningTimesFormValues; + interface EditorFormValues { + editors: Record; + ordering: string[]; + } + + const ExampleUsage = withForm({ + props: { + initialValues: '' as keyof EditorFormValues['editors'], + }, + defaultValues: {} as EditorFormValues, + render: ({ form, initialValues }) => { + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend(); + return null; + }} + + + + +
+ ); + }, + }); + + const ExampleUsage2 = withFieldGroup({ + defaultValues: {} as EditorValues, + render: ({ group }) => { + const test = group.state.values.key; + return ( +
+ + {(field) => { + expectTypeOf(field.state.value).toExtend(); + return null; + }} + + + + +
+ ); + }, + }); + }); + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + render: ({ form }) => { + expectTypeOf(form.state.values).toEqualTypeOf(); + return ; + }, + }); + }); + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + render: ({ form }) => { + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: { test: string }): Promise; + }>; + return ; + }, + }); + }); + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string; + lastName: string; + }; + + type PersonWithAge = Person & { + age: number; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const WithFormComponent = withForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + render: ({ form }) => { + expectTypeOf(form.state.values).toExtend(); + return ; + }, + }); + }); + + it('withForm props should be properly inferred', () => { + const WithFormComponent = withForm({ + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + children?: unknown; + }>(); + + return ; + }, + }); + }); + + it('component made from withForm should have its props properly typed', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }); + + const appForm = useAppForm(formOpts); + + const WithFormComponent = withForm({ + ...formOpts, + props: { + prop1: 'test', + prop2: 10, + }, + render: ({ form, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + }>(); + return ; + }, + }); + + const CorrectComponent = ; + + // @ts-expect-error Missing required props prop1 and prop2 + const MissingPropsComponent = ; + + const incorrectFormOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + firstNameWrong: 'FirstName', + lastNameWrong: 'LastName', + }, + }); + + const incorrectAppForm = useAppForm(incorrectFormOpts); + + const IncorrectFormOptsComponent = ( + // @ts-expect-error Incorrect form opts + + ); + }); + + it('should infer subset values and props when calling withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type ComponentProps = { + prop1: string; + prop2: number; + }; + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + }; + + const FormGroupComponent = withFieldGroup({ + defaultValues, + render: function Render({ group, children, ...props }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf(); + expectTypeOf(group.state.values.lastName).toEqualTypeOf(); + + expectTypeOf(group.state.values).toEqualTypeOf(); + expectTypeOf(children).toEqualTypeOf(); + expectTypeOf(props).toEqualTypeOf<{}>(); + return ; + }, + }); + + const FormGroupComponentWithProps = withFieldGroup({ + ...defaultValues, + props: {} as ComponentProps, + render: ({ group, children, ...props }) => { + expectTypeOf(props).toEqualTypeOf<{ + prop1: string; + prop2: number; + }>(); + return ; + }, + }); + }); + + it('should allow spreading formOptions when calling withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const defaultValues: Person = { + firstName: '', + lastName: '', + }; + const formOpts = formOptions({ + defaultValues, + validators: { + onChange: () => 'Error', + }, + listeners: { + onBlur: () => 'Something', + }, + asyncAlways: true, + asyncDebounceMs: 500, + }); + + // validators and listeners are ignored, only defaultValues is acknowledged + const FormGroupComponent = withFieldGroup({ + ...formOpts, + render: function Render({ group }) { + // Existing types may be inferred + expectTypeOf(group.state.values.firstName).toEqualTypeOf(); + expectTypeOf(group.state.values.lastName).toEqualTypeOf(); + return ; + }, + }); + + const noDefaultValuesFormOpts = formOptions({ + onSubmitMeta: { foo: '' }, + }); + + const UnknownFormGroupComponent = withFieldGroup({ + ...noDefaultValuesFormOpts, + render: function Render({ group }) { + // group.state.values can be anything. + // note that T extends unknown !== unknown extends T. + expectTypeOf().toExtend(); + + // either no submit meta or of the type in formOptions + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [{ foo: string }]>(); + return ; + }, + }); + }); + + it('should allow passing compatible forms to withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type ComponentProps = { + prop1: string; + prop2: number; + }; + + const defaultValues: Person = { + firstName: 'FirstName', + lastName: 'LastName', + }; + + const FormGroup = withFieldGroup({ + defaultValues, + props: {} as ComponentProps, + render: () => { + return <>; + }, + }); + + const equalAppForm = useAppForm({ + defaultValues, + }); + + // ----------------- + // Assert that an equal form is not compatible as you have no name to pass + const NoSubfield = ( + + ); + + // ----------------- + // Assert that a form extending Person in a property is allowed + + const extendedAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, address: '' }, address: '' }, + }); + // While it has other properties, it satisfies defaultValues + const CorrectComponent1 = ( + + ); + + const MissingProps = ( + // @ts-expect-error because prop1 and prop2 are not added + + ); + + // ----------------- + // Assert that a form not satisfying Person errors + const incompatibleAppForm = useAppForm({ + defaultValues: { person: { ...defaultValues, lastName: 0 } }, + }); + const IncompatibleComponent = ( + + ); + }); + + it('should require strict equal submitMeta if it is set in withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + type SubmitMeta = { + correct: string; + }; + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } as Person, + }; + const onSubmitMeta: SubmitMeta = { + correct: 'Prop', + }; + + const FormLensNoMeta = withFieldGroup({ + defaultValues: {} as Person, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit(); + + // To prevent unwanted meta behaviour, handleSubmit's meta should be never if not set. + expectTypeOf(group.handleSubmit).parameters.toEqualTypeOf<[] | [submitMeta: never]>(); + + return ; + }, + }); + + const FormGroupWithMeta = withFieldGroup({ + defaultValues: {} as Person, + onSubmitMeta, + render: function Render({ group }) { + // Since handleSubmit always allows to submit without meta, this is okay + group.handleSubmit(); + + // This matches the value + group.handleSubmit({ correct: '' }); + + // This does not. + // @ts-expect-error + group.handleSubmit({ wrong: 'Meta' }); + + return ; + }, + }); + + const noMetaForm = useAppForm({ + defaultValues, + }); + + const CorrectComponent1 = ; + + const WrongComponent1 = ( + + ); + + const metaForm = useAppForm({ + defaultValues, + onSubmitMeta, + }); + + const CorrectComponent2 = ; + const CorrectComponent3 = ; + + const diffMetaForm = useAppForm({ + defaultValues, + onSubmitMeta: { ...onSubmitMeta, something: 'else' }, + }); + + const CorrectComponent4 = ; + const WrongComponent2 = ( + + ); + }); + + it('should accept any validators for withFieldGroup', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const defaultValues = { + person: { firstName: 'FirstName', lastName: 'LastName' } satisfies Person, + }; + + const formA = useAppForm({ + defaultValues, + validators: { + onChange: () => 'A', + }, + listeners: { + onChange: () => 'A', + }, + }); + const formB = useAppForm({ + defaultValues, + validators: { + onChange: () => 'B', + }, + listeners: { + onChange: () => 'B', + }, + }); + + const FormGroup = withFieldGroup({ + defaultValues: defaultValues.person, + render: function Render({ group }) { + return ; + }, + }); + + const CorrectComponent1 = ; + const CorrectComponent2 = ; + }); + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const form = useAppForm({ + defaultValues, + }); + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <>; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ +
+ ); + }, + }); + + const Component = ; + }); + + it('should not allow withFieldGroups with different metas to be nested', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const LensNestedNoMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render() { + return <>; + }, + }); + const LensNestedWithMeta = withFieldGroup({ + defaultValues: defaultValues.form.field, + onSubmitMeta: { meta: '' }, + render: function Render() { + return <>; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ + +
+ ); + }, + }); + + it('should allow mapping withFieldGroup to different fields', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + }; + const defaultFields = { + first: '', + last: '', + }; + + const form = useAppForm({ + defaultValues, + }); + + const FieldGroup = withFieldGroup({ + defaultValues: defaultFields, + render: function Render() { + return <>; + }, + }); + + const Component1 = ( + + ); + + const Component2 = ( + + ); + }); + + it('should not allow fields mapping if the top level is an array', () => { + const defaultValues = { + firstName: '', + lastName: '', + age: 0, + relatives: [{ firstName: '', lastName: '', age: 0 }], + relativesRecord: { + something: { firstName: '', lastName: '', age: 0 }, + } as Record, + }; + const defaultFields = { + firstName: '', + lastName: '', + }; + + const form = useAppForm({ + defaultValues, + }); + + const FieldGroupRecord = withFieldGroup({ + defaultValues: { anything: defaultFields } as Record, + render: function Render() { + return <>; + }, + }); + const FieldGroupArray = withFieldGroup({ + defaultValues: [defaultFields], + render: function Render() { + return <>; + }, + }); + + const CorrectComponent1 = ; + const WrongComponent1 = ( + + ); + const CorrectComponent3 = ; + const WrongComponent2 = ( + + ); + }); + }); + + it('should allow mapping field groups to optional fields', () => { + const groupFields = { + name: '', + }; + + type WrapperValues = { + namespace: { name: string } | undefined; + namespace2: { name: string } | null; + namespace3: { name: string } | null | undefined; + nope: null | undefined; + nope2: { lastName: string } | null | undefined; + }; + + const defaultValues: WrapperValues = { + namespace: undefined, + namespace2: null, + namespace3: null, + nope: null, + nope2: null, + }; + + const FieldGroup = withFieldGroup({ + defaultValues: groupFields, + render: function Render() { + return <>; + }, + }); + + const form = useAppForm({ + defaultValues, + }); + + const Component = ; + const Component2 = ; + const Component3 = ; + // @ts-expect-error because it doesn't ever evaluate to the expected values + const Component4 = ; + // @ts-expect-error because the types don't match properly + const Component5 = ; + }); + + it('should allow interfaces without index signatures to be assigned to `props` in withForm and withFormGroup', () => { + interface TestNoSignature { + title: string; + } + + interface TestWithSignature { + title: string; + [key: string]: unknown; + } + + const WithFormComponent1 = withForm({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }); + + const WithFormComponent2 = withForm({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }); + + const WithFieldGroupComponent1 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestNoSignature, + render: () => <>, + }); + + const WithFieldGroupComponent2 = withFieldGroup({ + defaultValues: { name: '' }, + props: {} as TestWithSignature, + render: () => <>, + }); + + const appForm = useAppForm({ defaultValues: { name: '' } }); + + const Component1 = ; + const Component2 = ; + + const FieldGroupComponent1 = ( + + ); + const FieldGroupComponent2 = ( + + ); + }); + + it('should not allow null as prop in withForm and withFormGroup', () => { + const WithFormComponent = withForm({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }); + }); + + const WithFieldGroupComponent = withFieldGroup({ + defaultValues: { name: '' }, + // @ts-expect-error + props: null, + render: () => <>, + }); + + describe('extendForm', () => { + function ExtendedField() { + return null; + } + function ExtendedFormComp() { + return null; + } + + const baseHook = createFormHook({ + fieldComponents: { Test }, + formComponents: { Test }, + fieldContext, + formContext, + }); + + const { + withForm: withExtendedForm, + withFieldGroup: withExtendedFieldGroup, + extendForm, + } = baseHook.extendForm({ + fieldComponents: { ExtendedField }, + formComponents: { ExtendedFormComp }, + }); + + it('should expose extendForm on the returned hook', () => { + expectTypeOf(extendForm).toBeFunction(); + }); + + it('should include parent field components in the extended AppField render prop', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.AppField).toBeFunction(); + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + }); + + it('should include parent form components on the extended form', () => { + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + expectTypeOf(form.Test).toBeFunction(); + expectTypeOf(form.ExtendedFormComp).toBeFunction(); + return null; + }, + }); + }); + + it('should include parent and extended components in withFieldGroup', () => { + withExtendedFieldGroup({ + defaultValues: { name: '' }, + render: ({ group }) => { + expectTypeOf(group.Test).toBeFunction(); + expectTypeOf(group.ExtendedFormComp).toBeFunction(); + + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + }); + + it('should error when a duplicate field component name is used in extendForm', () => { + baseHook.extendForm({ + fieldComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedField, + }, + }); + }); + + it('should error when a duplicate form component name is used in extendForm', () => { + baseHook.extendForm({ + formComponents: { + // @ts-expect-error 'Test' already exists in the base form + Test: ExtendedFormComp, + }, + }); + }); + + it('should allow further extension of an already extended hook', () => { + function ThirdField() { + return null; + } + + const { useAppForm: useDoublyExtended } = baseHook + .extendForm({ fieldComponents: { ExtendedField } }) + .extendForm({ fieldComponents: { ThirdField } }); + + withExtendedForm({ + defaultValues: { name: '' }, + render: ({ form }) => { + return ( + + {(field) => { + expectTypeOf(field.Test).toBeFunction(); + expectTypeOf(field.ExtendedField).toBeFunction(); + return null; + }} + + ); + }, + }); + + const doublyExtendedForm = useDoublyExtended({ + defaultValues: { name: '' }, + }); + expectTypeOf(doublyExtendedForm.AppField).toBeFunction(); + }); + + it('should preserve its recursive type beyond the previous declaration cutoff', () => { + const deeplyExtended = baseHook + .extendForm({ fieldComponents: { Field01: Test } }) + .extendForm({ fieldComponents: { Field02: Test } }) + .extendForm({ fieldComponents: { Field03: Test } }) + .extendForm({ fieldComponents: { Field04: Test } }) + .extendForm({ fieldComponents: { Field05: Test } }) + .extendForm({ fieldComponents: { Field06: Test } }) + .extendForm({ fieldComponents: { Field07: Test } }) + .extendForm({ fieldComponents: { Field08: Test } }) + .extendForm({ fieldComponents: { Field09: Test } }) + .extendForm({ fieldComponents: { Field10: Test } }) + .extendForm({ fieldComponents: { Field11: Test } }) + .extendForm({ fieldComponents: { Field12: Test } }); + + expectTypeOf(deeplyExtended).not.toBeAny(); + expectTypeOf(deeplyExtended.extendForm).toBeFunction(); + }); + }); +}); diff --git a/packages/octane-form/tests/createFormHook.test.tsrx b/packages/octane-form/tests/createFormHook.test.tsrx index 955a75398..3d983e33f 100644 --- a/packages/octane-form/tests/createFormHook.test.tsrx +++ b/packages/octane-form/tests/createFormHook.test.tsrx @@ -1,937 +1,960 @@ -import { describe, expect, it } from 'vitest' -import { render, waitFor } from '@octanejs/testing-library' -import { formOptions } from '@tanstack/form-core' -import userEvent from '@testing-library/user-event' -import { createFormHook, createFormHookContexts, useSelector } from '../src' +import { describe, expect, it } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { formOptions } from '@tanstack/form-core'; +import userEvent from '@testing-library/user-event'; +import { createFormHook, createFormHookContexts, useSelector } from '../src'; -const user = userEvent.setup() +const user = userEvent.setup(); -const { fieldContext, useFieldContext, formContext, useFormContext } = - createFormHookContexts() +const { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts(); function TextField({ label }: { label: string }) { - const field = useFieldContext() - return + const field = useFieldContext(); + return ( + + ); } function SubscribeButton({ label }: { label: string }) { - const form = useFormContext() - return state.isSubmitting}> - {(isSubmitting) => } - + const form = useFormContext(); + return ( + state.isSubmitting}> + {(isSubmitting) => } + + ); } -const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = - createFormHook({ - fieldComponents: { - TextField, - }, - formComponents: { - SubscribeButton, - }, - fieldContext, - formContext, - }) +const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = createFormHook({ + fieldComponents: { + TextField, + }, + formComponents: { + SubscribeButton, + }, + fieldContext, + formContext, +}); describe('createFormHook', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - } - - function Comp() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return <> - } - /> - - } - - const { getByLabelText } = render() - const input = getByLabelText('Testing') - expect(input).toHaveValue('FirstName') - }) - - it('should handle withForm types properly', () => { - const formOpts = formOptions({ - defaultValues: { - firstName: 'John', - lastName: 'Doe', - }, - }) - - const ChildForm = withForm({ - ...formOpts, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ form, title }) => { - return
-

{title}

- } - /> - - - -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - - return - } - - const { getByLabelText, getByText } = render() - const input = getByLabelText('First Name') - expect(input).toHaveValue('John') - expect(getByText('Testing')).toBeInTheDocument() - }) - - it('should handle withFieldGroup types properly', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }) - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ group, title }) => { - return
-

{title}

- } - /> - - - -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - - return - } - - const { getByLabelText, getByText } = render() - const input = getByLabelText('First Name') - expect(input).toHaveValue('John') - expect(getByText('Testing')).toBeInTheDocument() - }) - - it('should use the correct field name in Field with withFieldGroup', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - people: [ - { - firstName: 'Jane', - lastName: 'Doe', - }, - { - firstName: 'Robert', - lastName: 'Doe', - }, - ], - }, - }) - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return
- } - /> - - - -
- }, - }) - const ChildFormAsArray = withFieldGroup({ - defaultValues: [formOpts.defaultValues.person], - props: { - title: '', - }, - render: ({ group, title }) => { - return
-

{title}

- } - /> - - - -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - - return <> - - - - - } - - const { getByLabelText, getByText } = render() - const inputField1 = getByLabelText('person.firstName') - const inputArray = getByLabelText('people[0].firstName') - const inputField2 = getByLabelText('people[1].firstName') - expect(inputField1).toHaveValue('John') - expect(inputArray).toHaveValue('Jane') - expect(inputField2).toHaveValue('Robert') - expect(getByText('Testing')).toBeInTheDocument() - }) - - it('should forward Field and Subscribe to the form', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }) - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return
- } - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - return - } - - const { getByLabelText, getByText } = render() - const input = getByLabelText('person.firstName') - expect(input).toHaveValue('John') - expect(getByText('Doe')).toBeInTheDocument() - }) - - it('should not lose focus on update with withFieldGroup', async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }) - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: function Render({ group }) { - const firstName = useSelector( - group.store, - (state) => state.values.firstName, - ) - return
-

{firstName}

- } - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - return - } - - const { getByLabelText } = render() - - const input = getByLabelText('person.firstName') - input.focus() - expect(input).toHaveFocus() - - await user.clear(input) - await user.type(input, 'Something') - - expect(input).toHaveFocus() - }) - - it('should allow nesting withFieldGroup in other withFieldGroups', () => { - type Nested = { - firstName: string; - } - type Wrapper = { - field: Nested; - } - type FormValues = { - form: Wrapper; - unrelated: { something: { lastName: string } }; - } - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - } - - const LensNested = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render({ group }) { - return - {(field) =>

{field.name}

} -
- }, - }) - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return
- -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - defaultValues, - }) - return - } - - const { getByText } = render() - - expect(getByText('form.field.firstName')).toBeInTheDocument() - }) - - it('should allow mapping withFieldGroup to different values', () => { - const formOpts = formOptions({ - defaultValues: { - unrelated: 'John', - values: '', - }, - }) - - const ChildFormAsField = withFieldGroup({ - defaultValues: { firstName: '', lastName: '' }, - render: ({ group }) => { - return
- } - /> -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - - return - } - - const { getByLabelText } = render() - const inputField1 = getByLabelText('unrelated') - expect(inputField1).toHaveValue('John') - }) - - it('should remap FieldGroupApi.Field validators to the correct names', () => { - const FieldGroupString = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual([ - 'account.password', - ]) - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'account.confirmPassword', - ]) - return <> - }} - - }, - }) - - const FieldGroupObject = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual([ - 'userPassword', - ]) - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'userConfirmPassword', - ]) - return <> - }} - - }, - }) - - const Parent = () => { - const form = useAppForm({ - defaultValues: { - account: { - password: '', - confirmPassword: '', - }, - userPassword: '', - userConfirmPassword: '', - }, - }) - - return <> - - - - } - - render() - }) - - it('should accept formId and return it', async () => { - function Submit() { - const form = useFormContext() - - return - } - - function Comp() { - const form = useAppForm({ - formId: 'test', - }) - - return -
{ - e.preventDefault() - form.handleSubmit() - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => - {submissionAttempts}} - /> - - -
- } - - const { getByTestId } = render() - const target = getByTestId('formId-target') - const result = getByTestId('formId-result') - - expect(target).toHaveAttribute('form', 'test') - expect(target).toHaveTextContent('test') - await user.click(target) - expect(result).toHaveTextContent('1') - }) - - it('should allow using typed app form', () => { - type Person = { - firstName: string; - lastName: string; - } - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - function Child() { - const form = useTypedAppFormContext(formOpts) - - return } - /> - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return - - - } - - const { getByLabelText } = render() - const input = getByLabelText('Testing') - expect(input).toHaveValue('FirstName') - }) - - it('should throw if `useTypedAppFormContext` is used without AppForm', () => { - type Person = { - firstName: string; - lastName: string; - } - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - function Child() { - const form = useTypedAppFormContext(formOpts) - - return } - /> - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return - } - - expect(() => render()).toThrow() - }) - - it('should allow using typed app form with form components', () => { - type Person = { - firstName: string; - lastName: string; - } - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - function Child() { - const form = useTypedAppFormContext(formOpts) - - return - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return - - - } - - const { getByText } = render() - const button = getByText('Testing') - expect(button).toBeInTheDocument() - }) - - describe('extendForm', () => { - it('should include both parent and extended field components', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext() - return - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }) - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John', lastName: 'Doe' }, - }) - - return <> - } - /> - } - /> - - } - - const { getByLabelText, getByTestId } = render() - expect(getByLabelText('First Name')).toHaveValue('John') - expect(getByTestId('extended-input')).toHaveValue('Doe') - }) - - it('should include both parent and extended form components', () => { - function ExtendedSubmit({ label }: { label: string }) { - const form = useFormContext() - return state.isSubmitting}> - {(isSubmitting) => - } - - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - formComponents: { ExtendedSubmit }, - }) - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John' }, - }) - - return - - - - } - - const { getByText, getByTestId } = render() - expect(getByText('Submit')).toBeInTheDocument() - expect(getByTestId('extended-submit')).toHaveTextContent( - 'Extended Submit', - ) - }) - - it('should support chaining multiple extendForm calls', () => { - function FieldA({ label }: { label: string }) { - const field = useFieldContext() - return - } - - function FieldB({ label }: { label: string }) { - const field = useFieldContext() - return - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: {}, - fieldContext, - formContext, - }) - - const { useAppForm: useChainedForm } = base.extendForm({ - fieldComponents: { FieldA }, - }).extendForm({ fieldComponents: { FieldB } }) - - function Comp() { - const form = useChainedForm({ - defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, - }) - - return <> - } - /> - } - /> - } - /> - - } - - const { getByLabelText } = render() - expect(getByLabelText('A')).toHaveValue('valueA') - expect(getByLabelText('B')).toHaveValue('valueB') - expect(getByLabelText('C')).toHaveValue('valueC') - }) - - it('should work with withForm after extendForm', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext() - return - } - - const { useAppForm: useExtendedForm, withForm: withExtendedForm } = - createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }) - - const ChildForm = withExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - render: function Render({ form }) { - return <> - } - /> - - } - /> - - }, - }) - - function Parent() { - const form = useExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - }) - return - } - - const { getByLabelText } = render() - expect(getByLabelText('First Name')).toHaveValue('Jane') - expect(getByLabelText('Last Name')).toHaveValue('Smith') - }) - - it('should return a new extendForm from the extended hook', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext() - return - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }) - - const extended = base.extendForm({ - fieldComponents: { ExtendedTextField }, - }) - - // extendForm should itself expose extendForm - expect(typeof extended.extendForm).toBe('function') - }) - }) - - it( - 'should render FieldGroup Subscribe without selector (default identity)', - async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'FirstName', - lastName: 'LastName', - }, - }, - }) - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return
- } - /> - - {state.values.lastName}} - /> -
- }, - }) - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }) - return - } - - const { getByTestId } = render() - const input = getByTestId('lastName') - const stateLastName = getByTestId('state-lastName') - - expect(stateLastName).toHaveTextContent('LastName') - - await user.clear(input) - await user.type(input, 'Updated') - await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')) - }, - ) -}) + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + } + /> + + ); + } + + const { getByLabelText } = render(); + const input = getByLabelText('Testing'); + expect(input).toHaveValue('FirstName'); + }); + + it('should handle withForm types properly', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'John', + lastName: 'Doe', + }, + }); + + const ChildForm = withForm({ + ...formOpts, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ form, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('First Name'); + expect(input).toHaveValue('John'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should handle withFieldGroup types properly', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ group, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('First Name'); + expect(input).toHaveValue('John'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should use the correct field name in Field with withFieldGroup', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + people: [ + { + firstName: 'Jane', + lastName: 'Doe', + }, + { + firstName: 'Robert', + lastName: 'Doe', + }, + ], + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ } + /> + + + +
+ ); + }, + }); + const ChildFormAsArray = withFieldGroup({ + defaultValues: [formOpts.defaultValues.person], + props: { + title: '', + }, + render: ({ group, title }) => { + return ( +
+

{title}

+ } + /> + + + +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ( + <> + + + + + ); + }; + + const { getByLabelText, getByText } = render(); + const inputField1 = getByLabelText('person.firstName'); + const inputArray = getByLabelText('people[0].firstName'); + const inputField2 = getByLabelText('people[1].firstName'); + expect(inputField1).toHaveValue('John'); + expect(inputArray).toHaveValue('Jane'); + expect(inputField2).toHaveValue('Robert'); + expect(getByText('Testing')).toBeInTheDocument(); + }); + + it('should forward Field and Subscribe to the form', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ ( + + )} + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByLabelText, getByText } = render(); + const input = getByLabelText('person.firstName'); + expect(input).toHaveValue('John'); + expect(getByText('Doe')).toBeInTheDocument(); + }); + + it('should not lose focus on update with withFieldGroup', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }); + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: function Render({ group }) { + const firstName = useSelector(group.store, (state) => state.values.firstName); + return ( +
+

{firstName}

+ ( + + )} + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByLabelText } = render(); + + const input = getByLabelText('person.firstName'); + input.focus(); + expect(input).toHaveFocus(); + + await user.clear(input); + await user.type(input, 'Something'); + + expect(input).toHaveFocus(); + }); + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + }; + type Wrapper = { + field: Nested; + }; + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + }; + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + }; + + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render({ group }) { + return {(field) =>

{field.name}

}
; + }, + }); + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return ( +
+ +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + defaultValues, + }); + return ; + }; + + const { getByText } = render(); + + expect(getByText('form.field.firstName')).toBeInTheDocument(); + }); + + it('should allow mapping withFieldGroup to different values', () => { + const formOpts = formOptions({ + defaultValues: { + unrelated: 'John', + values: '', + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: { firstName: '', lastName: '' }, + render: ({ group }) => { + return ( +
+ } + /> +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + + return ( + + ); + }; + + const { getByLabelText } = render(); + const inputField1 = getByLabelText('unrelated'); + expect(inputField1).toHaveValue('John'); + }); + + it('should remap FieldGroupApi.Field validators to the correct names', () => { + const FieldGroupString = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return ( + null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'account.password', + ]); + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'account.confirmPassword', + ]); + return <>; + }} + + ); + }, + }); + + const FieldGroupObject = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return ( + null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual(['userPassword']); + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'userConfirmPassword', + ]); + return <>; + }} + + ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + defaultValues: { + account: { + password: '', + confirmPassword: '', + }, + userPassword: '', + userConfirmPassword: '', + }, + }); + + return ( + <> + + + + ); + }; + + render(); + }); + + it('should accept formId and return it', async () => { + function Submit() { + const form = useFormContext(); + + return ( + + ); + } + + function Comp() { + const form = useAppForm({ + formId: 'test', + }); + + return ( + +
{ + e.preventDefault(); + form.handleSubmit(); + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => ( + {submissionAttempts} + )} + /> + + +
+ ); + } + + const { getByTestId } = render(); + const target = getByTestId('formId-target'); + const result = getByTestId('formId-result'); + + expect(target).toHaveAttribute('form', 'test'); + expect(target).toHaveTextContent('test'); + await user.click(target); + expect(result).toHaveTextContent('1'); + }); + + it('should allow using typed app form', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ( + } /> + ); + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + + + + ); + } + + const { getByLabelText } = render(); + const input = getByLabelText('Testing'); + expect(input).toHaveValue('FirstName'); + }); + + it('should throw if `useTypedAppFormContext` is used without AppForm', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ( + } /> + ); + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ; + } + + expect(() => render()).toThrow(); + }); + + it('should allow using typed app form with form components', () => { + type Person = { + firstName: string; + lastName: string; + }; + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + function Child() { + const form = useTypedAppFormContext(formOpts); + + return ; + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + + + + ); + } + + const { getByText } = render(); + const button = getByText('Testing'); + expect(button).toBeInTheDocument(); + }); + + describe('extendForm', () => { + it('should include both parent and extended field components', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }); + + return ( + <> + } + /> + } + /> + + ); + } + + const { getByLabelText, getByTestId } = render(); + expect(getByLabelText('First Name')).toHaveValue('John'); + expect(getByTestId('extended-input')).toHaveValue('Doe'); + }); + + it('should include both parent and extended form components', () => { + function ExtendedSubmit({ label }: { label: string }) { + const form = useFormContext(); + return ( + state.isSubmitting}> + {(isSubmitting) => ( + + )} + + ); + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + formComponents: { ExtendedSubmit }, + }); + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John' }, + }); + + return ( + + + + + ); + } + + const { getByText, getByTestId } = render(); + expect(getByText('Submit')).toBeInTheDocument(); + expect(getByTestId('extended-submit')).toHaveTextContent('Extended Submit'); + }); + + it('should support chaining multiple extendForm calls', () => { + function FieldA({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + function FieldB({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: {}, + fieldContext, + formContext, + }); + + const { useAppForm: useChainedForm } = base + .extendForm({ fieldComponents: { FieldA } }) + .extendForm({ fieldComponents: { FieldB } }); + + function Comp() { + const form = useChainedForm({ + defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, + }); + + return ( + <> + } /> + } /> + } /> + + ); + } + + const { getByLabelText } = render(); + expect(getByLabelText('A')).toHaveValue('valueA'); + expect(getByLabelText('B')).toHaveValue('valueB'); + expect(getByLabelText('C')).toHaveValue('valueC'); + }); + + it('should work with withForm after extendForm', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const { useAppForm: useExtendedForm, withForm: withExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + const ChildForm = withExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + render: function Render({ form }) { + return ( + <> + } + /> + } + /> + + ); + }, + }); + + function Parent() { + const form = useExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + }); + return ; + } + + const { getByLabelText } = render(); + expect(getByLabelText('First Name')).toHaveValue('Jane'); + expect(getByLabelText('Last Name')).toHaveValue('Smith'); + }); + + it('should return a new extendForm from the extended hook', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext(); + return ( + + ); + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }); + + const extended = base.extendForm({ + fieldComponents: { ExtendedTextField }, + }); + + // extendForm should itself expose extendForm + expect(typeof extended.extendForm).toBe('function'); + }); + }); + + it('should render FieldGroup Subscribe without selector (default identity)', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }, + }); + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return ( +
+ ( + + )} + /> + ( + {state.values.lastName} + )} + /> +
+ ); + }, + }); + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }); + return ; + }; + + const { getByTestId } = render(); + const input = getByTestId('lastName'); + const stateLastName = getByTestId('state-lastName'); + + expect(stateLastName).toHaveTextContent('LastName'); + + await user.clear(input); + await user.type(input, 'Updated'); + await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')); + }); +}); diff --git a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx index 2edb624f8..61ae0a559 100644 --- a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx +++ b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx @@ -1,137 +1,138 @@ -import { describe, expect, it, vi } from 'vitest' -import { act, fireEvent, render } from '@octanejs/testing-library' -import { useSelector } from '@tanstack/octane-store' -import { useForm } from '../src' -import { sleep } from './utils' -import type { ReadonlyStore } from '@tanstack/octane-store' +import { describe, expect, it, vi } from 'vitest'; +import { act, fireEvent, render } from '@octanejs/testing-library'; +import { useSelector } from '@tanstack/octane-store'; +import { useForm } from '../src'; +import { sleep } from './utils'; +import type { ReadonlyStore } from '@tanstack/octane-store'; function DebugSubscribe({ store }: { store: ReadonlyStore }) { - const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating) - return {String( - isFieldsValidating, - )} + const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating); + return {String(isFieldsValidating)}; } describe('Octane adapter - onChangeListenTo race', () => { - it( - 'does not leave linked fields stuck in isValidating when multiple rapid updates occur', - async () => { - vi.useFakeTimers() - - const validationFn = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - street: '', - houseNo: '', - zipCode: '', - city: '', - }, - }) - - return <> - { - await sleep(500) - validationFn() - return undefined - }, - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> - {String( - field.state.meta.isValidating, - )} -
} - /> - -
- field.handleChange(e.target.value)} - /> - {String( - field.state.meta.isValidating, - )} -
} - /> - -
- field.handleChange(e.target.value)} - /> - {String( - field.state.meta.isValidating, - )} -
} - /> - -
- field.handleChange(e.target.value)} - /> - {String( - field.state.meta.isValidating, - )} -
} - /> - - - - } - - const { getByTestId } = render() - - const street = getByTestId('street') as HTMLInputElement - const houseNo = getByTestId('houseNo') as HTMLInputElement - const zipCode = getByTestId('zipCode') as HTMLInputElement - const city = getByTestId('city') as HTMLInputElement - - await act(async () => { - // Simulate rapid updates (autofill), then run debounce + async validation. - fireEvent.input(street, { target: { value: 'Foo Street' } }) - fireEvent.input(houseNo, { target: { value: '2' } }) - fireEvent.input(zipCode, { target: { value: '12345' } }) - fireEvent.input(city, { target: { value: 'Barrington' } }) - await vi.runAllTimersAsync() - }) - - expect(validationFn).toHaveBeenCalledTimes(1) - - // Verify validation flags are not stuck - const isFieldsValidating = getByTestId('isFieldsValidating').textContent - const streetValidating = getByTestId('street-validating').textContent - const houseValidating = getByTestId('houseNo-validating').textContent - const zipValidating = getByTestId('zipCode-validating').textContent - const cityValidating = getByTestId('city-validating').textContent - - expect(isFieldsValidating).toBe('false') - expect(streetValidating).toBe('false') - expect(houseValidating).toBe('false') - expect(zipValidating).toBe('false') - expect(cityValidating).toBe('false') - - vi.useRealTimers() - }, - ) -}) + it('does not leave linked fields stuck in isValidating when multiple rapid updates occur', async () => { + vi.useFakeTimers(); + + const validationFn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + street: '', + houseNo: '', + zipCode: '', + city: '', + }, + }); + + return ( + <> + { + await sleep(500); + validationFn(); + return undefined; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> + {String(field.state.meta.isValidating)} +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + + {String(field.state.meta.isValidating)} + +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + + {String(field.state.meta.isValidating)} + +
+ )} + /> + + ( +
+ field.handleChange(e.target.value)} + /> + {String(field.state.meta.isValidating)} +
+ )} + /> + + + + ); + } + + const { getByTestId } = render(); + + const street = getByTestId('street') as HTMLInputElement; + const houseNo = getByTestId('houseNo') as HTMLInputElement; + const zipCode = getByTestId('zipCode') as HTMLInputElement; + const city = getByTestId('city') as HTMLInputElement; + + await act(async () => { + // Simulate rapid updates (autofill), then run debounce + async validation. + fireEvent.input(street, { target: { value: 'Foo Street' } }); + fireEvent.input(houseNo, { target: { value: '2' } }); + fireEvent.input(zipCode, { target: { value: '12345' } }); + fireEvent.input(city, { target: { value: 'Barrington' } }); + await vi.runAllTimersAsync(); + }); + + expect(validationFn).toHaveBeenCalledTimes(1); + + // Verify validation flags are not stuck + const isFieldsValidating = getByTestId('isFieldsValidating').textContent; + const streetValidating = getByTestId('street-validating').textContent; + const houseValidating = getByTestId('houseNo-validating').textContent; + const zipValidating = getByTestId('zipCode-validating').textContent; + const cityValidating = getByTestId('city-validating').textContent; + + expect(isFieldsValidating).toBe('false'); + expect(streetValidating).toBe('false'); + expect(houseValidating).toBe('false'); + expect(zipValidating).toBe('false'); + expect(cityValidating).toBe('false'); + + vi.useRealTimers(); + }); +}); diff --git a/packages/octane-form/tests/server.test.tsrx b/packages/octane-form/tests/server.test.tsrx index 8c0817199..be8a1dbec 100644 --- a/packages/octane-form/tests/server.test.tsrx +++ b/packages/octane-form/tests/server.test.tsrx @@ -1,34 +1,34 @@ -import { describe, expect, it } from 'vitest' -import { renderToStaticMarkup } from 'octane/server' +import { describe, expect, it } from 'vitest'; +import { renderToStaticMarkup } from 'octane/server'; -import { useForm } from '../src' +import { useForm } from '../src'; function ServerForm() @{ - const form = useForm({ - defaultValues: { - name: 'Server Ada', - }, - }) + const form = useForm({ + defaultValues: { + name: 'Server Ada', + }, + }); -
- - {(field) => } - - state.values.name}> - {(name) => {name}} - -
+
+ + {(field) => } + + state.values.name}> + {(name) => {name}} + +
} describe('@tanstack/octane-form SSR', () => { - it('renders field and form snapshots without a DOM', () => { - expect(typeof document).toBe('undefined') + it('renders field and form snapshots without a DOM', () => { + expect(typeof document).toBe('undefined'); - const { html, css } = renderToStaticMarkup(ServerForm) + const { html, css } = renderToStaticMarkup(ServerForm); - expect(html).toBe( - '
Server Ada
', - ) - expect(css).toBe('') - }) -}) + expect(html).toBe( + '
Server Ada
', + ); + expect(css).toBe(''); + }); +}); diff --git a/packages/octane-form/tests/useField.test-d.tsx b/packages/octane-form/tests/useField.test-d.tsx index 100f990e9..0d06d8386 100644 --- a/packages/octane-form/tests/useField.test-d.tsx +++ b/packages/octane-form/tests/useField.test-d.tsx @@ -1,112 +1,110 @@ /** @jsxImportSource octane */ -import { expectTypeOf, it } from 'vitest' -import { useForm } from '../src/index' +import { expectTypeOf, it } from 'vitest'; +import { useForm } from '../src/index'; it('should type state.value properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const) + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const); - return ( - <> - { - expectTypeOf(field.state.value).toEqualTypeOf<'test'>() - return null - }} - /> - { - expectTypeOf(field.state.value).toEqualTypeOf<84>() - return null - }} - /> - - ) - } -}) + return ( + <> + { + expectTypeOf(field.state.value).toEqualTypeOf<'test'>(); + return null; + }} + /> + { + expectTypeOf(field.state.value).toEqualTypeOf<84>(); + return null; + }} + /> + + ); + } +}); it('should type onChange properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const) + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const); - return ( - <> - { - expectTypeOf(value).toEqualTypeOf<'test'>() - return null - }, - }} - children={() => null} - /> - { - expectTypeOf(value).toEqualTypeOf<84>() - return null - }, - }} - children={() => null} - /> - - ) - } -}) + return ( + <> + { + expectTypeOf(value).toEqualTypeOf<'test'>(); + return null; + }, + }} + children={() => null} + /> + { + expectTypeOf(value).toEqualTypeOf<84>(); + return null; + }, + }} + children={() => null} + /> + + ); + } +}); it('should type array subfields', () => { - type FormDefinition = { - nested: { - people: { - name: string - age: number - }[] - } - } + type FormDefinition = { + nested: { + people: { + name: string; + age: number; + }[]; + }; + }; - function App() { - const form = useForm({ - defaultValues: { - nested: { - people: [], - }, - } as FormDefinition, - onSubmit({ value }) { - alert(JSON.stringify(value)) - }, - }) + function App() { + const form = useForm({ + defaultValues: { + nested: { + people: [], + }, + } as FormDefinition, + onSubmit({ value }) { + alert(JSON.stringify(value)); + }, + }); - return ( - - {(field) => - field.state.value.map((_, i) => ( - - {(subField) => ( - - subField.handleChange(event.currentTarget.value) - } - /> - )} - - )) - } - - ) - } -}) + return ( + + {(field) => + field.state.value.map((_, i) => ( + + {(subField) => ( + subField.handleChange(event.currentTarget.value)} + /> + )} + + )) + } + + ); + } +}); diff --git a/packages/octane-form/tests/useField.test.tsrx b/packages/octane-form/tests/useField.test.tsrx index 9e06bab67..314a0d0b5 100644 --- a/packages/octane-form/tests/useField.test.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -1,1454 +1,1527 @@ -import { describe, expect, it, vi } from 'vitest' -import { render, waitFor, within } from '@octanejs/testing-library' -import { userEvent } from '@testing-library/user-event' -import { useState } from 'octane' -import { useForm, useSelector } from '../src' -import { sleep } from './utils' +import { describe, expect, it, vi } from 'vitest'; +import { render, waitFor, within } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useState } from 'octane'; +import { useForm, useSelector } from '../src'; +import { sleep } from './utils'; -const user = userEvent.setup() +const user = userEvent.setup(); describe('useField', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - } - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return <> - { - return field.handleChange(e.target.value)} - /> - }} - /> - - } - - const { getByTestId } = render() - const input = getByTestId('fieldinput') - expect(input).toHaveValue('FirstName') - }) - - it('should use field default value first', () => { - type Person = { - firstName: string; - lastName: string; - } - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return <> - { - return field.handleChange(e.target.value)} - /> - }} - /> - - } - - const { getByTestId } = render() - const input = getByTestId('fieldinput') - expect(input).toHaveValue('otherName') - }) - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - (value === 'other' ? error : undefined), - }} - children={(field) =>
- field.setValue(e.target.value, { - dontUpdateMeta: true, - })} - /> -

{field.getMeta().errors}

-
} - /> - - } - - const { getByTestId, queryByText } = render() - const input = getByTestId('fieldinput') - await user.type(input, 'other') - expect(queryByText(error)).not.toBeInTheDocument() - }) - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - (value === 'other' ? error : undefined), - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(error)).not.toBeInTheDocument() - await user.type(input, 'other') - expect(getByText(error)).toBeInTheDocument() - }) - - it('should validate on change and on blur', async () => { - type Person = { - firstName: string; - lastName: string; - } - const onChangeError = 'Please enter a different value (onChangeError)' - const onBlurError = 'Please enter a different value (onBlurError)' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - (value === 'other' - ? onChangeError - : undefined), - onBlur: ({ value }) => (value === 'other' - ? onBlurError - : undefined), - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(onChangeError)).not.toBeInTheDocument() - expect(queryByText(onBlurError)).not.toBeInTheDocument() - await user.type(input, 'other') - expect(getByText(onChangeError)).toBeInTheDocument() - await user.click(document.body) - expect(queryByText(onBlurError)).toBeInTheDocument() - }) - - it('should properly update conditionally rendered fields', async () => { - type FormValues = { - firstField: string; - secondField: string; - showFirstField: boolean; - } - - function Comp() { - const form = useForm({ - defaultValues: { - firstField: '', - secondField: '', - showFirstField: true, - } as FormValues, - }) - - return <> - - {({ handleChange, state }) =>
- Show first field - { - handleChange(e.target.checked) - }} - /> -
} -
- state.values.showFirstField}> - {(someFlagChecked) => { - if (someFlagChecked) { - return - {({ handleChange, state }) => } - - } - - return - {({ handleChange, state }) => } - - }} - - - } - - const { getByTestId } = render() - - const showFirstFieldInput = getByTestId('show-first-field') - - await user.type(getByTestId('first-field'), 'hello') - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') - - await user.click(showFirstFieldInput) - await user.type(getByTestId('second-field'), 'world') - expect((getByTestId('second-field') as HTMLInputElement).value).toBe( - 'world', - ) - - await user.click(showFirstFieldInput) - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') - }) - - it('should not keep hidden field submit errors after unmount', async () => { - const onSubmit = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: ({ value }) => onSubmit(value), - }) - - return
{ - e.preventDefault() - e.stopPropagation() - form.handleSubmit() - }} - > - - {(field) => - field.handleChange(e.target.value)} - />} - - - state.values.firstName === 'a'}> - {(showLastName) => showLastName - ? (value.length >= 5 - ? undefined - : 'lastName too short'), - }} - > - {(field) => - field.handleChange(e.target.value)} - />} - - : null} - - - [state.canSubmit, state.isSubmitting]} - > - {([canSubmit, isSubmitting]) => } - -
- } - - const { getByTestId, queryByTestId } = render() - - const submitButton = getByTestId('submit') - - await user.type(getByTestId('first-name'), 'a') - await user.type(getByTestId('last-name'), 'abc') - await user.click(submitButton) - - await waitFor(() => expect(submitButton).toBeDisabled()) - expect(onSubmit).toHaveBeenCalledTimes(0) - - await user.clear(getByTestId('first-name')) - await user.type(getByTestId('first-name'), 'b') - - await waitFor( - () => expect(queryByTestId('last-name')).not.toBeInTheDocument(), - ) - await waitFor(() => expect(submitButton).toBeEnabled()) - - await user.click(submitButton) - await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)) - - await user.clear(getByTestId('first-name')) - await user.type(getByTestId('first-name'), 'a') - - const remountedLastName = await waitFor(() => getByTestId('last-name')) - expect((remountedLastName as HTMLInputElement).value).toBe('abc') - expect(submitButton).toBeEnabled() - }) - - it( - 'should call onUnmount listener when a field is conditionally removed', - async () => { - const fieldUnmount = vi.fn() - const formFieldUnmount = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - show: true, - name: 'test', - }, - listeners: { - onFieldUnmount: formFieldUnmount, - }, - }) - - return <> - - {(field) => - field.handleChange(e.target.checked)} - />} - - - s.values.show}> - {(show) => show - ? - {(field) => - field.handleChange(e.target.value)} - />} - - : null} - - - } - - const { getByTestId, queryByTestId } = render() - - await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()) - - const callsBefore = fieldUnmount.mock.calls.length - const formCallsBefore = formFieldUnmount.mock.calls.length - - await user.click(getByTestId('toggle')) - - await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()) - expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1) - expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1) - }, - ) - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - { - await sleep(10) - return error - }, - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(error)).not.toBeInTheDocument() - await user.type(input, 'other') - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - }) - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - } - const onChangeError = 'Please enter a different value (onChangeError)' - const onBlurError = 'Please enter a different value (onBlurError)' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - { - await sleep(10) - return onChangeError - }, - onBlurAsync: async () => { - await sleep(10) - return onBlurError - }, - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - - expect(queryByText(onChangeError)).not.toBeInTheDocument() - expect(queryByText(onBlurError)).not.toBeInTheDocument() - await user.type(input, 'other') - await waitFor(() => getByText(onChangeError)) - expect(getByText(onChangeError)).toBeInTheDocument() - await user.click(document.body) - await waitFor(() => getByText(onBlurError)) - expect(getByText(onBlurError)).toBeInTheDocument() - }) - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - } - const mockFn = vi.fn() - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }) - - return <> - { - mockFn() - await sleep(10) - return error - }, - }} - children={(field) =>
- field.handleChange(e.target.value)} - /> -

{field.getMeta().errors}

-
} - /> - - } - - const { getByTestId, getByText } = render() - const input = getByTestId('fieldinput') - await user.type(input, 'other') - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0) - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - expect(mockFn).toHaveBeenCalledTimes(1) - }) - - it('should handle arrays with primitive values', async () => { - const fn = vi.fn() - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array, - }, - onSubmit: ({ value }) => fn(value), - }) - - return
-
{ - e.preventDefault() - e.stopPropagation() - form.handleSubmit() - }} - > - - {(field) => { - return
- {field.state.value.map((_, i) => { - return - {(subField) => { - return
- - -
- }} -
- })} - -
- }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => } - /> - -
- } - - const { getByText, findByLabelText, queryByText, findByText } = render( - , - ) - - expect(queryByText('Name for person 0')).not.toBeInTheDocument() - expect(queryByText('Name for person 1')).not.toBeInTheDocument() - await user.click(getByText('Add person')) - const input = await findByLabelText('Name for person 0') - expect(input).toBeInTheDocument() - await user.type(input, 'John') - - await user.click(getByText('Add person')) - const input2 = await findByLabelText('Name for person 1') - expect(input).toBeInTheDocument() - await user.type(input2, 'Jack') - - expect(queryByText('Name for person 0')).toBeInTheDocument() - expect(queryByText('Name for person 1')).toBeInTheDocument() - await user.click(getByText('Remove person 1')) - expect(queryByText('Name for person 0')).toBeInTheDocument() - expect(queryByText('Name for person 1')).not.toBeInTheDocument() - - await user.click(await findByText('Submit')) - expect(fn).toHaveBeenCalledWith({ people: ['John'] }) - }) - - it('should handle arrays with subvalues', async () => { - const fn = vi.fn() - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array<{ age: number; name: string }>, - }, - onSubmit: ({ value }) => fn(value), - }) - - return
-
{ - e.preventDefault() - e.stopPropagation() - form.handleSubmit() - }} - > - - {(field) => { - return
- {field.state.value.map((_, i) => { - return - {(subField) => { - return
- - -
- }} -
- })} - -
- }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => } - /> - -
- } - - const { getByText, findByLabelText, queryByText, findByText } = render( - , - ) - - expect(queryByText('Name for person 0')).not.toBeInTheDocument() - expect(queryByText('Name for person 1')).not.toBeInTheDocument() - await user.click(getByText('Add person')) - const input = await findByLabelText('Name for person 0') - expect(input).toBeInTheDocument() - await user.type(input, 'John') - - await user.click(getByText('Add person')) - const input2 = await findByLabelText('Name for person 1') - expect(input).toBeInTheDocument() - await user.type(input2, 'Jack') - - expect(queryByText('Name for person 0')).toBeInTheDocument() - expect(queryByText('Name for person 1')).toBeInTheDocument() - await user.click(getByText('Remove person 1')) - expect(queryByText('Name for person 0')).toBeInTheDocument() - expect(queryByText('Name for person 1')).not.toBeInTheDocument() - - await user.click(await findByText('Submit')) - expect(fn).toHaveBeenCalledWith({ - people: [ - { name: 'John', age: 0 }, - ], - }) - }) - - it( - 'should not surface undefined for shifted items when a non-last stably-keyed array item is removed', - async () => { - // Regression test for https://github.com/TanStack/form/issues/2238 - // When array items are keyed by a stable id (not index), removing a - // non-last item changes the `name` prop of the surviving items. The field - // must read state at its current `name` on that render, never `undefined`. - const observedValues: Array = [] - - function Comp() { - const form = useForm({ - defaultValues: { - sections: [] as Array<{ id: string; title: string }>, - }, - }) - - let nextId = 0 - - return - {(field) => { - return
- {field.state.value.map((section, i) => { - return - {(subField) => { - observedValues.push(subField.state.value) - return - }} - - })} - - -
- }} -
- } - - const { getByText, findByLabelText } = render() - - await user.click(getByText('Add section')) - await user.click(getByText('Add section')) - - await findByLabelText('Title for section id-1') - await findByLabelText('Title for section id-2') - - observedValues.length = 0 - await user.click(getByText('Remove first section')) - - // The surviving item (previously `sections[1]`) shifts to `sections[0]`. - // Its value must remain "Section 2" and never render as `undefined`. - const survivingInput = await findByLabelText('Title for section id-2') - expect((survivingInput as HTMLInputElement).value).toBe('Section 2') - expect(observedValues).not.toContain(undefined) - }, - ) - - it('should handle sync linked fields', async () => { - const fn = vi.fn() - function Comp() { - const form = useForm({ - defaultValues: { - password: '', - confirm_password: '', - }, - onSubmit: ({ value }) => fn(value), - }) - - return
- - {(field) => { - return
- -
- }} -
- { - if (value !== fieldApi.form.getFieldValue('password')) { - return 'Passwords do not match' - } - return undefined - }, - }} - > - {(field) => { - return
- - {field.state.meta.errors.map((err) => { - return
{err}
- })} -
- }} -
-
- } - - const { findByLabelText, queryByText, findByText } = render() - - const passwordInput = await findByLabelText('Password') - const confirmPasswordInput = await findByLabelText('Confirm Password') - await user.type(passwordInput, 'password') - await user.type(confirmPasswordInput, 'password') - expect(queryByText('Passwords do not match')).not.toBeInTheDocument() - await user.type(confirmPasswordInput, '1') - expect(await findByText('Passwords do not match')).toBeInTheDocument() - }) - - it('should validate async on submit without debounce', async () => { - type Person = { - firstName: string; - lastName: string; - } - const mockFn = vi.fn() - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 1000000, - onChangeAsync: async () => { - mockFn() - await sleep(10) - return error - }, - }, - }) - const errors = useSelector(form.store, (s) => s.errors) - - return <> -
- field.handleChange(e.target.value)} - /> -

{errors}

-
} - /> - - - } - - const { getByRole, getByText } = render() - await user.click(getByRole('button', { name: 'Submit' })) - - expect(mockFn).toHaveBeenCalledTimes(1) - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - }) - - it( - 'should validate allow pushvalue to implicitly set a default value', - async () => { - type Person = { - people: Array; - } - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }) - - return - {(field) => { - return
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return - {(subField) => { - return
- -
- }} -
- })} - -
- }} -
- } - - const { getByText, queryByText } = render() - expect(getByText('[]')).toBeInTheDocument() - await user.click(getByText('Add person')) - expect(getByText(`[""]`)).toBeInTheDocument() - }, - ) - - it( - 'should validate allow pushvalue to implicitly set a pushed default value', - async () => { - type Person = { - people: Array; - } - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }) - - return - {(field) => { - return
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return - {(subField) => { - return
- -
- }} -
- })} - -
- }} -
- } - - const { getByText, queryByText } = render() - expect(getByText('[]')).toBeInTheDocument() - await user.click(getByText('Add person')) - expect(getByText(`["Test"]`)).toBeInTheDocument() - }, - ) - - it('should handle removing element from array', async () => { - type Person = { - name: string; - id: number; - } - - const fakePeople = { - jack: { - id: 5, - name: 'Jack', - }, - molly: { - id: 6, - name: 'Molly', - }, - george: { - id: 7, - name: 'George', - }, - } satisfies Record - - function Comp() { - const form = useForm({ - defaultValues: { - people: [fakePeople.jack, fakePeople.molly, fakePeople.george], - }, - }) - - return - {(field) => { - return
-
{field.state.value.map((item, i) => { - return - {(subField) => { - return
- -
- }} -
- })}
- -
- }} -
- } - - const { getByText, queryByText, getByTestId } = render() - - let exisingPeople: Person[] = [ - fakePeople.jack, - fakePeople.molly, - fakePeople.george, - ] - exisingPeople.forEach( - (person) => expect(getByText(person.name)).toBeInTheDocument(), - ) - const container = getByTestId('container') - expect(within(container).getAllByRole('textbox')).toHaveLength(3) - - await user.click(getByText('Remove person')) - - expect(within(container).getAllByRole('textbox')).toHaveLength(2) - exisingPeople = [fakePeople.jack, fakePeople.george] - exisingPeople.forEach( - (person) => expect(getByText(person.name)).toBeInTheDocument(), - ) - expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument() - }) - - it('should not rerender unrelated fields', async () => { - const renderCount = { - field1: 0, - field2: 0, - } - - function Comp() { - const form = useForm({ - defaultValues: { - field1: '', - field2: '', - }, - }) - - return <> - - {(field) => { - renderCount.field1++ - return field.handleChange(e.target.value)} - /> - }} - - - {(field) => { - renderCount.field2++ - return field.handleChange(e.target.value)} - /> - }} - - - } - - const { getByTestId } = render() - - const field1InitialRender = renderCount.field1 - const field2InitialRender = renderCount.field2 - - await user.type(getByTestId('field1'), 'test') - - // field1 should have rerendered - expect(renderCount.field1).toBeGreaterThan(field1InitialRender) - // field2 should not have rerendered - expect(renderCount.field2).toBe(field2InitialRender) - }) - - it( - 'should not rerender array field when child field value changes', - async () => { - // Test for https://github.com/TanStack/form/issues/1925 - // Array fields should only re-render when the array length changes, - // not when a property on an array element is mutated - const renderCount = { - arrayField: 0, - childField: 0, - } - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }) - - return - {(arrayField) => { - renderCount.arrayField++ - return
- {arrayField.state.value.map( - (_, i) => - {(field) => { - if (i === 0) renderCount.childField++ - return field.handleChange(e.target.value)} - /> - }} - , - )} - -
- }} -
- } - - const { getByTestId } = render() - - const arrayFieldInitialRender = renderCount.arrayField - const childFieldInitialRender = renderCount.childField - - // Type into the first child field - await user.type(getByTestId('person-0'), 'ny') - - // Child field should have rerendered - expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender) - // Array field should NOT have rerendered (this was the bug in #1925) - expect(renderCount.arrayField).toBe(arrayFieldInitialRender) - - // Verify typing still works - expect(getByTestId('person-0')).toHaveValue('Johnny') - - // Now add a new item - this SHOULD trigger array field re-render - const arrayFieldBeforeAdd = renderCount.arrayField - await user.click(getByTestId('add-person')) - - // Array field should have rerendered when length changes - expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd) - }, - ) - - it( - 'should rerender array field on swapFieldValues even when length is unchanged', - async () => { - // swapFieldValues does not change array length but must still notify the - // parent array field so subscribers see the new order. - const renderCount = { arrayField: 0 } - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }) - - return - {(arrayField) => { - renderCount.arrayField++ - return
-
    {arrayField.state.value.map( - (person, i) => -
  1. {person.name}
  2. , - )}
- -
- }} -
- } - - const { getByTestId } = render() - - expect(getByTestId('item-0')).toHaveTextContent('John') - expect(getByTestId('item-1')).toHaveTextContent('Jane') - - const before = renderCount.arrayField - await user.click(getByTestId('swap')) - - expect(renderCount.arrayField).toBeGreaterThan(before) - expect(getByTestId('item-0')).toHaveTextContent('Jane') - expect(getByTestId('item-1')).toHaveTextContent('John') - }, - ) - - it( - 'should rerender array field when async defaultValues resolve', - async () => { - // Regression test for https://github.com/TanStack/form/issues/2178 - // When async defaultValues arrive after initial render, array fields in - // mode="array" must re-render because _arrayVersion is used as the - // reactivity signal (not value length). - type Person = { name: string } - type FormData = { people: Person[] } - - function Comp({ defaultValues }: { defaultValues?: FormData }) { - const form = useForm({ defaultValues }) - - return - {(field) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - const val = field.state.value ?? [] - return
    {val.map( - (person, i) => -
  1. {person.name}
  2. , - )}
- }} -
- } - - const { getByTestId, rerender } = render() - expect(getByTestId('list').children).toHaveLength(0) - - rerender() - await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)) - expect(getByTestId('item-0')).toHaveTextContent('Alice') - }, - ) - - it( - 'should handle defaultValue without setstate-in-render error', - async () => { - // Spy on console.error before rendering - const consoleErrorSpy = vi.spyOn(console, 'error') - - function Comp() { - const form = useForm({ - defaultValues: { - fieldOne: '', - fieldTwo: '', - }, - }) - - const fieldOne = useSelector( - form.store, - (state) => state.values.fieldOne, - ) - - return
- { - return field.handleChange(e.target.value)} - /> - }} - /> - {fieldOne && - null} - />} - - } - - const { getByTestId } = render() - await user.type(getByTestId('fieldOne'), 'John') - - // Should not log an error - expect(consoleErrorSpy).not.toHaveBeenCalled() - }, - ) - - it('should allow field-level defaultValue', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: undefined as string | undefined, - }, - }) - - return - {(field) => { - expect(field.state.value).toEqual('a') - return {field.state.value} - }} - - } - - const { queryByText } = render() - - expect(queryByText('a')).toBeInTheDocument() - expect(queryByText('never')).not.toBeInTheDocument() - }) - - it('should handle deeply nested values', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: { first: 'Test', last: 'User' }, - }, - }) - - return

{field.state.value}

} - /> - } - - const { queryByText, findByText } = render() - - expect(queryByText('Test')).not.toBeInTheDocument() - expect(await findByText('User')).toBeInTheDocument() - }) -}) + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + expect(input).toHaveValue('FirstName'); + }); + + it('should use field default value first', () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + expect(input).toHaveValue('otherName'); + }); + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? error : undefined), + }} + children={(field) => ( +
+ + field.setValue(e.target.value, { + dontUpdateMeta: true, + }) + } + /> +

{field.getMeta().errors}

+
+ )} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + expect(queryByText(error)).not.toBeInTheDocument(); + }); + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? error : undefined), + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate on change and on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + (value === 'other' ? onChangeError : undefined), + onBlur: ({ value }) => (value === 'other' ? onBlurError : undefined), + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + expect(queryByText(onBlurError)).toBeInTheDocument(); + }); + + it('should properly update conditionally rendered fields', async () => { + type FormValues = { + firstField: string; + secondField: string; + showFirstField: boolean; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstField: '', + secondField: '', + showFirstField: true, + } as FormValues, + }); + + return ( + <> + + {({ handleChange, state }) => ( +
+ Show first field + { + handleChange(e.target.checked); + }} + /> +
+ )} +
+ state.values.showFirstField}> + {(someFlagChecked) => { + if (someFlagChecked) { + return ( + + {({ handleChange, state }) => ( + + )} + + ); + } + + return ( + + {({ handleChange, state }) => ( + + )} + + ); + }} + + + ); + } + + const { getByTestId } = render(); + + const showFirstFieldInput = getByTestId('show-first-field'); + + await user.type(getByTestId('first-field'), 'hello'); + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); + + await user.click(showFirstFieldInput); + await user.type(getByTestId('second-field'), 'world'); + expect((getByTestId('second-field') as HTMLInputElement).value).toBe('world'); + + await user.click(showFirstFieldInput); + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); + }); + + it('should not keep hidden field submit errors after unmount', async () => { + const onSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: ({ value }) => onSubmit(value), + }); + + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + + state.values.firstName === 'a'}> + {(showLastName) => + showLastName ? ( + (value.length >= 5 ? undefined : 'lastName too short'), + }} + > + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + ) : null + } + + + [state.canSubmit, state.isSubmitting]}> + {([canSubmit, isSubmitting]) => ( + + )} + +
+ ); + } + + const { getByTestId, queryByTestId } = render(); + + const submitButton = getByTestId('submit'); + + await user.type(getByTestId('first-name'), 'a'); + await user.type(getByTestId('last-name'), 'abc'); + await user.click(submitButton); + + await waitFor(() => expect(submitButton).toBeDisabled()); + expect(onSubmit).toHaveBeenCalledTimes(0); + + await user.clear(getByTestId('first-name')); + await user.type(getByTestId('first-name'), 'b'); + + await waitFor(() => expect(queryByTestId('last-name')).not.toBeInTheDocument()); + await waitFor(() => expect(submitButton).toBeEnabled()); + + await user.click(submitButton); + await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)); + + await user.clear(getByTestId('first-name')); + await user.type(getByTestId('first-name'), 'a'); + + const remountedLastName = await waitFor(() => getByTestId('last-name')); + expect((remountedLastName as HTMLInputElement).value).toBe('abc'); + expect(submitButton).toBeEnabled(); + }); + + it('should call onUnmount listener when a field is conditionally removed', async () => { + const fieldUnmount = vi.fn(); + const formFieldUnmount = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + show: true, + name: 'test', + }, + listeners: { + onFieldUnmount: formFieldUnmount, + }, + }); + + return ( + <> + + {(field) => ( + field.handleChange(e.target.checked)} + /> + )} + + + s.values.show}> + {(show) => + show ? ( + + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + ) : null + } + + + ); + } + + const { getByTestId, queryByTestId } = render(); + + await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()); + + const callsBefore = fieldUnmount.mock.calls.length; + const formCallsBefore = formFieldUnmount.mock.calls.length; + + await user.click(getByTestId('toggle')); + + await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()); + expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1); + expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1); + }); + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + await sleep(10); + return error; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + await sleep(10); + return onChangeError; + }, + onBlurAsync: async () => { + await sleep(10); + return onBlurError; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(onChangeError)); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + await waitFor(() => getByText(onBlurError)); + expect(getByText(onBlurError)).toBeInTheDocument(); + }); + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }); + + return ( + <> + { + mockFn(); + await sleep(10); + return error; + }, + }} + children={(field) => ( +
+ field.handleChange(e.target.value)} + /> +

{field.getMeta().errors}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + expect(mockFn).toHaveBeenCalledTimes(1); + }); + + it('should handle arrays with primitive values', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array, + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => { + return ( +
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ + +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => ( + + )} + /> + +
+ ); + } + + const { getByText, findByLabelText, queryByText, findByText } = render(); + + expect(queryByText('Name for person 0')).not.toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + await user.click(getByText('Add person')); + const input = await findByLabelText('Name for person 0'); + expect(input).toBeInTheDocument(); + await user.type(input, 'John'); + + await user.click(getByText('Add person')); + const input2 = await findByLabelText('Name for person 1'); + expect(input).toBeInTheDocument(); + await user.type(input2, 'Jack'); + + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).toBeInTheDocument(); + await user.click(getByText('Remove person 1')); + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + + await user.click(await findByText('Submit')); + expect(fn).toHaveBeenCalledWith({ people: ['John'] }); + }); + + it('should handle arrays with subvalues', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array<{ age: number; name: string }>, + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + + {(field) => { + return ( +
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ + +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => ( + + )} + /> + +
+ ); + } + + const { getByText, findByLabelText, queryByText, findByText } = render(); + + expect(queryByText('Name for person 0')).not.toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + await user.click(getByText('Add person')); + const input = await findByLabelText('Name for person 0'); + expect(input).toBeInTheDocument(); + await user.type(input, 'John'); + + await user.click(getByText('Add person')); + const input2 = await findByLabelText('Name for person 1'); + expect(input).toBeInTheDocument(); + await user.type(input2, 'Jack'); + + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).toBeInTheDocument(); + await user.click(getByText('Remove person 1')); + expect(queryByText('Name for person 0')).toBeInTheDocument(); + expect(queryByText('Name for person 1')).not.toBeInTheDocument(); + + await user.click(await findByText('Submit')); + expect(fn).toHaveBeenCalledWith({ people: [{ name: 'John', age: 0 }] }); + }); + + it('should not surface undefined for shifted items when a non-last stably-keyed array item is removed', async () => { + // Regression test for https://github.com/TanStack/form/issues/2238 + // When array items are keyed by a stable id (not index), removing a + // non-last item changes the `name` prop of the surviving items. The field + // must read state at its current `name` on that render, never `undefined`. + const observedValues: Array = []; + + function Comp() { + const form = useForm({ + defaultValues: { + sections: [] as Array<{ id: string; title: string }>, + }, + }); + + let nextId = 0; + + return ( + + {(field) => { + return ( +
+ {field.state.value.map((section, i) => { + return ( + + {(subField) => { + observedValues.push(subField.state.value); + return ( + + ); + }} + + ); + })} + + +
+ ); + }} +
+ ); + } + + const { getByText, findByLabelText } = render(); + + await user.click(getByText('Add section')); + await user.click(getByText('Add section')); + + await findByLabelText('Title for section id-1'); + await findByLabelText('Title for section id-2'); + + observedValues.length = 0; + await user.click(getByText('Remove first section')); + + // The surviving item (previously `sections[1]`) shifts to `sections[0]`. + // Its value must remain "Section 2" and never render as `undefined`. + const survivingInput = await findByLabelText('Title for section id-2'); + expect((survivingInput as HTMLInputElement).value).toBe('Section 2'); + expect(observedValues).not.toContain(undefined); + }); + + it('should handle sync linked fields', async () => { + const fn = vi.fn(); + function Comp() { + const form = useForm({ + defaultValues: { + password: '', + confirm_password: '', + }, + onSubmit: ({ value }) => fn(value), + }); + + return ( +
+ + {(field) => { + return ( +
+ +
+ ); + }} +
+ { + if (value !== fieldApi.form.getFieldValue('password')) { + return 'Passwords do not match'; + } + return undefined; + }, + }} + > + {(field) => { + return ( +
+ + {field.state.meta.errors.map((err) => { + return
{err}
; + })} +
+ ); + }} +
+
+ ); + } + + const { findByLabelText, queryByText, findByText } = render(); + + const passwordInput = await findByLabelText('Password'); + const confirmPasswordInput = await findByLabelText('Confirm Password'); + await user.type(passwordInput, 'password'); + await user.type(confirmPasswordInput, 'password'); + expect(queryByText('Passwords do not match')).not.toBeInTheDocument(); + await user.type(confirmPasswordInput, '1'); + expect(await findByText('Passwords do not match')).toBeInTheDocument(); + }); + + it('should validate async on submit without debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 1000000, + onChangeAsync: async () => { + mockFn(); + await sleep(10); + return error; + }, + }, + }); + const errors = useSelector(form.store, (s) => s.errors); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
+ )} + /> + + + ); + } + + const { getByRole, getByText } = render(); + await user.click(getByRole('button', { name: 'Submit' })); + + expect(mockFn).toHaveBeenCalledTimes(1); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate allow pushvalue to implicitly set a default value', async () => { + type Person = { + people: Array; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }); + + return ( + + {(field) => { + return ( +
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ ); + } + + const { getByText, queryByText } = render(); + expect(getByText('[]')).toBeInTheDocument(); + await user.click(getByText('Add person')); + expect(getByText(`[""]`)).toBeInTheDocument(); + }); + + it('should validate allow pushvalue to implicitly set a pushed default value', async () => { + type Person = { + people: Array; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }); + + return ( + + {(field) => { + return ( +
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} + +
+ ); + }} +
+ ); + } + + const { getByText, queryByText } = render(); + expect(getByText('[]')).toBeInTheDocument(); + await user.click(getByText('Add person')); + expect(getByText(`["Test"]`)).toBeInTheDocument(); + }); + + it('should handle removing element from array', async () => { + type Person = { + name: string; + id: number; + }; + + const fakePeople = { + jack: { + id: 5, + name: 'Jack', + }, + molly: { + id: 6, + name: 'Molly', + }, + george: { + id: 7, + name: 'George', + }, + } satisfies Record; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [fakePeople.jack, fakePeople.molly, fakePeople.george], + }, + }); + + return ( + + {(field) => { + return ( +
+
+ {field.state.value.map((item, i) => { + return ( + + {(subField) => { + return ( +
+ +
+ ); + }} +
+ ); + })} +
+ +
+ ); + }} +
+ ); + } + + const { getByText, queryByText, getByTestId } = render(); + + let exisingPeople: Person[] = [fakePeople.jack, fakePeople.molly, fakePeople.george]; + exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); + const container = getByTestId('container'); + expect(within(container).getAllByRole('textbox')).toHaveLength(3); + + await user.click(getByText('Remove person')); + + expect(within(container).getAllByRole('textbox')).toHaveLength(2); + exisingPeople = [fakePeople.jack, fakePeople.george]; + exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); + expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument(); + }); + + it('should not rerender unrelated fields', async () => { + const renderCount = { + field1: 0, + field2: 0, + }; + + function Comp() { + const form = useForm({ + defaultValues: { + field1: '', + field2: '', + }, + }); + + return ( + <> + + {(field) => { + renderCount.field1++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + + {(field) => { + renderCount.field2++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + + ); + } + + const { getByTestId } = render(); + + const field1InitialRender = renderCount.field1; + const field2InitialRender = renderCount.field2; + + await user.type(getByTestId('field1'), 'test'); + + // field1 should have rerendered + expect(renderCount.field1).toBeGreaterThan(field1InitialRender); + // field2 should not have rerendered + expect(renderCount.field2).toBe(field2InitialRender); + }); + + it('should not rerender array field when child field value changes', async () => { + // Test for https://github.com/TanStack/form/issues/1925 + // Array fields should only re-render when the array length changes, + // not when a property on an array element is mutated + const renderCount = { + arrayField: 0, + childField: 0, + }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }); + + return ( + + {(arrayField) => { + renderCount.arrayField++; + return ( +
+ {arrayField.state.value.map((_, i) => ( + + {(field) => { + if (i === 0) renderCount.childField++; + return ( + field.handleChange(e.target.value)} + /> + ); + }} + + ))} + +
+ ); + }} +
+ ); + } + + const { getByTestId } = render(); + + const arrayFieldInitialRender = renderCount.arrayField; + const childFieldInitialRender = renderCount.childField; + + // Type into the first child field + await user.type(getByTestId('person-0'), 'ny'); + + // Child field should have rerendered + expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender); + // Array field should NOT have rerendered (this was the bug in #1925) + expect(renderCount.arrayField).toBe(arrayFieldInitialRender); + + // Verify typing still works + expect(getByTestId('person-0')).toHaveValue('Johnny'); + + // Now add a new item - this SHOULD trigger array field re-render + const arrayFieldBeforeAdd = renderCount.arrayField; + await user.click(getByTestId('add-person')); + + // Array field should have rerendered when length changes + expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd); + }); + + it('should rerender array field on swapFieldValues even when length is unchanged', async () => { + // swapFieldValues does not change array length but must still notify the + // parent array field so subscribers see the new order. + const renderCount = { arrayField: 0 }; + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }); + + return ( + + {(arrayField) => { + renderCount.arrayField++; + return ( +
+
    + {arrayField.state.value.map((person, i) => ( +
  1. + {person.name} +
  2. + ))} +
+ +
+ ); + }} +
+ ); + } + + const { getByTestId } = render(); + + expect(getByTestId('item-0')).toHaveTextContent('John'); + expect(getByTestId('item-1')).toHaveTextContent('Jane'); + + const before = renderCount.arrayField; + await user.click(getByTestId('swap')); + + expect(renderCount.arrayField).toBeGreaterThan(before); + expect(getByTestId('item-0')).toHaveTextContent('Jane'); + expect(getByTestId('item-1')).toHaveTextContent('John'); + }); + + it('should rerender array field when async defaultValues resolve', async () => { + // Regression test for https://github.com/TanStack/form/issues/2178 + // When async defaultValues arrive after initial render, array fields in + // mode="array" must re-render because _arrayVersion is used as the + // reactivity signal (not value length). + type Person = { name: string }; + type FormData = { people: Person[] }; + + function Comp({ defaultValues }: { defaultValues?: FormData }) { + const form = useForm({ defaultValues }); + + return ( + + {(field) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const val = field.state.value ?? []; + return ( +
    + {val.map((person, i) => ( +
  1. + {person.name} +
  2. + ))} +
+ ); + }} +
+ ); + } + + const { getByTestId, rerender } = render(); + expect(getByTestId('list').children).toHaveLength(0); + + rerender(); + await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)); + expect(getByTestId('item-0')).toHaveTextContent('Alice'); + }); + + it('should handle defaultValue without setstate-in-render error', async () => { + // Spy on console.error before rendering + const consoleErrorSpy = vi.spyOn(console, 'error'); + + function Comp() { + const form = useForm({ + defaultValues: { + fieldOne: '', + fieldTwo: '', + }, + }); + + const fieldOne = useSelector(form.store, (state) => state.values.fieldOne); + + return ( +
+ { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + {fieldOne && ( + null} + /> + )} + + ); + } + + const { getByTestId } = render(); + await user.type(getByTestId('fieldOne'), 'John'); + + // Should not log an error + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + + it('should allow field-level defaultValue', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: undefined as string | undefined, + }, + }); + + return ( + + {(field) => { + expect(field.state.value).toEqual('a'); + return {field.state.value}; + }} + + ); + } + + const { queryByText } = render(); + + expect(queryByText('a')).toBeInTheDocument(); + expect(queryByText('never')).not.toBeInTheDocument(); + }); + + it('should handle deeply nested values', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: { first: 'Test', last: 'User' }, + }, + }); + + return

{field.state.value}

} />; + } + + const { queryByText, findByText } = render(); + + expect(queryByText('Test')).not.toBeInTheDocument(); + expect(await findByText('User')).toBeInTheDocument(); + }); +}); diff --git a/packages/octane-form/tests/useForm.test-d.tsx b/packages/octane-form/tests/useForm.test-d.tsx index a7d074b6b..7e709adf2 100644 --- a/packages/octane-form/tests/useForm.test-d.tsx +++ b/packages/octane-form/tests/useForm.test-d.tsx @@ -1,157 +1,157 @@ -import { describe, expectTypeOf, it } from 'vitest' -import { formOptions, useForm } from '../src/index' -import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index' -import type { OctaneFormExtendedApi } from '../src/useForm.tsrx' +import { describe, expectTypeOf, it } from 'vitest'; +import { formOptions, useForm } from '../src/index'; +import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index'; +import type { OctaneFormExtendedApi } from '../src/useForm.tsrx'; describe('useForm', () => { - it('should type onSubmit properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - onSubmit({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>() - }, - }) - } - }) - - it('should type a validator properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - validators: { - onChange({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>() - return undefined - }, - }, - }) - } - }) - - it('should not have recursion problems and type register properly', () => { - const register = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - f: OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ) => f - - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - title: '', - }, - }) - - const x = register(form) - - return null - } - }) - - it('types should be properly inferred when using formOptions', () => { - type Person = { - firstName: string - lastName: string - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const form = useForm(formOpts) - - expectTypeOf(form.state.values).toEqualTypeOf() - }) - - it('types should be properly inferred when passing args alongside formOptions', () => { - type Person = { - firstName: string - lastName: string - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const form = useForm({ - ...formOpts, - onSubmitMeta: { - test: 'test', - }, - }) - - expectTypeOf(form.handleSubmit).toEqualTypeOf<{ - (): Promise - (submitMeta: { test: string }): Promise - }>() - }) - - it('types should be properly inferred when formOptions are being overridden', () => { - type Person = { - firstName: string - lastName: string - } - - type PersonWithAge = Person & { - age: number - } - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - const form = useForm({ - ...formOpts, - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - age: 10, - }, - }) - - expectTypeOf(form.state.values).toExtend() - }) -}) + it('should type onSubmit properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + onSubmit({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>(); + }, + }); + } + }); + + it('should type a validator properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + validators: { + onChange({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>(); + return undefined; + }, + }, + }); + } + }); + + it('should not have recursion problems and type register properly', () => { + const register = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + f: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ) => f; + + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + title: '', + }, + }); + + const x = register(form); + + return null; + } + }); + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm(formOpts); + + expectTypeOf(form.state.values).toEqualTypeOf(); + }); + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string; + lastName: string; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + }); + + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: { test: string }): Promise; + }>(); + }); + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string; + lastName: string; + }; + + type PersonWithAge = Person & { + age: number; + }; + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + const form = useForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + }); + + expectTypeOf(form.state.values).toExtend(); + }); +}); diff --git a/packages/octane-form/tests/useForm.test.tsrx b/packages/octane-form/tests/useForm.test.tsrx index 6a38ea882..9b6197388 100644 --- a/packages/octane-form/tests/useForm.test.tsrx +++ b/packages/octane-form/tests/useForm.test.tsrx @@ -1,1161 +1,1146 @@ -import { describe, expect, it, vi } from 'vitest' -import { render, renderHook, waitFor } from '@octanejs/testing-library' -import { userEvent } from '@testing-library/user-event' -import { act, useCallback, useEffect, useReducer, useState } from 'octane' -import { FormApi, mergeForm, useForm, useSelector } from '../src' -import { sleep } from './utils' +import { describe, expect, it, vi } from 'vitest'; +import { render, renderHook, waitFor } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { act, useCallback, useEffect, useReducer, useState } from 'octane'; +import { FormApi, mergeForm, useForm, useSelector } from '../src'; +import { sleep } from './utils'; -const user = userEvent.setup() +const user = userEvent.setup(); describe('useForm', () => { - it('preserves field state', async () => { - type Person = { - firstName: string; - lastName: string; - } - - function Comp() { - const form = useForm({ - defaultValues: {} as Person, - }) - - return <> - { - return field.handleChange(e.target.value)} - /> - }} - /> - - } - - const { getByTestId, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText('FirstName')).not.toBeInTheDocument() - await user.type(input, 'FirstName') - expect(input).toHaveValue('FirstName') - }) - - it('should allow default values to be set', async () => { - type Person = { - firstName: string; - lastName: string; - } - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }) - - return <> - { - return

{field.state.value}

- }} - /> - - } - - const { findByText, queryByText } = render() - expect(await findByText('FirstName')).toBeInTheDocument() - expect(queryByText('LastName')).not.toBeInTheDocument() - }) - - it('should handle submitting properly', async () => { - function Comp() { - const [submittedData, setSubmittedData] = useState< - | { - firstName: string; - } - | null - >(null) - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - onSubmit: ({ value }) => { - setSubmittedData(value) - }, - }) - - return <> - { - return field.handleChange(e.target.value)} - placeholder="First name" - /> - }} - /> - - {submittedData &&

Submitted data: {submittedData.firstName}

} - - } - - const { findByPlaceholderText, getByText } = render() - const input = await findByPlaceholderText('First name') - await user.clear(input) - await user.type(input, 'OtherName') - await user.click(getByText('Submit')) - await waitFor( - () => expect(getByText('Submitted data: OtherName')).toBeInTheDocument(), - ) - }) - - it('should run on form mount', async () => { - function Comp() { - const [formMounted, setFormMounted] = useState(false) - const [mountForm, setMountForm] = useState(false) - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - validators: { - onMount: () => { - setFormMounted(true) - return undefined - }, - }, - }) - - return <> - {mountForm - ? <> -

- {formMounted ? 'Form mounted' : 'Not mounted'} -

- - : } - - } - - const { getByText } = render() - await user.click(getByText('Mount form')) - await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()) - }) - - it('should validate async on change for the form', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange() { - return error - }, - }, - }) - const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange) - return <> - - field.handleChange(e.target.value)} - />} - /> -

- {onChangeError?.toString()} -

- - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(error)).not.toBeInTheDocument() - await user.type(input, 'other') - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - }) - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' - ? error - : undefined), - }, - }) - - const errors = useSelector(form.store, (s) => s.errors) - return <> -
- field.setValue(e.target.value, { - dontUpdateMeta: true, - })} - /> -

{errors}

-
} - /> - - } - - const { getByTestId, queryByText } = render() - const input = getByTestId('fieldinput') - await user.type(input, 'other') - expect(queryByText(error)).not.toBeInTheDocument() - }) - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' - ? error - : undefined), - }, - }) - const errors = useSelector(form.store, (s) => s.errorMap) - return <> -
- field.handleChange(e.target.value)} - /> -

- {errors.onChange?.toString()} -

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(error)).not.toBeInTheDocument() - await user.type(input, 'other') - expect(getByText(error)).toBeInTheDocument() - }) - - it('should validate on change and on blur', async () => { - const onChangeError = 'Please enter a different value (onChangeError)' - const onBlurError = 'Please enter a different value (onBlurError)' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') return onChangeError - return undefined - }, - onBlur: ({ value }) => { - if (value.firstName === 'other') return onBlurError - return undefined - }, - }, - }) - - const errors = useSelector(form.store, (s) => s.errorMap) - return <> -
- field.handleChange(e.target.value)} - /> -

- {errors.onChange?.toString()} -

-

- {errors.onBlur?.toString()} -

-
} - /> - - } - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(onChangeError)).not.toBeInTheDocument() - expect(queryByText(onBlurError)).not.toBeInTheDocument() - await user.type(input, 'other') - expect(getByText(onChangeError)).toBeInTheDocument() - await user.click(document.body) - expect(queryByText(onBlurError)).toBeInTheDocument() - }) - - it('should set field errors from the field\'s validators', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') return { - form: 'Something went wrong', - fields: { - firstName: 'Please enter a different value (onChangeError)', - }, - } - return undefined - }, - onBlur: ({ value }) => { - if ( - value.firstName === 'other' - ) return 'Please enter a different value (onBlurError)' - return undefined - }, - }, - }) - - const errors = useSelector(form.store, (s) => s.errorMap) - return <> -
- field.handleChange(e.target.value)} - /> -

{field.state.meta.errorMap.onChange}

-
} - /> -

- {errors.onChange?.toString()} -

-

- {errors.onBlur?.toString()} -

- - } - const { getByTestId } = render() - - expect(getByTestId('form-onchange')).toHaveTextContent('') - - const input = getByTestId('fieldinput') - - await user.type(input, 'other') - expect(getByTestId('form-onchange')).toHaveTextContent( - 'Something went wrong', - ) - expect(getByTestId('field-onchange')).toHaveTextContent( - 'Please enter a different value (onChangeError)', - ) - - await user.click(document.body) - expect(getByTestId('form-onblur')).toHaveTextContent( - 'Please enter a different value (onBlurError)', - ) - }) - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - } - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10) - return error - }, - }, - }) - const errors = useSelector(form.store, (s) => s.errorMap) - return <> -
- field.handleChange(e.target.value)} - /> -

- {errors.onChange?.toString()} -

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - expect(queryByText(error)).not.toBeInTheDocument() - await user.type(input, 'other') - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - }) - - it( - 'should set field errors from the form\'s onChangeAsync validator', - async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChangeAsync: async ({ value }) => { - await sleep(10) - if (value.firstName === 'other') { - return { - form: 'Invalid form values', - fields: { - firstName: 'First name cannot be "other"', - }, - } - } - return null - }, - }, - }) - - const errors = useSelector(form.store, (s) => s.errorMap) - - return <> -
- field.handleChange(e.target.value)} - /> -

{field.state.meta.errorMap.onChange}

-
} - /> -

- {errors.onChange?.toString()} -

- - } - - const { getByTestId } = render() - const input = getByTestId('fieldinput') - const firstNameErrorElement = getByTestId('field-error') - const formErrorElement = getByTestId('form-error') - - expect(firstNameErrorElement).toBeEmptyDOMElement() - expect(formErrorElement).toBeEmptyDOMElement() - - await user.type(input, 'other') - - await waitFor(() => { - expect(firstNameErrorElement).not.toBeEmptyDOMElement() - }) - expect(firstNameErrorElement).toHaveTextContent( - 'First name cannot be "other"', - ) - expect(formErrorElement).toHaveTextContent('Invalid form values') - }, - ) - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - } - const onChangeError = 'Please enter a different value (onChangeError)' - const onBlurError = 'Please enter a different value (onBlurError)' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10) - return onChangeError - }, - onBlurAsync: async () => { - await sleep(10) - return onBlurError - }, - }, - }) - const errors = useSelector(form.store, (s) => s.errorMap) - - return <> -
- field.handleChange(e.target.value)} - /> -

- {errors.onChange?.toString()} -

-

- {errors.onBlur?.toString()} -

-
} - /> - - } - - const { getByTestId, getByText, queryByText } = render() - const input = getByTestId('fieldinput') - - expect(queryByText(onChangeError)).not.toBeInTheDocument() - expect(queryByText(onBlurError)).not.toBeInTheDocument() - await user.type(input, 'other') - await waitFor(() => getByText(onChangeError)) - expect(getByText(onChangeError)).toBeInTheDocument() - await user.click(document.body) - await waitFor(() => getByText(onBlurError)) - expect(getByText(onBlurError)).toBeInTheDocument() - }) - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - } - const mockFn = vi.fn() - const error = 'Please enter a different value' - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 100, - onChangeAsync: async () => { - mockFn() - await sleep(10) - return error - }, - }, - }) - const errors = useSelector(form.store, (s) => s.errors) - - return <> -
- field.handleChange(e.target.value)} - /> -

{errors}

-
} - /> - - } - - const { getByTestId, getByText } = render() - const input = getByTestId('fieldinput') - await user.type(input, 'other') - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0) - await waitFor(() => getByText(error)) - expect(getByText(error)).toBeInTheDocument() - expect(mockFn).toHaveBeenCalledTimes(1) - }) - - it( - 'should set errors on the fields from the form\'s onChange validator', - async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'Tom') { - return { - form: 'Something went wrong', - fields: { firstName: 'Please enter a different value' }, - } - } - return null - }, - }, - }) - - const onChangeError = useSelector( - form.store, - (s) => s.errorMap.onChange, - ) - - return <> - <> - field.handleChange(e.target.value)} - /> - -

{field.state.meta.errors.join( - '', - )}

- } - /> -

- {onChangeError?.toString()} -

- - } - - const { getByTestId, queryByText } = render() - const input = getByTestId('fieldinput') - const fieldError = getByTestId('field-error') - const formError = getByTestId('form-error') - - expect( - queryByText('Please enter a different value'), - ).not.toBeInTheDocument() - expect(queryByText('Something went wrong')).not.toBeInTheDocument() - - await user.type(input, 'Tom') - await waitFor( - () => expect(fieldError.textContent).toBe( - 'Please enter a different value', - ), - ) - await waitFor( - () => expect(formError.textContent).toBe('Something went wrong'), - ) - }, - ) - - it( - 'should not cause infinite re-renders when listening to state.errors', - () => { - const fn = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value) - }, - }) - - const { errors } = useSelector( - form.store, - (state) => ({ - errors: state.errors, - }), - ) - - useEffect(() => { - fn(errors) - }, [errors]) - - return null - } - - render() - - expect(fn).toHaveBeenCalledTimes(1) - }, - ) - - it('should not cause infinite re-renders when listening to state', () => { - const fn = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value) - }, - }) - - const { values } = useSelector(form.store, (v) => v) - - useEffect(() => { - fn(values) - }, [values]) - - return null - } - - render() - - expect(fn).toHaveBeenCalledTimes(1) - }) - - it('form should reset default value when resetting in onSubmit', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - }, - onSubmit: ({ value }) => { - expect(value).toEqual({ name: 'another-test' }) - - form.reset(value) - }, - }) - - return
{ - e.preventDefault() - e.stopPropagation() - form.handleSubmit() - }} - > - - field.handleChange(e.target.value)} - />} - /> - - - - - - } - - const { getByTestId } = render() - const input = getByTestId('fieldinput') - const submit = getByTestId('submit') - const reset = getByTestId('reset') - - await user.type(input, 'test') - await waitFor(() => expect(input).toHaveValue('test')) - - await user.click(reset) - await waitFor(() => expect(input).toHaveValue('')) - - await user.type(input, 'another-test') - await user.click(submit) - await waitFor(() => expect(input).toHaveValue('another-test')) - }) - - it('should accept formId and return it', async () => { - function Comp() { - const form = useForm({ - formId: 'test', - }) - - return <> -
{ - e.preventDefault() - form.handleSubmit() - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => - {submissionAttempts}} - /> - - - - } - - const { getByTestId } = render() - const target = getByTestId('formId-target') - const result = getByTestId('formId-result') - - expect(target).toHaveAttribute('form', 'test') - expect(target).toHaveTextContent('test') - await user.click(target) - expect(result).toHaveTextContent('1') - }) - - it('should allow custom component keys for arrays', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - foo: [ - { name: 'nameA', id: 'a' }, - { name: 'nameB', id: 'b' }, - { name: 'nameC', id: 'c' }, - ], - }, - }) - - return <> - - {(arrayField) => arrayField.state.value.map( - (_, i) => - {(field) => { - expect(field.name).toBe(`foo[${i}].name`) - expect(field.state.value).not.toBeUndefined() - return null - }} - , - )} - - - - } - - const { getByTestId } = render() - - const target = getByTestId('removeField') - await user.click(target) - }) - - it('should not error when using deleteField in edge cases', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - const fields: Record = {} - - if (value.firstName.length === 0) { - fields.firstName = 'Last Name is required' - } - - return { fields } - }, - }, - }) - - return
{ - e.preventDefault() - form.handleSubmit() - }} - > -

Personal Information

- - field.handleChange(e.target.value)} - />} - /> - - field.handleChange(e.target.value)} - />} - /> - - - } - - const { getByTestId } = render() - const removeButton = getByTestId('remove') - const input = getByTestId('input') - - await user.type(input, 'a') - await user.click(removeButton) - }) - - it( - 'should handle stable transforms to update the base form on first render', - async () => { - let renders = 0 - function Comp() { - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback((baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: 'What', - }, - }) - }, []), - }) - - renders++ - - return

- {field.state.value} - - {renders} -

} - /> - } - - const { getByText } = render() - getByText('What 1') - }, - ) - - it( - 'should handle stable transforms to update the base form on subsequent renders', - async () => { - function Comp() { - const [renders, setRenders] = useState(0) - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback((baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: renders === 0 ? 'First' : 'Another', - }, - }) - }, [renders]), - }) - - return
-

{field.state.value}

} - /> - -
- } - - const { findByText, getByText } = render() - await findByText('First') - await user.click(getByText('Rerender')) - await findByText('Another') - }, - ) - - it( - 'should render Subscribe without selector (default identity)', - async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: 'test', - }, - }) - - return <> - - field.handleChange(e.target.value)} - />} - /> - - - {state.values.name}} - /> - - } - - const { getByTestId } = render() - const input = getByTestId('input') - const stateValue = getByTestId('state-value') - - expect(stateValue).toHaveTextContent('test') - - await user.clear(input) - await user.type(input, 'updated') - await waitFor(() => expect(stateValue).toHaveTextContent('updated')) - }, - ) - - it( - 'mounts a replacement form when an explicit formId is removed', - async () => { - const mountedIds: string[] = [] - - function Comp() { - const [formId, setFormId] = useState('first') - const [, forceRender] = useReducer((count) => count + 1, 0) - const form = useForm({ - formId, - listeners: { - onMount: () => mountedIds.push(formId ?? 'fallback'), - }, - }) - - return <> - {form.formId} - - - - } - - const { getByTestId } = render() - const id = getByTestId('dynamic-form-id') - expect(id).toHaveTextContent('first') - expect(mountedIds).toEqual(['first']) - - await user.click(getByTestId('clear-form-id')) - await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])) - expect(id).not.toHaveTextContent('first') - const fallbackId = id.textContent - expect(fallbackId).not.toBe('') - - await user.click(getByTestId('rerender-form')) - expect(id).toHaveTextContent(fallbackId!) - expect(mountedIds).toEqual(['first', 'fallback']) - }, - ) - - it('keeps multiple subscriptions in the same component independent', () => { - const form = new FormApi({ - defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, - }) - const { result } = renderHook( - () => ({ - firstName: useSelector(form.store, (state) => state.values.firstName), - lastName: useSelector(form.store, (state) => state.values.lastName), - }), - ) - - expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }) - act(() => form.setFieldValue('firstName', 'Grace')) - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }) - act(() => form.setFieldValue('lastName', 'Hopper')) - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }) - }) -}) + it('preserves field state', async () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: {} as Person, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + /> + ); + }} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText('FirstName')).not.toBeInTheDocument(); + await user.type(input, 'FirstName'); + expect(input).toHaveValue('FirstName'); + }); + + it('should allow default values to be set', async () => { + type Person = { + firstName: string; + lastName: string; + }; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }); + + return ( + <> + { + return

{field.state.value}

; + }} + /> + + ); + } + + const { findByText, queryByText } = render(); + expect(await findByText('FirstName')).toBeInTheDocument(); + expect(queryByText('LastName')).not.toBeInTheDocument(); + }); + + it('should handle submitting properly', async () => { + function Comp() { + const [submittedData, setSubmittedData] = useState<{ + firstName: string; + } | null>(null); + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + onSubmit: ({ value }) => { + setSubmittedData(value); + }, + }); + + return ( + <> + { + return ( + field.handleChange(e.target.value)} + placeholder={'First name'} + /> + ); + }} + /> + + {submittedData &&

Submitted data: {submittedData.firstName}

} + + ); + } + + const { findByPlaceholderText, getByText } = render(); + const input = await findByPlaceholderText('First name'); + await user.clear(input); + await user.type(input, 'OtherName'); + await user.click(getByText('Submit')); + await waitFor(() => expect(getByText('Submitted data: OtherName')).toBeInTheDocument()); + }); + + it('should run on form mount', async () => { + function Comp() { + const [formMounted, setFormMounted] = useState(false); + const [mountForm, setMountForm] = useState(false); + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + validators: { + onMount: () => { + setFormMounted(true); + return undefined; + }, + }, + }); + + return ( + <> + {mountForm ? ( + <> +

{formMounted ? 'Form mounted' : 'Not mounted'}

+ + ) : ( + + )} + + ); + } + + const { getByText } = render(); + await user.click(getByText('Mount form')); + await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()); + }); + + it('should validate async on change for the form', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange() { + return error; + }, + }, + }); + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); + return ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> +

{onChangeError?.toString()}

+ + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), + }, + }); + + const errors = useSelector(form.store, (s) => s.errors); + return ( + <> + ( +
+ + field.setValue(e.target.value, { + dontUpdateMeta: true, + }) + } + /> +

{errors}

+
+ )} + /> + + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + expect(queryByText(error)).not.toBeInTheDocument(); + }); + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), + }, + }); + const errors = useSelector(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(error)).toBeInTheDocument(); + }); + + it('should validate on change and on blur', async () => { + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return onChangeError; + return undefined; + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return onBlurError; + return undefined; + }, + }, + }); + + const errors = useSelector(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+
+ )} + /> + + ); + } + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + expect(queryByText(onBlurError)).toBeInTheDocument(); + }); + + it("should set field errors from the field's validators", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') + return { + form: 'Something went wrong', + fields: { + firstName: 'Please enter a different value (onChangeError)', + }, + }; + return undefined; + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return 'Please enter a different value (onBlurError)'; + return undefined; + }, + }, + }); + + const errors = useSelector(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
+ )} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+ + ); + } + const { getByTestId } = render(); + + expect(getByTestId('form-onchange')).toHaveTextContent(''); + + const input = getByTestId('fieldinput'); + + await user.type(input, 'other'); + expect(getByTestId('form-onchange')).toHaveTextContent('Something went wrong'); + expect(getByTestId('field-onchange')).toHaveTextContent( + 'Please enter a different value (onChangeError)', + ); + + await user.click(document.body); + expect(getByTestId('form-onblur')).toHaveTextContent( + 'Please enter a different value (onBlurError)', + ); + }); + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10); + return error; + }, + }, + }); + const errors = useSelector(form.store, (s) => s.errorMap); + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + expect(queryByText(error)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + }); + + it("should set field errors from the form's onChangeAsync validator", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChangeAsync: async ({ value }) => { + await sleep(10); + if (value.firstName === 'other') { + return { + form: 'Invalid form values', + fields: { + firstName: 'First name cannot be "other"', + }, + }; + } + return null; + }, + }, + }); + + const errors = useSelector(form.store, (s) => s.errorMap); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{field.state.meta.errorMap.onChange}

+
+ )} + /> +

{errors.onChange?.toString()}

+ + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + const firstNameErrorElement = getByTestId('field-error'); + const formErrorElement = getByTestId('form-error'); + + expect(firstNameErrorElement).toBeEmptyDOMElement(); + expect(formErrorElement).toBeEmptyDOMElement(); + + await user.type(input, 'other'); + + await waitFor(() => { + expect(firstNameErrorElement).not.toBeEmptyDOMElement(); + }); + expect(firstNameErrorElement).toHaveTextContent('First name cannot be "other"'); + expect(formErrorElement).toHaveTextContent('Invalid form values'); + }); + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const onChangeError = 'Please enter a different value (onChangeError)'; + const onBlurError = 'Please enter a different value (onBlurError)'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10); + return onChangeError; + }, + onBlurAsync: async () => { + await sleep(10); + return onBlurError; + }, + }, + }); + const errors = useSelector(form.store, (s) => s.errorMap); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors.onChange?.toString()}

+

{errors.onBlur?.toString()}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText, queryByText } = render(); + const input = getByTestId('fieldinput'); + + expect(queryByText(onChangeError)).not.toBeInTheDocument(); + expect(queryByText(onBlurError)).not.toBeInTheDocument(); + await user.type(input, 'other'); + await waitFor(() => getByText(onChangeError)); + expect(getByText(onChangeError)).toBeInTheDocument(); + await user.click(document.body); + await waitFor(() => getByText(onBlurError)); + expect(getByText(onBlurError)).toBeInTheDocument(); + }); + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + }; + const mockFn = vi.fn(); + const error = 'Please enter a different value'; + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 100, + onChangeAsync: async () => { + mockFn(); + await sleep(10); + return error; + }, + }, + }); + const errors = useSelector(form.store, (s) => s.errors); + + return ( + <> + ( +
+ field.handleChange(e.target.value)} + /> +

{errors}

+
+ )} + /> + + ); + } + + const { getByTestId, getByText } = render(); + const input = getByTestId('fieldinput'); + await user.type(input, 'other'); + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0); + await waitFor(() => getByText(error)); + expect(getByText(error)).toBeInTheDocument(); + expect(mockFn).toHaveBeenCalledTimes(1); + }); + + it("should set errors on the fields from the form's onChange validator", async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'Tom') { + return { + form: 'Something went wrong', + fields: { firstName: 'Please enter a different value' }, + }; + } + return null; + }, + }, + }); + + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); + + return ( + <> + ( + <> + field.handleChange(e.target.value)} + /> + +

{field.state.meta.errors.join('')}

+ + )} + /> +

{onChangeError?.toString()}

+ + ); + } + + const { getByTestId, queryByText } = render(); + const input = getByTestId('fieldinput'); + const fieldError = getByTestId('field-error'); + const formError = getByTestId('form-error'); + + expect(queryByText('Please enter a different value')).not.toBeInTheDocument(); + expect(queryByText('Something went wrong')).not.toBeInTheDocument(); + + await user.type(input, 'Tom'); + await waitFor(() => expect(fieldError.textContent).toBe('Please enter a different value')); + await waitFor(() => expect(formError.textContent).toBe('Something went wrong')); + }); + + it('should not cause infinite re-renders when listening to state.errors', () => { + const fn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value); + }, + }); + + const { errors } = useSelector(form.store, (state) => ({ + errors: state.errors, + })); + + useEffect(() => { + fn(errors); + }, [errors]); + + return null; + } + + render(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('should not cause infinite re-renders when listening to state', () => { + const fn = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value); + }, + }); + + const { values } = useSelector(form.store, (v) => v); + + useEffect(() => { + fn(values); + }, [values]); + + return null; + } + + render(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('form should reset default value when resetting in onSubmit', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + }, + onSubmit: ({ value }) => { + expect(value).toEqual({ name: 'another-test' }); + + form.reset(value); + }, + }); + + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + + + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('fieldinput'); + const submit = getByTestId('submit'); + const reset = getByTestId('reset'); + + await user.type(input, 'test'); + await waitFor(() => expect(input).toHaveValue('test')); + + await user.click(reset); + await waitFor(() => expect(input).toHaveValue('')); + + await user.type(input, 'another-test'); + await user.click(submit); + await waitFor(() => expect(input).toHaveValue('another-test')); + }); + + it('should accept formId and return it', async () => { + function Comp() { + const form = useForm({ + formId: 'test', + }); + + return ( + <> +
{ + e.preventDefault(); + form.handleSubmit(); + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => ( + {submissionAttempts} + )} + /> + + + + ); + } + + const { getByTestId } = render(); + const target = getByTestId('formId-target'); + const result = getByTestId('formId-result'); + + expect(target).toHaveAttribute('form', 'test'); + expect(target).toHaveTextContent('test'); + await user.click(target); + expect(result).toHaveTextContent('1'); + }); + + it('should allow custom component keys for arrays', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + foo: [ + { name: 'nameA', id: 'a' }, + { name: 'nameB', id: 'b' }, + { name: 'nameC', id: 'c' }, + ], + }, + }); + + return ( + <> + + {(arrayField) => + arrayField.state.value.map((_, i) => ( + + {(field) => { + expect(field.name).toBe(`foo[${i}].name`); + expect(field.state.value).not.toBeUndefined(); + return null; + }} + + )) + } + + + + ); + } + + const { getByTestId } = render(); + + const target = getByTestId('removeField'); + await user.click(target); + }); + + it('should not error when using deleteField in edge cases', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + const fields: Record = {}; + + if (value.firstName.length === 0) { + fields.firstName = 'Last Name is required'; + } + + return { fields }; + }, + }, + }); + + return ( +
{ + e.preventDefault(); + form.handleSubmit(); + }} + > +

Personal Information

+ ( + field.handleChange(e.target.value)} + /> + )} + /> + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + ); + } + + const { getByTestId } = render(); + const removeButton = getByTestId('remove'); + const input = getByTestId('input'); + + await user.type(input, 'a'); + await user.click(removeButton); + }); + + it('should handle stable transforms to update the base form on first render', async () => { + let renders = 0; + function Comp() { + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: 'What', + }, + }); + }, []), + }); + + renders++; + + return ( + ( +

+ {field.state.value} {renders} +

+ )} + /> + ); + } + + const { getByText } = render(); + getByText('What 1'); + }); + + it('should handle stable transforms to update the base form on subsequent renders', async () => { + function Comp() { + const [renders, setRenders] = useState(0); + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback( + (baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: renders === 0 ? 'First' : 'Another', + }, + }); + }, + [renders], + ), + }); + + return ( +
+

{field.state.value}

} /> + +
+ ); + } + + const { findByText, getByText } = render(); + await findByText('First'); + await user.click(getByText('Rerender')); + await findByText('Another'); + }); + + it('should render Subscribe without selector (default identity)', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: 'test', + }, + }); + + return ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> + + {state.values.name}} + /> + + ); + } + + const { getByTestId } = render(); + const input = getByTestId('input'); + const stateValue = getByTestId('state-value'); + + expect(stateValue).toHaveTextContent('test'); + + await user.clear(input); + await user.type(input, 'updated'); + await waitFor(() => expect(stateValue).toHaveTextContent('updated')); + }); + + it('mounts a replacement form when an explicit formId is removed', async () => { + const mountedIds: string[] = []; + + function Comp() { + const [formId, setFormId] = useState('first'); + const [, forceRender] = useReducer((count) => count + 1, 0); + const form = useForm({ + formId, + listeners: { + onMount: () => mountedIds.push(formId ?? 'fallback'), + }, + }); + + return <> + {form.formId} + + + ; + } + + const { getByTestId } = render(); + const id = getByTestId('dynamic-form-id'); + expect(id).toHaveTextContent('first'); + expect(mountedIds).toEqual(['first']); + + await user.click(getByTestId('clear-form-id')); + await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); + expect(id).not.toHaveTextContent('first'); + const fallbackId = id.textContent; + expect(fallbackId).not.toBe(''); + + await user.click(getByTestId('rerender-form')); + expect(id).toHaveTextContent(fallbackId!); + expect(mountedIds).toEqual(['first', 'fallback']); + }); + + it('keeps multiple subscriptions in the same component independent', () => { + const form = new FormApi({ + defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, + }); + const { result } = renderHook(() => ({ + firstName: useSelector(form.store, (state) => state.values.firstName), + lastName: useSelector(form.store, (state) => state.values.lastName), + })); + + expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }); + act(() => form.setFieldValue('firstName', 'Grace')); + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }); + act(() => form.setFieldValue('lastName', 'Hopper')); + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }); + }); +}); diff --git a/packages/octane-form/tests/useFormGroup.test-d.tsx b/packages/octane-form/tests/useFormGroup.test-d.tsx index 765ca1378..a6ff1c116 100644 --- a/packages/octane-form/tests/useFormGroup.test-d.tsx +++ b/packages/octane-form/tests/useFormGroup.test-d.tsx @@ -1,389 +1,387 @@ -import { describe, expectTypeOf, it } from 'vitest' -import { useForm, useFormGroup } from '../src/index' -import type { FormGroupApi } from '../src/index' +import { describe, expectTypeOf, it } from 'vitest'; +import { useForm, useFormGroup } from '../src/index'; +import type { FormGroupApi } from '../src/index'; describe('useFormGroup form-like surface', () => { - it('should type state.value based on the selected field', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }) - - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() - expectTypeOf(group.name).toEqualTypeOf<'step1'>() - } - }) - - it('should type onGroupSubmit value and meta', () => { - type SubmitMeta = { source: string } - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>() - expectTypeOf(meta).toEqualTypeOf() - }, - }) - } - }) - - it('should type onGroupSubmitInvalid value and meta', () => { - type SubmitMeta = { source: string } - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - onGroupSubmitInvalid: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>() - expectTypeOf(meta).toEqualTypeOf() - }, - }) - } - }) - - it('should type validators with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() - return undefined - }, - onSubmit: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() - return undefined - }, - }, - }) - } - }) - - it('should type listeners with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - listeners: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>() - }, - }, - }) - } - }) - - it('should type handleSubmit return as Promise', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }) - - expectTypeOf(group.handleSubmit()).toEqualTypeOf>() - } - }) - - it('should type handleSubmit overload when onSubmitMeta is provided', () => { - type SubmitMeta = { source: string } - - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - }) - - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise - (submitMeta: SubmitMeta): Promise - }>() - } - }) - - it('should type setValue updater', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }) - - group.setValue({ name: 'new name' }) - group.setValue((prev) => { - expectTypeOf(prev).toEqualTypeOf<{ name: string }>() - return { name: 'updated' } - }) - } - }) - - it('should infer the FormGroupApi instance type for useFormGroup', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }) - - expectTypeOf(group).toMatchTypeOf< - FormGroupApi< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > - >() - } - }) -}) + it('should type state.value based on the selected field', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(group.name).toEqualTypeOf<'step1'>(); + } + }); + + it('should type onGroupSubmit value and meta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }, + }); + } + }); + + it('should type onGroupSubmitInvalid value and meta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + onGroupSubmitInvalid: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }, + }); + } + }); + + it('should type validators with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + onSubmit: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + }, + }); + } + }); + + it('should type listeners with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + listeners: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + }, + }, + }); + } + }); + + it('should type handleSubmit return as Promise', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.handleSubmit()).toEqualTypeOf>(); + } + }); + + it('should type handleSubmit overload when onSubmitMeta is provided', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: SubmitMeta): Promise; + }>(); + } + }); + + it('should type setValue updater', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + group.setValue({ name: 'new name' }); + group.setValue((prev) => { + expectTypeOf(prev).toEqualTypeOf<{ name: string }>(); + return { name: 'updated' }; + }); + } + }); + + it('should infer the FormGroupApi instance type for useFormGroup', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group).toMatchTypeOf< + FormGroupApi< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + >(); + } + }); +}); describe('useFormGroup field-like meta surface', () => { - it('should type meta booleans', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }) - - expectTypeOf(group.state.meta.isTouched).toEqualTypeOf() - expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf() - expectTypeOf(group.state.meta.isDirty).toEqualTypeOf() - expectTypeOf(group.state.meta.isValidating).toEqualTypeOf() - } - }) - - it('should type errorMap entries based on validator return types', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'sync-change' as const, - onChangeAsync: async () => 'async-change' as const, - onBlur: () => 'sync-blur' as const, - onBlurAsync: async () => 'async-blur' as const, - onSubmit: () => 'sync-submit' as const, - onSubmitAsync: async () => 'async-submit' as const, - }, - }) - - expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< - 'sync-change' | 'async-change' | undefined - >() - expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< - 'sync-blur' | 'async-blur' | undefined - >() - expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< - 'sync-submit' | 'async-submit' | undefined - >() - } - }) - - it('should type errors array from group validators', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'change-error' as const, - }, - }) - - expectTypeOf(group.state.meta.errors).toEqualTypeOf< - Array<'change-error' | undefined> - >() - } - }) -}) + it('should type meta booleans', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }); + + expectTypeOf(group.state.meta.isTouched).toEqualTypeOf(); + expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf(); + expectTypeOf(group.state.meta.isDirty).toEqualTypeOf(); + expectTypeOf(group.state.meta.isValidating).toEqualTypeOf(); + } + }); + + it('should type errorMap entries based on validator return types', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'sync-change' as const, + onChangeAsync: async () => 'async-change' as const, + onBlur: () => 'sync-blur' as const, + onBlurAsync: async () => 'async-blur' as const, + onSubmit: () => 'sync-submit' as const, + onSubmitAsync: async () => 'async-submit' as const, + }, + }); + + expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< + 'sync-change' | 'async-change' | undefined + >(); + expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< + 'sync-blur' | 'async-blur' | undefined + >(); + expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< + 'sync-submit' | 'async-submit' | undefined + >(); + } + }); + + it('should type errors array from group validators', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'change-error' as const, + }, + }); + + expectTypeOf(group.state.meta.errors).toEqualTypeOf>(); + } + }); +}); describe('form.FormGroup component surface', () => { - it('should type the children render prop with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - return ( - {}}> - {(group) => { - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() - expectTypeOf(group.name).toEqualTypeOf<'step1'>() - return null - }} - - ) - } - }) - - it('should type the children render prop with onSubmitMeta', () => { - type SubmitMeta = { source: string } - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string }>() - expectTypeOf(meta).toEqualTypeOf() - }} - > - {(group) => { - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise - (submitMeta: SubmitMeta): Promise - }>() - return null - }} - - ) - } - }) - - it('should type validators on the FormGroup component', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }) - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() - return undefined - }, - }} - onGroupSubmit={() => {}} - > - {() => null} - - ) - } - }) -}) + it('should type the children render prop with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + {}}> + {(group) => { + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(group.name).toEqualTypeOf<'step1'>(); + return null; + }} + + ); + } + }); + + it('should type the children render prop with onSubmitMeta', () => { + type SubmitMeta = { source: string }; + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string }>(); + expectTypeOf(meta).toEqualTypeOf(); + }} + > + {(group) => { + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise; + (submitMeta: SubmitMeta): Promise; + }>(); + return null; + }} + + ); + } + }); + + it('should type validators on the FormGroup component', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }); + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); + return undefined; + }, + }} + onGroupSubmit={() => {}} + > + {() => null} + + ); + } + }); +}); diff --git a/packages/octane-form/tests/useFormGroup.test.tsrx b/packages/octane-form/tests/useFormGroup.test.tsrx index 1716d420f..4e4bf25e0 100644 --- a/packages/octane-form/tests/useFormGroup.test.tsrx +++ b/packages/octane-form/tests/useFormGroup.test.tsrx @@ -1,355 +1,352 @@ -import { describe, expect, it, vi } from 'vitest' -import { render, waitFor } from '@octanejs/testing-library' -import { userEvent } from '@testing-library/user-event' -import { useState } from 'octane' -import { useForm } from '../src' +import { describe, expect, it, vi } from 'vitest'; +import { render, waitFor } from '@octanejs/testing-library'; +import { userEvent } from '@testing-library/user-event'; +import { useState } from 'octane'; +import { useForm } from '../src'; -const user = userEvent.setup() +const user = userEvent.setup(); describe('form.FormGroup', () => { - it( - 'should call onGroupSubmit but not the form onSubmit when submitting the group', - async () => { - const onSubmit = vi.fn() - const onGroupSubmit = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - onSubmit, - }) - - return - {(group) =>
{ - e.preventDefault() - e.stopPropagation() - group.handleSubmit() - }} - > - - field.handleChange(e.target.value)} - />} - /> - - } -
- } - - const { getByTestId } = render() - await user.click(getByTestId('submit-group')) - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) - expect(onSubmit).not.toHaveBeenCalled() - }, - ) - - it('should expose group state value reactively', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'initial' }, - step2: { name: 'other' }, - }, - }) - - return - {(group) => <> - - field.handleChange(e.target.value)} - />} - /> -
{JSON.stringify(
-            group.state.value,
-          )}
- } -
- } - - const { getByTestId } = render() - expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}') - - await user.clear(getByTestId('step1-name')) - await user.type(getByTestId('step1-name'), 'updated') - - await waitFor( - () => expect(getByTestId('group-value').textContent).toBe( - '{"name":"updated"}', - ), - ) - }) - - it( - 'should call onGroupSubmitInvalid when group-level validation fails', - async () => { - const onSubmit = vi.fn() - const onGroupSubmit = vi.fn() - const onGroupSubmitInvalid = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: '' }, - step2: { name: 'test2' }, - }, - onSubmit, - }) - - return (!value.name - ? 'Name is required' - : undefined), - }} - onGroupSubmit={onGroupSubmit} - onGroupSubmitInvalid={onGroupSubmitInvalid} - > - {(group) =>
{ - e.preventDefault() - e.stopPropagation() - group.handleSubmit() - }} - > - - field.handleChange(e.target.value)} - />} - /> - -
{String(
-              group.state.meta.errorMap.onSubmit ?? '',
-            )}
- } -
- } - - const { getByTestId } = render() - await user.click(getByTestId('submit-group')) - - await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)) - expect(onGroupSubmit).not.toHaveBeenCalled() - expect(onSubmit).not.toHaveBeenCalled() - await waitFor( - () => expect(getByTestId('group-error').textContent).toBe( - 'Name is required', - ), - ) - }, - ) - - it( - 'should ignore form-level field errors outside the group when submitting the group', - async () => { - const onGroupSubmit = vi.fn() - const onGroupSubmitInvalid = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - validators: { - onSubmit: () => ({ - fields: { - 'step2.name': 'Required', - }, - }), - }, - }) - - return - {(group) =>
{ - e.preventDefault() - e.stopPropagation() - group.handleSubmit() - }} - > - - field.handleChange(e.target.value)} - />} - /> - - } -
- } - - const { getByTestId } = render() - await user.click(getByTestId('submit-group')) - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) - expect(onGroupSubmitInvalid).not.toHaveBeenCalled() - }, - ) - - it('should pass submit meta through handleSubmit', async () => { - const onGroupSubmit = vi.fn() - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - return - {(group) => } - - } - - const { getByTestId } = render() - await user.click(getByTestId('submit-group')) - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) - expect(onGroupSubmit).toHaveBeenCalledWith( - expect.objectContaining({ - value: { name: 'test' }, - meta: { source: 'button' }, - }), - ) - }) - - it( - 'should rerender group.state.meta.isSubmitting during an async submit', - async () => { - let resolveSubmit!: () => void - const onGroupSubmit = vi.fn( - () => new Promise((resolve) => { - resolveSubmit = resolve - }), - ) - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }) - - return - {(group) =>
{ - e.preventDefault() - e.stopPropagation() - void group.handleSubmit() - }} - > - -
} -
- } - - const { getByTestId } = render() - const button = getByTestId('submit-group') as HTMLButtonElement - expect(button.textContent).toBe('Continue') - expect(button.disabled).toBe(false) - - await user.click(button) - - await waitFor(() => expect(button.textContent).toBe('Saving...')) - expect(button.disabled).toBe(true) - - resolveSubmit() - - await waitFor(() => expect(button.textContent).toBe('Continue')) - expect(button.disabled).toBe(false) - expect(onGroupSubmit).toHaveBeenCalledTimes(1) - }, - ) - - it( - 'uses the current group state throughout a name change render', - async () => { - const observedValues: string[] = [] - - function Comp() { - const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1') - const form = useForm({ - defaultValues: { - step1: { label: 'first' }, - step2: { label: 'second' }, - }, - }) - - return <> - - - {(group) => { - observedValues.push(group.state.value.label) - return {group.state.value.label} - }} - - - } - - const { getByTestId } = render() - expect(getByTestId('group-label')).toHaveTextContent('first') - - observedValues.length = 0 - await user.click(getByTestId('change-group')) - - expect(getByTestId('group-label')).toHaveTextContent('second') - expect(observedValues).not.toContain('first') - }, - ) -}) + it('should call onGroupSubmit but not the form onSubmit when submitting the group', async () => { + const onSubmit = vi.fn(); + const onGroupSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + onSubmit, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onSubmit).not.toHaveBeenCalled(); + }); + + it('should expose group state value reactively', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'initial' }, + step2: { name: 'other' }, + }, + }); + + return ( + + {(group) => ( + <> + ( + field.handleChange(e.target.value)} + /> + )} + /> +
{JSON.stringify(group.state.value)}
+ + )} +
+ ); + } + + const { getByTestId } = render(); + expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}'); + + await user.clear(getByTestId('step1-name')); + await user.type(getByTestId('step1-name'), 'updated'); + + await waitFor(() => expect(getByTestId('group-value').textContent).toBe('{"name":"updated"}')); + }); + + it('should call onGroupSubmitInvalid when group-level validation fails', async () => { + const onSubmit = vi.fn(); + const onGroupSubmit = vi.fn(); + const onGroupSubmitInvalid = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { name: 'test2' }, + }, + onSubmit, + }); + + return ( + (!value.name ? 'Name is required' : undefined), + }} + onGroupSubmit={onGroupSubmit} + onGroupSubmitInvalid={onGroupSubmitInvalid} + > + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + +
+								{String(group.state.meta.errorMap.onSubmit ?? '')}
+							
+ + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)); + expect(onGroupSubmit).not.toHaveBeenCalled(); + expect(onSubmit).not.toHaveBeenCalled(); + await waitFor(() => expect(getByTestId('group-error').textContent).toBe('Name is required')); + }); + + it('should ignore form-level field errors outside the group when submitting the group', async () => { + const onGroupSubmit = vi.fn(); + const onGroupSubmitInvalid = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + validators: { + onSubmit: () => ({ + fields: { + 'step2.name': 'Required', + }, + }), + }, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + group.handleSubmit(); + }} + > + ( + field.handleChange(e.target.value)} + /> + )} + /> + + + )} +
+ ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onGroupSubmitInvalid).not.toHaveBeenCalled(); + }); + + it('should pass submit meta through handleSubmit', async () => { + const onGroupSubmit = vi.fn(); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + + {(group) => ( + + )} + + ); + } + + const { getByTestId } = render(); + await user.click(getByTestId('submit-group')); + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); + expect(onGroupSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + value: { name: 'test' }, + meta: { source: 'button' }, + }), + ); + }); + + it('should rerender group.state.meta.isSubmitting during an async submit', async () => { + let resolveSubmit!: () => void; + const onGroupSubmit = vi.fn( + () => + new Promise((resolve) => { + resolveSubmit = resolve; + }), + ); + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }); + + return ( + + {(group) => ( +
{ + e.preventDefault(); + e.stopPropagation(); + void group.handleSubmit(); + }} + > + +
+ )} +
+ ); + } + + const { getByTestId } = render(); + const button = getByTestId('submit-group') as HTMLButtonElement; + expect(button.textContent).toBe('Continue'); + expect(button.disabled).toBe(false); + + await user.click(button); + + await waitFor(() => expect(button.textContent).toBe('Saving...')); + expect(button.disabled).toBe(true); + + resolveSubmit(); + + await waitFor(() => expect(button.textContent).toBe('Continue')); + expect(button.disabled).toBe(false); + expect(onGroupSubmit).toHaveBeenCalledTimes(1); + }); + + it('uses the current group state throughout a name change render', async () => { + const observedValues: string[] = []; + + function Comp() { + const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); + const form = useForm({ + defaultValues: { + step1: { label: 'first' }, + step2: { label: 'second' }, + }, + }); + + return <> + + + {(group) => { + observedValues.push(group.state.value.label); + return {group.state.value.label}; + }} + + ; + } + + const { getByTestId } = render(); + expect(getByTestId('group-label')).toHaveTextContent('first'); + + observedValues.length = 0; + await user.click(getByTestId('change-group')); + + expect(getByTestId('group-label')).toHaveTextContent('second'); + expect(observedValues).not.toContain('first'); + }); +}); diff --git a/packages/octane-form/tests/utils.ts b/packages/octane-form/tests/utils.ts index 1a3a619a2..863f489f4 100644 --- a/packages/octane-form/tests/utils.ts +++ b/packages/octane-form/tests/utils.ts @@ -1,5 +1,5 @@ export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout); + }); } From e772daea5261a4e928ed35ffd69ea658f777ed46 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 20:51:53 -0700 Subject: [PATCH 10/19] chore: fix types in TSRX files --- packages/octane-form/src/types.ts | 17 +++++ packages/octane-form/src/useFieldGroup.tsrx | 6 +- .../octane-form/src/useFieldGroup.tsrx.d.ts | 6 +- packages/octane-form/src/useForm.tsrx | 52 ++++--------- packages/octane-form/src/useForm.tsrx.d.ts | 8 +- .../tests/createFormHook.test-d.tsx | 47 ++++++++++++ .../tests/createFormHook.test.tsrx | 18 ++--- .../tests/onChangeListenTo.adapter.test.tsrx | 12 +-- packages/octane-form/tests/useField.test.tsrx | 56 +++++++------- packages/octane-form/tests/useForm.test-d.tsx | 75 +++++++++++++++++++ packages/octane-form/tests/useForm.test.tsrx | 34 ++++----- .../octane-form/tests/useFormGroup.test.tsrx | 8 +- 12 files changed, 225 insertions(+), 114 deletions(-) diff --git a/packages/octane-form/src/types.ts b/packages/octane-form/src/types.ts index c552416c6..f0f1b4153 100644 --- a/packages/octane-form/src/types.ts +++ b/packages/octane-form/src/types.ts @@ -1,3 +1,4 @@ +import type { OctaneNode } from 'octane'; import type { DeepKeys, DeepValue, @@ -10,6 +11,22 @@ import type { FormValidateOrFn, } from '@tanstack/form-core'; +/** + * Subscribe to selected state, or render static Octane children. + * + * OctaneNode includes unknown, so combining it directly with a render callback + * would erase the callback's contextual type. Infer static children separately + * and exclude functions so callbacks always receive the selected state. + */ +export interface SubscribeComponent { + , TChildren = never>(props: { + selector?: (state: NoInfer) => TSelected; + children: + | ((state: NoInfer) => OctaneNode) + | (TChildren extends (...args: never[]) => unknown ? never : TChildren); + }): OctaneNode; +} + interface FieldOptionsMode { mode?: 'value' | 'array'; } diff --git a/packages/octane-form/src/useFieldGroup.tsrx b/packages/octane-form/src/useFieldGroup.tsrx index 46d73f148..b1af110f1 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx +++ b/packages/octane-form/src/useFieldGroup.tsrx @@ -12,6 +12,7 @@ import type { } from '@tanstack/form-core'; import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; import type { LensFieldComponent } from './useField.tsrx'; +import type { SubscribeComponent } from './types'; type FieldGroupRenderable = unknown; type FieldGroupPropsWithChildren

= P & { children?: FieldGroupRenderable }; @@ -80,10 +81,7 @@ export type AppFieldExtendedOctaneFieldGroupApi< /** * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. */ - Subscribe: >>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; - }) => ReturnType; + Subscribe: SubscribeComponent>; }; export function useFieldGroup< diff --git a/packages/octane-form/src/useFieldGroup.tsrx.d.ts b/packages/octane-form/src/useFieldGroup.tsrx.d.ts index 99a2340d2..93d8b9af4 100644 --- a/packages/octane-form/src/useFieldGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFieldGroup.tsrx.d.ts @@ -3,6 +3,7 @@ import { FieldGroupApi } from '@tanstack/form-core'; import type { DeepKeysOfType, FieldGroupState, FieldsMap, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core'; import type { AppFieldExtendedOctaneFormApi } from './createFormHook.tsrx'; import type { LensFieldComponent } from './useField.tsrx'; +import type { SubscribeComponent } from './types'; type FieldGroupRenderable = unknown; type FieldGroupPropsWithChildren

= P & { children?: FieldGroupRenderable; @@ -22,10 +23,7 @@ export type AppFieldExtendedOctaneFieldGroupApi>>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FieldGroupRenderable) | FieldGroupRenderable; - }) => ReturnType; + Subscribe: SubscribeComponent>; }; export declare function useFieldGroup | FieldsMap, TOnMount extends undefined | FormValidateOrFn, TOnChange extends undefined | FormValidateOrFn, TOnChangeAsync extends undefined | FormAsyncValidateOrFn, TOnBlur extends undefined | FormValidateOrFn, TOnBlurAsync extends undefined | FormAsyncValidateOrFn, TOnSubmit extends undefined | FormValidateOrFn, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, TOnDynamic extends undefined | FormValidateOrFn, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, TOnServer extends undefined | FormAsyncValidateOrFn, TComponents extends Record>, TFormComponents extends Record>, TSubmitMeta = never>(opts: { form: AppFieldExtendedOctaneFormApi | AppFieldExtendedOctaneFieldGroupApi, any, any, any, any, any, any, any, any, any, any, TSubmitMeta, TComponents, TFormComponents>; diff --git a/packages/octane-form/src/useForm.tsrx b/packages/octane-form/src/useForm.tsrx index 005e0ae62..11b76f00c 100644 --- a/packages/octane-form/src/useForm.tsrx +++ b/packages/octane-form/src/useForm.tsrx @@ -15,6 +15,7 @@ import type { FormValidateOrFn, } from '@tanstack/form-core'; import type { FieldComponent } from './useField.tsrx'; +import type { SubscribeComponent } from './types'; type FormRenderable = unknown; type FormPropsWithChildren

= P & { children?: FormRenderable }; @@ -71,42 +72,21 @@ export interface OctaneFormApi< /** * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates. */ - Subscribe: < - TSelected = NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - >(props: { - selector?: ( - state: NoInfer< - FormState< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer - > - >, - ) => TSelected; - children: ((state: NoInfer) => FormRenderable) | FormRenderable; - }) => ReturnType; + Subscribe: SubscribeComponent< + FormState< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer + > + >; } /** diff --git a/packages/octane-form/src/useForm.tsrx.d.ts b/packages/octane-form/src/useForm.tsrx.d.ts index 6b62b9d77..4d04ed78a 100644 --- a/packages/octane-form/src/useForm.tsrx.d.ts +++ b/packages/octane-form/src/useForm.tsrx.d.ts @@ -3,8 +3,7 @@ import { FormApi } from '@tanstack/form-core'; import type { FormGroupComponent } from './useFormGroup.tsrx'; import type { FormAsyncValidateOrFn, FormOptions, FormState, FormValidateOrFn } from '@tanstack/form-core'; import type { FieldComponent } from './useField.tsrx'; -type FormRenderable = unknown; -type FormFunctionComponent

= (props: P) => FormRenderable; +import type { SubscribeComponent } from './types'; /** * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` */ @@ -17,10 +16,7 @@ export interface OctaneFormApi>>(props: { - selector?: (state: NoInfer>) => TSelected; - children: ((state: NoInfer) => FormRenderable) | FormRenderable; - }) => ReturnType; + Subscribe: SubscribeComponent>; } /** * An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` diff --git a/packages/octane-form/tests/createFormHook.test-d.tsx b/packages/octane-form/tests/createFormHook.test-d.tsx index e87e05dca..f78e7d683 100644 --- a/packages/octane-form/tests/createFormHook.test-d.tsx +++ b/packages/octane-form/tests/createFormHook.test-d.tsx @@ -36,6 +36,53 @@ const { useAppForm, withForm, withFieldGroup } = createFormHook({ }); describe('createFormHook', () => { + it('should infer field group Subscribe state and selector results', () => { + withFieldGroup({ + defaultValues: { name: '', age: 0 }, + render: ({ group }) => ( + <> + + {(state) => { + expectTypeOf(state).toEqualTypeOf(); + return {state.values.name}; + }} + + [state.values.name, state.values.age] as const}> + {([name, age]) => { + expectTypeOf(name).toEqualTypeOf(); + expectTypeOf(age).toEqualTypeOf(); + return {name}: {age}; + }} + + + ), + }); + }); + + it('should distinguish field group Subscribe callbacks from static children', () => { + withFieldGroup({ + defaultValues: { name: '', age: 0 }, + render: ({ group }) => { + // @ts-expect-error Static children must not accept incompatible render callbacks. + const invalidInferred = state.values.age}>{(age: string) => age}; + // @ts-expect-error Explicit selection types must also enforce the callback type. + const invalidExplicit = selector={(state) => state.values.age}>{(age: string) => age}; + + return ( + <> + Static child + state.values.name}>Static text + {42} + {null} + {[First, 'Second', false]} + {invalidInferred} + {invalidExplicit} + + ); + }, + }); + }); + it('should not break with an infinite type on large schemas', () => { const ActivityKind0_Names = ['Work', 'Rest', 'OnCall'] as const; type ActivityKind0 = (typeof ActivityKind0_Names)[number]; diff --git a/packages/octane-form/tests/createFormHook.test.tsrx b/packages/octane-form/tests/createFormHook.test.tsrx index 3d983e33f..4bad05a68 100644 --- a/packages/octane-form/tests/createFormHook.test.tsrx +++ b/packages/octane-form/tests/createFormHook.test.tsrx @@ -13,7 +13,7 @@ function TextField({ label }: { label: string }) { return (

{label}
- field.handleChange(e.target.value)} /> + field.handleChange(e.currentTarget.value)} /> ); } @@ -261,7 +261,7 @@ describe('createFormHook', () => {
{field.name}
field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )} @@ -311,7 +311,7 @@ describe('createFormHook', () => {
{field.name}
field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )} @@ -692,7 +692,7 @@ describe('createFormHook', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> ); @@ -778,7 +778,7 @@ describe('createFormHook', () => { return ( ); } @@ -788,7 +788,7 @@ describe('createFormHook', () => { return ( ); } @@ -830,7 +830,7 @@ describe('createFormHook', () => { return ( ); } @@ -880,7 +880,7 @@ describe('createFormHook', () => { return ( ); } @@ -925,7 +925,7 @@ describe('createFormHook', () => { data-testid="lastName" value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )} diff --git a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx index 61ae0a559..aea14f507 100644 --- a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx +++ b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx @@ -3,9 +3,9 @@ import { act, fireEvent, render } from '@octanejs/testing-library'; import { useSelector } from '@tanstack/octane-store'; import { useForm } from '../src'; import { sleep } from './utils'; -import type { ReadonlyStore } from '@tanstack/octane-store'; +import type { AnyFormApi } from '../src'; -function DebugSubscribe({ store }: { store: ReadonlyStore }) { +function DebugSubscribe({ store }: { store: AnyFormApi['store'] }) { const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating); return {String(isFieldsValidating)}; } @@ -44,7 +44,7 @@ describe('Octane adapter - onChangeListenTo race', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> {String(field.state.meta.isValidating)}
@@ -58,7 +58,7 @@ describe('Octane adapter - onChangeListenTo race', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> {String(field.state.meta.isValidating)} @@ -74,7 +74,7 @@ describe('Octane adapter - onChangeListenTo race', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> {String(field.state.meta.isValidating)} @@ -90,7 +90,7 @@ describe('Octane adapter - onChangeListenTo race', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> {String(field.state.meta.isValidating)} diff --git a/packages/octane-form/tests/useField.test.tsrx b/packages/octane-form/tests/useField.test.tsrx index 314a0d0b5..eea5d04d9 100644 --- a/packages/octane-form/tests/useField.test.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -32,7 +32,7 @@ describe('useField', () => { data-testid="fieldinput" value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> ); }} @@ -71,7 +71,7 @@ describe('useField', () => { data-testid="fieldinput" value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> ); }} @@ -115,7 +115,7 @@ describe('useField', () => { value={field.state.value} onBlur={field.handleBlur} onInput={(e) => - field.setValue(e.target.value, { + field.setValue(e.currentTarget.value, { dontUpdateMeta: true, }) } @@ -164,7 +164,7 @@ describe('useField', () => { name={field.name} value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} />

{field.getMeta().errorMap.onChange}

@@ -213,7 +213,7 @@ describe('useField', () => { name={field.name} value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} />

{field.getMeta().errorMap.onChange}

{field.getMeta().errorMap.onBlur}

@@ -261,7 +261,7 @@ describe('useField', () => { checked={state.value} type="checkbox" onInput={(e) => { - handleChange(e.target.checked); + handleChange(e.currentTarget.checked); }} /> @@ -278,7 +278,7 @@ describe('useField', () => { handleChange(e.target.value)} + onInput={(e) => handleChange(e.currentTarget.value)} /> )} @@ -294,7 +294,7 @@ describe('useField', () => { handleChange(e.target.value)} + onInput={(e) => handleChange(e.currentTarget.value)} /> )} @@ -347,7 +347,7 @@ describe('useField', () => { data-testid="first-name" value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )}
@@ -366,7 +366,7 @@ describe('useField', () => { data-testid="last-name" value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )}
@@ -436,7 +436,7 @@ describe('useField', () => { data-testid="toggle" type="checkbox" checked={field.state.value} - onInput={(e) => field.handleChange(e.target.checked)} + onInput={(e) => field.handleChange(e.currentTarget.checked)} /> )}
@@ -449,7 +449,7 @@ describe('useField', () => { field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} /> )}
@@ -507,7 +507,7 @@ describe('useField', () => { name={field.name} value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} />

{field.getMeta().errorMap.onChange}

@@ -563,7 +563,7 @@ describe('useField', () => { name={field.name} value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} />

{field.getMeta().errorMap.onChange}

{field.getMeta().errorMap.onBlur}

@@ -623,7 +623,7 @@ describe('useField', () => { name={field.name} value={field.state.value} onBlur={field.handleBlur} - onInput={(e) => field.handleChange(e.target.value)} + onInput={(e) => field.handleChange(e.currentTarget.value)} />

{field.getMeta().errors}

@@ -676,7 +676,7 @@ describe('useField', () => {
Name for person {i}
subField.handleChange(e.target.value)} + onInput={(e) => subField.handleChange(e.currentTarget.value)} /> } -
- ); + const form = useFormContext() + return state.isSubmitting}> + {(isSubmitting) => } + } -const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = createFormHook({ - fieldComponents: { - TextField, - }, - formComponents: { - SubscribeButton, - }, - fieldContext, - formContext, -}); +const { useAppForm, withForm, withFieldGroup, useTypedAppFormContext } = + createFormHook({ + fieldComponents: { + TextField, + }, + formComponents: { + SubscribeButton, + }, + fieldContext, + formContext, + }) describe('createFormHook', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - } - /> - - ); - } - - const { getByLabelText } = render(); - const input = getByLabelText('Testing'); - expect(input).toHaveValue('FirstName'); - }); - - it('should handle withForm types properly', () => { - const formOpts = formOptions({ - defaultValues: { - firstName: 'John', - lastName: 'Doe', - }, - }); - - const ChildForm = withForm({ - ...formOpts, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ form, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('First Name'); - expect(input).toHaveValue('John'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should handle withFieldGroup types properly', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - // Optional, but adds props to the `render` function outside of `form` - props: { - title: 'Child Form', - }, - render: ({ group, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('First Name'); - expect(input).toHaveValue('John'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should use the correct field name in Field with withFieldGroup', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - people: [ - { - firstName: 'Jane', - lastName: 'Doe', - }, - { - firstName: 'Robert', - lastName: 'Doe', - }, - ], - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- } - /> - - - -
- ); - }, - }); - const ChildFormAsArray = withFieldGroup({ - defaultValues: [formOpts.defaultValues.person], - props: { - title: '', - }, - render: ({ group, title }) => { - return ( -
-

{title}

- } - /> - - - -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ( - <> - - - - - ); - }; - - const { getByLabelText, getByText } = render(); - const inputField1 = getByLabelText('person.firstName'); - const inputArray = getByLabelText('people[0].firstName'); - const inputField2 = getByLabelText('people[1].firstName'); - expect(inputField1).toHaveValue('John'); - expect(inputArray).toHaveValue('Jane'); - expect(inputField2).toHaveValue('Robert'); - expect(getByText('Testing')).toBeInTheDocument(); - }); - - it('should forward Field and Subscribe to the form', () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- ( - - )} - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByLabelText, getByText } = render(); - const input = getByLabelText('person.firstName'); - expect(input).toHaveValue('John'); - expect(getByText('Doe')).toBeInTheDocument(); - }); - - it('should not lose focus on update with withFieldGroup', async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'John', - lastName: 'Doe', - }, - }, - }); - - const ChildForm = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: function Render({ group }) { - const firstName = useSelector(group.store, (state) => state.values.firstName); - return ( -
-

{firstName}

- ( - - )} - /> - state.values.lastName}> - {(lastName) =>

{lastName}

} -
-
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByLabelText } = render(); - - const input = getByLabelText('person.firstName'); - input.focus(); - expect(input).toHaveFocus(); - - await user.clear(input); - await user.type(input, 'Something'); - - expect(input).toHaveFocus(); - }); - - it('should allow nesting withFieldGroup in other withFieldGroups', () => { - type Nested = { - firstName: string; - }; - type Wrapper = { - field: Nested; - }; - type FormValues = { - form: Wrapper; - unrelated: { something: { lastName: string } }; - }; - - const defaultValues: FormValues = { - form: { - field: { - firstName: 'Test', - }, - }, - unrelated: { - something: { - lastName: '', - }, - }, - }; - - const LensNested = withFieldGroup({ - defaultValues: defaultValues.form.field, - render: function Render({ group }) { - return {(field) =>

{field.name}

}
; - }, - }); - const LensWrapper = withFieldGroup({ - defaultValues: defaultValues.form, - render: function Render({ group }) { - return ( -
- -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - defaultValues, - }); - return ; - }; - - const { getByText } = render(); - - expect(getByText('form.field.firstName')).toBeInTheDocument(); - }); - - it('should allow mapping withFieldGroup to different values', () => { - const formOpts = formOptions({ - defaultValues: { - unrelated: 'John', - values: '', - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: { firstName: '', lastName: '' }, - render: ({ group }) => { - return ( -
- } - /> -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - - return ( - - ); - }; - - const { getByLabelText } = render(); - const inputField1 = getByLabelText('unrelated'); - expect(inputField1).toHaveValue('John'); - }); - - it('should remap FieldGroupApi.Field validators to the correct names', () => { - const FieldGroupString = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return ( - null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual([ - 'account.password', - ]); - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'account.confirmPassword', - ]); - return <>; - }} - - ); - }, - }); - - const FieldGroupObject = withFieldGroup({ - defaultValues: { password: '', confirmPassword: '' }, - render: function Render({ group }) { - return ( - null, - onChangeListenTo: ['password'], - onBlur: () => null, - onBlurListenTo: ['confirmPassword'], - }} - > - {(field) => { - expect(field.options.validators?.onChangeListenTo).toStrictEqual(['userPassword']); - expect(field.options.validators?.onBlurListenTo).toStrictEqual([ - 'userConfirmPassword', - ]); - return <>; - }} - - ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - defaultValues: { - account: { - password: '', - confirmPassword: '', - }, - userPassword: '', - userConfirmPassword: '', - }, - }); - - return ( - <> - - - - ); - }; - - render(); - }); - - it('should accept formId and return it', async () => { - function Submit() { - const form = useFormContext(); - - return ( - - ); - } - - function Comp() { - const form = useAppForm({ - formId: 'test', - }); - - return ( - -
{ - e.preventDefault(); - form.handleSubmit(); - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => ( - {submissionAttempts} - )} - /> - - -
- ); - } - - const { getByTestId } = render(); - const target = getByTestId('formId-target'); - const result = getByTestId('formId-result'); - - expect(target).toHaveAttribute('form', 'test'); - expect(target).toHaveTextContent('test'); - await user.click(target); - expect(result).toHaveTextContent('1'); - }); - - it('should allow using typed app form', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ( - } /> - ); - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - - - - ); - } - - const { getByLabelText } = render(); - const input = getByLabelText('Testing'); - expect(input).toHaveValue('FirstName'); - }); - - it('should throw if `useTypedAppFormContext` is used without AppForm', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ( - } /> - ); - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ; - } - - expect(() => render()).toThrow(); - }); - - it('should allow using typed app form with form components', () => { - type Person = { - firstName: string; - lastName: string; - }; - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - function Child() { - const form = useTypedAppFormContext(formOpts); - - return ; - } - - function Parent() { - const form = useAppForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - - - - ); - } - - const { getByText } = render(); - const button = getByText('Testing'); - expect(button).toBeInTheDocument(); - }); - - describe('extendForm', () => { - it('should include both parent and extended field components', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John', lastName: 'Doe' }, - }); - - return ( - <> - } - /> - } - /> - - ); - } - - const { getByLabelText, getByTestId } = render(); - expect(getByLabelText('First Name')).toHaveValue('John'); - expect(getByTestId('extended-input')).toHaveValue('Doe'); - }); - - it('should include both parent and extended form components', () => { - function ExtendedSubmit({ label }: { label: string }) { - const form = useFormContext(); - return ( - state.isSubmitting}> - {(isSubmitting) => ( - - )} - - ); - } - - const { useAppForm: useExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - formComponents: { ExtendedSubmit }, - }); - - function Comp() { - const form = useExtendedForm({ - defaultValues: { firstName: 'John' }, - }); - - return ( - - - - - ); - } - - const { getByText, getByTestId } = render(); - expect(getByText('Submit')).toBeInTheDocument(); - expect(getByTestId('extended-submit')).toHaveTextContent('Extended Submit'); - }); - - it('should support chaining multiple extendForm calls', () => { - function FieldA({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - function FieldB({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: {}, - fieldContext, - formContext, - }); - - const { useAppForm: useChainedForm } = base - .extendForm({ fieldComponents: { FieldA } }) - .extendForm({ fieldComponents: { FieldB } }); - - function Comp() { - const form = useChainedForm({ - defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, - }); - - return ( - <> - } /> - } /> - } /> - - ); - } - - const { getByLabelText } = render(); - expect(getByLabelText('A')).toHaveValue('valueA'); - expect(getByLabelText('B')).toHaveValue('valueB'); - expect(getByLabelText('C')).toHaveValue('valueC'); - }); - - it('should work with withForm after extendForm', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const { useAppForm: useExtendedForm, withForm: withExtendedForm } = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }).extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - const ChildForm = withExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - render: function Render({ form }) { - return ( - <> - } - /> - } - /> - - ); - }, - }); - - function Parent() { - const form = useExtendedForm({ - defaultValues: { firstName: 'Jane', lastName: 'Smith' }, - }); - return ; - } - - const { getByLabelText } = render(); - expect(getByLabelText('First Name')).toHaveValue('Jane'); - expect(getByLabelText('Last Name')).toHaveValue('Smith'); - }); - - it('should return a new extendForm from the extended hook', () => { - function ExtendedTextField({ label }: { label: string }) { - const field = useFieldContext(); - return ( - - ); - } - - const base = createFormHook({ - fieldComponents: { TextField }, - formComponents: { SubscribeButton }, - fieldContext, - formContext, - }); - - const extended = base.extendForm({ - fieldComponents: { ExtendedTextField }, - }); - - // extendForm should itself expose extendForm - expect(typeof extended.extendForm).toBe('function'); - }); - }); - - it('should render FieldGroup Subscribe without selector (default identity)', async () => { - const formOpts = formOptions({ - defaultValues: { - person: { - firstName: 'FirstName', - lastName: 'LastName', - }, - }, - }); - - const ChildFormAsField = withFieldGroup({ - defaultValues: formOpts.defaultValues.person, - render: ({ group }) => { - return ( -
- ( - - )} - /> - ( - {state.values.lastName} - )} - /> -
- ); - }, - }); - - const Parent = () => { - const form = useAppForm({ - ...formOpts, - }); - return ; - }; - - const { getByTestId } = render(); - const input = getByTestId('lastName'); - const stateLastName = getByTestId('state-lastName'); - - expect(stateLastName).toHaveTextContent('LastName'); - - await user.clear(input); - await user.type(input, 'Updated'); - await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')); - }); -}); + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + } + /> + + } + + const { getByLabelText } = render() + const input = getByLabelText('Testing') + expect(input).toHaveValue('FirstName') + }) + + it('should handle withForm types properly', () => { + const formOpts = formOptions({ + defaultValues: { + firstName: 'John', + lastName: 'Doe', + }, + }) + + const ChildForm = withForm({ + ...formOpts, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ form, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('First Name') + expect(input).toHaveValue('John') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should handle withFieldGroup types properly', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + // Optional, but adds props to the `render` function outside of `form` + props: { + title: 'Child Form', + }, + render: ({ group, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('First Name') + expect(input).toHaveValue('John') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should use the correct field name in Field with withFieldGroup', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + people: [ + { + firstName: 'Jane', + lastName: 'Doe', + }, + { + firstName: 'Robert', + lastName: 'Doe', + }, + ], + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + + + +
+ }, + }) + const ChildFormAsArray = withFieldGroup({ + defaultValues: [formOpts.defaultValues.person], + props: { + title: '', + }, + render: ({ group, title }) => { + return
+

{title}

+ } + /> + + + +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return <> + + + + + } + + const { getByLabelText, getByText } = render() + const inputField1 = getByLabelText('person.firstName') + const inputArray = getByLabelText('people[0].firstName') + const inputField2 = getByLabelText('people[1].firstName') + expect(inputField1).toHaveValue('John') + expect(inputArray).toHaveValue('Jane') + expect(inputField2).toHaveValue('Robert') + expect(getByText('Testing')).toBeInTheDocument() + }) + + it('should forward Field and Subscribe to the form', () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByLabelText, getByText } = render() + const input = getByLabelText('person.firstName') + expect(input).toHaveValue('John') + expect(getByText('Doe')).toBeInTheDocument() + }) + + it('should not lose focus on update with withFieldGroup', async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'John', + lastName: 'Doe', + }, + }, + }) + + const ChildForm = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: function Render({ group }) { + const firstName = useSelector( + group.store, + (state) => state.values.firstName, + ) + return
+

{firstName}

+ } + /> + state.values.lastName}> + {(lastName) =>

{lastName}

} +
+
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByLabelText } = render() + + const input = getByLabelText('person.firstName') + input.focus() + expect(input).toHaveFocus() + + await user.clear(input) + await user.type(input, 'Something') + + expect(input).toHaveFocus() + }) + + it('should allow nesting withFieldGroup in other withFieldGroups', () => { + type Nested = { + firstName: string; + } + type Wrapper = { + field: Nested; + } + type FormValues = { + form: Wrapper; + unrelated: { something: { lastName: string } }; + } + + const defaultValues: FormValues = { + form: { + field: { + firstName: 'Test', + }, + }, + unrelated: { + something: { + lastName: '', + }, + }, + } + + const LensNested = withFieldGroup({ + defaultValues: defaultValues.form.field, + render: function Render({ group }) { + return + {(field) =>

{field.name}

} +
+ }, + }) + const LensWrapper = withFieldGroup({ + defaultValues: defaultValues.form, + render: function Render({ group }) { + return
+ +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + defaultValues, + }) + return + } + + const { getByText } = render() + + expect(getByText('form.field.firstName')).toBeInTheDocument() + }) + + it('should allow mapping withFieldGroup to different values', () => { + const formOpts = formOptions({ + defaultValues: { + unrelated: 'John', + values: '', + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: { firstName: '', lastName: '' }, + render: ({ group }) => { + return
+ } + /> +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + + return + } + + const { getByLabelText } = render() + const inputField1 = getByLabelText('unrelated') + expect(inputField1).toHaveValue('John') + }) + + it('should remap FieldGroupApi.Field validators to the correct names', () => { + const FieldGroupString = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'account.password', + ]) + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'account.confirmPassword', + ]) + return <> + }} + + }, + }) + + const FieldGroupObject = withFieldGroup({ + defaultValues: { password: '', confirmPassword: '' }, + render: function Render({ group }) { + return null, + onChangeListenTo: ['password'], + onBlur: () => null, + onBlurListenTo: ['confirmPassword'], + }} + > + {(field) => { + expect(field.options.validators?.onChangeListenTo).toStrictEqual([ + 'userPassword', + ]) + expect(field.options.validators?.onBlurListenTo).toStrictEqual([ + 'userConfirmPassword', + ]) + return <> + }} + + }, + }) + + const Parent = () => { + const form = useAppForm({ + defaultValues: { + account: { + password: '', + confirmPassword: '', + }, + userPassword: '', + userConfirmPassword: '', + }, + }) + + return <> + + + + } + + render() + }) + + it('should accept formId and return it', async () => { + function Submit() { + const form = useFormContext() + + return + } + + function Comp() { + const form = useAppForm({ + formId: 'test', + }) + + return +
{ + e.preventDefault() + form.handleSubmit() + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => + {submissionAttempts}} + /> + + +
+ } + + const { getByTestId } = render() + const target = getByTestId('formId-target') + const result = getByTestId('formId-result') + + expect(target).toHaveAttribute('form', 'test') + expect(target).toHaveTextContent('test') + await user.click(target) + expect(result).toHaveTextContent('1') + }) + + it('should allow using typed app form', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return } + /> + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + + + } + + const { getByLabelText } = render() + const input = getByLabelText('Testing') + expect(input).toHaveValue('FirstName') + }) + + it('should throw if `useTypedAppFormContext` is used without AppForm', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return } + /> + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + } + + expect(() => render()).toThrow() + }) + + it('should allow using typed app form with form components', () => { + type Person = { + firstName: string; + lastName: string; + } + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + function Child() { + const form = useTypedAppFormContext(formOpts) + + return + } + + function Parent() { + const form = useAppForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return + + + } + + const { getByText } = render() + const button = getByText('Testing') + expect(button).toBeInTheDocument() + }) + + describe('extendForm', () => { + it('should include both parent and extended field components', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }) + + return <> + } + /> + } + /> + + } + + const { getByLabelText, getByTestId } = render() + expect(getByLabelText('First Name')).toHaveValue('John') + expect(getByTestId('extended-input')).toHaveValue('Doe') + }) + + it('should include both parent and extended form components', () => { + function ExtendedSubmit({ label }: { label: string }) { + const form = useFormContext() + return state.isSubmitting}> + {(isSubmitting) => + } + + } + + const { useAppForm: useExtendedForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + formComponents: { ExtendedSubmit }, + }) + + function Comp() { + const form = useExtendedForm({ + defaultValues: { firstName: 'John' }, + }) + + return + + + + } + + const { getByText, getByTestId } = render() + expect(getByText('Submit')).toBeInTheDocument() + expect(getByTestId('extended-submit')).toHaveTextContent( + 'Extended Submit', + ) + }) + + it('should support chaining multiple extendForm calls', () => { + function FieldA({ label }: { label: string }) { + const field = useFieldContext() + return + } + + function FieldB({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: {}, + fieldContext, + formContext, + }) + + const { useAppForm: useChainedForm } = base.extendForm({ + fieldComponents: { FieldA }, + }).extendForm({ fieldComponents: { FieldB } }) + + function Comp() { + const form = useChainedForm({ + defaultValues: { a: 'valueA', b: 'valueB', c: 'valueC' }, + }) + + return <> + } + /> + } + /> + } + /> + + } + + const { getByLabelText } = render() + expect(getByLabelText('A')).toHaveValue('valueA') + expect(getByLabelText('B')).toHaveValue('valueB') + expect(getByLabelText('C')).toHaveValue('valueC') + }) + + it('should work with withForm after extendForm', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const { useAppForm: useExtendedForm, withForm: withExtendedForm } = + createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }).extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + const ChildForm = withExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + render: function Render({ form }) { + return <> + } + /> + + } + /> + + }, + }) + + function Parent() { + const form = useExtendedForm({ + defaultValues: { firstName: 'Jane', lastName: 'Smith' }, + }) + return + } + + const { getByLabelText } = render() + expect(getByLabelText('First Name')).toHaveValue('Jane') + expect(getByLabelText('Last Name')).toHaveValue('Smith') + }) + + it('should return a new extendForm from the extended hook', () => { + function ExtendedTextField({ label }: { label: string }) { + const field = useFieldContext() + return + } + + const base = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, + }) + + const extended = base.extendForm({ + fieldComponents: { ExtendedTextField }, + }) + + // extendForm should itself expose extendForm + expect(typeof extended.extendForm).toBe('function') + }) + }) + + it( + 'should render FieldGroup Subscribe without selector (default identity)', + async () => { + const formOpts = formOptions({ + defaultValues: { + person: { + firstName: 'FirstName', + lastName: 'LastName', + }, + }, + }) + + const ChildFormAsField = withFieldGroup({ + defaultValues: formOpts.defaultValues.person, + render: ({ group }) => { + return
+ } + /> + + {state.values.lastName}} + /> +
+ }, + }) + + const Parent = () => { + const form = useAppForm({ + ...formOpts, + }) + return + } + + const { getByTestId } = render() + const input = getByTestId('lastName') + const stateLastName = getByTestId('state-lastName') + + expect(stateLastName).toHaveTextContent('LastName') + + await user.clear(input) + await user.type(input, 'Updated') + await waitFor(() => expect(stateLastName).toHaveTextContent('Updated')) + }, + ) +}) diff --git a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx index aea14f507..a6dfb8944 100644 --- a/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx +++ b/packages/octane-form/tests/onChangeListenTo.adapter.test.tsrx @@ -1,138 +1,137 @@ -import { describe, expect, it, vi } from 'vitest'; -import { act, fireEvent, render } from '@octanejs/testing-library'; -import { useSelector } from '@tanstack/octane-store'; -import { useForm } from '../src'; -import { sleep } from './utils'; -import type { AnyFormApi } from '../src'; +import { describe, expect, it, vi } from 'vitest' +import { act, fireEvent, render } from '@octanejs/testing-library' +import { useSelector } from '@tanstack/octane-store' +import { useForm } from '../src' +import { sleep } from './utils' +import type { AnyFormApi } from '../src' function DebugSubscribe({ store }: { store: AnyFormApi['store'] }) { - const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating); - return {String(isFieldsValidating)}; + const isFieldsValidating = useSelector(store, (s) => s.isFieldsValidating) + return {String( + isFieldsValidating, + )} } describe('Octane adapter - onChangeListenTo race', () => { - it('does not leave linked fields stuck in isValidating when multiple rapid updates occur', async () => { - vi.useFakeTimers(); - - const validationFn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - street: '', - houseNo: '', - zipCode: '', - city: '', - }, - }); - - return ( - <> - { - await sleep(500); - validationFn(); - return undefined; - }, - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> - {String(field.state.meta.isValidating)} -
- )} - /> - - ( -
- field.handleChange(e.currentTarget.value)} - /> - - {String(field.state.meta.isValidating)} - -
- )} - /> - - ( -
- field.handleChange(e.currentTarget.value)} - /> - - {String(field.state.meta.isValidating)} - -
- )} - /> - - ( -
- field.handleChange(e.currentTarget.value)} - /> - {String(field.state.meta.isValidating)} -
- )} - /> - - - - ); - } - - const { getByTestId } = render(); - - const street = getByTestId('street') as HTMLInputElement; - const houseNo = getByTestId('houseNo') as HTMLInputElement; - const zipCode = getByTestId('zipCode') as HTMLInputElement; - const city = getByTestId('city') as HTMLInputElement; - - await act(async () => { - // Simulate rapid updates (autofill), then run debounce + async validation. - fireEvent.input(street, { target: { value: 'Foo Street' } }); - fireEvent.input(houseNo, { target: { value: '2' } }); - fireEvent.input(zipCode, { target: { value: '12345' } }); - fireEvent.input(city, { target: { value: 'Barrington' } }); - await vi.runAllTimersAsync(); - }); - - expect(validationFn).toHaveBeenCalledTimes(1); - - // Verify validation flags are not stuck - const isFieldsValidating = getByTestId('isFieldsValidating').textContent; - const streetValidating = getByTestId('street-validating').textContent; - const houseValidating = getByTestId('houseNo-validating').textContent; - const zipValidating = getByTestId('zipCode-validating').textContent; - const cityValidating = getByTestId('city-validating').textContent; - - expect(isFieldsValidating).toBe('false'); - expect(streetValidating).toBe('false'); - expect(houseValidating).toBe('false'); - expect(zipValidating).toBe('false'); - expect(cityValidating).toBe('false'); - - vi.useRealTimers(); - }); -}); + it( + 'does not leave linked fields stuck in isValidating when multiple rapid updates occur', + async () => { + vi.useFakeTimers() + + const validationFn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + street: '', + houseNo: '', + zipCode: '', + city: '', + }, + }) + + return <> + { + await sleep(500) + validationFn() + return undefined + }, + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.currentTarget.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.currentTarget.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + +
+ field.handleChange(e.currentTarget.value)} + /> + {String( + field.state.meta.isValidating, + )} +
} + /> + + + + } + + const { getByTestId } = render() + + const street = getByTestId('street') as HTMLInputElement + const houseNo = getByTestId('houseNo') as HTMLInputElement + const zipCode = getByTestId('zipCode') as HTMLInputElement + const city = getByTestId('city') as HTMLInputElement + + await act(async () => { + // Simulate rapid updates (autofill), then run debounce + async validation. + fireEvent.input(street, { target: { value: 'Foo Street' } }) + fireEvent.input(houseNo, { target: { value: '2' } }) + fireEvent.input(zipCode, { target: { value: '12345' } }) + fireEvent.input(city, { target: { value: 'Barrington' } }) + await vi.runAllTimersAsync() + }) + + expect(validationFn).toHaveBeenCalledTimes(1) + + // Verify validation flags are not stuck + const isFieldsValidating = getByTestId('isFieldsValidating').textContent + const streetValidating = getByTestId('street-validating').textContent + const houseValidating = getByTestId('houseNo-validating').textContent + const zipValidating = getByTestId('zipCode-validating').textContent + const cityValidating = getByTestId('city-validating').textContent + + expect(isFieldsValidating).toBe('false') + expect(streetValidating).toBe('false') + expect(houseValidating).toBe('false') + expect(zipValidating).toBe('false') + expect(cityValidating).toBe('false') + + vi.useRealTimers() + }, + ) +}) diff --git a/packages/octane-form/tests/server.test.tsrx b/packages/octane-form/tests/server.test.tsrx index be8a1dbec..8c0817199 100644 --- a/packages/octane-form/tests/server.test.tsrx +++ b/packages/octane-form/tests/server.test.tsrx @@ -1,34 +1,34 @@ -import { describe, expect, it } from 'vitest'; -import { renderToStaticMarkup } from 'octane/server'; +import { describe, expect, it } from 'vitest' +import { renderToStaticMarkup } from 'octane/server' -import { useForm } from '../src'; +import { useForm } from '../src' function ServerForm() @{ - const form = useForm({ - defaultValues: { - name: 'Server Ada', - }, - }); + const form = useForm({ + defaultValues: { + name: 'Server Ada', + }, + }) -
- - {(field) => } - - state.values.name}> - {(name) => {name}} - -
+
+ + {(field) => } + + state.values.name}> + {(name) => {name}} + +
} describe('@tanstack/octane-form SSR', () => { - it('renders field and form snapshots without a DOM', () => { - expect(typeof document).toBe('undefined'); + it('renders field and form snapshots without a DOM', () => { + expect(typeof document).toBe('undefined') - const { html, css } = renderToStaticMarkup(ServerForm); + const { html, css } = renderToStaticMarkup(ServerForm) - expect(html).toBe( - '
Server Ada
', - ); - expect(css).toBe(''); - }); -}); + expect(html).toBe( + '
Server Ada
', + ) + expect(css).toBe('') + }) +}) diff --git a/packages/octane-form/tests/useField.test-d.tsx b/packages/octane-form/tests/useField.test-d.tsx index 0d06d8386..100f990e9 100644 --- a/packages/octane-form/tests/useField.test-d.tsx +++ b/packages/octane-form/tests/useField.test-d.tsx @@ -1,110 +1,112 @@ /** @jsxImportSource octane */ -import { expectTypeOf, it } from 'vitest'; -import { useForm } from '../src/index'; +import { expectTypeOf, it } from 'vitest' +import { useForm } from '../src/index' it('should type state.value properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const); + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const) - return ( - <> - { - expectTypeOf(field.state.value).toEqualTypeOf<'test'>(); - return null; - }} - /> - { - expectTypeOf(field.state.value).toEqualTypeOf<84>(); - return null; - }} - /> - - ); - } -}); + return ( + <> + { + expectTypeOf(field.state.value).toEqualTypeOf<'test'>() + return null + }} + /> + { + expectTypeOf(field.state.value).toEqualTypeOf<84>() + return null + }} + /> + + ) + } +}) it('should type onChange properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - }, - } as const); + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + }, + } as const) - return ( - <> - { - expectTypeOf(value).toEqualTypeOf<'test'>(); - return null; - }, - }} - children={() => null} - /> - { - expectTypeOf(value).toEqualTypeOf<84>(); - return null; - }, - }} - children={() => null} - /> - - ); - } -}); + return ( + <> + { + expectTypeOf(value).toEqualTypeOf<'test'>() + return null + }, + }} + children={() => null} + /> + { + expectTypeOf(value).toEqualTypeOf<84>() + return null + }, + }} + children={() => null} + /> + + ) + } +}) it('should type array subfields', () => { - type FormDefinition = { - nested: { - people: { - name: string; - age: number; - }[]; - }; - }; + type FormDefinition = { + nested: { + people: { + name: string + age: number + }[] + } + } - function App() { - const form = useForm({ - defaultValues: { - nested: { - people: [], - }, - } as FormDefinition, - onSubmit({ value }) { - alert(JSON.stringify(value)); - }, - }); + function App() { + const form = useForm({ + defaultValues: { + nested: { + people: [], + }, + } as FormDefinition, + onSubmit({ value }) { + alert(JSON.stringify(value)) + }, + }) - return ( - - {(field) => - field.state.value.map((_, i) => ( - - {(subField) => ( - subField.handleChange(event.currentTarget.value)} - /> - )} - - )) - } - - ); - } -}); + return ( + + {(field) => + field.state.value.map((_, i) => ( + + {(subField) => ( + + subField.handleChange(event.currentTarget.value) + } + /> + )} + + )) + } + + ) + } +}) diff --git a/packages/octane-form/tests/useField.test.tsrx b/packages/octane-form/tests/useField.test.tsrx index eea5d04d9..b07517436 100644 --- a/packages/octane-form/tests/useField.test.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -1,1527 +1,1462 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, waitFor, within } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useState } from 'octane'; -import { useForm, useSelector } from '../src'; -import { sleep } from './utils'; +import { describe, expect, it, vi } from 'vitest' +import { render, waitFor, within } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { useState } from 'octane' +import { useForm, useSelector } from '../src' +import { sleep } from './utils' -const user = userEvent.setup(); +const user = userEvent.setup() describe('useField', () => { - it('should allow to set default value', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - expect(input).toHaveValue('FirstName'); - }); - - it('should use field default value first', () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - expect(input).toHaveValue('otherName'); - }); - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? error : undefined), - }} - children={(field) => ( -
- - field.setValue(e.currentTarget.value, { - dontUpdateMeta: true, - }) - } - /> -

{field.getMeta().errors}

-
- )} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - expect(queryByText(error)).not.toBeInTheDocument(); - }); - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? error : undefined), - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.getMeta().errorMap.onChange}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate on change and on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - (value === 'other' ? onChangeError : undefined), - onBlur: ({ value }) => (value === 'other' ? onBlurError : undefined), - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - expect(queryByText(onBlurError)).toBeInTheDocument(); - }); - - it('should properly update conditionally rendered fields', async () => { - type FormValues = { - firstField: string; - secondField: string; - showFirstField: boolean; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstField: '', - secondField: '', - showFirstField: true, - } as FormValues, - }); - - return ( - <> - - {({ handleChange, state }) => ( -
- Show first field - { - handleChange(e.currentTarget.checked); - }} - /> -
- )} -
- state.values.showFirstField}> - {(someFlagChecked) => { - if (someFlagChecked) { - return ( - - {({ handleChange, state }) => ( - - )} - - ); - } - - return ( - - {({ handleChange, state }) => ( - - )} - - ); - }} - - - ); - } - - const { getByTestId } = render(); - - const showFirstFieldInput = getByTestId('show-first-field'); - - await user.type(getByTestId('first-field'), 'hello'); - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); - - await user.click(showFirstFieldInput); - await user.type(getByTestId('second-field'), 'world'); - expect((getByTestId('second-field') as HTMLInputElement).value).toBe('world'); - - await user.click(showFirstFieldInput); - expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello'); - }); - - it('should not keep hidden field submit errors after unmount', async () => { - const onSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: ({ value }) => onSubmit(value), - }); - - return ( -
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => ( - field.handleChange(e.currentTarget.value)} - /> - )} - - - state.values.firstName === 'a'}> - {(showLastName) => - showLastName ? ( - (value.length >= 5 ? undefined : 'lastName too short'), - }} - > - {(field) => ( - field.handleChange(e.currentTarget.value)} - /> - )} - - ) : null - } - - - [state.canSubmit, state.isSubmitting]}> - {([canSubmit, isSubmitting]) => ( - - )} - -
- ); - } - - const { getByTestId, queryByTestId } = render(); - - const submitButton = getByTestId('submit'); - - await user.type(getByTestId('first-name'), 'a'); - await user.type(getByTestId('last-name'), 'abc'); - await user.click(submitButton); - - await waitFor(() => expect(submitButton).toBeDisabled()); - expect(onSubmit).toHaveBeenCalledTimes(0); - - await user.clear(getByTestId('first-name')); - await user.type(getByTestId('first-name'), 'b'); - - await waitFor(() => expect(queryByTestId('last-name')).not.toBeInTheDocument()); - await waitFor(() => expect(submitButton).toBeEnabled()); - - await user.click(submitButton); - await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)); - - await user.clear(getByTestId('first-name')); - await user.type(getByTestId('first-name'), 'a'); - - const remountedLastName = await waitFor(() => getByTestId('last-name')); - expect((remountedLastName as HTMLInputElement).value).toBe('abc'); - expect(submitButton).toBeEnabled(); - }); - - it('should call onUnmount listener when a field is conditionally removed', async () => { - const fieldUnmount = vi.fn(); - const formFieldUnmount = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - show: true, - name: 'test', - }, - listeners: { - onFieldUnmount: formFieldUnmount, - }, - }); - - return ( - <> - - {(field) => ( - field.handleChange(e.currentTarget.checked)} - /> - )} - - - s.values.show}> - {(show) => - show ? ( - - {(field) => ( - field.handleChange(e.currentTarget.value)} - /> - )} - - ) : null - } - - - ); - } - - const { getByTestId, queryByTestId } = render(); - - await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()); - - const callsBefore = fieldUnmount.mock.calls.length; - const formCallsBefore = formFieldUnmount.mock.calls.length; - - await user.click(getByTestId('toggle')); - - await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()); - expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1); - expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1); - }); - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - await sleep(10); - return error; - }, - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.getMeta().errorMap.onChange}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - await sleep(10); - return onChangeError; - }, - onBlurAsync: async () => { - await sleep(10); - return onBlurError; - }, - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.getMeta().errorMap.onChange}

-

{field.getMeta().errorMap.onBlur}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(onChangeError)); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - await waitFor(() => getByText(onBlurError)); - expect(getByText(onBlurError)).toBeInTheDocument(); - }); - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - }); - - return ( - <> - { - mockFn(); - await sleep(10); - return error; - }, - }} - children={(field) => ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.getMeta().errors}

-
- )} - /> - - ); - } - - const { getByTestId, getByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - expect(mockFn).toHaveBeenCalledTimes(1); - }); - - it('should handle arrays with primitive values', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array, - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => { - return ( -
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- - -
- ); - }} -
- ); - })} - -
- ); - }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => ( - - )} - /> - -
- ); - } - - const { getByText, findByLabelText, queryByText, findByText } = render(); - - expect(queryByText('Name for person 0')).not.toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - await user.click(getByText('Add person')); - const input = await findByLabelText('Name for person 0'); - expect(input).toBeInTheDocument(); - await user.type(input, 'John'); - - await user.click(getByText('Add person')); - const input2 = await findByLabelText('Name for person 1'); - expect(input).toBeInTheDocument(); - await user.type(input2, 'Jack'); - - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).toBeInTheDocument(); - await user.click(getByText('Remove person 1')); - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - - await user.click(await findByText('Submit')); - expect(fn).toHaveBeenCalledWith({ people: ['John'] }); - }); - - it('should handle arrays with subvalues', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - people: [] as Array<{ age: number; name: string }>, - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - - {(field) => { - return ( -
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- - -
- ); - }} -
- ); - })} - -
- ); - }} -
- [state.canSubmit, state.isSubmitting]} - children={([canSubmit, isSubmitting]) => ( - - )} - /> - -
- ); - } - - const { getByText, findByLabelText, queryByText, findByText } = render(); - - expect(queryByText('Name for person 0')).not.toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - await user.click(getByText('Add person')); - const input = await findByLabelText('Name for person 0'); - expect(input).toBeInTheDocument(); - await user.type(input, 'John'); - - await user.click(getByText('Add person')); - const input2 = await findByLabelText('Name for person 1'); - expect(input).toBeInTheDocument(); - await user.type(input2, 'Jack'); - - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).toBeInTheDocument(); - await user.click(getByText('Remove person 1')); - expect(queryByText('Name for person 0')).toBeInTheDocument(); - expect(queryByText('Name for person 1')).not.toBeInTheDocument(); - - await user.click(await findByText('Submit')); - expect(fn).toHaveBeenCalledWith({ people: [{ name: 'John', age: 0 }] }); - }); - - it('should not surface undefined for shifted items when a non-last stably-keyed array item is removed', async () => { - // Regression test for https://github.com/TanStack/form/issues/2238 - // When array items are keyed by a stable id (not index), removing a - // non-last item changes the `name` prop of the surviving items. The field - // must read state at its current `name` on that render, never `undefined`. - const observedValues: Array = []; - - function Comp() { - const form = useForm({ - defaultValues: { - sections: [] as Array<{ id: string; title: string }>, - }, - }); - - let nextId = 0; - - return ( - - {(field) => { - return ( -
- {field.state.value.map((section, i) => { - return ( - - {(subField) => { - observedValues.push(subField.state.value); - return ( - - ); - }} - - ); - })} - - -
- ); - }} -
- ); - } - - const { getByText, findByLabelText } = render(); - - await user.click(getByText('Add section')); - await user.click(getByText('Add section')); - - await findByLabelText('Title for section id-1'); - await findByLabelText('Title for section id-2'); - - observedValues.length = 0; - await user.click(getByText('Remove first section')); - - // The surviving item (previously `sections[1]`) shifts to `sections[0]`. - // Its value must remain "Section 2" and never render as `undefined`. - const survivingInput = await findByLabelText('Title for section id-2'); - expect((survivingInput as HTMLInputElement).value).toBe('Section 2'); - expect(observedValues).not.toContain(undefined); - }); - - it('should handle sync linked fields', async () => { - const fn = vi.fn(); - function Comp() { - const form = useForm({ - defaultValues: { - password: '', - confirm_password: '', - }, - onSubmit: ({ value }) => fn(value), - }); - - return ( -
- - {(field) => { - return ( -
- -
- ); - }} -
- { - if (value !== fieldApi.form.getFieldValue('password')) { - return 'Passwords do not match'; - } - return undefined; - }, - }} - > - {(field) => { - return ( -
- - {field.state.meta.errors.map((err) => { - return
{err}
; - })} -
- ); - }} -
-
- ); - } - - const { findByLabelText, queryByText, findByText } = render(); - - const passwordInput = await findByLabelText('Password'); - const confirmPasswordInput = await findByLabelText('Confirm Password'); - await user.type(passwordInput, 'password'); - await user.type(confirmPasswordInput, 'password'); - expect(queryByText('Passwords do not match')).not.toBeInTheDocument(); - await user.type(confirmPasswordInput, '1'); - expect(await findByText('Passwords do not match')).toBeInTheDocument(); - }); - - it('should validate async on submit without debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 1000000, - onChangeAsync: async () => { - mockFn(); - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errors); - - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors}

-
- )} - /> - - - ); - } - - const { getByRole, getByText } = render(); - await user.click(getByRole('button', { name: 'Submit' })); - - expect(mockFn).toHaveBeenCalledTimes(1); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate allow pushvalue to implicitly set a default value', async () => { - type Person = { - people: Array; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }); - - return ( - - {(field) => { - return ( -
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} - -
- ); - }} -
- ); - } - - const { getByText, queryByText } = render(); - expect(getByText('[]')).toBeInTheDocument(); - await user.click(getByText('Add person')); - expect(getByText(`[""]`)).toBeInTheDocument(); - }); - - it('should validate allow pushvalue to implicitly set a pushed default value', async () => { - type Person = { - people: Array; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [], - } as Person, - }); - - return ( - - {(field) => { - return ( -
-
{JSON.stringify(field.state.value)}
- {field.state.value.map((_, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} - -
- ); - }} -
- ); - } - - const { getByText, queryByText } = render(); - expect(getByText('[]')).toBeInTheDocument(); - await user.click(getByText('Add person')); - expect(getByText(`["Test"]`)).toBeInTheDocument(); - }); - - it('should handle removing element from array', async () => { - type Person = { - name: string; - id: number; - }; - - const fakePeople = { - jack: { - id: 5, - name: 'Jack', - }, - molly: { - id: 6, - name: 'Molly', - }, - george: { - id: 7, - name: 'George', - }, - } satisfies Record; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [fakePeople.jack, fakePeople.molly, fakePeople.george], - }, - }); - - return ( - - {(field) => { - return ( -
-
- {field.state.value.map((item, i) => { - return ( - - {(subField) => { - return ( -
- -
- ); - }} -
- ); - })} -
- -
- ); - }} -
- ); - } - - const { getByText, queryByText, getByTestId } = render(); - - let exisingPeople: Person[] = [fakePeople.jack, fakePeople.molly, fakePeople.george]; - exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); - const container = getByTestId('container'); - expect(within(container).getAllByRole('textbox')).toHaveLength(3); - - await user.click(getByText('Remove person')); - - expect(within(container).getAllByRole('textbox')).toHaveLength(2); - exisingPeople = [fakePeople.jack, fakePeople.george]; - exisingPeople.forEach((person) => expect(getByText(person.name)).toBeInTheDocument()); - expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument(); - }); - - it('should not rerender unrelated fields', async () => { - const renderCount = { - field1: 0, - field2: 0, - }; - - function Comp() { - const form = useForm({ - defaultValues: { - field1: '', - field2: '', - }, - }); - - return ( - <> - - {(field) => { - renderCount.field1++; - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - - - {(field) => { - renderCount.field2++; - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - - - ); - } - - const { getByTestId } = render(); - - const field1InitialRender = renderCount.field1; - const field2InitialRender = renderCount.field2; - - await user.type(getByTestId('field1'), 'test'); - - // field1 should have rerendered - expect(renderCount.field1).toBeGreaterThan(field1InitialRender); - // field2 should not have rerendered - expect(renderCount.field2).toBe(field2InitialRender); - }); - - it('should not rerender array field when child field value changes', async () => { - // Test for https://github.com/TanStack/form/issues/1925 - // Array fields should only re-render when the array length changes, - // not when a property on an array element is mutated - const renderCount = { - arrayField: 0, - childField: 0, - }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }); - - return ( - - {(arrayField) => { - renderCount.arrayField++; - return ( -
- {arrayField.state.value.map((_, i) => ( - - {(field) => { - if (i === 0) renderCount.childField++; - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - - ))} - -
- ); - }} -
- ); - } - - const { getByTestId } = render(); - - const arrayFieldInitialRender = renderCount.arrayField; - const childFieldInitialRender = renderCount.childField; - - // Type into the first child field - await user.type(getByTestId('person-0'), 'ny'); - - // Child field should have rerendered - expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender); - // Array field should NOT have rerendered (this was the bug in #1925) - expect(renderCount.arrayField).toBe(arrayFieldInitialRender); - - // Verify typing still works - expect(getByTestId('person-0')).toHaveValue('Johnny'); - - // Now add a new item - this SHOULD trigger array field re-render - const arrayFieldBeforeAdd = renderCount.arrayField; - await user.click(getByTestId('add-person')); - - // Array field should have rerendered when length changes - expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd); - }); - - it('should rerender array field on swapFieldValues even when length is unchanged', async () => { - // swapFieldValues does not change array length but must still notify the - // parent array field so subscribers see the new order. - const renderCount = { arrayField: 0 }; - - function Comp() { - const form = useForm({ - defaultValues: { - people: [{ name: 'John' }, { name: 'Jane' }], - }, - }); - - return ( - - {(arrayField) => { - renderCount.arrayField++; - return ( -
-
    - {arrayField.state.value.map((person, i) => ( -
  1. - {person.name} -
  2. - ))} -
- -
- ); - }} -
- ); - } - - const { getByTestId } = render(); - - expect(getByTestId('item-0')).toHaveTextContent('John'); - expect(getByTestId('item-1')).toHaveTextContent('Jane'); - - const before = renderCount.arrayField; - await user.click(getByTestId('swap')); - - expect(renderCount.arrayField).toBeGreaterThan(before); - expect(getByTestId('item-0')).toHaveTextContent('Jane'); - expect(getByTestId('item-1')).toHaveTextContent('John'); - }); - - it('should rerender array field when async defaultValues resolve', async () => { - // Regression test for https://github.com/TanStack/form/issues/2178 - // When async defaultValues arrive after initial render, array fields in - // mode="array" must re-render because _arrayVersion is used as the - // reactivity signal (not value length). - type Person = { name: string }; - type FormData = { people: Person[] }; - - function Comp({ defaultValues }: { defaultValues?: FormData }) { - const form = useForm({ defaultValues }); - - return ( - - {(field) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - const val = field.state.value ?? []; - return ( -
    - {val.map((person, i) => ( -
  1. - {person.name} -
  2. - ))} -
- ); - }} -
- ); - } - - const { getByTestId, rerender } = render(); - expect(getByTestId('list').children).toHaveLength(0); - - rerender(); - await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)); - expect(getByTestId('item-0')).toHaveTextContent('Alice'); - }); - - it('should handle defaultValue without setstate-in-render error', async () => { - // Spy on console.error before rendering - const consoleErrorSpy = vi.spyOn(console, 'error'); - - function Comp() { - const form = useForm({ - defaultValues: { - fieldOne: '', - fieldTwo: '', - }, - }); - - const fieldOne = useSelector(form.store, (state) => state.values.fieldOne); - - return ( -
- { - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - /> - {fieldOne && ( - null} - /> - )} - - ); - } - - const { getByTestId } = render(); - await user.type(getByTestId('fieldOne'), 'John'); - - // Should not log an error - expect(consoleErrorSpy).not.toHaveBeenCalled(); - }); - - it('should allow field-level defaultValue', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: undefined as string | undefined, - }, - }); - - return ( - - {(field) => { - expect(field.state.value).toEqual('a'); - return {field.state.value}; - }} - - ); - } - - const { queryByText } = render(); - - expect(queryByText('a')).toBeInTheDocument(); - expect(queryByText('never')).not.toBeInTheDocument(); - }); - - it('should handle deeply nested values', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: { first: 'Test', last: 'User' }, - }, - }); - - return

{field.state.value}

} />; - } - - const { queryByText, findByText } = render(); - - expect(queryByText('Test')).not.toBeInTheDocument(); - expect(await findByText('User')).toBeInTheDocument(); - }); -}); + it('should allow to set default value', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return field.handleChange(e.currentTarget.value)} + /> + }} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + expect(input).toHaveValue('FirstName') + }) + + it('should use field default value first', () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return field.handleChange(e.currentTarget.value)} + /> + }} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + expect(input).toHaveValue('otherName') + }) + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' ? error : undefined), + }} + children={(field) =>
+ field.setValue(e.currentTarget.value, { + dontUpdateMeta: true, + })} + /> +

{field.getMeta().errors}

+
} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + expect(queryByText(error)).not.toBeInTheDocument() + }) + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' ? error : undefined), + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> +

{field.getMeta().errorMap.onChange}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate on change and on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + (value === 'other' + ? onChangeError + : undefined), + onBlur: ({ value }) => (value === 'other' + ? onBlurError + : undefined), + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + expect(queryByText(onBlurError)).toBeInTheDocument() + }) + + it('should properly update conditionally rendered fields', async () => { + type FormValues = { + firstField: string; + secondField: string; + showFirstField: boolean; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstField: '', + secondField: '', + showFirstField: true, + } as FormValues, + }) + + return <> + + {({ handleChange, state }) =>
+ Show first field + { + handleChange(e.currentTarget.checked) + }} + /> +
} +
+ state.values.showFirstField}> + {(someFlagChecked) => { + if (someFlagChecked) { + return + {({ handleChange, state }) => } + + } + + return + {({ handleChange, state }) => } + + }} + + + } + + const { getByTestId } = render() + + const showFirstFieldInput = getByTestId('show-first-field') + + await user.type(getByTestId('first-field'), 'hello') + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') + + await user.click(showFirstFieldInput) + await user.type(getByTestId('second-field'), 'world') + expect((getByTestId('second-field') as HTMLInputElement).value).toBe( + 'world', + ) + + await user.click(showFirstFieldInput) + expect((getByTestId('first-field') as HTMLInputElement).value).toBe('hello') + }) + + it('should not keep hidden field submit errors after unmount', async () => { + const onSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: ({ value }) => onSubmit(value), + }) + + return
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => + field.handleChange(e.currentTarget.value)} + />} + + + state.values.firstName === 'a'}> + {(showLastName) => showLastName + ? (value.length >= 5 + ? undefined + : 'lastName too short'), + }} + > + {(field) => + field.handleChange(e.currentTarget.value)} + />} + + : null} + + + [state.canSubmit, state.isSubmitting]} + > + {([canSubmit, isSubmitting]) => } + +
+ } + + const { getByTestId, queryByTestId } = render() + + const submitButton = getByTestId('submit') + + await user.type(getByTestId('first-name'), 'a') + await user.type(getByTestId('last-name'), 'abc') + await user.click(submitButton) + + await waitFor(() => expect(submitButton).toBeDisabled()) + expect(onSubmit).toHaveBeenCalledTimes(0) + + await user.clear(getByTestId('first-name')) + await user.type(getByTestId('first-name'), 'b') + + await waitFor( + () => expect(queryByTestId('last-name')).not.toBeInTheDocument(), + ) + await waitFor(() => expect(submitButton).toBeEnabled()) + + await user.click(submitButton) + await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1)) + + await user.clear(getByTestId('first-name')) + await user.type(getByTestId('first-name'), 'a') + + const remountedLastName = await waitFor(() => getByTestId('last-name')) + expect((remountedLastName as HTMLInputElement).value).toBe('abc') + expect(submitButton).toBeEnabled() + }) + + it( + 'should call onUnmount listener when a field is conditionally removed', + async () => { + const fieldUnmount = vi.fn() + const formFieldUnmount = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + show: true, + name: 'test', + }, + listeners: { + onFieldUnmount: formFieldUnmount, + }, + }) + + return <> + + {(field) => + field.handleChange(e.currentTarget.checked)} + />} + + + s.values.show}> + {(show) => show + ? + {(field) => + field.handleChange(e.currentTarget.value)} + />} + + : null} + + + } + + const { getByTestId, queryByTestId } = render() + + await waitFor(() => expect(getByTestId('name')).toBeInTheDocument()) + + const callsBefore = fieldUnmount.mock.calls.length + const formCallsBefore = formFieldUnmount.mock.calls.length + + await user.click(getByTestId('toggle')) + + await waitFor(() => expect(queryByTestId('name')).not.toBeInTheDocument()) + expect(fieldUnmount).toHaveBeenCalledTimes(callsBefore + 1) + expect(formFieldUnmount).toHaveBeenCalledTimes(formCallsBefore + 1) + }, + ) + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + await sleep(10) + return error + }, + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> +

{field.getMeta().errorMap.onChange}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + await sleep(10) + return onChangeError + }, + onBlurAsync: async () => { + await sleep(10) + return onBlurError + }, + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> +

{field.getMeta().errorMap.onChange}

+

{field.getMeta().errorMap.onBlur}

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(onChangeError)) + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + await waitFor(() => getByText(onBlurError)) + expect(getByText(onBlurError)).toBeInTheDocument() + }) + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + }) + + return <> + { + mockFn() + await sleep(10) + return error + }, + }} + children={(field) =>
+ field.handleChange(e.currentTarget.value)} + /> +

{field.getMeta().errors}

+
} + /> + + } + + const { getByTestId, getByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + expect(mockFn).toHaveBeenCalledTimes(1) + }) + + it('should handle arrays with primitive values', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array, + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => { + return
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ + +
+ }} +
+ })} + +
+ }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + +
+ } + + const { getByText, findByLabelText, queryByText, findByText } = render( + , + ) + + expect(queryByText('Name for person 0')).not.toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + await user.click(getByText('Add person')) + const input = await findByLabelText('Name for person 0') + expect(input).toBeInTheDocument() + await user.type(input, 'John') + + await user.click(getByText('Add person')) + const input2 = await findByLabelText('Name for person 1') + expect(input).toBeInTheDocument() + await user.type(input2, 'Jack') + + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).toBeInTheDocument() + await user.click(getByText('Remove person 1')) + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + + await user.click(await findByText('Submit')) + expect(fn).toHaveBeenCalledWith({ people: ['John'] }) + }) + + it('should handle arrays with subvalues', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + people: [] as Array<{ age: number; name: string }>, + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + {(field) => { + return
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ + +
+ }} +
+ })} + +
+ }} +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + +
+ } + + const { getByText, findByLabelText, queryByText, findByText } = render( + , + ) + + expect(queryByText('Name for person 0')).not.toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + await user.click(getByText('Add person')) + const input = await findByLabelText('Name for person 0') + expect(input).toBeInTheDocument() + await user.type(input, 'John') + + await user.click(getByText('Add person')) + const input2 = await findByLabelText('Name for person 1') + expect(input).toBeInTheDocument() + await user.type(input2, 'Jack') + + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).toBeInTheDocument() + await user.click(getByText('Remove person 1')) + expect(queryByText('Name for person 0')).toBeInTheDocument() + expect(queryByText('Name for person 1')).not.toBeInTheDocument() + + await user.click(await findByText('Submit')) + expect(fn).toHaveBeenCalledWith({ + people: [ + { name: 'John', age: 0 }, + ], + }) + }) + + it( + 'should not surface undefined for shifted items when a non-last stably-keyed array item is removed', + async () => { + // Regression test for https://github.com/TanStack/form/issues/2238 + // When array items are keyed by a stable id (not index), removing a + // non-last item changes the `name` prop of the surviving items. The field + // must read state at its current `name` on that render, never `undefined`. + const observedValues: Array = [] + + function Comp() { + const form = useForm({ + defaultValues: { + sections: [] as Array<{ id: string; title: string }>, + }, + }) + + let nextId = 0 + + return + {(field) => { + return
+ {field.state.value.map((section, i) => { + return + {(subField) => { + observedValues.push(subField.state.value) + return + }} + + })} + + +
+ }} +
+ } + + const { getByText, findByLabelText } = render() + + await user.click(getByText('Add section')) + await user.click(getByText('Add section')) + + await findByLabelText('Title for section id-1') + await findByLabelText('Title for section id-2') + + observedValues.length = 0 + await user.click(getByText('Remove first section')) + + // The surviving item (previously `sections[1]`) shifts to `sections[0]`. + // Its value must remain "Section 2" and never render as `undefined`. + const survivingInput = await findByLabelText('Title for section id-2') + expect((survivingInput as HTMLInputElement).value).toBe('Section 2') + expect(observedValues).not.toContain(undefined) + }, + ) + + it('should handle sync linked fields', async () => { + const fn = vi.fn() + function Comp() { + const form = useForm({ + defaultValues: { + password: '', + confirm_password: '', + }, + onSubmit: ({ value }) => fn(value), + }) + + return
+ + {(field) => { + return
+ +
+ }} +
+ { + if (value !== fieldApi.form.getFieldValue('password')) { + return 'Passwords do not match' + } + return undefined + }, + }} + > + {(field) => { + return
+ + {field.state.meta.errors.map((err) => { + return
{err}
+ })} +
+ }} +
+
+ } + + const { findByLabelText, queryByText, findByText } = render() + + const passwordInput = await findByLabelText('Password') + const confirmPasswordInput = await findByLabelText('Confirm Password') + await user.type(passwordInput, 'password') + await user.type(confirmPasswordInput, 'password') + expect(queryByText('Passwords do not match')).not.toBeInTheDocument() + await user.type(confirmPasswordInput, '1') + expect(await findByText('Passwords do not match')).toBeInTheDocument() + }) + + it('should validate async on submit without debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 1000000, + onChangeAsync: async () => { + mockFn() + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errors) + + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

{errors}

+
} + /> + + + } + + const { getByRole, getByText } = render() + await user.click(getByRole('button', { name: 'Submit' })) + + expect(mockFn).toHaveBeenCalledTimes(1) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it( + 'should validate allow pushvalue to implicitly set a default value', + async () => { + type Person = { + people: Array; + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }) + + return + {(field) => { + return
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })} + +
+ }} +
+ } + + const { getByText, queryByText } = render() + expect(getByText('[]')).toBeInTheDocument() + await user.click(getByText('Add person')) + expect(getByText(`[""]`)).toBeInTheDocument() + }, + ) + + it( + 'should validate allow pushvalue to implicitly set a pushed default value', + async () => { + type Person = { + people: Array; + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [], + } as Person, + }) + + return + {(field) => { + return
+
{JSON.stringify(field.state.value)}
+ {field.state.value.map((_, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })} + +
+ }} +
+ } + + const { getByText, queryByText } = render() + expect(getByText('[]')).toBeInTheDocument() + await user.click(getByText('Add person')) + expect(getByText(`["Test"]`)).toBeInTheDocument() + }, + ) + + it('should handle removing element from array', async () => { + type Person = { + name: string; + id: number; + } + + const fakePeople = { + jack: { + id: 5, + name: 'Jack', + }, + molly: { + id: 6, + name: 'Molly', + }, + george: { + id: 7, + name: 'George', + }, + } satisfies Record + + function Comp() { + const form = useForm({ + defaultValues: { + people: [fakePeople.jack, fakePeople.molly, fakePeople.george], + }, + }) + + return + {(field) => { + return
+
{field.state.value.map((item, i) => { + return + {(subField) => { + return
+ +
+ }} +
+ })}
+ +
+ }} +
+ } + + const { getByText, queryByText, getByTestId } = render() + + let exisingPeople: Person[] = [ + fakePeople.jack, + fakePeople.molly, + fakePeople.george, + ] + exisingPeople.forEach( + (person) => expect(getByText(person.name)).toBeInTheDocument(), + ) + const container = getByTestId('container') + expect(within(container).getAllByRole('textbox')).toHaveLength(3) + + await user.click(getByText('Remove person')) + + expect(within(container).getAllByRole('textbox')).toHaveLength(2) + exisingPeople = [fakePeople.jack, fakePeople.george] + exisingPeople.forEach( + (person) => expect(getByText(person.name)).toBeInTheDocument(), + ) + expect(queryByText(fakePeople.molly.name)).not.toBeInTheDocument() + }) + + it('should not rerender unrelated fields', async () => { + const renderCount = { + field1: 0, + field2: 0, + } + + function Comp() { + const form = useForm({ + defaultValues: { + field1: '', + field2: '', + }, + }) + + return <> + + {(field) => { + renderCount.field1++ + return field.handleChange(e.currentTarget.value)} + /> + }} + + + {(field) => { + renderCount.field2++ + return field.handleChange(e.currentTarget.value)} + /> + }} + + + } + + const { getByTestId } = render() + + const field1InitialRender = renderCount.field1 + const field2InitialRender = renderCount.field2 + + await user.type(getByTestId('field1'), 'test') + + // field1 should have rerendered + expect(renderCount.field1).toBeGreaterThan(field1InitialRender) + // field2 should not have rerendered + expect(renderCount.field2).toBe(field2InitialRender) + }) + + it( + 'should not rerender array field when child field value changes', + async () => { + // Test for https://github.com/TanStack/form/issues/1925 + // Array fields should only re-render when the array length changes, + // not when a property on an array element is mutated + const renderCount = { + arrayField: 0, + childField: 0, + } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }) + + return + {(arrayField) => { + renderCount.arrayField++ + return
+ {arrayField.state.value.map( + (_, i) => + {(field) => { + if (i === 0) renderCount.childField++ + return field.handleChange(e.currentTarget.value)} + /> + }} + , + )} + +
+ }} +
+ } + + const { getByTestId } = render() + + const arrayFieldInitialRender = renderCount.arrayField + const childFieldInitialRender = renderCount.childField + + // Type into the first child field + await user.type(getByTestId('person-0'), 'ny') + + // Child field should have rerendered + expect(renderCount.childField).toBeGreaterThan(childFieldInitialRender) + // Array field should NOT have rerendered (this was the bug in #1925) + expect(renderCount.arrayField).toBe(arrayFieldInitialRender) + + // Verify typing still works + expect(getByTestId('person-0')).toHaveValue('Johnny') + + // Now add a new item - this SHOULD trigger array field re-render + const arrayFieldBeforeAdd = renderCount.arrayField + await user.click(getByTestId('add-person')) + + // Array field should have rerendered when length changes + expect(renderCount.arrayField).toBeGreaterThan(arrayFieldBeforeAdd) + }, + ) + + it( + 'should rerender array field on swapFieldValues even when length is unchanged', + async () => { + // swapFieldValues does not change array length but must still notify the + // parent array field so subscribers see the new order. + const renderCount = { arrayField: 0 } + + function Comp() { + const form = useForm({ + defaultValues: { + people: [{ name: 'John' }, { name: 'Jane' }], + }, + }) + + return + {(arrayField) => { + renderCount.arrayField++ + return
+
    {arrayField.state.value.map( + (person, i) => +
  1. {person.name}
  2. , + )}
+ +
+ }} +
+ } + + const { getByTestId } = render() + + expect(getByTestId('item-0')).toHaveTextContent('John') + expect(getByTestId('item-1')).toHaveTextContent('Jane') + + const before = renderCount.arrayField + await user.click(getByTestId('swap')) + + expect(renderCount.arrayField).toBeGreaterThan(before) + expect(getByTestId('item-0')).toHaveTextContent('Jane') + expect(getByTestId('item-1')).toHaveTextContent('John') + }, + ) + + it( + 'should rerender array field when async defaultValues resolve', + async () => { + // Regression test for https://github.com/TanStack/form/issues/2178 + // When async defaultValues arrive after initial render, array fields in + // mode="array" must re-render because _arrayVersion is used as the + // reactivity signal (not value length). + type Person = { name: string } + type FormData = { people: Person[] } + + function Comp({ defaultValues }: { defaultValues?: FormData }) { + const form = useForm({ defaultValues }) + + return + {(field) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const val = field.state.value ?? [] + return
    {val.map( + (person, i) => +
  1. {person.name}
  2. , + )}
+ }} +
+ } + + const { getByTestId, rerender } = render() + expect(getByTestId('list').children).toHaveLength(0) + + rerender() + await waitFor(() => expect(getByTestId('list').children).toHaveLength(1)) + expect(getByTestId('item-0')).toHaveTextContent('Alice') + }, + ) + + it( + 'should handle defaultValue without setstate-in-render error', + async () => { + // Spy on console.error before rendering + const consoleErrorSpy = vi.spyOn(console, 'error') + + function Comp() { + const form = useForm({ + defaultValues: { + fieldOne: '', + fieldTwo: '', + }, + }) + + const fieldOne = useSelector( + form.store, + (state) => state.values.fieldOne, + ) + + return
+ { + return field.handleChange(e.currentTarget.value)} + /> + }} + /> + {fieldOne && + null} + />} + + } + + const { getByTestId } = render() + await user.type(getByTestId('fieldOne'), 'John') + + // Should not log an error + expect(consoleErrorSpy).not.toHaveBeenCalled() + }, + ) + + it('should allow field-level defaultValue', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: undefined as string | undefined, + }, + }) + + return + {(field) => { + expect(field.state.value).toEqual('a') + return {field.state.value} + }} + + } + + const { queryByText } = render() + + expect(queryByText('a')).toBeInTheDocument() + expect(queryByText('never')).not.toBeInTheDocument() + }) + + it('should handle deeply nested values', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: { first: 'Test', last: 'User' }, + }, + }) + + return

{field.state.value}

} + /> + } + + const { queryByText, findByText } = render() + + expect(queryByText('Test')).not.toBeInTheDocument() + expect(await findByText('User')).toBeInTheDocument() + }) +}) diff --git a/packages/octane-form/tests/useForm.test-d.tsx b/packages/octane-form/tests/useForm.test-d.tsx index c668659ee..edadd9e5a 100644 --- a/packages/octane-form/tests/useForm.test-d.tsx +++ b/packages/octane-form/tests/useForm.test-d.tsx @@ -1,232 +1,257 @@ -import { describe, expectTypeOf, it } from 'vitest'; -import { formOptions, useForm } from '../src/index'; -import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index'; -import type { OctaneFormExtendedApi } from '../src/useForm.tsrx'; +import { describe, expectTypeOf, it } from 'vitest' +import { formOptions, useForm } from '../src/index' +import type { FormAsyncValidateOrFn, FormValidateOrFn } from '../src/index' +import type { OctaneFormExtendedApi } from '../src/useForm.tsrx' describe('useForm', () => { - it('should infer Subscribe selector results and reject incompatible callbacks', () => { - function Comp() { - const form = useForm({ defaultValues: { name: '', age: 0 } }); - - // @ts-expect-error A number selector cannot provide a string to the callback. - const invalidInferred = state.values.age}>{(age: string) => age}; - // @ts-expect-error Explicit selection types must also enforce the callback type. - const invalidExplicit = selector={(state) => state.values.age}>{(age: string) => age}
; - - return ( - <> - [state.values.name, state.values.age] as const}> - {([name, age]) => { - expectTypeOf(name).toEqualTypeOf(); - expectTypeOf(age).toEqualTypeOf(); - // @ts-expect-error The selected age is a number. - age.toUpperCase(); - return {name}: {age}; - }} - - {invalidInferred} - {invalidExplicit} - - ); - } - }); - - it('should infer the whole form state when Subscribe has no selector', () => { - function Comp() { - const form = useForm({ defaultValues: { name: '', age: 0 } }); - - return ( - - {(state) => { - expectTypeOf(state).toEqualTypeOf(); - return {state.values.name}; - }} - - ); - } - }); - - it('should accept static Octane children in Subscribe', () => { - function Comp() { - const form = useForm({ defaultValues: { name: '' } }); - - return ( - <> - Static child - state.values.name}>Static text - {42} - {null} - {[First, 'Second', false]} - - ); - } - }); - - it('should infer Subscribe callbacks combined with static children', () => { - function Comp({ showAge }: { showAge: boolean }) { - const form = useForm({ defaultValues: { name: '', age: 0 } }); - - return ( - state.values.age}> - {showAge - ? (age) => { - expectTypeOf(age).toEqualTypeOf(); - return {age}; - } - : Age hidden} - - ); - } - }); - - it('should type onSubmit properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - onSubmit({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>(); - }, - }); - } - }); - - it('should type a validator properly', () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'test', - age: 84, - // as const is required here - } as const, - validators: { - onChange({ value }) { - expectTypeOf(value.age).toEqualTypeOf<84>(); - return undefined; - }, - }, - }); - } - }); - - it('should not have recursion problems and type register properly', () => { - const register = < - TFormData, - TOnMount extends undefined | FormValidateOrFn, - TOnChange extends undefined | FormValidateOrFn, - TOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TOnBlur extends undefined | FormValidateOrFn, - TOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TOnSubmit extends undefined | FormValidateOrFn, - TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TOnDynamic extends undefined | FormValidateOrFn, - TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TOnServer extends undefined | FormAsyncValidateOrFn, - TSubmitMeta, - >( - f: OctaneFormExtendedApi< - TFormData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TOnServer, - TSubmitMeta - >, - ) => f; - - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - title: '', - }, - }); - - const x = register(form); - - return null; - } - }); - - it('types should be properly inferred when using formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm(formOpts); - - expectTypeOf(form.state.values).toEqualTypeOf(); - }); - - it('types should be properly inferred when passing args alongside formOptions', () => { - type Person = { - firstName: string; - lastName: string; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm({ - ...formOpts, - onSubmitMeta: { - test: 'test', - }, - }); - - expectTypeOf(form.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: { test: string }): Promise; - }>(); - }); - - it('types should be properly inferred when formOptions are being overridden', () => { - type Person = { - firstName: string; - lastName: string; - }; - - type PersonWithAge = Person & { - age: number; - }; - - const formOpts = formOptions({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - const form = useForm({ - ...formOpts, - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - age: 10, - }, - }); - - expectTypeOf(form.state.values).toExtend(); - }); -}); + it('should infer Subscribe selector results and reject incompatible callbacks', () => { + function Comp() { + const form = useForm({ defaultValues: { name: '', age: 0 } }) + + const invalidInferred = ( + state.values.age} + // @ts-expect-error Static children must not allow an incompatible render callback. + children={(age: string) => age} + /> + ) + const invalidExplicit = ( + + selector={(state) => state.values.age} + // @ts-expect-error Explicit selection types must also enforce the callback type. + children={(age: string) => age} + /> + ) + + return ( + <> + [state.values.name, state.values.age] as const} + > + {([name, age]) => { + expectTypeOf(name).toEqualTypeOf() + expectTypeOf(age).toEqualTypeOf() + // @ts-expect-error The selected age is a number. + age.toUpperCase() + return ( + + {name}: {age} + + ) + }} + + {invalidInferred} + {invalidExplicit} + + ) + } + }) + + it('should infer the whole form state when Subscribe has no selector', () => { + function Comp() { + const form = useForm({ defaultValues: { name: '', age: 0 } }) + + return ( + + {(state) => { + expectTypeOf(state).toEqualTypeOf() + return {state.values.name} + }} + + ) + } + }) + + it('should accept static Octane children in Subscribe', () => { + function Comp() { + const form = useForm({ defaultValues: { name: '' } }) + + return ( + <> + + Static child + + state.values.name}> + Static text + + {42} + {null} + + {[First, 'Second', false]} + + + ) + } + }) + + it('should infer Subscribe callbacks combined with static children', () => { + function Comp({ showAge }: { showAge: boolean }) { + const form = useForm({ defaultValues: { name: '', age: 0 } }) + + return ( + state.values.age}> + {showAge ? ( + (age) => { + expectTypeOf(age).toEqualTypeOf() + return {age} + } + ) : ( + Age hidden + )} + + ) + } + }) + + it('should type onSubmit properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + onSubmit({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>() + }, + }) + } + }) + + it('should type a validator properly', () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'test', + age: 84, + // as const is required here + } as const, + validators: { + onChange({ value }) { + expectTypeOf(value.age).toEqualTypeOf<84>() + return undefined + }, + }, + }) + } + }) + + it('should not have recursion problems and type register properly', () => { + const register = < + TFormData, + TOnMount extends undefined | FormValidateOrFn, + TOnChange extends undefined | FormValidateOrFn, + TOnChangeAsync extends undefined | FormAsyncValidateOrFn, + TOnBlur extends undefined | FormValidateOrFn, + TOnBlurAsync extends undefined | FormAsyncValidateOrFn, + TOnSubmit extends undefined | FormValidateOrFn, + TOnSubmitAsync extends undefined | FormAsyncValidateOrFn, + TOnDynamic extends undefined | FormValidateOrFn, + TOnDynamicAsync extends undefined | FormAsyncValidateOrFn, + TOnServer extends undefined | FormAsyncValidateOrFn, + TSubmitMeta, + >( + f: OctaneFormExtendedApi< + TFormData, + TOnMount, + TOnChange, + TOnChangeAsync, + TOnBlur, + TOnBlurAsync, + TOnSubmit, + TOnSubmitAsync, + TOnDynamic, + TOnDynamicAsync, + TOnServer, + TSubmitMeta + >, + ) => f + + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + title: '', + }, + }) + + const x = register(form) + + return null + } + }) + + it('types should be properly inferred when using formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm(formOpts) + + expectTypeOf(form.state.values).toEqualTypeOf() + }) + + it('types should be properly inferred when passing args alongside formOptions', () => { + type Person = { + firstName: string + lastName: string + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm({ + ...formOpts, + onSubmitMeta: { + test: 'test', + }, + }) + + expectTypeOf(form.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: { test: string }): Promise + }>() + }) + + it('types should be properly inferred when formOptions are being overridden', () => { + type Person = { + firstName: string + lastName: string + } + + type PersonWithAge = Person & { + age: number + } + + const formOpts = formOptions({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + const form = useForm({ + ...formOpts, + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + age: 10, + }, + }) + + expectTypeOf(form.state.values).toExtend() + }) +}) diff --git a/packages/octane-form/tests/useForm.test.tsrx b/packages/octane-form/tests/useForm.test.tsrx index c25f12000..627928a37 100644 --- a/packages/octane-form/tests/useForm.test.tsrx +++ b/packages/octane-form/tests/useForm.test.tsrx @@ -1,1146 +1,1161 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, renderHook, waitFor } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { act, useCallback, useEffect, useReducer, useState } from 'octane'; -import { FormApi, mergeForm, useForm, useSelector } from '../src'; -import { sleep } from './utils'; +import { describe, expect, it, vi } from 'vitest' +import { render, renderHook, waitFor } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { act, useCallback, useEffect, useReducer, useState } from 'octane' +import { FormApi, mergeForm, useForm, useSelector } from '../src' +import { sleep } from './utils' -const user = userEvent.setup(); +const user = userEvent.setup() describe('useForm', () => { - it('preserves field state', async () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: {} as Person, - }); - - return ( - <> - { - return ( - field.handleChange(e.currentTarget.value)} - /> - ); - }} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText('FirstName')).not.toBeInTheDocument(); - await user.type(input, 'FirstName'); - expect(input).toHaveValue('FirstName'); - }); - - it('should allow default values to be set', async () => { - type Person = { - firstName: string; - lastName: string; - }; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - lastName: 'LastName', - } as Person, - }); - - return ( - <> - { - return

{field.state.value}

; - }} - /> - - ); - } - - const { findByText, queryByText } = render(); - expect(await findByText('FirstName')).toBeInTheDocument(); - expect(queryByText('LastName')).not.toBeInTheDocument(); - }); - - it('should handle submitting properly', async () => { - function Comp() { - const [submittedData, setSubmittedData] = useState<{ - firstName: string; - } | null>(null); - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - onSubmit: ({ value }) => { - setSubmittedData(value); - }, - }); - - return ( - <> - { - return ( - field.handleChange(e.currentTarget.value)} - placeholder={'First name'} - /> - ); - }} - /> - - {submittedData &&

Submitted data: {submittedData.firstName}

} - - ); - } - - const { findByPlaceholderText, getByText } = render(); - const input = await findByPlaceholderText('First name'); - await user.clear(input); - await user.type(input, 'OtherName'); - await user.click(getByText('Submit')); - await waitFor(() => expect(getByText('Submitted data: OtherName')).toBeInTheDocument()); - }); - - it('should run on form mount', async () => { - function Comp() { - const [formMounted, setFormMounted] = useState(false); - const [mountForm, setMountForm] = useState(false); - - const form = useForm({ - defaultValues: { - firstName: 'FirstName', - }, - validators: { - onMount: () => { - setFormMounted(true); - return undefined; - }, - }, - }); - - return ( - <> - {mountForm ? ( - <> -

{formMounted ? 'Form mounted' : 'Not mounted'}

- - ) : ( - - )} - - ); - } - - const { getByText } = render(); - await user.click(getByText('Mount form')); - await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()); - }); - - it('should validate async on change for the form', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange() { - return error; - }, - }, - }); - const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); - return ( - <> - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> -

{onChangeError?.toString()}

- - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should not validate on change if isTouched is false', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), - }, - }); - - const errors = useSelector(form.store, (s) => s.errors); - return ( - <> - ( -
- - field.setValue(e.currentTarget.value, { - dontUpdateMeta: true, - }) - } - /> -

{errors}

-
- )} - /> - - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - expect(queryByText(error)).not.toBeInTheDocument(); - }); - - it('should validate on change if isTouched is true', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChange: ({ value }) => (value.firstName === 'other' ? error : undefined), - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors.onChange?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(error)).toBeInTheDocument(); - }); - - it('should validate on change and on blur', async () => { - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') return onChangeError; - return undefined; - }, - onBlur: ({ value }) => { - if (value.firstName === 'other') return onBlurError; - return undefined; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

-
- )} - /> - - ); - } - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - expect(queryByText(onBlurError)).toBeInTheDocument(); - }); - - it("should set field errors from the field's validators", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'other') - return { - form: 'Something went wrong', - fields: { - firstName: 'Please enter a different value (onChangeError)', - }, - }; - return undefined; - }, - onBlur: ({ value }) => { - if (value.firstName === 'other') return 'Please enter a different value (onBlurError)'; - return undefined; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.state.meta.errorMap.onChange}

-
- )} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

- - ); - } - const { getByTestId } = render(); - - expect(getByTestId('form-onchange')).toHaveTextContent(''); - - const input = getByTestId('fieldinput'); - - await user.type(input, 'other'); - expect(getByTestId('form-onchange')).toHaveTextContent('Something went wrong'); - expect(getByTestId('field-onchange')).toHaveTextContent( - 'Please enter a different value (onChangeError)', - ); - - await user.click(document.body); - expect(getByTestId('form-onblur')).toHaveTextContent( - 'Please enter a different value (onBlurError)', - ); - }); - - it('should validate async on change', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors.onChange?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - expect(queryByText(error)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - }); - - it("should set field errors from the form's onChangeAsync validator", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChangeAsync: async ({ value }) => { - await sleep(10); - if (value.firstName === 'other') { - return { - form: 'Invalid form values', - fields: { - firstName: 'First name cannot be "other"', - }, - }; - } - return null; - }, - }, - }); - - const errors = useSelector(form.store, (s) => s.errorMap); - - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{field.state.meta.errorMap.onChange}

-
- )} - /> -

{errors.onChange?.toString()}

- - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - const firstNameErrorElement = getByTestId('field-error'); - const formErrorElement = getByTestId('form-error'); - - expect(firstNameErrorElement).toBeEmptyDOMElement(); - expect(formErrorElement).toBeEmptyDOMElement(); - - await user.type(input, 'other'); - - await waitFor(() => { - expect(firstNameErrorElement).not.toBeEmptyDOMElement(); - }); - expect(firstNameErrorElement).toHaveTextContent('First name cannot be "other"'); - expect(formErrorElement).toHaveTextContent('Invalid form values'); - }); - - it('should validate async on change and async on blur', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const onChangeError = 'Please enter a different value (onChangeError)'; - const onBlurError = 'Please enter a different value (onBlurError)'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsync: async () => { - await sleep(10); - return onChangeError; - }, - onBlurAsync: async () => { - await sleep(10); - return onBlurError; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errorMap); - - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors.onChange?.toString()}

-

{errors.onBlur?.toString()}

-
- )} - /> - - ); - } - - const { getByTestId, getByText, queryByText } = render(); - const input = getByTestId('fieldinput'); - - expect(queryByText(onChangeError)).not.toBeInTheDocument(); - expect(queryByText(onBlurError)).not.toBeInTheDocument(); - await user.type(input, 'other'); - await waitFor(() => getByText(onChangeError)); - expect(getByText(onChangeError)).toBeInTheDocument(); - await user.click(document.body); - await waitFor(() => getByText(onBlurError)); - expect(getByText(onBlurError)).toBeInTheDocument(); - }); - - it('should validate async on change with debounce', async () => { - type Person = { - firstName: string; - lastName: string; - }; - const mockFn = vi.fn(); - const error = 'Please enter a different value'; - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - } as Person, - validators: { - onChangeAsyncDebounceMs: 100, - onChangeAsync: async () => { - mockFn(); - await sleep(10); - return error; - }, - }, - }); - const errors = useSelector(form.store, (s) => s.errors); - - return ( - <> - ( -
- field.handleChange(e.currentTarget.value)} - /> -

{errors}

-
- )} - /> - - ); - } - - const { getByTestId, getByText } = render(); - const input = getByTestId('fieldinput'); - await user.type(input, 'other'); - // mockFn will have been called 5 times without onChangeAsyncDebounceMs - expect(mockFn).toHaveBeenCalledTimes(0); - await waitFor(() => getByText(error)); - expect(getByText(error)).toBeInTheDocument(); - expect(mockFn).toHaveBeenCalledTimes(1); - }); - - it("should set errors on the fields from the form's onChange validator", async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - if (value.firstName === 'Tom') { - return { - form: 'Something went wrong', - fields: { firstName: 'Please enter a different value' }, - }; - } - return null; - }, - }, - }); - - const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange); - - return ( - <> - ( - <> - field.handleChange(e.currentTarget.value)} - /> - -

{field.state.meta.errors.join('')}

- - )} - /> -

{onChangeError?.toString()}

- - ); - } - - const { getByTestId, queryByText } = render(); - const input = getByTestId('fieldinput'); - const fieldError = getByTestId('field-error'); - const formError = getByTestId('form-error'); - - expect(queryByText('Please enter a different value')).not.toBeInTheDocument(); - expect(queryByText('Something went wrong')).not.toBeInTheDocument(); - - await user.type(input, 'Tom'); - await waitFor(() => expect(fieldError.textContent).toBe('Please enter a different value')); - await waitFor(() => expect(formError.textContent).toBe('Something went wrong')); - }); - - it('should not cause infinite re-renders when listening to state.errors', () => { - const fn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value); - }, - }); - - const { errors } = useSelector(form.store, (state) => ({ - errors: state.errors, - })); - - useEffect(() => { - fn(errors); - }, [errors]); - - return null; - } - - render(); - - expect(fn).toHaveBeenCalledTimes(1); - }); - - it('should not cause infinite re-renders when listening to state', () => { - const fn = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - onSubmit: async ({ value }) => { - // Do something with form data - console.log(value); - }, - }); - - const { values } = useSelector(form.store, (v) => v); - - useEffect(() => { - fn(values); - }, [values]); - - return null; - } - - render(); - - expect(fn).toHaveBeenCalledTimes(1); - }); - - it('form should reset default value when resetting in onSubmit', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: '', - }, - onSubmit: ({ value }) => { - expect(value).toEqual({ name: 'another-test' }); - - form.reset(value); - }, - }); - - return ( -
{ - e.preventDefault(); - e.stopPropagation(); - form.handleSubmit(); - }} - > - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - - - - - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('fieldinput'); - const submit = getByTestId('submit'); - const reset = getByTestId('reset'); - - await user.type(input, 'test'); - await waitFor(() => expect(input).toHaveValue('test')); - - await user.click(reset); - await waitFor(() => expect(input).toHaveValue('')); - - await user.type(input, 'another-test'); - await user.click(submit); - await waitFor(() => expect(input).toHaveValue('another-test')); - }); - - it('should accept formId and return it', async () => { - function Comp() { - const form = useForm({ - formId: 'test', - }); - - return ( - <> -
{ - e.preventDefault(); - form.handleSubmit(); - }} - >
- - state.submissionAttempts} - children={(submissionAttempts) => ( - {submissionAttempts} - )} - /> - - - - ); - } - - const { getByTestId } = render(); - const target = getByTestId('formId-target'); - const result = getByTestId('formId-result'); - - expect(target).toHaveAttribute('form', 'test'); - expect(target).toHaveTextContent('test'); - await user.click(target); - expect(result).toHaveTextContent('1'); - }); - - it('should allow custom component keys for arrays', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - foo: [ - { name: 'nameA', id: 'a' }, - { name: 'nameB', id: 'b' }, - { name: 'nameC', id: 'c' }, - ], - }, - }); - - return ( - <> - - {(arrayField) => - arrayField.state.value.map((_, i) => ( - - {(field) => { - expect(field.name).toBe(`foo[${i}].name`); - expect(field.state.value).not.toBeUndefined(); - return null; - }} - - )) - } - - - - ); - } - - const { getByTestId } = render(); - - const target = getByTestId('removeField'); - await user.click(target); - }); - - it('should not error when using deleteField in edge cases', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - firstName: '', - lastName: '', - }, - validators: { - onChange: ({ value }) => { - const fields: Record = {}; - - if (value.firstName.length === 0) { - fields.firstName = 'Last Name is required'; - } - - return { fields }; - }, - }, - }); - - return ( -
{ - e.preventDefault(); - form.handleSubmit(); - }} - > -

Personal Information

- ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - - - ); - } - - const { getByTestId } = render(); - const removeButton = getByTestId('remove'); - const input = getByTestId('input'); - - await user.type(input, 'a'); - await user.click(removeButton); - }); - - it('should handle stable transforms to update the base form on first render', async () => { - let renders = 0; - function Comp() { - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback((baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: 'What', - }, - }); - }, []), - }); - - renders++; - - return ( - ( -

- {field.state.value} {renders} -

- )} - /> - ); - } - - const { getByText } = render(); - getByText('What 1'); - }); - - it('should handle stable transforms to update the base form on subsequent renders', async () => { - function Comp() { - const [renders, setRenders] = useState(0); - const form = useForm({ - defaultValues: { - test: 'Hello', - }, - transform: useCallback( - (baseForm: unknown) => { - return mergeForm(baseForm as never, { - values: { - test: renders === 0 ? 'First' : 'Another', - }, - }); - }, - [renders], - ), - }); - - return ( -
-

{field.state.value}

} /> - -
- ); - } - - const { findByText, getByText } = render(); - await findByText('First'); - await user.click(getByText('Rerender')); - await findByText('Another'); - }); - - it('should render Subscribe without selector (default identity)', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - name: 'test', - }, - }); - - return ( - <> - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - - {state.values.name}} - /> - - ); - } - - const { getByTestId } = render(); - const input = getByTestId('input'); - const stateValue = getByTestId('state-value'); - - expect(stateValue).toHaveTextContent('test'); - - await user.clear(input); - await user.type(input, 'updated'); - await waitFor(() => expect(stateValue).toHaveTextContent('updated')); - }); - - it('mounts a replacement form when an explicit formId is removed', async () => { - const mountedIds: string[] = []; - - function Comp() { - const [formId, setFormId] = useState('first'); - const [, forceRender] = useReducer((count: number) => count + 1, 0); - const form = useForm({ - formId, - listeners: { - onMount: () => mountedIds.push(formId ?? 'fallback'), - }, - }); - - return <> - {form.formId} - - - ; - } - - const { getByTestId } = render(); - const id = getByTestId('dynamic-form-id'); - expect(id).toHaveTextContent('first'); - expect(mountedIds).toEqual(['first']); - - await user.click(getByTestId('clear-form-id')); - await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])); - expect(id).not.toHaveTextContent('first'); - const fallbackId = id.textContent; - expect(fallbackId).not.toBe(''); - - await user.click(getByTestId('rerender-form')); - expect(id).toHaveTextContent(fallbackId!); - expect(mountedIds).toEqual(['first', 'fallback']); - }); - - it('keeps multiple subscriptions in the same component independent', () => { - const form = new FormApi({ - defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, - }); - const { result } = renderHook(() => ({ - firstName: useSelector(form.store, (state) => state.values.firstName), - lastName: useSelector(form.store, (state) => state.values.lastName), - })); - - expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }); - act(() => form.setFieldValue('firstName', 'Grace')); - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }); - act(() => form.setFieldValue('lastName', 'Hopper')); - expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }); - }); -}); + it('preserves field state', async () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: {} as Person, + }) + + return <> + { + return field.handleChange(e.currentTarget.value)} + /> + }} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText('FirstName')).not.toBeInTheDocument() + await user.type(input, 'FirstName') + expect(input).toHaveValue('FirstName') + }) + + it('should allow default values to be set', async () => { + type Person = { + firstName: string; + lastName: string; + } + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + lastName: 'LastName', + } as Person, + }) + + return <> + { + return

{field.state.value}

+ }} + /> + + } + + const { findByText, queryByText } = render() + expect(await findByText('FirstName')).toBeInTheDocument() + expect(queryByText('LastName')).not.toBeInTheDocument() + }) + + it('should handle submitting properly', async () => { + function Comp() { + const [submittedData, setSubmittedData] = useState< + | { + firstName: string; + } + | null + >(null) + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + onSubmit: ({ value }) => { + setSubmittedData(value) + }, + }) + + return <> + { + return field.handleChange(e.currentTarget.value)} + placeholder="First name" + /> + }} + /> + + {submittedData &&

Submitted data: {submittedData.firstName}

} + + } + + const { findByPlaceholderText, getByText } = render() + const input = await findByPlaceholderText('First name') + await user.clear(input) + await user.type(input, 'OtherName') + await user.click(getByText('Submit')) + await waitFor( + () => expect(getByText('Submitted data: OtherName')).toBeInTheDocument(), + ) + }) + + it('should run on form mount', async () => { + function Comp() { + const [formMounted, setFormMounted] = useState(false) + const [mountForm, setMountForm] = useState(false) + + const form = useForm({ + defaultValues: { + firstName: 'FirstName', + }, + validators: { + onMount: () => { + setFormMounted(true) + return undefined + }, + }, + }) + + return <> + {mountForm + ? <> +

+ {formMounted ? 'Form mounted' : 'Not mounted'} +

+ + : } + + } + + const { getByText } = render() + await user.click(getByText('Mount form')) + await waitFor(() => expect(getByText('Form mounted')).toBeInTheDocument()) + }) + + it('should validate async on change for the form', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange() { + return error + }, + }, + }) + const onChangeError = useSelector(form.store, (s) => s.errorMap.onChange) + return <> + + field.handleChange(e.currentTarget.value)} + />} + /> +

+ {onChangeError?.toString()} +

+ + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it('should not validate on change if isTouched is false', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' + ? error + : undefined), + }, + }) + + const errors = useSelector(form.store, (s) => s.errors) + return <> +
+ field.setValue(e.currentTarget.value, { + dontUpdateMeta: true, + })} + /> +

{errors}

+
} + /> + + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + expect(queryByText(error)).not.toBeInTheDocument() + }) + + it('should validate on change if isTouched is true', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChange: ({ value }) => (value.firstName === 'other' + ? error + : undefined), + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

+ {errors.onChange?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(error)).toBeInTheDocument() + }) + + it('should validate on change and on blur', async () => { + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return onChangeError + return undefined + }, + onBlur: ({ value }) => { + if (value.firstName === 'other') return onBlurError + return undefined + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+
} + /> + + } + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + expect(queryByText(onBlurError)).toBeInTheDocument() + }) + + it('should set field errors from the field\'s validators', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'other') return { + form: 'Something went wrong', + fields: { + firstName: 'Please enter a different value (onChangeError)', + }, + } + return undefined + }, + onBlur: ({ value }) => { + if ( + value.firstName === 'other' + ) return 'Please enter a different value (onBlurError)' + return undefined + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

{field.state.meta.errorMap.onChange}

+
} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+ + } + const { getByTestId } = render() + + expect(getByTestId('form-onchange')).toHaveTextContent('') + + const input = getByTestId('fieldinput') + + await user.type(input, 'other') + expect(getByTestId('form-onchange')).toHaveTextContent( + 'Something went wrong', + ) + expect(getByTestId('field-onchange')).toHaveTextContent( + 'Please enter a different value (onChangeError)', + ) + + await user.click(document.body) + expect(getByTestId('form-onblur')).toHaveTextContent( + 'Please enter a different value (onBlurError)', + ) + }) + + it('should validate async on change', async () => { + type Person = { + firstName: string; + lastName: string; + } + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

+ {errors.onChange?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + expect(queryByText(error)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + }) + + it( + 'should set field errors from the form\'s onChangeAsync validator', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChangeAsync: async ({ value }) => { + await sleep(10) + if (value.firstName === 'other') { + return { + form: 'Invalid form values', + fields: { + firstName: 'First name cannot be "other"', + }, + } + } + return null + }, + }, + }) + + const errors = useSelector(form.store, (s) => s.errorMap) + + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

{field.state.meta.errorMap.onChange}

+
} + /> +

+ {errors.onChange?.toString()} +

+ + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + const firstNameErrorElement = getByTestId('field-error') + const formErrorElement = getByTestId('form-error') + + expect(firstNameErrorElement).toBeEmptyDOMElement() + expect(formErrorElement).toBeEmptyDOMElement() + + await user.type(input, 'other') + + await waitFor(() => { + expect(firstNameErrorElement).not.toBeEmptyDOMElement() + }) + expect(firstNameErrorElement).toHaveTextContent( + 'First name cannot be "other"', + ) + expect(formErrorElement).toHaveTextContent('Invalid form values') + }, + ) + + it('should validate async on change and async on blur', async () => { + type Person = { + firstName: string; + lastName: string; + } + const onChangeError = 'Please enter a different value (onChangeError)' + const onBlurError = 'Please enter a different value (onBlurError)' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsync: async () => { + await sleep(10) + return onChangeError + }, + onBlurAsync: async () => { + await sleep(10) + return onBlurError + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errorMap) + + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

+ {errors.onChange?.toString()} +

+

+ {errors.onBlur?.toString()} +

+
} + /> + + } + + const { getByTestId, getByText, queryByText } = render() + const input = getByTestId('fieldinput') + + expect(queryByText(onChangeError)).not.toBeInTheDocument() + expect(queryByText(onBlurError)).not.toBeInTheDocument() + await user.type(input, 'other') + await waitFor(() => getByText(onChangeError)) + expect(getByText(onChangeError)).toBeInTheDocument() + await user.click(document.body) + await waitFor(() => getByText(onBlurError)) + expect(getByText(onBlurError)).toBeInTheDocument() + }) + + it('should validate async on change with debounce', async () => { + type Person = { + firstName: string; + lastName: string; + } + const mockFn = vi.fn() + const error = 'Please enter a different value' + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + } as Person, + validators: { + onChangeAsyncDebounceMs: 100, + onChangeAsync: async () => { + mockFn() + await sleep(10) + return error + }, + }, + }) + const errors = useSelector(form.store, (s) => s.errors) + + return <> +
+ field.handleChange(e.currentTarget.value)} + /> +

{errors}

+
} + /> + + } + + const { getByTestId, getByText } = render() + const input = getByTestId('fieldinput') + await user.type(input, 'other') + // mockFn will have been called 5 times without onChangeAsyncDebounceMs + expect(mockFn).toHaveBeenCalledTimes(0) + await waitFor(() => getByText(error)) + expect(getByText(error)).toBeInTheDocument() + expect(mockFn).toHaveBeenCalledTimes(1) + }) + + it( + 'should set errors on the fields from the form\'s onChange validator', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + if (value.firstName === 'Tom') { + return { + form: 'Something went wrong', + fields: { firstName: 'Please enter a different value' }, + } + } + return null + }, + }, + }) + + const onChangeError = useSelector( + form.store, + (s) => s.errorMap.onChange, + ) + + return <> + <> + field.handleChange(e.currentTarget.value)} + /> + +

{field.state.meta.errors.join( + '', + )}

+ } + /> +

+ {onChangeError?.toString()} +

+ + } + + const { getByTestId, queryByText } = render() + const input = getByTestId('fieldinput') + const fieldError = getByTestId('field-error') + const formError = getByTestId('form-error') + + expect( + queryByText('Please enter a different value'), + ).not.toBeInTheDocument() + expect(queryByText('Something went wrong')).not.toBeInTheDocument() + + await user.type(input, 'Tom') + await waitFor( + () => expect(fieldError.textContent).toBe( + 'Please enter a different value', + ), + ) + await waitFor( + () => expect(formError.textContent).toBe('Something went wrong'), + ) + }, + ) + + it( + 'should not cause infinite re-renders when listening to state.errors', + () => { + const fn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + const { errors } = useSelector( + form.store, + (state) => ({ + errors: state.errors, + }), + ) + + useEffect(() => { + fn(errors) + }, [errors]) + + return null + } + + render() + + expect(fn).toHaveBeenCalledTimes(1) + }, + ) + + it('should not cause infinite re-renders when listening to state', () => { + const fn = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + const { values } = useSelector(form.store, (v) => v) + + useEffect(() => { + fn(values) + }, [values]) + + return null + } + + render() + + expect(fn).toHaveBeenCalledTimes(1) + }) + + it('form should reset default value when resetting in onSubmit', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: '', + }, + onSubmit: ({ value }) => { + expect(value).toEqual({ name: 'another-test' }) + + form.reset(value) + }, + }) + + return
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > + + field.handleChange(e.currentTarget.value)} + />} + /> + + + + + + } + + const { getByTestId } = render() + const input = getByTestId('fieldinput') + const submit = getByTestId('submit') + const reset = getByTestId('reset') + + await user.type(input, 'test') + await waitFor(() => expect(input).toHaveValue('test')) + + await user.click(reset) + await waitFor(() => expect(input).toHaveValue('')) + + await user.type(input, 'another-test') + await user.click(submit) + await waitFor(() => expect(input).toHaveValue('another-test')) + }) + + it('should accept formId and return it', async () => { + function Comp() { + const form = useForm({ + formId: 'test', + }) + + return <> +
{ + e.preventDefault() + form.handleSubmit() + }} + >
+ + state.submissionAttempts} + children={(submissionAttempts) => + {submissionAttempts}} + /> + + + + } + + const { getByTestId } = render() + const target = getByTestId('formId-target') + const result = getByTestId('formId-result') + + expect(target).toHaveAttribute('form', 'test') + expect(target).toHaveTextContent('test') + await user.click(target) + expect(result).toHaveTextContent('1') + }) + + it('should allow custom component keys for arrays', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + foo: [ + { name: 'nameA', id: 'a' }, + { name: 'nameB', id: 'b' }, + { name: 'nameC', id: 'c' }, + ], + }, + }) + + return <> + + {(arrayField) => arrayField.state.value.map( + (_, i) => + {(field) => { + expect(field.name).toBe(`foo[${i}].name`) + expect(field.state.value).not.toBeUndefined() + return null + }} + , + )} + + + + } + + const { getByTestId } = render() + + const target = getByTestId('removeField') + await user.click(target) + }) + + it('should not error when using deleteField in edge cases', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validators: { + onChange: ({ value }) => { + const fields: Record = {} + + if (value.firstName.length === 0) { + fields.firstName = 'Last Name is required' + } + + return { fields } + }, + }, + }) + + return
{ + e.preventDefault() + form.handleSubmit() + }} + > +

Personal Information

+ + field.handleChange(e.currentTarget.value)} + />} + /> + + field.handleChange(e.currentTarget.value)} + />} + /> + + + } + + const { getByTestId } = render() + const removeButton = getByTestId('remove') + const input = getByTestId('input') + + await user.type(input, 'a') + await user.click(removeButton) + }) + + it( + 'should handle stable transforms to update the base form on first render', + async () => { + let renders = 0 + function Comp() { + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: 'What', + }, + }) + }, []), + }) + + renders++ + + return

+ {field.state.value} + + {renders} +

} + /> + } + + const { getByText } = render() + getByText('What 1') + }, + ) + + it( + 'should handle stable transforms to update the base form on subsequent renders', + async () => { + function Comp() { + const [renders, setRenders] = useState(0) + const form = useForm({ + defaultValues: { + test: 'Hello', + }, + transform: useCallback((baseForm: unknown) => { + return mergeForm(baseForm as never, { + values: { + test: renders === 0 ? 'First' : 'Another', + }, + }) + }, [renders]), + }) + + return
+

{field.state.value}

} + /> + +
+ } + + const { findByText, getByText } = render() + await findByText('First') + await user.click(getByText('Rerender')) + await findByText('Another') + }, + ) + + it( + 'should render Subscribe without selector (default identity)', + async () => { + function Comp() { + const form = useForm({ + defaultValues: { + name: 'test', + }, + }) + + return <> + + field.handleChange(e.currentTarget.value)} + />} + /> + + + {state.values.name}} + /> + + } + + const { getByTestId } = render() + const input = getByTestId('input') + const stateValue = getByTestId('state-value') + + expect(stateValue).toHaveTextContent('test') + + await user.clear(input) + await user.type(input, 'updated') + await waitFor(() => expect(stateValue).toHaveTextContent('updated')) + }, + ) + + it( + 'mounts a replacement form when an explicit formId is removed', + async () => { + const mountedIds: string[] = [] + + function Comp() { + const [formId, setFormId] = useState('first') + const [, forceRender] = useReducer((count: number) => count + 1, 0) + const form = useForm({ + formId, + listeners: { + onMount: () => mountedIds.push(formId ?? 'fallback'), + }, + }) + + return <> + {form.formId} + + + + } + + const { getByTestId } = render() + const id = getByTestId('dynamic-form-id') + expect(id).toHaveTextContent('first') + expect(mountedIds).toEqual(['first']) + + await user.click(getByTestId('clear-form-id')) + await waitFor(() => expect(mountedIds).toEqual(['first', 'fallback'])) + expect(id).not.toHaveTextContent('first') + const fallbackId = id.textContent + expect(fallbackId).not.toBe('') + + await user.click(getByTestId('rerender-form')) + expect(id).toHaveTextContent(fallbackId!) + expect(mountedIds).toEqual(['first', 'fallback']) + }, + ) + + it('keeps multiple subscriptions in the same component independent', () => { + const form = new FormApi({ + defaultValues: { firstName: 'Ada', lastName: 'Lovelace' }, + }) + const { result } = renderHook( + () => ({ + firstName: useSelector(form.store, (state) => state.values.firstName), + lastName: useSelector(form.store, (state) => state.values.lastName), + }), + ) + + expect(result.current).toEqual({ firstName: 'Ada', lastName: 'Lovelace' }) + act(() => form.setFieldValue('firstName', 'Grace')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Lovelace' }) + act(() => form.setFieldValue('lastName', 'Hopper')) + expect(result.current).toEqual({ firstName: 'Grace', lastName: 'Hopper' }) + }) +}) diff --git a/packages/octane-form/tests/useFormGroup.test-d.tsx b/packages/octane-form/tests/useFormGroup.test-d.tsx index a6ff1c116..765ca1378 100644 --- a/packages/octane-form/tests/useFormGroup.test-d.tsx +++ b/packages/octane-form/tests/useFormGroup.test-d.tsx @@ -1,387 +1,389 @@ -import { describe, expectTypeOf, it } from 'vitest'; -import { useForm, useFormGroup } from '../src/index'; -import type { FormGroupApi } from '../src/index'; +import { describe, expectTypeOf, it } from 'vitest' +import { useForm, useFormGroup } from '../src/index' +import type { FormGroupApi } from '../src/index' describe('useFormGroup form-like surface', () => { - it('should type state.value based on the selected field', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(group.name).toEqualTypeOf<'step1'>(); - } - }); - - it('should type onGroupSubmit value and meta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }, - }); - } - }); - - it('should type onGroupSubmitInvalid value and meta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - onGroupSubmitInvalid: ({ value, meta }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }, - }); - } - }); - - it('should type validators with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - onSubmit: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - }, - }); - } - }); - - it('should type listeners with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - listeners: { - onChange: ({ value }) => { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - }, - }, - }); - } - }); - - it('should type handleSubmit return as Promise', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.handleSubmit()).toEqualTypeOf>(); - } - }); - - it('should type handleSubmit overload when onSubmitMeta is provided', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onSubmitMeta: {} as SubmitMeta, - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: SubmitMeta): Promise; - }>(); - } - }); - - it('should type setValue updater', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - group.setValue({ name: 'new name' }); - group.setValue((prev) => { - expectTypeOf(prev).toEqualTypeOf<{ name: string }>(); - return { name: 'updated' }; - }); - } - }); - - it('should infer the FormGroupApi instance type for useFormGroup', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group).toMatchTypeOf< - FormGroupApi< - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any, - any - > - >(); - } - }); -}); + it('should type state.value based on the selected field', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() + expectTypeOf(group.name).toEqualTypeOf<'step1'>() + } + }) + + it('should type onGroupSubmit value and meta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }, + }) + } + }) + + it('should type onGroupSubmitInvalid value and meta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + onGroupSubmitInvalid: ({ value, meta }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }, + }) + } + }) + + it('should type validators with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + onSubmit: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + }, + }) + } + }) + + it('should type listeners with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + listeners: { + onChange: ({ value }) => { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + }, + }, + }) + } + }) + + it('should type handleSubmit return as Promise', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.handleSubmit()).toEqualTypeOf>() + } + }) + + it('should type handleSubmit overload when onSubmitMeta is provided', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onSubmitMeta: {} as SubmitMeta, + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: SubmitMeta): Promise + }>() + } + }) + + it('should type setValue updater', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + group.setValue({ name: 'new name' }) + group.setValue((prev) => { + expectTypeOf(prev).toEqualTypeOf<{ name: string }>() + return { name: 'updated' } + }) + } + }) + + it('should infer the FormGroupApi instance type for useFormGroup', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group).toMatchTypeOf< + FormGroupApi< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any, + any + > + >() + } + }) +}) describe('useFormGroup field-like meta surface', () => { - it('should type meta booleans', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - }); - - expectTypeOf(group.state.meta.isTouched).toEqualTypeOf(); - expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf(); - expectTypeOf(group.state.meta.isDirty).toEqualTypeOf(); - expectTypeOf(group.state.meta.isValidating).toEqualTypeOf(); - } - }); - - it('should type errorMap entries based on validator return types', () => { - function Comp() { - const form = useForm({ - defaultValues: { step1: { name: 'test' } }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'sync-change' as const, - onChangeAsync: async () => 'async-change' as const, - onBlur: () => 'sync-blur' as const, - onBlurAsync: async () => 'async-blur' as const, - onSubmit: () => 'sync-submit' as const, - onSubmitAsync: async () => 'async-submit' as const, - }, - }); - - expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< - 'sync-change' | 'async-change' | undefined - >(); - expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< - 'sync-blur' | 'async-blur' | undefined - >(); - expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< - 'sync-submit' | 'async-submit' | undefined - >(); - } - }); - - it('should type errors array from group validators', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - const group = useFormGroup({ - form, - name: 'step1', - onGroupSubmit: () => {}, - validators: { - onChange: () => 'change-error' as const, - }, - }); - - expectTypeOf(group.state.meta.errors).toEqualTypeOf>(); - } - }); -}); + it('should type meta booleans', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + }) + + expectTypeOf(group.state.meta.isTouched).toEqualTypeOf() + expectTypeOf(group.state.meta.isBlurred).toEqualTypeOf() + expectTypeOf(group.state.meta.isDirty).toEqualTypeOf() + expectTypeOf(group.state.meta.isValidating).toEqualTypeOf() + } + }) + + it('should type errorMap entries based on validator return types', () => { + function Comp() { + const form = useForm({ + defaultValues: { step1: { name: 'test' } }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'sync-change' as const, + onChangeAsync: async () => 'async-change' as const, + onBlur: () => 'sync-blur' as const, + onBlurAsync: async () => 'async-blur' as const, + onSubmit: () => 'sync-submit' as const, + onSubmitAsync: async () => 'async-submit' as const, + }, + }) + + expectTypeOf(group.state.meta.errorMap.onChange).toEqualTypeOf< + 'sync-change' | 'async-change' | undefined + >() + expectTypeOf(group.state.meta.errorMap.onBlur).toEqualTypeOf< + 'sync-blur' | 'async-blur' | undefined + >() + expectTypeOf(group.state.meta.errorMap.onSubmit).toEqualTypeOf< + 'sync-submit' | 'async-submit' | undefined + >() + } + }) + + it('should type errors array from group validators', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + const group = useFormGroup({ + form, + name: 'step1', + onGroupSubmit: () => {}, + validators: { + onChange: () => 'change-error' as const, + }, + }) + + expectTypeOf(group.state.meta.errors).toEqualTypeOf< + Array<'change-error' | undefined> + >() + } + }) +}) describe('form.FormGroup component surface', () => { - it('should type the children render prop with the scoped value', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - {}}> - {(group) => { - expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(group.name).toEqualTypeOf<'step1'>(); - return null; - }} - - ); - } - }); - - it('should type the children render prop with onSubmitMeta', () => { - type SubmitMeta = { source: string }; - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string }>(); - expectTypeOf(meta).toEqualTypeOf(); - }} - > - {(group) => { - expectTypeOf(group.handleSubmit).toEqualTypeOf<{ - (): Promise; - (submitMeta: SubmitMeta): Promise; - }>(); - return null; - }} - - ); - } - }); - - it('should type validators on the FormGroup component', () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test', age: 10 }, - step2: { name: 'test2' }, - }, - }); - - return ( - { - expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>(); - return undefined; - }, - }} - onGroupSubmit={() => {}} - > - {() => null} - - ); - } - }); -}); + it('should type the children render prop with the scoped value', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return ( + {}}> + {(group) => { + expectTypeOf(group.state.value).toEqualTypeOf<{ name: string }>() + expectTypeOf(group.name).toEqualTypeOf<'step1'>() + return null + }} + + ) + } + }) + + it('should type the children render prop with onSubmitMeta', () => { + type SubmitMeta = { source: string } + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string }>() + expectTypeOf(meta).toEqualTypeOf() + }} + > + {(group) => { + expectTypeOf(group.handleSubmit).toEqualTypeOf<{ + (): Promise + (submitMeta: SubmitMeta): Promise + }>() + return null + }} + + ) + } + }) + + it('should type validators on the FormGroup component', () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test', age: 10 }, + step2: { name: 'test2' }, + }, + }) + + return ( + { + expectTypeOf(value).toEqualTypeOf<{ name: string; age: number }>() + return undefined + }, + }} + onGroupSubmit={() => {}} + > + {() => null} + + ) + } + }) +}) diff --git a/packages/octane-form/tests/useFormGroup.test.tsrx b/packages/octane-form/tests/useFormGroup.test.tsrx index a6bc536ee..b856ac8e7 100644 --- a/packages/octane-form/tests/useFormGroup.test.tsrx +++ b/packages/octane-form/tests/useFormGroup.test.tsrx @@ -1,352 +1,355 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, waitFor } from '@octanejs/testing-library'; -import { userEvent } from '@testing-library/user-event'; -import { useState } from 'octane'; -import { useForm } from '../src'; +import { describe, expect, it, vi } from 'vitest' +import { render, waitFor } from '@octanejs/testing-library' +import { userEvent } from '@testing-library/user-event' +import { useState } from 'octane' +import { useForm } from '../src' -const user = userEvent.setup(); +const user = userEvent.setup() describe('form.FormGroup', () => { - it('should call onGroupSubmit but not the form onSubmit when submitting the group', async () => { - const onSubmit = vi.fn(); - const onGroupSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - onSubmit, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - - - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onSubmit).not.toHaveBeenCalled(); - }); - - it('should expose group state value reactively', async () => { - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'initial' }, - step2: { name: 'other' }, - }, - }); - - return ( - - {(group) => ( - <> - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> -
{JSON.stringify(group.state.value)}
- - )} -
- ); - } - - const { getByTestId } = render(); - expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}'); - - await user.clear(getByTestId('step1-name')); - await user.type(getByTestId('step1-name'), 'updated'); - - await waitFor(() => expect(getByTestId('group-value').textContent).toBe('{"name":"updated"}')); - }); - - it('should call onGroupSubmitInvalid when group-level validation fails', async () => { - const onSubmit = vi.fn(); - const onGroupSubmit = vi.fn(); - const onGroupSubmitInvalid = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: '' }, - step2: { name: 'test2' }, - }, - onSubmit, - }); - - return ( - (!value.name ? 'Name is required' : undefined), - }} - onGroupSubmit={onGroupSubmit} - onGroupSubmitInvalid={onGroupSubmitInvalid} - > - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - -
-								{String(group.state.meta.errorMap.onSubmit ?? '')}
-							
- - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)); - expect(onGroupSubmit).not.toHaveBeenCalled(); - expect(onSubmit).not.toHaveBeenCalled(); - await waitFor(() => expect(getByTestId('group-error').textContent).toBe('Name is required')); - }); - - it('should ignore form-level field errors outside the group when submitting the group', async () => { - const onGroupSubmit = vi.fn(); - const onGroupSubmitInvalid = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - validators: { - onSubmit: () => ({ - fields: { - 'step2.name': 'Required', - }, - }), - }, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - group.handleSubmit(); - }} - > - ( - field.handleChange(e.currentTarget.value)} - /> - )} - /> - - - )} -
- ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onGroupSubmitInvalid).not.toHaveBeenCalled(); - }); - - it('should pass submit meta through handleSubmit', async () => { - const onGroupSubmit = vi.fn(); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - - {(group) => ( - - )} - - ); - } - - const { getByTestId } = render(); - await user.click(getByTestId('submit-group')); - - await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)); - expect(onGroupSubmit).toHaveBeenCalledWith( - expect.objectContaining({ - value: { name: 'test' }, - meta: { source: 'button' }, - }), - ); - }); - - it('should rerender group.state.meta.isSubmitting during an async submit', async () => { - let resolveSubmit!: () => void; - const onGroupSubmit = vi.fn( - () => - new Promise((resolve) => { - resolveSubmit = resolve; - }), - ); - - function Comp() { - const form = useForm({ - defaultValues: { - step1: { name: 'test' }, - step2: { name: 'test2' }, - }, - }); - - return ( - - {(group) => ( -
{ - e.preventDefault(); - e.stopPropagation(); - void group.handleSubmit(); - }} - > - -
- )} -
- ); - } - - const { getByTestId } = render(); - const button = getByTestId('submit-group') as HTMLButtonElement; - expect(button.textContent).toBe('Continue'); - expect(button.disabled).toBe(false); - - await user.click(button); - - await waitFor(() => expect(button.textContent).toBe('Saving...')); - expect(button.disabled).toBe(true); - - resolveSubmit(); - - await waitFor(() => expect(button.textContent).toBe('Continue')); - expect(button.disabled).toBe(false); - expect(onGroupSubmit).toHaveBeenCalledTimes(1); - }); - - it('uses the current group state throughout a name change render', async () => { - const observedValues: string[] = []; - - function Comp() { - const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1'); - const form = useForm({ - defaultValues: { - step1: { label: 'first' }, - step2: { label: 'second' }, - }, - }); - - return <> - - - {(group) => { - observedValues.push(group.state.value.label); - return {group.state.value.label}; - }} - - ; - } - - const { getByTestId } = render(); - expect(getByTestId('group-label')).toHaveTextContent('first'); - - observedValues.length = 0; - await user.click(getByTestId('change-group')); - - expect(getByTestId('group-label')).toHaveTextContent('second'); - expect(observedValues).not.toContain('first'); - }); -}); + it( + 'should call onGroupSubmit but not the form onSubmit when submitting the group', + async () => { + const onSubmit = vi.fn() + const onGroupSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + onSubmit, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.currentTarget.value)} + />} + /> + + } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onSubmit).not.toHaveBeenCalled() + }, + ) + + it('should expose group state value reactively', async () => { + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'initial' }, + step2: { name: 'other' }, + }, + }) + + return + {(group) => <> + + field.handleChange(e.currentTarget.value)} + />} + /> +
{JSON.stringify(
+            group.state.value,
+          )}
+ } +
+ } + + const { getByTestId } = render() + expect(getByTestId('group-value').textContent).toBe('{"name":"initial"}') + + await user.clear(getByTestId('step1-name')) + await user.type(getByTestId('step1-name'), 'updated') + + await waitFor( + () => expect(getByTestId('group-value').textContent).toBe( + '{"name":"updated"}', + ), + ) + }) + + it( + 'should call onGroupSubmitInvalid when group-level validation fails', + async () => { + const onSubmit = vi.fn() + const onGroupSubmit = vi.fn() + const onGroupSubmitInvalid = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { name: 'test2' }, + }, + onSubmit, + }) + + return (!value.name + ? 'Name is required' + : undefined), + }} + onGroupSubmit={onGroupSubmit} + onGroupSubmitInvalid={onGroupSubmitInvalid} + > + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.currentTarget.value)} + />} + /> + +
{String(
+              group.state.meta.errorMap.onSubmit ?? '',
+            )}
+ } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmitInvalid).toHaveBeenCalledTimes(1)) + expect(onGroupSubmit).not.toHaveBeenCalled() + expect(onSubmit).not.toHaveBeenCalled() + await waitFor( + () => expect(getByTestId('group-error').textContent).toBe( + 'Name is required', + ), + ) + }, + ) + + it( + 'should ignore form-level field errors outside the group when submitting the group', + async () => { + const onGroupSubmit = vi.fn() + const onGroupSubmitInvalid = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + validators: { + onSubmit: () => ({ + fields: { + 'step2.name': 'Required', + }, + }), + }, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + + field.handleChange(e.currentTarget.value)} + />} + /> + + } +
+ } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onGroupSubmitInvalid).not.toHaveBeenCalled() + }, + ) + + it('should pass submit meta through handleSubmit', async () => { + const onGroupSubmit = vi.fn() + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return + {(group) => } + + } + + const { getByTestId } = render() + await user.click(getByTestId('submit-group')) + + await waitFor(() => expect(onGroupSubmit).toHaveBeenCalledTimes(1)) + expect(onGroupSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + value: { name: 'test' }, + meta: { source: 'button' }, + }), + ) + }) + + it( + 'should rerender group.state.meta.isSubmitting during an async submit', + async () => { + let resolveSubmit!: () => void + const onGroupSubmit = vi.fn( + () => new Promise((resolve) => { + resolveSubmit = resolve + }), + ) + + function Comp() { + const form = useForm({ + defaultValues: { + step1: { name: 'test' }, + step2: { name: 'test2' }, + }, + }) + + return + {(group) =>
{ + e.preventDefault() + e.stopPropagation() + void group.handleSubmit() + }} + > + +
} +
+ } + + const { getByTestId } = render() + const button = getByTestId('submit-group') as HTMLButtonElement + expect(button.textContent).toBe('Continue') + expect(button.disabled).toBe(false) + + await user.click(button) + + await waitFor(() => expect(button.textContent).toBe('Saving...')) + expect(button.disabled).toBe(true) + + resolveSubmit() + + await waitFor(() => expect(button.textContent).toBe('Continue')) + expect(button.disabled).toBe(false) + expect(onGroupSubmit).toHaveBeenCalledTimes(1) + }, + ) + + it( + 'uses the current group state throughout a name change render', + async () => { + const observedValues: string[] = [] + + function Comp() { + const [groupName, setGroupName] = useState<'step1' | 'step2'>('step1') + const form = useForm({ + defaultValues: { + step1: { label: 'first' }, + step2: { label: 'second' }, + }, + }) + + return <> + + + {(group) => { + observedValues.push(group.state.value.label) + return {group.state.value.label} + }} + + + } + + const { getByTestId } = render() + expect(getByTestId('group-label')).toHaveTextContent('first') + + observedValues.length = 0 + await user.click(getByTestId('change-group')) + + expect(getByTestId('group-label')).toHaveTextContent('second') + expect(observedValues).not.toContain('first') + }, + ) +}) diff --git a/packages/octane-form/tests/utils.ts b/packages/octane-form/tests/utils.ts index 863f489f4..1a3a619a2 100644 --- a/packages/octane-form/tests/utils.ts +++ b/packages/octane-form/tests/utils.ts @@ -1,5 +1,5 @@ export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout); - }); + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout) + }) } From 670c6a3d8ba3a940bfea0db2ca61a4e2a581e08c Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 21 Sep 2026 18:14:39 -0700 Subject: [PATCH 15/19] chore: fix CI test --- knip.json | 7 +- packages/octane-form/package.json | 3 +- pnpm-lock.yaml | 10223 ++++++++++++++-------------- pnpm-workspace.yaml | 1 + 4 files changed, 5001 insertions(+), 5233 deletions(-) diff --git a/knip.json b/knip.json index 59c2b033d..cfbfbda36 100755 --- a/knip.json +++ b/knip.json @@ -1,10 +1,13 @@ { "$schema": "https://unpkg.com/knip@6/schema.json", - "ignoreDependencies": ["@tanstack/devtools", "ts-node"], + "ignoreDependencies": ["@tanstack/devtools", "ts-node", "@vue/runtime-core", "@vue/reactivity"], "ignoreWorkspaces": ["examples/**"], "workspaces": { "packages/octane-form": { - "entry": ["src/index.ts", "localsrc/program-transformer.cts"] + "entry": ["localsrc/program-transformer.cts"] } + }, + "compilers": { + "tsrx": true } } diff --git a/packages/octane-form/package.json b/packages/octane-form/package.json index 70d4596c5..e406500f8 100644 --- a/packages/octane-form/package.json +++ b/packages/octane-form/package.json @@ -62,13 +62,12 @@ "devDependencies": { "@octanejs/testing-library": "^0.1.51", "@testing-library/jest-dom": "^6.8.0", - "@testing-library/user-event": "^14.6.1", "@tsrx/eslint-plugin": "^0.4.6", "@tsrx/typescript-plugin": "0.4.6", "@volar/language-core": "2.4.28", "@volar/typescript": "2.4.28", - "eslint": "9.36.0", "env-cmd": "^11.0.0", + "eslint": "9.36.0", "octane": "^0.2.16", "ts-patch": "3.3.0", "vitest": "^3.2.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4edfa81c0..cae0303c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -180,37 +180,37 @@ importers: version: 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(ts-api-utils@2.5.0(typescript@5.9.3))(typescript@5.9.3) '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(solid-js@1.9.13) + version: 0.8.10(solid-js@1.9.15) '@tanstack/eslint-config': specifier: 0.3.2 - version: 0.3.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + version: 0.3.2(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@tanstack/typedoc-config': specifier: 0.3.1 version: 0.3.1(typescript@5.9.3) '@tanstack/vite-config': specifier: 0.4.1 - version: 0.4.1(@types/node@24.12.4)(rollup@4.60.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 0.4.1(@types/node@24.13.6)(rollup@4.63.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@testing-library/jest-dom': specifier: ^6.8.0 - version: 6.9.1 + version: 6.10.0(@testing-library/dom@10.4.2) '@testing-library/react': specifier: ^16.3.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@testing-library/user-event': specifier: ^14.6.1 - version: 14.6.1(@testing-library/dom@10.4.1) + version: 14.6.7(@testing-library/dom@10.4.2) '@testing-library/vue': specifier: ^8.1.0 - version: 8.1.0(@vue/compiler-dom@3.5.34)(@vue/compiler-sfc@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) + version: 8.1.0(@vue/compiler-dom@3.5.43)(@vue/compiler-sfc@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3)) '@tsrx/prettier-plugin': specifier: 0.4.7 - version: 0.4.7(@typescript-eslint/types@8.59.4)(prettier@3.8.3) + version: 0.4.7(@typescript-eslint/types@8.70.0)(prettier@3.9.8) '@types/node': specifier: ^24.1.0 - version: 24.12.4 + version: 24.13.6 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0)) + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1)) eslint: specifier: 9.36.0 version: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) @@ -225,28 +225,28 @@ importers: version: 6.37.0 markdown-link-extractor: specifier: ^4.0.2 - version: 4.0.3 + version: 4.0.4 nx: specifier: 23.2.1 - version: 23.2.1(@swc/core@1.15.40) + version: 23.2.1(@swc/core@1.16.2) premove: specifier: ^4.0.0 version: 4.0.0 prettier: specifier: ^3.7.4 - version: 3.8.3 + version: 3.9.8 publint: specifier: ^0.3.15 - version: 0.3.21 + version: 0.3.24 sherif: specifier: ^1.9.0 - version: 1.11.1 + version: 1.13.0 tinyglobby: specifier: ^0.2.15 - version: 0.2.16 + version: 0.2.17 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -267,37 +267,37 @@ importers: version: typescript@5.8.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + version: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1) examples/angular/array: dependencies: '@angular/animations': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@angular/router': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-form': specifier: ^1.33.5 version: link:../../../packages/angular-form @@ -313,13 +313,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(0a64f068acf4e67180f9e17cce59d00c) + version: 21.2.24(6c0c725f651b251987e889e8997415aa) '@angular/cli': specifier: ^21.2.12 - version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) + version: 21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1) '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -328,28 +328,28 @@ importers: dependencies: '@angular/animations': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@angular/router': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-form': specifier: ^1.33.5 version: link:../../../packages/angular-form @@ -365,13 +365,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) + version: 21.2.24(98d149fd09f03ab518ddd9685edd4297) '@angular/cli': specifier: ^21.2.12 - version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) + version: 21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1) '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -380,28 +380,28 @@ importers: dependencies: '@angular/animations': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@angular/router': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-form': specifier: ^1.33.5 version: link:../../../packages/angular-form @@ -420,13 +420,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(89c4ebb909596ef91f827350c543afbb) + version: 21.2.24(98d149fd09f03ab518ddd9685edd4297) '@angular/cli': specifier: ^21.2.12 - version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) + version: 21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1) '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -435,28 +435,28 @@ importers: dependencies: '@angular/animations': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@angular/router': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-form': specifier: ^1.33.5 version: link:../../../packages/angular-form @@ -472,13 +472,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) + version: 21.2.24(98d149fd09f03ab518ddd9685edd4297) '@angular/cli': specifier: ^21.2.12 - version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) + version: 21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1) '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -487,34 +487,34 @@ importers: dependencies: '@angular/animations': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@angular/router': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-form': specifier: ^1.33.5 version: link:../../../packages/angular-form effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -523,7 +523,7 @@ importers: version: 2.8.1 valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 @@ -533,13 +533,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.12 - version: 21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d) + version: 21.2.24(98d149fd09f03ab518ddd9685edd4297) '@angular/cli': specifier: ^21.2.12 - version: 21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1) + version: 21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1) '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -555,7 +555,7 @@ importers: devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/lit/large-form: dependencies: @@ -571,7 +571,7 @@ importers: devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/lit/multi-step-wizard: dependencies: @@ -590,7 +590,7 @@ importers: devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/lit/simple: dependencies: @@ -603,7 +603,7 @@ importers: devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/lit/standard-schema: dependencies: @@ -612,29 +612,29 @@ importers: version: link:../../../packages/lit-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 lit: specifier: ^3.3.1 version: 3.3.3 valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/lit/ui-libraries: dependencies: '@material/web': specifier: ^2.4.0 - version: 2.4.1 + version: 2.5.0 '@tanstack/lit-form': specifier: ^1.25.5 version: link:../../../packages/lit-form @@ -644,7 +644,7 @@ importers: devDependencies: vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/preact/multi-step-wizard: dependencies: @@ -653,17 +653,17 @@ importers: version: link:../../../packages/preact-form preact: specifier: ^10.26.4 - version: 10.29.2 + version: 10.29.8 zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.5(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.2)(rollup@4.60.4)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/preact/simple: dependencies: @@ -672,14 +672,14 @@ importers: version: link:../../../packages/preact-form preact: specifier: ^10.26.4 - version: 10.29.2 + version: 10.29.8 devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.5(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.2)(rollup@4.60.4)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/array: dependencies: @@ -695,22 +695,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/compiler: dependencies: @@ -726,13 +726,13 @@ importers: devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -741,7 +741,7 @@ importers: version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/composition: dependencies: @@ -757,22 +757,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/devtools: dependencies: @@ -788,22 +788,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/dynamic: dependencies: @@ -819,22 +819,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -843,61 +843,61 @@ importers: dependencies: '@expo/vector-icons': specifier: ^15.0.3 - version: 15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 15.1.1(expo-font@14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) '@react-navigation/bottom-tabs': specifier: ^7.4.0 - version: 7.16.1(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 7.19.2(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) '@react-navigation/elements': specifier: ^2.6.3 - version: 2.9.18(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 2.9.43(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) '@react-navigation/native': specifier: ^7.1.8 - version: 7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) '@tanstack/react-form': specifier: ^1.33.5 version: link:../../../packages/react-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 expo: specifier: ~54.0.33 - version: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + version: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) expo-constants: specifier: ~18.0.13 - version: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) expo-font: specifier: ~14.0.11 - version: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) expo-haptics: specifier: ~15.0.8 - version: 15.0.8(expo@54.0.34) + version: 15.0.8(expo@54.0.37) expo-image: specifier: ~3.0.11 - version: 3.0.11(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 3.0.11(expo@54.0.37)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) expo-linking: specifier: ~8.0.11 - version: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) + version: 8.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) expo-router: specifier: ~6.0.23 - version: 6.0.23(c7c2013fda48cef4065ef0e95e77f784) + version: 6.0.24(3a123a5aaca9c4c45b93faf4bd84db41) expo-splash-screen: specifier: ~31.0.13 - version: 31.0.13(expo@54.0.34)(supports-color@8.1.1)(typescript@5.9.3) + version: 31.0.13(expo@54.0.37)(supports-color@8.1.1)(typescript@5.9.3) expo-status-bar: specifier: ~3.0.9 - version: 3.0.9(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 3.0.9(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) expo-symbols: specifier: ~1.0.8 - version: 1.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)) + version: 1.0.8(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)) expo-system-ui: specifier: ~6.0.9 - version: 6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 6.0.9(expo@54.0.37)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) expo-web-browser: specifier: ~15.0.10 - version: 15.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)) + version: 15.0.11(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)) react: specifier: 19.1.0 version: 19.1.0 @@ -906,41 +906,41 @@ importers: version: 19.1.0(react@19.1.0) react-native: specifier: 0.81.5 - version: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + version: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) react-native-gesture-handler: specifier: ~2.28.0 - version: 2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react-native-reanimated: specifier: ~4.1.1 - version: 4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react-native-safe-area-context: specifier: ~5.6.0 - version: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react-native-screens: specifier: ~4.16.0 - version: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react-native-web: specifier: ~0.21.0 version: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-native-worklets: specifier: 0.5.1 - version: 0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) + version: 0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 eslint: specifier: 9.36.0 version: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) eslint-config-expo: specifier: ~10.0.0 - version: 10.0.0(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + version: 10.0.0(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -959,22 +959,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/large-form: dependencies: @@ -990,22 +990,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/multi-step-wizard: dependencies: @@ -1024,22 +1024,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/next-server-actions: dependencies: @@ -1048,10 +1048,10 @@ importers: version: link:../../../packages/react-form-nextjs '@tanstack/react-store': specifier: ^0.11.0 - version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: 16.2.6 - version: 16.2.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.100.0) + version: 16.2.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.104.1) react: specifier: 19.1.0 version: 19.1.0 @@ -1061,13 +1061,13 @@ importers: devDependencies: '@types/node': specifier: ^24.1.0 - version: 24.12.4 + version: 24.13.6 '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) typescript: specifier: 5.9.3 version: 5.9.3 @@ -1079,10 +1079,10 @@ importers: version: link:../../../packages/react-form-nextjs '@tanstack/react-store': specifier: ^0.11.0 - version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: 16.2.6 - version: 16.2.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.100.0) + version: 16.2.6(@babel/core@7.29.7(supports-color@7.2.0))(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.104.1) react: specifier: 19.1.0 version: 19.1.0 @@ -1095,13 +1095,13 @@ importers: devDependencies: '@types/node': specifier: ^24.1.0 - version: 24.12.4 + version: 24.13.6 '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) typescript: specifier: 5.9.3 version: 5.9.3 @@ -1113,7 +1113,7 @@ importers: version: link:../../../packages/react-form '@tanstack/react-query': specifier: ^5.89.0 - version: 5.100.14(react@19.1.0) + version: 5.103.1(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -1123,43 +1123,43 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/remix: dependencies: '@remix-run/node': specifier: ^2.17.4 - version: 2.17.4(typescript@5.9.3) + version: 2.17.5(typescript@5.9.3) '@remix-run/react': specifier: ^2.17.4 - version: 2.17.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + version: 2.17.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) '@remix-run/serve': specifier: ^2.17.4 - version: 2.17.4(supports-color@8.1.1)(typescript@5.9.3) + version: 2.17.5(supports-color@8.1.1)(typescript@5.9.3) '@tanstack/react-form-remix': specifier: ^1.33.5 version: link:../../../packages/react-form-remix '@tanstack/react-store': specifier: ^0.11.0 - version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) isbot: specifier: ^5.1.30 - version: 5.1.40 + version: 5.2.2 react: specifier: 19.1.0 version: 19.1.0 @@ -1169,22 +1169,22 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.17.4 - version: 2.17.4(@remix-run/react@2.17.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(@remix-run/serve@2.17.4(supports-color@8.1.1)(typescript@5.9.3))(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0)(ts-node@10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) + version: 2.17.5(@remix-run/react@2.17.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(@remix-run/serve@2.17.5(supports-color@8.1.1)(typescript@5.9.3))(@types/node@24.13.6)(babel-plugin-macros@3.1.0)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2)(ts-node@10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1))(yaml@2.9.1) '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)) examples/react/simple: dependencies: @@ -1200,22 +1200,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/standard-schema: dependencies: @@ -1224,10 +1224,10 @@ importers: version: link:../../../packages/react-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 react: specifier: 19.1.0 version: 19.1.0 @@ -1236,29 +1236,29 @@ importers: version: 19.1.0(react@19.1.0) valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/tanstack-start: dependencies: @@ -1267,13 +1267,13 @@ importers: version: link:../../../packages/react-form-start '@tanstack/react-router': specifier: ^1.134.9 - version: 1.170.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/react-store': specifier: ^0.11.0 - version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -1283,49 +1283,49 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/node': specifier: ^24.1.0 - version: 24.12.4 + version: 24.13.6 '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)) examples/react/ui-libraries: dependencies: '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + version: 11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) '@emotion/styled': specifier: 11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) '@mantine/core': specifier: 7.17.8 - version: 7.17.8(@mantine/hooks@7.17.8(react@19.1.0))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 7.17.8(@mantine/hooks@7.17.8(react@19.1.0))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@mantine/hooks': specifier: 7.17.8 version: 7.17.8(react@19.1.0) '@mui/material': specifier: 6.5.0 - version: 6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-form': specifier: ^1.33.5 version: link:../../../packages/react-form @@ -1350,28 +1350,28 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: ^0.9.7 - version: 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13) + version: 0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15) '@tanstack/react-form-devtools': specifier: ^0.2.34 version: link:../../../packages/react-form-devtools '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@vitejs/plugin-react-swc': specifier: ^3.11.0 - version: 3.11.0(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0)) + version: 3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/solid/array: dependencies: @@ -1380,23 +1380,23 @@ importers: version: link:../../../packages/solid-form solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 devDependencies: typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/devtools: dependencies: '@tanstack/solid-devtools': specifier: ^0.7.7 - version: 0.7.33(csstype@3.2.3)(solid-js@1.9.13) + version: 0.7.33(solid-js@1.9.15) '@tanstack/solid-form': specifier: ^1.33.5 version: link:../../../packages/solid-form @@ -1405,17 +1405,17 @@ importers: version: link:../../../packages/solid-form-devtools solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 devDependencies: typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/large-form: dependencies: @@ -1424,17 +1424,17 @@ importers: version: link:../../../packages/solid-form solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 devDependencies: typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/multi-step-wizard: dependencies: @@ -1443,7 +1443,7 @@ importers: version: link:../../../packages/solid-form solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 zod: specifier: ^3.25.76 version: 3.25.76 @@ -1453,10 +1453,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/simple: dependencies: @@ -1465,17 +1465,17 @@ importers: version: link:../../../packages/solid-form solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 devDependencies: typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/standard-schema: dependencies: @@ -1484,10 +1484,10 @@ importers: version: link:../../../packages/solid-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 react: specifier: 19.1.0 version: 19.1.0 @@ -1496,10 +1496,10 @@ importers: version: 19.1.0(react@19.1.0) solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1509,10 +1509,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/svelte/array: dependencies: @@ -1522,19 +1522,19 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/large-form: dependencies: @@ -1544,19 +1544,19 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/multi-step-wizard: dependencies: @@ -1569,19 +1569,19 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/simple: dependencies: @@ -1591,19 +1591,19 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/standard-schema: dependencies: @@ -1612,32 +1612,32 @@ importers: version: link:../../../packages/svelte-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/vue/array: dependencies: @@ -1646,17 +1646,17 @@ importers: version: link:../../../packages/vue-form vue: specifier: ^3.5.13 - version: 3.5.34(typescript@5.9.3) + version: 3.5.43(typescript@5.9.3) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3)) + version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vue-tsc: specifier: ^2.2.2 version: 2.2.12(typescript@5.9.3) @@ -1668,20 +1668,20 @@ importers: version: link:../../../packages/vue-form vue: specifier: ^3.5.13 - version: 3.5.34(typescript@5.9.3) + version: 3.5.43(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3)) + version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vue-tsc: specifier: ^2.2.2 version: 2.2.12(typescript@5.9.3) @@ -1693,17 +1693,17 @@ importers: version: link:../../../packages/vue-form vue: specifier: ^3.5.13 - version: 3.5.34(typescript@5.9.3) + version: 3.5.43(typescript@5.9.3) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3)) + version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vue-tsc: specifier: ^2.2.2 version: 2.2.12(typescript@5.9.3) @@ -1715,10 +1715,10 @@ importers: version: link:../../../packages/vue-form arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 effect: specifier: ^3.17.14 - version: 3.21.2 + version: 3.22.2 react: specifier: 19.1.0 version: 19.1.0 @@ -1727,23 +1727,23 @@ importers: version: 19.1.0(react@19.1.0) valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) vue: specifier: ^3.5.13 - version: 3.5.34(typescript@5.9.3) + version: 3.5.43(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3)) + version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vue-tsc: specifier: ^2.2.2 version: 2.2.12(typescript@5.9.3) @@ -1752,7 +1752,7 @@ importers: dependencies: '@tanstack/angular-store': specifier: ^0.9.1 - version: 0.9.3(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 0.9.3(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@tanstack/form-core': specifier: workspace:* version: link:../form-core @@ -1762,40 +1762,40 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^2.6.2 - version: 2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@analogjs/vitest-angular': specifier: ^2.6.2 - version: 2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1) + version: 2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1) '@angular/common': specifier: ^21.2.14 - version: 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': specifier: ^21.2.14 - version: 21.2.14 + version: 21.2.23 '@angular/compiler-cli': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + version: 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) '@angular/core': specifier: ^21.2.14 - version: 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + version: 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/platform-browser': specifier: ^21.2.14 - version: 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/platform-browser-dynamic': specifier: ^21.2.14 - version: 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))) + version: 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))) '@testing-library/angular': specifier: ^19.3.0 - version: 19.3.0(3552bf3db4cf28d0cedfe8eb15d0ed21) + version: 19.5.0(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/router@21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@testing-library/dom@10.4.2) ng-packagr: specifier: ^21.2.3 - version: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + version: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) zone.js: specifier: 0.15.1 version: 0.15.1 @@ -1804,20 +1804,20 @@ importers: dependencies: '@tanstack/devtools-event-client': specifier: ^0.4.1 - version: 0.4.3 + version: 0.4.4 '@tanstack/pacer-lite': specifier: ^0.1.1 version: 0.1.1 '@tanstack/store': specifier: ^0.11.0 - version: 0.11.0 + version: 0.11.1 devDependencies: arktype: specifier: ^2.1.22 - version: 2.2.0 + version: 2.2.3 valibot: specifier: ^1.1.0 - version: 1.4.1(typescript@5.9.3) + version: 1.5.0(typescript@5.9.3) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1826,10 +1826,10 @@ importers: dependencies: '@tanstack/devtools-ui': specifier: ^0.5.1 - version: 0.5.2(csstype@3.2.3)(solid-js@1.9.13) + version: 0.5.3(csstype@3.2.3)(solid-js@1.9.15) '@tanstack/devtools-utils': specifier: ^0.4.0 - version: 0.4.0(@types/react@19.2.17)(preact@10.29.2)(react@19.1.0)(solid-js@1.9.13)(vue@3.5.34(typescript@5.9.3)) + version: 0.4.0(@types/react@19.2.18)(preact@10.29.8)(react@19.1.0)(solid-js@1.9.15)(vue@3.5.43(typescript@5.9.3)) '@tanstack/form-core': specifier: workspace:* version: link:../form-core @@ -1838,26 +1838,26 @@ importers: version: 2.1.1 dayjs: specifier: ^1.11.18 - version: 1.11.20 + version: 1.11.23 goober: specifier: ^2.1.16 version: 2.1.19(csstype@3.2.3) devDependencies: rolldown-plugin-solid: specifier: ^0.2.1 - version: 0.2.1(rolldown@1.0.0-rc.17)(solid-js@1.9.13)(supports-color@8.1.1) + version: 0.2.1(rolldown@1.0.0-rc.17)(solid-js@1.9.15)(supports-color@8.1.1) solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 tsdown: specifier: ^0.21.1 - version: 0.21.10(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(publint@0.3.21)(typescript@5.9.3) + version: 0.21.10(oxc-resolver@11.24.2)(publint@0.3.24)(typescript@5.9.3) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/lit-form: dependencies: @@ -1879,23 +1879,20 @@ importers: version: link:../form-core '@tanstack/octane-store': specifier: ^0.12.2 - version: 0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + version: 0.12.2(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))) devDependencies: '@octanejs/testing-library': specifier: ^0.1.51 - version: 0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))) + version: 0.1.52(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))) '@testing-library/jest-dom': specifier: ^6.8.0 - version: 6.9.1 - '@testing-library/user-event': - specifier: ^14.6.1 - version: 14.6.7(@testing-library/dom@10.4.1) + version: 6.10.0(@testing-library/dom@10.4.2) '@tsrx/eslint-plugin': specifier: ^0.4.6 - version: 0.4.6(@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) + version: 0.4.7(@tsrx/eslint-parser@0.4.7(@typescript-eslint/types@8.70.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) '@tsrx/typescript-plugin': specifier: 0.4.6 - version: 0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3) + version: 0.4.6(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(typescript@5.9.3) '@volar/language-core': specifier: 2.4.28 version: 2.4.28 @@ -1910,13 +1907,13 @@ importers: version: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) octane: specifier: ^0.2.16 - version: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) ts-patch: specifier: 3.3.0 version: 3.3.0 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + version: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) packages/preact-form: dependencies: @@ -1925,20 +1922,20 @@ importers: version: link:../form-core '@tanstack/preact-store': specifier: ^0.13.1 - version: 0.13.1(preact@10.29.2) + version: 0.13.2(preact@10.29.8) devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.5(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.2)(rollup@4.60.4)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@testing-library/preact': specifier: ^3.2.4 - version: 3.2.4(preact@10.29.2) + version: 3.2.4(preact@10.29.8) preact: specifier: ^10.26.4 - version: 10.29.2 + version: 10.29.8 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form: dependencies: @@ -1947,20 +1944,20 @@ importers: version: link:../form-core '@tanstack/react-store': specifier: ^0.11.0 - version: 0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 @@ -1969,32 +1966,32 @@ importers: version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-devtools: dependencies: '@tanstack/devtools-utils': specifier: ^0.4.0 - version: 0.4.0(@types/react@19.2.17)(preact@10.29.2)(react@19.1.0)(solid-js@1.9.13)(vue@3.5.34(typescript@5.9.3)) + version: 0.4.0(@types/react@19.2.18)(preact@10.29.8)(react@19.1.0)(solid-js@1.9.15)(vue@3.5.43(typescript@5.9.3)) '@tanstack/form-devtools': specifier: workspace:* version: link:../form-devtools devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-nextjs: dependencies: @@ -2007,19 +2004,19 @@ importers: devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-remix: dependencies: @@ -2032,19 +2029,19 @@ importers: devDependencies: '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-start: dependencies: @@ -2056,23 +2053,23 @@ importers: version: 0.9.0 devalue: specifier: ^5.3.2 - version: 5.8.1 + version: 5.9.4 devDependencies: '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@types/react': specifier: ~19.2.0 - version: 19.2.17 + version: 19.2.18 '@types/react-dom': specifier: ^19.0.3 - version: 19.2.3(@types/react@19.2.17) + version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 @@ -2081,7 +2078,7 @@ importers: version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/solid-form: dependencies: @@ -2090,33 +2087,33 @@ importers: version: link:../form-core '@tanstack/solid-store': specifier: ^0.11.0 - version: 0.11.0(solid-js@1.9.13) + version: 0.11.1(solid-js@1.9.15) devDependencies: solid-js: specifier: ^1.9.9 - version: 1.9.13 + version: 1.9.15 vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/solid-form-devtools: dependencies: '@tanstack/devtools-utils': specifier: ^0.4.0 - version: 0.4.0(@types/react@19.2.17)(preact@10.29.2)(react@19.1.0)(solid-js@1.9.13)(vue@3.5.34(typescript@5.9.3)) + version: 0.4.0(@types/react@19.2.18)(preact@10.29.8)(react@19.1.0)(solid-js@1.9.15)(vue@3.5.43(typescript@5.9.3)) '@tanstack/form-devtools': specifier: workspace:* version: link:../form-devtools solid-js: specifier: '>=1.9.7' - version: 1.9.13 + version: 1.9.15 devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/svelte-form: dependencies: @@ -2125,23 +2122,23 @@ importers: version: link:../form-core '@tanstack/svelte-store': specifier: ^0.12.0 - version: 0.12.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) + version: 0.12.1(svelte@5.57.1(@typescript-eslint/types@8.70.0)) devDependencies: '@sveltejs/package': specifier: ^2.5.3 - version: 2.5.7(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3) + version: 2.5.8(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@testing-library/svelte': specifier: ^5.2.8 - version: 5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0)) + version: 5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1)) svelte: specifier: ^5.39.4 - version: 5.55.9(@typescript-eslint/types@8.59.4) + version: 5.57.1(@typescript-eslint/types@8.70.0) svelte-check: specifier: ^4.3.1 - version: 4.4.8(picomatch@4.0.4)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3) + version: 4.7.6(picomatch@4.0.7)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3) packages/vue-form: dependencies: @@ -2150,24 +2147,24 @@ importers: version: link:../form-core '@tanstack/vue-store': specifier: ^0.11.0 - version: 0.11.0(vue@3.5.34(typescript@5.9.3)) + version: 0.11.1(vue@3.5.43(typescript@5.9.3)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3)) + version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) vite: specifier: ^7.2.2 - version: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vue: specifier: ^3.5.13 - version: 3.5.34(typescript@5.9.3) + version: 3.5.43(typescript@5.9.3) packages: - '@0no-co/graphql.web@1.2.0': - resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + '@0no-co/graphql.web@1.3.4': + resolution: {integrity: sha512-imSwulOeDQodRy/olQmVEo2PiY6ntjkZ9eiGdw6lMYylh/tay9b7MusyJBmEnkL8GiKRKr6ltr+D42mY5bd8Bg==} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 peerDependenciesMeta: graphql: optional: true @@ -2238,8 +2235,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@analogjs/vite-plugin-angular@2.6.2': - resolution: {integrity: sha512-XbrdII0OpQcOfiyJ8N+FSlhF+Y+oEpLFkN35aJBh2QhhOrtHWX4XcqulcZwLJRU67eawfh/Bu6jJ3sSGLVEc4Q==} + '@analogjs/vite-plugin-angular@2.7.2': + resolution: {integrity: sha512-AmJCuz6D20XGnFPL/UWW+ZzeMDEHKb6+hefbV9HEbXlMoUZWqr2u8uxQqaUQgnDV3yl8HMazFnxWfTPrKLPPzA==} peerDependencies: '@angular-devkit/build-angular': ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 '@angular/build': ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 @@ -2252,8 +2249,8 @@ packages: vite: optional: true - '@analogjs/vitest-angular@2.6.2': - resolution: {integrity: sha512-aLyvyqv2bpgNXDhWwR5M974RVuF2TFfFfFIn2OuwRO7hf+w60v/GaJxvbFob8f7VJgztvoVGgDhWpu2Qon/dmg==} + '@analogjs/vitest-angular@2.7.2': + resolution: {integrity: sha512-S4wb0EXrm6Yi2YBsN707cH9Sr8rrXyAw0HFvEmaZwZpk1yi9n5r5vHl1VWXXoVdT5ikWcmcdZgjPgcpYOhiy7A==} peerDependencies: '@analogjs/vite-plugin-angular': '*' '@angular-devkit/architect': '>=0.1700.0 < 0.2300.0 || >=0.2200.0 < 0.2300.0' @@ -2264,13 +2261,13 @@ packages: zone.js: optional: true - '@angular-devkit/architect@0.2102.12': - resolution: {integrity: sha512-w9FSMHYeeHkk0kRSAOCvNqEVyOHqpC1SUf3iN7tDnXBOA0dtc6JYvJU7O4joiwf7wMPZDK8LKc/6eu8/Tx87Fw==} + '@angular-devkit/architect@0.2102.24': + resolution: {integrity: sha512-U/d5l/1rfrNSlbGjMTunyzwxh+2vJce3y0r0tIx/NOFZbnYhq+gx+e33mR6oxI4yk/1Jks67ltvstrJuBbVbYg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/build-angular@21.2.12': - resolution: {integrity: sha512-gM1eE1Y9zd7kv/BQ0Hx237W13jp6pOajzXvm5q1TabtHq/NlVoM27et20IWNpO1qOEYVO/eCY1E5X1uoI6CU9A==} + '@angular-devkit/build-angular@21.2.24': + resolution: {integrity: sha512-qJ7ZrKsa08rXkYp5eeVQtepdl+t81Tfl47USit1Uk3VmwOPYoiH/6O0AIemgX2nlqN6FfKk0nVANJZBLcje0Dg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^21.0.0 @@ -2279,7 +2276,7 @@ packages: '@angular/platform-browser': ^21.0.0 '@angular/platform-server': ^21.0.0 '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.2.12 + '@angular/ssr': ^21.2.24 '@web/test-runner': ^0.20.0 browser-sync: ^3.0.2 jest: ^30.2.0 @@ -2319,15 +2316,15 @@ packages: tailwindcss: optional: true - '@angular-devkit/build-webpack@0.2102.12': - resolution: {integrity: sha512-gYsEKFntBLDE4ovEE/SOsc6HcahKq5Qs/sRfktrNAIpbvjBpwpngQMz23jNSvGhnJ0EzykKoOuK/ErimEgupKg==} + '@angular-devkit/build-webpack@0.2102.24': + resolution: {integrity: sha512-nXW4KRUM62J4+Y8Khb2PNEwK/b2hQ/2gwcOaeAKm+V/qQ/B2w/l8PjpJP21yLdd3jRZDFTvI6ASiq+P7b9QIkQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^5.0.2 - '@angular-devkit/core@21.2.12': - resolution: {integrity: sha512-nXms0jVWwHOJK+z6vHvhw7HYFBelxh2gEnkij0OQMABXZN5hoUlTD0DDP1lYR7hQNi8Yb2Ar0UN9ihyUFVM5Kg==} + '@angular-devkit/core@21.2.24': + resolution: {integrity: sha512-QLYLd6OcfQS5qWTlzG1/d8lFTcJDFcsY6sOaGVtrruYiDxrbeM2iJttoIoKzvbNPROFyo3fANVQJOVhytpXWPg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^5.0.0 @@ -2335,19 +2332,19 @@ packages: chokidar: optional: true - '@angular-devkit/schematics@21.2.12': - resolution: {integrity: sha512-29xe6C9nwHejV9zBcu0js7NmzLWuCFzBGBTmL6eD4JN1NcxEZ/nO1JuaGINjPjzb/UDXPZIqEwHbnFNcGS5v1A==} + '@angular-devkit/schematics@21.2.24': + resolution: {integrity: sha512-mLOme2vfbLrHFmMyM6ybPuGCnCvPiemXWdHnptY2Q7Hzum72DabfgtTNsrMcI2F5zrQV2DDQunNjC5cXqtq4/w==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular/animations@21.2.14': - resolution: {integrity: sha512-9WLnsJE0xqtd1rVtHMvsAUxFy3OdPks4bdmUIqyw23X/je7ytUALAGWNadffcZBwRpa1A6TUnLr9X4+Draz3kw==} + '@angular/animations@21.2.23': + resolution: {integrity: sha512-hnDKa96XdTogqJRe91S/Pjr8Wgbgf9/7OszKW8MbMZE1Vy7qEmaA1JD86iSNp9QHZ9U/fPX7Wbpq2Zoa5dS2zg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} deprecated: '@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.' peerDependencies: - '@angular/core': 21.2.14 + '@angular/core': 21.2.23 - '@angular/build@21.2.12': - resolution: {integrity: sha512-zYfo21RuldDWXnshuPfWYtmh5ltlO9+XFHpNObdIInQTFxKD6grLNVNOblFFpi+oIIm4Km+CGSXvBHs/aH0ufA==} + '@angular/build@21.2.24': + resolution: {integrity: sha512-NurM2W7Q/lCGonkYgSNNxGrh9AYH3LksekYRVxl0KxVKa8Z5x6oMYlLfyI4Lv9Q4C1/x1SXv3xNxgYu/nIW4vA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler': ^21.0.0 @@ -2357,7 +2354,7 @@ packages: '@angular/platform-browser': ^21.0.0 '@angular/platform-server': ^21.0.0 '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.2.12 + '@angular/ssr': ^21.2.24 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^21.0.0 @@ -2392,38 +2389,38 @@ packages: vitest: optional: true - '@angular/cli@21.2.12': - resolution: {integrity: sha512-oLEL1C1fI39b1eQo5f2cyQhQfE+QMv7dm8z2MmxbP7YR7jAdQPVfGU8CXECR5g7mrYi9WgvIRKB+9Oeq2aH6Jw==} + '@angular/cli@21.2.24': + resolution: {integrity: sha512-lx8baI3gssBv+xuwEf5wvAoBi7XSIB1RRuAmSnuAO2E4CAlJmU4eiVhKxd/haXvONH6peYxFGH2N6mSrkkHfIQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@21.2.14': - resolution: {integrity: sha512-J6K7cE7uKOKmg4+sxLeGfsmaYDjP5l1XCiMMI0WPT0t68uxLk8g3MzV5Trqfb6ZnRxWcfp9c4c+XxAvMBB7ymA==} + '@angular/common@21.2.23': + resolution: {integrity: sha512-IVhHD4w/+v/S7YAIyF3v20u3zpOj7Y8EuL9xxPyfyxlfz5zPpJFJ/GaZb0Y5sMANCFLVwQj3VcQNWgYtd7W2yA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.2.14 + '@angular/core': 21.2.23 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.2.14': - resolution: {integrity: sha512-h+WQfPKFxaDfDhMqUUdOQ1TsDMccav8kLFERmKTRfD4MNOczSMpOMyeXJHCL0Rq4I8WDQvaBJGMG7DXRDefSog==} + '@angular/compiler-cli@21.2.23': + resolution: {integrity: sha512-/dtKObY5fvBuNMxLFe9jtnsMwaDV2zm+5sKP2EIWtDO0N18WlZSOFCTL6Tkz3LHE/4y+TjW46POu/rz0q/Cw6A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.2.14 + '@angular/compiler': 21.2.23 typescript: '>=5.9 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.2.14': - resolution: {integrity: sha512-8mqgwRYfn2Z1vg/5YVt60dDBattnZL45nNJd2vTMwAiDTzhWhgKgRWKOeVL0aj2JqHeHiwuIlrLnz46acJMulQ==} + '@angular/compiler@21.2.23': + resolution: {integrity: sha512-7HUdsXQKGPqKiRhwsbMGVqtMEVGT4qf5NKpLDmY4kLMeJhjRKchY/4cljEqUERvvXUid6GTWK+/tSJdIcFNnEw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@21.2.14': - resolution: {integrity: sha512-Z1Ivjh7L2lT//8LA7vQ3tj7Rg6wl2XRA5kPSAukgn8u0Yu0XxG8NE8KG0Eypb3v9CEcbwATwpgnxzbJFZ8TFcw==} + '@angular/core@21.2.23': + resolution: {integrity: sha512-O8i8ntukAhg3nM9y9A/o1eXVFnFk5/VltA2gQrDuWTpIPLyWmyZW+Zb65UBJI14tGOTt99Y3l3teIuF36mLBgQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 21.2.14 + '@angular/compiler': 21.2.23 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -2432,50 +2429,50 @@ packages: zone.js: optional: true - '@angular/forms@21.2.14': - resolution: {integrity: sha512-HQYIybyMt0CrI31rW6vXbiDsSM2DDtTcOVeT/nWDRNCoqBrREDg8rVsm2Y+fUMsiQVJNa6dCXPwvYhjzJ4r7ug==} + '@angular/forms@21.2.23': + resolution: {integrity: sha512-l0PyfoCO6MflgQwL4spawbiTqzSrlOWUn1BUcbGuBU33lbgTBrR9dogfT8sQ54ZO/6gcWkToxi0WbvugSfzQtQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.14 - '@angular/core': 21.2.14 - '@angular/platform-browser': 21.2.14 + '@angular/common': 21.2.23 + '@angular/core': 21.2.23 + '@angular/platform-browser': 21.2.23 rxjs: ^6.5.3 || ^7.4.0 - '@angular/platform-browser-dynamic@21.2.14': - resolution: {integrity: sha512-m5U4zX8JFnxTAIGpsBXIAyefSmYqdORY/OfHC0aMmZovuFCbXXIYqYRQDBB7+YVNpSDSHllCrKEZFu/CC6dq3g==} + '@angular/platform-browser-dynamic@21.2.23': + resolution: {integrity: sha512-6Hhw2nOXuAag8A+CmXuiLNY/5brcI+dzKdMKufdpoPrdF/QCICLbSqHUaL4b4bdNGCYezuFbGoBsxGAKWgBlDg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} deprecated: '@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.' peerDependencies: - '@angular/common': 21.2.14 - '@angular/compiler': 21.2.14 - '@angular/core': 21.2.14 - '@angular/platform-browser': 21.2.14 + '@angular/common': 21.2.23 + '@angular/compiler': 21.2.23 + '@angular/core': 21.2.23 + '@angular/platform-browser': 21.2.23 - '@angular/platform-browser@21.2.14': - resolution: {integrity: sha512-34tBwxh86yN2YifBDhCesm6N+nn9WcbuXjRwfo0mTme15OZ/zt56yw7v1mcK3UFLegIIALtsIgpXXrPWWQoKkA==} + '@angular/platform-browser@21.2.23': + resolution: {integrity: sha512-3/yTsYroz6xjH1sqxJwOcBdLEGU4QLouu5z1ja/JN7jrPUfRHj2YBfVS+ayWLEnMt9CfuyjZxoVPXHtWuZ3Gog==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 21.2.14 - '@angular/common': 21.2.14 - '@angular/core': 21.2.14 + '@angular/animations': 21.2.23 + '@angular/common': 21.2.23 + '@angular/core': 21.2.23 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@21.2.14': - resolution: {integrity: sha512-Yo3LdgcqkfMu2/Ycl8o/4QjCBqZhtA+a7B8JVdW5cWdrpFTxKCOrzm+YRUMuIFmH5nzSv9oGnUuz64uk1+7r5Q==} + '@angular/router@21.2.23': + resolution: {integrity: sha512-cNwTd1XvCXsFZqvn4WFPv7VUci7PJzlK9Ex/git3oEyS9318sJjX7sw2IeTpvwIg01BZtF1xBvWgMTHgcXvzIA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.14 - '@angular/core': 21.2.14 - '@angular/platform-browser': 21.2.14 + '@angular/common': 21.2.23 + '@angular/core': 21.2.23 + '@angular/platform-browser': 21.2.23 rxjs: ^6.5.3 || ^7.4.0 - '@ark/schema@0.56.0': - resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + '@ark/schema@0.56.2': + resolution: {integrity: sha512-Qx4D2JFbBWpntiHZaTv7bGG4H/M2rigiknezKg/WVyDSaLdE4YCcWAOoFB7pjjDqHbbV2OqRfntm1nnXvwMexg==} - '@ark/util@0.56.0': - resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} + '@ark/util@0.56.2': + resolution: {integrity: sha512-9kU2sUE38FZEGG7l3hamYMBieLYEJh2L1mrYD2eXpT+78EnQSV1bhjxJhnxGBMSTbtwpBSDNSK+K60WvaI/DTQ==} '@asamuzakjp/css-color@4.1.2': resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} @@ -2489,10 +2486,6 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -2501,10 +2494,6 @@ packages: resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - '@babel/core@7.29.7': resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} @@ -2513,8 +2502,8 @@ packages: resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} '@babel/generator@8.0.0-rc.3': @@ -2604,8 +2593,8 @@ packages: resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0-rc.6': - resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-identifier@7.29.7': @@ -2616,6 +2605,10 @@ packages: resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} @@ -2632,8 +2625,8 @@ packages: resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} engines: {node: '>=6.0.0'} hasBin: true @@ -2642,6 +2635,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + '@babel/parser@8.0.6': + resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} engines: {node: '>=6.9.0'} @@ -2991,8 +2989,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.7': - resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + '@babel/plugin-transform-modules-systemjs@7.29.8': + resolution: {integrity: sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3111,8 +3109,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.7': - resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + '@babel/plugin-transform-regenerator@7.29.8': + resolution: {integrity: sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3147,8 +3145,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.29.7': - resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + '@babel/plugin-transform-spread@7.29.8': + resolution: {integrity: sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3171,8 +3169,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.29.7': - resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + '@babel/plugin-transform-typescript@7.29.9': + resolution: {integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3236,18 +3234,22 @@ packages: resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@babel/types@8.0.0-rc.3': resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} + engines: {node: ^22.18.0 || >=24.11.0} + '@changesets/apply-release-plan@8.1.1': resolution: {integrity: sha512-nk2Hbq3M9NeHMdaIRBDvawKrQJzXB9sGyBUE5yWnIKtvdcNCPj75zBekJYr0gTT2ecJH3eFeTrc8eisPImcv0Q==} engines: {node: ^22.11 || ^24 || >=26} @@ -3342,19 +3344,19 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + '@csstools/color-helpers@6.1.1': + resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.1': - resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + '@csstools/css-calc@3.4.0': + resolution: {integrity: sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.1': - resolution: {integrity: sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==} + '@csstools/css-color-parser@4.2.3': + resolution: {integrity: sha512-y4LpL+lmpuyKDiEFq2PnZUVFdAjsoB/qQJod79yLNokXyW7jewi+/WJ69EfItj8A2unWtxXnGjw6LYXgXu5ZjA==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -3366,16 +3368,16 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.4': - resolution: {integrity: sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==} + '@csstools/css-syntax-patches-for-csstree@1.1.14': + resolution: {integrity: sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: css-tree: optional: true - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + '@csstools/css-tokenizer@4.0.1': + resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==} engines: {node: '>=20.19.0'} '@discoveryjs/json-ext@0.6.3': @@ -3401,6 +3403,9 @@ packages: '@emnapi/runtime@1.11.2': resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} @@ -3473,14 +3478,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -3503,14 +3502,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -3533,14 +3526,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -3563,14 +3550,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -3593,14 +3574,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -3623,14 +3598,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -3653,14 +3622,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -3683,14 +3646,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -3713,14 +3670,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -3743,14 +3694,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -3773,14 +3718,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -3803,14 +3742,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -3833,14 +3766,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -3863,14 +3790,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -3893,14 +3814,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -3923,14 +3838,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -3953,14 +3862,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -3971,14 +3874,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -4001,14 +3898,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -4019,14 +3910,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -4049,14 +3934,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -4067,14 +3946,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -4097,14 +3970,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -4127,14 +3994,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -4157,14 +4018,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -4187,14 +4042,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -4205,8 +4054,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -4261,16 +4110,16 @@ packages: resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.36.0': resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -4290,8 +4139,8 @@ packages: '@noble/hashes': optional: true - '@expo/cli@54.0.24': - resolution: {integrity: sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==} + '@expo/cli@54.0.27': + resolution: {integrity: sha512-BxKOr6e8wmUwhGSyEVKY+CHWgS3Cre9ibgx1QWcdCenKTVKAz62qGmYL51q0lCcKg6vQY+4Usw9RK5Il4ZFaIA==} hasBin: true peerDependencies: expo: '*' @@ -4306,14 +4155,14 @@ packages: '@expo/code-signing-certificates@0.0.6': resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} - '@expo/config-plugins@54.0.4': - resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==} + '@expo/config-plugins@54.0.5': + resolution: {integrity: sha512-aWQ3sViNRoQWw6So4A2qhWCt24CuGBK6MrRHI1AG+V6/NQAjIZCHaSvcXK2gXKpmisRhTSUWaKPIgLJQFB+AeQ==} '@expo/config-types@54.0.10': resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} - '@expo/config@12.0.13': - resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} + '@expo/config@12.0.14': + resolution: {integrity: sha512-3dfbBd9LnPDgyylhCgkOsaG8Adg52uOVOTQYH5lf23a/t8M5eQpXKCvzUarrf62B78057n2NnkiofK9TfPgvzw==} '@expo/devcert@1.2.1': resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} @@ -4329,24 +4178,27 @@ packages: react-native: optional: true - '@expo/env@2.0.11': - resolution: {integrity: sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==} + '@expo/env@2.0.12': + resolution: {integrity: sha512-wVfzeBGlUohZG5kS8QCqXurpuWZFJEkBB1wXCifai3EZ/Llcg/VMTiUCpAgHImD3lI7GIU3V1uI64c04XIo98Q==} '@expo/fingerprint@0.15.5': resolution: {integrity: sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==} hasBin: true - '@expo/image-utils@0.8.14': - resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==} + '@expo/image-utils@0.8.17': + resolution: {integrity: sha512-1eVrX6FFkPNl9DJNiw3Gjsf6PtG7HttbapEVvcROVrA9PCMikujOJWWHDYKGptmKoVIIVajFZE8UHGHUb3mPug==} - '@expo/json-file@10.0.15': - resolution: {integrity: sha512-xLtsy1820Rf2myhhIc7WmfoUg5cWEJB9tEylhgGhRF/acYGuUXUVkKHYoHY31GbYf6CIZNvipTFxuvWRpVlXTw==} + '@expo/json-file@10.0.16': + resolution: {integrity: sha512-fcVkWEj+hLuP2yt5W0aw6LmDRqSPWDLUSxOMcmFeV+algmIF59sQVKCwB9btjQLd4V6x9N0pISkQEkBubUHrCw==} '@expo/json-file@10.2.0': resolution: {integrity: sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ==} - '@expo/metro-config@54.0.15': - resolution: {integrity: sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==} + '@expo/json-file@11.0.1': + resolution: {integrity: sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==} + + '@expo/metro-config@54.0.17': + resolution: {integrity: sha512-PQFgQCZGY0DffZUvBzJttDPreZfHrQakaBlKjnvOUMNXbDna+TYmg1IFZuIDUYJezLcdp+TvVFTLjNi1+mqaVw==} peerDependencies: expo: '*' peerDependenciesMeta: @@ -4367,31 +4219,31 @@ packages: '@expo/metro@54.2.0': resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==} - '@expo/osascript@2.6.0': - resolution: {integrity: sha512-QvqDBlJXa8CS2vRORJ4wEflY1m0vVI07uSJdIRgBrLxRPBcsrXxrtU7+wXRXMqfq9zLwNP9XbvRsXF2omoDylg==} + '@expo/osascript@2.7.1': + resolution: {integrity: sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==} engines: {node: '>=12'} - '@expo/package-manager@1.12.0': - resolution: {integrity: sha512-SWr6093nwBjn94cvElsYZNUnhvs+XtUatUz3h0vAn0IbaWG0B6l/V5ZfOBptX/xq6rMpFG5ibIf/eckLSXw8Gg==} + '@expo/package-manager@1.13.1': + resolution: {integrity: sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==} - '@expo/plist@0.4.8': - resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} + '@expo/plist@0.4.9': + resolution: {integrity: sha512-MPVpmKGfnQEnrCzgxuXcmPP/y/t6AVm+DcSb2Myp21LKWv1N3l8uFxMggesfF4ixAxkRlGmMMx9GyDC9M+XklQ==} - '@expo/prebuild-config@54.0.8': - resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==} + '@expo/prebuild-config@54.0.9': + resolution: {integrity: sha512-3/Rmyzt8vduPjnSVHbnc0wYFrlhwLWn2g596rDyKcLGeqN2WTLJbzVeznsrUwyzhBNXgnTomZWO5HDzbZ/4E7g==} peerDependencies: expo: '*' - '@expo/require-utils@55.0.5': - resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==} + '@expo/require-utils@55.0.8': + resolution: {integrity: sha512-DDS5R67iz2SJwncbpcUMHtnsq31dSfllhaEncKxGlK0/ewgc2CaXUCkDA2AumfT7ubnSXiPkU9Gn8v2xCrvj+A==} peerDependencies: typescript: ^5.0.0 || ^5.0.0-0 peerDependenciesMeta: typescript: optional: true - '@expo/schema-utils@0.1.8': - resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==} + '@expo/schema-utils@0.1.9': + resolution: {integrity: sha512-t9bYwG4Z0yCVzHYJoDMci1OFq2FkBkhStlfUGSkspKYTwB/84+x6sY+CXCgdhkQNQtvWaugW5KUs9YZfAXq9Sg==} '@expo/sdk-runtime-versions@1.0.0': resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} @@ -4413,18 +4265,18 @@ packages: '@expo/ws-tunnel@1.0.6': resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} - '@expo/xcpretty@4.4.4': - resolution: {integrity: sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==} + '@expo/xcpretty@4.4.5': + resolution: {integrity: sha512-J3eL4n4h5QTwfD0SIz8OIk6/+sOL/hFZAMacgCM07UNlxBQfJipEpIC2AQxvGkbYeStByJ0TVhQAJo+DeNgaSQ==} hasBin: true - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -4435,8 +4287,8 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} '@gar/promise-retry@1.0.3': resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} @@ -4448,9 +4300,9 @@ packages: '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} + '@hono/node-server@2.1.1': + resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} + engines: {node: '>=20'} peerDependencies: hono: ^4 @@ -4822,9 +4674,6 @@ packages: '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.6.0': resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} @@ -4870,50 +4719,50 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/fs-core@4.57.2': - resolution: {integrity: sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==} + '@jsonjoy.com/fs-core@4.78.1': + resolution: {integrity: sha512-UUGcxEah6eb6PyrF8RDEuVgR0Cs2K6XTiLH7YxNR3DknL3wZCNx1nU5m2Gq5Wq8ipy4uHDay3xt/50KyoTN6Zg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-fsa@4.57.2': - resolution: {integrity: sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==} + '@jsonjoy.com/fs-fsa@4.78.1': + resolution: {integrity: sha512-PaoXI4HAELQ/DYxCtqHne7ijrTE0BIEFYXI/qTy4f6pThXiYT5QyJkk96bzpcjdo2D+OM0pUv7mkwffSAl/GSQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-builtins@4.57.2': - resolution: {integrity: sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==} + '@jsonjoy.com/fs-node-builtins@4.78.1': + resolution: {integrity: sha512-yaGM1l77yYANFl+w2gdixRZhcQhKodtbI4FZgJg2ApfTTSJcxdYEekU+Ta92sCqSwrOtY+ru4IP81tgJxWXIyA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-to-fsa@4.57.2': - resolution: {integrity: sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==} + '@jsonjoy.com/fs-node-to-fsa@4.78.1': + resolution: {integrity: sha512-/Z00TkjLD8zPRimbINaiAQRqpE9HZmiGfxQFMqNcHncmhijS3JsAW21gcNO/16jujoDwXOyEaSSeK+pBtv8QHQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-utils@4.57.2': - resolution: {integrity: sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==} + '@jsonjoy.com/fs-node-utils@4.78.1': + resolution: {integrity: sha512-wm0PVK6XpjHH6GLGVi60+ubD7pNv91KwQ8SBWwn+orRTYdfEIci59/VlOddIGhUSde0t9W9gLNetlPKQHQJsSQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node@4.57.2': - resolution: {integrity: sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==} + '@jsonjoy.com/fs-node@4.78.1': + resolution: {integrity: sha512-3z6o4qVdKUZTHNXiV+3bKAUkQSD5a2kFwwwag8fe6VvgZ4WNfDbMzWdGvoGx+oRpOcr1iWA9WYwVeVMjSir4mA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-print@4.57.2': - resolution: {integrity: sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==} + '@jsonjoy.com/fs-print@4.78.1': + resolution: {integrity: sha512-NUwSD+BOz0TUpBc+riQpI1G1vOhViSZePeqUPxKznelsk3Iwotu6T/02UAY9WdaGcLdlDX8pllEIyxehnYo9Ng==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-snapshot@4.57.2': - resolution: {integrity: sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==} + '@jsonjoy.com/fs-snapshot@4.78.1': + resolution: {integrity: sha512-gejpLh45sgYGEHWZP/LP2etxaUOYawDfbFVckl9xDDEvgSAtZf700MzCAGbPBPBzRL+qW5UDDwacIgYXHY3C9Q==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -4970,6 +4819,9 @@ packages: '@lit-labs/ssr-dom-shim@1.6.0': resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} + '@lit/context@1.1.6': + resolution: {integrity: sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==} + '@lit/reactive-element@2.1.2': resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} @@ -5032,8 +4884,8 @@ packages: resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} engines: {node: '>=20.0.0'} - '@material/web@2.4.1': - resolution: {integrity: sha512-0sk9t25acJ72Qv3r0n9r0lgDbPaAKnpm0p+QmEAAwYyZomHxuVbgrrAdtNXaRm7jFyGh+WsTr8bhtvCnpPRFjw==} + '@material/web@2.5.0': + resolution: {integrity: sha512-x2Uovyq8E/Zc1xHXd9s1eBMXF5pMHVAt70pISKd0fL3Ajj4L6zQaQUY/awcfR2RDAMKXC7i4+vr0arv1YaOR/g==} '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -5051,8 +4903,8 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@modelcontextprotocol/sdk@1.26.0': - resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -5171,6 +5023,13 @@ packages: '@types/react': optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} @@ -5287,12 +5146,6 @@ packages: '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - '@napi-rs/wasm-runtime@1.2.4': resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -5355,17 +5208,17 @@ packages: cpu: [x64] os: [win32] - '@ngtools/webpack@21.2.12': - resolution: {integrity: sha512-e9jfTfc1mG9c2S6jog8/ZKx2/fkOKRHRDHxdPLMBTtJwKxPenQH1eZoTaiEDB0RLNbWbFClFDaCMBC1gJ/cs3Q==} + '@ngtools/webpack@21.2.24': + resolution: {integrity: sha512-9l6pXbXUGQscJgSL1rc960tmw2c0QkNABhWyDysaKTAX3Lu/7cjEckIxZNlGsdoK/TwetC23R2CRZdbMqvGszw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^21.0.0 typescript: '>=5.9 <6.0' webpack: ^5.54.0 - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} '@noble/hashes@2.4.0': resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} @@ -5387,8 +5240,8 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@npmcli/agent@4.0.0': - resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + '@npmcli/agent@4.0.2': + resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==} engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/fs@3.1.1': @@ -5494,14 +5347,14 @@ packages: cpu: [x64] os: [win32] - '@octanejs/testing-library@0.1.51': - resolution: {integrity: sha512-LjPRd8l/mKbO+pYcVHGeiOUQr3InaTfW+Rs9FBBTVmFCd16TfjyP/Cw/mct9bgn9sdHlEsLTRYPJS3UxcKh03g==} + '@octanejs/testing-library@0.1.52': + resolution: {integrity: sha512-qk69ERnj/ROCqCdIc9S+zZkxF2037lf96jXWP54uILOMonkfpRyOtZAFyTIxkzj7snDSJQcKB3UdHIC6maWAIQ==} engines: {node: '>=22.22.2'} peerDependencies: - octane: ^0.2.5 + octane: ^0.2.5 || ^0.3.0 - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@one-ini/wasm@0.2.1': + resolution: {integrity: sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg==} '@oozcitak/dom@2.0.2': resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} @@ -5783,212 +5636,104 @@ packages: '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': - resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} - cpu: [arm] - os: [android] - '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.19.1': - resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} - cpu: [arm64] - os: [android] - '@oxc-resolver/binding-android-arm64@11.24.2': resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.19.1': - resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} - cpu: [arm64] - os: [darwin] - '@oxc-resolver/binding-darwin-arm64@11.24.2': resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.19.1': - resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} - cpu: [x64] - os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.24.2': resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.19.1': - resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} - cpu: [x64] - os: [freebsd] - '@oxc-resolver/binding-freebsd-x64@11.24.2': resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': - resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} - cpu: [arm] - os: [linux] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': - resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} - cpu: [arm] - os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': - resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': - resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-resolver/binding-linux-arm64-musl@11.24.2': resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': - resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': - resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': - resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': - resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': - resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.24.2': resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-musl@11.19.1': - resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-resolver/binding-linux-x64-musl@11.24.2': resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} cpu: [x64] os: [linux] libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.19.1': - resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} - cpu: [arm64] - os: [openharmony] - '@oxc-resolver/binding-openharmony-arm64@11.24.2': resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.19.1': - resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@oxc-resolver/binding-wasm32-wasi@11.24.2': resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': - resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} - cpu: [arm64] - os: [win32] - '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': - resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} - cpu: [x64] - os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.24.2': resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} cpu: [x64] @@ -6268,126 +6013,127 @@ packages: cpu: [x64] os: [win32] - '@package-json/types@0.0.12': - resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} - - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-cms@2.7.0': - resolution: {integrity: sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==} + '@peculiar/asn1-cms@2.9.5': + resolution: {integrity: sha512-4Ivz0fsyFofe0bslNsYcGN9+iETdHX4v+BFwIPr+K/BAt61sHXECP63ff9FntU9zcfVQELJFdUG9so44OjUlBQ==} + engines: {node: '>=14'} - '@peculiar/asn1-csr@2.7.0': - resolution: {integrity: sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==} + '@peculiar/asn1-csr@2.9.5': + resolution: {integrity: sha512-9dO6PcoJeI+1xJ4rG7eINMa6f9Ix/QdRs5UGZ0D7v/R3TzmsbVr5cqAgfYw4xgS9U54ouHYqEz0bIZBbM/UY1g==} + engines: {node: '>=14'} - '@peculiar/asn1-ecc@2.7.0': - resolution: {integrity: sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==} + '@peculiar/asn1-ecc@2.9.5': + resolution: {integrity: sha512-OD+HLlcV7wCL64w0rheX/C0J31DbJce0nf8ulv3UNftQ617JEZE3sQ4cMN6PotXWlJ1M5GQx90G3bywtdKOstw==} + engines: {node: '>=14'} - '@peculiar/asn1-pfx@2.7.0': - resolution: {integrity: sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==} + '@peculiar/asn1-pfx@2.9.5': + resolution: {integrity: sha512-btcH7lbcD4410qnjHvv7F0kEuMNKbX8CFAZSs9CDPWHKzT1byLPHYeR40AnUw9z4CzsijMY0daBFYUvVx75sdA==} + engines: {node: '>=14'} - '@peculiar/asn1-pkcs8@2.7.0': - resolution: {integrity: sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==} + '@peculiar/asn1-pkcs8@2.9.5': + resolution: {integrity: sha512-c7UghAGQdBfAHL9JdwcJkAc/lDJKNXfCdYXPXlf8BZdD/fVJjJnXKHxX4gyLhkFTvnGhME7caieSgc2ROtqYTQ==} + engines: {node: '>=14'} - '@peculiar/asn1-pkcs9@2.7.0': - resolution: {integrity: sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==} + '@peculiar/asn1-pkcs9@2.9.5': + resolution: {integrity: sha512-4R/zMgLSHbQIZRBwP1KzX6iuNHmW3xFWwu9TS9A00N60fmQqp9DkkqnQFyd0mAYMQTrQefuzQ/yP4U8sOLGUgQ==} + engines: {node: '>=14'} - '@peculiar/asn1-rsa@2.7.0': - resolution: {integrity: sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==} + '@peculiar/asn1-rsa@2.9.5': + resolution: {integrity: sha512-kHwBLVMkm9ljlM521ovS7y4z4mr8xuHTdNyyoPlDvckBwFKSgs9HqKBryLBeqHqL2YpIgl+Vspl7kzNGG2phzA==} + engines: {node: '>=14'} - '@peculiar/asn1-schema@2.7.0': - resolution: {integrity: sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==} + '@peculiar/asn1-schema@2.9.5': + resolution: {integrity: sha512-Ez3wLKVjaxdsLcgeWN4OE31QkM7oBOgKuuBJxldRYAkfYw2C+8zJPcSd/SThnbhszsEOlAmoaS5kIIkN29fGKQ==} + engines: {node: '>=14'} - '@peculiar/asn1-x509-attr@2.7.0': - resolution: {integrity: sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==} + '@peculiar/asn1-x509-attr@2.9.5': + resolution: {integrity: sha512-PlbL1a74RZiry7puPCZ5hdk/puvivxYJPbjadr2i7DBjHCJFEKCfTRPKL3DILeZFtzJjn95J5EBtSc4/TB9/6Q==} + engines: {node: '>=14'} - '@peculiar/asn1-x509@2.7.0': - resolution: {integrity: sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==} + '@peculiar/asn1-x509@2.9.5': + resolution: {integrity: sha512-NP3ecvN6zTDlwCvogIWL7MJN9AZNuskkIbnlhrlkB97Mn2EqirBUQ8GKzsOmdAL3pRvjGu1Uk/a4DNfiZrWxhw==} + engines: {node: '>=14'} '@peculiar/utils@2.0.3': resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} @@ -6407,17 +6153,19 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@preact/preset-vite@2.10.5': - resolution: {integrity: sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==} + '@preact/preset-vite@2.10.6': + resolution: {integrity: sha512-ZZ5RIT2ZVXg8UxRA8VZpoT8CdpDG7RFIqOT4bELqNBp85+HKvQBbgmh3gsoW1UOQXx26TLe+ZRNKI7q281Kckw==} peerDependencies: '@babel/core': 7.x vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x - '@prefresh/babel-plugin@0.5.3': - resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==} + '@prefresh/babel-plugin@0.5.4': + resolution: {integrity: sha512-GSwqHGVem7AjnOKAkmLNbAExqZZFddf9S3ySOwowGEsJR8vwNKJ7Z/262fov5wra8LkDVSmFw3CjMGRdLoCmRA==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0 - '@prefresh/core@1.5.10': - resolution: {integrity: sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==} + '@prefresh/core@1.5.11': + resolution: {integrity: sha512-Ml00PP8jeHaADxfQqxUs4+M5JS+T5J26UnvPVfsrmlpGw2I3e9XtM0DMeuzkmvg+Tn7VdHSMpLBrDPG0iHoDqQ==} peerDependencies: preact: ^10.0.0 || ^11.0.0-0 @@ -6430,18 +6178,18 @@ packages: preact: ^10.4.0 || ^11.0.0-0 vite: '>=2.0.0' - '@publint/pack@0.1.4': - resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} + '@publint/pack@0.1.7': + resolution: {integrity: sha512-4EDEmvxWtgsCnnVeBvtFIFZtUhPPt1+bA9JrSwU4Sa//6oKtzCSlGGXYJr44OD9aGISymbieJ4mCKHUygUDU+g==} engines: {node: '>=18'} - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@quansync/fs@1.1.0': + resolution: {integrity: sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==} - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6462,8 +6210,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6471,8 +6228,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + '@radix-ui/react-dialog@1.1.23': + resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6484,8 +6241,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6493,8 +6250,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6506,8 +6263,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6515,8 +6272,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6528,8 +6285,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6537,8 +6294,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6550,8 +6307,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6563,8 +6320,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6576,8 +6333,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6598,8 +6355,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6607,8 +6364,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + '@radix-ui/react-tabs@1.1.21': + resolution: {integrity: sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6620,8 +6377,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6629,8 +6386,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6638,8 +6395,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6647,8 +6404,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6656,8 +6413,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -6730,25 +6487,25 @@ packages: '@types/react': optional: true - '@react-navigation/bottom-tabs@7.16.1': - resolution: {integrity: sha512-wjFATJmbq0K8B96Ax0JcK2+Eu7syfYvQ5qUd/tgcv8JuCYLwKKqojJMAl31qdjpKqFG09pQ6TSdEDHOek60CAA==} + '@react-navigation/bottom-tabs@7.19.2': + resolution: {integrity: sha512-sXUS7cySIj2cLwD1trdTnbqAm3TWYiF6L9i0VNES2+4ssUyBDgkIdmm7uxjhJ8ZSjzpWj8uSfLHkkSx0j0MpmA==} peerDependencies: - '@react-navigation/native': ^7.2.4 + '@react-navigation/native': ^7.4.1 react: '>= 18.2.0' react-native: '*' react-native-safe-area-context: '>= 4.0.0' react-native-screens: '>= 4.0.0' - '@react-navigation/core@7.17.4': - resolution: {integrity: sha512-Rv9E2oNNQEkPGpmu9q+vJwGJRSQR6LBg5L+Yo1QHjtwGbHUbjkIKOdYymDZoZYgNzX2OD4rAIlfuzbDKa3cCeA==} + '@react-navigation/core@7.22.1': + resolution: {integrity: sha512-6JAaYM4u6RPtVMUjN5ovX5DNBdBZtDqebk7kEwlncUP6fP4P94+qEYv1bRmtxSFs7UxiZwQQs+jzTsBaW2WeyA==} peerDependencies: react: '>= 18.2.0' - '@react-navigation/elements@2.9.18': - resolution: {integrity: sha512-mKEvDr6CkCVYZSb8W9WubNseihL+1c8M7ktZJCTCbMk8rQgdQfkdRNwpSUQKspdGpUHCb9cyzvaiuzl1NtjVgw==} + '@react-navigation/elements@2.9.43': + resolution: {integrity: sha512-XOYpRfgT9RPV2VIoXeEfTVdmXwEPpHwkezDkZVsVNEN6rTWDo07BPyLmWsvXooczyMf3jHe9AB2p/U9lJArtiQ==} peerDependencies: '@react-native-masked-view/masked-view': '>= 0.2.0' - '@react-navigation/native': ^7.2.4 + '@react-navigation/native': ^7.4.1 react: '>= 18.2.0' react-native: '*' react-native-safe-area-context: '>= 4.0.0' @@ -6756,26 +6513,26 @@ packages: '@react-native-masked-view/masked-view': optional: true - '@react-navigation/native-stack@7.15.1': - resolution: {integrity: sha512-kNrJggwoB/onC0MpZIuZ6qaqeAziFchz+W9txBzhd6qbWmB1OkPVUnu6fWgc6BQc7MeMf59djVmqgX+6kJU1Ug==} + '@react-navigation/native-stack@7.19.2': + resolution: {integrity: sha512-D6hmtgpMZz1x8R0PLbfqqKh5ajEkb13DguE7X/MNNKYL4riY4zD3TrjbcesUC2EZklpQ/EoJ6h6HAhMNfCCsoQ==} peerDependencies: - '@react-navigation/native': ^7.2.4 + '@react-navigation/native': ^7.4.1 react: '>= 18.2.0' react-native: '*' react-native-safe-area-context: '>= 4.0.0' react-native-screens: '>= 4.0.0' - '@react-navigation/native@7.2.4': - resolution: {integrity: sha512-eWC2D3JjhYLId2fVTZhhCiUpWIaPhO9XyEb7Wq8ElmOHyIODlbOzgZ0rKia02OIsDKr9BzZl2sK1dL70yMxDaw==} + '@react-navigation/native@7.4.1': + resolution: {integrity: sha512-pEnu5XzAXV6RWr6A6pmZ7qLB+O6TJWMhBO25AjckMdr596UWulMPHQCtBcnOUfg6K+2h9ZUctHF2E5Xu4vcOrQ==} peerDependencies: react: '>= 18.2.0' react-native: '*' - '@react-navigation/routers@7.5.5': - resolution: {integrity: sha512-9/hhMte12Kgu+pMnLfA4EWJ0OQmIEAMVMX06FPH2yGkEQSQ3JhhCN/GkcRikzQhtEi97VYYQA15umptBUShcOQ==} + '@react-navigation/routers@7.6.4': + resolution: {integrity: sha512-GI7eJm8/KsZUQaYcXvEExikKurRZRgEsSzyZ7faENfi65yqJBCXjDMwyN1pF6pNW1MoLH1ErDwDivFxY6BzD3w==} - '@remix-run/dev@2.17.4': - resolution: {integrity: sha512-El7r5W6ErX9KIy27+urbc4SIZnIlVDgTOUqzA7Zbv7caKYrsvgj/Z3i/LPy4VNfv0G1EdawPOrygJgIKT4r2FA==} + '@remix-run/dev@2.17.5': + resolution: {integrity: sha512-yEDrKcIICHnaJdUOdBAXQTNXoehB0J3FBcZr4CnK6Alic6cVJGGBGMtJdIO7DUwNySwoYvkUTS3qnXuk2zGYZA==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: @@ -6794,8 +6551,8 @@ packages: wrangler: optional: true - '@remix-run/express@2.17.4': - resolution: {integrity: sha512-4zZs0L7v2pvAq896zHRLNMhoOKIPXM9qnYdHLbz4mpZUMbNAgQacGazArIrUV3M4g0gRMY0dLrt5CqMNrlBeYg==} + '@remix-run/express@2.17.5': + resolution: {integrity: sha512-R4G22lXN4oRWusxdTsdnDYfjmnVaNUkWU6zg1OQZD15EJ5gZlx8psO62Tv77vXKN5XMhJ6YdODQ8179isvkNpw==} engines: {node: '>=18.0.0'} peerDependencies: express: ^4.20.0 @@ -6804,8 +6561,8 @@ packages: typescript: optional: true - '@remix-run/node@2.17.4': - resolution: {integrity: sha512-9A29JaYiGHDEmaiQuD1IlO/TrQxnnkj98GpytihU+Nz6yTt6RwzzyMMqTAoasRd1dPD4OeSaSqbwkcim/eE76Q==} + '@remix-run/node@2.17.5': + resolution: {integrity: sha512-CwOUCDJqh9o8r/n5N1l+vz4Jh7DFU52/jo7MN56+OL9gM+14aQKdq1aLAh+4V6GuI/qtki9PPk02GmULimmDkw==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -6813,8 +6570,8 @@ packages: typescript: optional: true - '@remix-run/react@2.17.4': - resolution: {integrity: sha512-MeXHacIBoohr9jzec5j/Rmk57xk34korkPDDb0OPHgkdvh20lO5fJoSAcnZfjTIOH+Vsq1ZRQlmvG5PRQ/64Sw==} + '@remix-run/react@2.17.5': + resolution: {integrity: sha512-ya6OQ+T9yS4u8www75f4dH11NIYeK8K0eMrei+q4BTp6NrY2lqLTBfHqVlc23ZsUnWqdLUII4hzySVv+AJbTWA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0.0 @@ -6824,17 +6581,17 @@ packages: typescript: optional: true - '@remix-run/router@1.23.2': - resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} + '@remix-run/router@1.23.3': + resolution: {integrity: sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==} engines: {node: '>=14.0.0'} - '@remix-run/serve@2.17.4': - resolution: {integrity: sha512-c632agTDib70cytmxMVqSbBMlhFKawcg5048yZZK/qeP2AmUweM7OY6Ivgcmv/pgjLXYOu17UBKhtGU8T5y8cQ==} + '@remix-run/serve@2.17.5': + resolution: {integrity: sha512-TeEMRz15dX/6XxOqBBd/3DEq54GTl1JZsdPXWncGJzDcwfgMm5awigwlmqcAuZpGn6aHLk/aFkuVFVi+X4ZHLQ==} engines: {node: '>=18.0.0'} hasBin: true - '@remix-run/server-runtime@2.17.4': - resolution: {integrity: sha512-oCsFbPuISgh8KpPKsfBChzjcntvTz5L+ggq9VNYWX8RX3yA7OgQpKspRHOSxb05bw7m0Hx+L1KRHXjf3juKX8w==} + '@remix-run/server-runtime@2.17.5': + resolution: {integrity: sha512-SyJ5n2pQyo4ERGvjjLvL2PpRWBzlC2qzO5KkkOE2ygOiNcgOu9WQnnom9GI8KgsTRCO8JnIeLHFRcmxZnVBjfw==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -7059,8 +6816,8 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -7068,146 +6825,146 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.4': - resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + '@rollup/rollup-android-arm-eabi@4.63.4': + resolution: {integrity: sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.4': - resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + '@rollup/rollup-android-arm64@4.63.4': + resolution: {integrity: sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.4': - resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + '@rollup/rollup-darwin-arm64@4.63.4': + resolution: {integrity: sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.4': - resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + '@rollup/rollup-darwin-x64@4.63.4': + resolution: {integrity: sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.4': - resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + '@rollup/rollup-freebsd-arm64@4.63.4': + resolution: {integrity: sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.4': - resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + '@rollup/rollup-freebsd-x64@4.63.4': + resolution: {integrity: sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.4': - resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': + resolution: {integrity: sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.4': - resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + '@rollup/rollup-linux-arm-musleabihf@4.63.4': + resolution: {integrity: sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.4': - resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + '@rollup/rollup-linux-arm64-gnu@4.63.4': + resolution: {integrity: sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.4': - resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + '@rollup/rollup-linux-arm64-musl@4.63.4': + resolution: {integrity: sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.4': - resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + '@rollup/rollup-linux-loong64-gnu@4.63.4': + resolution: {integrity: sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.4': - resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + '@rollup/rollup-linux-loong64-musl@4.63.4': + resolution: {integrity: sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.4': - resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + '@rollup/rollup-linux-ppc64-gnu@4.63.4': + resolution: {integrity: sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.4': - resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + '@rollup/rollup-linux-ppc64-musl@4.63.4': + resolution: {integrity: sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.4': - resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + '@rollup/rollup-linux-riscv64-gnu@4.63.4': + resolution: {integrity: sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.4': - resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + '@rollup/rollup-linux-riscv64-musl@4.63.4': + resolution: {integrity: sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.4': - resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + '@rollup/rollup-linux-s390x-gnu@4.63.4': + resolution: {integrity: sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.4': - resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + '@rollup/rollup-linux-x64-gnu@4.63.4': + resolution: {integrity: sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.4': - resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + '@rollup/rollup-linux-x64-musl@4.63.4': + resolution: {integrity: sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.4': - resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + '@rollup/rollup-openbsd-x64@4.63.4': + resolution: {integrity: sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.4': - resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + '@rollup/rollup-openharmony-arm64@4.63.4': + resolution: {integrity: sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.4': - resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + '@rollup/rollup-win32-arm64-msvc@4.63.4': + resolution: {integrity: sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.4': - resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + '@rollup/rollup-win32-ia32-msvc@4.63.4': + resolution: {integrity: sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.4': - resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + '@rollup/rollup-win32-x64-gnu@4.63.4': + resolution: {integrity: sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.4': - resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + '@rollup/rollup-win32-x64-msvc@4.63.4': + resolution: {integrity: sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==} cpu: [x64] os: [win32] - '@rollup/wasm-node@4.60.4': - resolution: {integrity: sha512-j6qaRjdDujJ5utX5l6+8eiWlvMLmBfPMBht8mHP2au3xuzf+4deu6PuCquH5GvDIvIOsWHZhA1UVz/s0FvvgAA==} + '@rollup/wasm-node@4.63.4': + resolution: {integrity: sha512-pXmzGQzpMazI9wL+5ifqPfIOR5FFblTWTPS/tIg/WXH8JpLYFbJsOq4UyL2RH2FNAnfPqoC28wgRLudGH66NPA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7236,8 +6993,8 @@ packages: '@rushstack/ts-command-line@4.22.6': resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - '@schematics/angular@21.2.12': - resolution: {integrity: sha512-eHoAbxd6Kdw9YIQeZO/6lBXTmKKi10t4WTujY8CM5v4qv1zoJu9yiwVeQp9y3e7/Sybz5Ec3m4FmQ0Tw8iVDiA==} + '@schematics/angular@21.2.24': + resolution: {integrity: sha512-eGBr4Yhg/A8Lt8QGtWxmXAyKboX8QBwbDG1hSyApQfHAh9iNFbV7mgWSmk0qPWvRJM38s0t3EEkEg79QZ98dWQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@shikijs/engine-oniguruma@3.23.0': @@ -7263,8 +7020,8 @@ packages: resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.5.1': - resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==} + '@sigstore/protobuf-specs@0.5.2': + resolution: {integrity: sha512-SQqvFMt4V78fdjcDdYX6HbiVSOR4QK3ZgwCa2KOsopAgPIHy1rU5UDUmzLl02r5oyyaYcYHR1hpwDRk/yUe+Mw==} engines: {node: ^18.17.0 || >=20.5.0} '@sigstore/sign@4.1.1': @@ -7279,8 +7036,8 @@ packages: resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} engines: {node: ^20.17.0 || >=22.9.0} - '@sinclair/typebox@0.27.10': - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -7288,33 +7045,33 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@solid-primitives/event-listener@2.4.5': - resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.3.5': - resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} + '@solid-primitives/keyboard@1.3.7': + resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.5': - resolution: {integrity: sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==} + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.3': - resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.3': - resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.4.0': - resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} peerDependencies: solid-js: ^1.6.12 @@ -7342,8 +7099,12 @@ packages: peerDependencies: acorn: ^8.9.0 - '@sveltejs/package@2.5.7': - resolution: {integrity: sha512-qqD9xa9H7TDiGFrF6rz7AirOR8k15qDK/9i4MIE8te4vWsv5GEogPks61rrZcLy+yWph+aI6pIj2MdoK3YI8AQ==} + '@sveltejs/load-config@0.2.3': + resolution: {integrity: sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==} + engines: {node: '>= 18.0.0'} + + '@sveltejs/package@2.5.8': + resolution: {integrity: sha512-zeBbsXYvHiBu56v4gJaGQoEHzg96w0E1j3dOMX8vo56s6vI5eQ57ZEZhudjwjnegnVitRRu5MrmhO0eNvaonIw==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: @@ -7364,86 +7125,86 @@ packages: svelte: ^5.0.0 vite: ^6.0.0 - '@swc/core-darwin-arm64@1.15.40': - resolution: {integrity: sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==} + '@swc/core-darwin-arm64@1.16.2': + resolution: {integrity: sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.40': - resolution: {integrity: sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==} + '@swc/core-darwin-x64@1.16.2': + resolution: {integrity: sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.40': - resolution: {integrity: sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==} + '@swc/core-linux-arm-gnueabihf@1.16.2': + resolution: {integrity: sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.40': - resolution: {integrity: sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==} + '@swc/core-linux-arm64-gnu@1.16.2': + resolution: {integrity: sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.40': - resolution: {integrity: sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==} + '@swc/core-linux-arm64-musl@1.16.2': + resolution: {integrity: sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.15.40': - resolution: {integrity: sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==} + '@swc/core-linux-ppc64-gnu@1.16.2': + resolution: {integrity: sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.15.40': - resolution: {integrity: sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==} + '@swc/core-linux-s390x-gnu@1.16.2': + resolution: {integrity: sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg==} engines: {node: '>=10'} cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.15.40': - resolution: {integrity: sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==} + '@swc/core-linux-x64-gnu@1.16.2': + resolution: {integrity: sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.40': - resolution: {integrity: sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==} + '@swc/core-linux-x64-musl@1.16.2': + resolution: {integrity: sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.40': - resolution: {integrity: sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==} + '@swc/core-win32-arm64-msvc@1.16.2': + resolution: {integrity: sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.40': - resolution: {integrity: sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==} + '@swc/core-win32-ia32-msvc@1.16.2': + resolution: {integrity: sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.40': - resolution: {integrity: sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==} + '@swc/core-win32-x64-msvc@1.16.2': + resolution: {integrity: sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.40': - resolution: {integrity: sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==} + '@swc/core@1.16.2': + resolution: {integrity: sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -7457,8 +7218,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.26': - resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + '@swc/types@0.1.28': + resolution: {integrity: sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==} '@tanstack/angular-store@0.9.3': resolution: {integrity: sha512-8i6GreuOQ7UFIQpYWLpXUaFHEP4XcaMcN+F05Bo5LOPN8s90fiCzt00CQbV9rbRHqzXaIcY8bwcXKOTRMxNVNQ==} @@ -7474,8 +7235,8 @@ packages: resolution: {integrity: sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.4.3': - resolution: {integrity: sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw==} + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} engines: {node: '>=18'} hasBin: true @@ -7485,8 +7246,8 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools-ui@0.5.2': - resolution: {integrity: sha512-GtaMk8kaGZ9ZdR8Pu5RAfcse/ZrxzH/xsAIFtHMapLs2VMqSPFfb1NvIDO1MAAfUcub8Ix8XKQEP0uYSPzoFKw==} + '@tanstack/devtools-ui@0.5.3': + resolution: {integrity: sha512-iJjwWtdXhUGpeHyyW9+3NhXhmlVFhh3v3UBNKCouykG9UFXEtneVVNXgSRpd70DeYJFmvKOY19LafKRI5/cM7A==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' @@ -7524,8 +7285,8 @@ packages: resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} - '@tanstack/history@1.162.0': - resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + '@tanstack/history@1.162.4': + resolution: {integrity: sha512-utTS5L2OkeYUzXGohL1Z8sefu1GLNOJcxe8Hd6iIdc/Xo1K1nDB2JEp4iSFhvYh33xKC9V91TxrS8qfrpoKobQ==} engines: {node: '>=20.19'} '@tanstack/lit-store@0.13.2': @@ -7543,13 +7304,13 @@ packages: resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} - '@tanstack/preact-store@0.13.1': - resolution: {integrity: sha512-0h8ku2LfJ/TtVtgx24CLgS2OgzY5wVsRWIGktE0yq6b6fHlsCcY55IEJXTDRs0RTYWFOXu7N/1kfb2SLEOasaw==} + '@tanstack/preact-store@0.13.2': + resolution: {integrity: sha512-CBosOLog5UnaZX9YHRA2LKJm5XR0tCABvNWDfDMcyFeLtEnJ9W9DOVbz4JxXMb3+LZhGEMVrt1iA77npNx/9rw==} peerDependencies: preact: ^10.0.0 - '@tanstack/query-core@5.100.14': - resolution: {integrity: sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew==} + '@tanstack/query-core@5.103.1': + resolution: {integrity: sha512-rms8HqTGp6zA00dM+cUQ2eBcgzNJefuu5CAMB37i/6MiGT1zulPOytCFu2a0qjLqVR2n1jENPj9woqFQNuCzWA==} '@tanstack/react-devtools@0.9.13': resolution: {integrity: sha512-O9YXTEe2dlnw2pPNKFZ4Wk7zC4qrDvc0SAALKfMVedeZ2Dyd0LEJUabYS6GPm+DmnrBhc7nJx6Zqc9aDjFrj4g==} @@ -7560,38 +7321,31 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query@5.100.14': - resolution: {integrity: sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw==} + '@tanstack/react-query@5.103.1': + resolution: {integrity: sha512-rmAPPApNEK17VXRJhtE1rja53n23VV5w30C0saCgJhhX+EpdUnVqMGV/s5nnzV43X75KTHKzuoiuxSzGTBIkag==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.170.17': - resolution: {integrity: sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ==} - engines: {node: '>=20.19'} - peerDependencies: - react: '>=18.0.0 || >=19.0.0' - react-dom: '>=18.0.0 || >=19.0.0' - - '@tanstack/react-router@1.170.8': - resolution: {integrity: sha512-Qw2ju6jjnIsMpuW+VrnHZWHuugqs592PWsnI56sG28qNhg14CgRLahOcNajfuJR9P4MxKGP94WVzmFKSYUz/ig==} + '@tanstack/react-router@1.170.38': + resolution: {integrity: sha512-iHM9b0aDJbuvftmkiQXawzoqsdV68p2Re2safbVLCnxafe+iLKV++2i3hI/BMAP6uR92/Mjw94JKJJfD7pbwHQ==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.15': - resolution: {integrity: sha512-pW50PHvadgi50iNCw6deUOvqc9rzs30SstyFZY2tcS9z1XlqTlELSvGowjxdu2m0ymtqm1emj1jau1iP7+3+PQ==} + '@tanstack/react-start-client@1.168.36': + resolution: {integrity: sha512-TRXZKag/Ng0TqVfcN4cbEDVJhEZYosHZ9/VAEhK3PK/YqznytK+bcoonE4jP5NCXMdH2YRTMsrWKrApEuWz0Cg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.26': - resolution: {integrity: sha512-+FMm3qtT1gWsl0i5sG/Q70mh1k7tzZUsPBaqbg4v34zVJZ+XGn1mJb34x2w7z1M0/e7co6GkZfV8BRpczrs8UA==} + '@tanstack/react-start-rsc@0.1.55': + resolution: {integrity: sha512-qfW89LMrewtMLHMCumMP3+3mf2gPezFE7FZ7CHPJis4paxt2A6Jl7eCpE6whYgc5DFiifUv9qdfbC22HIP0HAw==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' - '@vitejs/plugin-rsc': '>=0.5.20' + '@vitejs/plugin-rsc': '>=0.5.30' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' react-server-dom-rspack: '>=0.0.2' @@ -7603,15 +7357,15 @@ packages: react-server-dom-rspack: optional: true - '@tanstack/react-start-server@1.167.21': - resolution: {integrity: sha512-puJ7eFxaLuDzeM/tiLDJaXCA4uK+PZnEOoIC73zipsFqx865MGzrRS/GSZxeVxjavC5iHU+ZwC+rgI0qYSol1A==} + '@tanstack/react-start-server@1.167.43': + resolution: {integrity: sha512-/Fc1mOEBAyXmqxnihIkS1DrCcJX8ffrJ+xyc8nnFmO9YuCdrnZJskd48R1ZiOhM7u3vCPzDxUycIhKo8HlKn2g==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.168.27': - resolution: {integrity: sha512-rdGFDqfCW71gyofyAxaYxhelNKmeVjpmbpm0uFYbNHORCa///4aBxi7B7ecShibKv9O4GfJ66MPX5F0ozbm+ig==} + '@tanstack/react-start@1.168.56': + resolution: {integrity: sha512-b/jVJS+yt7J0IKwXfVoA2mlhIi92sWfwCYrCVked0WERzgbYAad6xrOwNTljz9OKyeajofGrmMdKJgRzK1Lt2w==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -7627,36 +7381,26 @@ packages: vite: optional: true - '@tanstack/react-store@0.11.0': - resolution: {integrity: sha512-tX4YXh3PDkmpvGQWkWqKpzs/MSqbtuwY9dWdWhtV9Q50PmO+jOkUKIWIX4G85dwt7lxdHLXsiaEKPdKmC8F41w==} + '@tanstack/react-store@0.11.1': + resolution: {integrity: sha512-HaIGKI3YLmjBYIvy5DFDY23oNaYZIsTZfngey07Uh5iLVJgM3bIGCnZeOFOqzjFld9JHWcaHJnasD/bKoGKwJQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-store@0.9.3': - resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@tanstack/router-core@1.171.14': - resolution: {integrity: sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g==} + '@tanstack/router-core@1.171.32': + resolution: {integrity: sha512-X86Jqk3vB2KJcUfS6oLi7B7yxbaa59QEhZRPPP1fRx3k+Jw/Fu1UYVBcRtdwK/OccQnrlQdVoKvNO3QXmyEBOw==} engines: {node: '>=20.19'} - '@tanstack/router-core@1.171.6': - resolution: {integrity: sha512-Ol6DQ+j6rf/rPVELIzo8LHwOQV2KL+zry3b+39kL/GKrt7YId52WJRAFMzuseY4XceSW+PU7sG/Cc1QkwJr0hg==} + '@tanstack/router-generator@1.167.38': + resolution: {integrity: sha512-lkqgFleDgfkW+QONVMKBs+ZGDUF0v9R9FkplS/GZvKDFpfnu+tZxmGlV2pryU1TDxyuSyjh56AtIla3NMrlScw==} engines: {node: '>=20.19'} - '@tanstack/router-generator@1.167.18': - resolution: {integrity: sha512-kFvM4caRds9Q3EXg64bZubJ6rbDxyV0YDSBSGvOGzmKspQPdz5Xrh0uj5T1Ov8avUUg+c761u04VQAaEzSBXRw==} - engines: {node: '>=20.19'} - - '@tanstack/router-plugin@1.168.19': - resolution: {integrity: sha512-aFglwLc+bbPTgZlkXn3PvOwpjJAfgUyPGSuql4MP3XrqTTh6WkBiy2RYb6oaG5h0s7EKwivEuq85K3Y4V0Mt1g==} + '@tanstack/router-plugin@1.168.40': + resolution: {integrity: sha512-ifiXjjR4uivxwRDhgYAcfyrcu+Mwx+vlG0QjjQ7N5C5sKmzpt5UtsL21TNVvZDSZl2Vae8DcL84Z02fOs8ZZMQ==} engines: {node: '>=20.19'} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.17 + '@tanstack/react-router': ^1.170.38 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' @@ -7672,8 +7416,8 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.162.2': - resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==} + '@tanstack/router-utils@1.162.3': + resolution: {integrity: sha512-Icb0xGuG1+54IV0WMLRcc3ErTx2HeJWyPG661FkQ8UT6guoBq1FJjFRqlG/JS0xi4mFFkBhvwO7tbLa32f3yxA==} engines: {node: '>=20.19'} '@tanstack/solid-devtools@0.7.33': @@ -7682,21 +7426,21 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/solid-store@0.11.0': - resolution: {integrity: sha512-2isL0ZnnyI1iN0V+QPrxE3OcPndohBgVlBcHZYoAOIAiU1WoWjVy0q5gb0suPu1Id0h5cKC23JnwzQTxWDZD0w==} + '@tanstack/solid-store@0.11.1': + resolution: {integrity: sha512-wzJsiqqLHyQacqbYPT8dKNfhR00NNu743vGeWz2lEpOyE/R+6AYIfFLhXsCIT/Kb+KKiT1KDkB2/35DhLEGx8g==} peerDependencies: solid-js: ^1.6.0 - '@tanstack/start-client-core@1.170.13': - resolution: {integrity: sha512-o37M3msIK5ec87kPrIYJWXb1XPnjIe5/jrkGLXiXpFuVL99z7mhoBCzftKtVPtzqI8EElnRE/VGFYT9BHNnWcw==} + '@tanstack/start-client-core@1.170.32': + resolution: {integrity: sha512-kawgeg3Ej/JvGeEN7txFdVN9kXOST9wl7yPojOGESiomwiubHKRdYUS6sBskW91j44H+HirQUppP4+Ha7kjb4A==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.162.0': resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.19': - resolution: {integrity: sha512-+fpW3Z/2vPT8HDV1c5p2WC6/g2k/AV/ujdJVDcn/VFd+gXRtzSX1D/LfozlaDbhDoEsqOnAk/mGwjg60JkUA2Q==} + '@tanstack/start-plugin-core@1.171.46': + resolution: {integrity: sha512-d/cDPZNDdRl824mOamt6USO1ja5JAaIwkuT2FIBRkBdrKZgQ8GJWv5pqpkXMbKANc49V8bUBBOTjgiCdC7YsPw==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -7707,12 +7451,12 @@ packages: vite: optional: true - '@tanstack/start-server-core@1.169.16': - resolution: {integrity: sha512-lvAjQpH3nHJtd4xy0iHIaWbsTbyN9EBxuYCxbtXH0EpeBQPg+TCPhu9GQC9WbbA1rE//s82CpE55oYDQMqkU5A==} + '@tanstack/start-server-core@1.169.37': + resolution: {integrity: sha512-CjYMXg2XISMEJt9UVR4lbMRsnRyWPrdyuF8iuJ4gxTc1sVNRciwMVpMPVGQG2KuIma3ewlNxw8+Tpx2tnS3zRA==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.167.16': - resolution: {integrity: sha512-zTegxlij4BC1DbCrC6rsVlMOQVMzOuG5IllacZEkrUdhiFwMIMYpk0VWGH+d0ucx5RBkmv8e8GNX3AOVBWclfg==} + '@tanstack/start-storage-context@1.167.34': + resolution: {integrity: sha512-cRPE0kjt1CnOIhepmNOvRFwCGhDAnCRohPD3HmzqJJThPkixLBRuLDvIYp4hRPtM1TJ9hiKbYl24IxAhjZO5TA==} engines: {node: '>=22.12.0'} '@tanstack/store@0.11.0': @@ -7724,8 +7468,8 @@ packages: '@tanstack/store@0.9.3': resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} - '@tanstack/svelte-store@0.12.0': - resolution: {integrity: sha512-XhXlU3jIO/WxikfeVczRdsAvRWzsLBh8Ic6sC7nzfzvMbPut7ZSdCbE7/usfm0bMjVGMmZmyzZy2xRu73QYWAA==} + '@tanstack/svelte-store@0.12.1': + resolution: {integrity: sha512-ZFj8gyIWHZRYLv8RHp5jhnMhvw15g86KinotrUp9RfY7ygjkU3CcaMUytIdMJ4Xzq/9GqVlAphV9gFIGKRXWSw==} peerDependencies: svelte: ^5.0.0 @@ -7741,8 +7485,8 @@ packages: resolution: {integrity: sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==} engines: {node: '>=18'} - '@tanstack/vue-store@0.11.0': - resolution: {integrity: sha512-w1lE4D7oo6nIUhTQvL/RoTgcvoYJw+KvttWPNJd/Xu+MvNxMnjxFF/LgFp9vwmbNbiGhGCg3ZoPJptwjrfwNYw==} + '@tanstack/vue-store@0.11.1': + resolution: {integrity: sha512-0YmYwbiCQKhzfFTLpHybjoAVUh3GkQVYGguvGTzk/0wx0oWuni60huvRs1RqqRLJH6nig3PTYuLuQQ+X5s05gA==} peerDependencies: '@vue/composition-api': ^1.2.1 vue: ^2.5.0 || ^3.0.0 @@ -7750,17 +7494,15 @@ packages: '@vue/composition-api': optional: true - '@testing-library/angular@19.3.0': - resolution: {integrity: sha512-Wy2qpepHXOPSnTfH3NX0i9TZPTTrX+Bumd1u3UFJgl0N/iMLfCc9/LNIZCmbUFbT7t2pVLgXFL0kLHa5JuBy6A==} + '@testing-library/angular@19.5.0': + resolution: {integrity: sha512-wGSWTsibHaaQ0zMMlvqD1OEn+u3J2lu5BLFs7ULcUdy+kdqAFlDulexHFMpugdcJK1sTPu7yfJtI+cHf5si61w==} peerDependencies: - '@angular/common': '>= 21.0.0' '@angular/core': '>= 21.0.0' - '@angular/platform-browser': '>= 21.0.0' '@angular/router': '>= 21.0.0' '@testing-library/dom': ^10.0.0 - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + '@testing-library/dom@10.4.2': + resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} engines: {node: '>=18'} '@testing-library/dom@8.20.1': @@ -7771,9 +7513,12 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - '@testing-library/jest-dom@6.9.1': - resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/jest-dom@6.10.0': + resolution: {integrity: sha512-HQwu0KaB2zyT0iLzBL+8CLyZDL3KlZlZJ+2iyc9uCUnlJVskJU/UlPuVCyIPhtukjPQdT2QNoR5nCP5FqTmmDQ==} + engines: {node: '>=22', npm: '>=6', yarn: '>=1'} + deprecated: Incorrect minor release with breaking changes (Node >=22 and required @testing-library/dom peer). Use 6.9.1 for the 6.x line, or upgrade to 7.0.0. + peerDependencies: + '@testing-library/dom': '>=10 <11' '@testing-library/preact@3.2.4': resolution: {integrity: sha512-F+kJ243LP6VmEK1M809unzTE/ijg+bsMNuiRN0JEDIJBELKKDNhdgC/WrUSZ7klwJvtlO3wQZ9ix+jhObG07Fg==} @@ -7781,8 +7526,8 @@ packages: peerDependencies: preact: '>=10 || ^10.0.0-alpha.0 || ^10.0.0-beta.0' - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + '@testing-library/react@16.3.3': + resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -7796,14 +7541,14 @@ packages: '@types/react-dom': optional: true - '@testing-library/svelte-core@1.0.0': - resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==} + '@testing-library/svelte-core@1.1.3': + resolution: {integrity: sha512-KkMAvXeWorxN2Yn0kdC1lfoAItxpoj4uOWzxK5leDrNxonLvS5nwBFvztrroyTszQ0Wf/EU6iLT8JhY5qcn22g==} engines: {node: '>=16'} peerDependencies: svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 - '@testing-library/svelte@5.3.1': - resolution: {integrity: sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==} + '@testing-library/svelte@5.4.2': + resolution: {integrity: sha512-4o31E4HGo5BU5KwPkulNRocEden+7Tt9JYm9uhln5ajF7DULeyFA46BBWVfKJ8Ms9B3JmOFPTIiVamH7n3KpuQ==} engines: {node: '>= 10'} peerDependencies: svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 @@ -7815,12 +7560,6 @@ packages: vitest: optional: true - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@testing-library/user-event@14.6.7': resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} engines: {node: '>=12', npm: '>=6'} @@ -7837,9 +7576,6 @@ packages: '@vue/compiler-sfc': optional: true - '@ts-morph/common@0.22.0': - resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} - '@tsconfig/node10@1.0.13': resolution: {integrity: sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==} @@ -7858,17 +7594,17 @@ packages: '@tsrx/core@0.2.4': resolution: {integrity: sha512-o07NiDB2yFeN2natoViMwwb9h0o3UDzYqGUJ7qe4w6r5Oc0WLoWFfrpRDUtWBpR+JL4Loc3lRxFdOD+Wz+0VlQ==} - '@tsrx/eslint-parser@0.4.6': - resolution: {integrity: sha512-wSi2pLWynAzf5CQj31OMnNmiZ/MaTSR9McABlgWkSIXLmPHZQGd3mmqKrKZNEjLF2jv4fdYMwjXf1CS6RDQ6Fg==} + '@tsrx/eslint-parser@0.4.7': + resolution: {integrity: sha512-YQw3sp5Qy9NiXtE5mJRFJVxJvv1CTLM+9a/hlmLksOotzJXX43RyOzQ+YW5Vobqc+PiQqfxnHmkJv9iRXm/anA==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '>=9.0.0' - '@tsrx/eslint-plugin@0.4.6': - resolution: {integrity: sha512-q4nD0wBQwB3lf1WJ1UgflhI4uZSZKeg7Q4jbapa4cS5xRD/M3ofskEu/O5yYCILZNb6LPMViblGyWsFcNZ/5sg==} + '@tsrx/eslint-plugin@0.4.7': + resolution: {integrity: sha512-+RHqgRBBSa9mqcxF0b1s8O3NgRgB3OlOVB3hu24ael8GcXwJSSOcsIn3kwzwTbbLuZWyf6qk0ZiaivMlwCfw3g==} engines: {node: '>=22.0.0'} peerDependencies: - '@tsrx/eslint-parser': 0.4.6 + '@tsrx/eslint-parser': 0.4.7 '@typescript-eslint/parser': ^8.56.1 eslint: '>=9.0.0' @@ -7970,9 +7706,6 @@ packages: resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} engines: {node: ^20.17.0 || >=22.9.0} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} - '@tybys/wasm-util@0.10.4': resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} @@ -8036,14 +7769,11 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + '@types/express-serve-static-core@4.19.9': + resolution: {integrity: sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==} '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} @@ -8057,8 +7787,8 @@ packages: '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -8087,8 +7817,8 @@ packages: '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -8096,8 +7826,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.12.4': - resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} + '@types/node@24.13.6': + resolution: {integrity: sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -8111,18 +7841,18 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: - '@types/react': ^19.2.0 + '@types/react': ^19.3.0 '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} @@ -8163,67 +7893,67 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.59.4': - resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} + '@typescript-eslint/eslint-plugin@8.70.0': + resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.4 + '@typescript-eslint/parser': ^8.70.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.4': - resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} + '@typescript-eslint/parser@8.70.0': + resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.4': - resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} + '@typescript-eslint/project-service@8.70.0': + resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.4': - resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} + '@typescript-eslint/scope-manager@8.70.0': + resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.4': - resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} + '@typescript-eslint/tsconfig-utils@8.70.0': + resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.4': - resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} + '@typescript-eslint/type-utils@8.70.0': + resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.4': - resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} + '@typescript-eslint/types@8.70.0': + resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.4': - resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} + '@typescript-eslint/typescript-estree@8.70.0': + resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.4': - resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} + '@typescript-eslint/utils@8.70.0': + resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.4': - resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} + '@typescript-eslint/visitor-keys@8.70.0': + resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} '@unrs/resolver-binding-android-arm-eabi@1.12.2': resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} @@ -8356,8 +8086,8 @@ packages: '@vanilla-extract/babel-plugin-debug-ids@1.2.2': resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==} - '@vanilla-extract/css@1.20.1': - resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==} + '@vanilla-extract/css@1.21.2': + resolution: {integrity: sha512-ehF/tmv2MxQwOJB1DicALUqnjZTnmY9Y7J2ccKB578JzZpYeL6sLAUqbaXo1taw1Erp0qBq0I4Kejs0uU/pBfg==} '@vanilla-extract/integration@6.5.0': resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} @@ -8389,16 +8119,16 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/coverage-istanbul@3.2.4': - resolution: {integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==} + '@vitest/coverage-istanbul@3.2.7': + resolution: {integrity: sha512-/o+QIJBJCBZm7FdyAMqYKvr8Cd0YsqPt9UwVT6bAA+U9Ae8AR39ZAjq7xnmKCO64TkzPm0Vvi7jzYZWLdu6Y5A==} peerDependencies: - vitest: 3.2.4 + vitest: 3.2.7 - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -8408,20 +8138,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} '@volar/language-core@2.4.15': resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} @@ -8451,17 +8181,17 @@ packages: typescript: optional: true - '@vue/compiler-core@3.5.34': - resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + '@vue/compiler-core@3.5.43': + resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} - '@vue/compiler-dom@3.5.34': - resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + '@vue/compiler-dom@3.5.43': + resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} - '@vue/compiler-sfc@3.5.34': - resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + '@vue/compiler-sfc@3.5.43': + resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} - '@vue/compiler-ssr@3.5.34': - resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + '@vue/compiler-ssr@3.5.43': + resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -8482,25 +8212,23 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.34': - resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + '@vue/reactivity@3.5.43': + resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} - '@vue/runtime-core@3.5.34': - resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + '@vue/runtime-core@3.5.43': + resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} - '@vue/runtime-dom@3.5.34': - resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + '@vue/runtime-dom@3.5.43': + resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} - '@vue/server-renderer@3.5.34': - resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} - peerDependencies: - vue: 3.5.34 + '@vue/server-renderer@3.5.43': + resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} - '@vue/shared@3.5.34': - resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + '@vue/shared@3.5.43': + resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} - '@vue/test-utils@2.4.10': - resolution: {integrity: sha512-SmoZ5EA1kYiAFs9NkYdiFFQF+cSnUwnvlYEbY+DogWQZUiqOm/Y29eSbc5T6yi75SgSF9863SBeXniIEoPajCA==} + '@vue/test-utils@2.5.1': + resolution: {integrity: sha512-V/4a99odJ7hapr0bRt35XxljGk8hefq31gSOnlKTcEq2fUeoj2qb+FcpJYfQu4qfYhW9Ug+O2+CZ3QmZ7gXDzA==} peerDependencies: '@vue/compiler-dom': 3.x '@vue/server-renderer': 3.x @@ -8557,12 +8285,12 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xmldom/xmldom@0.8.13': - resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} + '@xmldom/xmldom@0.8.15': + resolution: {integrity: sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==} engines: {node: '>=10.0.0'} - '@xmldom/xmldom@0.9.10': - resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + '@xmldom/xmldom@0.9.12': + resolution: {integrity: sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==} engines: {node: '>=14.6'} '@xtuc/ieee754@1.2.0': @@ -8586,14 +8314,14 @@ packages: '@zxing/text-encoding@0.9.0': resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - abbrev@4.0.0: resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} engines: {node: ^20.17.0 || >=22.9.0} + abbrev@5.0.0: + resolution: {integrity: sha512-/XrFJgzQQQHpti1raDJC6m4ws6aNktmjBlhk8Fdlk7LwCEuDoieEJJY9OFHjfiFJFFRM2tK+Ky/IsfbbmlMu1w==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -8638,6 +8366,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-cli-detector@0.1.7: + resolution: {integrity: sha512-d8OWDVdZMgjhLUT9ZPgSv/BdFFF9pVuscC0JdUSz3bjwE15gcp6u/o0/JooM2yyAWC49KThFhXlgTXRa9B7yng==} + engines: {node: '>=18.18'} + hasBin: true + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -8650,16 +8383,8 @@ packages: ajv: optional: true - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -8724,8 +8449,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -8744,8 +8469,8 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.3.0: - resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + ansis@4.4.0: + resolution: {integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==} engines: {node: '>=14'} any-promise@1.3.0: @@ -8785,11 +8510,11 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - arkregex@0.0.5: - resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==} + arkregex@0.0.8: + resolution: {integrity: sha512-PJcx6G1kQTgLKPUbeYlYecDRaKq15AMSGVajlKFYWlPeJRQL+j3dKE6tyMs40HZ99djS1l9Vhl3ezAHy9JBIqQ==} - arktype@2.2.0: - resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==} + arktype@2.2.3: + resolution: {integrity: sha512-7W+0RLTUNJiBFIIZXwOQxSR8Z273IAd6IvqBeG9+gHnQKFsIx2C0iOtGTmMrPnlX4qLXyc5+ll7A0BIj9WrbTg==} array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} @@ -8798,8 +8523,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + array-includes@3.2.0: + resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==} engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: @@ -8837,9 +8562,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-kit@3.0.0-beta.1: - resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} - engines: {node: '>=20.19.0'} + ast-kit@3.0.0: + resolution: {integrity: sha512-8OG92q3R35qjC/4i6BLBMg8IB+fClWu/1PEwg2Z9Rn+BuNaiEgJzpzn+pxWOdHJWDCAwu2JP0wCDTozAM4QirQ==} + engines: {node: ^22.18.0 || >=24.11.0} astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} @@ -8897,8 +8622,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-jsx-dom-expressions@0.40.7: - resolution: {integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==} + babel-plugin-jsx-dom-expressions@0.40.10: + resolution: {integrity: sha512-lxve6Y02YiZTldB7efKpnbf1BH00XCFZNYYW235jSGsYaJNFtHrYlKV6/O+miHbjqpIr9FTe5+0no4hofAMbfA==} peerDependencies: '@babel/core': ^7.20.12 @@ -8951,8 +8676,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-expo@54.0.10: - resolution: {integrity: sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==} + babel-preset-expo@54.0.12: + resolution: {integrity: sha512-6xeSkdaixmQhWSYL7tfLu0pOS0BY+8ftwmdNSHtpEFSizrXYZkCjk/B6Dxr+6nwNRihixMcS0aBlWS1wlDl3pw==} peerDependencies: '@babel/runtime': ^7.20.0 expo: '*' @@ -8969,11 +8694,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-solid@1.9.12: - resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + babel-preset-solid@1.9.15: + resolution: {integrity: sha512-GBmg1OiPb+OwcH51XbDAKPtvrPfQW7rCJTJxcp8+yhtWwN+kqnbEJk2SgVybd+uhTxTKAvjaFyiQSr/eUZBwzg==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^1.9.12 + solid-js: ^1.9.15 peerDependenciesMeta: solid-js: optional: true @@ -8995,8 +8720,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.32: - resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + baseline-browser-mapping@2.11.25: + resolution: {integrity: sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==} engines: {node: '>=6.0.0'} hasBin: true @@ -9015,8 +8740,8 @@ packages: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + bidi-js@1.1.0: + resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} @@ -9029,25 +8754,25 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - birecord@0.1.1: - resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + birecord@0.1.2: + resolution: {integrity: sha512-5PAPTTmMpMEb+GuMb5DebfBkipRGyIW9+gtwEBSoDA9xkhHILm04+hZQ702pMksu3d8YAuGkmgTzQWcKqTPScA==} - birpc@4.0.0: - resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + birpc@4.2.0: + resolution: {integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + body-parser@1.20.8: + resolution: {integrity: sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - bonjour-service@1.4.0: - resolution: {integrity: sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==} + bonjour-service@1.4.4: + resolution: {integrity: sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -9063,15 +8788,15 @@ packages: resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} engines: {node: '>= 5.10.0'} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} - brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} @@ -9084,8 +8809,8 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.29.0: + resolution: {integrity: sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -9154,8 +8879,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -9188,8 +8913,8 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} @@ -9303,9 +9028,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -9336,10 +9058,6 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -9363,8 +9081,8 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - comment-parser@1.4.7: - resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + comment-parser@1.4.9: + resolution: {integrity: sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==} engines: {node: '>= 12.0.0'} common-path-prefix@3.0.0: @@ -9377,8 +9095,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + compression@1.8.2: + resolution: {integrity: sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==} engines: {node: '>= 0.8.0'} computeds@0.0.1: @@ -9390,8 +9108,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -9416,8 +9134,8 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} engines: {node: '>=18'} convert-source-map@1.9.0: @@ -9440,9 +9158,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -9453,8 +9168,9 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -9467,8 +9183,8 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cosmiconfig@9.0.1: - resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -9557,8 +9273,8 @@ packages: dataloader@2.2.3: resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} - dayjs@1.11.20: - resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -9646,8 +9362,8 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} engines: {node: '>=18'} defaults@1.0.4: @@ -9706,9 +9422,6 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - devalue@5.8.1: - resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} - devalue@5.9.4: resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} @@ -9789,24 +9502,24 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - editorconfig@1.0.7: - resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} - engines: {node: '>=14'} + editorconfig@3.0.2: + resolution: {integrity: sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA==} + engines: {node: '>=20'} hasBin: true ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.21.2: - resolution: {integrity: sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg==} + effect@3.22.2: + resolution: {integrity: sha512-fm1CQXCs7GTMwpadZxwU5rnAb2bN6mbQpknq/pXBGCzSKkosNYb9k0wsoL0TfB10rSa5xOEZJjo77u/KLXSANg==} ejs@5.0.1: resolution: {integrity: sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==} engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.361: - resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} + electron-to-chromium@1.5.433: + resolution: {integrity: sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -9821,8 +9534,8 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} encodeurl@1.0.2: @@ -9839,8 +9552,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.22.0: - resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} + enhanced-resolve@5.25.1: + resolution: {integrity: sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -9855,8 +9568,8 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} engines: {node: '>=20.19.0'} env-cmd@11.0.0: @@ -9889,6 +9602,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -9904,8 +9621,8 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: @@ -9930,18 +9647,18 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - esbuild-plugins-node-modules-polyfill@1.8.1: - resolution: {integrity: sha512-7vxzmyTFDhYUNhjlciMPmp32eUafNIHiXvo8ZD22PzccnxMoGpPnsYn17gSBoFZgpRYNdCJcAWsQ60YVKgKg3A==} + esbuild-plugins-node-modules-polyfill@1.8.3: + resolution: {integrity: sha512-DSWWgkQUkavjuyvuaTSd7FpOOZgMpsgmzANoNCCDtOt6NeK5k5bxrn/kSGxnEyiRfSvfIlwgYfOL7s6RRLaxKw==} engines: {node: '>=14.0.0'} peerDependencies: - esbuild: '>=0.14.0 <=0.27.x' + esbuild: '>=0.14.0 <=0.28.x' - esbuild-wasm@0.27.3: - resolution: {integrity: sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==} + esbuild-wasm@0.28.1: + resolution: {integrity: sha512-p/GD4E8oYRjg3kjdKrnMb0s4PzXgJF42e0MF4H0+ACyK/kIlFRp3e0fzOleIG+wBBm6MM3XQrbpe7soEA+vJIA==} engines: {node: '>=18'} hasBin: true @@ -9955,13 +9672,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -10025,8 +9737,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -10052,14 +9764,14 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-expo@1.0.3: - resolution: {integrity: sha512-C1v9NPvpDET36+7Klpp/+53Jl+VzOfpbDxpKtL/pAPhCDwTX0kW6Swo425PT0uc4AMT5jpQbB7hSKFjKOGMl4A==} + eslint-plugin-expo@1.1.0: + resolution: {integrity: sha512-vPP0EPx7IA7ZfP49dY4rq9RV5jqkFWG+Pih3/oGjzIRjMI+ogcOE8i6isYkLXAdw/yvFV2BRZkTaQaiOGQqn6Q==} engines: {node: '>=18.0.0'} peerDependencies: eslint: '>=8.10' - eslint-plugin-import-x@4.16.2: - resolution: {integrity: sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==} + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/utils': ^8.56.0 @@ -10297,8 +10009,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.8: - resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} engines: {node: '>=18.0.0'} eventsource@3.0.7: @@ -10313,8 +10025,8 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} expo-asset@12.0.13: @@ -10324,20 +10036,20 @@ packages: react: '*' react-native: '*' - expo-constants@18.0.13: - resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==} + expo-constants@18.0.14: + resolution: {integrity: sha512-BUZm9mkl/TX7zNaN0N4C83ws7mEnesCFiKhqK+rMZwTD2+Q4wWB2kBltqnC/LrCRaMyRi40XxhCRVwuKnJkxXQ==} peerDependencies: expo: '*' react-native: '*' - expo-file-system@19.0.22: - resolution: {integrity: sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA==} + expo-file-system@19.0.24: + resolution: {integrity: sha512-hZs0Ng+coNjx7YJ8MPwfJpoU1SRul6OZ9LZycFzozUeoR+denbyr944YrMP9NVn+Zf1tdC7p0K0zgah3ZySOYg==} peerDependencies: expo: '*' react-native: '*' - expo-font@14.0.11: - resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==} + expo-font@14.0.12: + resolution: {integrity: sha512-QQzunE2Mxk45AsCWm3tK7OpVljbtVnKD58q4/qliev+cbye1IOduUnRIdD+P7DyButw17G9MTX795kgaQiz5hQ==} peerDependencies: expo: '*' react: '*' @@ -10371,8 +10083,8 @@ packages: react: '*' react-native: '*' - expo-modules-autolinking@3.0.25: - resolution: {integrity: sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==} + expo-modules-autolinking@3.0.27: + resolution: {integrity: sha512-Ge216xmfXcba+aUQssfmUo9Hf92wXX3xcXJmOsC/wpuV5B5ozm4BTkRKpoCXEkdD8eJVmFy7ATS8yD3upFOPQA==} hasBin: true expo-modules-core@3.0.30: @@ -10381,15 +10093,15 @@ packages: react: '*' react-native: '*' - expo-router@6.0.23: - resolution: {integrity: sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==} + expo-router@6.0.24: + resolution: {integrity: sha512-KIssKXnwjrdCxPWC8GsMTfKTwng40VrCsO16O9x6fKlfUwBW8itxY9PpCGyQeMJkiEADa+DUhtrDgl+uHg4/DA==} peerDependencies: '@expo/metro-runtime': ^6.1.2 '@react-navigation/drawer': ^7.5.0 '@testing-library/react-native': '>= 12.0.0' expo: '*' expo-constants: ^18.0.13 - expo-linking: ^8.0.11 + expo-linking: ^8.0.12 react: '*' react-dom: '*' react-native: '*' @@ -10415,8 +10127,8 @@ packages: react-server-dom-webpack: optional: true - expo-server@1.0.6: - resolution: {integrity: sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA==} + expo-server@1.0.7: + resolution: {integrity: sha512-mcmyML3oXcqFUXUxtdtCL1O00ztNI2v76d+MdniXRUgHNxIcHZ05zo+DqBaOOT6LQnPk4vA4YHqQl7iGUfRb3g==} engines: {node: '>=20.16.0'} expo-splash-screen@31.0.13: @@ -10452,8 +10164,8 @@ packages: expo: '*' react-native: '*' - expo@54.0.34: - resolution: {integrity: sha512-XkVHguZZDC8BcTQxHAd14/TQFbDp1Wt0Z/KApO9t68Ll5A127hLCPzU+a9gytfCIiyL/V1IpF1vIcOLKEVAoNQ==} + expo@54.0.37: + resolution: {integrity: sha512-afzbtO4i/K9ZCrzyLgEOaXW56w/yuAK61JkCOMrw/S/VFCAp6YwKWA494X5mIcrVmRAmclv/ec7ga8ndTkzhxw==} hasBin: true peerDependencies: '@expo/dom-webview': '*' @@ -10472,22 +10184,22 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + express-rate-limit@8.7.0: + resolution: {integrity: sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' - express@4.22.2: - resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} + express@4.22.3: + resolution: {integrity: sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==} engines: {node: '>= 0.10.0'} express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -10515,8 +10227,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} @@ -10524,8 +10236,8 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -10613,8 +10325,8 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} @@ -10639,10 +10351,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} @@ -10705,8 +10413,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -10727,8 +10435,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -10759,9 +10467,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} @@ -10781,8 +10486,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + glob-to-regex.js@1.3.1: + resolution: {integrity: sha512-zhWhMRsgnOym+1txhUmYJGD6eUsbUdrZv55gCYKuJX8t2p3+M8My23PD09bEIsreGUs5pnSa/idmcfp2/IlqGg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -10882,10 +10587,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} - engines: {node: '>= 0.4'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -10927,12 +10628,12 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hono@4.12.23: - resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} + hono@4.13.8: + resolution: {integrity: sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==} engines: {node: '>=16.9.0'} - hookable@6.1.1: - resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} hosted-git-info@6.1.3: resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} @@ -10986,8 +10687,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + http-proxy-middleware@2.0.10: + resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -10995,9 +10696,9 @@ packages: '@types/express': optional: true - http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy-middleware@3.0.7: + resolution: {integrity: sha512-iwbQltVlx8bCrqePUM8C+hllHvdawVhQJaLrj1X7qllkvFQdXFsr16pW/mo9+JDVjN+QO2XUx9jd8SmoFkE5qw==} + engines: {node: ^14.18.0 || ^16.10.0 || >=18.0.0} http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} @@ -11034,8 +10735,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} icss-utils@5.1.0: @@ -11059,18 +10760,17 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true + ignore@7.0.9: + resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} + engines: {node: '>= 4'} image-size@1.2.1: resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} engines: {node: '>=16.x'} hasBin: true - immutable@5.1.5: - resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -11129,16 +10829,16 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + ip-address@10.7.2: + resolution: {integrity: sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==} engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} + ipaddr.js@2.5.0: + resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==} engines: {node: '>= 10'} is-alphabetical@2.0.1: @@ -11188,8 +10888,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -11216,6 +10916,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -11247,8 +10951,8 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-immutable-type@5.0.2: - resolution: {integrity: sha512-liGTvz7pbINOKvy0P4VTCEAIf8xrKJ9165xnwsS7udUyYxwDGBdQIJd+OhwxAn6Kv3pzdy1uha4oJCigzNw2xA==} + is-immutable-type@5.0.4: + resolution: {integrity: sha512-tDf0vB9dJJt/1USS2nvHJb8UsIAhs+pF6z8UZLNdhrzB+PKMrdcN45je9jhuFpaJOjJpoRhueFmFrRs5g/TNMA==} peerDependencies: eslint: '*' typescript: '>=4.7.4' @@ -11302,8 +11006,8 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + is-plain-object@5.1.0: + resolution: {integrity: sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==} engines: {node: '>=0.10.0'} is-potential-custom-element-name@1.0.1: @@ -11363,9 +11067,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -11388,8 +11089,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.40: - resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} + isbot@5.2.2: + resolution: {integrity: sha512-iQcBXcd+Rv/pkubRyGh2utW2j1oPG5hZY6TUhVPpqK4G+o3IbxpJNx04hgksjc/N7GK5pEorUxDeg31cFgEk/w==} engines: {node: '>=18'} isexe@2.0.0: @@ -11491,17 +11192,16 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} - js-beautify@1.15.4: - resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + js-beautify@2.0.3: + resolution: {integrity: sha512-cyFbh3tkPhknnTD/0bLf0T0yy2ZIbqL05mttzbt4y1Zfr7NxqXQZ62dkBLKs3oHH/lpjmDRAnciJiSUyOy8XwQ==} engines: {node: '>=14'} hasBin: true - js-cookie@3.0.7: - resolution: {integrity: sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==} - engines: {node: '>=20'} + js-cookie@3.0.8: + resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -11509,12 +11209,12 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true jsc-safe-url@0.2.4: @@ -11621,9 +11321,6 @@ packages: resolution: {integrity: sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==} hasBin: true - launch-editor@2.13.2: - resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} - launch-editor@2.14.1: resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} @@ -11640,13 +11337,13 @@ packages: webpack: optional: true - less@4.4.2: - resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} - engines: {node: '>=14'} + less@4.9.0: + resolution: {integrity: sha512-umRhrCH7fCi8Uj2RcwKjJdvUORTjeWqkdKx0LbcZvjIwsAVsnIAGcxHaqowPeBFBjQuWOeC/bve0AlpFzF/+SQ==} + engines: {node: '>=18'} hasBin: true - less@4.6.4: - resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + less@4.9.1: + resolution: {integrity: sha512-orp15PfJvvNDIqJdVWzMI9Sjpjp3VTiw3sfvbB+67LlISTEn8uVT2EdYSuyl02BLvaftv6sdk9Umnxmm5rckmg==} engines: {node: '>=18'} hasBin: true @@ -11669,78 +11366,78 @@ packages: lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} lilconfig@3.1.3: @@ -11754,8 +11451,8 @@ packages: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - linkify-it@5.0.1: - resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} listr2@9.0.5: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} @@ -11852,8 +11549,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.0: - resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -11880,19 +11577,19 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + make-dir@5.1.0: + resolution: {integrity: sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==} + engines: {node: '>=18'} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@15.0.5: - resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} + make-fetch-happen@15.0.6: + resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==} engines: {node: ^20.17.0 || >=22.9.0} makeerror@1.0.12: @@ -11902,15 +11599,15 @@ packages: resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} engines: {node: '>=0.10.0'} - markdown-it@14.2.0: - resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + markdown-it@14.3.2: + resolution: {integrity: sha512-sHHjZ5fJKlgrG4qns2YwVcdNep35h5fERrfkD2YNsb9UFk0UIHarbiTaHKVMlPuWAoiilyK8Fv/jAm11slsY7Q==} hasBin: true - markdown-link-extractor@4.0.3: - resolution: {integrity: sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==} + markdown-link-extractor@4.0.4: + resolution: {integrity: sha512-Dw9saacqF4u1EjUm3O+f0ZTBM/o7l1IrdHS8z1KSFX2coECIcJTZbltICMKx6QwHBKlzMQXgtWYnIHX71WHZMw==} - marked@17.0.6: - resolution: {integrity: sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==} + marked@18.0.13: + resolution: {integrity: sha512-xTxVzZsBFwunP6HDmtBkabUQEYArnP7/rMDGmPj9SlrKlQ4i8MdYVow+nJL0eOqwpUqhzBoTBRADGN6uYwPyOw==} engines: {node: '>= 20'} hasBin: true @@ -11957,8 +11654,8 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + mdurl@2.1.0: + resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} @@ -11967,14 +11664,12 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} engines: {node: '>= 0.8'} - memfs@4.57.2: - resolution: {integrity: sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==} - peerDependencies: - tslib: '2' + memfs@4.78.1: + resolution: {integrity: sha512-SkSlK6DZbzekBoiu0mcHUx9RRPnsBdaKQ36u8F3HvYZm/lRiD34YabQ2Xr76r+zYENzRPFKBsanAZPSl+r3Nqg==} memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -12008,80 +11703,80 @@ packages: resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} - metro-babel-transformer@0.83.7: - resolution: {integrity: sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==} + metro-babel-transformer@0.83.8: + resolution: {integrity: sha512-tnn0J5wzgTgTx2OJy3Cwr1y79bJz4eNgFQd+2HENOs5Vz6QOMnt05z7J+BedIo9wIbpEa0iN9U1nerxyvMRE9g==} engines: {node: '>=20.19.4'} metro-cache-key@0.83.3: resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} engines: {node: '>=20.19.4'} - metro-cache-key@0.83.7: - resolution: {integrity: sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==} + metro-cache-key@0.83.8: + resolution: {integrity: sha512-I38PtcjT4crS5HY9UQ8i6z8S7tJ2WewtPGr/OwS6FcLKfy5T/1hlTaFw+wozUZkEtNpR6Gc0oJuvuKCbSoSN5A==} engines: {node: '>=20.19.4'} metro-cache@0.83.3: resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} engines: {node: '>=20.19.4'} - metro-cache@0.83.7: - resolution: {integrity: sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==} + metro-cache@0.83.8: + resolution: {integrity: sha512-aogMG5WbKzW5000otNjYrS9hIoORzkCI1faPJK+vxQLaf2BorJKBBFe/jl2Tfsi1mZUglS2EBuBt8B3JB7MYDQ==} engines: {node: '>=20.19.4'} metro-config@0.83.3: resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} engines: {node: '>=20.19.4'} - metro-config@0.83.7: - resolution: {integrity: sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==} + metro-config@0.83.8: + resolution: {integrity: sha512-crNbNy+/B4tCne2+HjUshwvC57gNBQj+V9fFSy3lHH2RlKcLHib3Mil/SfTX8Pfh2fCY5pPuSu2OKa7YiadB+Q==} engines: {node: '>=20.19.4'} metro-core@0.83.3: resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} engines: {node: '>=20.19.4'} - metro-core@0.83.7: - resolution: {integrity: sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==} + metro-core@0.83.8: + resolution: {integrity: sha512-NTyOUOQaQKvQgJG9VI2ymN6KTM7gHEqkVFhkPc9bK4BsHSTz/EaXuFBXtC+wtwINLeH9tbusL/jfsSmdEmuU7A==} engines: {node: '>=20.19.4'} metro-file-map@0.83.3: resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} engines: {node: '>=20.19.4'} - metro-file-map@0.83.7: - resolution: {integrity: sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw==} + metro-file-map@0.83.8: + resolution: {integrity: sha512-+W++EUuzEXIfWQEFTWQMVThzhWbnJL4gRNJ9WSHzIAM5pT7gsprUxo9+2hrfirURm/TLvrKwhq37oCECJcDSyQ==} engines: {node: '>=20.19.4'} metro-minify-terser@0.83.3: resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} engines: {node: '>=20.19.4'} - metro-minify-terser@0.83.7: - resolution: {integrity: sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==} + metro-minify-terser@0.83.8: + resolution: {integrity: sha512-7tU0J5/c7LZaZJwTlOb1xq0NepTFvGzRxigDhZOq4jSE6g0BRHmBqe7XvLH3WcRiJNGy+eshcZr34RpMjb6mmg==} engines: {node: '>=20.19.4'} metro-resolver@0.83.3: resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} engines: {node: '>=20.19.4'} - metro-resolver@0.83.7: - resolution: {integrity: sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==} + metro-resolver@0.83.8: + resolution: {integrity: sha512-piU0NVTI9i37YztDVF5rtn9uxP3NebVT0xZM9NKJ9z0jbigrctUQksi3NoYIeJMvL6Wn2dgAehpcmmnfn+gUwA==} engines: {node: '>=20.19.4'} metro-runtime@0.83.3: resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} engines: {node: '>=20.19.4'} - metro-runtime@0.83.7: - resolution: {integrity: sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==} + metro-runtime@0.83.8: + resolution: {integrity: sha512-f7FfeM0pamq8vrvs8aO9KvIUabbUKe0WkHFpLt6Q9yIIIsORqNFwlgJeHGraOFPU7Cxqj5yLXkJu5bT1uwDXvw==} engines: {node: '>=20.19.4'} metro-source-map@0.83.3: resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} engines: {node: '>=20.19.4'} - metro-source-map@0.83.7: - resolution: {integrity: sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==} + metro-source-map@0.83.8: + resolution: {integrity: sha512-60Uor7bM+KsVewLkLCcZfkPFCbqjPDdoSmeBuT3+ye+ac80BuLWbbR8DpyxWpUqQeZPdaAT5ZqFgDIs8BNEcVA==} engines: {node: '>=20.19.4'} metro-symbolicate@0.83.3: @@ -12089,8 +11784,8 @@ packages: engines: {node: '>=20.19.4'} hasBin: true - metro-symbolicate@0.83.7: - resolution: {integrity: sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==} + metro-symbolicate@0.83.8: + resolution: {integrity: sha512-ZLrbqOqQ+m+Mpv7zo65XEXkNqVYvgUbY7tIsb9e1zSSmU/4C3D6DjaJvRHqcAdl0mkg8TI/csKooAEa5xcZNwg==} engines: {node: '>=20.19.4'} hasBin: true @@ -12098,16 +11793,16 @@ packages: resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} - metro-transform-plugins@0.83.7: - resolution: {integrity: sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==} + metro-transform-plugins@0.83.8: + resolution: {integrity: sha512-9JRPkvi+m0QH2Y/w5RjCF9mHqOUNFpMFLDDLhKUjhcKESh8Wm3HKDdHXHVldTN1lTToCIabv81nF0zyJzKEJ5g==} engines: {node: '>=20.19.4'} metro-transform-worker@0.83.3: resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} - metro-transform-worker@0.83.7: - resolution: {integrity: sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==} + metro-transform-worker@0.83.8: + resolution: {integrity: sha512-Pa2hOfhUmWpI/dmkhsLq8uGyFHK2opoEK7j/YCiRtqNSe0YzzxYguXTNgg8AMiuZfc9LPcB1AhGENS10O5wcIw==} engines: {node: '>=20.19.4'} metro@0.83.3: @@ -12115,8 +11810,8 @@ packages: engines: {node: '>=20.19.4'} hasBin: true - metro@0.83.7: - resolution: {integrity: sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==} + metro@0.83.8: + resolution: {integrity: sha512-ZbJDJCDlvv0O3QHVbhZkyP2/DtebfEoDZ3wVyYHgu6Uoy6DmmE/bis6lIDBYh+kWPuaueJDegyutPjkIBLtZDQ==} engines: {node: '>=20.19.4'} hasBin: true @@ -12261,6 +11956,10 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -12326,19 +12025,14 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - morgan@1.10.1: - resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} + morgan@1.12.1: + resolution: {integrity: sha512-tljKC0ex20AjO58Ob/eZ53JloycbVswbVNCHx6V6VLGzqt/w8dIynVGL0G8qVjNKwiA7sYSogCrN6QtJ82IV+g==} engines: {node: '>= 0.8.0'} mri@1.2.0: @@ -12363,8 +12057,8 @@ packages: resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} hasBin: true - msgpackr@1.11.12: - resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -12380,8 +12074,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -12393,6 +12087,11 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + needle@3.5.0: resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} @@ -12406,9 +12105,9 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -12437,8 +12136,8 @@ packages: sass: optional: true - ng-packagr@21.2.3: - resolution: {integrity: sha512-jGq6yu0G6KReVK0i5RYVoV9HDL0mU626HrLBu5xvc8ZJ92n/+rLrFJuXdCnkroB9um+FBTQe/or6/A/2GAKhLw==} + ng-packagr@21.2.7: + resolution: {integrity: sha512-G1LWptU48IbGQcAqW77JfPpGwga5dI+XUOsyBDD1zPuA1QeLqnQTPqV4tSkbL8WZJwwmqgttRrL89DD35p8vuQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: @@ -12456,8 +12155,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} node-fetch@2.7.0: @@ -12477,8 +12176,8 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-gyp@12.3.0: - resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} + node-gyp@12.4.0: + resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -12488,13 +12187,13 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.46: - resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + node-releases@2.0.56: + resolution: {integrity: sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==} engines: {node: '>=18'} - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + nopt@10.0.1: + resolution: {integrity: sha512-df3sBr/6ax9hSGuC3CspvLlbnX8cP5L5nZwXF8cGN8l0zSWR6BvzmQ6jPUKjvo6+/xdpkNvEcucBNUdBeeV13g==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} hasBin: true nopt@9.0.0: @@ -12584,8 +12283,8 @@ packages: resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} engines: {node: '>=20.19.4'} - ob1@0.83.7: - resolution: {integrity: sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==} + ob1@0.83.8: + resolution: {integrity: sha512-pk7el+eTOzfSKMAY4QBiiwKzegXn633JQj13y+pW5E5IdS+yV2CfDJ9Hf20K/LKy8nCrP9dAmd7XOk52OJxifA==} engines: {node: '>=20.19.4'} object-assign@4.1.1: @@ -12627,8 +12326,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} octane@0.2.16: resolution: {integrity: sha512-7jMzf0WZhu++BQD2jyzlSo7bNHRObpOsSIEsLuQ0lcNABYph+Wirs3TD0XZqApvrpVdWsLzSfdYlbI3CPJNO6w==} @@ -12711,8 +12411,8 @@ packages: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} - ora@9.4.0: - resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} + ora@9.4.1: + resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} ordered-binary@1.6.1: @@ -12721,8 +12421,8 @@ packages: outdent@0.8.0: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} oxc-parser@0.121.0: @@ -12733,9 +12433,6 @@ packages: resolution: {integrity: sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-resolver@11.19.1: - resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} - oxc-resolver@11.24.2: resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} @@ -12789,8 +12486,8 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.8: + resolution: {integrity: sha512-MitaVsCuCFIvOLLPIU7NnfrZvS9H9h7kwMUkDo+T2pEISaJD48IV9S8iIdXB7PsvvdxyYcsSTTrr90XKsbulNw==} engines: {node: '>=18'} p-retry@6.2.1: @@ -12804,14 +12501,11 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} - pacote@21.3.1: - resolution: {integrity: sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==} + pacote@21.5.1: + resolution: {integrity: sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -12930,21 +12624,21 @@ packages: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + pidtree@0.6.1: + resolution: {integrity: sha512-e0F9AOF1JMrCfBsyJOwU9lNvQ0WtXTq0j/4jk0BQ5JSI9VAybPXmDpPRw/2FQ3e5d3ZFN1mLh7jW99m/jjaptw==} engines: {node: '>=0.10'} hasBin: true - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - piscina@5.1.4: - resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} + piscina@5.2.0: + resolution: {integrity: sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==} + engines: {node: '>=20.x'} + + piscina@5.3.2: + resolution: {integrity: sha512-vv7l/mM7B9WgrhDaudIqv1x6v4LOBRYYmpWGdWushhpbCmVHp11sUB2v4hj1CAeTGXVxuZFz6xOU1RalAiPKfQ==} engines: {node: '>=20.x'} pkce-challenge@5.0.1: @@ -12958,11 +12652,11 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.1: - resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pkg-types@2.3.3: + resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} - pkijs@3.4.0: - resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} + pkijs@3.4.1: + resolution: {integrity: sha512-Oo/NZcSWccq8KyoG7gLE9fnltgHns+pNCjCAp/WmjsUySi+sX7y4z4Xqu4fVb42CDHzRPl33fjzT15V1wvcyhA==} engines: {node: '>=16.0.0'} plist@3.1.1: @@ -13069,14 +12763,14 @@ packages: peerDependencies: postcss: '>=8.0.0' - postcss-safe-parser@7.0.1: - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + postcss-safe-parser@7.1.0: + resolution: {integrity: sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} engines: {node: '>=4'} postcss-simple-vars@7.0.1: @@ -13096,12 +12790,12 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.12: - resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} postcss@8.5.6: @@ -13112,8 +12806,13 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} - preact@10.29.2: - resolution: {integrity: sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==} + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -13129,8 +12828,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.8: + resolution: {integrity: sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==} engines: {node: '>=14'} hasBin: true @@ -13150,6 +12849,9 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + probe-image-size@7.4.0: + resolution: {integrity: sha512-cdEprVtZxV+awMde9X+4jILBFYh4CARxVrQaMl4wY4YcPWbul9jntXrIW95NInBDyJwcVUP3U0T6yukN8rMBaQ==} + proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -13200,8 +12902,8 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} engines: {node: '>= 0.10'} proxy-from-env@2.1.0: @@ -13211,8 +12913,8 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - publint@0.3.21: - resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} + publint@0.3.24: + resolution: {integrity: sha512-9zS56KrKBoqi5Qt8h92uMP8TTM9AYZSgnmCo4u2priMqkOZvQnTsziZ2p5LJ2ywbYkAjoCDp2jda9u4cgFefIw==} engines: {node: '>=18'} hasBin: true @@ -13239,16 +12941,16 @@ packages: pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - pvutils@1.1.5: - resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + pvutils@1.2.0: + resolution: {integrity: sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==} engines: {node: '>=16.0.0'} qrcode-terminal@0.11.0: resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -13271,6 +12973,10 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + raw-body@2.5.3: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} @@ -13291,11 +12997,6 @@ packages: peerDependencies: react: ^19.1.0 - react-dom@19.3.0: - resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} - peerDependencies: - react: ^19.3.0 - react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -13314,8 +13015,8 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.6: - resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} + react-is@19.3.0: + resolution: {integrity: sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==} react-native-gesture-handler@2.28.0: resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==} @@ -13406,15 +13107,15 @@ packages: '@types/react': optional: true - react-router-dom@6.30.3: - resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} + react-router-dom@6.30.4: + resolution: {integrity: sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.30.3: - resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} + react-router@6.30.4: + resolution: {integrity: sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -13445,10 +13146,6 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} - react@19.3.0: - resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} - engines: {node: '>=0.10.0'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -13464,8 +13161,8 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} redent@3.0.0: @@ -13503,8 +13200,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.3: + resolution: {integrity: sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==} hasBin: true remark-frontmatter@4.0.1: @@ -13656,8 +13353,8 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@4.60.4: - resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + rollup@4.63.4: + resolution: {integrity: sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -13672,10 +13369,6 @@ packages: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -13728,8 +13421,8 @@ packages: webpack: optional: true - sass@1.100.0: - resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==} + sass@1.104.1: + resolution: {integrity: sha512-yDA+1aIG3EHgN4V/BvuhCvu61FF6hEd4e+9DxikUm9U0CAGuvdIZ/UYy7qbOxjhbbWQraoyLlMuzdRGOSV5Bmw==} engines: {node: '>=20.19.0'} hasBin: true @@ -13738,8 +13431,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} saxes@6.0.0: @@ -13749,11 +13442,8 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - scheduler@0.28.0: - resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + schema-utils@4.5.0: + resolution: {integrity: sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==} engines: {node: '>= 10.13.0'} scule@1.3.0: @@ -13766,10 +13456,6 @@ packages: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -13794,13 +13480,13 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true - semver@7.8.4: - resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -13816,18 +13502,28 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} - serialize-javascript@7.0.5: - resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + serialize-javascript@7.1.1: + resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==} engines: {node: '>=20.0.0'} - seroval-plugins@1.5.4: - resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + seroval-plugins@1.5.6: + resolution: {integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval-plugins@1.6.7: + resolution: {integrity: sha512-4Nk35ttD3DTDJW4hgw5StsVAPeU6qnDFnULAouw6tQ7oLTV/ICXrWpsXo2EE52eSP2joUMazbVf52mFEcADqRw==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + seroval@1.5.6: + resolution: {integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==} + engines: {node: '>=10'} + + seroval@1.6.7: + resolution: {integrity: sha512-AeDcLh0yO2SFm9W71essgnSzLV9DI8ZH0x0knXn2DMnUZj728mpLbxjlbB6IqKCmqh8JA3cEqRyGoNkt584JcQ==} engines: {node: '>=10'} serve-index@1.9.2: @@ -13889,52 +13585,56 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.4: - resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} engines: {node: '>= 0.4'} - sherif-darwin-arm64@1.11.1: - resolution: {integrity: sha512-VoMrUv5QY6hQ2rByNa3AAhr/KGQsCb6pvAUNKa1iCh1jvnY836hQr6zNBw9hYCDkVv6t9sITFGJljwdTCQD4xw==} + sherif-darwin-arm64@1.13.0: + resolution: {integrity: sha512-k38jpGpZIEWS5dpSRLSvVi53LZuGO3hDqB88jgdLMDN11LZM6yTDcP0GytnQ8OpE6Br/Js6bDCLsdWDarZdV9g==} cpu: [arm64] os: [darwin] - sherif-darwin-x64@1.11.1: - resolution: {integrity: sha512-7j3yOCBkvVbltVT3lXoiazGfG2nb36FteYT5VZPEBSf8sTn1pPTScukAQ1Fdl+MphadGyici7XlRbDrtZ/wnvA==} + sherif-darwin-x64@1.13.0: + resolution: {integrity: sha512-W2bOj0Ya9A0fPSWzbeaaNg2RRRr48l2lArN8sGbfc9SZuJSJWXcdWkTVC3sEUiiXwpxNeLY/CsGNyQz5Izbfig==} cpu: [x64] os: [darwin] - sherif-linux-arm64-musl@1.11.1: - resolution: {integrity: sha512-DCf87RFqBh8ZrYgu3y+fv0x4kFn/np84m2jAEgygznwozH/VCfrXbHFVdhxW7762JCYkXbHO9dUj/ff5fkvkvw==} + sherif-linux-arm64-musl@1.13.0: + resolution: {integrity: sha512-9IDAlwYT5Ay2nex9Da3R98cvnPKVveT57i7pJXnnY/DC90qdqqz6Twlp7STRv+7qo4k4ES+2J9zQ0k6SDe888A==} cpu: [arm64] os: [linux] + libc: [musl] - sherif-linux-arm64@1.11.1: - resolution: {integrity: sha512-vCZFS7RxhZ/8g9bdj3UPNVPTcZiKiWigW+FIlVQEUKEKfG0MfSOMBJqEWPVVUniyJa3rdIxtmZKSdWkG0e1x3w==} + sherif-linux-arm64@1.13.0: + resolution: {integrity: sha512-Z94SgKNClWarVJj4LsayOmL7zccCUAvy3ugZnIO860FoJofh812KAyF8CdWrSho8qfmmoAzNcqSSc1OZh7+ckQ==} cpu: [arm64] os: [linux] + libc: [glibc] - sherif-linux-x64-musl@1.11.1: - resolution: {integrity: sha512-f8xitqXdHObUFPZo4QVbz3o30Y4+gHA3B5ZobsOWocnSfJBaUGutBzJsUsjG6w2tccSRn6+mugiMUGKIbIPZmQ==} + sherif-linux-x64-musl@1.13.0: + resolution: {integrity: sha512-2L+A8jF5ylojFwl7eAePR1h3Bzx24IcMgEoWObXgD70k6xF+GOJaM/n+q4MQ9YDntAKbJfMDr6ETjt6Bt/hosA==} cpu: [x64] os: [linux] + libc: [musl] - sherif-linux-x64@1.11.1: - resolution: {integrity: sha512-9t+p1X3SyhU75BrJNHBbj9i/aQxHC/sF+Mdkf17V5AlokCznFgYKQUXq5EVmcmRDDhDl69RMzCTLD95EBqUSYA==} + sherif-linux-x64@1.13.0: + resolution: {integrity: sha512-xGB9iiet8l/i8/YLZje8icpZyt4pVgoxB2+SoC6JCB8iDWsCVSuixebwX2t9yeGqXBXO1kphaW0TLf8Tmwy9JQ==} cpu: [x64] os: [linux] + libc: [glibc] - sherif-windows-arm64@1.11.1: - resolution: {integrity: sha512-Dnffgcyz9zLq/8UTY2REchJzRJWcWAuMWo5Vl5O17IZGkhl71dwa7/Vi2wC3EQd8WAVK/O82yArOYggWA0dj5w==} + sherif-windows-arm64@1.13.0: + resolution: {integrity: sha512-jHzJ/EcG4HuNLf/3AEDzbRkAofLPBHRJKJJMjAosampAe9861atu4q+Z2IZ1/sHg5oVnNgaNg/Xc5DDhGcQ/3w==} cpu: [arm64] os: [win32] - sherif-windows-x64@1.11.1: - resolution: {integrity: sha512-xjfYUL/IQ65DwHkRsWIxiZWtglKtL5/E3UHpnLwOui3jqW1V2K88SMct415dnlBQiL3U9VEIVUo1i+KmToOBgQ==} + sherif-windows-x64@1.13.0: + resolution: {integrity: sha512-KyMqQY62Eb3O+wePlw433mH2XBPVPLXdDjWPneg9pB6jeK0B1sgEzM2yks+aAP5asZ1Y8Q7C7iR7ZtbJKdsAtA==} cpu: [x64] os: [win32] - sherif@1.11.1: - resolution: {integrity: sha512-HBFce8NGaPuWPg5NXb6+aI7hJQFjTilhtbrgo+Y/BvtGlkuJAzLnkmC8nyD+p3v7oIAq4KQeA8qySKGga28xZg==} + sherif@1.13.0: + resolution: {integrity: sha512-Ld2nUOlwW1nmYDA2Q/5o7SC8WcCzVS7XjImmzW4a4z1o8DXJnt+2xYLvI42N5UYlNb/EevPahdC/XxIP6C38TQ==} hasBin: true side-channel-list@1.0.1: @@ -13949,8 +13649,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -14014,12 +13714,12 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.9: - resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + socks@2.8.10: + resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - solid-js@1.9.13: - resolution: {integrity: sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ==} + solid-js@1.9.15: + resolution: {integrity: sha512-EeiY2xfpZJqPLjXspVEKjAII4yv8NyG//NxZ3IpOFHdUNnnTyL0uJOeS9LWGvA7cFCz5y94cjFwYlmw5Luncsg==} solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} @@ -14066,8 +13766,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdx-license-ids@3.0.24: + resolution: {integrity: sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==} spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -14083,8 +13783,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - srvx@0.11.16: - resolution: {integrity: sha512-bp07zRuycfTY43IjAvvTFnmnJi8ikW0VFiHwOhhYcVW/L4xQ1XY4PAd4Nuum1rsA17C39zL7x+CDhrn5AL32Rw==} + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} engines: {node: '>=20.16.0'} hasBin: true @@ -14121,6 +13821,11 @@ packages: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} + standard-navigation@0.0.8: + resolution: {integrity: sha512-TyVbo7INUDWtsUWDFn8RR7kwR87U0S4xHfLfbbnyeC581TmmyqQ+eM+nPw8rQTSD8QitRVcYfPaSHr/QJiUy1g==} + peerDependencies: + react: '*' + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -14144,6 +13849,9 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} + stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -14176,23 +13884,23 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.1: - resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} engines: {node: '>=20'} - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + string.prototype.matchall@4.1.0: + resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -14309,36 +14017,36 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.4.8: - resolution: {integrity: sha512-67adfgBox5eNSNIvIIwgFizKGdcRrGpiMoNO2obHcYuLz7iTa8Xgm/NGU3ntMFnNm8K1grFOIG6HhMLX/vcN8w==} + svelte-check@4.7.6: + resolution: {integrity: sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: '>=5.0.0' + typescript: ^5.0.0 || ^6.0.0 - svelte2tsx@0.7.55: - resolution: {integrity: sha512-JWzgeM3lqySRNfqcsesvVEh8LhTWBxQJ9RMjzJ+VepdmXtVnNd0SbtGctG6+/fbHq0N6mhwSd823gszw9JHeGQ==} + svelte2tsx@0.7.61: + resolution: {integrity: sha512-EpQ/+UHITBULeUojx/LLD3uTYasZXcX1BrqlrzfLUnT9vdUhaOWK59a3ryWcFU8L0sY1SP+gRhJ2Beiis98+qw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 - svelte@5.55.9: - resolution: {integrity: sha512-fTjjT8cHLDwigcu2j3pv7Jq04LklXevPB8uBgyHNiTXv+RMNvVnrjS4UEYrLMkhuq1vpCodHjiW+z/95SDs/fg==} + svelte@5.57.1: + resolution: {integrity: sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==} engines: {node: '>=18'} symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -14349,16 +14057,16 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - tar@7.5.15: - resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} engines: {node: '>=18'} terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} - terser-webpack-plugin@5.6.0: - resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==} + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@minify-html/node': '*' @@ -14405,8 +14113,8 @@ packages: engines: {node: '>=10'} hasBin: true - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + terser@5.51.2: + resolution: {integrity: sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==} engines: {node: '>=10'} hasBin: true @@ -14425,8 +14133,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@2.6.0: - resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} + thingies@2.6.1: + resolution: {integrity: sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -14451,10 +14159,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -14471,15 +14175,15 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} - tldts-core@7.4.0: - resolution: {integrity: sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ==} + tldts-core@7.4.13: + resolution: {integrity: sha512-mbYsrih5FRtGxs3Usvl/PqwJsNpp+jsmrdFviiK02teHDG0/HebBG/pqCylje3kzgXYzuLoHJF/0mz9W53t8Xg==} - tldts@7.4.0: - resolution: {integrity: sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg==} + tldts@7.4.13: + resolution: {integrity: sha512-iHtaIWWIbMDkCeJdTBzZFGgbluE5J+oHlb2g7+oAz1S1gpuVpabRZdQyd471Vl8UUkcz2vXSL8xZH2kyCe8tfA==} hasBin: true tmp@0.2.7: @@ -14500,8 +14204,8 @@ packages: toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} engines: {node: '>=16'} tr46@0.0.3: @@ -14541,9 +14245,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@21.0.1: - resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -14664,12 +14365,12 @@ packages: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + typed-array-byte-offset@1.0.5: + resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typed-assert@1.0.9: @@ -14693,8 +14394,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x - typescript-eslint@8.59.4: - resolution: {integrity: sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==} + typescript-eslint@8.70.0: + resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -14756,19 +14457,15 @@ packages: unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@6.26.0: - resolution: {integrity: sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==} + undici@6.28.1: + resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==} engines: {node: '>=18.17'} - undici@7.24.4: - resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} - engines: {node: '>=20.18.1'} - - undici@7.26.0: - resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} + undici@7.29.1: + resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} unicode-canonical-property-names-ecmascript@2.0.1: @@ -14834,9 +14531,41 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@3.0.0: - resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rsbuild/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rsbuild/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} @@ -14851,8 +14580,8 @@ packages: synckit: optional: true - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -14912,8 +14641,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -14945,8 +14674,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - valibot@1.4.1: - resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==} + valibot@1.5.0: + resolution: {integrity: sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -15005,12 +14734,12 @@ packages: peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - vite-plugin-solid@2.11.12: - resolution: {integrity: sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==} + vite-plugin-solid@2.11.14: + resolution: {integrity: sha512-7ZVBt8rpoyqmlwin2kRIUveaHoF6/kulY7gsnD+qFh4nS29V4OPAnw+ojoAspXIjObiL9o1xh9a/nTuYHm02Rw==} peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.0.0 || ^7.0.0 solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 peerDependenciesMeta: '@testing-library/jest-dom': optional: true @@ -15059,48 +14788,8 @@ packages: terser: optional: true - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vite@7.3.3: - resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -15147,16 +14836,16 @@ packages: vite: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -15178,11 +14867,11 @@ packages: vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} - vue-component-type-helpers@3.3.2: - resolution: {integrity: sha512-l4Z2Y34m7nFMlx8vrslJaVtXxUpzgDMSESC7TakG/c5kwjYT/do+E0NcT2/vWDzaoIhsShg/2OKwX7Q4nbzC0g==} + vue-component-type-helpers@3.3.11: + resolution: {integrity: sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -15195,8 +14884,8 @@ packages: '@vue/composition-api': optional: true - vue-eslint-parser@10.4.0: - resolution: {integrity: sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==} + vue-eslint-parser@10.4.1: + resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -15207,8 +14896,8 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@3.5.34: - resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + vue@3.5.43: + resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -15233,6 +14922,10 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} @@ -15269,8 +14962,8 @@ packages: webpack: optional: true - webpack-dev-server@5.2.3: - resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} + webpack-dev-server@5.2.6: + resolution: {integrity: sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==} engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: @@ -15286,8 +14979,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -15313,8 +15006,8 @@ packages: webpack-cli: optional: true - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + websocket-driver@0.7.5: + resolution: {integrity: sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==} engines: {node: '>=0.8.0'} websocket-extensions@0.1.4: @@ -15360,8 +15053,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.24: + resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==} engines: {node: '>= 0.4'} which@2.0.2: @@ -15422,8 +15115,8 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@6.2.4: - resolution: {integrity: sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==} + ws@6.2.6: + resolution: {integrity: sha512-XTrf1gv7kXoVf1hbC3PAyAiPgR8Wz1blcrYIjEsUmr08BLksT41R8KbjmS9408C2ERx7v1JDLD/BkpLEttjfKA==} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -15433,8 +15126,8 @@ packages: utf-8-validate: optional: true - ws@7.5.11: - resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -15445,8 +15138,8 @@ packages: utf-8-validate: optional: true - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -15536,10 +15229,18 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + yargs@18.0.0: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -15552,12 +15253,12 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zimmerframe@1.1.4: - resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zimmerframe@1.1.5: + resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==} zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} @@ -15576,8 +15277,8 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} zone.js@0.15.1: resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} @@ -15587,7 +15288,7 @@ packages: snapshots: - '@0no-co/graphql.web@1.2.0': {} + '@0no-co/graphql.web@1.3.4': {} '@acemir/cssom@0.9.31': {} @@ -15682,195 +15383,99 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: magic-string: 0.30.21 - obug: 2.1.1 - oxc-parser: 0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - tinyglobby: 0.2.16 - ts-morph: 21.0.1 + obug: 2.2.1 + oxc-parser: 0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) + tinyglobby: 0.2.17 optionalDependencies: - '@angular-devkit/build-angular': 21.2.12(900e8a9f9887169b6aa0e95c3e7c738a) - '@angular/build': 21.2.12(4f977d91d8c751136029ad7496910326) - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + '@angular-devkit/build-angular': 21.2.24(0d9bbff8c972d2704ece981740980061) + '@angular/build': 21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@analogjs/vitest-angular@2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.12(chokidar@5.0.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))(zone.js@0.15.1)': + '@analogjs/vitest-angular@2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1)': dependencies: - '@analogjs/vite-plugin-angular': 2.6.2(@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a))(@angular/build@21.2.12(4f977d91d8c751136029ad7496910326))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.12(chokidar@5.0.0) - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + '@analogjs/vite-plugin-angular': 2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.24(chokidar@5.0.0) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) optionalDependencies: zone.js: 0.15.1 - '@angular-devkit/architect@0.2102.12(chokidar@5.0.0)': - dependencies: - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - rxjs: 7.8.2 - transitivePeerDependencies: - - chokidar - - '@angular-devkit/build-angular@21.2.12(0a64f068acf4e67180f9e17cce59d00c)': + '@angular-devkit/architect@0.2102.24(chokidar@5.0.0)': dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(53e67d10389c5d4e7144ebf9cdfd7914) - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/generator': 7.29.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/runtime': 7.29.2 - '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.12(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - ansi-colors: 4.1.3 - autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - esbuild-wasm: 0.27.3 - http-proxy-middleware: 3.0.5(supports-color@8.1.1) - istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) - jsonc-parser: 3.3.1 - karma-source-map-support: 1.4.0 - less: 4.4.2 - less-loader: 12.3.1(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - open: 11.0.0 - ora: 9.3.0 - picomatch: 4.0.4 - piscina: 5.1.4 - postcss: 8.5.12 - postcss-loader: 8.2.0(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - resolve-url-loader: 5.0.0 + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) rxjs: 7.8.2 - sass: 1.97.3 - sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - source-map-support: 0.5.21 - terser: 5.46.0 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - tslib: 2.8.1 - typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-dev-server: 5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - esbuild: 0.27.3 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - - '@angular/compiler' - - '@emnapi/core' - - '@emnapi/runtime' - - '@minify-html/node' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@swc/html' - - '@types/node' - - bufferutil - chokidar - - clean-css - - cssnano - - csso - - debug - - html-minifier-terser - - html-webpack-plugin - - jiti - - lightningcss - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - tsx - - uglify-js - - utf-8-validate - - vitest - - webpack-cli - - yaml - '@angular-devkit/build-angular@21.2.12(89c4ebb909596ef91f827350c543afbb)': + '@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(c1f9d3b3ae588aca96aeb28ea1ab8c76) - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular-devkit/build-webpack': 0.2102.24(chokidar@5.0.0)(webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) + '@angular/build': 21.2.24(9bc4a77d2197aad76d7942a6bc8ab388) + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.1 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/preset-env': 7.29.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/runtime': 7.29.2 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.12(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + '@ngtools/webpack': 21.2.24(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) ansi-colors: 4.1.3 - autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - esbuild-wasm: 0.27.3 - http-proxy-middleware: 3.0.5(supports-color@8.1.1) + autoprefixer: 10.4.27(postcss@8.5.23) + babel-loader: 10.0.0(@babel/core@7.29.7(supports-color@7.2.0))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + browserslist: 4.29.0 + copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + esbuild-wasm: 0.28.1 + http-proxy-middleware: 3.0.7(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 - less: 4.4.2 - less-loader: 12.3.1(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + less: 4.9.0(supports-color@8.1.1) + less-loader: 12.3.1(less@4.9.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) open: 11.0.0 ora: 9.3.0 picomatch: 4.0.4 - piscina: 5.1.4 - postcss: 8.5.12 - postcss-loader: 8.2.0(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + piscina: 5.2.0 + postcss: 8.5.23 + postcss-loader: 8.2.0(postcss@8.5.23)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 sass: 1.97.3 - sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) source-map-support: 0.5.21 terser: 5.46.0 tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-dev-server: 5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) + webpack-dev-middleware: 7.4.5(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - esbuild: 0.27.3 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + esbuild: 0.28.1 + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - '@angular/compiler' - '@emnapi/core' @@ -15902,70 +15507,71 @@ snapshots: - vitest - webpack-cli - yaml + optional: true - '@angular-devkit/build-angular@21.2.12(900e8a9f9887169b6aa0e95c3e7c738a)': + '@angular-devkit/build-angular@21.2.24(6c0c725f651b251987e889e8997415aa)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(80e65ab7121f87acdd97841bae7129f6) - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular-devkit/build-webpack': 0.2102.24(chokidar@5.0.0)(webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) + '@angular/build': 21.2.24(ea0945a71b12a32ca7443e60b5f658e1) + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.1 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/preset-env': 7.29.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/runtime': 7.29.2 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.12(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + '@ngtools/webpack': 21.2.24(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) ansi-colors: 4.1.3 - autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - esbuild-wasm: 0.27.3 - http-proxy-middleware: 3.0.5(supports-color@8.1.1) + autoprefixer: 10.4.27(postcss@8.5.23) + babel-loader: 10.0.0(@babel/core@7.29.7(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + browserslist: 4.29.0 + copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + esbuild-wasm: 0.28.1 + http-proxy-middleware: 3.0.7(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 - less: 4.4.2 - less-loader: 12.3.1(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + less: 4.9.0(supports-color@8.1.1) + less-loader: 12.3.1(less@4.9.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) open: 11.0.0 ora: 9.3.0 picomatch: 4.0.4 - piscina: 5.1.4 - postcss: 8.5.12 - postcss-loader: 8.2.0(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + piscina: 5.2.0 + postcss: 8.5.23 + postcss-loader: 8.2.0(postcss@8.5.23)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 sass: 1.97.3 - sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) source-map-support: 0.5.21 terser: 5.46.0 tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-dev-server: 5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) + webpack-dev-middleware: 7.4.5(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - esbuild: 0.27.3 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + esbuild: 0.28.1 + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - '@angular/compiler' - '@emnapi/core' @@ -15997,71 +15603,70 @@ snapshots: - vitest - webpack-cli - yaml - optional: true - '@angular-devkit/build-angular@21.2.12(cf7781de8ce612d1f2e4c3fa7552b53d)': + '@angular-devkit/build-angular@21.2.24(98d149fd09f03ab518ddd9685edd4297)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular/build': 21.2.12(72c533dc1f53c8a7936ec4dfca1acb68) - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular-devkit/build-webpack': 0.2102.24(chokidar@5.0.0)(webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) + '@angular/build': 21.2.24(bdfb25ca84d887a4495df23943296fae) + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.1 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/preset-env': 7.29.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/runtime': 7.29.2 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.12(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + '@ngtools/webpack': 21.2.24(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) ansi-colors: 4.1.3 - autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - esbuild-wasm: 0.27.3 - http-proxy-middleware: 3.0.5(supports-color@8.1.1) + autoprefixer: 10.4.27(postcss@8.5.23) + babel-loader: 10.0.0(@babel/core@7.29.7(supports-color@7.2.0))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + browserslist: 4.29.0 + copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + css-loader: 7.1.3(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + esbuild-wasm: 0.28.1 + http-proxy-middleware: 3.0.7(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 - less: 4.4.2 - less-loader: 12.3.1(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + less: 4.9.0(supports-color@8.1.1) + less-loader: 12.3.1(less@4.9.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) open: 11.0.0 ora: 9.3.0 picomatch: 4.0.4 - piscina: 5.1.4 - postcss: 8.5.12 - postcss-loader: 8.2.0(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + piscina: 5.2.0 + postcss: 8.5.23 + postcss-loader: 8.2.0(postcss@8.5.23)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 sass: 1.97.3 - sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + sass-loader: 16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) source-map-support: 0.5.21 terser: 5.46.0 tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-dev-server: 5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) + webpack-dev-middleware: 7.4.5(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack-subresource-integrity: 5.1.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - esbuild: 0.27.3 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + esbuild: 0.28.1 + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - '@angular/compiler' - '@emnapi/core' @@ -16094,16 +15699,16 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.2102.12(chokidar@5.0.0)(webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': + '@angular-devkit/build-webpack@0.2102.24(chokidar@5.0.0)(webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23))': dependencies: - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) rxjs: 7.8.2 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-server: 5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) + webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) transitivePeerDependencies: - chokidar - '@angular-devkit/core@21.2.12(chokidar@5.0.0)': + '@angular-devkit/core@21.2.24(chokidar@5.0.0)': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) @@ -16114,9 +15719,9 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics@21.2.12(chokidar@5.0.0)': + '@angular-devkit/schematics@21.2.24(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 ora: 9.3.0 @@ -16124,25 +15729,25 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))': + '@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))': dependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@21.2.12(4f977d91d8c751136029ad7496910326)': + '@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular/compiler': 21.2.14 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular/compiler': 21.2.23 + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@inquirer/confirm': 5.1.21(@types/node@24.13.6) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) beasties: 0.4.1 - browserslist: 4.28.2 - esbuild: 0.27.3 + browserslist: 4.29.0 + esbuild: 0.28.1 https-proxy-agent: 7.0.6(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 @@ -16151,25 +15756,25 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.1.4 - rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + piscina: 5.2.0 + rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) sass: 1.97.3 semver: 7.7.4 source-map-support: 0.5.21 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + undici: 7.29.1 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.6.4 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.9.1(supports-color@8.1.1) lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.15 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.28 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16186,20 +15791,20 @@ snapshots: - yaml optional: true - '@angular/build@21.2.12(53e67d10389c5d4e7144ebf9cdfd7914)': + '@angular/build@21.2.24(9bc4a77d2197aad76d7942a6bc8ab388)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular/compiler': 21.2.14 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular/compiler': 21.2.23 + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) + '@inquirer/confirm': 5.1.21(@types/node@24.13.6) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) beasties: 0.4.1 - browserslist: 4.28.2 - esbuild: 0.27.3 + browserslist: 4.29.0 + esbuild: 0.28.1 https-proxy-agent: 7.0.6(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 @@ -16208,25 +15813,25 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.1.4 - rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + piscina: 5.2.0 + rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) sass: 1.97.3 semver: 7.7.4 source-map-support: 0.5.21 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1) + undici: 7.29.1 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.4.2 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.9.0(supports-color@8.1.1) lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.23 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16241,21 +15846,22 @@ snapshots: - terser - tsx - yaml + optional: true - '@angular/build@21.2.12(72c533dc1f53c8a7936ec4dfca1acb68)': + '@angular/build@21.2.24(bdfb25ca84d887a4495df23943296fae)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular/compiler': 21.2.14 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular/compiler': 21.2.23 + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1)) + '@inquirer/confirm': 5.1.21(@types/node@24.13.6) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) beasties: 0.4.1 - browserslist: 4.28.2 - esbuild: 0.27.3 + browserslist: 4.29.0 + esbuild: 0.28.1 https-proxy-agent: 7.0.6(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 @@ -16264,25 +15870,25 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.1.4 - rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + piscina: 5.2.0 + rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) sass: 1.97.3 semver: 7.7.4 source-map-support: 0.5.21 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.1) + undici: 7.29.1 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.4.2 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.9.0(supports-color@8.1.1) lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.23 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16298,20 +15904,20 @@ snapshots: - tsx - yaml - '@angular/build@21.2.12(80e65ab7121f87acdd97841bae7129f6)': + '@angular/build@21.2.24(ea0945a71b12a32ca7443e60b5f658e1)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular/compiler': 21.2.14 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular/compiler': 21.2.23 + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@inquirer/confirm': 5.1.21(@types/node@24.13.6) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.23))(terser@5.46.0)(yaml@2.9.1)) beasties: 0.4.1 - browserslist: 4.28.2 - esbuild: 0.27.3 + browserslist: 4.29.0 + esbuild: 0.28.1 https-proxy-agent: 7.0.6(supports-color@8.1.1) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) jsonc-parser: 3.3.1 @@ -16320,25 +15926,25 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.1.4 - rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + piscina: 5.2.0 + rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) sass: 1.97.3 semver: 7.7.4 source-map-support: 0.5.21 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + undici: 7.29.1 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.23))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.4.2 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.9.0(supports-color@8.1.1) lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.23 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16353,80 +15959,23 @@ snapshots: - terser - tsx - yaml - optional: true - '@angular/build@21.2.12(c1f9d3b3ae588aca96aeb28ea1ab8c76)': + '@angular/cli@21.2.24(@types/node@24.13.6)(chokidar@5.0.0)(supports-color@8.1.1)': dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular/compiler': 21.2.14 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) - beasties: 0.4.1 - browserslist: 4.28.2 - esbuild: 0.27.3 - https-proxy-agent: 7.0.6(supports-color@8.1.1) - istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) + '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.24(chokidar@5.0.0) + '@inquirer/prompts': 7.10.1(@types/node@24.13.6) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@24.13.6))(@types/node@24.13.6)(listr2@9.0.5) + '@modelcontextprotocol/sdk': 1.30.0(supports-color@8.1.1)(zod@4.3.6) + '@schematics/angular': 21.2.24(chokidar@5.0.0) + '@yarnpkg/lockfile': 1.1.0 + algoliasearch: 5.48.1 + ini: 6.0.0 jsonc-parser: 3.3.1 listr2: 9.0.5 - magic-string: 0.30.21 - mrmime: 2.0.1 - parse5-html-rewriting-stream: 8.0.0 - picomatch: 4.0.4 - piscina: 5.1.4 - rolldown: 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - sass: 1.97.3 - semver: 7.7.4 - source-map-support: 0.5.21 - tinyglobby: 0.2.15 - tslib: 2.8.1 - typescript: 5.9.3 - undici: 7.24.4 - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) - watchpack: 2.5.1 - optionalDependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.4.2 - lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - '@types/node' - - chokidar - - jiti - - lightningcss - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@angular/cli@21.2.12(@types/node@24.12.4)(chokidar@5.0.0)(supports-color@8.1.1)': - dependencies: - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.12(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@24.12.4) - '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@24.12.4))(@types/node@24.12.4)(listr2@9.0.5) - '@modelcontextprotocol/sdk': 1.26.0(supports-color@8.1.1)(zod@4.3.6) - '@schematics/angular': 21.2.12(chokidar@5.0.0) - '@yarnpkg/lockfile': 1.1.0 - algoliasearch: 5.48.1 - ini: 6.0.0 - jsonc-parser: 3.3.1 - listr2: 9.0.5 - npm-package-arg: 13.0.2 - pacote: 21.3.1(supports-color@8.1.1) + npm-package-arg: 13.0.2 + pacote: 21.5.1(supports-color@8.1.1) parse5-html-rewriting-stream: 8.0.0 semver: 7.7.4 yargs: 18.0.0 @@ -16437,94 +15986,94 @@ snapshots: - chokidar - supports-color - '@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + '@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3)': + '@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@angular/compiler': 21.2.14 - '@babel/core': 7.29.0(supports-color@8.1.1) - '@jridgewell/sourcemap-codec': 1.5.5 + '@angular/compiler': 21.2.23 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@jridgewell/sourcemap-codec': 1.6.0 chokidar: 5.0.0 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.8.1 + semver: 7.8.5 tslib: 2.8.1 - yargs: 18.0.0 + yargs: 18.2.0 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@angular/compiler@21.2.14': + '@angular/compiler@21.2.23': dependencies: tslib: 2.8.1 - '@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)': + '@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.2.14 + '@angular/compiler': 21.2.23 zone.js: 0.15.1 - '@angular/forms@21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/forms@21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/platform-browser-dynamic@21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.14)(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))': + '@angular/platform-browser-dynamic@21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.2.23)(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': 21.2.14 - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': 21.2.23 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) tslib: 2.8.1 - '@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))': + '@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/animations': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/router@21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/router@21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@ark/schema@0.56.0': + '@ark/schema@0.56.2': dependencies: - '@ark/util': 0.56.0 + '@ark/util': 0.56.2 - '@ark/util@0.56.0': {} + '@ark/util@0.56.2': {} '@asamuzakjp/css-color@4.1.2': dependencies: - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.5.0 + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-color-parser': 4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 + lru-cache: 11.5.3 '@asamuzakjp/dom-selector@6.8.1': dependencies: '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 + bidi-js: 1.1.0 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.0 + lru-cache: 11.5.3 '@asamuzakjp/nwsapi@2.3.9': {} @@ -16532,12 +16081,6 @@ snapshots: dependencies: '@babel/highlight': 7.25.9 - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -16546,37 +16089,17 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0(supports-color@8.1.1)': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.29.7(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@7.2.0) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@7.2.0) @@ -16589,14 +16112,14 @@ snapshots: '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -16608,16 +16131,16 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.7': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -16633,33 +16156,20 @@ snapshots: '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.29.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@7.2.0) @@ -16668,7 +16178,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -16681,14 +16191,14 @@ snapshots: '@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 @@ -16700,9 +16210,9 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3(supports-color@8.1.1) @@ -16726,35 +16236,26 @@ snapshots: '@babel/helper-member-expression-to-functions@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.7(supports-color@7.2.0) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -16763,7 +16264,7 @@ snapshots: '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@7.2.0) + '@babel/traverse': 7.29.8(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -16772,7 +16273,7 @@ snapshots: '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16781,22 +16282,22 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-wrap-function': 7.29.7(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16805,16 +16306,7 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-wrap-function': 7.29.7(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16823,7 +16315,7 @@ snapshots: '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16832,43 +16324,45 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-string-parser@8.0.0-rc.6': {} + '@babel/helper-string-parser@8.0.6': {} '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-identifier@8.0.0-rc.3': {} + '@babel/helper-validator-identifier@8.0.6': {} + '@babel/helper-validator-option@7.29.7': {} '@babel/helper-wrap-function@7.29.7(supports-color@8.1.1)': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/highlight@7.25.9': dependencies: @@ -16877,46 +16371,85 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.29.7': + '@babel/parser@7.29.9': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/parser@8.0.0-rc.3': dependencies: '@babel/types': 8.0.0-rc.3 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/parser@8.0.6': + dependencies: + '@babel/types': 8.0.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16950,9 +16483,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: @@ -16994,14 +16531,19 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17079,15 +16621,21 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17095,21 +16643,21 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17118,25 +16666,25 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17149,14 +16697,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17164,10 +16717,10 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -17180,10 +16733,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -17196,15 +16749,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17216,13 +16769,13 @@ snapshots: '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/template': 7.29.7 @@ -17232,11 +16785,11 @@ snapshots: '@babel/helper-plugin-utils': 7.29.7 '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17244,48 +16797,83 @@ snapshots: dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17299,9 +16887,9 @@ snapshots: '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: @@ -17315,12 +16903,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17329,18 +16917,23 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17348,9 +16941,9 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17358,23 +16951,28 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -17395,28 +16993,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-modules-systemjs@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.29.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17425,14 +17041,19 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17440,9 +17061,9 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17450,14 +17071,14 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17468,21 +17089,29 @@ snapshots: '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17490,9 +17119,9 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: @@ -17506,9 +17135,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17516,10 +17145,10 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -17532,11 +17161,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -17550,9 +17179,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17567,21 +17201,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': - dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': - dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -17594,7 +17218,7 @@ snapshots: '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -17604,35 +17228,58 @@ snapshots: '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.29.7 + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -17649,9 +17296,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17659,15 +17306,15 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-spread@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-spread@7.29.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 @@ -17675,9 +17322,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17685,9 +17332,9 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17695,12 +17342,17 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': + '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-annotate-as-pure': 7.29.7 @@ -17711,7 +17363,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 @@ -17722,21 +17374,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': @@ -17745,93 +17408,182 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-modules-systemjs': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@7.2.0)) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + core-js-compat: 3.50.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/preset-env@7.29.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1)': + '@babel/preset-env@7.29.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/compat-data': 7.29.7 - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.0(supports-color@8.1.1)) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0(supports-color@8.1.1)) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - core-js-compat: 3.49.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-modules-systemjs': 7.29.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@8.1.1)) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + core-js-compat: 3.50.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0(supports-color@8.1.1))': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.8 + esutils: 2.0.3 + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 esutils: 2.0.3 '@babel/preset-react@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': @@ -17853,7 +17605,7 @@ snapshots: '@babel/helper-validator-option': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17864,7 +17616,7 @@ snapshots: '@babel/helper-validator-option': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17875,43 +17627,48 @@ snapshots: '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.7(supports-color@7.2.0)': + '@babel/traverse@7.29.8(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.7(supports-color@8.1.1)': + '@babel/traverse@7.29.8(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 '@babel/types@8.0.0-rc.3': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.6 + '@babel/helper-string-parser': 8.0.6 '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@babel/types@8.0.6': + dependencies: + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 + '@changesets/apply-release-plan@8.1.1': dependencies: '@changesets/config': 4.0.1 @@ -17921,7 +17678,7 @@ snapshots: '@changesets/types': 7.0.0 import-meta-resolve: 4.2.0 jsonc-parser: 3.3.1 - semver: 7.8.1 + semver: 7.8.5 '@changesets/assemble-release-plan@7.0.0': dependencies: @@ -17929,7 +17686,7 @@ snapshots: '@changesets/get-dependents-graph': 3.0.0 '@changesets/should-skip-package': 1.0.0 '@changesets/types': 7.0.0 - semver: 7.8.1 + semver: 7.8.5 '@changesets/changelog-git@1.0.0': dependencies: @@ -17960,8 +17717,8 @@ snapshots: cac: 7.0.0 import-meta-resolve: 4.2.0 launch-editor: 2.14.1 - package-manager-detector: 1.6.0 - semver: 7.8.1 + package-manager-detector: 1.8.0 + semver: 7.8.5 tinyexec: 1.1.2 '@changesets/config@4.0.1': @@ -17982,7 +17739,7 @@ snapshots: '@changesets/get-dependents-graph@3.0.0': dependencies: '@changesets/types': 7.0.0 - semver: 7.8.1 + semver: 7.8.5 '@changesets/get-github-info@1.0.1': dependencies: @@ -17999,7 +17756,7 @@ snapshots: '@changesets/parse@1.0.0': dependencies: '@changesets/types': 7.0.0 - yaml: 2.9.0 + yaml: 2.9.1 '@changesets/pre@3.0.0': dependencies: @@ -18057,29 +17814,29 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@6.0.2': {} + '@csstools/color-helpers@6.1.1': {} - '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 - '@csstools/css-color-parser@4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1)': dependencies: - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-tokenizer': 4.0.1 - '@csstools/css-syntax-patches-for-csstree@1.1.4(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.14(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 - '@csstools/css-tokenizer@4.0.0': {} + '@csstools/css-tokenizer@4.0.1': {} '@discoveryjs/json-ext@0.6.3': {} @@ -18091,6 +17848,7 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 + optional: true '@emnapi/core@1.11.2': dependencies: @@ -18106,12 +17864,18 @@ snapshots: '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 + optional: true '@emnapi/runtime@1.11.2': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 @@ -18123,6 +17887,7 @@ snapshots: '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 + optional: true '@emnapi/wasi-threads@1.2.2': dependencies: @@ -18161,7 +17926,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)': + '@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)': dependencies: '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5(supports-color@8.1.1) @@ -18173,7 +17938,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 transitivePeerDependencies: - supports-color @@ -18187,18 +17952,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)': dependencies: '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5(supports-color@8.1.1) '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + '@emotion/react': 11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) '@emotion/utils': 1.4.2 react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 transitivePeerDependencies: - supports-color @@ -18215,10 +17980,7 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.27.3': - optional: true - - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.28.1': optional: true '@esbuild/aix-ppc64@0.28.2': @@ -18230,10 +17992,7 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.27.3': - optional: true - - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.28.1': optional: true '@esbuild/android-arm64@0.28.2': @@ -18245,10 +18004,7 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.27.3': - optional: true - - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.28.1': optional: true '@esbuild/android-arm@0.28.2': @@ -18260,10 +18016,7 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.27.3': - optional: true - - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.28.1': optional: true '@esbuild/android-x64@0.28.2': @@ -18275,10 +18028,7 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.27.3': - optional: true - - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.28.1': optional: true '@esbuild/darwin-arm64@0.28.2': @@ -18290,10 +18040,7 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.27.3': - optional: true - - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.28.1': optional: true '@esbuild/darwin-x64@0.28.2': @@ -18305,10 +18052,7 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.27.3': - optional: true - - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.28.1': optional: true '@esbuild/freebsd-arm64@0.28.2': @@ -18320,10 +18064,7 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.27.3': - optional: true - - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.28.1': optional: true '@esbuild/freebsd-x64@0.28.2': @@ -18335,10 +18076,7 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.27.3': - optional: true - - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.28.1': optional: true '@esbuild/linux-arm64@0.28.2': @@ -18350,10 +18088,7 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.27.3': - optional: true - - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.28.1': optional: true '@esbuild/linux-arm@0.28.2': @@ -18365,10 +18100,7 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.27.3': - optional: true - - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.28.1': optional: true '@esbuild/linux-ia32@0.28.2': @@ -18380,10 +18112,7 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.27.3': - optional: true - - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.28.1': optional: true '@esbuild/linux-loong64@0.28.2': @@ -18395,10 +18124,7 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.27.3': - optional: true - - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.28.1': optional: true '@esbuild/linux-mips64el@0.28.2': @@ -18410,10 +18136,7 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.27.3': - optional: true - - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.28.1': optional: true '@esbuild/linux-ppc64@0.28.2': @@ -18425,10 +18148,7 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.27.3': - optional: true - - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.28.1': optional: true '@esbuild/linux-riscv64@0.28.2': @@ -18440,10 +18160,7 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.27.3': - optional: true - - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.28.1': optional: true '@esbuild/linux-s390x@0.28.2': @@ -18455,19 +18172,13 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.27.3': - optional: true - - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.28.1': optional: true '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.3': - optional: true - - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.28.1': optional: true '@esbuild/netbsd-arm64@0.28.2': @@ -18479,19 +18190,13 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.27.3': - optional: true - - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.28.1': optional: true '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.3': - optional: true - - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.28.1': optional: true '@esbuild/openbsd-arm64@0.28.2': @@ -18503,19 +18208,13 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.27.3': - optional: true - - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.28.1': optional: true '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.3': - optional: true - - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openharmony-arm64@0.28.1': optional: true '@esbuild/openharmony-arm64@0.28.2': @@ -18527,10 +18226,7 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.27.3': - optional: true - - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.28.1': optional: true '@esbuild/sunos-x64@0.28.2': @@ -18542,10 +18238,7 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.27.3': - optional: true - - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.28.1': optional: true '@esbuild/win32-arm64@0.28.2': @@ -18557,10 +18250,7 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.27.3': - optional: true - - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.28.1': optional: true '@esbuild/win32-ia32@0.28.2': @@ -18572,21 +18262,18 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.27.3': - optional: true - - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.28.1': optional: true '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))': dependencies: eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': + '@eslint-community/eslint-utils@4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': dependencies: eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 @@ -18596,9 +18283,9 @@ snapshots: '@eslint-react/ast@1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-react/eff': 1.53.1 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -18613,11 +18300,11 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - birecord: 0.1.1 + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + birecord: 0.1.2 ts-pattern: 5.9.0 transitivePeerDependencies: - eslint @@ -18631,10 +18318,10 @@ snapshots: '@eslint-react/eff': 1.53.1 '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-plugin-react-debug: 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint-plugin-react-dom: 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) @@ -18651,9 +18338,9 @@ snapshots: '@eslint-react/kit@1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-react/eff': 1.53.1 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) ts-pattern: 5.9.0 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - eslint - supports-color @@ -18663,9 +18350,9 @@ snapshots: dependencies: '@eslint-react/eff': 1.53.1 '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) ts-pattern: 5.9.0 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - eslint - supports-color @@ -18675,9 +18362,9 @@ snapshots: dependencies: '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/eff': 1.53.1 - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -18707,7 +18394,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5(supports-color@7.2.0)': + '@eslint/eslintrc@3.3.7(supports-color@7.2.0)': dependencies: ajv: 6.15.0 debug: 4.4.3(supports-color@7.2.0) @@ -18715,13 +18402,13 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.3.5(supports-color@8.1.1)': + '@eslint/eslintrc@3.3.7(supports-color@8.1.1)': dependencies: ajv: 6.15.0 debug: 4.4.3(supports-color@8.1.1) @@ -18729,7 +18416,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -18737,7 +18424,7 @@ snapshots: '@eslint/js@9.36.0': {} - '@eslint/js@9.39.4': {} + '@eslint/js@9.39.5': {} '@eslint/object-schema@2.1.7': {} @@ -18750,42 +18437,43 @@ snapshots: optionalDependencies: '@noble/hashes': 2.4.0 - '@expo/cli@54.0.24(expo-router@6.0.23)(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@expo/cli@54.0.27(expo-router@6.0.24)(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@0no-co/graphql.web': 1.2.0 + '@0no-co/graphql.web': 1.3.4 '@expo/code-signing-certificates': 0.0.6 - '@expo/config': 12.0.13(supports-color@8.1.1) - '@expo/config-plugins': 54.0.4(supports-color@8.1.1) + '@expo/config': 12.0.14(supports-color@8.1.1) + '@expo/config-plugins': 54.0.5(supports-color@8.1.1) '@expo/devcert': 1.2.1(supports-color@8.1.1) - '@expo/env': 2.0.11(supports-color@8.1.1) - '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.9.3) + '@expo/env': 2.0.12(supports-color@8.1.1) + '@expo/image-utils': 0.8.17(supports-color@8.1.1)(typescript@5.9.3) '@expo/json-file': 10.2.0 '@expo/metro': 54.2.0(supports-color@8.1.1) - '@expo/metro-config': 54.0.15(expo@54.0.34)(supports-color@8.1.1) - '@expo/osascript': 2.6.0 - '@expo/package-manager': 1.12.0 - '@expo/plist': 0.4.8 - '@expo/prebuild-config': 54.0.8(expo@54.0.34)(supports-color@8.1.1)(typescript@5.9.3) - '@expo/schema-utils': 0.1.8 + '@expo/metro-config': 54.0.17(expo@54.0.37)(supports-color@8.1.1) + '@expo/osascript': 2.7.1 + '@expo/package-manager': 1.13.1 + '@expo/plist': 0.4.9 + '@expo/prebuild-config': 54.0.9(expo@54.0.37)(supports-color@8.1.1)(typescript@5.9.3) + '@expo/schema-utils': 0.1.9 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 1.0.6 - '@expo/xcpretty': 4.4.4 + '@expo/xcpretty': 4.4.5 '@react-native/dev-middleware': 0.81.5(supports-color@8.1.1) '@urql/core': 5.2.0 '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0) accepts: 1.3.8 + agent-cli-detector: 0.1.7 arg: 5.0.2 better-opn: 3.0.2 bplist-creator: 0.1.0 bplist-parser: 0.3.2 chalk: 4.1.2 ci-info: 3.9.0 - compression: 1.8.1(supports-color@8.1.1) + compression: 1.8.2(supports-color@8.1.1) connect: 3.7.0(supports-color@8.1.1) debug: 4.4.3(supports-color@8.1.1) env-editor: 0.4.2 - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - expo-server: 1.0.6 + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo-server: 1.0.7 freeport-async: 2.0.0 getenv: 2.0.0 glob: 13.0.6 @@ -18794,7 +18482,7 @@ snapshots: node-forge: 1.4.0 npm-package-arg: 11.0.3 ora: 3.4.0 - picomatch: 4.0.4 + picomatch: 4.0.7 pretty-bytes: 5.6.0 pretty-format: 29.7.0 progress: 2.0.3 @@ -18805,20 +18493,20 @@ snapshots: resolve: 1.22.12 resolve-from: 5.0.0 resolve.exports: 2.0.3 - semver: 7.8.1 + semver: 7.8.5 send: 0.19.2(supports-color@8.1.1) slugify: 1.6.9 source-map-support: 0.5.21 stacktrace-parser: 0.1.11 structured-headers: 0.4.1 - tar: 7.5.15 + tar: 7.5.22 terminal-link: 2.1.1 - undici: 6.26.0 + undici: 6.28.1 wrap-ansi: 7.0.0 - ws: 8.21.0 + ws: 8.21.3 optionalDependencies: - expo-router: 6.0.23(c7c2013fda48cef4065ef0e95e77f784) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + expo-router: 6.0.24(3a123a5aaca9c4c45b93faf4bd84db41) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - graphql @@ -18830,18 +18518,18 @@ snapshots: dependencies: node-forge: 1.4.0 - '@expo/config-plugins@54.0.4(supports-color@8.1.1)': + '@expo/config-plugins@54.0.5(supports-color@8.1.1)': dependencies: '@expo/config-types': 54.0.10 - '@expo/json-file': 10.0.15 - '@expo/plist': 0.4.8 + '@expo/json-file': 10.0.16 + '@expo/plist': 0.4.9 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 resolve-from: 5.0.0 - semver: 7.8.1 + semver: 7.8.5 slash: 3.0.0 slugify: 1.6.9 xcode: 3.0.1 @@ -18851,10 +18539,10 @@ snapshots: '@expo/config-types@54.0.10': {} - '@expo/config@12.0.13(supports-color@8.1.1)': + '@expo/config@12.0.14(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 54.0.4(supports-color@8.1.1) + '@expo/config-plugins': 54.0.5(supports-color@8.1.1) '@expo/config-types': 54.0.10 '@expo/json-file': 10.2.0 deepmerge: 4.3.1 @@ -18863,7 +18551,7 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 resolve-workspace-root: 2.0.1 - semver: 7.8.1 + semver: 7.8.5 slugify: 1.6.9 sucrase: 3.35.1 transitivePeerDependencies: @@ -18876,14 +18564,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - '@expo/env@2.0.11(supports-color@8.1.1)': + '@expo/env@2.0.12(supports-color@8.1.1)': dependencies: chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) @@ -18902,29 +18590,29 @@ snapshots: getenv: 2.0.0 glob: 13.0.6 ignore: 5.3.2 - minimatch: 10.2.5 + minimatch: 10.2.6 p-limit: 3.1.0 resolve-from: 5.0.0 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - supports-color - '@expo/image-utils@0.8.14(supports-color@8.1.1)(typescript@5.9.3)': + '@expo/image-utils@0.8.17(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@5.9.3) + '@expo/require-utils': 55.0.8(supports-color@8.1.1)(typescript@5.9.3) '@expo/spawn-async': 1.8.0 chalk: 4.1.2 getenv: 2.0.0 jimp-compact: 0.16.1 parse-png: 2.1.0 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - supports-color - typescript - '@expo/json-file@10.0.15': + '@expo/json-file@10.0.16': dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.10.4 json5: 2.2.3 '@expo/json-file@10.2.0': @@ -18932,17 +18620,22 @@ snapshots: '@babel/code-frame': 7.29.7 json5: 2.2.3 - '@expo/metro-config@54.0.15(expo@54.0.34)(supports-color@8.1.1)': + '@expo/json-file@11.0.1': + dependencies: + '@babel/code-frame': 7.29.7 + json5: 2.2.3 + + '@expo/metro-config@54.0.17(expo@54.0.37)(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@expo/config': 12.0.13(supports-color@8.1.1) - '@expo/env': 2.0.11(supports-color@8.1.1) - '@expo/json-file': 10.0.15 + '@babel/generator': 7.29.8 + '@expo/config': 12.0.14(supports-color@8.1.1) + '@expo/env': 2.0.12(supports-color@8.1.1) + '@expo/json-file': 10.0.16 '@expo/metro': 54.2.0(supports-color@8.1.1) '@expo/spawn-async': 1.8.0 - browserslist: 4.28.2 + browserslist: 4.29.0 chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) dotenv: 16.4.7 @@ -18951,24 +18644,24 @@ snapshots: glob: 13.0.6 hermes-parser: 0.29.1 jsc-safe-url: 0.2.4 - lightningcss: 1.32.0 - picomatch: 4.0.4 + lightningcss: 1.33.0 + picomatch: 4.0.7 postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/metro-runtime@6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@expo/metro-runtime@6.1.2(expo@54.0.37)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: anser: 1.4.10 - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) pretty-format: 29.7.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: @@ -18995,43 +18688,43 @@ snapshots: - supports-color - utf-8-validate - '@expo/osascript@2.6.0': + '@expo/osascript@2.7.1': dependencies: '@expo/spawn-async': 1.8.0 - '@expo/package-manager@1.12.0': + '@expo/package-manager@1.13.1': dependencies: - '@expo/json-file': 10.2.0 + '@expo/json-file': 11.0.1 '@expo/spawn-async': 1.8.0 chalk: 4.1.2 npm-package-arg: 11.0.3 ora: 3.4.0 resolve-workspace-root: 2.0.1 - '@expo/plist@0.4.8': + '@expo/plist@0.4.9': dependencies: - '@xmldom/xmldom': 0.8.13 + '@xmldom/xmldom': 0.8.15 base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@54.0.8(expo@54.0.34)(supports-color@8.1.1)(typescript@5.9.3)': + '@expo/prebuild-config@54.0.9(expo@54.0.37)(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@expo/config': 12.0.13(supports-color@8.1.1) - '@expo/config-plugins': 54.0.4(supports-color@8.1.1) + '@expo/config': 12.0.14(supports-color@8.1.1) + '@expo/config-plugins': 54.0.5(supports-color@8.1.1) '@expo/config-types': 54.0.10 - '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.9.3) + '@expo/image-utils': 0.8.17(supports-color@8.1.1)(typescript@5.9.3) '@expo/json-file': 10.2.0 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3(supports-color@8.1.1) - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) resolve-from: 5.0.0 - semver: 7.8.1 + semver: 7.8.5 xml2js: 0.6.0 transitivePeerDependencies: - supports-color - typescript - '@expo/require-utils@55.0.5(supports-color@8.1.1)(typescript@5.9.3)': + '@expo/require-utils@55.0.8(supports-color@8.1.1)(typescript@5.9.3)': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) @@ -19041,7 +18734,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/schema-utils@0.1.8': {} + '@expo/schema-utils@0.1.9': {} '@expo/sdk-runtime-versions@1.0.0': {} @@ -19051,44 +18744,44 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@expo/vector-icons@15.1.1(expo-font@14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: - expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + expo-font: 14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) '@expo/ws-tunnel@1.0.6': {} - '@expo/xcpretty@4.4.4': + '@expo/xcpretty@4.4.5': dependencies: '@babel/code-frame': 7.29.7 chalk: 4.1.2 - js-yaml: 4.1.1 + js-yaml: 4.3.2 - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/react-dom@2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@floating-ui/utils': 0.2.11 + '@floating-ui/react-dom': 2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.12 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - tabbable: 6.4.0 + tabbable: 6.5.0 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} '@gar/promise-retry@1.0.3': {} @@ -19103,9 +18796,9 @@ snapshots: '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.14(hono@4.12.23)': + '@hono/node-server@2.1.1(hono@4.13.8)': dependencies: - hono: 4.12.23 + hono: 4.13.8 '@humanfs/core@0.19.2': dependencies: @@ -19208,7 +18901,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.3 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -19222,128 +18915,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@24.12.4)': + '@inquirer/checkbox@4.3.2(@types/node@24.13.6)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/type': 3.0.10(@types/node@24.13.6) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/confirm@5.1.21(@types/node@24.12.4)': + '@inquirer/confirm@5.1.21(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/core@10.3.2(@types/node@24.12.4)': + '@inquirer/core@10.3.2(@types/node@24.13.6)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/type': 3.0.10(@types/node@24.13.6) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/editor@4.2.23(@types/node@24.12.4)': + '@inquirer/editor@4.2.23(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/external-editor': 1.0.3(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/external-editor': 1.0.3(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/expand@4.0.23(@types/node@24.12.4)': + '@inquirer/expand@4.0.23(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/external-editor@1.0.3(@types/node@24.12.4)': + '@inquirer/external-editor@1.0.3(@types/node@24.13.6)': dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 + chardet: 2.2.0 + iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@24.12.4)': + '@inquirer/input@4.3.1(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/number@3.0.23(@types/node@24.12.4)': + '@inquirer/number@3.0.23(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/password@4.0.23(@types/node@24.12.4)': + '@inquirer/password@4.0.23(@types/node@24.13.6)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 - - '@inquirer/prompts@7.10.1(@types/node@24.12.4)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.12.4) - '@inquirer/confirm': 5.1.21(@types/node@24.12.4) - '@inquirer/editor': 4.2.23(@types/node@24.12.4) - '@inquirer/expand': 4.0.23(@types/node@24.12.4) - '@inquirer/input': 4.3.1(@types/node@24.12.4) - '@inquirer/number': 3.0.23(@types/node@24.12.4) - '@inquirer/password': 4.0.23(@types/node@24.12.4) - '@inquirer/rawlist': 4.1.11(@types/node@24.12.4) - '@inquirer/search': 3.2.2(@types/node@24.12.4) - '@inquirer/select': 4.4.2(@types/node@24.12.4) + '@types/node': 24.13.6 + + '@inquirer/prompts@7.10.1(@types/node@24.13.6)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.13.6) + '@inquirer/confirm': 5.1.21(@types/node@24.13.6) + '@inquirer/editor': 4.2.23(@types/node@24.13.6) + '@inquirer/expand': 4.0.23(@types/node@24.13.6) + '@inquirer/input': 4.3.1(@types/node@24.13.6) + '@inquirer/number': 3.0.23(@types/node@24.13.6) + '@inquirer/password': 4.0.23(@types/node@24.13.6) + '@inquirer/rawlist': 4.1.11(@types/node@24.13.6) + '@inquirer/search': 3.2.2(@types/node@24.13.6) + '@inquirer/select': 4.4.2(@types/node@24.13.6) optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/rawlist@4.1.11(@types/node@24.12.4)': + '@inquirer/rawlist@4.1.11(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/search@3.2.2(@types/node@24.12.4)': + '@inquirer/search@3.2.2(@types/node@24.13.6)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/type': 3.0.10(@types/node@24.13.6) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/select@4.4.2(@types/node@24.12.4)': + '@inquirer/select@4.4.2(@types/node@24.13.6)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.12.4) + '@inquirer/core': 10.3.2(@types/node@24.13.6) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/type': 3.0.10(@types/node@24.13.6) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@inquirer/type@3.0.10(@types/node@24.12.4)': + '@inquirer/type@3.0.10(@types/node@24.13.6)': optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@isaacs/cliui@8.0.2': dependencies: @@ -19365,7 +19058,7 @@ snapshots: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.2 + js-yaml: 3.15.2 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.6': {} @@ -19380,21 +19073,21 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 '@jest/schemas@29.6.3': dependencies: - '@sinclair/typebox': 0.27.10 + '@sinclair/typebox': 0.27.12 '@jest/transform@29.7.0(supports-color@8.1.1)': dependencies: @@ -19421,7 +19114,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -19442,14 +19135,12 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: @@ -19480,58 +19171,59 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-core@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-core@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-fsa@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-fsa@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-builtins@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-builtins@4.78.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-node-to-fsa@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-to-fsa@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-utils@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-utils@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + glob-to-regex.js: 1.3.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.78.1(tslib@2.8.1) + glob-to-regex.js: 1.3.1(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-print@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-print@4.78.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-snapshot@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-snapshot@4.78.1(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 @@ -19544,7 +19236,7 @@ snapshots: '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 2.6.0(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -19556,7 +19248,7 @@ snapshots: '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 2.6.0(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -19587,16 +19279,20 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@24.12.4))(@types/node@24.12.4)(listr2@9.0.5)': + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@24.13.6))(@types/node@24.13.6)(listr2@9.0.5)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@24.12.4) - '@inquirer/type': 3.0.10(@types/node@24.12.4) + '@inquirer/prompts': 7.10.1(@types/node@24.13.6) + '@inquirer/type': 3.0.10(@types/node@24.13.6) listr2: 9.0.5 transitivePeerDependencies: - '@types/node' '@lit-labs/ssr-dom-shim@1.6.0': {} + '@lit/context@1.1.6': + dependencies: + '@lit/reactive-element': 2.1.2 + '@lit/reactive-element@2.1.2': dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 @@ -19622,7 +19318,7 @@ snapshots: '@lmdb/lmdb-win32-x64@3.5.1': optional: true - '@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.1.0))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.1.0))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@mantine/hooks': 7.17.8(react@19.1.0) @@ -19630,8 +19326,8 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-number-format: 5.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.1.0) - react-textarea-autosize: 8.5.9(@types/react@19.2.17)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.1.0) + react-textarea-autosize: 8.5.9(@types/react@19.2.18)(react@19.1.0) type-fest: 4.41.0 transitivePeerDependencies: - '@types/react' @@ -19653,17 +19349,18 @@ snapshots: dependencies: jju: 1.4.0 tinyglobby: 0.2.17 - yaml: 2.9.0 + yaml: 2.9.1 - '@material/web@2.4.1': + '@material/web@2.5.0': dependencies: + '@lit/context': 1.1.6 lit: 3.3.3 tslib: 2.8.1 '@mdx-js/mdx@2.3.0(supports-color@8.1.1)': dependencies: '@types/estree-jsx': 1.0.5 - '@types/mdx': 2.0.13 + '@types/mdx': 2.0.14 estree-util-build-jsx: 2.2.2 estree-util-is-identifier-name: 2.1.0 estree-util-to-js: 1.2.0 @@ -19682,23 +19379,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@microsoft/api-extractor-model@7.29.6(@types/node@24.12.4)': + '@microsoft/api-extractor-model@7.29.6(@types/node@24.13.6)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.12.4) + '@rushstack/node-core-library': 5.7.0(@types/node@24.13.6) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@24.12.4)': + '@microsoft/api-extractor@7.47.7(@types/node@24.13.6)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@24.12.4) + '@microsoft/api-extractor-model': 7.29.6(@types/node@24.13.6) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.12.4) + '@rushstack/node-core-library': 5.7.0(@types/node@24.13.6) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@24.12.4) - '@rushstack/ts-command-line': 4.22.6(@types/node@24.12.4) + '@rushstack/terminal': 0.14.0(@types/node@24.13.6) + '@rushstack/ts-command-line': 4.22.6(@types/node@24.13.6) lodash: 4.17.23 minimatch: 3.0.8 resolve: 1.22.12 @@ -19717,20 +19414,20 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@modelcontextprotocol/sdk@1.26.0(supports-color@8.1.1)(zod@4.3.6)': + '@modelcontextprotocol/sdk@1.30.0(supports-color@8.1.1)(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.23) + '@hono/node-server': 2.1.1(hono@4.13.8) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.1 express: 5.2.1(supports-color@8.1.1) - express-rate-limit: 8.5.2(express@5.2.1(supports-color@8.1.1)) - hono: 4.12.23 - jose: 6.2.3 + express-rate-limit: 8.7.0(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1) + hono: 4.13.8 + jose: 6.2.12 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -19759,37 +19456,37 @@ snapshots: '@mui/core-downloads-tracker@6.5.0': {} - '@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 '@mui/core-downloads-tracker': 6.5.0 - '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0) - '@mui/types': 7.2.24(@types/react@19.2.17) - '@mui/utils': 6.4.9(@types/react@19.2.17)(react@19.1.0) + '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0) + '@mui/types': 7.2.24(@types/react@19.2.18) + '@mui/utils': 6.4.9(@types/react@19.2.18)(react@19.1.0) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.2.17) + '@types/react-transition-group': 4.4.12(@types/react@19.2.18) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-is: 19.2.6 + react-is: 19.3.0 react-transition-group: 4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - '@types/react': 19.2.17 + '@emotion/react': 11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + '@types/react': 19.2.18 - '@mui/private-theming@6.4.9(@types/react@19.2.17)(react@19.1.0)': + '@mui/private-theming@6.4.9(@types/react@19.2.18)(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 - '@mui/utils': 6.4.9(@types/react@19.2.17)(react@19.1.0) + '@mui/utils': 6.4.9(@types/react@19.2.18)(react@19.1.0) prop-types: 15.8.1 react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@mui/styled-engine@6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@mui/styled-engine@6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 '@emotion/cache': 11.14.0 @@ -19799,40 +19496,43 @@ snapshots: prop-types: 15.8.1 react: 19.1.0 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + '@emotion/react': 11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - '@mui/system@6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)': + '@mui/system@6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 - '@mui/private-theming': 6.4.9(@types/react@19.2.17)(react@19.1.0) - '@mui/styled-engine': 6.5.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@mui/types': 7.2.24(@types/react@19.2.17) - '@mui/utils': 6.4.9(@types/react@19.2.17)(react@19.1.0) + '@mui/private-theming': 6.4.9(@types/react@19.2.18)(react@19.1.0) + '@mui/styled-engine': 6.5.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@mui/types': 7.2.24(@types/react@19.2.18) + '@mui/utils': 6.4.9(@types/react@19.2.18)(react@19.1.0) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 19.1.0 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - '@types/react': 19.2.17 + '@emotion/react': 11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + '@types/react': 19.2.18 - '@mui/types@7.2.24(@types/react@19.2.17)': + '@mui/types@7.2.24(@types/react@19.2.18)': optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@mui/utils@6.4.9(@types/react@19.2.17)(react@19.1.0)': + '@mui/utils@6.4.9(@types/react@19.2.18)(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 - '@mui/types': 7.2.24(@types/react@19.2.17) + '@mui/types': 7.2.24(@types/react@19.2.18) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.0 - react-is: 19.2.6 + react-is: 19.3.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -19908,28 +19608,28 @@ snapshots: '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.9.0 - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 + '@emnapi/runtime': 1.11.3 '@tybys/wasm-util': 0.10.4 optional: true @@ -19959,13 +19659,13 @@ snapshots: '@next/swc-win32-x64-msvc@16.2.6': optional: true - '@ngtools/webpack@21.2.12(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': + '@ngtools/webpack@21.2.24(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23))': dependencies: - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.8.0': {} '@noble/hashes@2.4.0': {} @@ -19979,27 +19679,27 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.20.3 '@nolyfill/is-core-module@1.0.39': {} - '@npmcli/agent@4.0.0(supports-color@8.1.1)': + '@npmcli/agent@4.0.2(supports-color@8.1.1)': dependencies: agent-base: 7.1.4 http-proxy-agent: 7.0.2(supports-color@8.1.1) https-proxy-agent: 7.0.6(supports-color@8.1.1) - lru-cache: 11.5.0 + lru-cache: 11.5.3 socks-proxy-agent: 8.0.5(supports-color@8.1.1) transitivePeerDependencies: - supports-color '@npmcli/fs@3.1.1': dependencies: - semver: 7.8.1 + semver: 7.8.5 '@npmcli/fs@5.0.0': dependencies: - semver: 7.8.1 + semver: 7.7.4 '@npmcli/git@4.1.0': dependencies: @@ -20009,7 +19709,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.8.1 + semver: 7.8.5 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -20019,10 +19719,10 @@ snapshots: '@gar/promise-retry': 1.0.3 '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.5.0 + lru-cache: 11.5.3 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 - semver: 7.8.1 + semver: 7.7.4 which: 6.0.1 '@npmcli/installed-package-contents@4.0.0': @@ -20040,7 +19740,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - bluebird @@ -20051,7 +19751,7 @@ snapshots: hosted-git-info: 9.0.3 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 - semver: 7.8.1 + semver: 7.7.4 spdx-expression-parse: 4.0.0 '@npmcli/promise-spawn@6.0.2': @@ -20069,7 +19769,7 @@ snapshots: '@npmcli/node-gyp': 5.0.0 '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 - node-gyp: 12.3.0 + node-gyp: 12.4.0 proc-log: 6.1.0 '@nx/nx-darwin-arm64@23.2.1': @@ -20102,12 +19802,12 @@ snapshots: '@nx/nx-win32-x64-msvc@23.2.1': optional: true - '@octanejs/testing-library@0.1.51(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + '@octanejs/testing-library@0.1.52(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))': dependencies: - '@testing-library/dom': 10.4.1 - octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@testing-library/dom': 10.4.2 + octane: 0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) - '@one-ini/wasm@0.1.1': {} + '@one-ini/wasm@0.2.1': {} '@oozcitak/dom@2.0.2': dependencies: @@ -20222,9 +19922,9 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.150.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -20258,129 +19958,64 @@ snapshots: '@oxc-project/types@0.150.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': - optional: true - '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true - '@oxc-resolver/binding-android-arm64@11.19.1': - optional: true - '@oxc-resolver/binding-android-arm64@11.24.2': optional: true - '@oxc-resolver/binding-darwin-arm64@11.19.1': - optional: true - '@oxc-resolver/binding-darwin-arm64@11.24.2': optional: true - '@oxc-resolver/binding-darwin-x64@11.19.1': - optional: true - '@oxc-resolver/binding-darwin-x64@11.24.2': optional: true - '@oxc-resolver/binding-freebsd-x64@11.19.1': - optional: true - '@oxc-resolver/binding-freebsd-x64@11.24.2': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': - optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': - optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': - optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': - optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.24.2': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': - optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': - optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': - optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': - optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': - optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.24.2': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.19.1': - optional: true - '@oxc-resolver/binding-linux-x64-musl@11.24.2': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.19.1': - optional: true - '@oxc-resolver/binding-openharmony-arm64@11.24.2': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - '@oxc-resolver/binding-wasm32-wasi@11.24.2': dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': - optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true @@ -20516,141 +20151,135 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.74.0': optional: true - '@package-json/types@0.0.12': {} - - '@parcel/watcher-android-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.6': + '@parcel/watcher-android-arm64@2.6.0': optional: true - '@parcel/watcher-darwin-x64@2.5.6': + '@parcel/watcher-darwin-arm64@2.6.0': optional: true - '@parcel/watcher-freebsd-x64@2.5.6': + '@parcel/watcher-darwin-x64@2.6.0': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.6': + '@parcel/watcher-freebsd-x64@2.6.0': optional: true - '@parcel/watcher-linux-arm-musl@2.5.6': + '@parcel/watcher-linux-arm-glibc@2.6.0': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.6': + '@parcel/watcher-linux-arm-musl@2.6.0': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.6': + '@parcel/watcher-linux-arm64-glibc@2.6.0': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.6': + '@parcel/watcher-linux-arm64-musl@2.6.0': optional: true - '@parcel/watcher-linux-x64-musl@2.5.6': + '@parcel/watcher-linux-x64-glibc@2.6.0': optional: true - '@parcel/watcher-win32-arm64@2.5.6': + '@parcel/watcher-linux-x64-musl@2.6.0': optional: true - '@parcel/watcher-win32-ia32@2.5.6': + '@parcel/watcher-win32-arm64@2.6.0': optional: true - '@parcel/watcher-win32-x64@2.5.6': + '@parcel/watcher-win32-x64@2.6.0': optional: true - '@parcel/watcher@2.5.6': + '@parcel/watcher@2.6.0': dependencies: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.7 + picomatch: 4.0.4 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 - optional: true - - '@peculiar/asn1-cms@2.7.0': - dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 - '@peculiar/asn1-x509-attr': 2.7.0 + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + optional: true + + '@peculiar/asn1-cms@2.9.5': + dependencies: + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-x509-attr': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-csr@2.7.0': + '@peculiar/asn1-csr@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.7.0': + '@peculiar/asn1-ecc@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.7.0': + '@peculiar/asn1-pfx@2.9.5': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-pkcs8': 2.7.0 - '@peculiar/asn1-rsa': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-cms': 2.9.5 + '@peculiar/asn1-pkcs8': 2.9.5 + '@peculiar/asn1-rsa': 2.9.5 + '@peculiar/asn1-schema': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.7.0': + '@peculiar/asn1-pkcs8@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.7.0': + '@peculiar/asn1-pkcs9@2.9.5': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-pfx': 2.7.0 - '@peculiar/asn1-pkcs8': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 - '@peculiar/asn1-x509-attr': 2.7.0 + '@peculiar/asn1-cms': 2.9.5 + '@peculiar/asn1-pfx': 2.9.5 + '@peculiar/asn1-pkcs8': 2.9.5 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-x509-attr': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.7.0': + '@peculiar/asn1-rsa@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-schema@2.7.0': + '@peculiar/asn1-schema@2.9.5': dependencies: '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.7.0': + '@peculiar/asn1-x509-attr@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509@2.7.0': + '@peculiar/asn1-x509@2.9.5': dependencies: - '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-schema': 2.9.5 '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 @@ -20661,13 +20290,13 @@ snapshots: '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-csr': 2.7.0 - '@peculiar/asn1-ecc': 2.7.0 - '@peculiar/asn1-pkcs9': 2.7.0 - '@peculiar/asn1-rsa': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-cms': 2.9.5 + '@peculiar/asn1-csr': 2.9.5 + '@peculiar/asn1-ecc': 2.9.5 + '@peculiar/asn1-pkcs9': 2.9.5 + '@peculiar/asn1-rsa': 2.9.5 + '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-x509': 2.9.5 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -20680,257 +20309,269 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.5(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.2)(rollup@4.60.4)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@prefresh/vite': 2.4.12(preact@10.29.2)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + '@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@rollup/pluginutils': 5.4.0(rollup@4.63.4) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7(supports-color@8.1.1)) debug: 4.4.3(supports-color@8.1.1) magic-string: 0.30.21 picocolors: 1.1.1 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vite-prerender-plugin: 0.5.13(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - zimmerframe: 1.1.4 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-prerender-plugin: 0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + zimmerframe: 1.1.5 transitivePeerDependencies: - preact - rollup - supports-color - '@prefresh/babel-plugin@0.5.3': {} + '@prefresh/babel-plugin@0.5.4(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) - '@prefresh/core@1.5.10(preact@10.29.2)': + '@prefresh/core@1.5.11(preact@10.29.8)': dependencies: - preact: 10.29.2 + preact: 10.29.8 '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.2)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@prefresh/babel-plugin': 0.5.3 - '@prefresh/core': 1.5.10(preact@10.29.2) + '@prefresh/babel-plugin': 0.5.4(@babel/core@7.29.7(supports-color@8.1.1)) + '@prefresh/core': 1.5.11(preact@10.29.8) '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 - preact: 10.29.2 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + preact: 10.29.8 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - '@publint/pack@0.1.4': {} + '@publint/pack@0.1.7': + dependencies: + tinyexec: 1.1.2 - '@quansync/fs@1.0.0': + '@quansync/fs@1.1.0': dependencies: quansync: 1.0.0 - '@radix-ui/primitive@1.1.3': {} + '@radix-ui/primitive@1.1.7': {} - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.18)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.18 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-context@1.1.2(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-context@1.2.2(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.17)(react@19.1.0) + '@types/react': 19.2.18 + + '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-direction@1.1.4(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-id@1.1.1(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-id@1.1.4(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.17)(react@19.1.0) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) + + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-slot@1.2.0(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-slot@1.2.0(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-slot@1.3.3(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.17)(react@19.1.0) + '@types/react': 19.2.18 + + '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.18)(react@19.1.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.17)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.18)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 '@react-native/assets-registry@0.81.5': {} '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@react-native/codegen': 0.81.5(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' @@ -20971,12 +20612,12 @@ snapshots: '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/template': 7.29.7 '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) @@ -20989,22 +20630,22 @@ snapshots: '@react-native/codegen@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 glob: 7.2.3 hermes-parser: 0.29.1 invariant: 2.2.4 nullthrows: 1.1.1 - yargs: 17.7.2 + yargs: 17.7.3 '@react-native/community-cli-plugin@0.81.5(supports-color@8.1.1)': dependencies: '@react-native/dev-middleware': 0.81.5(supports-color@8.1.1) debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.83.7(supports-color@8.1.1) - metro-config: 0.83.7(supports-color@8.1.1) - metro-core: 0.83.7 - semver: 7.8.1 + metro: 0.83.8(supports-color@8.1.1) + metro-config: 0.83.8(supports-color@8.1.1) + metro-core: 0.83.8 + semver: 7.8.5 transitivePeerDependencies: - bufferutil - supports-color @@ -21024,7 +20665,7 @@ snapshots: nullthrows: 1.1.1 open: 7.4.2 serve-static: 1.16.3(supports-color@8.1.1) - ws: 6.2.4 + ws: 6.2.6 transitivePeerDependencies: - bufferutil - supports-color @@ -21038,96 +20679,96 @@ snapshots: '@react-native/normalize-colors@0.81.5': {} - '@react-native/virtualized-lists@0.81.5(@types/react@19.2.17)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@react-native/virtualized-lists@0.81.5(@types/react@19.2.18)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@react-navigation/bottom-tabs@7.16.1(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@react-navigation/bottom-tabs@7.19.2(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: - '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/elements': 2.9.43(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/native': 7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/core@7.17.4(react@19.1.0)': + '@react-navigation/core@7.22.1(react@19.1.0)': dependencies: - '@react-navigation/routers': 7.5.5 + '@react-navigation/routers': 7.6.4 escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 - nanoid: 3.3.12 - query-string: 7.1.3 + nanoid: 3.3.19 react: 19.1.0 - react-is: 19.2.6 + react-is: 19.3.0 use-latest-callback: 0.2.6(react@19.1.0) - use-sync-external-store: 1.6.0(react@19.1.0) + use-sync-external-store: 1.7.0(react@19.1.0) - '@react-navigation/elements@2.9.18(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@react-navigation/elements@2.9.43(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/native': 7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) - use-sync-external-store: 1.6.0(react@19.1.0) + use-sync-external-store: 1.7.0(react@19.1.0) - '@react-navigation/native-stack@7.15.1(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@react-navigation/native-stack@7.19.2(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: - '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/elements': 2.9.43(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/native': 7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': + '@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)': dependencies: - '@react-navigation/core': 7.17.4(react@19.1.0) + '@react-navigation/core': 7.22.1(react@19.1.0) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 - nanoid: 3.3.12 + nanoid: 3.3.19 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + standard-navigation: 0.0.8(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) - '@react-navigation/routers@7.5.5': + '@react-navigation/routers@7.6.4': dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 - '@remix-run/dev@2.17.4(@remix-run/react@2.17.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(@remix-run/serve@2.17.4(supports-color@8.1.1)(typescript@5.9.3))(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0)(ts-node@10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0)': + '@remix-run/dev@2.17.5(@remix-run/react@2.17.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(@remix-run/serve@2.17.5(supports-color@8.1.1)(typescript@5.9.3))(@types/node@24.13.6)(babel-plugin-macros@3.1.0)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2)(ts-node@10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1))(yaml@2.9.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 '@mdx-js/mdx': 2.3.0(supports-color@8.1.1) '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.17.4(typescript@5.9.3) - '@remix-run/react': 2.17.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) - '@remix-run/router': 1.23.2 - '@remix-run/server-runtime': 2.17.4(typescript@5.9.3) - '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0) + '@remix-run/node': 2.17.5(typescript@5.9.3) + '@remix-run/react': 2.17.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + '@remix-run/router': 1.23.3 + '@remix-run/server-runtime': 2.17.5(typescript@5.9.3) + '@types/mdx': 2.0.14 + '@vanilla-extract/integration': 6.5.0(@types/node@24.13.6)(babel-plugin-macros@3.1.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -21136,10 +20777,10 @@ snapshots: dotenv: 16.6.1 es-module-lexer: 1.7.0 esbuild: 0.17.6 - esbuild-plugins-node-modules-polyfill: 1.8.1(esbuild@0.17.6) + esbuild-plugins-node-modules-polyfill: 1.8.3(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 - express: 4.22.2(supports-color@8.1.1) + express: 4.22.3(supports-color@8.1.1) fs-extra: 10.1.0 get-port: 5.1.1 gunzip-maybe: 1.4.2 @@ -21152,27 +20793,27 @@ snapshots: pathe: 1.1.2 picocolors: 1.1.1 picomatch: 2.3.2 - pidtree: 0.6.0 + pidtree: 0.6.1 postcss: 8.5.6 postcss-discard-duplicates: 5.1.0(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3)) postcss-modules: 6.0.1(postcss@8.5.6) prettier: 2.8.8 pretty-ms: 7.0.1 react-refresh: 0.14.2 remark-frontmatter: 4.0.1 remark-mdx-frontmatter: 1.1.1 - semver: 7.8.1 + semver: 7.8.5 set-cookie-parser: 2.7.2 - tar-fs: 2.1.4 + tar-fs: 2.1.5 tsconfig-paths: 4.2.0 - valibot: 1.4.1(typescript@5.9.3) - vite-node: 3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) - ws: 7.5.11 + valibot: 1.5.0(typescript@5.9.3) + vite-node: 3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + ws: 7.5.13 optionalDependencies: - '@remix-run/serve': 2.17.4(supports-color@8.1.1)(typescript@5.9.3) + '@remix-run/serve': 2.17.5(supports-color@8.1.1)(typescript@5.9.3) typescript: 5.9.3 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21192,56 +20833,56 @@ snapshots: - utf-8-validate - yaml - '@remix-run/express@2.17.4(express@4.22.2(supports-color@8.1.1))(typescript@5.9.3)': + '@remix-run/express@2.17.5(express@4.22.3(supports-color@8.1.1))(typescript@5.9.3)': dependencies: - '@remix-run/node': 2.17.4(typescript@5.9.3) - express: 4.22.2(supports-color@8.1.1) + '@remix-run/node': 2.17.5(typescript@5.9.3) + express: 4.22.3(supports-color@8.1.1) optionalDependencies: typescript: 5.9.3 - '@remix-run/node@2.17.4(typescript@5.9.3)': + '@remix-run/node@2.17.5(typescript@5.9.3)': dependencies: - '@remix-run/server-runtime': 2.17.4(typescript@5.9.3) + '@remix-run/server-runtime': 2.17.5(typescript@5.9.3) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 cookie-signature: 1.2.2 source-map-support: 0.5.21 stream-slice: 0.1.2 - undici: 6.26.0 + undici: 6.28.1 optionalDependencies: typescript: 5.9.3 - '@remix-run/react@2.17.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3)': + '@remix-run/react@2.17.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3)': dependencies: - '@remix-run/router': 1.23.2 - '@remix-run/server-runtime': 2.17.4(typescript@5.9.3) + '@remix-run/router': 1.23.3 + '@remix-run/server-runtime': 2.17.5(typescript@5.9.3) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-router: 6.30.3(react@19.1.0) - react-router-dom: 6.30.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-router: 6.30.4(react@19.1.0) + react-router-dom: 6.30.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) turbo-stream: 2.4.1 optionalDependencies: typescript: 5.9.3 - '@remix-run/router@1.23.2': {} + '@remix-run/router@1.23.3': {} - '@remix-run/serve@2.17.4(supports-color@8.1.1)(typescript@5.9.3)': + '@remix-run/serve@2.17.5(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@remix-run/express': 2.17.4(express@4.22.2(supports-color@8.1.1))(typescript@5.9.3) - '@remix-run/node': 2.17.4(typescript@5.9.3) + '@remix-run/express': 2.17.5(express@4.22.3(supports-color@8.1.1))(typescript@5.9.3) + '@remix-run/node': 2.17.5(typescript@5.9.3) chokidar: 3.6.0 - compression: 1.8.1(supports-color@8.1.1) - express: 4.22.2(supports-color@8.1.1) + compression: 1.8.2(supports-color@8.1.1) + express: 4.22.3(supports-color@8.1.1) get-port: 5.1.1 - morgan: 1.10.1(supports-color@8.1.1) + morgan: 1.12.1(supports-color@8.1.1) source-map-support: 0.5.21 transitivePeerDependencies: - supports-color - typescript - '@remix-run/server-runtime@2.17.4(typescript@5.9.3)': + '@remix-run/server-runtime@2.17.5(typescript@5.9.3)': dependencies: - '@remix-run/router': 1.23.2 + '@remix-run/router': 1.23.3 '@types/cookie': 0.6.0 '@web3-storage/multipart-parser': 1.0.0 cookie: 0.7.2 @@ -21349,12 +20990,12 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -21380,109 +21021,110 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.4': {} - '@rollup/plugin-json@6.1.0(rollup@4.60.4)': + '@rollup/plugin-json@6.1.0(rollup@4.63.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + '@rollup/pluginutils': 5.4.0(rollup@4.63.4) optionalDependencies: - rollup: 4.60.4 + rollup: 4.63.4 '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.2 - '@rollup/pluginutils@5.3.0(rollup@4.60.4)': + '@rollup/pluginutils@5.4.0(rollup@4.63.4)': dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.7 optionalDependencies: - rollup: 4.60.4 + rollup: 4.63.4 - '@rollup/rollup-android-arm-eabi@4.60.4': + '@rollup/rollup-android-arm-eabi@4.63.4': optional: true - '@rollup/rollup-android-arm64@4.60.4': + '@rollup/rollup-android-arm64@4.63.4': optional: true - '@rollup/rollup-darwin-arm64@4.60.4': + '@rollup/rollup-darwin-arm64@4.63.4': optional: true - '@rollup/rollup-darwin-x64@4.60.4': + '@rollup/rollup-darwin-x64@4.63.4': optional: true - '@rollup/rollup-freebsd-arm64@4.60.4': + '@rollup/rollup-freebsd-arm64@4.63.4': optional: true - '@rollup/rollup-freebsd-x64@4.60.4': + '@rollup/rollup-freebsd-x64@4.63.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.4': + '@rollup/rollup-linux-arm-musleabihf@4.63.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.4': + '@rollup/rollup-linux-arm64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.4': + '@rollup/rollup-linux-arm64-musl@4.63.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.4': + '@rollup/rollup-linux-loong64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.4': + '@rollup/rollup-linux-loong64-musl@4.63.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.4': + '@rollup/rollup-linux-ppc64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.4': + '@rollup/rollup-linux-ppc64-musl@4.63.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.4': + '@rollup/rollup-linux-riscv64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.4': + '@rollup/rollup-linux-riscv64-musl@4.63.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.4': + '@rollup/rollup-linux-s390x-gnu@4.63.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.4': + '@rollup/rollup-linux-x64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-x64-musl@4.60.4': + '@rollup/rollup-linux-x64-musl@4.63.4': optional: true - '@rollup/rollup-openbsd-x64@4.60.4': + '@rollup/rollup-openbsd-x64@4.63.4': optional: true - '@rollup/rollup-openharmony-arm64@4.60.4': + '@rollup/rollup-openharmony-arm64@4.63.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.4': + '@rollup/rollup-win32-arm64-msvc@4.63.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.4': + '@rollup/rollup-win32-ia32-msvc@4.63.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.4': + '@rollup/rollup-win32-x64-gnu@4.63.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.4': + '@rollup/rollup-win32-x64-msvc@4.63.4': optional: true - '@rollup/wasm-node@4.60.4': + '@rollup/wasm-node@4.63.4': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 fsevents: 2.3.3 '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.7.0(@types/node@24.12.4)': + '@rushstack/node-core-library@5.7.0(@types/node@24.13.6)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -21493,33 +21135,33 @@ snapshots: resolve: 1.22.12 semver: 7.5.4 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.12 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@24.12.4)': + '@rushstack/terminal@0.14.0(@types/node@24.13.6)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@24.12.4) + '@rushstack/node-core-library': 5.7.0(@types/node@24.13.6) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 - '@rushstack/ts-command-line@4.22.6(@types/node@24.12.4)': + '@rushstack/ts-command-line@4.22.6(@types/node@24.13.6)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@24.12.4) + '@rushstack/terminal': 0.14.0(@types/node@24.13.6) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@schematics/angular@21.2.12(chokidar@5.0.0)': + '@schematics/angular@21.2.24(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.12(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.12(chokidar@5.0.0) + '@angular-devkit/core': 21.2.24(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.24(chokidar@5.0.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar @@ -21540,32 +21182,32 @@ snapshots: '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@shikijs/vscode-textmate@10.0.2': {} '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/protobuf-specs': 0.5.2 '@sigstore/core@3.2.1': {} - '@sigstore/protobuf-specs@0.5.1': {} + '@sigstore/protobuf-specs@0.5.2': {} '@sigstore/sign@4.1.1(supports-color@8.1.1)': dependencies: '@gar/promise-retry': 1.0.3 '@sigstore/bundle': 4.0.0 '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 - make-fetch-happen: 15.0.5(supports-color@8.1.1) + '@sigstore/protobuf-specs': 0.5.2 + make-fetch-happen: 15.0.6(supports-color@8.1.1) proc-log: 6.1.0 transitivePeerDependencies: - supports-color '@sigstore/tuf@4.0.2(supports-color@8.1.1)': dependencies: - '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/protobuf-specs': 0.5.2 tuf-js: 4.1.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -21574,9 +21216,9 @@ snapshots: dependencies: '@sigstore/bundle': 4.0.0 '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/protobuf-specs': 0.5.2 - '@sinclair/typebox@0.27.10': {} + '@sinclair/typebox@0.27.12': {} '@sinonjs/commons@3.0.1': dependencies: @@ -21586,147 +21228,171 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@solid-primitives/event-listener@2.4.5(solid-js@1.9.13)': + '@solid-primitives/event-listener@2.4.6(solid-js@1.9.15)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) - solid-js: 1.9.13 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 - '@solid-primitives/keyboard@1.3.5(solid-js@1.9.13)': + '@solid-primitives/keyboard@1.3.7(solid-js@1.9.15)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.13) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.13) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) - solid-js: 1.9.13 + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.15) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 - '@solid-primitives/resize-observer@2.1.5(solid-js@1.9.13)': + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.15)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.13) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.13) - '@solid-primitives/static-store': 0.1.3(solid-js@1.9.13) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) - solid-js: 1.9.13 + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.15) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.15) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 - '@solid-primitives/rootless@1.5.3(solid-js@1.9.13)': + '@solid-primitives/rootless@1.5.4(solid-js@1.9.15)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) - solid-js: 1.9.13 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 - '@solid-primitives/static-store@0.1.3(solid-js@1.9.13)': + '@solid-primitives/static-store@0.1.4(solid-js@1.9.15)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) - solid-js: 1.9.13 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 - '@solid-primitives/utils@6.4.0(solid-js@1.9.13)': + '@solid-primitives/utils@6.4.1(solid-js@1.9.15)': dependencies: - solid-js: 1.9.13 + solid-js: 1.9.15 - '@solidjs/testing-library@0.8.10(solid-js@1.9.13)': + '@solidjs/testing-library@0.8.10(solid-js@1.9.15)': dependencies: - '@testing-library/dom': 10.4.1 - solid-js: 1.9.13 + '@testing-library/dom': 10.4.2 + solid-js: 1.9.15 '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@5.10.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/types': 8.59.4 + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/types': 8.70.0 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.4 + picomatch: 4.0.7 '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': dependencies: acorn: 8.18.0 - '@sveltejs/package@2.5.7(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)': + '@sveltejs/load-config@0.2.3': {} + + '@sveltejs/package@2.5.8(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)': dependencies: chokidar: 5.0.0 kleur: 4.1.5 sade: 1.8.1 - semver: 7.8.1 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) - svelte2tsx: 0.7.55(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3) + semver: 7.8.5 + svelte: 5.57.1(@typescript-eslint/types@8.70.0) + svelte2tsx: 0.7.61(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + debug: 4.4.3(supports-color@7.2.0) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@sveltejs/vite-plugin-svelte': 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) debug: 4.4.3(supports-color@8.1.1) - svelte: 5.55.9(@typescript-eslint/types@8.59.4) - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@7.2.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + debug: 4.4.3(supports-color@7.2.0) + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.57.1(@typescript-eslint/types@8.70.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(supports-color@8.1.1)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) debug: 4.4.3(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vitefu: 1.1.3(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) transitivePeerDependencies: - supports-color - '@swc/core-darwin-arm64@1.15.40': + '@swc/core-darwin-arm64@1.16.2': optional: true - '@swc/core-darwin-x64@1.15.40': + '@swc/core-darwin-x64@1.16.2': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.40': + '@swc/core-linux-arm-gnueabihf@1.16.2': optional: true - '@swc/core-linux-arm64-gnu@1.15.40': + '@swc/core-linux-arm64-gnu@1.16.2': optional: true - '@swc/core-linux-arm64-musl@1.15.40': + '@swc/core-linux-arm64-musl@1.16.2': optional: true - '@swc/core-linux-ppc64-gnu@1.15.40': + '@swc/core-linux-ppc64-gnu@1.16.2': optional: true - '@swc/core-linux-s390x-gnu@1.15.40': + '@swc/core-linux-s390x-gnu@1.16.2': optional: true - '@swc/core-linux-x64-gnu@1.15.40': + '@swc/core-linux-x64-gnu@1.16.2': optional: true - '@swc/core-linux-x64-musl@1.15.40': + '@swc/core-linux-x64-musl@1.16.2': optional: true - '@swc/core-win32-arm64-msvc@1.15.40': + '@swc/core-win32-arm64-msvc@1.16.2': optional: true - '@swc/core-win32-ia32-msvc@1.15.40': + '@swc/core-win32-ia32-msvc@1.16.2': optional: true - '@swc/core-win32-x64-msvc@1.15.40': + '@swc/core-win32-x64-msvc@1.16.2': optional: true - '@swc/core@1.15.40': + '@swc/core@1.16.2': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.26 + '@swc/types': 0.1.28 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.40 - '@swc/core-darwin-x64': 1.15.40 - '@swc/core-linux-arm-gnueabihf': 1.15.40 - '@swc/core-linux-arm64-gnu': 1.15.40 - '@swc/core-linux-arm64-musl': 1.15.40 - '@swc/core-linux-ppc64-gnu': 1.15.40 - '@swc/core-linux-s390x-gnu': 1.15.40 - '@swc/core-linux-x64-gnu': 1.15.40 - '@swc/core-linux-x64-musl': 1.15.40 - '@swc/core-win32-arm64-msvc': 1.15.40 - '@swc/core-win32-ia32-msvc': 1.15.40 - '@swc/core-win32-x64-msvc': 1.15.40 + '@swc/core-darwin-arm64': 1.16.2 + '@swc/core-darwin-x64': 1.16.2 + '@swc/core-linux-arm-gnueabihf': 1.16.2 + '@swc/core-linux-arm64-gnu': 1.16.2 + '@swc/core-linux-arm64-musl': 1.16.2 + '@swc/core-linux-ppc64-gnu': 1.16.2 + '@swc/core-linux-s390x-gnu': 1.16.2 + '@swc/core-linux-x64-gnu': 1.16.2 + '@swc/core-linux-x64-musl': 1.16.2 + '@swc/core-win32-arm64-msvc': 1.16.2 + '@swc/core-win32-ia32-msvc': 1.16.2 + '@swc/core-win32-x64-msvc': 1.16.2 '@swc/counter@0.1.3': {} @@ -21734,81 +21400,81 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.26': + '@swc/types@0.1.28': dependencies: '@swc/counter': 0.1.3 - '@tanstack/angular-store@0.9.3(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))': + '@tanstack/angular-store@0.9.3(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@tanstack/store': 0.9.3 tslib: 2.8.1 '@tanstack/devtools-client@0.0.6': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.4 '@tanstack/devtools-event-bus@0.4.1': dependencies: - ws: 8.21.0 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.4.3': {} + '@tanstack/devtools-event-client@0.4.4': {} - '@tanstack/devtools-ui@0.5.0(csstype@3.2.3)(solid-js@1.9.13)': + '@tanstack/devtools-ui@0.5.0(csstype@3.2.3)(solid-js@1.9.15)': dependencies: clsx: 2.1.1 - dayjs: 1.11.20 + dayjs: 1.11.23 goober: 2.1.19(csstype@3.2.3) - solid-js: 1.9.13 + solid-js: 1.9.15 transitivePeerDependencies: - csstype - '@tanstack/devtools-ui@0.5.2(csstype@3.2.3)(solid-js@1.9.13)': + '@tanstack/devtools-ui@0.5.3(csstype@3.2.3)(solid-js@1.9.15)': dependencies: clsx: 2.1.1 - dayjs: 1.11.20 + dayjs: 1.11.23 goober: 2.1.19(csstype@3.2.3) - solid-js: 1.9.13 + solid-js: 1.9.15 transitivePeerDependencies: - csstype - '@tanstack/devtools-utils@0.4.0(@types/react@19.2.17)(preact@10.29.2)(react@19.1.0)(solid-js@1.9.13)(vue@3.5.34(typescript@5.9.3))': + '@tanstack/devtools-utils@0.4.0(@types/react@19.2.18)(preact@10.29.8)(react@19.1.0)(solid-js@1.9.15)(vue@3.5.43(typescript@5.9.3))': optionalDependencies: - '@types/react': 19.2.17 - preact: 10.29.2 + '@types/react': 19.2.18 + preact: 10.29.8 react: 19.1.0 - solid-js: 1.9.13 - vue: 3.5.34(typescript@5.9.3) + solid-js: 1.9.15 + vue: 3.5.43(typescript@5.9.3) - '@tanstack/devtools@0.10.14(csstype@3.2.3)(solid-js@1.9.13)': + '@tanstack/devtools@0.10.14(csstype@3.2.3)(solid-js@1.9.15)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.13) - '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.13) - '@solid-primitives/resize-observer': 2.1.5(solid-js@1.9.13) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) + '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.15) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.15) '@tanstack/devtools-client': 0.0.6 '@tanstack/devtools-event-bus': 0.4.1 - '@tanstack/devtools-ui': 0.5.0(csstype@3.2.3)(solid-js@1.9.13) + '@tanstack/devtools-ui': 0.5.0(csstype@3.2.3)(solid-js@1.9.15) clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) - solid-js: 1.9.13 + solid-js: 1.9.15 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint/js': 9.39.4 + '@eslint/js': 9.39.5 '@stylistic/eslint-plugin': 5.10.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) eslint-plugin-n: 17.24.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - vue-eslint-parser: 10.4.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + typescript-eslint: 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + vue-eslint-parser: 10.4.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -21816,32 +21482,32 @@ snapshots: - supports-color - typescript - '@tanstack/history@1.162.0': {} + '@tanstack/history@1.162.4': {} '@tanstack/lit-store@0.13.2(lit@3.3.3)': dependencies: '@tanstack/store': 0.11.0 lit: 3.3.3 - '@tanstack/octane-store@0.12.2(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))': + '@tanstack/octane-store@0.12.2(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))': dependencies: '@tanstack/store': 0.11.1 - octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + octane: 0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tanstack/pacer-lite@0.1.1': {} - '@tanstack/preact-store@0.13.1(preact@10.29.2)': + '@tanstack/preact-store@0.13.2(preact@10.29.8)': dependencies: - '@tanstack/store': 0.11.0 - preact: 10.29.2 + '@tanstack/store': 0.11.1 + preact: 10.29.8 - '@tanstack/query-core@5.100.14': {} + '@tanstack/query-core@5.103.1': {} - '@tanstack/react-devtools@0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.13)': + '@tanstack/react-devtools@0.9.13(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(csstype@3.2.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.15)': dependencies: - '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.13) - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -21850,233 +21516,236 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-query@5.100.14(react@19.1.0)': - dependencies: - '@tanstack/query-core': 5.100.14 - react: 19.1.0 - - '@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-query@5.103.1(react@19.1.0)': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/react-store': 0.9.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-core': 1.171.14 - isbot: 5.1.40 + '@tanstack/query-core': 5.103.1 react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - '@tanstack/react-router@1.170.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/react-store': 0.9.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-core': 1.171.6 - isbot: 5.1.40 + '@tanstack/history': 1.162.4 + '@tanstack/react-store': 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.171.32 + isbot: 5.2.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/react-start-client@1.168.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-start-client@1.168.36(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-core': 1.171.14 - '@tanstack/start-client-core': 1.170.13 + '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.171.32 + '@tanstack/start-client-core': 1.170.32 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/react-start-rsc@0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/react-start-rsc@0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: - '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-core': 1.171.14 - '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) - '@tanstack/start-client-core': 1.170.13 + '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.171.32 + '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) + '@tanstack/start-client-core': 1.170.32 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) - '@tanstack/start-server-core': 1.169.16 - '@tanstack/start-storage-context': 1.167.16 + '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/start-storage-context': 1.167.34 pathe: 2.0.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: + - '@farmfe/core' - '@rsbuild/core' + - bun-types-no-globals - crossws + - esbuild + - rolldown + - rollup - supports-color + - unloader - vite - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.167.21(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-start-server@1.167.43(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-core': 1.171.14 - '@tanstack/start-server-core': 1.169.16 + '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.171.32 + '@tanstack/start-server-core': 1.169.37 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.27(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/react-start@1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: - '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/react-start-client': 1.168.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/react-start-rsc': 0.1.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) - '@tanstack/react-start-server': 1.167.21(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) - '@tanstack/start-client-core': 1.170.13 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) - '@tanstack/start-server-core': 1.169.16 + '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start-client': 1.168.36(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start-rsc': 0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/react-start-server': 1.167.43(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) + '@tanstack/start-client-core': 1.170.32 + '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/start-server-core': 1.169.37 pathe: 2.0.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: + - '@farmfe/core' - '@rspack/core' + - bun-types-no-globals - crossws + - esbuild - react-server-dom-rspack + - rolldown + - rollup - supports-color + - unloader - vite-plugin-solid - webpack - '@tanstack/react-store@0.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@tanstack/store': 0.11.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - use-sync-external-store: 1.6.0(react@19.1.0) - - '@tanstack/react-store@0.9.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-store@0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/store': 0.9.3 + '@tanstack/store': 0.11.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - use-sync-external-store: 1.6.0(react@19.1.0) + use-sync-external-store: 1.7.0(react@19.1.0) - '@tanstack/router-core@1.171.14': + '@tanstack/router-core@1.171.32': dependencies: - '@tanstack/history': 1.162.0 + '@tanstack/history': 1.162.4 cookie-es: 3.1.1 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.6.7 + seroval-plugins: 1.6.7(seroval@1.6.7) - '@tanstack/router-core@1.171.6': + '@tanstack/router-generator@1.167.38(supports-color@8.1.1)': dependencies: - '@tanstack/history': 1.162.0 - cookie-es: 3.1.1 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) - - '@tanstack/router-generator@1.167.18(supports-color@8.1.1)': - dependencies: - '@babel/types': 7.29.7 - '@tanstack/router-core': 1.171.14 - '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) + '@babel/types': 7.29.8 + '@tanstack/router-core': 1.171.32 + '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 magic-string: 0.30.21 - prettier: 3.8.3 - zod: 4.4.3 + prettier: 3.9.8 + zod: 4.6.5 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/router-plugin@1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - '@tanstack/router-core': 1.171.14 - '@tanstack/router-generator': 1.167.18(supports-color@8.1.1) - '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) + '@babel/types': 7.29.8 + '@tanstack/router-core': 1.171.32 + '@tanstack/router-generator': 1.167.38(supports-color@8.1.1) + '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) chokidar: 5.0.0 - unplugin: 3.0.0 - zod: 4.4.3 + unplugin: 3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + zod: 4.6.5 optionalDependencies: - '@tanstack/react-router': 1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vite-plugin-solid: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15) + '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-plugin-solid: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28) transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup - supports-color + - unloader - '@tanstack/router-utils@1.162.2(supports-color@8.1.1)': + '@tanstack/router-utils@1.162.3(supports-color@8.1.1)': dependencies: - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - ansis: 4.3.0 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + ansis: 4.4.0 babel-dead-code-elimination: 1.0.12(supports-color@8.1.1) diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 transitivePeerDependencies: - supports-color - '@tanstack/solid-devtools@0.7.33(csstype@3.2.3)(solid-js@1.9.13)': + '@tanstack/solid-devtools@0.7.33(solid-js@1.9.15)': dependencies: - '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.13) - solid-js: 1.9.13 + '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.15) + solid-js: 1.9.15 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/solid-store@0.11.0(solid-js@1.9.13)': + '@tanstack/solid-store@0.11.1(solid-js@1.9.15)': dependencies: - '@tanstack/store': 0.11.0 - solid-js: 1.9.13 + '@tanstack/store': 0.11.1 + solid-js: 1.9.15 - '@tanstack/start-client-core@1.170.13': + '@tanstack/start-client-core@1.170.32': dependencies: - '@tanstack/router-core': 1.171.14 + '@tanstack/router-core': 1.171.32 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-storage-context': 1.167.16 - seroval: 1.5.4 + '@tanstack/start-storage-context': 1.167.34 + seroval: 1.6.7 '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15))': + '@tanstack/start-plugin-core@1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 - '@tanstack/router-core': 1.171.14 - '@tanstack/router-generator': 1.167.18(supports-color@8.1.1) - '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(supports-color@8.1.1)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) - '@tanstack/router-utils': 1.162.2(supports-color@8.1.1) - '@tanstack/start-server-core': 1.169.16 - exsolve: 1.0.8 - lightningcss: 1.32.0 + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + '@tanstack/router-core': 1.171.32 + '@tanstack/router-generator': 1.167.38(supports-color@8.1.1) + '@tanstack/router-plugin': 1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) + '@tanstack/start-server-core': 1.169.37 + exsolve: 1.1.1 + lightningcss: 1.33.0 pathe: 2.0.3 - picomatch: 4.0.4 - seroval: 1.5.4 + picomatch: 4.0.7 + seroval: 1.6.7 source-map: 0.7.6 - srvx: 0.11.16 - tinyglobby: 0.2.16 + srvx: 0.11.22 + tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) xmlbuilder2: 4.0.3 - zod: 4.4.3 + zod: 4.6.5 optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' - '@tanstack/react-router' + - bun-types-no-globals - crossws + - esbuild + - rolldown + - rollup - supports-color + - unloader - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.169.16': + '@tanstack/start-server-core@1.169.37': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/router-core': 1.171.14 - '@tanstack/start-client-core': 1.170.13 - '@tanstack/start-storage-context': 1.167.16 + '@tanstack/history': 1.162.4 + '@tanstack/router-core': 1.171.32 + '@tanstack/start-client-core': 1.170.32 + '@tanstack/start-storage-context': 1.167.34 fetchdts: 0.1.7 h3-v2: h3@2.0.1-rc.20 - seroval: 1.5.4 + seroval: 1.6.7 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.167.16': + '@tanstack/start-storage-context@1.167.34': dependencies: - '@tanstack/router-core': 1.171.14 + '@tanstack/router-core': 1.171.32 '@tanstack/store@0.11.0': {} @@ -22084,10 +21753,10 @@ snapshots: '@tanstack/store@0.9.3': {} - '@tanstack/svelte-store@0.12.0(svelte@5.55.9(@typescript-eslint/types@8.59.4))': + '@tanstack/svelte-store@0.12.1(svelte@5.57.1(@typescript-eslint/types@8.70.0))': dependencies: - '@tanstack/store': 0.11.0 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + '@tanstack/store': 0.11.1 + svelte: 5.57.1(@typescript-eslint/types@8.70.0) '@tanstack/typedoc-config@0.3.1(typescript@5.9.3)': dependencies: @@ -22099,12 +21768,12 @@ snapshots: '@tanstack/virtual-file-routes@1.162.0': {} - '@tanstack/vite-config@0.4.1(@types/node@24.12.4)(rollup@4.60.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@tanstack/vite-config@0.4.1(@types/node@24.13.6)(rollup@4.63.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.60.4) - vite-plugin-dts: 4.2.3(@types/node@24.12.4)(rollup@4.60.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - vite-plugin-externalize-deps: 0.10.0(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - vite-tsconfig-paths: 5.1.4(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.63.4) + vite-plugin-dts: 4.2.3(@types/node@24.13.6)(rollup@4.63.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite-tsconfig-paths: 5.1.4(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -22112,22 +21781,20 @@ snapshots: - typescript - vite - '@tanstack/vue-store@0.11.0(vue@3.5.34(typescript@5.9.3))': + '@tanstack/vue-store@0.11.1(vue@3.5.43(typescript@5.9.3))': dependencies: - '@tanstack/store': 0.11.0 - vue: 3.5.34(typescript@5.9.3) - vue-demi: 0.14.10(vue@3.5.34(typescript@5.9.3)) + '@tanstack/store': 0.11.1 + vue: 3.5.43(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.43(typescript@5.9.3)) - '@testing-library/angular@19.3.0(3552bf3db4cf28d0cedfe8eb15d0ed21)': + '@testing-library/angular@19.5.0(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/router@21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@testing-library/dom@10.4.2)': dependencies: - '@angular/common': 21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/router': 21.2.14(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.14(@angular/animations@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.14(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.14(@angular/compiler@21.2.14)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - '@testing-library/dom': 10.4.1 + '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/router': 21.2.23(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@testing-library/dom': 10.4.2 tslib: 2.8.1 - '@testing-library/dom@10.4.1': + '@testing-library/dom@10.4.2': dependencies: '@babel/code-frame': 7.29.7 '@babel/runtime': 7.29.7 @@ -22160,70 +21827,60 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.9.1': + '@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2)': dependencies: '@adobe/css-tools': 4.5.0 + '@testing-library/dom': 10.4.2 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/preact@3.2.4(preact@10.29.2)': + '@testing-library/preact@3.2.4(preact@10.29.8)': dependencies: '@testing-library/dom': 8.20.1 - preact: 10.29.2 + preact: 10.29.8 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.29.7 - '@testing-library/dom': 10.4.1 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) + '@testing-library/dom': 10.4.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 19.2.18 + '@types/react-dom': 19.3.0(@types/react@19.2.18) - '@testing-library/svelte-core@1.0.0(svelte@5.55.9(@typescript-eslint/types@8.59.4))': + '@testing-library/svelte-core@1.1.3(svelte@5.57.1(@typescript-eslint/types@8.70.0))': dependencies: - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) - '@testing-library/svelte@5.3.1(svelte@5.55.9(@typescript-eslint/types@8.59.4))(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0))': + '@testing-library/svelte@5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/svelte-core': 1.0.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + '@testing-library/dom': 10.4.2 + '@testing-library/svelte-core': 1.1.3(svelte@5.57.1(@typescript-eslint/types@8.70.0)) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) - - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': - dependencies: - '@testing-library/dom': 10.4.1 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) - '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.2)': dependencies: - '@testing-library/dom': 10.4.1 + '@testing-library/dom': 10.4.2 - '@testing-library/vue@8.1.0(@vue/compiler-dom@3.5.34)(@vue/compiler-sfc@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': + '@testing-library/vue@8.1.0(@vue/compiler-dom@3.5.43)(@vue/compiler-sfc@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3))': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 9.3.4 - '@vue/test-utils': 2.4.10(@vue/compiler-dom@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) - vue: 3.5.34(typescript@5.9.3) + '@vue/test-utils': 2.5.1(@vue/compiler-dom@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3)) + vue: 3.5.43(typescript@5.9.3) optionalDependencies: - '@vue/compiler-sfc': 3.5.34 + '@vue/compiler-sfc': 3.5.43 transitivePeerDependencies: - '@vue/compiler-dom' - '@vue/server-renderer' - '@ts-morph/common@0.22.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 9.0.9 - mkdirp: 3.0.1 - path-browserify: 1.0.1 - '@tsconfig/node10@1.0.13': {} '@tsconfig/node12@1.0.11': {} @@ -22234,7 +21891,7 @@ snapshots: '@tsconfig/svelte@5.0.8': {} - '@tsrx/core@0.2.4(@typescript-eslint/types@8.59.4)': + '@tsrx/core@0.2.4(@typescript-eslint/types@8.70.0)': dependencies: '@jridgewell/sourcemap-codec': 1.6.0 '@noble/hashes': 2.4.0 @@ -22243,24 +21900,24 @@ snapshots: '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 acorn: 8.18.0 - esrap: 2.3.7(@typescript-eslint/types@8.59.4) + esrap: 2.3.7(@typescript-eslint/types@8.70.0) get-tsconfig: 5.0.0-beta.6 magic-string: 0.30.21 - zimmerframe: 1.1.4 + zimmerframe: 1.1.5 transitivePeerDependencies: - '@typescript-eslint/types' - '@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': + '@tsrx/eslint-parser@0.4.7(@typescript-eslint/types@8.70.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': dependencies: - '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.70.0) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) transitivePeerDependencies: - '@typescript-eslint/types' - '@tsrx/eslint-plugin@0.4.6(@tsrx/eslint-parser@0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': + '@tsrx/eslint-plugin@0.4.7(@tsrx/eslint-parser@0.4.7(@typescript-eslint/types@8.70.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)))(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))': dependencies: - '@tsrx/eslint-parser': 0.4.6(@typescript-eslint/types@8.59.4)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@tsrx/eslint-parser': 0.4.7(@typescript-eslint/types@8.70.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) '@tsrx/oxc-darwin-arm64@0.13.0': @@ -22287,10 +21944,10 @@ snapshots: '@tsrx/oxc-win32-x64-msvc@0.13.0': optional: true - '@tsrx/oxc@0.13.0(svelte@5.55.9(@typescript-eslint/types@8.59.4))': + '@tsrx/oxc@0.13.0(svelte@5.57.1(@typescript-eslint/types@8.70.0))': dependencies: '@oxc-project/types': 0.140.0 - oxfmt-current: oxfmt@0.59.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) + oxfmt-current: oxfmt@0.59.0(svelte@5.57.1(@typescript-eslint/types@8.70.0)) oxlint-current: oxlint@1.74.0(oxlint-tsgolint@0.24.0) oxlint-tsgolint: 0.24.0 pathe: 2.0.3 @@ -22308,34 +21965,29 @@ snapshots: - svelte - vite-plus - '@tsrx/prettier-plugin@0.4.7(@typescript-eslint/types@8.59.4)(prettier@3.8.3)': + '@tsrx/prettier-plugin@0.4.7(@typescript-eslint/types@8.70.0)(prettier@3.9.8)': dependencies: - '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) - prettier: 3.8.3 + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.70.0) + prettier: 3.9.8 transitivePeerDependencies: - '@typescript-eslint/types' '@tsrx/runtime@0.2.2': {} - '@tsrx/typescript-plugin@0.4.6(octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)))(typescript@5.9.3)': + '@tsrx/typescript-plugin@0.4.6(octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.28 '@volar/typescript': 2.4.28(typescript@5.9.3) typescript: 5.9.3 optionalDependencies: - octane: 0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + octane: 0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 10.2.5 - - '@tybys/wasm-util@0.10.2': - dependencies: - tslib: 2.8.1 - optional: true + minimatch: 10.2.6 '@tybys/wasm-util@0.10.4': dependencies: @@ -22356,33 +22008,33 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/chai@5.2.3': dependencies: @@ -22391,12 +22043,12 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.8 - '@types/node': 24.12.4 + '@types/express-serve-static-core': 4.19.9 + '@types/node': 24.13.6 '@types/connect@3.4.38': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/cookie@0.6.0': {} @@ -22422,13 +22074,11 @@ snapshots: dependencies: '@types/estree': 1.0.9 - '@types/estree@1.0.8': {} - '@types/estree@1.0.9': {} - '@types/express-serve-static-core@4.19.8': + '@types/express-serve-static-core@4.19.9': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -22436,13 +22086,13 @@ snapshots: '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 + '@types/express-serve-static-core': 4.19.9 '@types/qs': 6.15.1 '@types/serve-static': 1.15.10 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/hammerjs@2.0.46': {} @@ -22450,7 +22100,7 @@ snapshots: dependencies: '@types/unist': 2.0.11 - '@types/hast@3.0.4': + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -22458,7 +22108,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/istanbul-lib-coverage@2.0.6': {} @@ -22480,15 +22130,15 @@ snapshots: dependencies: '@types/unist': 2.0.11 - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.14': {} '@types/mime@1.3.5': {} '@types/ms@2.1.0': {} - '@types/node@24.12.4': + '@types/node@24.13.6': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/parse-json@4.0.2': {} @@ -22498,15 +22148,15 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.2.3(@types/react@19.2.17)': + '@types/react-dom@19.3.0(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@types/react-transition-group@4.4.12(@types/react@19.2.17)': + '@types/react-transition-group@4.4.12(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@types/react@19.2.17': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 @@ -22515,11 +22165,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/send@1.2.1': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/serve-index@1.9.4': dependencies: @@ -22528,12 +22178,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/stack-utils@2.0.3': {} @@ -22545,7 +22195,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 '@types/yargs-parser@21.0.3': {} @@ -22553,94 +22203,94 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) - ignore: 7.0.5 + ignore: 7.0.9 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) - ignore: 7.0.5 + ignore: 7.0.9 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@7.2.0) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/project-service@8.70.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/project-service@8.70.0(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.4': + '@typescript-eslint/scope-manager@8.70.0': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 - '@typescript-eslint/tsconfig-utils@8.59.4(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.70.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) debug: 4.4.3(supports-color@7.2.0) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -22648,11 +22298,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -22660,66 +22310,66 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.4': {} + '@typescript-eslint/types@8.70.0': {} - '@typescript-eslint/typescript-estree@8.59.4(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.70.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@7.2.0) - minimatch: 10.2.5 - semver: 7.8.1 + minimatch: 10.2.6 + semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.4(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.70.0(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.4(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.70.0(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 - semver: 7.8.1 + minimatch: 10.2.6 + semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@8.1.1)(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.4': + '@typescript-eslint/visitor-keys@8.70.0': dependencies: - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.70.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.1': {} + '@ungap/structured-clone@1.4.0': {} '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true @@ -22779,7 +22429,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': @@ -22793,7 +22443,7 @@ snapshots: '@urql/core@5.2.0': dependencies: - '@0no-co/graphql.web': 1.2.0 + '@0no-co/graphql.web': 1.3.4 wonka: 6.3.6 transitivePeerDependencies: - graphql @@ -22809,7 +22459,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vanilla-extract/css@1.20.1(babel-plugin-macros@3.1.0)': + '@vanilla-extract/css@1.21.2(babel-plugin-macros@3.1.0)': dependencies: '@emotion/hash': 0.9.2 '@vanilla-extract/private': 1.0.9 @@ -22825,12 +22475,12 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0)': + '@vanilla-extract/integration@6.5.0(@types/node@24.13.6)(babel-plugin-macros@3.1.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@vanilla-extract/babel-plugin-debug-ids': 1.2.2(supports-color@8.1.1) - '@vanilla-extract/css': 1.20.1(babel-plugin-macros@3.1.0) + '@vanilla-extract/css': 1.21.2(babel-plugin-macros@3.1.0) esbuild: 0.17.6 eval: 0.1.8 find-up: 5.0.0 @@ -22838,8 +22488,8 @@ snapshots: lodash: 4.18.1 mlly: 1.8.2 outdent: 0.8.0 - vite: 5.4.21(@types/node@24.12.4)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0) - vite-node: 1.6.1(@types/node@24.12.4)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0) + vite: 5.4.21(@types/node@24.13.6)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2) + vite-node: 1.6.1(@types/node@24.13.6)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -22854,28 +22504,28 @@ snapshots: '@vanilla-extract/private@1.0.9': {} - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.23))(terser@5.46.0)(yaml@2.9.1))': dependencies: - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.23))(terser@5.46.0)(yaml@2.9.1) - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) optional: true - '@vitejs/plugin-react-swc@3.11.0(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0))': + '@vitejs/plugin-react-swc@3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 - '@swc/core': 1.15.40 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + '@swc/core': 1.16.2 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) @@ -22883,28 +22533,16 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0))': + '@vitejs/plugin-vue@5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3))': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) - '@rolldown/pluginutils': 1.0.0-rc.3 - '@types/babel__core': 7.20.5 - react-refresh: 0.18.0 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-vue@5.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))(vue@3.5.34(typescript@5.9.3))': - dependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vue: 3.5.34(typescript@5.9.3) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vue: 3.5.43(typescript@5.9.3) - '@vitest/coverage-istanbul@3.2.4(supports-color@7.2.0)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitest/coverage-istanbul@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@istanbuljs/schema': 0.1.6 debug: 4.4.3(supports-color@7.2.0) @@ -22916,49 +22554,57 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0))': + '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 3.2.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - '@vitest/pretty-format@3.2.4': + '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + + '@vitest/pretty-format@3.2.7': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.4': + '@vitest/runner@3.2.7': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 3.2.7 pathe: 2.0.3 strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@3.2.7': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 3.2.7 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': + '@vitest/spy@3.2.7': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.6 - '@vitest/utils@3.2.4': + '@vitest/utils@3.2.7': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 3.2.7 loupe: 3.2.1 tinyrainbow: 2.0.0 @@ -22978,7 +22624,7 @@ snapshots: dependencies: '@volar/language-core': 2.4.15 path-browserify: 1.0.1 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 optionalDependencies: typescript: 5.9.3 @@ -22986,39 +22632,39 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 optionalDependencies: typescript: 5.9.3 - '@vue/compiler-core@3.5.34': + '@vue/compiler-core@3.5.43': dependencies: - '@babel/parser': 7.29.7 - '@vue/shared': 3.5.34 + '@babel/parser': 7.29.9 + '@vue/shared': 3.5.43 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.34': + '@vue/compiler-dom@3.5.43': dependencies: - '@vue/compiler-core': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/compiler-core': 3.5.43 + '@vue/shared': 3.5.43 - '@vue/compiler-sfc@3.5.34': + '@vue/compiler-sfc@3.5.43': dependencies: - '@babel/parser': 7.29.7 - '@vue/compiler-core': 3.5.34 - '@vue/compiler-dom': 3.5.34 - '@vue/compiler-ssr': 3.5.34 - '@vue/shared': 3.5.34 + '@babel/parser': 7.29.9 + '@vue/compiler-core': 3.5.43 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-ssr': 3.5.43 + '@vue/shared': 3.5.43 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.15 + postcss: 8.5.28 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.34': + '@vue/compiler-ssr@3.5.43': dependencies: - '@vue/compiler-dom': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/compiler-dom': 3.5.43 + '@vue/shared': 3.5.43 '@vue/compiler-vue2@2.7.16': dependencies: @@ -23028,9 +22674,9 @@ snapshots: '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.34 + '@vue/compiler-dom': 3.5.43 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.34 + '@vue/shared': 3.5.43 computeds: 0.0.1 minimatch: 9.0.9 muggle-string: 0.4.1 @@ -23041,9 +22687,9 @@ snapshots: '@vue/language-core@2.2.12(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.15 - '@vue/compiler-dom': 3.5.34 + '@vue/compiler-dom': 3.5.43 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.34 + '@vue/shared': 3.5.43 alien-signals: 1.0.13 minimatch: 9.0.9 muggle-string: 0.4.1 @@ -23051,38 +22697,38 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@vue/reactivity@3.5.34': + '@vue/reactivity@3.5.43': dependencies: - '@vue/shared': 3.5.34 + '@vue/shared': 3.5.43 - '@vue/runtime-core@3.5.34': + '@vue/runtime-core@3.5.43': dependencies: - '@vue/reactivity': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/reactivity': 3.5.43 + '@vue/shared': 3.5.43 - '@vue/runtime-dom@3.5.34': + '@vue/runtime-dom@3.5.43': dependencies: - '@vue/reactivity': 3.5.34 - '@vue/runtime-core': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/reactivity': 3.5.43 + '@vue/runtime-core': 3.5.43 + '@vue/shared': 3.5.43 csstype: 3.2.3 - '@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3))': + '@vue/server-renderer@3.5.43': dependencies: - '@vue/compiler-ssr': 3.5.34 - '@vue/shared': 3.5.34 - vue: 3.5.34(typescript@5.9.3) + '@vue/compiler-ssr': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/shared': 3.5.43 - '@vue/shared@3.5.34': {} + '@vue/shared@3.5.43': {} - '@vue/test-utils@2.4.10(@vue/compiler-dom@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': + '@vue/test-utils@2.5.1(@vue/compiler-dom@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3))': dependencies: - '@vue/compiler-dom': 3.5.34 - js-beautify: 1.15.4 - vue: 3.5.34(typescript@5.9.3) - vue-component-type-helpers: 3.3.2 + '@vue/compiler-dom': 3.5.43 + js-beautify: 2.0.3 + vue: 3.5.43(typescript@5.9.3) + vue-component-type-helpers: 3.3.11 optionalDependencies: - '@vue/server-renderer': 3.5.34(vue@3.5.34(typescript@5.9.3)) + '@vue/server-renderer': 3.5.43 '@web3-storage/multipart-parser@1.0.0': {} @@ -23162,9 +22808,9 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@xmldom/xmldom@0.8.13': {} + '@xmldom/xmldom@0.8.15': {} - '@xmldom/xmldom@0.9.10': {} + '@xmldom/xmldom@0.9.12': {} '@xtuc/ieee754@1.2.0': {} @@ -23184,10 +22830,10 @@ snapshots: '@zxing/text-encoding@0.9.0': optional: true - abbrev@2.0.0: {} - abbrev@4.0.0: {} + abbrev@5.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -23200,7 +22846,7 @@ snapshots: accepts@2.0.0: dependencies: mime-types: 3.0.2 - negotiator: 1.0.0 + negotiator: 1.1.0 acorn-import-phases@1.0.4(acorn@8.18.0): dependencies: @@ -23229,6 +22875,8 @@ snapshots: agent-base@7.1.4: {} + agent-cli-detector@0.1.7: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -23238,10 +22886,6 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv-formats@2.1.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -23283,14 +22927,14 @@ snapshots: ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -23333,7 +22977,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.3.0: {} ansi-styles@3.2.1: dependencies: @@ -23347,7 +22991,7 @@ snapshots: ansi-styles@6.2.3: {} - ansis@4.3.0: {} + ansis@4.4.0: {} any-promise@1.3.0: {} @@ -23382,15 +23026,15 @@ snapshots: aria-query@5.3.2: {} - arkregex@0.0.5: + arkregex@0.0.8: dependencies: - '@ark/util': 0.56.0 + '@ark/util': 0.56.2 - arktype@2.2.0: + arktype@2.2.3: dependencies: - '@ark/schema': 0.56.0 - '@ark/util': 0.56.0 - arkregex: 0.0.5 + '@ark/schema': 0.56.2 + '@ark/util': 0.56.2 + arkregex: 0.0.8 array-buffer-byte-length@1.0.2: dependencies: @@ -23399,14 +23043,14 @@ snapshots: array-flatten@1.1.1: {} - array-includes@3.1.9: + array-includes@3.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 + es-shim-unscopables: 1.1.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -23466,14 +23110,14 @@ snapshots: asn1js@3.0.10: dependencies: pvtsutils: 1.3.6 - pvutils: 1.1.5 + pvutils: 1.2.0 tslib: 2.8.1 assertion-error@2.0.1: {} - ast-kit@3.0.0-beta.1: + ast-kit@3.0.0: dependencies: - '@babel/parser': 8.0.0-rc.3 + '@babel/parser': 8.0.6 estree-walker: 3.0.3 pathe: 2.0.3 @@ -23485,13 +23129,13 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.27(postcss@8.5.12): + autoprefixer@10.4.27(postcss@8.5.23): dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.29.0 + caniuse-lite: 1.0.30001810 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.12 + postcss: 8.5.23 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -23501,7 +23145,7 @@ snapshots: axios@1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) - form-data: 4.0.5 + form-data: 4.0.6 https-proxy-agent: 5.0.1(supports-color@7.2.0) proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -23513,9 +23157,9 @@ snapshots: babel-dead-code-elimination@1.0.12(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -23532,11 +23176,17 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.29.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + babel-loader@10.0.0(@babel/core@7.29.7(supports-color@7.2.0))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + find-up: 5.0.0 + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) + + babel-loader@10.0.0(@babel/core@7.29.7(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) find-up: 5.0.0 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) babel-plugin-istanbul@6.1.1(supports-color@8.1.1): dependencies: @@ -23551,16 +23201,16 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 - babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7(supports-color@7.2.0)): + babel-plugin-jsx-dom-expressions@0.40.10(@babel/core@7.29.7(supports-color@7.2.0)): dependencies: '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 html-entities: 2.3.3 parse5: 7.3.0 @@ -23570,11 +23220,11 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.12 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1): dependencies: '@babel/compat-data': 7.29.7 - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -23588,11 +23238,11 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - core-js-compat: 3.49.0 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color @@ -23600,22 +23250,30 @@ snapshots: dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1): + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1): + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) - core-js-compat: 3.49.0 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.0(supports-color@8.1.1) - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -23628,11 +23286,11 @@ snapshots: babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 babel-plugin-react-compiler@19.1.0-rc.3: dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 babel-plugin-react-native-web@0.21.2: {} @@ -23669,7 +23327,7 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7(supports-color@8.1.1)) - babel-preset-expo@54.0.10(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@54.0.34)(react-refresh@0.14.2)(supports-color@8.1.1): + babel-preset-expo@54.0.12(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@54.0.37)(react-refresh@0.14.2)(supports-color@8.1.1): dependencies: '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) @@ -23696,7 +23354,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -23707,12 +23365,12 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7(supports-color@8.1.1)) - babel-preset-solid@1.9.12(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.13): + babel-preset-solid@1.9.15(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.15): dependencies: '@babel/core': 7.29.7(supports-color@7.2.0) - babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7(supports-color@7.2.0)) + babel-plugin-jsx-dom-expressions: 0.40.10(@babel/core@7.29.7(supports-color@7.2.0)) optionalDependencies: - solid-js: 1.9.13 + solid-js: 1.9.15 bail@2.0.2: {} @@ -23724,7 +23382,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.32: {} + baseline-browser-mapping@2.11.25: {} basic-auth@2.0.1: dependencies: @@ -23742,13 +23400,13 @@ snapshots: picocolors: 1.1.1 postcss: 8.5.6 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-safe-parser: 7.1.0(postcss@8.5.6) better-opn@3.0.2: dependencies: open: 8.4.2 - bidi-js@1.0.3: + bidi-js@1.1.0: dependencies: require-from-string: 2.0.2 @@ -23758,9 +23416,9 @@ snapshots: binary-extensions@2.3.0: {} - birecord@0.1.1: {} + birecord@0.1.2: {} - birpc@4.0.0: {} + birpc@4.2.0: {} bl@4.1.0: dependencies: @@ -23768,7 +23426,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.5(supports-color@8.1.1): + body-parser@1.20.8(supports-color@8.1.1): dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -23778,28 +23436,28 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.15.2 + qs: 6.16.0 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - body-parser@2.2.2(supports-color@8.1.1): + body-parser@2.3.0(supports-color@8.1.1): dependencies: bytes: 3.1.2 - content-type: 1.0.5 + content-type: 2.1.0 debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 on-finished: 2.4.1 - qs: 6.15.2 + qs: 6.16.0 raw-body: 3.0.2 type-is: 2.1.0 transitivePeerDependencies: - supports-color - bonjour-service@1.4.0: + bonjour-service@1.4.4: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 @@ -23818,22 +23476,22 @@ snapshots: dependencies: big-integer: 1.6.52 - brace-expansion@1.1.14: + brace-expansion@1.1.21: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.1: + brace-expansion@2.1.7: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.6: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 brace-expansion@5.0.9: dependencies: - balanced-match: 4.0.4 + balanced-match: 4.0.3 braces@3.0.3: dependencies: @@ -23843,13 +23501,13 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.28.2: + browserslist@4.29.0: dependencies: - baseline-browser-mapping: 2.10.32 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.361 - node-releases: 2.0.46 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.11.25 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.433 + node-releases: 2.0.56 + update-browserslist-db: 1.3.3(browserslist@4.29.0) bser@2.1.1: dependencies: @@ -23864,7 +23522,7 @@ snapshots: bundle-name@4.1.0: dependencies: - run-applescript: 7.1.0 + run-applescript: 7.0.0 bytes@3.1.2: {} @@ -23894,12 +23552,12 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.5.0 + lru-cache: 11.5.3 minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 - p-map: 7.0.4 + p-map: 7.0.8 ssri: 13.0.1 call-bind-apply-helpers@1.0.2: @@ -23927,7 +23585,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001810: {} ccount@2.0.1: {} @@ -23960,7 +23618,7 @@ snapshots: character-reference-invalid@2.0.1: {} - chardet@2.1.1: {} + chardet@2.2.0: {} check-error@2.1.3: {} @@ -23984,7 +23642,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.26.0 + undici: 7.29.1 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -24005,7 +23663,7 @@ snapshots: chokidar@5.0.0: dependencies: - readdirp: 5.0.0 + readdirp: 5.1.1 chownr@1.1.4: {} @@ -24015,7 +23673,7 @@ snapshots: chrome-launcher@0.15.2(supports-color@8.1.1): dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2(supports-color@8.1.1) @@ -24026,7 +23684,7 @@ snapshots: chromium-edge-launcher@0.2.0(supports-color@8.1.1): dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2(supports-color@8.1.1) @@ -24062,7 +23720,7 @@ snapshots: cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 - string-width: 8.2.1 + string-width: 8.2.2 cli-width@4.1.0: {} @@ -24090,8 +23748,6 @@ snapshots: clsx@2.1.1: {} - code-block-writer@12.0.0: {} - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -24122,8 +23778,6 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@10.0.1: {} - commander@12.1.0: {} commander@13.1.0: {} @@ -24136,7 +23790,7 @@ snapshots: commander@7.2.0: {} - comment-parser@1.4.7: {} + comment-parser@1.4.9: {} common-path-prefix@3.0.0: {} @@ -24146,11 +23800,12 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.8.1(supports-color@8.1.1): + compression@1.8.2(supports-color@8.1.1): dependencies: bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9(supports-color@8.1.1) + destroy: 1.2.0 negotiator: 0.6.4 on-headers: 1.1.0 safe-buffer: 5.2.1 @@ -24164,7 +23819,7 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.4: {} + confbox@0.3.1: {} config-chain@1.1.13: dependencies: @@ -24190,7 +23845,7 @@ snapshots: content-type@1.0.5: {} - content-type@2.0.0: {} + content-type@2.1.0: {} convert-source-map@1.9.0: {} @@ -24204,26 +23859,22 @@ snapshots: cookie@0.7.2: {} - copy-anything@2.0.6: - dependencies: - is-what: 3.14.1 - copy-anything@3.0.5: dependencies: is-what: 4.1.16 - copy-webpack-plugin@14.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + copy-webpack-plugin@14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 - schema-utils: 4.3.3 - serialize-javascript: 7.0.5 - tinyglobby: 0.2.17 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + schema-utils: 4.5.0 + serialize-javascript: 7.1.1 + tinyglobby: 0.2.15 + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) - core-js-compat@3.49.0: + core-js-compat@3.50.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.29.0 core-util-is@1.0.3: {} @@ -24240,11 +23891,11 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 - cosmiconfig@9.0.1(typescript@5.9.3): + cosmiconfig@9.0.2(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -24267,7 +23918,7 @@ snapshots: dependencies: hyphenate-style-name: 1.1.0 - css-loader@7.1.3(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + css-loader@7.1.3(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -24276,9 +23927,9 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.8.1 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) css-select@5.2.2: dependencies: @@ -24312,9 +23963,9 @@ snapshots: cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.4(css-tree@3.2.1) + '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1) css-tree: 3.2.1 - lru-cache: 11.5.0 + lru-cache: 11.5.3 csstype@3.2.3: {} @@ -24345,10 +23996,17 @@ snapshots: dataloader@2.2.3: {} - dayjs@1.11.20: {} + dayjs@1.11.23: {} de-indent@1.0.2: {} + debug@2.6.9(supports-color@7.2.0): + dependencies: + ms: 2.0.0 + optionalDependencies: + supports-color: 7.2.0 + optional: true + debug@2.6.9(supports-color@8.1.1): dependencies: ms: 2.0.0 @@ -24414,10 +24072,10 @@ snapshots: object-keys: 1.1.1 object.assign: 4.1.7 regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 + side-channel: 1.1.1 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 deep-extend@0.6.0: {} @@ -24434,9 +24092,9 @@ snapshots: default-browser@5.2.1: dependencies: bundle-name: 4.1.0 - default-browser-id: 5.0.1 + default-browser-id: 5.0.0 - default-browser@5.5.0: + default-browser@5.5.1: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -24481,8 +24139,6 @@ snapshots: detect-node@2.1.0: {} - devalue@5.8.1: {} - devalue@5.9.4: {} diff@4.0.4: {} @@ -24532,15 +24188,15 @@ snapshots: dotenv-expand@12.0.3: dependencies: - dotenv: 16.6.1 + dotenv: 16.4.7 dotenv@16.4.7: {} dotenv@16.6.1: {} - dts-resolver@2.1.3(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)): + dts-resolver@2.1.3(oxc-resolver@11.24.2): optionalDependencies: - oxc-resolver: 11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + oxc-resolver: 11.24.2 dunder-proto@1.0.1: dependencies: @@ -24557,23 +24213,23 @@ snapshots: eastasianwidth@0.2.0: {} - editorconfig@1.0.7: + editorconfig@3.0.2: dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.9 - semver: 7.8.1 + '@one-ini/wasm': 0.2.1 + commander: 14.0.3 + minimatch: 10.2.6 + semver: 7.8.5 ee-first@1.1.1: {} - effect@3.21.2: + effect@3.22.2: dependencies: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 ejs@5.0.1: {} - electron-to-chromium@1.5.361: {} + electron-to-chromium@1.5.433: {} emoji-regex@10.6.0: {} @@ -24583,7 +24239,7 @@ snapshots: emojis-list@3.0.0: {} - empathic@2.0.1: {} + empathic@2.1.0: {} encodeurl@1.0.2: {} @@ -24598,7 +24254,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.22.0: + enhanced-resolve@5.25.1: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -24609,7 +24265,7 @@ snapshots: entities@7.0.1: {} - entities@8.0.0: {} + entities@8.1.0: {} env-cmd@11.0.0: dependencies: @@ -24638,6 +24294,13 @@ snapshots: dependencies: stackframe: 1.3.4 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -24652,8 +24315,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -24662,7 +24325,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -24678,22 +24341,22 @@ snapshots: object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 - own-keys: 1.0.1 + own-keys: 1.0.2 regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-byte-offset: 1.0.5 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 es-define-property@1.0.1: {} @@ -24711,7 +24374,7 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.4.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -24747,26 +24410,29 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-plugins-node-modules-polyfill@1.8.1(esbuild@0.17.6): + esbuild-plugins-node-modules-polyfill@1.8.3(esbuild@0.17.6): dependencies: '@jspm/core': 2.1.0 esbuild: 0.17.6 local-pkg: 1.2.1 resolve.exports: 2.0.3 - esbuild-wasm@0.27.3: {} + esbuild-wasm@0.28.1: {} esbuild@0.17.6: optionalDependencies: @@ -24819,63 +24485,34 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.27.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 - - esbuild@0.27.7: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 esbuild@0.28.2: optionalDependencies: @@ -24905,7 +24542,6 @@ snapshots: '@esbuild/win32-arm64': 0.28.2 '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - optional: true escalade@3.2.0: {} @@ -24920,16 +24556,16 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)): dependencies: eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) - semver: 7.8.1 + semver: 7.8.5 - eslint-config-expo@10.0.0(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3): + eslint-config-expo@10.0.0(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) - eslint-plugin-expo: 1.0.3(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-expo: 1.1.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) globals: 16.5.0 @@ -24941,7 +24577,7 @@ snapshots: eslint-import-context@0.1.9(unrs-resolver@1.12.2): dependencies: - get-tsconfig: 4.14.0 + get-tsconfig: 4.14.3 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.12.2 @@ -24949,7 +24585,7 @@ snapshots: eslint-import-resolver-node@0.3.10(supports-color@7.2.0): dependencies: debug: 3.2.7(supports-color@7.2.0) - is-core-module: 2.16.2 + is-core-module: 2.17.0 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color @@ -24958,97 +24594,95 @@ snapshots: eslint-import-resolver-node@0.3.10(supports-color@8.1.1): dependencies: debug: 3.2.7(supports-color@8.1.1) - is-core-module: 2.16.2 + is-core-module: 2.17.0 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) - get-tsconfig: 4.14.0 + get-tsconfig: 4.14.3 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color eslint-plugin-es-x@7.8.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-compat-utils: 0.5.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-expo@1.0.3(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3): + eslint-plugin-expo@1.1.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.59.4 - comment-parser: 1.4.7 + '@typescript-eslint/types': 8.70.0 + comment-parser: 1.4.9 debug: 4.4.3(supports-color@7.2.0) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 - minimatch: 10.2.5 - semver: 7.8.1 + minimatch: 10.2.6 + semver: 7.8.5 stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.59.4 - comment-parser: 1.4.7 + '@typescript-eslint/types': 8.70.0 + comment-parser: 1.4.9 debug: 4.4.3(supports-color@8.1.1) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 - minimatch: 10.2.5 - semver: 7.8.1 + minimatch: 10.2.6 + semver: 7.8.5 stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) transitivePeerDependencies: - supports-color optional: true - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -25056,19 +24690,19 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) - hasown: 2.0.3 - is-core-module: 2.16.2 + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) + hasown: 2.0.4 + is-core-module: 2.17.0 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -25076,23 +24710,35 @@ snapshots: eslint-plugin-n@17.24.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - enhanced-resolve: 5.22.0 + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) + enhanced-resolve: 5.25.1 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) eslint-plugin-es-x: 7.8.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) - get-tsconfig: 4.14.0 + get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.8.1 + semver: 7.8.5 ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1): + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/parser': 7.29.9 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) + eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 3.5.4(zod@3.25.76) + transitivePeerDependencies: + - supports-color + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) hermes-parser: 0.25.1 @@ -25109,10 +24755,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -25129,9 +24775,9 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) string-ts: 2.3.1 @@ -25149,10 +24795,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -25177,10 +24823,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -25197,9 +24843,9 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -25216,13 +24862,13 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) - is-immutable-type: 5.0.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + is-immutable-type: 5.0.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -25233,15 +24879,15 @@ snapshots: eslint-plugin-react@7.37.5(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)): dependencies: - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 + es-iterator-helpers: 1.4.0 eslint: 9.36.0(jiti@2.7.0)(supports-color@8.1.1) estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 @@ -25250,7 +24896,7 @@ snapshots: prop-types: 15.8.1 resolve: 2.0.0-next.7 semver: 6.3.1 - string.prototype.matchall: 4.0.12 + string.prototype.matchall: 4.1.0 string.prototype.repeat: 1.0.0 eslint-scope@5.1.1: @@ -25278,12 +24924,12 @@ snapshots: eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2(supports-color@7.2.0) '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.5(supports-color@7.2.0) + '@eslint/eslintrc': 3.3.7(supports-color@7.2.0) '@eslint/js': 9.36.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.8 @@ -25320,12 +24966,12 @@ snapshots: eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2(supports-color@8.1.1) '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.5(supports-color@8.1.1) + '@eslint/eslintrc': 3.3.7(supports-color@8.1.1) '@eslint/js': 9.36.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.8 @@ -25380,11 +25026,11 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@2.3.7(@typescript-eslint/types@8.59.4): + esrap@2.3.7(@typescript-eslint/types@8.70.0): dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 optionalDependencies: - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.70.0 esrecurse@4.3.0: dependencies: @@ -25435,7 +25081,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -25446,11 +25092,11 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.8: {} + eventsource-parser@3.1.1: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.1 execa@5.1.1: dependencies: @@ -25466,68 +25112,68 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.3.0: {} + expect-type@1.4.0: {} - expo-asset@12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3): + expo-asset@12.0.13(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3): dependencies: - '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.9.3) - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + '@expo/image-utils': 0.8.17(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo-constants: 18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - typescript - expo-constants@18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1): + expo-constants@18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@expo/config': 12.0.13(supports-color@8.1.1) - '@expo/env': 2.0.11(supports-color@8.1.1) - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + '@expo/config': 12.0.14(supports-color@8.1.1) + '@expo/env': 2.0.12(supports-color@8.1.1) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - expo-file-system@19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)): + expo-file-system@19.0.24(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + expo-font@14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) fontfaceobserver: 2.3.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - expo-haptics@15.0.8(expo@54.0.34): + expo-haptics@15.0.8(expo@54.0.37): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - expo-image@3.0.11(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + expo-image@3.0.11(expo@54.0.37)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) optionalDependencies: react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - expo-keep-awake@15.0.8(expo@54.0.34)(react@19.1.0): + expo-keep-awake@15.0.8(expo@54.0.37)(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) react: 19.1.0 - expo-linking@8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1): + expo-linking@8.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1): dependencies: - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-constants: 18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) transitivePeerDependencies: - expo - supports-color - expo-modules-autolinking@3.0.25: + expo-modules-autolinking@3.0.27: dependencies: '@expo/spawn-async': 1.8.0 chalk: 4.1.2 @@ -25535,48 +25181,48 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 - expo-modules-core@3.0.30(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + expo-modules-core@3.0.30(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - expo-router@6.0.23(c7c2013fda48cef4065ef0e95e77f784): + expo-router@6.0.24(3a123a5aaca9c4c45b93faf4bd84db41): dependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@expo/schema-utils': 0.1.8 - '@radix-ui/react-slot': 1.2.0(@types/react@19.2.17)(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-navigation/bottom-tabs': 7.16.1(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@react-navigation/native-stack': 7.15.1(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.37)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@expo/schema-utils': 0.1.9 + '@radix-ui/react-slot': 1.2.0(@types/react@19.2.18)(react@19.1.0) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-navigation/bottom-tabs': 7.19.2(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/native': 7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-navigation/native-stack': 7.19.2(@react-navigation/native@7.4.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) client-only: 0.0.1 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) - expo-linking: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) - expo-server: 1.0.6 + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo-constants: 18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-linking: 8.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) + expo-server: 1.0.7 fast-deep-equal: 3.1.3 invariant: 2.2.4 - nanoid: 3.3.12 + nanoid: 3.3.19 query-string: 7.1.3 react: 19.1.0 react-fast-compare: 3.2.2 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) semver: 7.6.3 server-only: 0.0.1 sf-symbols-typescript: 2.2.0 shallowequal: 1.1.0 use-latest-callback: 0.2.6(react@19.1.0) - vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + vaul: 1.1.2(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) optionalDependencies: react-dom: 19.1.0(react@19.1.0) - react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-reanimated: 4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-reanimated: 4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -25584,71 +25230,71 @@ snapshots: - '@types/react-dom' - supports-color - expo-server@1.0.6: {} + expo-server@1.0.7: {} - expo-splash-screen@31.0.13(expo@54.0.34)(supports-color@8.1.1)(typescript@5.9.3): + expo-splash-screen@31.0.13(expo@54.0.37)(supports-color@8.1.1)(typescript@5.9.3): dependencies: - '@expo/prebuild-config': 54.0.8(expo@54.0.34)(supports-color@8.1.1)(typescript@5.9.3) - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + '@expo/prebuild-config': 54.0.9(expo@54.0.37)(supports-color@8.1.1)(typescript@5.9.3) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript - expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - expo-symbols@1.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)): + expo-symbols@1.0.8(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) sf-symbols-typescript: 2.2.0 - expo-system-ui@6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1): + expo-system-ui@6.0.9(expo@54.0.37)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@react-native/normalize-colors': 0.81.5 debug: 4.4.3(supports-color@8.1.1) - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) optionalDependencies: react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - supports-color - expo-web-browser@15.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)): + expo-web-browser@15.0.11(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)): dependencies: - expo: 54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + expo: 54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - expo@54.0.34(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3): + expo@54.0.37(@babel/core@7.29.7(supports-color@8.1.1))(@expo/metro-runtime@6.1.2)(expo-router@6.0.24)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 54.0.24(expo-router@6.0.23)(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@expo/config': 12.0.13(supports-color@8.1.1) - '@expo/config-plugins': 54.0.4(supports-color@8.1.1) - '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@expo/cli': 54.0.27(expo-router@6.0.24)(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@expo/config': 12.0.14(supports-color@8.1.1) + '@expo/config-plugins': 54.0.5(supports-color@8.1.1) + '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) '@expo/fingerprint': 0.15.5(supports-color@8.1.1) '@expo/metro': 54.2.0(supports-color@8.1.1) - '@expo/metro-config': 54.0.15(expo@54.0.34)(supports-color@8.1.1) - '@expo/vector-icons': 15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - '@ungap/structured-clone': 1.3.1 - babel-preset-expo: 54.0.10(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@54.0.34)(react-refresh@0.14.2)(supports-color@8.1.1) - expo-asset: 12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) - expo-file-system: 19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1)) - expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - expo-keep-awake: 15.0.8(expo@54.0.34)(react@19.1.0) - expo-modules-autolinking: 3.0.25 - expo-modules-core: 3.0.30(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@expo/metro-config': 54.0.17(expo@54.0.37)(supports-color@8.1.1) + '@expo/vector-icons': 15.1.1(expo-font@14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@ungap/structured-clone': 1.4.0 + babel-preset-expo: 54.0.12(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@54.0.37)(react-refresh@0.14.2)(supports-color@8.1.1) + expo-asset: 12.0.13(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1)(typescript@5.9.3) + expo-constants: 18.0.14(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-file-system: 19.0.24(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1)) + expo-font: 14.0.12(expo@54.0.37)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + expo-keep-awake: 15.0.8(expo@54.0.37)(react@19.1.0) + expo-modules-autolinking: 3.0.27 + expo-modules-core: 3.0.30(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 optionalDependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.37)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -25660,16 +25306,19 @@ snapshots: exponential-backoff@3.1.3: {} - express-rate-limit@8.5.2(express@5.2.1(supports-color@8.1.1)): + express-rate-limit@8.7.0(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: + debug: 4.4.3(supports-color@8.1.1) express: 5.2.1(supports-color@8.1.1) - ip-address: 10.2.0 + ip-address: 10.7.2 + transitivePeerDependencies: + - supports-color - express@4.22.2(supports-color@8.1.1): + express@4.22.3(supports-color@8.1.1): dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.5(supports-color@8.1.1) + body-parser: 1.20.8(supports-color@8.1.1) content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.2 @@ -25687,8 +25336,8 @@ snapshots: on-finished: 2.4.1 parseurl: 1.3.3 path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.15.2 + proxy-addr: 2.0.8 + qs: 6.16.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2(supports-color@8.1.1) @@ -25704,7 +25353,7 @@ snapshots: express@5.2.1(supports-color@8.1.1): dependencies: accepts: 2.0.0 - body-parser: 2.2.2(supports-color@8.1.1) + body-parser: 2.3.0(supports-color@8.1.1) content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 @@ -25722,9 +25371,9 @@ snapshots: on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.2 - range-parser: 1.2.1 + proxy-addr: 2.0.8 + qs: 6.16.0 + range-parser: 1.3.0 router: 2.2.0(supports-color@8.1.1) send: 1.2.1(supports-color@8.1.1) serve-static: 2.2.1(supports-color@8.1.1) @@ -25734,7 +25383,7 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.8: {} + exsolve@1.1.1: {} extend@3.0.2: {} @@ -25762,7 +25411,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.2: {} + fast-uri@3.1.8: {} fast-wrap-ansi@0.2.0: dependencies: @@ -25772,7 +25421,7 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fastq@1.20.1: + fastq@1.20.3: dependencies: reusify: 1.1.0 @@ -25782,7 +25431,7 @@ snapshots: faye-websocket@0.11.4: dependencies: - websocket-driver: 0.7.4 + websocket-driver: 0.7.5 fb-watchman@2.0.2: dependencies: @@ -25886,12 +25535,12 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.4.2: {} + flatted@3.4.4: {} flow-enums-runtime@0.0.6: {} @@ -25914,14 +25563,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.3 - mime-types: 2.1.35 - form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -25976,14 +25617,17 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -25997,19 +25641,19 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} + get-east-asian-width@1.7.0: {} get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -26021,7 +25665,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-stream@6.0.1: {} @@ -26031,10 +25675,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -26053,7 +25693,7 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regex.js@1.2.0(tslib@2.8.1): + glob-to-regex.js@1.3.1(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -26070,7 +25710,7 @@ snapshots: glob@13.0.6: dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 minipass: 7.1.3 path-scurry: 2.0.2 @@ -26122,7 +25762,7 @@ snapshots: h3@2.0.1-rc.20: dependencies: rou3: 0.8.1 - srvx: 0.11.16 + srvx: 0.11.22 handle-thing@2.0.1: {} @@ -26146,10 +25786,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.3: - dependencies: - function-bind: 1.1.2 - hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -26206,9 +25842,9 @@ snapshots: dependencies: react-is: 16.13.1 - hono@4.12.23: {} + hono@4.13.8: {} - hookable@6.1.1: {} + hookable@6.1.2: {} hosted-git-info@6.1.3: dependencies: @@ -26220,7 +25856,7 @@ snapshots: hosted-git-info@9.0.3: dependencies: - lru-cache: 11.5.0 + lru-cache: 11.5.3 hpack.js@2.1.6: dependencies: @@ -26286,7 +25922,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1)): + http-proxy-middleware@2.0.10(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1)): dependencies: '@types/http-proxy': 1.17.17 http-proxy: 1.18.1(debug@4.4.3(supports-color@8.1.1)) @@ -26298,13 +25934,13 @@ snapshots: transitivePeerDependencies: - debug - http-proxy-middleware@3.0.5(supports-color@8.1.1): + http-proxy-middleware@3.0.7(supports-color@8.1.1): dependencies: '@types/http-proxy': 1.17.17 debug: 4.4.3(supports-color@8.1.1) http-proxy: 1.18.1(debug@4.4.3(supports-color@8.1.1)) is-glob: 4.0.3 - is-plain-object: 5.0.0 + is-plain-object: 5.1.0 micromatch: 4.0.8 transitivePeerDependencies: - supports-color @@ -26354,7 +25990,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 @@ -26366,20 +26002,19 @@ snapshots: ignore-walk@8.0.0: dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 ignore@5.3.2: {} ignore@7.0.5: {} - image-size@0.5.5: - optional: true + ignore@7.0.9: {} image-size@1.2.1: dependencies: queue: 6.0.2 - immutable@5.1.5: {} + immutable@5.1.9: {} import-fresh@3.3.1: dependencies: @@ -26422,18 +26057,18 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 invariant@2.2.4: dependencies: loose-envify: 1.4.0 - ip-address@10.2.0: {} + ip-address@10.7.2: {} ipaddr.js@1.9.1: {} - ipaddr.js@2.4.0: {} + ipaddr.js@2.5.0: {} is-alphabetical@2.0.1: {} @@ -26482,13 +26117,13 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 is-callable@1.2.7: {} - is-core-module@2.16.2: + is-core-module@2.17.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -26509,6 +26144,10 @@ snapshots: is-docker@3.0.0: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -26519,7 +26158,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 is-generator-function@1.1.2: dependencies: @@ -26537,9 +26176,9 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): + is-immutable-type@5.0.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) @@ -26578,7 +26217,7 @@ snapshots: dependencies: isobject: 3.0.1 - is-plain-object@5.0.0: {} + is-plain-object@5.1.0: {} is-potential-custom-element-name@1.0.1: {} @@ -26593,7 +26232,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-set@2.0.3: {} @@ -26616,7 +26255,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 is-unicode-supported@0.1.0: {} @@ -26633,8 +26272,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-what@3.14.1: {} - is-what@4.1.16: {} is-wsl@2.2.0: @@ -26653,7 +26290,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.40: {} + isbot@5.2.2: {} isexe@2.0.0: {} @@ -26668,7 +26305,7 @@ snapshots: istanbul-lib-instrument@5.2.1(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -26678,20 +26315,20 @@ snapshots: istanbul-lib-instrument@6.0.3(supports-color@7.2.0): dependencies: '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - supports-color istanbul-lib-instrument@6.0.3(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -26736,7 +26373,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -26746,7 +26383,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.12.4 + '@types/node': 24.13.6 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -26773,7 +26410,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -26781,7 +26418,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.12.4 + '@types/node': 24.13.6 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -26798,13 +26435,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -26815,28 +26452,28 @@ snapshots: jju@1.4.0: {} - jose@6.2.3: {} + jose@6.2.12: {} - js-beautify@1.15.4: + js-beautify@2.0.3: dependencies: config-chain: 1.1.13 - editorconfig: 1.0.7 - glob: 10.5.0 - js-cookie: 3.0.7 - nopt: 7.2.1 + editorconfig: 3.0.2 + glob: 13.0.6 + js-cookie: 3.0.8 + nopt: 10.0.1 - js-cookie@3.0.7: {} + js-cookie@3.0.8: {} js-tokens@4.0.0: {} js-tokens@9.0.1: {} - js-yaml@3.14.2: + js-yaml@3.15.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -26857,12 +26494,12 @@ snapshots: parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 + tough-cookie: 6.0.2 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.21.0 + ws: 8.21.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -26885,12 +26522,12 @@ snapshots: parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 + tough-cookie: 6.0.2 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.21.0 + ws: 8.21.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -26941,7 +26578,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -26974,54 +26611,68 @@ snapshots: tinyglobby: 0.2.17 unbash: 4.0.11 yaml: 2.9.1 - zod: 4.4.3 + zod: 4.6.5 kolorist@1.8.0: {} lan-network@0.2.1: {} - launch-editor@2.13.2: + launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.8.4 + shell-quote: 1.10.0 - launch-editor@2.14.1: + less-loader@12.3.1(less@4.9.0(supports-color@8.1.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.4 + less: 4.9.0(supports-color@8.1.1) + optionalDependencies: + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) - less-loader@12.3.1(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + less@4.9.0(supports-color@8.1.1): dependencies: - less: 4.4.2 + copy-anything: 3.0.5 + parse-node-version: 1.0.1 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + errno: 0.1.8 + graceful-fs: 4.2.11 + make-dir: 5.1.0 + mime: 1.6.0 + needle: 3.5.0 + probe-image-size: 7.4.0(supports-color@8.1.1) + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color - less@4.4.2: + less@4.9.1(supports-color@7.2.0): dependencies: - copy-anything: 2.0.6 + copy-anything: 3.0.5 parse-node-version: 1.0.1 - tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 + make-dir: 5.1.0 mime: 1.6.0 needle: 3.5.0 + probe-image-size: 7.4.0(supports-color@7.2.0) source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + optional: true - less@4.6.4: + less@4.9.1(supports-color@8.1.1): dependencies: copy-anything: 3.0.5 parse-node-version: 1.0.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 + make-dir: 5.1.0 mime: 1.6.0 needle: 3.5.0 + probe-image-size: 7.4.0(supports-color@8.1.1) source-map: 0.6.1 + transitivePeerDependencies: + - supports-color leven@3.1.0: {} @@ -27030,11 +26681,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + license-webpack-plugin@4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: - webpack-sources: 3.5.0 + webpack-sources: 3.5.1 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) lighthouse-logger@1.4.2(supports-color@8.1.1): dependencies: @@ -27043,54 +26694,54 @@ snapshots: transitivePeerDependencies: - supports-color - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 lilconfig@3.1.3: {} @@ -27098,7 +26749,7 @@ snapshots: lines-and-columns@2.0.3: {} - linkify-it@5.0.1: + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 @@ -27130,7 +26781,7 @@ snapshots: lmdb@3.5.1: dependencies: '@harperfast/extended-iterable': 1.0.3 - msgpackr: 1.11.12 + msgpackr: 1.12.1 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 @@ -27163,7 +26814,7 @@ snapshots: local-pkg@1.2.1: dependencies: mlly: 1.8.2 - pkg-types: 2.3.1 + pkg-types: 2.3.3 quansync: 0.2.11 locate-character@3.0.0: {} @@ -27200,7 +26851,7 @@ snapshots: log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 log-update@6.1.0: dependencies: @@ -27220,7 +26871,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.5.0: {} + lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: @@ -27242,26 +26893,23 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 source-map-js: 1.2.1 - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - optional: true - make-dir@4.0.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 + + make-dir@5.1.0: + optional: true make-error@1.3.6: {} - make-fetch-happen@15.0.5(supports-color@8.1.1): + make-fetch-happen@15.0.6(supports-color@8.1.1): dependencies: '@gar/promise-retry': 1.0.3 - '@npmcli/agent': 4.0.0(supports-color@8.1.1) + '@npmcli/agent': 4.0.2(supports-color@8.1.1) '@npmcli/redact': 4.0.0 cacache: 20.0.4 http-cache-semantics: 4.2.0 @@ -27269,7 +26917,7 @@ snapshots: minipass-fetch: 5.0.2 minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 - negotiator: 1.0.0 + negotiator: 1.1.0 proc-log: 6.1.0 ssri: 13.0.1 transitivePeerDependencies: @@ -27281,21 +26929,21 @@ snapshots: markdown-extensions@1.1.1: {} - markdown-it@14.2.0: + markdown-it@14.3.2: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.1 - mdurl: 2.0.0 + linkify-it: 5.0.2 + mdurl: 2.1.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - markdown-link-extractor@4.0.3: + markdown-link-extractor@4.0.4: dependencies: html-link-extractor: 1.0.5 - marked: 17.0.6 + marked: 18.0.13 - marked@17.0.6: {} + marked@18.0.13: {} marky@1.3.0: {} @@ -27410,7 +27058,7 @@ snapshots: mdn-data@2.27.1: {} - mdurl@2.0.0: {} + mdurl@2.1.0: {} media-query-parser@2.0.2: dependencies: @@ -27418,22 +27066,22 @@ snapshots: media-typer@0.3.0: {} - media-typer@1.1.0: {} + media-typer@1.1.1: {} - memfs@4.57.2(tslib@2.8.1): + memfs@4.78.1: dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.78.1(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.78.1(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) + glob-to-regex.js: 1.3.1(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -27464,12 +27112,12 @@ snapshots: transitivePeerDependencies: - supports-color - metro-babel-transformer@0.83.7(supports-color@8.1.1): + metro-babel-transformer@0.83.8(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 hermes-parser: 0.35.0 - metro-cache-key: 0.83.7 + metro-cache-key: 0.83.8 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -27478,7 +27126,7 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 - metro-cache-key@0.83.7: + metro-cache-key@0.83.8: dependencies: flow-enums-runtime: 0.0.6 @@ -27491,12 +27139,12 @@ snapshots: transitivePeerDependencies: - supports-color - metro-cache@0.83.7(supports-color@8.1.1): + metro-cache@0.83.8(supports-color@8.1.1): dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6(supports-color@8.1.1) - metro-core: 0.83.7 + metro-core: 0.83.8 transitivePeerDependencies: - supports-color @@ -27509,22 +27157,22 @@ snapshots: metro-cache: 0.83.3(supports-color@8.1.1) metro-core: 0.83.3 metro-runtime: 0.83.3 - yaml: 2.9.0 + yaml: 2.9.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-config@0.83.7(supports-color@8.1.1): + metro-config@0.83.8(supports-color@8.1.1): dependencies: connect: 3.7.0(supports-color@8.1.1) flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.7(supports-color@8.1.1) - metro-cache: 0.83.7(supports-color@8.1.1) - metro-core: 0.83.7 - metro-runtime: 0.83.7 - yaml: 2.9.0 + metro: 0.83.8(supports-color@8.1.1) + metro-cache: 0.83.8(supports-color@8.1.1) + metro-core: 0.83.8 + metro-runtime: 0.83.8 + yaml: 2.9.1 transitivePeerDependencies: - bufferutil - supports-color @@ -27536,11 +27184,11 @@ snapshots: lodash.throttle: 4.1.1 metro-resolver: 0.83.3 - metro-core@0.83.7: + metro-core@0.83.8: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.83.7 + metro-resolver: 0.83.8 metro-file-map@0.83.3(supports-color@8.1.1): dependencies: @@ -27556,7 +27204,7 @@ snapshots: transitivePeerDependencies: - supports-color - metro-file-map@0.83.7(supports-color@8.1.1): + metro-file-map@0.83.8(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 @@ -27573,18 +27221,18 @@ snapshots: metro-minify-terser@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.48.0 + terser: 5.51.2 - metro-minify-terser@0.83.7: + metro-minify-terser@0.83.8: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.48.0 + terser: 5.51.2 metro-resolver@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - metro-resolver@0.83.7: + metro-resolver@0.83.8: dependencies: flow-enums-runtime: 0.0.6 @@ -27593,16 +27241,16 @@ snapshots: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-runtime@0.83.7: + metro-runtime@0.83.8: dependencies: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 metro-source-map@0.83.3(supports-color@8.1.1): dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.7(supports-color@8.1.1)' - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.8(supports-color@8.1.1)' + '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 invariant: 2.2.4 metro-symbolicate: 0.83.3 @@ -27613,15 +27261,15 @@ snapshots: transitivePeerDependencies: - supports-color - metro-source-map@0.83.7(supports-color@8.1.1): + metro-source-map@0.83.8(supports-color@8.1.1): dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.83.7 + metro-symbolicate: 0.83.8 nullthrows: 1.1.1 - ob1: 0.83.7 + ob1: 0.83.8 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: @@ -27636,11 +27284,11 @@ snapshots: source-map: 0.5.7 vlq: 1.0.1 - metro-symbolicate@0.83.7: + metro-symbolicate@0.83.8: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.7(supports-color@8.1.1) + metro-source-map: 0.83.8(supports-color@8.1.1) nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 @@ -27648,20 +27296,20 @@ snapshots: metro-transform-plugins@0.83.3(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.7(supports-color@8.1.1): + metro-transform-plugins@0.83.8(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -27670,9 +27318,9 @@ snapshots: metro-transform-worker@0.83.3(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 metro: 0.83.3(supports-color@8.1.1) metro-babel-transformer: 0.83.3(supports-color@8.1.1) @@ -27687,20 +27335,20 @@ snapshots: - supports-color - utf-8-validate - metro-transform-worker@0.83.7(supports-color@8.1.1): + metro-transform-worker@0.83.8(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 - metro: 0.83.7(supports-color@8.1.1) - metro-babel-transformer: 0.83.7(supports-color@8.1.1) - metro-cache: 0.83.7(supports-color@8.1.1) - metro-cache-key: 0.83.7 - metro-minify-terser: 0.83.7 - metro-source-map: 0.83.7(supports-color@8.1.1) - metro-transform-plugins: 0.83.7(supports-color@8.1.1) + metro: 0.83.8(supports-color@8.1.1) + metro-babel-transformer: 0.83.8(supports-color@8.1.1) + metro-cache: 0.83.8(supports-color@8.1.1) + metro-cache-key: 0.83.8 + metro-minify-terser: 0.83.8 + metro-source-map: 0.83.8(supports-color@8.1.1) + metro-transform-plugins: 0.83.8(supports-color@8.1.1) nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -27711,11 +27359,11 @@ snapshots: dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -27747,22 +27395,22 @@ snapshots: serialize-error: 2.1.0 source-map: 0.5.7 throat: 5.0.0 - ws: 7.5.11 - yargs: 17.7.2 + ws: 7.5.13 + yargs: 17.7.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.7(supports-color@8.1.1): + metro@0.83.8(supports-color@8.1.1): dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/generator': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 accepts: 2.0.0 ci-info: 2.0.0 connect: 3.7.0(supports-color@8.1.1) @@ -27771,30 +27419,29 @@ snapshots: flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 hermes-parser: 0.35.0 - image-size: 1.2.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.7(supports-color@8.1.1) - metro-cache: 0.83.7(supports-color@8.1.1) - metro-cache-key: 0.83.7 - metro-config: 0.83.7(supports-color@8.1.1) - metro-core: 0.83.7 - metro-file-map: 0.83.7(supports-color@8.1.1) - metro-resolver: 0.83.7 - metro-runtime: 0.83.7 - metro-source-map: 0.83.7(supports-color@8.1.1) - metro-symbolicate: 0.83.7 - metro-transform-plugins: 0.83.7(supports-color@8.1.1) - metro-transform-worker: 0.83.7(supports-color@8.1.1) + metro-babel-transformer: 0.83.8(supports-color@8.1.1) + metro-cache: 0.83.8(supports-color@8.1.1) + metro-cache-key: 0.83.8 + metro-config: 0.83.8(supports-color@8.1.1) + metro-core: 0.83.8 + metro-file-map: 0.83.8(supports-color@8.1.1) + metro-resolver: 0.83.8 + metro-runtime: 0.83.8 + metro-source-map: 0.83.8(supports-color@8.1.1) + metro-symbolicate: 0.83.8 + metro-transform-plugins: 0.83.8(supports-color@8.1.1) + metro-transform-worker: 0.83.8(supports-color@8.1.1) mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 source-map: 0.5.7 throat: 5.0.0 - ws: 7.5.11 - yargs: 17.7.2 + ws: 7.5.13 + yargs: 17.7.3 transitivePeerDependencies: - bufferutil - supports-color @@ -28040,29 +27687,33 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + mini-css-extract-plugin@2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: - schema-utils: 4.3.3 + schema-utils: 4.5.0 tapable: 2.3.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) minimalistic-assert@1.0.1: {} minimatch@10.2.5: dependencies: - brace-expansion: 5.0.6 + brace-expansion: 5.0.9 + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 minimatch@3.0.8: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.21 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.21 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.1 + brace-expansion: 2.1.7 minimist@1.2.8: {} @@ -28080,7 +27731,7 @@ snapshots: minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 minipass-flush@1.0.7: dependencies: @@ -28115,8 +27766,6 @@ snapshots: mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - mlly@1.8.2: dependencies: acorn: 8.18.0 @@ -28126,12 +27775,12 @@ snapshots: modern-ahocorasick@1.1.0: {} - morgan@1.10.1(supports-color@8.1.1): + morgan@1.12.1(supports-color@8.1.1): dependencies: basic-auth: 2.0.1 debug: 2.6.9(supports-color@8.1.1) depd: 2.0.0 - on-finished: 2.3.0 + on-finished: 2.4.1 on-headers: 1.1.0 transitivePeerDependencies: - supports-color @@ -28158,7 +27807,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 optional: true - msgpackr@1.11.12: + msgpackr@1.12.1: optionalDependencies: msgpackr-extract: 3.0.4 optional: true @@ -28178,34 +27827,80 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.12: {} + nanoid@3.3.19: {} napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} + needle@2.9.1(supports-color@7.2.0): + dependencies: + debug: 3.2.7(supports-color@7.2.0) + iconv-lite: 0.4.24 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + optional: true + + needle@2.9.1(supports-color@8.1.1): + dependencies: + debug: 3.2.7(supports-color@8.1.1) + iconv-lite: 0.4.24 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + optional: true + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.6.0 + sax: 1.6.1 optional: true negotiator@0.6.3: {} negotiator@0.6.4: {} - negotiator@1.0.0: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 neo-async@2.6.2: {} nested-error-stacks@2.0.1: {} - next@16.2.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.100.0): + next@16.2.6(@babel/core@7.29.7(supports-color@7.2.0))(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.104.1): + dependencies: + '@next/env': 16.2.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.11.25 + caniuse-lite: 1.0.30001810 + postcss: 8.4.31 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.1.0) + optionalDependencies: + '@next/swc-darwin-arm64': 16.2.6 + '@next/swc-darwin-x64': 16.2.6 + '@next/swc-linux-arm64-gnu': 16.2.6 + '@next/swc-linux-arm64-musl': 16.2.6 + '@next/swc-linux-x64-gnu': 16.2.6 + '@next/swc-linux-x64-musl': 16.2.6 + '@next/swc-win32-arm64-msvc': 16.2.6 + '@next/swc-win32-x64-msvc': 16.2.6 + babel-plugin-react-compiler: 1.0.0 + sass: 1.104.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@16.2.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.104.1): dependencies: '@next/env': 16.2.6 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.32 - caniuse-lite: 1.0.30001793 + baseline-browser-mapping: 2.11.25 + caniuse-lite: 1.0.30001810 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28220,40 +27915,42 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.2.6 '@next/swc-win32-x64-msvc': 16.2.6 babel-plugin-react-compiler: 1.0.0 - sass: 1.100.0 + sass: 1.104.1 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - ng-packagr@21.2.3(@angular/compiler-cli@21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): + ng-packagr@21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 21.2.14(@angular/compiler@21.2.14)(supports-color@8.1.1)(typescript@5.9.3) - '@rollup/plugin-json': 6.1.0(rollup@4.60.4) - '@rollup/wasm-node': 4.60.4 + '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) + '@rollup/plugin-json': 6.1.0(rollup@4.63.4) + '@rollup/wasm-node': 4.63.4 ajv: 8.20.0 ansi-colors: 4.1.3 - browserslist: 4.28.2 + browserslist: 4.29.0 chokidar: 5.0.0 commander: 14.0.3 dependency-graph: 1.0.0 - esbuild: 0.27.7 + esbuild: 0.28.2 find-cache-directory: 6.0.0 injection-js: 2.6.1 jsonc-parser: 3.3.1 - less: 4.6.4 - ora: 9.4.0 - piscina: 5.1.4 + less: 4.9.1(supports-color@8.1.1) + ora: 9.4.1 + piscina: 5.3.2 postcss: 8.5.6 - rollup-plugin-dts: 6.4.1(rollup@4.60.4)(typescript@5.9.3) + rollup-plugin-dts: 6.4.1(rollup@4.63.4)(typescript@5.9.3) rxjs: 7.8.2 - sass: 1.100.0 + sass: 1.104.1 tinyglobby: 0.2.17 tslib: 2.8.1 typescript: 5.9.3 optionalDependencies: - rollup: 4.60.4 + rollup: 4.63.4 + transitivePeerDependencies: + - supports-color node-addon-api@6.1.0: optional: true @@ -28261,7 +27958,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -28279,17 +27976,17 @@ snapshots: detect-libc: 2.1.2 optional: true - node-gyp@12.3.0: + node-gyp@12.4.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.8.1 - tar: 7.5.15 - tinyglobby: 0.2.16 - undici: 6.26.0 + semver: 7.7.4 + tar: 7.5.22 + tinyglobby: 0.2.17 + undici: 6.28.1 which: 6.0.1 node-html-parser@6.1.13: @@ -28299,11 +27996,11 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.46: {} + node-releases@2.0.56: {} - nopt@7.2.1: + nopt@10.0.1: dependencies: - abbrev: 2.0.0 + abbrev: 5.0.0 nopt@9.0.0: dependencies: @@ -28312,8 +28009,8 @@ snapshots: normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.3 - is-core-module: 2.16.2 - semver: 7.8.1 + is-core-module: 2.17.0 + semver: 7.8.5 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -28324,11 +28021,11 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 npm-install-checks@8.0.0: dependencies: - semver: 7.8.1 + semver: 7.7.4 npm-normalize-package-bin@3.0.1: {} @@ -28338,21 +28035,21 @@ snapshots: dependencies: hosted-git-info: 6.1.3 proc-log: 3.0.0 - semver: 7.8.1 + semver: 7.8.5 validate-npm-package-name: 5.0.1 npm-package-arg@11.0.3: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.8.1 + semver: 7.8.5 validate-npm-package-name: 5.0.1 npm-package-arg@13.0.2: dependencies: hosted-git-info: 9.0.3 proc-log: 6.1.0 - semver: 7.8.1 + semver: 7.7.4 validate-npm-package-name: 7.0.2 npm-packlist@10.0.4: @@ -28365,20 +28062,20 @@ snapshots: npm-install-checks: 8.0.0 npm-normalize-package-bin: 5.0.0 npm-package-arg: 13.0.2 - semver: 7.8.1 + semver: 7.7.4 npm-pick-manifest@8.0.2: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.8.1 + semver: 7.8.5 npm-registry-fetch@19.1.1(supports-color@8.1.1): dependencies: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 15.0.5(supports-color@8.1.1) + make-fetch-happen: 15.0.6(supports-color@8.1.1) minipass: 7.1.3 minipass-fetch: 5.0.2 minizlib: 3.1.0 @@ -28397,7 +28094,7 @@ snapshots: nullthrows@1.1.1: {} - nx@23.2.1(@swc/core@1.15.40): + nx@23.2.1(@swc/core@1.16.2): dependencies: '@clack/core': 1.4.3 '@clack/prompts': 1.7.0 @@ -28534,13 +28231,13 @@ snapshots: '@nx/nx-linux-x64-musl': 23.2.1 '@nx/nx-win32-arm64-msvc': 23.2.1 '@nx/nx-win32-x64-msvc': 23.2.1 - '@swc/core': 1.15.40 + '@swc/core': 1.16.2 ob1@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - ob1@0.83.7: + ob1@0.83.8: dependencies: flow-enums-runtime: 0.0.6 @@ -28593,13 +28290,13 @@ snapshots: obuf@1.1.2: {} - obug@2.1.1: {} + obug@2.2.1: {} - octane@0.2.16(@typescript-eslint/types@8.59.4)(react-dom@19.3.0(react@19.3.0))(react@19.1.0)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + octane@0.2.16(@typescript-eslint/types@8.70.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: - '@tsrx/core': 0.2.4(@typescript-eslint/types@8.59.4) - '@tsrx/oxc': 0.13.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)) - '@types/react': 19.2.17 + '@tsrx/core': 0.2.4(@typescript-eslint/types@8.70.0) + '@tsrx/oxc': 0.13.0(svelte@5.57.1(@typescript-eslint/types@8.70.0)) + '@types/react': 19.2.18 '@volar/language-core': 2.4.28 '@volar/typescript': 2.4.28(typescript@5.9.3) alien-signals: 3.2.0 @@ -28607,12 +28304,12 @@ snapshots: devalue: 5.9.4 entities: 7.0.1 es-module-lexer: 1.7.0 - esrap: 2.3.7(@typescript-eslint/types@8.59.4) + esrap: 2.3.7(@typescript-eslint/types@8.70.0) optionalDependencies: react: 19.1.0 - react-dom: 19.3.0(react@19.3.0) + react-dom: 19.1.0(react@19.1.0) typescript: 5.9.3 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@typescript-eslint/types' - svelte @@ -28646,21 +28343,21 @@ snapshots: open@10.1.0: dependencies: - default-browser: 5.5.0 + default-browser: 5.2.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 - is-wsl: 3.1.1 + is-wsl: 3.1.0 open@10.2.0: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 open@11.0.0: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-in-ssh: 1.0.0 is-inside-container: 1.0.0 @@ -28701,7 +28398,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.2 + cli-spinners: 2.6.1 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -28717,9 +28414,9 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.1 + string-width: 8.2.2 - ora@9.4.0: + ora@9.4.1: dependencies: chalk: 5.6.2 cli-cursor: 5.0.0 @@ -28728,20 +28425,21 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.1 + string-width: 8.2.2 ordered-binary@1.6.1: optional: true outdent@0.8.0: {} - own-keys@1.0.1: + own-keys@1.0.2: dependencies: + call-bound: 1.0.4 get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + oxc-parser@0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3): dependencies: '@oxc-project/types': 0.121.0 optionalDependencies: @@ -28761,7 +28459,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.121.0 '@oxc-parser/binding-linux-x64-musl': 0.121.0 '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 '@oxc-parser/binding-win32-x64-msvc': 0.121.0 @@ -28793,33 +28491,6 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.150.0 '@oxc-parser/binding-win32-x64-msvc': 0.150.0 - oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): - optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.19.1 - '@oxc-resolver/binding-android-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-x64': 11.19.1 - '@oxc-resolver/binding-freebsd-x64': 11.19.1 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-arm64-musl': 11.19.1 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-musl': 11.19.1 - '@oxc-resolver/binding-linux-s390x-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-musl': 11.19.1 - '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 - '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 - '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - oxc-resolver@11.24.2: optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.24.2 @@ -28842,7 +28513,7 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 - oxfmt@0.59.0(svelte@5.55.9(@typescript-eslint/types@8.59.4)): + oxfmt@0.59.0(svelte@5.57.1(@typescript-eslint/types@8.70.0)): dependencies: tinypool: 2.1.0 optionalDependencies: @@ -28865,7 +28536,7 @@ snapshots: '@oxfmt/binding-win32-arm64-msvc': 0.59.0 '@oxfmt/binding-win32-ia32-msvc': 0.59.0 '@oxfmt/binding-win32-x64-msvc': 0.59.0 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) oxlint-tsgolint@0.24.0: optionalDependencies: @@ -28919,7 +28590,7 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@7.0.4: {} + p-map@7.0.8: {} p-retry@6.2.1: dependencies: @@ -28931,12 +28602,11 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.6.0: {} - package-manager-detector@1.8.0: {} - pacote@21.3.1(supports-color@8.1.1): + pacote@21.5.1(supports-color@8.1.1): dependencies: + '@gar/promise-retry': 1.0.3 '@npmcli/git': 7.0.2 '@npmcli/installed-package-contents': 4.0.0 '@npmcli/package-json': 7.0.5 @@ -28950,10 +28620,9 @@ snapshots: npm-pick-manifest: 11.0.3 npm-registry-fetch: 19.1.1(supports-color@8.1.1) proc-log: 6.1.0 - promise-retry: 2.0.1 sigstore: 4.1.1(supports-color@8.1.1) ssri: 13.0.1 - tar: 7.5.15 + tar: 7.5.22 transitivePeerDependencies: - supports-color @@ -29013,7 +28682,7 @@ snapshots: parse5@8.0.1: dependencies: - entities: 8.0.0 + entities: 8.1.0 parseurl@1.3.3: {} @@ -29034,7 +28703,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.0 + lru-cache: 11.5.3 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -29069,14 +28738,15 @@ snapshots: picomatch@4.0.7: {} - pidtree@0.6.0: {} - - pify@4.0.1: - optional: true + pidtree@0.6.1: {} pirates@4.0.7: {} - piscina@5.1.4: + piscina@5.2.0: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + + piscina@5.3.2: optionalDependencies: '@napi-rs/nice': 1.1.1 @@ -29092,24 +28762,24 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - pkg-types@2.3.1: + pkg-types@2.3.3: dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 + confbox: 0.3.1 + exsolve: 1.1.1 pathe: 2.0.3 - pkijs@3.4.0: + pkijs@3.4.1: dependencies: - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.8.0 asn1js: 3.0.10 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 - pvutils: 1.1.5 + pvutils: 1.2.0 tslib: 2.8.1 plist@3.1.1: dependencies: - '@xmldom/xmldom': 0.9.10 + '@xmldom/xmldom': 0.9.12 base64-js: 1.5.1 xmlbuilder: 15.1.1 @@ -29126,22 +28796,22 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 - yaml: 2.9.0 + yaml: 2.9.1 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3) - postcss-loader@8.2.0(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + postcss-loader@8.2.0(postcss@8.5.23)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: - cosmiconfig: 9.0.1(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@5.9.3) jiti: 2.7.0 - postcss: 8.5.12 - semver: 7.8.1 + postcss: 8.5.23 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) transitivePeerDependencies: - typescript @@ -29153,7 +28823,7 @@ snapshots: postcss-js: 4.1.0(postcss@8.5.6) postcss-simple-vars: 7.0.1(postcss@8.5.6) sugarss: 5.0.1(postcss@8.5.6) - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 postcss-mixins@9.0.4(postcss@8.5.6): dependencies: @@ -29171,13 +28841,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.6 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.6 postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: @@ -29199,7 +28869,7 @@ snapshots: postcss-nested@7.0.2(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.6 postcss-preset-mantine@1.18.0(postcss@8.5.6): dependencies: @@ -29207,11 +28877,11 @@ snapshots: postcss-mixins: 12.1.2(postcss@8.5.6) postcss-nested: 7.0.2(postcss@8.5.6) - postcss-safe-parser@7.0.1(postcss@8.5.6): + postcss-safe-parser@7.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.6: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -29224,37 +28894,37 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.49: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.12: + postcss@8.5.23: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.15: + postcss@8.5.28: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.5.6: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 powershell-utils@0.1.0: {} - preact@10.29.2: {} + preact@10.29.8: {} prelude-ls@1.2.1: {} @@ -29262,7 +28932,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.3: {} + prettier@3.9.8: {} pretty-bytes@5.6.0: {} @@ -29282,6 +28952,24 @@ snapshots: dependencies: parse-ms: 2.1.0 + probe-image-size@7.4.0(supports-color@7.2.0): + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1(supports-color@7.2.0) + stream-parser: 0.3.1(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + optional: true + + probe-image-size@7.4.0(supports-color@8.1.1): + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1(supports-color@8.1.1) + stream-parser: 0.3.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + optional: true + proc-log@3.0.0: {} proc-log@4.2.0: {} @@ -29322,7 +29010,7 @@ snapshots: proto-list@1.2.4: {} - proxy-addr@2.0.7: + proxy-addr@2.0.8: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 @@ -29332,10 +29020,10 @@ snapshots: prr@1.0.1: optional: true - publint@0.3.21: + publint@0.3.24: dependencies: - '@publint/pack': 0.1.4 - package-manager-detector: 1.6.0 + '@publint/pack': 0.1.7 + package-manager-detector: 1.8.0 picocolors: 1.1.1 sade: 1.8.1 @@ -29365,13 +29053,14 @@ snapshots: dependencies: tslib: 2.8.1 - pvutils@1.1.5: {} + pvutils@1.2.0: {} qrcode-terminal@0.11.0: {} - qs@6.15.2: + qs@6.16.0: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 quansync@0.2.11: {} @@ -29392,6 +29081,8 @@ snapshots: range-parser@1.2.1: {} + range-parser@1.3.0: {} + raw-body@2.5.3: dependencies: bytes: 3.1.2 @@ -29403,7 +29094,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 unpipe: 1.0.0 rc@1.2.8: @@ -29415,8 +29106,8 @@ snapshots: react-devtools-core@6.1.5: dependencies: - shell-quote: 1.8.4 - ws: 7.5.11 + shell-quote: 1.10.0 + ws: 7.5.13 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -29426,11 +29117,6 @@ snapshots: react: 19.1.0 scheduler: 0.26.0 - react-dom@19.3.0(react@19.3.0): - dependencies: - react: 19.3.0 - scheduler: 0.28.0 - react-fast-compare@3.2.2: {} react-freeze@1.0.4(react@19.1.0): @@ -29443,40 +29129,40 @@ snapshots: react-is@18.3.1: {} - react-is@19.2.6: {} + react-is@19.3.0: {} - react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: '@egjs/hammerjs': 2.0.17 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - react-native-reanimated@4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + react-native-reanimated@4.1.7(react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) - react-native-worklets: 0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) - semver: 7.8.1 + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native-worklets: 0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1) + semver: 7.8.5 - react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) - react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): + react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0): dependencies: react: 19.1.0 react-freeze: 1.0.4(react@19.1.0) - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) warn-once: 0.1.1 react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -29494,7 +29180,7 @@ snapshots: transitivePeerDependencies: - encoding - react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1): + react-native-worklets@0.5.1(@babel/core@7.29.7(supports-color@8.1.1))(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0)(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) @@ -29508,12 +29194,12 @@ snapshots: '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) convert-source-map: 2.0.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1) + react-native: 0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1) semver: 7.7.2 transitivePeerDependencies: - supports-color - react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1): + react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.5 @@ -29522,7 +29208,7 @@ snapshots: '@react-native/gradle-plugin': 0.81.5 '@react-native/js-polyfills': 0.81.5 '@react-native/normalize-colors': 0.81.5 - '@react-native/virtualized-lists': 0.81.5(@types/react@19.2.17)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.17)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) + '@react-native/virtualized-lists': 0.81.5(@types/react@19.2.18)(react-native@0.81.5(@babel/core@7.29.7(supports-color@8.1.1))(@types/react@19.2.18)(react@19.1.0)(supports-color@8.1.1))(react@19.1.0) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -29535,8 +29221,8 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.83.7 - metro-source-map: 0.83.7(supports-color@8.1.1) + metro-runtime: 0.83.8 + metro-source-map: 0.83.8(supports-color@8.1.1) nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 @@ -29545,13 +29231,13 @@ snapshots: react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.26.0 - semver: 7.8.1 + semver: 7.8.5 stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 - ws: 6.2.4 - yargs: 17.7.2 + ws: 6.2.6 + yargs: 17.7.3 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 transitivePeerDependencies: - '@babel/core' - '@react-native-community/cli' @@ -29569,51 +29255,51 @@ snapshots: react-refresh@0.18.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.1.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.1.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.1.0): + react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.1.0) - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.1.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.1.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.1.0) - use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.1.0) + use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - react-router-dom@6.30.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-router-dom@6.30.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@remix-run/router': 1.23.2 + '@remix-run/router': 1.23.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-router: 6.30.3(react@19.1.0) + react-router: 6.30.4(react@19.1.0) - react-router@6.30.3(react@19.1.0): + react-router@6.30.4(react@19.1.0): dependencies: - '@remix-run/router': 1.23.2 + '@remix-run/router': 1.23.3 react: 19.1.0 - react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.1.0): + react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.1.0): dependencies: get-nonce: 1.0.1 react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - react-textarea-autosize@8.5.9(@types/react@19.2.17)(react@19.1.0): + react-textarea-autosize@8.5.9(@types/react@19.2.18)(react@19.1.0): dependencies: '@babel/runtime': 7.29.7 react: 19.1.0 - use-composed-ref: 1.4.0(@types/react@19.2.17)(react@19.1.0) - use-latest: 1.3.0(@types/react@19.2.17)(react@19.1.0) + use-composed-ref: 1.4.0(@types/react@19.2.18)(react@19.1.0) + use-latest: 1.3.0(@types/react@19.2.18)(react@19.1.0) transitivePeerDependencies: - '@types/react' @@ -29628,8 +29314,6 @@ snapshots: react@19.1.0: {} - react@19.3.0: {} - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -29652,7 +29336,7 @@ snapshots: readdirp@4.1.2: {} - readdirp@5.0.0: {} + readdirp@5.1.1: {} redent@3.0.0: dependencies: @@ -29696,13 +29380,13 @@ snapshots: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.1 + regjsparser: 0.13.3 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.13.1: + regjsparser@0.13.3: dependencies: jsesc: 3.1.0 @@ -29717,7 +29401,7 @@ snapshots: dependencies: estree-util-is-identifier-name: 1.1.0 estree-util-value-to-estree: 1.3.0 - js-yaml: 4.1.1 + js-yaml: 4.3.2 toml: 3.0.0 remark-mdx@2.3.0(supports-color@8.1.1): @@ -29777,7 +29461,7 @@ snapshots: resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.2 + is-core-module: 2.17.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -29788,8 +29472,8 @@ snapshots: resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.2 - node-exports-info: 1.6.0 + is-core-module: 2.17.0 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -29821,31 +29505,31 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.23.2(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(rolldown@1.0.0-rc.17)(typescript@5.9.3): + rolldown-plugin-dts@0.23.2(oxc-resolver@11.24.2)(rolldown@1.0.0-rc.17)(typescript@5.9.3): dependencies: '@babel/generator': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 '@babel/parser': 8.0.0-rc.3 '@babel/types': 8.0.0-rc.3 - ast-kit: 3.0.0-beta.1 - birpc: 4.0.0 - dts-resolver: 2.1.3(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)) - get-tsconfig: 4.14.0 - obug: 2.1.1 - picomatch: 4.0.4 + ast-kit: 3.0.0 + birpc: 4.2.0 + dts-resolver: 2.1.3(oxc-resolver@11.24.2) + get-tsconfig: 4.14.3 + obug: 2.2.1 + picomatch: 4.0.7 rolldown: 1.0.0-rc.17 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-solid@0.2.1(rolldown@1.0.0-rc.17)(solid-js@1.9.13)(supports-color@8.1.1): + rolldown-plugin-solid@0.2.1(rolldown@1.0.0-rc.17)(solid-js@1.9.15)(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) - babel-preset-solid: 1.9.12(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.13) + babel-preset-solid: 1.9.15(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.15) rolldown: 1.0.0-rc.17 - solid-js: 1.9.13 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color @@ -29870,7 +29554,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 - rolldown@1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + rolldown@1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3): dependencies: '@oxc-project/types': 0.113.0 '@rolldown/pluginutils': 1.0.0-rc.4 @@ -29885,59 +29569,60 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - rollup-plugin-dts@6.4.1(rollup@4.60.4)(typescript@5.9.3): + rollup-plugin-dts@6.4.1(rollup@4.63.4)(typescript@5.9.3): dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.6.0 convert-source-map: 2.0.0 magic-string: 0.30.21 - rollup: 4.60.4 + rollup: 4.63.4 typescript: 5.9.3 optionalDependencies: '@babel/code-frame': 7.29.7 - rollup-plugin-preserve-directives@0.4.0(rollup@4.60.4): + rollup-plugin-preserve-directives@0.4.0(rollup@4.63.4): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + '@rollup/pluginutils': 5.4.0(rollup@4.63.4) magic-string: 0.30.21 - rollup: 4.60.4 + rollup: 4.63.4 - rollup@4.60.4: + rollup@4.63.4: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.4 - '@rollup/rollup-android-arm64': 4.60.4 - '@rollup/rollup-darwin-arm64': 4.60.4 - '@rollup/rollup-darwin-x64': 4.60.4 - '@rollup/rollup-freebsd-arm64': 4.60.4 - '@rollup/rollup-freebsd-x64': 4.60.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 - '@rollup/rollup-linux-arm-musleabihf': 4.60.4 - '@rollup/rollup-linux-arm64-gnu': 4.60.4 - '@rollup/rollup-linux-arm64-musl': 4.60.4 - '@rollup/rollup-linux-loong64-gnu': 4.60.4 - '@rollup/rollup-linux-loong64-musl': 4.60.4 - '@rollup/rollup-linux-ppc64-gnu': 4.60.4 - '@rollup/rollup-linux-ppc64-musl': 4.60.4 - '@rollup/rollup-linux-riscv64-gnu': 4.60.4 - '@rollup/rollup-linux-riscv64-musl': 4.60.4 - '@rollup/rollup-linux-s390x-gnu': 4.60.4 - '@rollup/rollup-linux-x64-gnu': 4.60.4 - '@rollup/rollup-linux-x64-musl': 4.60.4 - '@rollup/rollup-openbsd-x64': 4.60.4 - '@rollup/rollup-openharmony-arm64': 4.60.4 - '@rollup/rollup-win32-arm64-msvc': 4.60.4 - '@rollup/rollup-win32-ia32-msvc': 4.60.4 - '@rollup/rollup-win32-x64-gnu': 4.60.4 - '@rollup/rollup-win32-x64-msvc': 4.60.4 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.4 + '@rollup/rollup-android-arm64': 4.63.4 + '@rollup/rollup-darwin-arm64': 4.63.4 + '@rollup/rollup-darwin-x64': 4.63.4 + '@rollup/rollup-freebsd-arm64': 4.63.4 + '@rollup/rollup-freebsd-x64': 4.63.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.4 + '@rollup/rollup-linux-arm-musleabihf': 4.63.4 + '@rollup/rollup-linux-arm64-gnu': 4.63.4 + '@rollup/rollup-linux-arm64-musl': 4.63.4 + '@rollup/rollup-linux-loong64-gnu': 4.63.4 + '@rollup/rollup-linux-loong64-musl': 4.63.4 + '@rollup/rollup-linux-ppc64-gnu': 4.63.4 + '@rollup/rollup-linux-ppc64-musl': 4.63.4 + '@rollup/rollup-linux-riscv64-gnu': 4.63.4 + '@rollup/rollup-linux-riscv64-musl': 4.63.4 + '@rollup/rollup-linux-s390x-gnu': 4.63.4 + '@rollup/rollup-linux-x64-gnu': 4.63.4 + '@rollup/rollup-linux-x64-musl': 4.63.4 + '@rollup/rollup-openbsd-x64': 4.63.4 + '@rollup/rollup-openharmony-arm64': 4.63.4 + '@rollup/rollup-win32-arm64-msvc': 4.63.4 + '@rollup/rollup-win32-ia32-msvc': 4.63.4 + '@rollup/rollup-win32-x64-gnu': 4.63.4 + '@rollup/rollup-win32-x64-msvc': 4.63.4 fsevents: 2.3.3 rou3@0.8.1: {} @@ -29954,8 +29639,6 @@ snapshots: run-applescript@7.0.0: {} - run-applescript@7.1.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -29993,30 +29676,30 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.97.3 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) - sass@1.100.0: + sass@1.104.1: dependencies: chokidar: 5.0.0 - immutable: 5.1.5 + immutable: 5.1.9 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + '@parcel/watcher': 2.6.0 sass@1.97.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.5 + immutable: 5.1.9 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + '@parcel/watcher': 2.6.0 - sax@1.6.0: {} + sax@1.6.1: {} saxes@6.0.0: dependencies: @@ -30024,13 +29707,11 @@ snapshots: scheduler@0.26.0: {} - scheduler@0.28.0: {} - - schema-utils@4.3.3: + schema-utils@4.5.0: dependencies: '@types/json-schema': 7.0.15 ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) + ajv-formats: 3.0.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) scule@1.3.0: {} @@ -30040,10 +29721,7 @@ snapshots: selfsigned@5.5.0: dependencies: '@peculiar/x509': 1.14.3 - pkijs: 3.4.0 - - semver@5.7.2: - optional: true + pkijs: 3.4.1 semver@6.3.1: {} @@ -30057,10 +29735,10 @@ snapshots: semver@7.7.4: {} - semver@7.8.1: {} - semver@7.8.4: {} + semver@7.8.5: {} + send@0.19.2(supports-color@8.1.1): dependencies: debug: 2.6.9(supports-color@8.1.1) @@ -30090,20 +29768,26 @@ snapshots: mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 statuses: 2.0.2 transitivePeerDependencies: - supports-color serialize-error@2.1.0: {} - serialize-javascript@7.0.5: {} + serialize-javascript@7.1.1: {} + + seroval-plugins@1.5.6(seroval@1.5.6): + dependencies: + seroval: 1.5.6 - seroval-plugins@1.5.4(seroval@1.5.4): + seroval-plugins@1.6.7(seroval@1.6.7): dependencies: - seroval: 1.5.4 + seroval: 1.6.7 + + seroval@1.5.6: {} - seroval@1.5.4: {} + seroval@1.6.7: {} serve-index@1.9.2(supports-color@8.1.1): dependencies: @@ -30177,7 +29861,7 @@ snapshots: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.1 + semver: 7.8.5 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -30211,42 +29895,42 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.4: {} + shell-quote@1.10.0: {} - sherif-darwin-arm64@1.11.1: + sherif-darwin-arm64@1.13.0: optional: true - sherif-darwin-x64@1.11.1: + sherif-darwin-x64@1.13.0: optional: true - sherif-linux-arm64-musl@1.11.1: + sherif-linux-arm64-musl@1.13.0: optional: true - sherif-linux-arm64@1.11.1: + sherif-linux-arm64@1.13.0: optional: true - sherif-linux-x64-musl@1.11.1: + sherif-linux-x64-musl@1.13.0: optional: true - sherif-linux-x64@1.11.1: + sherif-linux-x64@1.13.0: optional: true - sherif-windows-arm64@1.11.1: + sherif-windows-arm64@1.13.0: optional: true - sherif-windows-x64@1.11.1: + sherif-windows-x64@1.13.0: optional: true - sherif@1.11.1: + sherif@1.13.0: optionalDependencies: - sherif-darwin-arm64: 1.11.1 - sherif-darwin-x64: 1.11.1 - sherif-linux-arm64: 1.11.1 - sherif-linux-arm64-musl: 1.11.1 - sherif-linux-x64: 1.11.1 - sherif-linux-x64-musl: 1.11.1 - sherif-windows-arm64: 1.11.1 - sherif-windows-x64: 1.11.1 + sherif-darwin-arm64: 1.13.0 + sherif-darwin-x64: 1.13.0 + sherif-linux-arm64: 1.13.0 + sherif-linux-arm64-musl: 1.13.0 + sherif-linux-x64: 1.13.0 + sherif-linux-x64-musl: 1.13.0 + sherif-windows-arm64: 1.13.0 + sherif-windows-x64: 1.13.0 side-channel-list@1.0.1: dependencies: @@ -30268,7 +29952,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -30286,7 +29970,7 @@ snapshots: dependencies: '@sigstore/bundle': 4.0.0 '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/protobuf-specs': 0.5.2 '@sigstore/sign': 4.1.1(supports-color@8.1.1) '@sigstore/tuf': 4.0.2(supports-color@8.1.1) '@sigstore/verify': 3.1.1 @@ -30333,43 +30017,43 @@ snapshots: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 - websocket-driver: 0.7.4 + websocket-driver: 0.7.5 socks-proxy-agent@8.0.5(supports-color@8.1.1): dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) - socks: 2.8.9 + socks: 2.8.10 transitivePeerDependencies: - supports-color - socks@2.8.9: + socks@2.8.10: dependencies: - ip-address: 10.2.0 + ip-address: 10.7.2 smart-buffer: 4.2.0 - solid-js@1.9.13: + solid-js@1.9.15: dependencies: csstype: 3.2.3 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.5.6 + seroval-plugins: 1.5.6(seroval@1.5.6) - solid-refresh@0.6.3(solid-js@1.9.13)(supports-color@8.1.1): + solid-refresh@0.6.3(solid-js@1.9.15)(supports-color@8.1.1): dependencies: - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) - '@babel/types': 7.29.7 - solid-js: 1.9.13 + '@babel/types': 7.29.8 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + source-map-loader@5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) source-map-support@0.5.21: dependencies: @@ -30387,21 +30071,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.24 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.24 spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.24 - spdx-license-ids@3.0.23: {} + spdx-license-ids@3.0.24: {} spdy-transport@3.0.0(supports-color@8.1.1): dependencies: @@ -30428,7 +30112,7 @@ snapshots: sprintf-js@1.0.3: {} - srvx@0.11.16: {} + srvx@0.11.22: {} ssri@10.0.6: dependencies: @@ -30456,6 +30140,10 @@ snapshots: dependencies: type-fest: 0.7.1 + standard-navigation@0.0.8(react@19.1.0): + dependencies: + react: 19.1.0 + statuses@1.5.0: {} statuses@2.0.2: {} @@ -30471,6 +30159,20 @@ snapshots: stream-buffers@2.2.0: {} + stream-parser@0.3.1(supports-color@7.2.0): + dependencies: + debug: 2.6.9(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + optional: true + + stream-parser@0.3.1(supports-color@8.1.1): + dependencies: + debug: 2.6.9(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + optional: true + stream-shift@1.0.3: {} stream-slice@0.1.2: {} @@ -30498,15 +30200,15 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string-width@8.2.1: + string-width@8.2.2: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string.prototype.matchall@4.0.12: + string.prototype.matchall@4.1.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -30520,14 +30222,14 @@ snapshots: internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -30536,8 +30238,9 @@ snapshots: es-abstract: 1.24.2 es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -30573,7 +30276,7 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.3.0 strip-bom@3.0.0: {} @@ -30599,6 +30302,13 @@ snapshots: dependencies: inline-style-parser: 0.1.1 + styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.1.0): + dependencies: + client-only: 0.0.1 + react: 19.1.0 + optionalDependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@8.1.1))(babel-plugin-macros@3.1.0)(react@19.1.0): dependencies: client-only: 0.0.1 @@ -30618,21 +30328,21 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 sugarss@4.0.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - sugarss@5.0.1(postcss@8.5.12): + sugarss@5.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.12 + postcss: 8.5.23 optional: true - sugarss@5.0.1(postcss@8.5.15): + sugarss@5.0.1(postcss@8.5.28): dependencies: - postcss: 8.5.15 + postcss: 8.5.28 optional: true sugarss@5.0.1(postcss@8.5.6): @@ -30658,53 +30368,53 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.4.8(picomatch@4.0.4)(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3): + svelte-check@4.7.6(picomatch@4.0.7)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.2.3 chokidar: 4.0.3 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.7) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) typescript: 5.9.3 transitivePeerDependencies: - picomatch - svelte2tsx@0.7.55(svelte@5.55.9(@typescript-eslint/types@8.59.4))(typescript@5.9.3): + svelte2tsx@0.7.61(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3): dependencies: dedent-js: 1.0.1 scule: 1.3.0 - svelte: 5.55.9(@typescript-eslint/types@8.59.4) + svelte: 5.57.1(@typescript-eslint/types@8.70.0) typescript: 5.9.3 - svelte@5.55.9(@typescript-eslint/types@8.59.4): + svelte@5.57.1(@typescript-eslint/types@8.70.0): dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.6.0 '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) '@types/estree': 1.0.9 - '@types/trusted-types': 2.0.7 acorn: 8.18.0 aria-query: 5.3.1 axobject-query: 4.1.0 clsx: 2.1.1 devalue: 5.9.4 esm-env: 1.2.2 - esrap: 2.3.7(@typescript-eslint/types@8.59.4) + esrap: 2.3.7(@typescript-eslint/types@8.70.0) is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.21 - zimmerframe: 1.1.4 + zimmerframe: 1.1.5 transitivePeerDependencies: - '@typescript-eslint/types' symbol-tree@3.2.4: {} - tabbable@6.4.0: {} + tabbable@6.5.0: {} tapable@2.3.3: {} - tar-fs@2.1.4: + tar-fs@2.1.5: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -30728,7 +30438,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.5.15: + tar@7.5.22: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -30741,31 +30451,31 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.6.0(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + terser-webpack-plugin@5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + schema-utils: 4.5.0 + terser: 5.46.0 + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) optionalDependencies: - '@swc/core': 1.15.40 - esbuild: 0.27.3 - lightningcss: 1.32.0 - postcss: 8.5.12 + '@swc/core': 1.16.2 + esbuild: 0.28.1 + lightningcss: 1.33.0 + postcss: 8.5.23 - terser-webpack-plugin@5.6.0(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)): + terser-webpack-plugin@5.6.1(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15) + schema-utils: 4.5.0 + terser: 5.46.0 + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28) optionalDependencies: - '@swc/core': 1.15.40 + '@swc/core': 1.16.2 esbuild: 0.28.2 - lightningcss: 1.32.0 - postcss: 8.5.15 + lightningcss: 1.33.0 + postcss: 8.5.28 optional: true terser@5.46.0: @@ -30775,7 +30485,7 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - terser@5.48.0: + terser@5.51.2: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.18.0 @@ -30792,7 +30502,7 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.6 glob: 10.5.0 - minimatch: 10.2.5 + minimatch: 10.2.6 thenify-all@1.6.0: dependencies: @@ -30802,7 +30512,7 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@2.6.0(tslib@2.8.1): + thingies@2.6.1(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -30820,11 +30530,6 @@ snapshots: tinyexec@1.1.2: {} tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 - - tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -30840,13 +30545,13 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.4: {} + tinyspy@4.0.6: {} - tldts-core@7.4.0: {} + tldts-core@7.4.13: {} - tldts@7.4.0: + tldts@7.4.13: dependencies: - tldts-core: 7.4.0 + tldts-core: 7.4.13 tmp@0.2.7: {} @@ -30860,9 +30565,9 @@ snapshots: toml@3.0.0: {} - tough-cookie@6.0.1: + tough-cookie@6.0.2: dependencies: - tldts: 7.4.0 + tldts: 7.4.13 tr46@0.0.3: {} @@ -30886,24 +30591,19 @@ snapshots: ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: - picomatch: 4.0.4 + picomatch: 4.0.7 typescript: 5.9.3 ts-interface-checker@0.1.13: {} - ts-morph@21.0.1: - dependencies: - '@ts-morph/common': 0.22.0 - code-block-writer: 12.0.0 - - ts-node@10.9.2(@swc/core@1.15.40)(@types/node@24.12.4)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.16.2)(@types/node@24.13.6)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.13 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.12.4 + '@types/node': 24.13.6 acorn: 8.18.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -30914,7 +30614,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.40 + '@swc/core': 1.16.2 ts-patch@3.3.0: dependencies: @@ -30922,7 +30622,7 @@ snapshots: global-prefix: 4.0.0 minimist: 1.2.8 resolve: 1.22.12 - semver: 7.8.1 + semver: 7.8.5 strip-ansi: 6.0.1 ts-pattern@5.9.0: {} @@ -30944,26 +30644,26 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.21.10(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(publint@0.3.21)(typescript@5.9.3): + tsdown@0.21.10(oxc-resolver@11.24.2)(publint@0.3.24)(typescript@5.9.3): dependencies: - ansis: 4.3.0 + ansis: 4.4.0 cac: 7.0.0 defu: 6.1.7 - empathic: 2.0.1 - hookable: 6.1.1 + empathic: 2.1.0 + hookable: 6.1.2 import-without-cache: 0.3.3 - obug: 2.1.1 - picomatch: 4.0.4 + obug: 2.2.1 + picomatch: 4.0.7 rolldown: 1.0.0-rc.17 - rolldown-plugin-dts: 0.23.2(oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(rolldown@1.0.0-rc.17)(typescript@5.9.3) - semver: 7.8.1 + rolldown-plugin-dts: 0.23.2(oxc-resolver@11.24.2)(rolldown@1.0.0-rc.17)(typescript@5.9.3) + semver: 7.8.5 tinyexec: 1.1.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 unrun: 0.2.39 optionalDependencies: - publint: 0.3.21 + publint: 0.3.24 typescript: 5.9.3 transitivePeerDependencies: - '@ts-macro/tsc' @@ -30984,7 +30684,7 @@ snapshots: dependencies: '@tufjs/models': 4.1.0 debug: 4.4.3(supports-color@8.1.1) - make-fetch-happen: 15.0.5(supports-color@8.1.1) + make-fetch-happen: 15.0.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -31009,8 +30709,8 @@ snapshots: type-is@2.1.0: dependencies: - content-type: 2.0.0 - media-typer: 1.1.0 + content-type: 2.1.0 + media-typer: 1.1.1 mime-types: 3.0.2 typed-array-buffer@1.0.3: @@ -31027,17 +30727,16 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.4: + typed-array-byte-offset@1.0.5: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 - has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -31051,7 +30750,7 @@ snapshots: typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))): dependencies: typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) - yaml: 2.9.0 + yaml: 2.9.1 typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)): dependencies: @@ -31061,17 +30760,17 @@ snapshots: dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 - markdown-it: 14.2.0 + markdown-it: 14.3.2 minimatch: 9.0.9 typescript: 5.9.3 - yaml: 2.9.0 + yaml: 2.9.1 - typescript-eslint@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): + typescript-eslint@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.4(supports-color@7.2.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.70.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: @@ -31108,16 +30807,14 @@ snapshots: unconfig-core@7.5.0: dependencies: - '@quansync/fs': 1.0.0 + '@quansync/fs': 1.1.0 quansync: 1.0.0 - undici-types@7.16.0: {} + undici-types@7.18.2: {} - undici@6.26.0: {} + undici@6.28.1: {} - undici@7.24.4: {} - - undici@7.26.0: {} + undici@7.29.1: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -31188,11 +30885,16 @@ snapshots: unpipe@1.0.0: {} - unplugin@3.0.0: + unplugin@3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)): dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.4 + picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.2 + rollup: 4.63.4 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28) unrs-resolver@1.12.2: dependencies: @@ -31225,9 +30927,9 @@ snapshots: dependencies: rolldown: 1.0.0-rc.17 - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.3.3(browserslist@4.29.0): dependencies: - browserslist: 4.28.2 + browserslist: 4.29.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -31235,45 +30937,45 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.1.0): + use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - use-composed-ref@1.4.0(@types/react@19.2.17)(react@19.1.0): + use-composed-ref@1.4.0(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - use-isomorphic-layout-effect@1.2.1(@types/react@19.2.17)(react@19.1.0): + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 use-latest-callback@0.2.6(react@19.1.0): dependencies: react: 19.1.0 - use-latest@1.3.0(@types/react@19.2.17)(react@19.1.0): + use-latest@1.3.0(@types/react@19.2.18)(react@19.1.0): dependencies: react: 19.1.0 - use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.17)(react@19.1.0) + use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.18)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - use-sidecar@1.1.3(@types/react@19.2.17)(react@19.1.0): + use-sidecar@1.1.3(@types/react@19.2.18)(react@19.1.0): dependencies: detect-node-es: 1.1.0 react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 - use-sync-external-store@1.6.0(react@19.1.0): + use-sync-external-store@1.7.0(react@19.1.0): dependencies: react: 19.1.0 @@ -31285,7 +30987,7 @@ snapshots: is-arguments: 1.2.0 is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 utils-merge@1.0.1: {} @@ -31302,7 +31004,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valibot@1.4.1(typescript@5.9.3): + valibot@1.5.0(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -31317,9 +31019,9 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + vaul@1.1.2(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -31338,13 +31040,13 @@ snapshots: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vite-node@1.6.1(@types/node@24.12.4)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0): + vite-node@1.6.1(@types/node@24.13.6)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@24.12.4)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0) + vite: 5.4.21(@types/node@24.13.6)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2) transitivePeerDependencies: - '@types/node' - less @@ -31356,13 +31058,13 @@ snapshots: - supports-color - terser - vite-node@3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0): + vite-node@3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@7.2.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -31377,13 +31079,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0): + vite-node@3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -31398,13 +31100,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0): + vite-node@3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -31419,10 +31121,10 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.12.4)(rollup@4.60.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-dts@4.2.3(@types/node@24.13.6)(rollup@4.63.4)(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@24.12.4) - '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + '@microsoft/api-extractor': 7.47.7(@types/node@24.13.6) + '@rollup/pluginutils': 5.4.0(rollup@4.63.4) '@volar/typescript': 2.4.28(typescript@5.9.3) '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 @@ -31432,32 +31134,32 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-externalize-deps@0.10.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(supports-color@8.1.1)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.13) + babel-preset-solid: 1.9.15(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.15) merge-anything: 5.1.7 - solid-js: 1.9.13 - solid-refresh: 0.6.3(solid-js@1.9.13)(supports-color@8.1.1) - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vitefu: 1.1.3(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) + solid-js: 1.9.15 + solid-refresh: 0.6.3(solid-js@1.9.15)(supports-color@8.1.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) optionalDependencies: - '@testing-library/jest-dom': 6.9.1 + '@testing-library/jest-dom': 6.10.0(@testing-library/dom@10.4.2) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-prerender-plugin@0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -31465,202 +31167,202 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-tsconfig-paths@5.1.4(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-tsconfig-paths@5.1.4(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: debug: 4.4.3(supports-color@7.2.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vite-tsconfig-paths@5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0)): + vite-tsconfig-paths@5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)): dependencies: debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@24.12.4)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0): + vite@5.4.21(@types/node@24.13.6)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.60.4 + rollup: 4.63.4 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 - less: 4.6.4 - lightningcss: 1.32.0 - sass: 1.100.0 + less: 4.9.1(supports-color@8.1.1) + lightningcss: 1.33.0 + sass: 1.104.1 sugarss: 5.0.1(postcss@8.5.6) - terser: 5.48.0 + terser: 5.51.2 - vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.1): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.23))(terser@5.46.0)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 + rollup: 4.63.4 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.4.2 - lightningcss: 1.32.0 + less: 4.9.0(supports-color@8.1.1) + lightningcss: 1.33.0 sass: 1.97.3 - sugarss: 5.0.1(postcss@8.5.12) + sugarss: 5.0.1(postcss@8.5.23) terser: 5.46.0 yaml: 2.9.1 - vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.46.0)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 + rollup: 4.63.4 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.4.2 - lightningcss: 1.32.0 + less: 4.9.0(supports-color@8.1.1) + lightningcss: 1.33.0 sass: 1.97.3 - sugarss: 5.0.1(postcss@8.5.15) + sugarss: 5.0.1(postcss@8.5.28) terser: 5.46.0 - yaml: 2.9.0 + yaml: 2.9.1 - vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.1): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 + rollup: 4.63.4 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.4.2 - lightningcss: 1.32.0 - sass: 1.97.3 - sugarss: 5.0.1(postcss@8.5.15) - terser: 5.46.0 + less: 4.9.1(supports-color@7.2.0) + lightningcss: 1.33.0 + sass: 1.104.1 + sugarss: 5.0.1(postcss@8.5.28) + terser: 5.51.2 yaml: 2.9.1 - vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 + rollup: 4.63.4 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.6.4 - lightningcss: 1.32.0 - sass: 1.97.3 - sugarss: 5.0.1(postcss@8.5.15) - terser: 5.48.0 - yaml: 2.9.0 - optional: true + less: 4.9.1(supports-color@8.1.1) + lightningcss: 1.33.0 + sass: 1.104.1 + sugarss: 5.0.1(postcss@8.5.28) + terser: 5.51.2 + yaml: 2.9.1 - vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 - tinyglobby: 0.2.16 + rollup: 4.63.4 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.6.4 - lightningcss: 1.32.0 - sass: 1.100.0 - sugarss: 5.0.1(postcss@8.5.15) - terser: 5.48.0 - yaml: 2.9.0 + less: 4.9.1(supports-color@8.1.1) + lightningcss: 1.33.0 + sass: 1.104.1 + sugarss: 5.0.1(postcss@8.5.6) + terser: 5.51.2 + yaml: 2.9.1 - vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.6))(terser@5.48.0)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1): dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 postcss: 8.5.6 - rollup: 4.60.4 - tinyglobby: 0.2.16 + rollup: 4.63.4 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.6 fsevents: 2.3.3 jiti: 2.7.0 - less: 4.6.4 - lightningcss: 1.32.0 - sass: 1.100.0 - sugarss: 5.0.1(postcss@8.5.6) - terser: 5.48.0 - yaml: 2.9.0 + less: 4.9.1(supports-color@8.1.1) + lightningcss: 1.33.0 + sass: 1.97.3 + sugarss: 5.0.1(postcss@8.5.28) + terser: 5.51.2 + yaml: 2.9.1 + optional: true - vitefu@1.1.3(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)): + vitefu@1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): optionalDependencies: - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0): + vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1): dependencies: '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 chai: 5.3.3 debug: 4.4.3(supports-color@7.2.0) - expect-type: 1.3.0 + expect-type: 1.4.0 magic-string: 0.30.21 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.7 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 1.1.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@7.2.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-node: 3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0) transitivePeerDependencies: - jiti @@ -31676,34 +31378,77 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.4)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0): + vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): dependencies: '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 chai: 5.3.3 debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.3.0 + expect-type: 1.4.0 magic-string: 0.30.21 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.7 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-node: 3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.13 + '@types/node': 24.13.6 + jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3(supports-color@8.1.1) + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.7 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 1.1.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.3(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@24.12.4)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.1(postcss@8.5.15))(supports-color@8.1.1)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-node: 3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 - '@types/node': 24.12.4 + '@types/node': 24.13.6 jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1) transitivePeerDependencies: - jiti @@ -31721,15 +31466,15 @@ snapshots: vlq@1.0.1: {} - vscode-uri@3.1.0: {} + vscode-uri@3.2.0: {} - vue-component-type-helpers@3.3.2: {} + vue-component-type-helpers@3.3.11: {} - vue-demi@0.14.10(vue@3.5.34(typescript@5.9.3)): + vue-demi@0.14.10(vue@3.5.43(typescript@5.9.3)): dependencies: - vue: 3.5.34(typescript@5.9.3) + vue: 3.5.43(typescript@5.9.3) - vue-eslint-parser@10.4.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): + vue-eslint-parser@10.4.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) @@ -31737,7 +31482,7 @@ snapshots: eslint-visitor-keys: 5.0.1 espree: 11.2.0 esquery: 1.7.0 - semver: 7.8.1 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -31747,13 +31492,13 @@ snapshots: '@vue/language-core': 2.2.12(typescript@5.9.3) typescript: 5.9.3 - vue@3.5.34(typescript@5.9.3): + vue@3.5.43(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.5.34 - '@vue/compiler-sfc': 3.5.34 - '@vue/runtime-dom': 3.5.34 - '@vue/server-renderer': 3.5.34(vue@3.5.34(typescript@5.9.3)) - '@vue/shared': 3.5.34 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/server-renderer': 3.5.43 + '@vue/shared': 3.5.43 optionalDependencies: typescript: 5.9.3 @@ -31774,6 +31519,10 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + wbuf@1.7.3: dependencies: minimalistic-assert: 1.0.1 @@ -31799,56 +31548,53 @@ snapshots: webidl-conversions@8.0.1: {} - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + webpack-dev-middleware@7.4.5(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: colorette: 2.0.20 - memfs: 4.57.2(tslib@2.8.1) + memfs: 4.78.1 mime-types: 3.0.2 on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.3 + range-parser: 1.3.0 + schema-utils: 4.5.0 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - transitivePeerDependencies: - - tslib + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) - webpack-dev-server@5.2.3(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.8 + '@types/express-serve-static-core': 4.19.9 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 - bonjour-service: 1.4.0 + bonjour-service: 1.4.4 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.8.1(supports-color@8.1.1) + compression: 1.8.2(supports-color@8.1.1) connect-history-api-fallback: 2.0.0 - express: 4.22.2(supports-color@8.1.1) + express: 4.22.3(supports-color@8.1.1) graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1)) - ipaddr.js: 2.4.0 - launch-editor: 2.13.2 + http-proxy-middleware: 2.0.10(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1)) + ipaddr.js: 2.5.0 + launch-editor: 2.14.1 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.3 + schema-utils: 4.5.0 selfsigned: 5.5.0 serve-index: 1.9.2(supports-color@8.1.1) sockjs: 0.3.24 spdy: 4.0.2(supports-color@8.1.1) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - ws: 8.21.0 + webpack-dev-middleware: 7.4.5(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + ws: 8.21.3 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) transitivePeerDependencies: - bufferutil - debug - supports-color - - tslib - utf-8-validate webpack-merge@6.0.1: @@ -31857,16 +31603,16 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.5.0: {} + webpack-sources@3.5.1: {} - webpack-subresource-integrity@5.1.0(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + webpack-subresource-integrity@5.1.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)): dependencies: typed-assert: 1.0.9 - webpack: 5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23) webpack-virtual-modules@0.6.2: {} - webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12): + webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -31876,9 +31622,9 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.18.0 acorn-import-phases: 1.0.4(acorn@8.18.0) - browserslist: 4.28.2 + browserslist: 4.29.0 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.22.0 + enhanced-resolve: 5.25.1 es-module-lexer: 2.3.2 eslint-scope: 5.1.1 events: 3.3.0 @@ -31888,11 +31634,11 @@ snapshots: loader-runner: 4.3.2 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.3 + schema-utils: 4.5.0 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - watchpack: 2.5.1 - webpack-sources: 3.5.0 + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' @@ -31907,7 +31653,7 @@ snapshots: - postcss - uglify-js - webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15): + webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -31917,9 +31663,9 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.18.0 acorn-import-phases: 1.0.4(acorn@8.18.0) - browserslist: 4.28.2 + browserslist: 4.29.0 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.22.0 + enhanced-resolve: 5.25.1 es-module-lexer: 2.3.2 eslint-scope: 5.1.1 events: 3.3.0 @@ -31929,11 +31675,11 @@ snapshots: loader-runner: 4.3.2 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.3 + schema-utils: 4.5.0 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.105.2(@swc/core@1.15.40)(esbuild@0.28.2)(lightningcss@1.32.0)(postcss@8.5.15)) - watchpack: 2.5.1 - webpack-sources: 3.5.0 + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' @@ -31949,7 +31695,7 @@ snapshots: - uglify-js optional: true - websocket-driver@0.7.4: + websocket-driver@0.7.5: dependencies: http-parser-js: 0.5.10 safe-buffer: 5.2.1 @@ -31994,7 +31740,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -32005,7 +31751,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 which-collection@1.0.2: dependencies: @@ -32014,7 +31760,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.24: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -32082,13 +31828,13 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@6.2.4: + ws@6.2.6: dependencies: async-limiter: 1.0.1 - ws@7.5.11: {} + ws@7.5.13: {} - ws@8.21.0: {} + ws@8.21.3: {} wsl-utils@0.1.0: dependencies: @@ -32108,7 +31854,7 @@ snapshots: xml2js@0.6.0: dependencies: - sax: 1.6.0 + sax: 1.6.1 xmlbuilder: 11.0.1 xmlbuilder2@4.0.3: @@ -32116,7 +31862,7 @@ snapshots: '@oozcitak/dom': 2.0.2 '@oozcitak/infra': 2.0.2 '@oozcitak/util': 10.0.0 - js-yaml: 4.1.1 + js-yaml: 4.3.2 xmlbuilder@11.0.1: {} @@ -32154,6 +31900,16 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yargs@18.0.0: dependencies: cliui: 9.0.1 @@ -32163,15 +31919,24 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yargs@18.2.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.2: {} + yoctocolors@2.2.0: {} - zimmerframe@1.1.4: {} + zimmerframe@1.1.5: {} zod-to-json-schema@3.25.2(zod@4.3.6): dependencies: @@ -32185,7 +31950,7 @@ snapshots: zod@4.3.6: {} - zod@4.4.3: {} + zod@4.6.5: {} zone.js@0.15.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7e4ac11cf..2ddfad09b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,6 +13,7 @@ trustPolicyExclude: - 'react-native-worklets@0.5.1' # Expo 56 fixes this but is too new; upgrade in a few days - 'eslint-import-resolver-typescript@3.10.1' # Same as above - '@tsrx/prettier-plugin@0.4.7' # Required for TSRX fixes I needed to make upstream + - 'knip@6.37.0' # Required for TSRX usage # Too young to use currently, upgrade in a few days overrides: { 'tinyexec': '1.1.2' } From 1c001cd3869700b15547efc1fbb9ec1f7b06c249 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 21 Sep 2026 18:29:23 -0700 Subject: [PATCH 16/19] chore: fix types of Vitest/Vite --- packages/octane-form/vitest.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/octane-form/vitest.config.ts b/packages/octane-form/vitest.config.ts index 00de88421..9978f6b69 100644 --- a/packages/octane-form/vitest.config.ts +++ b/packages/octane-form/vitest.config.ts @@ -21,7 +21,7 @@ export default defineConfig({ }, projects: [ { - plugins: [octane({ ssr: false, hmr: false })], + plugins: [octane({ ssr: false, hmr: false }) as never], resolve: { alias }, test: { name: packageJson.name, @@ -36,7 +36,7 @@ export default defineConfig({ }, }, { - plugins: [octane({ ssr: true, hmr: false })], + plugins: [octane({ ssr: true, hmr: false }) as never], resolve: { alias: [ { From 289b78bd703794fd9743a738ee4107b3e59d049c Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 21 Sep 2026 18:33:53 -0700 Subject: [PATCH 17/19] chore: fix test:lib --- packages/octane-form/tests/useField.test.tsrx | 4 ++-- packages/octane-form/tests/useForm.test.tsrx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/octane-form/tests/useField.test.tsrx b/packages/octane-form/tests/useField.test.tsrx index b07517436..240dc4770 100644 --- a/packages/octane-form/tests/useField.test.tsrx +++ b/packages/octane-form/tests/useField.test.tsrx @@ -640,7 +640,7 @@ describe('useField', () => { onClick={() => field.removeValue(i)} type="button" > - Remove person + Remove person{' '} {i} @@ -730,7 +730,7 @@ describe('useField', () => { onClick={() => field.removeValue(i)} type="button" > - Remove person + Remove person{' '} {i} diff --git a/packages/octane-form/tests/useForm.test.tsrx b/packages/octane-form/tests/useForm.test.tsrx index 627928a37..110697d46 100644 --- a/packages/octane-form/tests/useForm.test.tsrx +++ b/packages/octane-form/tests/useForm.test.tsrx @@ -1008,7 +1008,7 @@ describe('useForm', () => { name="test" children={(field) =>

{field.state.value} - + {' '} {renders}

} /> From fdca4c438f6c63e5c6ba8a5ae050726f5475e8e6 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 21 Sep 2026 18:44:44 -0700 Subject: [PATCH 18/19] chore: fix test --- .../next-server-actions-zod/package.json | 2 +- .../react/next-server-actions/package.json | 2 +- examples/react/remix/package.json | 2 +- examples/react/tanstack-start/package.json | 2 +- package.json | 3 - packages/form-core/package.json | 2 +- packages/react-form-nextjs/package.json | 2 + packages/react-form-remix/package.json | 2 + packages/react-form-start/package.json | 1 + packages/react-form/package.json | 3 +- packages/solid-form/package.json | 3 +- packages/vue-form/package.json | 3 +- pnpm-lock.yaml | 410 +++++++++--------- 13 files changed, 210 insertions(+), 227 deletions(-) diff --git a/examples/react/next-server-actions-zod/package.json b/examples/react/next-server-actions-zod/package.json index 95d79d374..e95c3234a 100644 --- a/examples/react/next-server-actions-zod/package.json +++ b/examples/react/next-server-actions-zod/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@tanstack/react-form-nextjs": "^1.33.5", - "@tanstack/react-store": "^0.11.0", + "@tanstack/react-store": "^0.11.1", "next": "16.2.6", "react": "19.1.0", "react-dom": "19.1.0", diff --git a/examples/react/next-server-actions/package.json b/examples/react/next-server-actions/package.json index 5a064c62c..a14d351ba 100644 --- a/examples/react/next-server-actions/package.json +++ b/examples/react/next-server-actions/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@tanstack/react-form-nextjs": "^1.33.5", - "@tanstack/react-store": "^0.11.0", + "@tanstack/react-store": "^0.11.1", "next": "16.2.6", "react": "19.1.0", "react-dom": "19.1.0" diff --git a/examples/react/remix/package.json b/examples/react/remix/package.json index 1e2167d93..7c6bdafe9 100644 --- a/examples/react/remix/package.json +++ b/examples/react/remix/package.json @@ -12,7 +12,7 @@ "@remix-run/react": "^2.17.4", "@remix-run/serve": "^2.17.4", "@tanstack/react-form-remix": "^1.33.5", - "@tanstack/react-store": "^0.11.0", + "@tanstack/react-store": "^0.11.1", "isbot": "^5.1.30", "react": "19.1.0", "react-dom": "19.1.0" diff --git a/examples/react/tanstack-start/package.json b/examples/react/tanstack-start/package.json index 64068a5aa..72aef4d4f 100644 --- a/examples/react/tanstack-start/package.json +++ b/examples/react/tanstack-start/package.json @@ -12,7 +12,7 @@ "@tanstack/react-form-start": "^1.33.5", "@tanstack/react-router": "^1.134.9", "@tanstack/react-start": "^1.168.27", - "@tanstack/react-store": "^0.11.0", + "@tanstack/react-store": "^0.11.1", "react": "19.1.0", "react-dom": "19.1.0" }, diff --git a/package.json b/package.json index 63ad1011c..052d5b396 100644 --- a/package.json +++ b/package.json @@ -44,14 +44,11 @@ "@changesets/changelog-github": "^1.0.1", "@changesets/cli": "^3.0.3", "@eslint-react/eslint-plugin": "^1.53.1", - "@solidjs/testing-library": "^0.8.10", "@tanstack/eslint-config": "0.3.2", "@tanstack/typedoc-config": "0.3.1", "@tanstack/vite-config": "0.4.1", "@testing-library/jest-dom": "^6.8.0", - "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@testing-library/vue": "^8.1.0", "@tsrx/prettier-plugin": "0.4.7", "@types/node": "^24.1.0", "@vitest/coverage-istanbul": "^3.2.4", diff --git a/packages/form-core/package.json b/packages/form-core/package.json index cc59a8f43..d8def91b5 100644 --- a/packages/form-core/package.json +++ b/packages/form-core/package.json @@ -54,7 +54,7 @@ "dependencies": { "@tanstack/devtools-event-client": "^0.4.1", "@tanstack/pacer-lite": "^0.1.1", - "@tanstack/store": "^0.11.0" + "@tanstack/store": "^0.11.1" }, "devDependencies": { "arktype": "^2.1.22", diff --git a/packages/react-form-nextjs/package.json b/packages/react-form-nextjs/package.json index 6a0fa4ed2..7c8529ac5 100644 --- a/packages/react-form-nextjs/package.json +++ b/packages/react-form-nextjs/package.json @@ -51,10 +51,12 @@ "decode-formdata": "^0.9.0" }, "devDependencies": { + "@testing-library/react": "^16.3.0", "@types/react": "~19.2.0", "@vitejs/plugin-react": "^5.1.1", "eslint-plugin-react-compiler": "19.1.0-rc.2", "react": "19.1.0", + "react-dom": "19.1.0", "vite": "^7.2.2" }, "peerDependencies": { diff --git a/packages/react-form-remix/package.json b/packages/react-form-remix/package.json index e4b87a311..7495b5cd1 100644 --- a/packages/react-form-remix/package.json +++ b/packages/react-form-remix/package.json @@ -51,10 +51,12 @@ "decode-formdata": "^0.9.0" }, "devDependencies": { + "@testing-library/react": "^16.3.0", "@types/react": "~19.2.0", "@vitejs/plugin-react": "^5.1.1", "eslint-plugin-react-compiler": "19.1.0-rc.2", "react": "19.1.0", + "react-dom": "19.1.0", "vite": "^7.2.2" }, "peerDependencies": { diff --git a/packages/react-form-start/package.json b/packages/react-form-start/package.json index 2040d5e23..61df2d9b6 100644 --- a/packages/react-form-start/package.json +++ b/packages/react-form-start/package.json @@ -53,6 +53,7 @@ }, "devDependencies": { "@tanstack/react-start": "^1.168.27", + "@testing-library/react": "^16.3.0", "@types/react": "~19.2.0", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^5.1.1", diff --git a/packages/react-form/package.json b/packages/react-form/package.json index 872693cf5..cd5dddb3c 100644 --- a/packages/react-form/package.json +++ b/packages/react-form/package.json @@ -53,9 +53,10 @@ ], "dependencies": { "@tanstack/form-core": "workspace:*", - "@tanstack/react-store": "^0.11.0" + "@tanstack/react-store": "^0.11.1" }, "devDependencies": { + "@testing-library/react": "^16.3.0", "@types/react": "~19.2.0", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^5.1.1", diff --git a/packages/solid-form/package.json b/packages/solid-form/package.json index 17b5f45de..debba863f 100644 --- a/packages/solid-form/package.json +++ b/packages/solid-form/package.json @@ -57,9 +57,10 @@ ], "dependencies": { "@tanstack/form-core": "workspace:*", - "@tanstack/solid-store": "^0.11.0" + "@tanstack/solid-store": "^0.11.1" }, "devDependencies": { + "@solidjs/testing-library": "^0.8.10", "solid-js": "^1.9.9", "vite": "^7.2.2", "vite-plugin-solid": "^2.11.8" diff --git a/packages/vue-form/package.json b/packages/vue-form/package.json index 09ec35547..2c697ab06 100644 --- a/packages/vue-form/package.json +++ b/packages/vue-form/package.json @@ -54,9 +54,10 @@ ], "dependencies": { "@tanstack/form-core": "workspace:*", - "@tanstack/vue-store": "^0.11.0" + "@tanstack/vue-store": "^0.11.1" }, "devDependencies": { + "@testing-library/vue": "^8.1.0", "@vitejs/plugin-vue": "^5.2.4", "vite": "^7.2.2", "vue": "^3.5.13" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cae0303c2..fa3b46b2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,9 +178,6 @@ importers: '@eslint-react/eslint-plugin': specifier: ^1.53.1 version: 1.53.1(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(ts-api-utils@2.5.0(typescript@5.9.3))(typescript@5.9.3) - '@solidjs/testing-library': - specifier: ^0.8.10 - version: 0.8.10(solid-js@1.9.15) '@tanstack/eslint-config': specifier: 0.3.2 version: 0.3.2(@typescript-eslint/utils@8.70.0(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) @@ -193,15 +190,9 @@ importers: '@testing-library/jest-dom': specifier: ^6.8.0 version: 6.10.0(@testing-library/dom@10.4.2) - '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.7(@testing-library/dom@10.4.2) - '@testing-library/vue': - specifier: ^8.1.0 - version: 8.1.0(@vue/compiler-dom@3.5.43)(@vue/compiler-sfc@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3)) '@tsrx/prettier-plugin': specifier: 0.4.7 version: 0.4.7(@typescript-eslint/types@8.70.0)(prettier@3.9.8) @@ -660,10 +651,10 @@ importers: devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/preact/simple: dependencies: @@ -676,10 +667,10 @@ importers: devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/array: dependencies: @@ -707,10 +698,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/compiler: dependencies: @@ -732,7 +723,7 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -741,7 +732,7 @@ importers: version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/composition: dependencies: @@ -769,10 +760,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/devtools: dependencies: @@ -800,10 +791,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/dynamic: dependencies: @@ -831,10 +822,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -971,10 +962,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/large-form: dependencies: @@ -1002,10 +993,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/multi-step-wizard: dependencies: @@ -1036,10 +1027,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/next-server-actions: dependencies: @@ -1047,7 +1038,7 @@ importers: specifier: ^1.33.5 version: link:../../../packages/react-form-nextjs '@tanstack/react-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: 16.2.6 @@ -1078,7 +1069,7 @@ importers: specifier: ^1.33.5 version: link:../../../packages/react-form-nextjs '@tanstack/react-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: 16.2.6 @@ -1135,10 +1126,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/remix: dependencies: @@ -1155,7 +1146,7 @@ importers: specifier: ^1.33.5 version: link:../../../packages/react-form-remix '@tanstack/react-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) isbot: specifier: ^5.1.30 @@ -1212,10 +1203,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/standard-schema: dependencies: @@ -1255,10 +1246,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/react/tanstack-start: dependencies: @@ -1270,9 +1261,9 @@ importers: version: 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/react-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: 19.1.0 @@ -1298,13 +1289,13 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(supports-color@8.1.1)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)) @@ -1362,16 +1353,16 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)) '@vitejs/plugin-react-swc': specifier: ^3.11.0 - version: 3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1)) typescript: specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) examples/solid/array: dependencies: @@ -1387,10 +1378,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/devtools: dependencies: @@ -1412,10 +1403,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/large-form: dependencies: @@ -1431,10 +1422,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/multi-step-wizard: dependencies: @@ -1453,10 +1444,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/simple: dependencies: @@ -1472,10 +1463,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/solid/standard-schema: dependencies: @@ -1509,10 +1500,10 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) examples/svelte/array: dependencies: @@ -1544,7 +1535,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 @@ -1556,7 +1547,7 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/multi-step-wizard: dependencies: @@ -1591,7 +1582,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 @@ -1603,7 +1594,7 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/svelte/standard-schema: dependencies: @@ -1625,7 +1616,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.8 @@ -1637,7 +1628,7 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) examples/vue/array: dependencies: @@ -1762,10 +1753,10 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^2.6.2 - version: 2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.7.2(@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b))(@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@analogjs/vitest-angular': specifier: ^2.6.2 - version: 2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1) + version: 2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b))(@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1) '@angular/common': specifier: ^21.2.14 version: 21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -1809,7 +1800,7 @@ importers: specifier: ^0.1.1 version: 0.1.1 '@tanstack/store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1 devDependencies: arktype: @@ -1854,10 +1845,10 @@ importers: version: 0.21.10(oxc-resolver@11.24.2)(publint@0.3.24)(typescript@5.9.3) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/lit-form: dependencies: @@ -1926,7 +1917,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@testing-library/preact': specifier: ^3.2.4 version: 3.2.4(preact@10.29.8) @@ -1935,7 +1926,7 @@ importers: version: 10.29.8 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form: dependencies: @@ -1943,9 +1934,12 @@ importers: specifier: workspace:* version: link:../form-core '@tanstack/react-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) devDependencies: + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': specifier: ~19.2.0 version: 19.2.18 @@ -1954,10 +1948,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 @@ -1966,7 +1960,7 @@ importers: version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-devtools: dependencies: @@ -1982,16 +1976,16 @@ importers: version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-nextjs: dependencies: @@ -2002,21 +1996,27 @@ importers: specifier: ^0.9.0 version: 0.9.0 devDependencies: + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': specifier: ~19.2.0 version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-remix: dependencies: @@ -2027,21 +2027,27 @@ importers: specifier: ^0.9.0 version: 0.9.0 devDependencies: + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': specifier: ~19.2.0 version: 19.2.18 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/react-form-start: dependencies: @@ -2057,7 +2063,10 @@ importers: devDependencies: '@tanstack/react-start': specifier: ^1.168.27 - version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + version: 1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': specifier: ~19.2.0 version: 19.2.18 @@ -2066,10 +2075,10 @@ importers: version: 19.3.0(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) react: specifier: 19.1.0 version: 19.1.0 @@ -2078,7 +2087,7 @@ importers: version: 19.1.0(react@19.1.0) vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) packages/solid-form: dependencies: @@ -2086,18 +2095,21 @@ importers: specifier: workspace:* version: link:../form-core '@tanstack/solid-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(solid-js@1.9.15) devDependencies: + '@solidjs/testing-library': + specifier: ^0.8.10 + version: 0.8.10(solid-js@1.9.15) solid-js: specifier: ^1.9.9 version: 1.9.15 vite: specifier: ^7.2.2 - version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + version: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/solid-form-devtools: dependencies: @@ -2113,7 +2125,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) packages/svelte-form: dependencies: @@ -2129,10 +2141,10 @@ importers: version: 2.5.8(svelte@5.57.1(@typescript-eslint/types@8.70.0))(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + version: 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@testing-library/svelte': specifier: ^5.2.8 - version: 5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1)) + version: 5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1)) svelte: specifier: ^5.39.4 version: 5.57.1(@typescript-eslint/types@8.70.0) @@ -2146,9 +2158,12 @@ importers: specifier: workspace:* version: link:../form-core '@tanstack/vue-store': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(vue@3.5.43(typescript@5.9.3)) devDependencies: + '@testing-library/vue': + specifier: ^8.1.0 + version: 8.1.0(@vue/compiler-dom@3.5.43)(@vue/compiler-sfc@3.5.43)(@vue/server-renderer@3.5.43)(vue@3.5.43(typescript@5.9.3)) '@vitejs/plugin-vue': specifier: ^5.2.4 version: 5.2.4(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vue@3.5.43(typescript@5.9.3)) @@ -15383,26 +15398,26 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b))(@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: magic-string: 0.30.21 obug: 2.2.1 oxc-parser: 0.121.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) tinyglobby: 0.2.17 optionalDependencies: - '@angular-devkit/build-angular': 21.2.24(0d9bbff8c972d2704ece981740980061) - '@angular/build': 21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37) + '@angular-devkit/build-angular': 21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b) + '@angular/build': 21.2.24(4581913d0c7b8c3c22911f228bda569a) vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@analogjs/vitest-angular@2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1)': + '@analogjs/vitest-angular@2.7.2(@analogjs/vite-plugin-angular@2.7.2(@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b))(@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(@angular-devkit/architect@0.2102.24(chokidar@5.0.0))(@angular-devkit/schematics@21.2.24(chokidar@5.0.0))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))(zone.js@0.15.1)': dependencies: - '@analogjs/vite-plugin-angular': 2.7.2(@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061))(@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@analogjs/vite-plugin-angular': 2.7.2(@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b))(@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a))(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.24(chokidar@5.0.0) - vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) optionalDependencies: zone.js: 0.15.1 @@ -15413,13 +15428,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.2.24(0d9bbff8c972d2704ece981740980061)': + '@angular-devkit/build-angular@21.2.24(6337ba4fee33a534f2aa2c2a6189ee8b)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.24(chokidar@5.0.0)(webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)) '@angular-devkit/core': 21.2.24(chokidar@5.0.0) - '@angular/build': 21.2.24(9bc4a77d2197aad76d7942a6bc8ab388) + '@angular/build': 21.2.24(072d6511f22d80f64f6b281e2dda10ba) '@angular/compiler-cli': 21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3) '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -15734,7 +15749,7 @@ snapshots: '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@21.2.24(4646e2dc5e7b79d9d4fe4948c2c4df37)': + '@angular/build@21.2.24(072d6511f22d80f64f6b281e2dda10ba)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) @@ -15765,16 +15780,16 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.29.1 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.46.0)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.9.1(supports-color@8.1.1) + less: 4.9.0(supports-color@8.1.1) lmdb: 3.5.1 ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.28 - vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + postcss: 8.5.23 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -15791,7 +15806,7 @@ snapshots: - yaml optional: true - '@angular/build@21.2.24(9bc4a77d2197aad76d7942a6bc8ab388)': + '@angular/build@21.2.24(4581913d0c7b8c3c22911f228bda569a)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.24(chokidar@5.0.0) @@ -15822,16 +15837,16 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.29.1 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.0(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.46.0)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/platform-browser': 21.2.23(@angular/animations@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.2.23(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.23(@angular/compiler@21.2.23)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.9.0(supports-color@8.1.1) + less: 4.9.1(supports-color@8.1.1) lmdb: 3.5.1 ng-packagr: 21.2.7(@angular/compiler-cli@21.2.23(@angular/compiler@21.2.23)(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.23 - vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + postcss: 8.5.28 + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16467,14 +16482,6 @@ snapshots: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) - '@babel/helper-plugin-utils': 7.29.7 - transitivePeerDependencies: - - supports-color - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -17201,11 +17208,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -20309,19 +20326,19 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@8.1.1))(preact@10.29.8)(rollup@4.63.4)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - '@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@rollup/pluginutils': 5.4.0(rollup@4.63.4) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7(supports-color@8.1.1)) debug: 4.4.3(supports-color@8.1.1) magic-string: 0.30.21 picocolors: 1.1.1 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-prerender-plugin: 0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-prerender-plugin: 0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) zimmerframe: 1.1.5 transitivePeerDependencies: - preact @@ -20338,7 +20355,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@prefresh/babel-plugin': 0.5.4(@babel/core@7.29.7(supports-color@8.1.1)) @@ -20346,7 +20363,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.8 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -21305,12 +21322,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@sveltejs/vite-plugin-svelte': 5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) debug: 4.4.3(supports-color@8.1.1) svelte: 5.57.1(@typescript-eslint/types@8.70.0) - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -21327,16 +21344,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(supports-color@8.1.1)(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) debug: 4.4.3(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 svelte: 5.57.1(@typescript-eslint/types@8.70.0) - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) transitivePeerDependencies: - supports-color @@ -21538,14 +21555,14 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/react-start-rsc@0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': + '@tanstack/react-start-rsc@0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/router-core': 1.171.32 '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) '@tanstack/start-client-core': 1.170.32 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/start-storage-context': 1.167.34 pathe: 2.0.3 react: 19.1.0 @@ -21574,21 +21591,21 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': + '@tanstack/react-start@1.168.56(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-start-client': 1.168.36(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/react-start-rsc': 0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/react-start-rsc': 0.1.55(esbuild@0.28.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/react-start-server': 1.167.43(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) '@tanstack/start-client-core': 1.170.32 - '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/start-plugin-core': 1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/start-server-core': 1.169.37 pathe: 2.0.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -21630,7 +21647,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': + '@tanstack/router-plugin@1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/template': 7.29.7 @@ -21639,12 +21656,12 @@ snapshots: '@tanstack/router-generator': 1.167.38(supports-color@8.1.1) '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) chokidar: 5.0.0 - unplugin: 3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + unplugin: 3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) zod: 4.6.5 optionalDependencies: '@tanstack/react-router': 1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-plugin-solid: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite-plugin-solid: 2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28) transitivePeerDependencies: - '@farmfe/core' @@ -21692,7 +21709,7 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': + '@tanstack/start-plugin-core@1.171.46(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28))': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@8.1.1) @@ -21700,7 +21717,7 @@ snapshots: '@jridgewell/remapping': 2.3.5 '@tanstack/router-core': 1.171.32 '@tanstack/router-generator': 1.167.38(supports-color@8.1.1) - '@tanstack/router-plugin': 1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) + '@tanstack/router-plugin': 1.168.40(@tanstack/react-router@1.170.38(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(esbuild@0.28.2)(rollup@4.63.4)(supports-color@8.1.1)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)) '@tanstack/router-utils': 1.162.3(supports-color@8.1.1) '@tanstack/start-server-core': 1.169.37 exsolve: 1.1.1 @@ -21712,11 +21729,11 @@ snapshots: srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) xmlbuilder2: 4.0.3 zod: 4.6.5 optionalDependencies: - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -21856,14 +21873,14 @@ snapshots: dependencies: svelte: 5.57.1(@typescript-eslint/types@8.70.0) - '@testing-library/svelte@5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))': + '@testing-library/svelte@5.4.2(svelte@5.57.1(@typescript-eslint/types@8.70.0))(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@testing-library/dom': 10.4.2 '@testing-library/svelte-core': 1.1.3(svelte@5.57.1(@typescript-eslint/types@8.70.0)) svelte: 5.57.1(@typescript-eslint/types@8.70.0) optionalDependencies: vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.2)': dependencies: @@ -22517,15 +22534,15 @@ snapshots: vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) optional: true - '@vitejs/plugin-react-swc@3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@vitejs/plugin-react-swc@3.11.0(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 '@swc/core': 1.16.2 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': + '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) @@ -22533,7 +22550,19 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -24723,18 +24752,6 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@8.1.1): - dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/parser': 7.29.9 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@8.1.1) - eslint: 9.36.0(jiti@2.7.0)(supports-color@7.2.0) - hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 3.5.4(zod@3.25.76) - transitivePeerDependencies: - - supports-color - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) @@ -30885,7 +30902,7 @@ snapshots: unpipe@1.0.0: {} - unplugin@3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)): + unplugin@3.4.0(esbuild@0.28.2)(rollup@4.63.4)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 @@ -30893,7 +30910,7 @@ snapshots: optionalDependencies: esbuild: 0.28.2 rollup: 4.63.4 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28) unrs-resolver@1.12.2: @@ -31144,7 +31161,7 @@ snapshots: dependencies: vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): + vite-plugin-solid@2.11.14(@testing-library/jest-dom@6.10.0(@testing-library/dom@10.4.2))(solid-js@1.9.15)(supports-color@8.1.1)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@types/babel__core': 7.20.5 @@ -31152,14 +31169,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.15 solid-refresh: 0.6.3(solid-js@1.9.15)(supports-color@8.1.1) - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) optionalDependencies: '@testing-library/jest-dom': 6.10.0(@testing-library/dom@10.4.2) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): + vite-prerender-plugin@0.5.13(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -31167,7 +31184,7 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) vite-tsconfig-paths@5.1.4(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): dependencies: @@ -31335,6 +31352,10 @@ snapshots: optionalDependencies: vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitefu@1.1.3(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)): + optionalDependencies: + vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) + vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@7.2.0)(terser@5.51.2)(yaml@2.9.1): dependencies: '@types/chai': 5.2.3 @@ -31378,54 +31399,11 @@ snapshots: - tsx - yaml - vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) - '@vitest/pretty-format': 3.2.7 - '@vitest/runner': 3.2.7 - '@vitest/snapshot': 3.2.7 - '@vitest/spy': 3.2.7 - '@vitest/utils': 3.2.7 - chai: 5.3.3 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.4.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.7 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 1.1.2 - tinyglobby: 0.2.17 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1) - vite-node: 3.2.4(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.13 - '@types/node': 24.13.6 - jsdom: 27.4.0(@noble/hashes@2.4.0)(supports-color@7.2.0) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.6)(jiti@2.7.0)(jsdom@27.4.0(@noble/hashes@2.4.0)(supports-color@8.1.1))(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(supports-color@8.1.1)(terser@5.51.2)(yaml@2.9.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@7.2.0))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.6)(jiti@2.7.0)(less@4.9.1(supports-color@8.1.1))(lightningcss@1.33.0)(sass@1.104.1)(sugarss@5.0.1(postcss@8.5.28))(terser@5.51.2)(yaml@2.9.1)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.7 '@vitest/snapshot': 3.2.7 From 9c132f4556a6a38cdb196bc70d92c769f2697263 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2026 05:40:18 +0000 Subject: [PATCH 19/19] ci: apply automated fixes and generate docs --- README.md | 3 +- docs/framework/lit/guides/form-composition.md | 12 +- docs/framework/lit/guides/form-groups.md | 110 +++---- docs/framework/lit/guides/validation.md | 116 ++++---- .../preact/guides/form-composition.md | 4 +- .../react/guides/form-composition.md | 4 +- docs/framework/solid/guides/validation.md | 4 +- docs/overview.md | 28 +- .../large-form/src/components/text-field.ts | 18 +- .../src/components/text-field.ts | 28 +- .../src/features/wizard/page.ts | 32 ++- examples/lit/simple/src/index.ts | 28 +- examples/lit/standard-schema/src/index.ts | 64 +++-- examples/lit/ui-libraries/src/index.ts | 74 ++--- knip.json | 7 +- packages/angular-form/src/app-field.ts | 12 +- packages/angular-form/src/tanstack-field.ts | 12 +- .../angular-form/src/tanstack-form-group.ts | 21 +- packages/form-core/src/FieldApi.ts | 117 +++----- packages/form-core/src/FormApi.ts | 19 +- packages/form-core/src/FormGroupApi.ts | 268 ++++++------------ .../form-core/src/standardSchemaValidator.ts | 6 +- packages/form-core/src/types.ts | 38 +-- packages/form-core/src/utils.ts | 3 +- packages/form-core/tests/util-types.test-d.ts | 6 +- .../lit-form/src/tanstack-form-controller.ts | 138 +++------ packages/lit-form/tests/group.test.ts | 3 +- packages/lit-form/tests/simple.test.ts | 56 ++-- .../octane-form/src/createFormHook.tsrx.d.ts | 8 +- packages/octane-form/src/types.ts | 24 +- packages/octane-form/src/useField.tsrx.d.ts | 96 +++---- .../octane-form/src/useFormGroup.tsrx.d.ts | 138 +++------ packages/preact-form/src/types.ts | 24 +- packages/preact-form/src/useField.tsx | 96 +++---- packages/preact-form/src/useFormGroup.tsx | 138 +++------ packages/react-form-start/src/getFormData.tsx | 3 +- packages/react-form/src/createFormHook.tsx | 8 +- packages/react-form/src/types.ts | 24 +- packages/react-form/src/useField.tsx | 96 +++---- packages/react-form/src/useFormGroup.tsx | 138 +++------ packages/solid-form/src/createField.tsx | 96 +++---- packages/solid-form/src/createFormGroup.tsx | 138 +++------ packages/solid-form/src/types.ts | 24 +- packages/svelte-form/src/types.ts | 132 +++------ packages/vue-form/src/types.ts | 24 +- packages/vue-form/src/useField.tsx | 60 ++-- packages/vue-form/src/useFormGroup.tsx | 111 +++----- 47 files changed, 1001 insertions(+), 1608 deletions(-) diff --git a/README.md b/README.md index 12696d169..e8b928f2f 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,9 @@
- + ### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
# TanStack Form diff --git a/docs/framework/lit/guides/form-composition.md b/docs/framework/lit/guides/form-composition.md index e9157095a..f48da06f1 100644 --- a/docs/framework/lit/guides/form-composition.md +++ b/docs/framework/lit/guides/form-composition.md @@ -45,11 +45,13 @@ export class TextField extends LitElement { this.field.handleChange((e.target as HTMLInputElement).value)} /> - ${this.field.state.meta.isTouched && this.field.state.meta.errors.length - ? html`
- ${this.field.state.meta.errors.join(', ')} -
` - : ''} + ${ + this.field.state.meta.isTouched && this.field.state.meta.errors.length + ? html`
+ ${this.field.state.meta.errors.join(', ')} +
` + : '' + } ` } } diff --git a/docs/framework/lit/guides/form-groups.md b/docs/framework/lit/guides/form-groups.md index 1736602ff..dddf177fe 100644 --- a/docs/framework/lit/guides/form-groups.md +++ b/docs/framework/lit/guides/form-groups.md @@ -70,61 +70,65 @@ export class MyForm extends LitElement { render() { return html` - ${this.step === 0 - ? this.#form.group( - { - name: 'step1', - onGroupSubmit: () => { - // We can move the step forward when validation passes - this.step++ + ${ + this.step === 0 + ? this.#form.group( + { + name: 'step1', + onGroupSubmit: () => { + // We can move the step forward when validation passes + this.step++ + }, + onGroupSubmitInvalid: () => { + // Or handle invalid submissions, just like a top-level form + }, + onSubmitMeta: {} as SomeType, }, - onGroupSubmitInvalid: () => { - // Or handle invalid submissions, just like a top-level form + (group) => html` +
{ + e.preventDefault() + e.stopPropagation() + // Use `group.handleSubmit()` to submit the sub-form, but not the parent form + group.handleSubmit() + }} + > + ${this.#form.field( + { name: 'step1.name' }, + (field) => html``, + )} +
+ `, + ) + : nothing + } + ${ + this.step === 1 + ? this.#form.group( + { + name: 'step2', + onGroupSubmit: () => { + // Then, use `this.#form.api.handleSubmit()` to submit the entire form + this.#form.api.handleSubmit() + }, }, - onSubmitMeta: {} as SomeType, - }, - (group) => html` -
{ - e.preventDefault() - e.stopPropagation() - // Use `group.handleSubmit()` to submit the sub-form, but not the parent form - group.handleSubmit() - }} - > - ${this.#form.field( - { name: 'step1.name' }, - (field) => html``, - )} -
- `, - ) - : nothing} - ${this.step === 1 - ? this.#form.group( - { - name: 'step2', - onGroupSubmit: () => { - // Then, use `this.#form.api.handleSubmit()` to submit the entire form - this.#form.api.handleSubmit() - }, - }, - (group) => html` -
{ - e.preventDefault() - e.stopPropagation() - group.handleSubmit() - }} - > - ${this.#form.field( - { name: 'step2.age' }, - (field) => html``, - )} -
- `, - ) - : nothing} + (group) => html` +
{ + e.preventDefault() + e.stopPropagation() + group.handleSubmit() + }} + > + ${this.#form.field( + { name: 'step2.age' }, + (field) => html``, + )} +
+ `, + ) + : nothing + } ` } } diff --git a/docs/framework/lit/guides/validation.md b/docs/framework/lit/guides/validation.md index 4c8b693c4..359e98a04 100644 --- a/docs/framework/lit/guides/validation.md +++ b/docs/framework/lit/guides/validation.md @@ -38,9 +38,11 @@ import { html, nothing } from 'lit' field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } ` }, )}` @@ -72,9 +74,11 @@ import { html, nothing } from 'lit' field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } ` }, )}` @@ -107,9 +111,11 @@ import { html, nothing } from 'lit' field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } ` }, )}` @@ -134,9 +140,11 @@ import { html, nothing } from 'lit' (field) => { return html` - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(',')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(',')}` + : nothing + } ` }, )}` @@ -157,9 +165,11 @@ import { html, nothing } from 'lit' (field) => { return html` - ${field.state.meta.errorMap['onChange'] - ? html`${field.state.meta.errorMap['onChange']}` - : nothing} + ${ + field.state.meta.errorMap['onChange'] + ? html`${field.state.meta.errorMap['onChange']}` + : nothing + } ` }, )}` @@ -225,16 +235,18 @@ export class MyForm extends LitElement { return html`
- ${this.#form.api.state.errorMap.onChange - ? html` -
- There was an error on the form: - ${this.#form.api.state.errorMap.onChange} -
- ` - : nothing} + ${ + this.#form.api.state.errorMap.onChange + ? html` +
+ There was an error on the form: + ${this.#form.api.state.errorMap.onChange} +
+ ` + : nothing + }
` @@ -306,23 +318,27 @@ export class MyForm extends LitElement { field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } `, )} - ${this.#form.api.state.errorMap.onSubmit - ? html` -
- There was an error on the form: - ${this.#form.api.state.errorMap.onSubmit} -
- ` - : nothing} + ${ + this.#form.api.state.errorMap.onSubmit + ? html` +
+ There was an error on the form: + ${this.#form.api.state.errorMap.onSubmit} +
+ ` + : nothing + } @@ -400,9 +416,11 @@ import { html, nothing } from 'lit' field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } ` }, )}` @@ -438,9 +456,11 @@ import { html, nothing } from 'lit' field.handleChange(target.valueAsNumber) }}" /> - ${!field.state.meta.isValid - ? html`${field.state.meta.errors.join(', ')}` - : nothing} + ${ + !field.state.meta.isValid + ? html`${field.state.meta.errors.join(', ')}` + : nothing + } ` }, )}` @@ -613,9 +633,7 @@ You can access this flag via `this.#form.api.state` and use the value in order t ```ts class MyForm extends LitElement { - #form = new TanStackFormController(this, { - /* ... */ - }) + #form = new TanStackFormController(this, {/* ... */}) render() { return html` diff --git a/docs/framework/preact/guides/form-composition.md b/docs/framework/preact/guides/form-composition.md index 207863b6a..84efa7b10 100644 --- a/docs/framework/preact/guides/form-composition.md +++ b/docs/framework/preact/guides/form-composition.md @@ -282,9 +282,7 @@ Usage: ```tsx // sharedOpts.ts -const formOpts = formOptions({ - /* ... */ -}) +const formOpts = formOptions({/* ... */}) function ParentComponent() { const form = useAppForm({ ...formOptions /* ... */ }) diff --git a/docs/framework/react/guides/form-composition.md b/docs/framework/react/guides/form-composition.md index cf2db1cc1..ddaa63ce9 100644 --- a/docs/framework/react/guides/form-composition.md +++ b/docs/framework/react/guides/form-composition.md @@ -355,9 +355,7 @@ Usage: ```tsx // sharedOpts.ts -const formOpts = formOptions({ - /* ... */ -}) +const formOpts = formOptions({/* ... */}) function ParentComponent() { const form = useAppForm({ ...formOptions /* ... */ }) diff --git a/docs/framework/solid/guides/validation.md b/docs/framework/solid/guides/validation.md index c1ff12dbf..712d8afaf 100644 --- a/docs/framework/solid/guides/validation.md +++ b/docs/framework/solid/guides/validation.md @@ -543,9 +543,7 @@ The form state object has a `canSubmit` flag that is false when any field is inv You can subscribe to it via `form.Subscribe` and use the value in order to, for example, disable the submit button when the form is invalid (in practice, disabled buttons are not accessible, use `aria-disabled` instead). ```tsx -const form = createForm(() => ({ - /* ... */ -})) +const form = createForm(() => ({/* ... */})) return ( /* ... */ diff --git a/docs/overview.md b/docs/overview.md index 4ea563e01..e23f0fea9 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -779,18 +779,22 @@ export class TanStackFormDemo extends LitElement { field.handleChange(target.value) }}" /> - ${field.state.meta.isTouched && !field.state.meta.isValid - ? html`${repeat( - field.state.meta.errors, - (__, idx) => idx, - (error) => { - return html`
${error}
` - }, - )}` - : nothing} - ${field.state.meta.isValidating - ? html`

Validating...

` - : nothing} + ${ + field.state.meta.isTouched && !field.state.meta.isValid + ? html`${repeat( + field.state.meta.errors, + (__, idx) => idx, + (error) => { + return html`
${error}
` + }, + )}` + : nothing + } + ${ + field.state.meta.isValidating + ? html`

Validating...

` + : nothing + } ` }, )} diff --git a/examples/lit/large-form/src/components/text-field.ts b/examples/lit/large-form/src/components/text-field.ts index 27003af42..759c1a627 100644 --- a/examples/lit/large-form/src/components/text-field.ts +++ b/examples/lit/large-form/src/components/text-field.ts @@ -34,14 +34,16 @@ export class TextField extends LitElement { field.handleChange((e.target as HTMLInputElement).value)} /> - ${field.state.meta.isTouched && field.state.meta.errors.length - ? repeat( - field.state.meta.errors, - (_, idx) => idx, - (error: unknown) => - html`
${String(error)}
`, - ) - : nothing} + ${ + field.state.meta.isTouched && field.state.meta.errors.length + ? repeat( + field.state.meta.errors, + (_, idx) => idx, + (error: unknown) => + html`
${String(error)}
`, + ) + : nothing + } ${field.state.meta.isValidating ? html`

Validating...

` : nothing} ` diff --git a/examples/lit/multi-step-wizard/src/components/text-field.ts b/examples/lit/multi-step-wizard/src/components/text-field.ts index 190a06bcd..37fe65614 100644 --- a/examples/lit/multi-step-wizard/src/components/text-field.ts +++ b/examples/lit/multi-step-wizard/src/components/text-field.ts @@ -34,19 +34,21 @@ export class TextField extends LitElement { field.handleChange((e.target as HTMLInputElement).value)} /> - ${field.state.meta.isTouched && field.state.meta.errors.length - ? repeat( - field.state.meta.errors, - (_, idx) => idx, - (error: unknown) => { - const message = - error && typeof error === 'object' && 'message' in error - ? String((error as { message: unknown }).message) - : String(error) - return html`
${message}
` - }, - ) - : nothing} + ${ + field.state.meta.isTouched && field.state.meta.errors.length + ? repeat( + field.state.meta.errors, + (_, idx) => idx, + (error: unknown) => { + const message = + error && typeof error === 'object' && 'message' in error + ? String((error as { message: unknown }).message) + : String(error) + return html`
${message}
` + }, + ) + : nothing + } ${field.state.meta.isValidating ? html`

Validating...

` : nothing} ` diff --git a/examples/lit/multi-step-wizard/src/features/wizard/page.ts b/examples/lit/multi-step-wizard/src/features/wizard/page.ts index 2bd19029d..59c39ad59 100644 --- a/examples/lit/multi-step-wizard/src/features/wizard/page.ts +++ b/examples/lit/multi-step-wizard/src/features/wizard/page.ts @@ -40,20 +40,24 @@ export class WizardPage extends LitElement { render() { return html` - ${this.step === 0 - ? html`` - : nothing} - ${this.step === 1 - ? html`` - : nothing} + ${ + this.step === 0 + ? html`` + : nothing + } + ${ + this.step === 1 + ? html`` + : nothing + } ` } } diff --git a/examples/lit/simple/src/index.ts b/examples/lit/simple/src/index.ts index b81e8563a..a337814ac 100644 --- a/examples/lit/simple/src/index.ts +++ b/examples/lit/simple/src/index.ts @@ -59,18 +59,22 @@ export class TanStackFormDemo extends LitElement { field.handleChange(target.value) }}" /> - ${field.state.meta.isTouched && !field.state.meta.isValid - ? html`${repeat( - field.state.meta.errors, - (__, idx) => idx, - (error) => { - return html`
${error}
` - }, - )}` - : nothing} - ${field.state.meta.isValidating - ? html`

Validating...

` - : nothing} + ${ + field.state.meta.isTouched && !field.state.meta.isValid + ? html`${repeat( + field.state.meta.errors, + (__, idx) => idx, + (error) => { + return html`
${error}
` + }, + )}` + : nothing + } + ${ + field.state.meta.isValidating + ? html`

Validating...

` + : nothing + } ` }, )} diff --git a/examples/lit/standard-schema/src/index.ts b/examples/lit/standard-schema/src/index.ts index 160a027bb..d4082f9e0 100644 --- a/examples/lit/standard-schema/src/index.ts +++ b/examples/lit/standard-schema/src/index.ts @@ -97,20 +97,24 @@ export class TanStackFormDemo extends LitElement { field.handleChange(target.value) }}" /> - ${field.state.meta.isTouched && !field.state.meta.isValid - ? html`${repeat( - field.state.meta.errors, - (__, idx) => idx, - (error) => { - return html`
- ${error?.message} -
` - }, - )}` - : nothing} - ${field.state.meta.isValidating - ? html`

Validating...

` - : nothing} + ${ + field.state.meta.isTouched && !field.state.meta.isValid + ? html`${repeat( + field.state.meta.errors, + (__, idx) => idx, + (error) => { + return html`
+ ${error?.message} +
` + }, + )}` + : nothing + } + ${ + field.state.meta.isValidating + ? html`

Validating...

` + : nothing + } ` }, )} @@ -133,20 +137,24 @@ export class TanStackFormDemo extends LitElement { field.handleChange(target.value) }}" /> - ${field.state.meta.isTouched && !field.state.meta.isValid - ? html`${repeat( - field.state.meta.errors, - (__, idx) => idx, - (error) => { - return html`
- ${error?.message} -
` - }, - )}` - : nothing} - ${field.state.meta.isValidating - ? html`

Validating...

` - : nothing} + ${ + field.state.meta.isTouched && !field.state.meta.isValid + ? html`${repeat( + field.state.meta.errors, + (__, idx) => idx, + (error) => { + return html`
+ ${error?.message} +
` + }, + )}` + : nothing + } + ${ + field.state.meta.isValidating + ? html`

Validating...

` + : nothing + } ` }, )} diff --git a/examples/lit/ui-libraries/src/index.ts b/examples/lit/ui-libraries/src/index.ts index 6e1448765..c96247e3f 100644 --- a/examples/lit/ui-libraries/src/index.ts +++ b/examples/lit/ui-libraries/src/index.ts @@ -120,43 +120,47 @@ export class TanStackFormDemo extends LitElement { @blur="${() => employedField.handleBlur()}" > - ${employedField.state.value - ? this.#form.field( - { - name: `employees[${index}].jobTitle`, - defaultValue: '', - validators: { - onChange: ({ value }) => { - return value?.length === 0 - ? 'Needs to have a job here' - : null + ${ + employedField.state.value + ? this.#form.field( + { + name: `employees[${index}].jobTitle`, + defaultValue: '', + validators: { + onChange: ({ value }) => { + return value?.length === 0 + ? 'Needs to have a job here' + : null + }, }, }, - }, - (jobTitleField) => { - return html`
- - -
` - }, - ) - : ''} ` + (jobTitleField) => { + return html`
+ + +
` + }, + ) + : '' + } ` }, )} ` diff --git a/knip.json b/knip.json index cfbfbda36..3bd267bce 100755 --- a/knip.json +++ b/knip.json @@ -1,6 +1,11 @@ { "$schema": "https://unpkg.com/knip@6/schema.json", - "ignoreDependencies": ["@tanstack/devtools", "ts-node", "@vue/runtime-core", "@vue/reactivity"], + "ignoreDependencies": [ + "@tanstack/devtools", + "ts-node", + "@vue/runtime-core", + "@vue/reactivity" + ], "ignoreWorkspaces": ["examples/**"], "workspaces": { "packages/octane-form": { diff --git a/packages/angular-form/src/app-field.ts b/packages/angular-form/src/app-field.ts index 6e5897f2f..a41be3aa1 100644 --- a/packages/angular-form/src/app-field.ts +++ b/packages/angular-form/src/app-field.ts @@ -24,20 +24,16 @@ export class TanStackAppField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/angular-form/src/tanstack-field.ts b/packages/angular-form/src/tanstack-field.ts index e5ff98e96..346d5f67d 100644 --- a/packages/angular-form/src/tanstack-field.ts +++ b/packages/angular-form/src/tanstack-field.ts @@ -41,20 +41,16 @@ export class TanStackField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/angular-form/src/tanstack-form-group.ts b/packages/angular-form/src/tanstack-form-group.ts index 570612894..f51d307bd 100644 --- a/packages/angular-form/src/tanstack-form-group.ts +++ b/packages/angular-form/src/tanstack-form-group.ts @@ -37,27 +37,20 @@ export class TanStackFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/form-core/src/FieldApi.ts b/packages/form-core/src/FieldApi.ts index 80770f889..70df6a639 100644 --- a/packages/form-core/src/FieldApi.ts +++ b/packages/form-core/src/FieldApi.ts @@ -162,8 +162,7 @@ export type FieldValidateOrFn< TName extends DeepKeys, TData extends DeepValue = DeepValue, > = - | FieldValidateFn - | StandardSchemaV1 + FieldValidateFn | StandardSchemaV1 /** * @private @@ -183,20 +182,16 @@ export interface FieldValidators< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > { /** * An optional function, that runs on the mount event of input. @@ -286,20 +281,16 @@ interface FieldExtraOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > { /** * A list of validators to pass to the field @@ -335,20 +326,16 @@ export interface FieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldExtraOptions< @@ -385,49 +372,36 @@ export interface FieldApiOptions< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnChange extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > @@ -522,49 +496,36 @@ export class FieldApi< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnChange extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > implements FieldLikeAPI< diff --git a/packages/form-core/src/FormApi.ts b/packages/form-core/src/FormApi.ts index 4400017d3..e79c0e8a0 100644 --- a/packages/form-core/src/FormApi.ts +++ b/packages/form-core/src/FormApi.ts @@ -117,8 +117,7 @@ export type FormValidateFn = (props: { * @private */ export type FormValidateOrFn = - | FormValidateFn - | StandardSchemaV1 + FormValidateFn | StandardSchemaV1 export type UnwrapFormValidateOrFn< TValidateOrFn extends undefined | FormValidateOrFn, @@ -171,8 +170,7 @@ type ValidationPromiseResult = * @private */ export type FormAsyncValidateOrFn = - | FormValidateAsyncFn - | StandardSchemaV1 + FormValidateAsyncFn | StandardSchemaV1 export type UnwrapFormAsyncValidateOrFn< TValidateOrFn extends undefined | FormAsyncValidateOrFn, @@ -1120,8 +1118,7 @@ export class FormApi< ).state as never for (const errKey of Object.keys(baseStoreVal.errorMap)) { const errKeyMap = baseStoreVal.errorMap[errKey as never] as - | GlobalFormValidationError - | undefined + GlobalFormValidationError | undefined if ( errKeyMap === undefined || !isGlobalFormValidationError(errKeyMap) @@ -1302,8 +1299,7 @@ export class FormApi< // The group's own field-meta entry (its `errorMap` is where the // group's own validators write via `setFieldMeta`). const ownFieldMeta = currFieldMeta[groupName] as - | AnyFieldLikeMeta - | undefined + AnyFieldLikeMeta | undefined // Aggregate validity / interaction flags across descendant fields // (excluding the group's own self-entry — its validity is tracked @@ -2186,8 +2182,7 @@ export class FormApi< const promises: Promise>[] = [] let fieldErrorsFromFormValidators: - | Partial, ValidationError>> - | undefined + Partial, ValidationError>> | undefined for (const validateObj of validates) { if (!validateObj.validate) continue @@ -2204,9 +2199,7 @@ export class FormApi< promises.push( new Promise>(async (resolve) => { let rawError!: - | ValidationError - | FormValidationError - | undefined + ValidationError | FormValidationError | undefined try { rawError = await new Promise((rawResolve, rawReject) => { setTimeout(async () => { diff --git a/packages/form-core/src/FormGroupApi.ts b/packages/form-core/src/FormGroupApi.ts index 4790d5505..833d8fdd1 100644 --- a/packages/form-core/src/FormGroupApi.ts +++ b/packages/form-core/src/FormGroupApi.ts @@ -202,27 +202,20 @@ export interface FormGroupValidators< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, > { /** * An optional function, that runs on the mount event of input. @@ -310,50 +303,37 @@ interface FormGroupExtraOptions< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TSubmitMeta, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > { @@ -470,50 +450,37 @@ export interface FormGroupOptions< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TSubmitMeta, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > @@ -564,50 +531,37 @@ export interface FormGroupApiOptions< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TSubmitMeta, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > extends FormGroupOptions< @@ -751,49 +705,36 @@ export interface FormGroupMeta< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, > extends FieldLikeMeta< @@ -861,49 +802,36 @@ export interface FormGroupStoreState< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, > { /** * The current value of the form group. @@ -972,50 +900,37 @@ export class FormGroupApi< in out TName extends DeepKeys, in out TData extends DeepValue, in out TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, in out TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, in out TSubmitMeta, in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > @@ -1301,8 +1216,8 @@ export class FormGroupApi< const meta = (this.form.getFormGroupMeta(this.name as never) as - | AnyFormGroupMeta - | undefined) ?? getDefaultFormGroupMeta(opts.defaultMeta as never) + AnyFormGroupMeta | undefined) ?? + getDefaultFormGroupMeta(opts.defaultMeta as never) let value = this.form.getFieldValue(this.name) if ( @@ -1720,19 +1635,16 @@ export class FormGroupApi< ? fullName.slice((this.name as string).length) : fullName.slice((this.name as string).length + 1) const newFormValidatorError = fieldErrors?.[relativeName] as - | ValidationError - | undefined + ValidationError | undefined const fieldMeta = this.form.getFieldMeta(fullName as never) if (!fieldMeta && !newFormValidatorError) continue const previousErrorValue = fieldMeta?.errorMap[errorMapKey as never] as - | ValidationError - | undefined + ValidationError | undefined const isPreviousErrorFromFormValidator = (fieldMeta?.errorSourceMap[errorMapKey as never] as - | string - | undefined) === 'form' + string | undefined) === 'form' const { newErrorValue, newSource } = determineFormLevelErrorSourceAndValue({ diff --git a/packages/form-core/src/standardSchemaValidator.ts b/packages/form-core/src/standardSchemaValidator.ts index 764852856..daf39e2cd 100644 --- a/packages/form-core/src/standardSchemaValidator.ts +++ b/packages/form-core/src/standardSchemaValidator.ts @@ -151,8 +151,7 @@ interface StandardSchemaV1Props { * The result interface of the validate function. */ type StandardSchemaV1Result = - | StandardSchemaV1SuccessResult - | StandardSchemaV1FailureResult + StandardSchemaV1SuccessResult | StandardSchemaV1FailureResult /** * The result interface if validation succeeds. */ @@ -187,8 +186,7 @@ export interface StandardSchemaV1Issue { * The path of the issue, if any. */ readonly path?: - | ReadonlyArray - | undefined + ReadonlyArray | undefined } /** * The path segment interface of the issue. diff --git a/packages/form-core/src/types.ts b/packages/form-core/src/types.ts index b3c90a801..5cb50767a 100644 --- a/packages/form-core/src/types.ts +++ b/packages/form-core/src/types.ts @@ -41,12 +41,7 @@ export type ValidationSource = 'form' | 'field' * @private */ export type ValidationCause = - | 'change' - | 'blur' - | 'submit' - | 'mount' - | 'server' - | 'dynamic' + 'change' | 'blur' | 'submit' | 'mount' | 'server' | 'dynamic' /** * @private @@ -115,9 +110,7 @@ export type FormValidationErrorMap< | TOnChangeAsyncReturn | GlobalFormValidationError onBlur?: - | TOnBlurReturn - | TOnBlurAsyncReturn - | GlobalFormValidationError + TOnBlurReturn | TOnBlurAsyncReturn | GlobalFormValidationError onSubmit?: | TOnSubmitReturn | TOnSubmitAsyncReturn @@ -130,8 +123,7 @@ export type FormValidationErrorMap< } export type FormValidationError = - | ValidationError - | GlobalFormValidationError + ValidationError | GlobalFormValidationError /** * @private @@ -1061,20 +1053,16 @@ export interface FieldLikeApiOptions< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, > extends FieldLikeOptions< @@ -1153,20 +1141,16 @@ export interface FieldLikeAPI< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, TExtraOptions = {}, diff --git a/packages/form-core/src/utils.ts b/packages/form-core/src/utils.ts index e87296e41..807793a7e 100644 --- a/packages/form-core/src/utils.ts +++ b/packages/form-core/src/utils.ts @@ -14,8 +14,7 @@ import type { export type UpdaterFn = (input: TInput) => TOutput export type Updater = - | TOutput - | UpdaterFn + TOutput | UpdaterFn /** * @private diff --git a/packages/form-core/tests/util-types.test-d.ts b/packages/form-core/tests/util-types.test-d.ts index 2df6827e1..342ec8d29 100644 --- a/packages/form-core/tests/util-types.test-d.ts +++ b/packages/form-core/tests/util-types.test-d.ts @@ -133,8 +133,7 @@ expectTypeOf( * Properly handles discriminated unions like so: */ type DiscriminatedUnion = { name: string } & ( - | { variant: 'foo' } - | { variant: 'bar'; baz: boolean } + { variant: 'foo' } | { variant: 'bar'; baz: boolean } ) expectTypeOf(0 as never as DeepKeys).toEqualTypeOf< 'name' | 'variant' | 'baz' @@ -243,8 +242,7 @@ expectTypeOf(0 as never as NestedObjectUnionC).toEqualTypeOf() type NestedNullableObjectUnionCase = { nullable: - | { a?: number; b?: { c: boolean } | null } - | { b?: { c: string; e: number } } + { a?: number; b?: { c: boolean } | null } | { b?: { c: string; e: number } } } type NestedNullableObjectUnionA = DeepValue< NestedNullableObjectUnionCase, diff --git a/packages/lit-form/src/tanstack-form-controller.ts b/packages/lit-form/src/tanstack-form-controller.ts index 7ce3a0a19..c5861eed6 100644 --- a/packages/lit-form/src/tanstack-form-controller.ts +++ b/packages/lit-form/src/tanstack-form-controller.ts @@ -26,20 +26,16 @@ type renderCallback< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -86,20 +82,16 @@ type fieldDirectiveType< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -303,20 +295,16 @@ export class TanStackFormController< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( fieldConfig: FieldOptions< TParentData, @@ -391,32 +379,23 @@ export class TanStackFormController< TName extends DeepKeys, TData extends DeepValue, TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TGroupSubmitMeta, >( groupConfig: Omit< @@ -513,20 +492,16 @@ class FieldDirective< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -676,27 +651,20 @@ type groupRenderCallback< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TGroupSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -744,27 +712,20 @@ type formGroupDirectiveType< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TGroupSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -855,27 +816,20 @@ class FormGroupDirective< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TGroupSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/lit-form/tests/group.test.ts b/packages/lit-form/tests/group.test.ts index 1e30952dd..863dcea56 100644 --- a/packages/lit-form/tests/group.test.ts +++ b/packages/lit-form/tests/group.test.ts @@ -160,8 +160,7 @@ describe('form.group directive', () => { )}
-${String(group.state.meta.errorMap.onSubmit ?? '')}
+${String(group.state.meta.errorMap.onSubmit ?? '')} `, )}` diff --git a/packages/lit-form/tests/simple.test.ts b/packages/lit-form/tests/simple.test.ts index 272e45a54..c6db6bb60 100644 --- a/packages/lit-form/tests/simple.test.ts +++ b/packages/lit-form/tests/simple.test.ts @@ -117,33 +117,37 @@ class TestForm extends LitElement { .type=${'checkbox'} /> - ${field.state.value - ? this.form.field( - { - name: `jobTitle`, - validators: { - onChange: ({ value }) => - value.length === 0 ? 'Needs to have a job here' : null, + ${ + field.state.value + ? this.form.field( + { + name: `jobTitle`, + validators: { + onChange: ({ value }) => + value.length === 0 + ? 'Needs to have a job here' + : null, + }, }, - }, - (subField) => { - return html`
- - -
` - }, - ) - : ''} + (subField) => { + return html`
+ + +
` + }, + ) + : '' + } ` })} diff --git a/packages/octane-form/src/createFormHook.tsrx.d.ts b/packages/octane-form/src/createFormHook.tsrx.d.ts index 36834eaa4..f0a376cce 100644 --- a/packages/octane-form/src/createFormHook.tsrx.d.ts +++ b/packages/octane-form/src/createFormHook.tsrx.d.ts @@ -464,12 +464,16 @@ type UseTypedAppFormContext< type FieldComponentExtension< TComponents extends Record>, > = Record> & { - [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' + [ + K in keyof TComponents + ]?: 'Error: field component names must be unique — this key already exists in the base form' } type FormComponentExtension< TComponents extends Record>, > = Record> & { - [K in keyof TComponents]?: 'Error: form component names must be unique — this key already exists in the base form' + [ + K in keyof TComponents + ]?: 'Error: form component names must be unique — this key already exists in the base form' } export interface CreateFormHookReturn< TComponents extends Record>, diff --git a/packages/octane-form/src/types.ts b/packages/octane-form/src/types.ts index 67738382c..866a6324f 100644 --- a/packages/octane-form/src/types.ts +++ b/packages/octane-form/src/types.ts @@ -41,20 +41,16 @@ export interface UseFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -102,20 +98,16 @@ export interface UseFieldOptionsBound< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldOptions< diff --git a/packages/octane-form/src/useField.tsrx.d.ts b/packages/octane-form/src/useField.tsrx.d.ts index cbba2d111..b55f9cf4b 100644 --- a/packages/octane-form/src/useField.tsrx.d.ts +++ b/packages/octane-form/src/useField.tsrx.d.ts @@ -36,20 +36,16 @@ export type UseField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( opts: UseFieldOptionsBound< TParentData, @@ -103,20 +99,16 @@ export declare function useField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -189,20 +181,16 @@ interface FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -276,20 +264,16 @@ interface FieldComponentBoundProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -353,20 +337,16 @@ export type FieldComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}, @@ -376,20 +356,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -432,20 +408,16 @@ export type LensFieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -518,20 +490,16 @@ export declare const Field: < TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/octane-form/src/useFormGroup.tsrx.d.ts b/packages/octane-form/src/useFormGroup.tsrx.d.ts index c9c4ddabb..c7acb4fa1 100644 --- a/packages/octane-form/src/useFormGroup.tsrx.d.ts +++ b/packages/octane-form/src/useFormGroup.tsrx.d.ts @@ -30,27 +30,20 @@ export type UseFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( opts: FormGroupApiOptions< @@ -111,27 +104,20 @@ export declare function useFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -203,27 +189,20 @@ interface FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -299,27 +278,20 @@ interface FormGroupComponentBoundProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -394,20 +366,16 @@ export type FormGroupComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}, @@ -416,27 +384,20 @@ export type FormGroupComponent< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >({ children, @@ -474,27 +435,20 @@ export declare const FormGroup: < TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/preact-form/src/types.ts b/packages/preact-form/src/types.ts index b8dc7da09..95c2765c6 100644 --- a/packages/preact-form/src/types.ts +++ b/packages/preact-form/src/types.ts @@ -25,20 +25,16 @@ export interface UseFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -86,20 +82,16 @@ export interface UseFieldOptionsBound< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldOptions< diff --git a/packages/preact-form/src/useField.tsx b/packages/preact-form/src/useField.tsx index 256e9d53b..6e123d5a6 100644 --- a/packages/preact-form/src/useField.tsx +++ b/packages/preact-form/src/useField.tsx @@ -40,20 +40,16 @@ export type UseField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( opts: UseFieldOptionsBound< TParentData, @@ -108,20 +104,16 @@ export function useField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -308,20 +300,16 @@ interface FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -396,20 +384,16 @@ interface FieldComponentBoundProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -474,20 +458,16 @@ export type FieldComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}, @@ -497,20 +477,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -554,20 +530,16 @@ export type LensFieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -641,20 +613,16 @@ export const Field = (< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/preact-form/src/useFormGroup.tsx b/packages/preact-form/src/useFormGroup.tsx index 3cd22d6a0..fa4a70e20 100644 --- a/packages/preact-form/src/useFormGroup.tsx +++ b/packages/preact-form/src/useFormGroup.tsx @@ -32,27 +32,20 @@ export type UseFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( opts: FormGroupApiOptions< @@ -114,27 +107,20 @@ export function useFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -368,27 +354,20 @@ interface FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -465,27 +444,20 @@ interface FormGroupComponentBoundProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -561,20 +533,16 @@ export type FormGroupComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}, @@ -583,27 +551,20 @@ export type FormGroupComponent< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >({ children, @@ -642,27 +603,20 @@ export const FormGroup = (< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/react-form-start/src/getFormData.tsx b/packages/react-form-start/src/getFormData.tsx index c9b72bf51..6c626231b 100644 --- a/packages/react-form-start/src/getFormData.tsx +++ b/packages/react-form-start/src/getFormData.tsx @@ -14,8 +14,7 @@ export const initialFormState = { export const getFormData = createServerFn().handler(async () => { const data = getInternalTanStackCookie() as - | undefined - | ServerFormState + undefined | ServerFormState // Delete the temporary cookie from the client after reading it deleteInternalTanStackCookie() if (!data) return initialFormState diff --git a/packages/react-form/src/createFormHook.tsx b/packages/react-form/src/createFormHook.tsx index 4008c47fc..10764d9e1 100644 --- a/packages/react-form/src/createFormHook.tsx +++ b/packages/react-form/src/createFormHook.tsx @@ -597,10 +597,14 @@ export function createFormHook< function extendForm< const TNewField extends Record> & { - [K in keyof TComponents]?: 'Error: field component names must be unique — this key already exists in the base form' + [ + K in keyof TComponents + ]?: 'Error: field component names must be unique — this key already exists in the base form' }, const TNewForm extends Record> & { - [K in keyof TFormComponents]?: 'Error: form component names must be unique — this key already exists in the base form' + [ + K in keyof TFormComponents + ]?: 'Error: form component names must be unique — this key already exists in the base form' }, >(extension: { fieldComponents?: TNewField; formComponents?: TNewForm }) { return createFormHook({ diff --git a/packages/react-form/src/types.ts b/packages/react-form/src/types.ts index 971a5692a..28c39f439 100644 --- a/packages/react-form/src/types.ts +++ b/packages/react-form/src/types.ts @@ -24,20 +24,16 @@ export interface UseFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -85,20 +81,16 @@ export interface UseFieldOptionsBound< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldOptions< diff --git a/packages/react-form/src/useField.tsx b/packages/react-form/src/useField.tsx index b40b1b42b..f4cde84f3 100644 --- a/packages/react-form/src/useField.tsx +++ b/packages/react-form/src/useField.tsx @@ -42,20 +42,16 @@ export type UseField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( opts: UseFieldOptionsBound< TParentData, @@ -110,20 +106,16 @@ export function useField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -316,20 +308,16 @@ interface FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -404,20 +392,16 @@ interface FieldComponentBoundProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -482,20 +466,16 @@ export type FieldComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}, @@ -505,20 +485,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -562,20 +538,16 @@ export type LensFieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -649,20 +621,16 @@ export const Field = (< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/react-form/src/useFormGroup.tsx b/packages/react-form/src/useFormGroup.tsx index d9d02f498..7914fed4f 100644 --- a/packages/react-form/src/useFormGroup.tsx +++ b/packages/react-form/src/useFormGroup.tsx @@ -34,27 +34,20 @@ export type UseFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( opts: FormGroupApiOptions< @@ -116,27 +109,20 @@ export function useFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -371,27 +357,20 @@ interface FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -468,27 +447,20 @@ interface FormGroupComponentBoundProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -564,20 +536,16 @@ export type FormGroupComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}, @@ -586,27 +554,20 @@ export type FormGroupComponent< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >({ children, @@ -645,27 +606,20 @@ export const FormGroup = (< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/solid-form/src/createField.tsx b/packages/solid-form/src/createField.tsx index ade0ec17b..5284c36e5 100644 --- a/packages/solid-form/src/createField.tsx +++ b/packages/solid-form/src/createField.tsx @@ -62,20 +62,16 @@ function makeFieldReactive< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -222,20 +218,16 @@ export function createField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -336,20 +328,16 @@ interface FieldComponentBoundProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -416,20 +404,16 @@ export type FieldComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TPatentSubmitMeta, in out ExtendedApi = {}, @@ -439,20 +423,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -490,20 +470,16 @@ interface FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -582,20 +558,16 @@ export type LensFieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >({ children, ...fieldOptions @@ -664,20 +636,16 @@ export function Field< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/solid-form/src/createFormGroup.tsx b/packages/solid-form/src/createFormGroup.tsx index dd6d89ebd..01b2eef79 100644 --- a/packages/solid-form/src/createFormGroup.tsx +++ b/packages/solid-form/src/createFormGroup.tsx @@ -26,27 +26,20 @@ function makeFormGroupReactive< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -130,27 +123,20 @@ export function createFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -251,27 +237,20 @@ interface FormGroupComponentBoundProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -352,20 +331,16 @@ export type FormGroupComponent< in out TFormOnMount extends undefined | FormValidateOrFn, in out TFormOnChange extends undefined | FormValidateOrFn, in out TFormOnChangeAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnBlur extends undefined | FormValidateOrFn, in out TFormOnBlurAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnSubmit extends undefined | FormValidateOrFn, in out TFormOnSubmitAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnDynamic extends undefined | FormValidateOrFn, in out TFormOnDynamicAsync extends - | undefined - | FormAsyncValidateOrFn, + undefined | FormAsyncValidateOrFn, in out TFormOnServer extends undefined | FormAsyncValidateOrFn, in out TParentSubmitMeta, in out ExtendedApi = {}, @@ -374,27 +349,20 @@ export type FormGroupComponent< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( props: FormGroupComponentBoundProps< @@ -432,27 +400,20 @@ interface FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -527,27 +488,20 @@ export function FormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/solid-form/src/types.ts b/packages/solid-form/src/types.ts index 2d0807655..3d4d67b24 100644 --- a/packages/solid-form/src/types.ts +++ b/packages/solid-form/src/types.ts @@ -23,20 +23,16 @@ export interface CreateFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -84,20 +80,16 @@ export interface CreateFieldOptionsBound< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldOptions< diff --git a/packages/svelte-form/src/types.ts b/packages/svelte-form/src/types.ts index 91ee48e3c..da2de2765 100644 --- a/packages/svelte-form/src/types.ts +++ b/packages/svelte-form/src/types.ts @@ -27,20 +27,16 @@ export type CreateFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -110,20 +106,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( internal: any, { @@ -164,27 +156,20 @@ export type FieldComponent< TData extends DeepValue, TOnMount extends undefined | FieldValidateOrFn, TOnChange extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends - | undefined - | FieldValidateOrFn, + undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( opts: ComponentConstructorOptions< Omit< @@ -227,20 +212,16 @@ type FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -337,32 +318,23 @@ export type FormGroupComponent< TName extends DeepKeys, TData extends DeepValue, TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( internal: any, @@ -404,32 +376,23 @@ export type FormGroupComponent< TName extends DeepKeys, TData extends DeepValue, TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( opts: ComponentConstructorOptions< @@ -473,27 +436,20 @@ type FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, diff --git a/packages/vue-form/src/types.ts b/packages/vue-form/src/types.ts index 9bdc25030..defd32e68 100644 --- a/packages/vue-form/src/types.ts +++ b/packages/vue-form/src/types.ts @@ -20,20 +20,16 @@ export interface UseFieldOptions< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -81,20 +77,16 @@ export interface UseFieldOptionsBound< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > extends FieldOptions< diff --git a/packages/vue-form/src/useField.tsx b/packages/vue-form/src/useField.tsx index 1d1031d94..065d19d7b 100644 --- a/packages/vue-form/src/useField.tsx +++ b/packages/vue-form/src/useField.tsx @@ -43,20 +43,16 @@ export type FieldComponent< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, >( props: FieldComponentBoundProps< TParentData, @@ -193,20 +189,16 @@ export function useField< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -390,20 +382,16 @@ export type FieldComponentProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, @@ -448,20 +436,16 @@ export type FieldComponentBoundProps< TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, > = UseFieldOptionsBound< TParentData, TName, @@ -485,20 +469,16 @@ export const Field = defineComponent( TOnMount extends undefined | FieldValidateOrFn, TOnChange extends undefined | FieldValidateOrFn, TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnBlur extends undefined | FieldValidateOrFn, TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnSubmit extends undefined | FieldValidateOrFn, TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TOnDynamic extends undefined | FieldValidateOrFn, TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, + undefined | FieldAsyncValidateOrFn, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, diff --git a/packages/vue-form/src/useFormGroup.tsx b/packages/vue-form/src/useFormGroup.tsx index f0ab50ab2..ee04284a0 100644 --- a/packages/vue-form/src/useFormGroup.tsx +++ b/packages/vue-form/src/useFormGroup.tsx @@ -41,27 +41,20 @@ export type FormGroupComponent< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, >( props: FormGroupComponentBoundProps< @@ -224,27 +217,20 @@ export function useFormGroup< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -321,27 +307,20 @@ export type FormGroupComponentProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -387,27 +366,20 @@ export type FormGroupComponentBoundProps< TData extends DeepValue, TOnMount extends undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn, @@ -453,32 +425,23 @@ export const FormGroup = defineComponent( TName extends DeepKeys, TData extends DeepValue, TOnMount extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChange extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnChangeAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnBlur extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnBlurAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnSubmit extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnSubmitAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TOnDynamic extends - | undefined - | FormGroupValidateOrFn, + undefined | FormGroupValidateOrFn, TOnDynamicAsync extends - | undefined - | FormGroupAsyncValidateOrFn, + undefined | FormGroupAsyncValidateOrFn, TSubmitMeta, TFormOnMount extends undefined | FormValidateOrFn, TFormOnChange extends undefined | FormValidateOrFn,