From 116c154924e364189b8b929bb920496065697728 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 19 Sep 2026 19:23:50 -0700 Subject: [PATCH 01/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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, From 0ff3cbb6dffdc84c8bf6d281277652f4373499da Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 30 Sep 2026 09:03:33 -0700 Subject: [PATCH 20/23] chore: add Octane examples --- docs/config.json | 13 +++ examples/octane/multi-step-wizard/README.md | 6 ++ examples/octane/multi-step-wizard/index.html | 12 +++ .../octane/multi-step-wizard/package.json | 21 ++++ .../octane/multi-step-wizard/src/App.tsrx | 5 + .../src/components/text-fields.tsrx | 21 ++++ .../src/features/wizard/page.tsrx | 34 ++++++ .../src/features/wizard/shared-form.ts | 21 ++++ .../src/features/wizard/step1-subform.tsrx | 38 +++++++ .../src/features/wizard/step2-subform.tsrx | 36 +++++++ .../src/hooks/form-context.ts | 4 + .../multi-step-wizard/src/hooks/form.tsrx | 23 ++++ .../octane/multi-step-wizard/src/index.tsrx | 10 ++ .../octane/multi-step-wizard/tsconfig.json | 13 +++ .../octane/multi-step-wizard/vite.config.ts | 10 ++ examples/octane/simple/README.md | 6 ++ examples/octane/simple/index.html | 12 +++ examples/octane/simple/package.json | 20 ++++ examples/octane/simple/src/index.tsrx | 100 ++++++++++++++++++ examples/octane/simple/tsconfig.json | 13 +++ examples/octane/simple/vite.config.ts | 10 ++ examples/react/nextjs/next-env.d.ts | 7 ++ pnpm-lock.yaml | 70 +++++++++++- pnpm-workspace.yaml | 1 + 24 files changed, 503 insertions(+), 3 deletions(-) create mode 100644 examples/octane/multi-step-wizard/README.md create mode 100644 examples/octane/multi-step-wizard/index.html create mode 100644 examples/octane/multi-step-wizard/package.json create mode 100644 examples/octane/multi-step-wizard/src/App.tsrx create mode 100644 examples/octane/multi-step-wizard/src/components/text-fields.tsrx create mode 100644 examples/octane/multi-step-wizard/src/features/wizard/page.tsrx create mode 100644 examples/octane/multi-step-wizard/src/features/wizard/shared-form.ts create mode 100644 examples/octane/multi-step-wizard/src/features/wizard/step1-subform.tsrx create mode 100644 examples/octane/multi-step-wizard/src/features/wizard/step2-subform.tsrx create mode 100644 examples/octane/multi-step-wizard/src/hooks/form-context.ts create mode 100644 examples/octane/multi-step-wizard/src/hooks/form.tsrx create mode 100644 examples/octane/multi-step-wizard/src/index.tsrx create mode 100644 examples/octane/multi-step-wizard/tsconfig.json create mode 100644 examples/octane/multi-step-wizard/vite.config.ts create mode 100644 examples/octane/simple/README.md create mode 100644 examples/octane/simple/index.html create mode 100644 examples/octane/simple/package.json create mode 100644 examples/octane/simple/src/index.tsrx create mode 100644 examples/octane/simple/tsconfig.json create mode 100644 examples/octane/simple/vite.config.ts create mode 100644 examples/react/nextjs/next-env.d.ts diff --git a/docs/config.json b/docs/config.json index 9bacc7ede..8fe73ca6b 100644 --- a/docs/config.json +++ b/docs/config.json @@ -811,6 +811,19 @@ } ] }, + { + "label": "octane", + "children": [ + { + "label": "Simple", + "to": "framework/octane/examples/simple" + }, + { + "label": "Multi-Step Wizard", + "to": "framework/octane/examples/multi-step-wizard" + } + ] + }, { "label": "svelte", "children": [ diff --git a/examples/octane/multi-step-wizard/README.md b/examples/octane/multi-step-wizard/README.md new file mode 100644 index 000000000..1cf889265 --- /dev/null +++ b/examples/octane/multi-step-wizard/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` +- `npm run dev` diff --git a/examples/octane/multi-step-wizard/index.html b/examples/octane/multi-step-wizard/index.html new file mode 100644 index 000000000..4db1d1323 --- /dev/null +++ b/examples/octane/multi-step-wizard/index.html @@ -0,0 +1,12 @@ + + + + + + TanStack Form Octane Multi-Step Wizard Example App + + +
+ + + diff --git a/examples/octane/multi-step-wizard/package.json b/examples/octane/multi-step-wizard/package.json new file mode 100644 index 000000000..ded9566e8 --- /dev/null +++ b/examples/octane/multi-step-wizard/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tanstack/form-example-octane-multi-step-wizard", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsrx-tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@tanstack/octane-form": "workspace:*", + "octane": "^0.2.16", + "zod": "^3.25.76" + }, + "devDependencies": { + "@tsrx/typescript-plugin": "0.4.6", + "typescript": "5.9.3", + "vite": "^7.2.2" + } +} diff --git a/examples/octane/multi-step-wizard/src/App.tsrx b/examples/octane/multi-step-wizard/src/App.tsrx new file mode 100644 index 000000000..969cdbdae --- /dev/null +++ b/examples/octane/multi-step-wizard/src/App.tsrx @@ -0,0 +1,5 @@ +import { WizardPage } from './features/wizard/page.tsrx' + +export default function App() @{ + +} diff --git a/examples/octane/multi-step-wizard/src/components/text-fields.tsrx b/examples/octane/multi-step-wizard/src/components/text-fields.tsrx new file mode 100644 index 000000000..e271fee71 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/components/text-fields.tsrx @@ -0,0 +1,21 @@ +import { useSelector } from '@tanstack/octane-form' +import { useFieldContext } from '../hooks/form-context' + +export function TextField({ label }: { label: string }) @{ + const field = useFieldContext() + const errors = useSelector(field.store, (state) => state.meta.errors) + +
+ + @for (const error of errors; key error.message) { +
{error.message}
+ } +
+} diff --git a/examples/octane/multi-step-wizard/src/features/wizard/page.tsrx b/examples/octane/multi-step-wizard/src/features/wizard/page.tsrx new file mode 100644 index 000000000..cd7825f31 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/features/wizard/page.tsrx @@ -0,0 +1,34 @@ +import { revalidateLogic } from '@tanstack/octane-form' +import { z } from 'zod' +import { useState } from 'octane' +import { useAppForm } from '../../hooks/form.tsrx' +import { step1Schema, step2Schema, wizardFormOpts } from './shared-form' +import { Step2Form } from './step2-subform.tsrx' +import { Step1Form } from './step1-subform.tsrx' + +export function WizardPage() @{ + const [step, setStep] = useState(0) + const form = useAppForm({ + ...wizardFormOpts, + validationLogic: revalidateLogic(), + validators: { + // The whole-form schema runs when form.handleSubmit() is called. + // A FormGroup validates only its current step's schema. + onDynamic: z.object({ + step1: step1Schema, + step2: step2Schema, + }), + }, + onSubmit: ({ value }) => { + alert(`Form submitted: ${JSON.stringify(value)}`) + }, + }) + + <> + @if (step === 0) { + + } @else if (step === 1) { + + } + +} diff --git a/examples/octane/multi-step-wizard/src/features/wizard/shared-form.ts b/examples/octane/multi-step-wizard/src/features/wizard/shared-form.ts new file mode 100644 index 000000000..54b18eef9 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/features/wizard/shared-form.ts @@ -0,0 +1,21 @@ +import { formOptions } from '@tanstack/octane-form' +import z from 'zod' + +export const step1Schema = z.object({ + name: z.string().min(2, 'Name must be at least 2 characters'), +}) + +export const step2Schema = z.object({ + name: z.string().min(3, 'Name must be at least 3 characters'), +}) + +export const wizardFormOpts = formOptions({ + defaultValues: { + step1: { + name: '', + }, + step2: { + name: '', + }, + }, +}) diff --git a/examples/octane/multi-step-wizard/src/features/wizard/step1-subform.tsrx b/examples/octane/multi-step-wizard/src/features/wizard/step1-subform.tsrx new file mode 100644 index 000000000..4523bd5f0 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/features/wizard/step1-subform.tsrx @@ -0,0 +1,38 @@ +import { withForm } from '../../hooks/form.tsrx' +import { step1Schema, wizardFormOpts } from './shared-form' + +export const Step1Form = withForm({ + ...wizardFormOpts, + props: { + step: 0, + setStep: (_step: number) => {}, + }, + render: ({ form, step, setStep }) => { + setStep(step + 1) + }} + onGroupSubmitInvalid={() => {}} + > + {(formGroup) =>
{ + e.preventDefault() + e.stopPropagation() + void formGroup.handleSubmit() + }} + > + + {(field) => } + + + + + + {/* Form groups expose error maps and errors, just like forms and fields. */} +
{JSON.stringify(formGroup.state.meta.errorMap, null, 2)}
+
} +
, +}) diff --git a/examples/octane/multi-step-wizard/src/features/wizard/step2-subform.tsrx b/examples/octane/multi-step-wizard/src/features/wizard/step2-subform.tsrx new file mode 100644 index 000000000..c5c859960 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/features/wizard/step2-subform.tsrx @@ -0,0 +1,36 @@ +import { withForm } from '../../hooks/form.tsrx' +import { step2Schema, wizardFormOpts } from './shared-form' + +export const Step2Form = withForm({ + ...wizardFormOpts, + props: { + step: 1, + setStep: (_step: number) => {}, + }, + render: ({ form, step, setStep }) => form.handleSubmit()} + > + {(formGroup) =>
{ + e.preventDefault() + e.stopPropagation() + void formGroup.handleSubmit() + }} + > + + {(field) => } + + + + + + +
} +
, +}) diff --git a/examples/octane/multi-step-wizard/src/hooks/form-context.ts b/examples/octane/multi-step-wizard/src/hooks/form-context.ts new file mode 100644 index 000000000..11de87873 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/hooks/form-context.ts @@ -0,0 +1,4 @@ +import { createFormHookContexts } from '@tanstack/octane-form' + +export const { fieldContext, useFieldContext, formContext, useFormContext } = + createFormHookContexts() diff --git a/examples/octane/multi-step-wizard/src/hooks/form.tsrx b/examples/octane/multi-step-wizard/src/hooks/form.tsrx new file mode 100644 index 000000000..9335890c4 --- /dev/null +++ b/examples/octane/multi-step-wizard/src/hooks/form.tsrx @@ -0,0 +1,23 @@ +import { createFormHook } from '@tanstack/octane-form' +import { TextField } from '../components/text-fields.tsrx' +import { fieldContext, formContext, useFormContext } from './form-context' + +function SubscribeButton({ label }: { label: string }) @{ + const form = useFormContext() + + state.isSubmitting}> + {(isSubmitting) => + } + +} + +export const { useAppForm, withForm, withFieldGroup } = createFormHook({ + fieldComponents: { + TextField, + }, + formComponents: { + SubscribeButton, + }, + fieldContext, + formContext, +}) diff --git a/examples/octane/multi-step-wizard/src/index.tsrx b/examples/octane/multi-step-wizard/src/index.tsrx new file mode 100644 index 000000000..cfb90f0ba --- /dev/null +++ b/examples/octane/multi-step-wizard/src/index.tsrx @@ -0,0 +1,10 @@ +import { createRoot } from 'octane' +import App from './App.tsrx' + +const rootElement = document.getElementById('root') + +if (!rootElement) { + throw new Error('Root element not found') +} + +createRoot(rootElement).render(App) diff --git a/examples/octane/multi-step-wizard/tsconfig.json b/examples/octane/multi-step-wizard/tsconfig.json new file mode 100644 index 000000000..8e3a82671 --- /dev/null +++ b/examples/octane/multi-step-wizard/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.json", + "tsrx": { + "compiler": "octane/compiler/volar" + }, + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "octane", + "allowImportingTsExtensions": true, + "plugins": [{ "name": "@tsrx/typescript-plugin" }] + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/octane/multi-step-wizard/vite.config.ts b/examples/octane/multi-step-wizard/vite.config.ts new file mode 100644 index 000000000..a019236ff --- /dev/null +++ b/examples/octane/multi-step-wizard/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import { octane } from 'octane/compiler/vite' + +export default defineConfig({ + plugins: [octane()], + resolve: { + extensions: ['.tsrx', '.ts', '.tsx', '.mjs', '.js', '.jsx', '.json'], + }, + build: { target: 'esnext' }, +}) diff --git a/examples/octane/simple/README.md b/examples/octane/simple/README.md new file mode 100644 index 000000000..1cf889265 --- /dev/null +++ b/examples/octane/simple/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` +- `npm run dev` diff --git a/examples/octane/simple/index.html b/examples/octane/simple/index.html new file mode 100644 index 000000000..f82f41847 --- /dev/null +++ b/examples/octane/simple/index.html @@ -0,0 +1,12 @@ + + + + + + TanStack Form Octane Simple Example App + + +
+ + + diff --git a/examples/octane/simple/package.json b/examples/octane/simple/package.json new file mode 100644 index 000000000..7a2de1c07 --- /dev/null +++ b/examples/octane/simple/package.json @@ -0,0 +1,20 @@ +{ + "name": "@tanstack/form-example-octane-simple", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsrx-tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@tanstack/octane-form": "workspace:*", + "octane": "^0.2.16" + }, + "devDependencies": { + "@tsrx/typescript-plugin": "0.4.6", + "typescript": "5.9.3", + "vite": "^7.2.2" + } +} diff --git a/examples/octane/simple/src/index.tsrx b/examples/octane/simple/src/index.tsrx new file mode 100644 index 000000000..68b1b0d67 --- /dev/null +++ b/examples/octane/simple/src/index.tsrx @@ -0,0 +1,100 @@ +import { createRoot } from 'octane' +import { useForm } from '@tanstack/octane-form' +import type { AnyFieldApi } from '@tanstack/octane-form' + +function FieldInfo({ field }: { field: AnyFieldApi }) @{ + <> + @if (field.state.meta.isTouched && !field.state.meta.isValid) { + {field.state.meta.errors.join(',')} + } + @if (field.state.meta.isValidating) { + <>Validating... + } + +} + +function App() @{ + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + console.log(value) + }, + }) + +
+

Simple Octane Form Example

+
{ + e.preventDefault() + e.stopPropagation() + void form.handleSubmit() + }} + > +
+ !value + ? 'A first name is required' + : value.length < 3 + ? 'First name must be at least 3 characters' + : undefined, + }} + children={(field) => <> + + field.handleChange(e.currentTarget.value)} + /> + + } + /> +
+ +
+ <> + + field.handleChange(e.currentTarget.value)} + /> + + } + /> +
+ + [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => <> + + + } + /> + +
+} + +const target = document.getElementById('root') +if (!target) throw new Error('Missing #root') +createRoot(target).render(App) diff --git a/examples/octane/simple/tsconfig.json b/examples/octane/simple/tsconfig.json new file mode 100644 index 000000000..8e3a82671 --- /dev/null +++ b/examples/octane/simple/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.json", + "tsrx": { + "compiler": "octane/compiler/volar" + }, + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "octane", + "allowImportingTsExtensions": true, + "plugins": [{ "name": "@tsrx/typescript-plugin" }] + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/octane/simple/vite.config.ts b/examples/octane/simple/vite.config.ts new file mode 100644 index 000000000..a019236ff --- /dev/null +++ b/examples/octane/simple/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import { octane } from 'octane/compiler/vite' + +export default defineConfig({ + plugins: [octane()], + resolve: { + extensions: ['.tsrx', '.ts', '.tsx', '.mjs', '.js', '.jsx', '.json'], + }, + build: { target: 'esnext' }, +}) diff --git a/examples/react/nextjs/next-env.d.ts b/examples/react/nextjs/next-env.d.ts new file mode 100644 index 000000000..ce4e94a6b --- /dev/null +++ b/examples/react/nextjs/next-env.d.ts @@ -0,0 +1,7 @@ +/// +/// +import "./.next/types/routes.d.ts"; +import "./.next/types/root-params.d.ts"; + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa3b46b2e..4835b8494 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -637,6 +637,47 @@ importers: 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) + examples/octane/multi-step-wizard: + dependencies: + '@tanstack/octane-form': + specifier: workspace:* + version: link:../../../packages/octane-form + octane: + specifier: ^0.2.16 + 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@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 + devDependencies: + '@tsrx/typescript-plugin': + specifier: 0.4.6 + 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@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@5.9.3) + 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@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/octane/simple: + dependencies: + '@tanstack/octane-form': + specifier: workspace:* + version: link:../../../packages/octane-form + octane: + specifier: ^0.2.16 + 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@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)) + devDependencies: + '@tsrx/typescript-plugin': + specifier: 0.4.6 + 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@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@5.9.3) + 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@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/multi-step-wizard: dependencies: '@tanstack/preact-form': @@ -1883,7 +1924,7 @@ importers: 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.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) + 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@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@5.9.3) '@volar/language-core': specifier: 2.4.28 version: 2.4.28 @@ -21991,13 +22032,13 @@ snapshots: '@tsrx/runtime@0.2.2': {} - '@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)': + '@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@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@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.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)) + 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@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)) '@tufjs/canonical-json@2.0.0': {} @@ -28332,6 +28373,29 @@ snapshots: - svelte - vite-plus + 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@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: + '@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 + 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.70.0) + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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) + transitivePeerDependencies: + - '@typescript-eslint/types' + - svelte + - vite-plus + on-finished@2.3.0: dependencies: ee-first: 1.1.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2ddfad09b..056c44131 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,6 +23,7 @@ packages: - examples/angular/** - examples/react/** - examples/preact/** + - examples/octane/** - examples/solid/** - examples/vue/** - examples/lit/** From 47014f7a1479ab8f50d6bb11c611b3d0ea0259e9 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 30 Sep 2026 09:06:47 -0700 Subject: [PATCH 21/23] docs: add octane reference docs --- .../reference/classes/TanStackAppField.md | 36 ++--- .../reference/classes/TanStackField.md | 34 ++--- .../reference/classes/TanStackFormGroup.md | 42 +++--- .../classes/TanStackFormController.md | 14 +- .../reference/functions/createFormHook.md | 30 ++++ .../functions/createFormHookContexts.md | 52 +++++++ .../octane/reference/functions/useField.md | 120 +++++++++++++++ .../reference/functions/useFieldGroup.md | 107 ++++++++++++++ .../octane/reference/functions/useForm.md | 74 ++++++++++ .../reference/functions/useFormGroup.md | 126 ++++++++++++++++ .../octane/reference/functions/useSelector.md | 60 ++++++++ docs/framework/octane/reference/index.md | 40 +++++ .../interfaces/CreateFormHookReturn.md | 92 ++++++++++++ .../reference/interfaces/OctaneFormApi.md | 92 ++++++++++++ .../interfaces/SubscribeComponent.md | 57 +++++++ .../reference/interfaces/UseFieldOptions.md | 122 +++++++++++++++ .../interfaces/UseFieldOptionsBound.md | 76 ++++++++++ .../interfaces/WithFieldGroupProps.md | 52 +++++++ .../reference/interfaces/WithFormProps.md | 92 ++++++++++++ .../reference/type-aliases/FieldComponent.md | 129 ++++++++++++++++ .../type-aliases/FormGroupComponent.md | 139 ++++++++++++++++++ .../type-aliases/LensFieldComponent.md | 89 +++++++++++ .../type-aliases/OctaneFormExtendedApi.md | 62 ++++++++ .../reference/type-aliases/ServerFormState.md | 20 +++ .../octane/reference/type-aliases/UseField.md | 120 +++++++++++++++ .../reference/type-aliases/UseFormGroup.md | 128 ++++++++++++++++ .../octane/reference/variables/Field.md | 124 ++++++++++++++++ .../octane/reference/variables/FormGroup.md | 132 +++++++++++++++++ .../variables/useIsomorphicLayoutEffect.md | 28 ++++ .../preact/reference/functions/useField.md | 2 +- .../reference/functions/useFormGroup.md | 2 +- .../preact/reference/functions/useSelector.md | 2 +- .../interfaces/UseFieldOptionsBound.md | 2 +- .../reference/type-aliases/FieldComponent.md | 2 +- .../type-aliases/FormGroupComponent.md | 2 +- .../type-aliases/LensFieldComponent.md | 2 +- .../type-aliases/PropsWithChildren.md | 2 +- .../reference/type-aliases/ServerFormState.md | 2 +- .../preact/reference/variables/Field.md | 2 +- .../preact/reference/variables/FormGroup.md | 2 +- .../preact/reference/variables/useStore.md | 2 +- .../react/reference/functions/useField.md | 2 +- .../react/reference/functions/useFormGroup.md | 2 +- .../react/reference/functions/useSelector.md | 2 +- .../interfaces/UseFieldOptionsBound.md | 2 +- .../reference/type-aliases/FieldComponent.md | 2 +- .../type-aliases/FormGroupComponent.md | 2 +- .../type-aliases/LensFieldComponent.md | 2 +- .../reference/type-aliases/ServerFormState.md | 2 +- .../react/reference/variables/Field.md | 2 +- .../react/reference/variables/FormGroup.md | 2 +- .../react/reference/variables/useStore.md | 2 +- .../solid/reference/functions/Field.md | 2 +- .../solid/reference/functions/FormGroup.md | 2 +- .../solid/reference/functions/createField.md | 2 +- .../reference/functions/createFormGroup.md | 2 +- .../solid/reference/functions/useSelector.md | 2 +- .../interfaces/CreateFieldOptionsBound.md | 2 +- .../reference/type-aliases/FieldComponent.md | 2 +- .../type-aliases/FormGroupComponent.md | 2 +- .../type-aliases/LensFieldComponent.md | 2 +- .../solid/reference/variables/useStore.md | 2 +- .../vue/reference/functions/useField.md | 2 +- .../vue/reference/functions/useFormGroup.md | 2 +- .../vue/reference/functions/useSelector.md | 2 +- .../vue/reference/interfaces/VueFieldApi.md | 4 +- .../reference/interfaces/VueFormGroupApi.md | 4 +- .../type-aliases/FieldComponentBoundProps.md | 2 +- .../type-aliases/FieldComponentProps.md | 2 +- .../FormGroupComponentBoundProps.md | 2 +- .../type-aliases/FormGroupComponentProps.md | 2 +- .../vue/reference/variables/Field.md | 2 +- .../vue/reference/variables/FormGroup.md | 2 +- .../vue/reference/variables/useStore.md | 2 +- docs/reference/classes/FieldApi.md | 56 +++---- docs/reference/classes/FormApi.md | 80 +++++----- docs/reference/classes/FormGroupApi.md | 70 ++++----- docs/reference/functions/createFieldMap.md | 2 +- docs/reference/functions/deepCopy.md | 2 +- docs/reference/functions/evaluate.md | 2 +- .../functions/isGlobalFormValidationError.md | 2 +- docs/reference/functions/uuid.md | 2 +- docs/reference/interfaces/BaseFormOptions.md | 6 +- docs/reference/interfaces/FieldApiOptions.md | 20 +-- docs/reference/interfaces/FieldListeners.md | 18 +-- docs/reference/interfaces/FieldOptions.md | 18 +-- docs/reference/interfaces/FieldValidators.md | 30 ++-- .../interfaces/FormGroupApiOptions.md | 32 ++-- .../interfaces/FormGroupListeners.md | 18 +-- docs/reference/interfaces/FormGroupMeta.md | 36 ++--- docs/reference/interfaces/FormGroupOptions.md | 30 ++-- docs/reference/interfaces/FormGroupState.md | 12 +- .../interfaces/FormGroupStoreState.md | 6 +- .../interfaces/FormGroupValidators.md | 24 +-- docs/reference/interfaces/FormListeners.md | 22 +-- .../interfaces/FormListenersPropsField.md | 6 +- .../interfaces/FormListenersPropsGroup.md | 6 +- docs/reference/interfaces/FormOptions.md | 28 ++-- docs/reference/interfaces/FormState.md | 50 +++---- docs/reference/interfaces/FormValidators.md | 26 ++-- .../interfaces/StandardSchemaV1Issue.md | 6 +- .../type-aliases/AnyBaseFormState.md | 2 +- docs/reference/type-aliases/AnyFieldApi.md | 2 +- docs/reference/type-aliases/AnyFieldMeta.md | 2 +- docs/reference/type-aliases/AnyFormApi.md | 2 +- .../reference/type-aliases/AnyFormGroupApi.md | 2 +- .../type-aliases/AnyFormGroupMeta.md | 2 +- docs/reference/type-aliases/AnyFormOptions.md | 2 +- docs/reference/type-aliases/AnyFormState.md | 2 +- docs/reference/type-aliases/BaseFormState.md | 24 +-- .../type-aliases/DerivedFormState.md | 28 ++-- .../type-aliases/ExtractGlobalFormError.md | 2 +- .../type-aliases/FormValidationError.md | 2 +- docs/reference/type-aliases/FormValidator.md | 6 +- .../UnwrapFieldAsyncValidateOrFn.md | 2 +- .../type-aliases/UnwrapFieldValidateOrFn.md | 2 +- .../UnwrapFormAsyncValidateOrFn.md | 2 +- .../type-aliases/UnwrapFormValidateOrFn.md | 2 +- docs/reference/type-aliases/ValidationMeta.md | 4 +- docs/reference/variables/throttleFormState.md | 2 +- examples/react/nextjs/next-env.d.ts | 4 +- scripts/generate-docs.ts | 11 ++ 122 files changed, 2637 insertions(+), 463 deletions(-) create mode 100644 docs/framework/octane/reference/functions/createFormHook.md create mode 100644 docs/framework/octane/reference/functions/createFormHookContexts.md create mode 100644 docs/framework/octane/reference/functions/useField.md create mode 100644 docs/framework/octane/reference/functions/useFieldGroup.md create mode 100644 docs/framework/octane/reference/functions/useForm.md create mode 100644 docs/framework/octane/reference/functions/useFormGroup.md create mode 100644 docs/framework/octane/reference/functions/useSelector.md create mode 100644 docs/framework/octane/reference/index.md create mode 100644 docs/framework/octane/reference/interfaces/CreateFormHookReturn.md create mode 100644 docs/framework/octane/reference/interfaces/OctaneFormApi.md create mode 100644 docs/framework/octane/reference/interfaces/SubscribeComponent.md create mode 100644 docs/framework/octane/reference/interfaces/UseFieldOptions.md create mode 100644 docs/framework/octane/reference/interfaces/UseFieldOptionsBound.md create mode 100644 docs/framework/octane/reference/interfaces/WithFieldGroupProps.md create mode 100644 docs/framework/octane/reference/interfaces/WithFormProps.md create mode 100644 docs/framework/octane/reference/type-aliases/FieldComponent.md create mode 100644 docs/framework/octane/reference/type-aliases/FormGroupComponent.md create mode 100644 docs/framework/octane/reference/type-aliases/LensFieldComponent.md create mode 100644 docs/framework/octane/reference/type-aliases/OctaneFormExtendedApi.md create mode 100644 docs/framework/octane/reference/type-aliases/ServerFormState.md create mode 100644 docs/framework/octane/reference/type-aliases/UseField.md create mode 100644 docs/framework/octane/reference/type-aliases/UseFormGroup.md create mode 100644 docs/framework/octane/reference/variables/Field.md create mode 100644 docs/framework/octane/reference/variables/FormGroup.md create mode 100644 docs/framework/octane/reference/variables/useIsomorphicLayoutEffect.md diff --git a/docs/framework/angular/reference/classes/TanStackAppField.md b/docs/framework/angular/reference/classes/TanStackAppField.md index 8801c8a50..98db8b13e 100644 --- a/docs/framework/angular/reference/classes/TanStackAppField.md +++ b/docs/framework/angular/reference/classes/TanStackAppField.md @@ -111,7 +111,7 @@ Defined in: [angular-form/src/app-field.ts:20](https://github.com/TanStack/form/ new TanStackAppField(): TanStackAppField; ``` -Defined in: [angular-form/src/app-field.ts:79](https://github.com/TanStack/form/blob/main/packages/angular-form/src/app-field.ts#L79) +Defined in: [angular-form/src/app-field.ts:75](https://github.com/TanStack/form/blob/main/packages/angular-form/src/app-field.ts#L75) #### Returns @@ -129,7 +129,7 @@ Defined in: [angular-form/src/app-field.ts:79](https://github.com/TanStack/form/ _api: Signal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L150) +Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L146) #### Inherited from @@ -143,7 +143,7 @@ Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack asyncAlways: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-field.ts:75](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L75) +Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L71) #### Inherited from @@ -157,7 +157,7 @@ Defined in: [angular-form/src/tanstack-field.ts:75](https://github.com/TanStack/ asyncDebounceMs: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-field.ts:72](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L72) +Defined in: [angular-form/src/tanstack-field.ts:68](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L68) #### Inherited from @@ -171,7 +171,7 @@ Defined in: [angular-form/src/tanstack-field.ts:72](https://github.com/TanStack/ base: TanStackFieldInjectable; ``` -Defined in: [angular-form/src/app-field.ts:77](https://github.com/TanStack/form/blob/main/packages/angular-form/src/app-field.ts#L77) +Defined in: [angular-form/src/app-field.ts:73](https://github.com/TanStack/form/blob/main/packages/angular-form/src/app-field.ts#L73) *** @@ -181,7 +181,7 @@ Defined in: [angular-form/src/app-field.ts:77](https://github.com/TanStack/form/ cd: ChangeDetectorRef; ``` -Defined in: [angular-form/src/tanstack-field.ts:237](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L237) +Defined in: [angular-form/src/tanstack-field.ts:233](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L233) #### Inherited from @@ -197,7 +197,7 @@ defaultMeta: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:117](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L117) +Defined in: [angular-form/src/tanstack-field.ts:113](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L113) #### Inherited from @@ -211,7 +211,7 @@ Defined in: [angular-form/src/tanstack-field.ts:117](https://github.com/TanStack defaultValue: InputSignal | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L71) +Defined in: [angular-form/src/tanstack-field.ts:67](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L67) #### Inherited from @@ -225,7 +225,7 @@ Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/ disableErrorFlat: InputSignal; ``` -Defined in: [angular-form/src/tanstack-field.ts:148](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L148) +Defined in: [angular-form/src/tanstack-field.ts:144](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L144) #### Inherited from @@ -239,7 +239,7 @@ Defined in: [angular-form/src/tanstack-field.ts:148](https://github.com/TanStack injector: Injector; ``` -Defined in: [angular-form/src/tanstack-field.ts:221](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L221) +Defined in: [angular-form/src/tanstack-field.ts:217](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L217) #### Inherited from @@ -255,7 +255,7 @@ listeners: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:116](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L116) +Defined in: [angular-form/src/tanstack-field.ts:112](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L112) #### Inherited from @@ -269,7 +269,7 @@ Defined in: [angular-form/src/tanstack-field.ts:116](https://github.com/TanStack mode: InputSignal<"value" | "array" | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L146) +Defined in: [angular-form/src/tanstack-field.ts:142](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L142) #### Inherited from @@ -283,7 +283,7 @@ Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack name: InputSignal; ``` -Defined in: [angular-form/src/tanstack-field.ts:70](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L70) +Defined in: [angular-form/src/tanstack-field.ts:66](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L66) #### Inherited from @@ -297,7 +297,7 @@ Defined in: [angular-form/src/tanstack-field.ts:70](https://github.com/TanStack/ options: Signal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:182](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L182) +Defined in: [angular-form/src/tanstack-field.ts:178](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L178) #### Inherited from @@ -311,7 +311,7 @@ Defined in: [angular-form/src/tanstack-field.ts:182](https://github.com/TanStack tanstackField: InputSignal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:78](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L78) +Defined in: [angular-form/src/tanstack-field.ts:74](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L74) #### Inherited from @@ -327,7 +327,7 @@ validators: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:96](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L96) +Defined in: [angular-form/src/tanstack-field.ts:92](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L92) #### Inherited from @@ -343,7 +343,7 @@ Defined in: [angular-form/src/tanstack-field.ts:96](https://github.com/TanStack/ get api(): FieldApi; ``` -Defined in: [angular-form/src/tanstack-field.ts:154](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L154) +Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L150) ##### Returns @@ -361,7 +361,7 @@ Defined in: [angular-form/src/tanstack-field.ts:154](https://github.com/TanStack ngOnInit(): void; ``` -Defined in: [angular-form/src/tanstack-field.ts:239](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L239) +Defined in: [angular-form/src/tanstack-field.ts:235](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L235) A callback method that is invoked immediately after the default change detector has checked the directive's diff --git a/docs/framework/angular/reference/classes/TanStackField.md b/docs/framework/angular/reference/classes/TanStackField.md index de0582b13..45c52065b 100644 --- a/docs/framework/angular/reference/classes/TanStackField.md +++ b/docs/framework/angular/reference/classes/TanStackField.md @@ -115,7 +115,7 @@ Defined in: [angular-form/src/tanstack-field.ts:37](https://github.com/TanStack/ new TanStackField(): TanStackField; ``` -Defined in: [angular-form/src/tanstack-field.ts:223](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L223) +Defined in: [angular-form/src/tanstack-field.ts:219](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L219) #### Returns @@ -129,7 +129,7 @@ Defined in: [angular-form/src/tanstack-field.ts:223](https://github.com/TanStack _api: Signal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L150) +Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L146) *** @@ -139,7 +139,7 @@ Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack asyncAlways: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-field.ts:75](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L75) +Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L71) *** @@ -149,7 +149,7 @@ Defined in: [angular-form/src/tanstack-field.ts:75](https://github.com/TanStack/ asyncDebounceMs: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-field.ts:72](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L72) +Defined in: [angular-form/src/tanstack-field.ts:68](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L68) *** @@ -159,7 +159,7 @@ Defined in: [angular-form/src/tanstack-field.ts:72](https://github.com/TanStack/ cd: ChangeDetectorRef; ``` -Defined in: [angular-form/src/tanstack-field.ts:237](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L237) +Defined in: [angular-form/src/tanstack-field.ts:233](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L233) *** @@ -171,7 +171,7 @@ defaultMeta: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:117](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L117) +Defined in: [angular-form/src/tanstack-field.ts:113](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L113) *** @@ -181,7 +181,7 @@ Defined in: [angular-form/src/tanstack-field.ts:117](https://github.com/TanStack defaultValue: InputSignal | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L71) +Defined in: [angular-form/src/tanstack-field.ts:67](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L67) *** @@ -191,7 +191,7 @@ Defined in: [angular-form/src/tanstack-field.ts:71](https://github.com/TanStack/ disableErrorFlat: InputSignal; ``` -Defined in: [angular-form/src/tanstack-field.ts:148](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L148) +Defined in: [angular-form/src/tanstack-field.ts:144](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L144) *** @@ -201,7 +201,7 @@ Defined in: [angular-form/src/tanstack-field.ts:148](https://github.com/TanStack injector: Injector; ``` -Defined in: [angular-form/src/tanstack-field.ts:221](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L221) +Defined in: [angular-form/src/tanstack-field.ts:217](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L217) *** @@ -213,7 +213,7 @@ listeners: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:116](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L116) +Defined in: [angular-form/src/tanstack-field.ts:112](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L112) *** @@ -223,7 +223,7 @@ Defined in: [angular-form/src/tanstack-field.ts:116](https://github.com/TanStack mode: InputSignal<"value" | "array" | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L146) +Defined in: [angular-form/src/tanstack-field.ts:142](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L142) *** @@ -233,7 +233,7 @@ Defined in: [angular-form/src/tanstack-field.ts:146](https://github.com/TanStack name: InputSignal; ``` -Defined in: [angular-form/src/tanstack-field.ts:70](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L70) +Defined in: [angular-form/src/tanstack-field.ts:66](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L66) *** @@ -243,7 +243,7 @@ Defined in: [angular-form/src/tanstack-field.ts:70](https://github.com/TanStack/ options: Signal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:182](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L182) +Defined in: [angular-form/src/tanstack-field.ts:178](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L178) *** @@ -253,7 +253,7 @@ Defined in: [angular-form/src/tanstack-field.ts:182](https://github.com/TanStack tanstackField: InputSignal>; ``` -Defined in: [angular-form/src/tanstack-field.ts:78](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L78) +Defined in: [angular-form/src/tanstack-field.ts:74](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L74) *** @@ -265,7 +265,7 @@ validators: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-field.ts:96](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L96) +Defined in: [angular-form/src/tanstack-field.ts:92](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L92) ## Accessors @@ -277,7 +277,7 @@ Defined in: [angular-form/src/tanstack-field.ts:96](https://github.com/TanStack/ get api(): FieldApi; ``` -Defined in: [angular-form/src/tanstack-field.ts:154](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L154) +Defined in: [angular-form/src/tanstack-field.ts:150](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L150) ##### Returns @@ -291,7 +291,7 @@ Defined in: [angular-form/src/tanstack-field.ts:154](https://github.com/TanStack ngOnInit(): void; ``` -Defined in: [angular-form/src/tanstack-field.ts:239](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L239) +Defined in: [angular-form/src/tanstack-field.ts:235](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-field.ts#L235) A callback method that is invoked immediately after the default change detector has checked the directive's diff --git a/docs/framework/angular/reference/classes/TanStackFormGroup.md b/docs/framework/angular/reference/classes/TanStackFormGroup.md index 98cf44499..2eddf2386 100644 --- a/docs/framework/angular/reference/classes/TanStackFormGroup.md +++ b/docs/framework/angular/reference/classes/TanStackFormGroup.md @@ -123,7 +123,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:34](https://github.com/TanS new TanStackFormGroup(): TanStackFormGroup; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:303](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L303) +Defined in: [angular-form/src/tanstack-form-group.ts:296](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L296) #### Returns @@ -137,7 +137,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:303](https://github.com/Tan _api: Signal>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:224](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L224) +Defined in: [angular-form/src/tanstack-form-group.ts:217](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L217) *** @@ -147,7 +147,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:224](https://github.com/Tan asyncAlways: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:79](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L79) +Defined in: [angular-form/src/tanstack-form-group.ts:72](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L72) *** @@ -157,7 +157,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:79](https://github.com/TanS asyncDebounceMs: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:76](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L76) +Defined in: [angular-form/src/tanstack-form-group.ts:69](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L69) *** @@ -167,7 +167,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:76](https://github.com/TanS canSubmitWhenInvalid: InputSignalWithTransform; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:82](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L82) +Defined in: [angular-form/src/tanstack-form-group.ts:75](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L75) *** @@ -177,7 +177,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:82](https://github.com/TanS cd: ChangeDetectorRef; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:317](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L317) +Defined in: [angular-form/src/tanstack-form-group.ts:310](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L310) *** @@ -189,7 +189,7 @@ defaultMeta: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:125](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L125) +Defined in: [angular-form/src/tanstack-form-group.ts:118](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L118) *** @@ -199,7 +199,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:125](https://github.com/Tan defaultState: InputSignal | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:154](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L154) +Defined in: [angular-form/src/tanstack-form-group.ts:147](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L147) *** @@ -209,7 +209,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:154](https://github.com/Tan defaultValue: InputSignal | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:75](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L75) +Defined in: [angular-form/src/tanstack-form-group.ts:68](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L68) *** @@ -219,7 +219,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:75](https://github.com/TanS injector: Injector; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:301](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L301) +Defined in: [angular-form/src/tanstack-form-group.ts:294](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L294) *** @@ -231,7 +231,7 @@ listeners: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:123](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L123) +Defined in: [angular-form/src/tanstack-form-group.ts:116](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L116) *** @@ -241,7 +241,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:123](https://github.com/Tan mode: InputSignal<"value" | "array" | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:222](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L222) +Defined in: [angular-form/src/tanstack-form-group.ts:215](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L215) *** @@ -251,7 +251,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:222](https://github.com/Tan name: InputSignal; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:74](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L74) +Defined in: [angular-form/src/tanstack-form-group.ts:67](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L67) *** @@ -261,7 +261,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:74](https://github.com/TanS onGroupSubmit: InputSignal any | undefined> | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:158](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L158) +Defined in: [angular-form/src/tanstack-form-group.ts:151](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L151) *** @@ -271,7 +271,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:158](https://github.com/Tan onGroupSubmitInvalid: InputSignal void | undefined> | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:190](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L190) +Defined in: [angular-form/src/tanstack-form-group.ts:183](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L183) *** @@ -281,7 +281,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:190](https://github.com/Tan onSubmitMeta: InputSignal | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:156](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L156) +Defined in: [angular-form/src/tanstack-form-group.ts:149](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L149) *** @@ -291,7 +291,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:156](https://github.com/Tan options: Signal>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:257](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L257) +Defined in: [angular-form/src/tanstack-form-group.ts:250](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L250) *** @@ -301,7 +301,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:257](https://github.com/Tan tanstackFormGroup: InputSignal>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:85](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L85) +Defined in: [angular-form/src/tanstack-form-group.ts:78](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L78) *** @@ -313,7 +313,7 @@ validators: InputSignal< | undefined>; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:103](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L103) +Defined in: [angular-form/src/tanstack-form-group.ts:96](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L96) ## Accessors @@ -325,7 +325,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:103](https://github.com/Tan get api(): FormGroupApi; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:228](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L228) +Defined in: [angular-form/src/tanstack-form-group.ts:221](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L221) ##### Returns @@ -339,7 +339,7 @@ Defined in: [angular-form/src/tanstack-form-group.ts:228](https://github.com/Tan ngOnInit(): void; ``` -Defined in: [angular-form/src/tanstack-form-group.ts:319](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L319) +Defined in: [angular-form/src/tanstack-form-group.ts:312](https://github.com/TanStack/form/blob/main/packages/angular-form/src/tanstack-form-group.ts#L312) A callback method that is invoked immediately after the default change detector has checked the directive's diff --git a/docs/framework/lit/reference/classes/TanStackFormController.md b/docs/framework/lit/reference/classes/TanStackFormController.md index f337c52d6..a17dea408 100644 --- a/docs/framework/lit/reference/classes/TanStackFormController.md +++ b/docs/framework/lit/reference/classes/TanStackFormController.md @@ -3,7 +3,7 @@ id: TanStackFormController title: TanStackFormController --- -Defined in: [tanstack-form-controller.ts:226](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L226) +Defined in: [tanstack-form-controller.ts:218](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L218) ## Type Parameters @@ -67,7 +67,7 @@ Defined in: [tanstack-form-controller.ts:226](https://github.com/TanStack/form/b new TanStackFormController(host, config?): TanStackFormController; ``` -Defined in: [tanstack-form-controller.ts:255](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L255) +Defined in: [tanstack-form-controller.ts:247](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L247) #### Parameters @@ -91,7 +91,7 @@ Defined in: [tanstack-form-controller.ts:255](https://github.com/TanStack/form/b api: FormApi; ``` -Defined in: [tanstack-form-controller.ts:240](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L240) +Defined in: [tanstack-form-controller.ts:232](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L232) ## Methods @@ -101,7 +101,7 @@ Defined in: [tanstack-form-controller.ts:240](https://github.com/TanStack/form/b field(fieldConfig, render): object; ``` -Defined in: [tanstack-form-controller.ts:300](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L300) +Defined in: [tanstack-form-controller.ts:292](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L292) #### Type Parameters @@ -195,7 +195,7 @@ render: renderCallback(groupConfig, render): unknown; ``` -Defined in: [tanstack-form-controller.ts:390](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L390) +Defined in: [tanstack-form-controller.ts:378](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L378) #### Type Parameters @@ -277,7 +277,7 @@ Defined in: [tanstack-form-controller.ts:390](https://github.com/TanStack/form/b hostConnected(): void; ``` -Defined in: [tanstack-form-controller.ts:296](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L296) +Defined in: [tanstack-form-controller.ts:288](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L288) Called when the host is connected to the component tree. For custom element hosts, this corresponds to the `connectedCallback()` lifecycle, @@ -301,7 +301,7 @@ ReactiveController.hostConnected hostDisconnected(): void; ``` -Defined in: [tanstack-form-controller.ts:298](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L298) +Defined in: [tanstack-form-controller.ts:290](https://github.com/TanStack/form/blob/main/packages/lit-form/src/tanstack-form-controller.ts#L290) Called when the host is disconnected from the component tree. For custom element hosts, this corresponds to the `disconnectedCallback()` lifecycle, diff --git a/docs/framework/octane/reference/functions/createFormHook.md b/docs/framework/octane/reference/functions/createFormHook.md new file mode 100644 index 000000000..0b373adf6 --- /dev/null +++ b/docs/framework/octane/reference/functions/createFormHook.md @@ -0,0 +1,30 @@ +--- +id: createFormHook +title: createFormHook +--- + +```ts +function createFormHook(__namedParameters): CreateFormHookReturn; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:497](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L497) + +## Type Parameters + +### TComponents + +`TComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TFormComponents + +`TFormComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +## Parameters + +### \_\_namedParameters + +`CreateFormHookProps`\<`TComponents`, `TFormComponents`\> + +## Returns + +[`CreateFormHookReturn`](../interfaces/CreateFormHookReturn.md)\<`TComponents`, `TFormComponents`\> diff --git a/docs/framework/octane/reference/functions/createFormHookContexts.md b/docs/framework/octane/reference/functions/createFormHookContexts.md new file mode 100644 index 000000000..34fa245bd --- /dev/null +++ b/docs/framework/octane/reference/functions/createFormHookContexts.md @@ -0,0 +1,52 @@ +--- +id: createFormHookContexts +title: createFormHookContexts +--- + +```ts +function createFormHookContexts(): object; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:73](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L73) + +## Returns + +`object` + +### fieldContext + +```ts +fieldContext: Context; +``` + +### formContext + +```ts +formContext: Context; +``` + +### useFieldContext() + +```ts +useFieldContext: () => FieldApi; +``` + +#### Type Parameters + +##### TData + +`TData` + +#### Returns + +`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() + +```ts +useFormContext: () => OctaneFormExtendedApi, any, any, any, any, any, any, any, any, any, any, any>; +``` + +#### Returns + +[`OctaneFormExtendedApi`](../type-aliases/OctaneFormExtendedApi.md)\<`Record`\<`string`, `never`\>, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`\> diff --git a/docs/framework/octane/reference/functions/useField.md b/docs/framework/octane/reference/functions/useField.md new file mode 100644 index 000000000..c83939c8b --- /dev/null +++ b/docs/framework/octane/reference/functions/useField.md @@ -0,0 +1,120 @@ +--- +id: useField +title: useField +--- + +```ts +function useField(opts): FieldApi; +``` + +Defined in: [packages/octane-form/src/useField.tsrx.d.ts:95](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useField.tsrx.d.ts#L95) + +A hook for managing a field in a form. + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `string` + +### TData + +`TData` + +### TOnMount + +`TOnMount` *extends* `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnChange + +`TOnChange` *extends* `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnBlur + +`TOnBlur` *extends* `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnSubmit + +`TOnSubmit` *extends* `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnDynamic + +`TOnDynamic` *extends* `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TFormOnMount + +`TFormOnMount` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnChange + +`TFormOnChange` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnBlur + +`TFormOnBlur` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnServer + +`TFormOnServer` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TPatentSubmitMeta + +`TPatentSubmitMeta` + +## Parameters + +### opts + +[`UseFieldOptions`](../interfaces/UseFieldOptions.md)\<`TParentData`, `TName`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TFormOnMount`, `TFormOnChange`, `TFormOnChangeAsync`, `TFormOnBlur`, `TFormOnBlurAsync`, `TFormOnSubmit`, `TFormOnSubmitAsync`, `TFormOnDynamic`, `TFormOnDynamicAsync`, `TFormOnServer`, `TPatentSubmitMeta`\> + +An object with field options. + +## Returns + +`FieldApi`\<`TParentData`, `TName`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TFormOnMount`, `TFormOnChange`, `TFormOnChangeAsync`, `TFormOnBlur`, `TFormOnBlurAsync`, `TFormOnSubmit`, `TFormOnSubmitAsync`, `TFormOnDynamic`, `TFormOnDynamicAsync`, `TFormOnServer`, `TPatentSubmitMeta`\> + +The `FieldApi` instance for the specified field. diff --git a/docs/framework/octane/reference/functions/useFieldGroup.md b/docs/framework/octane/reference/functions/useFieldGroup.md new file mode 100644 index 000000000..99df8e1ef --- /dev/null +++ b/docs/framework/octane/reference/functions/useFieldGroup.md @@ -0,0 +1,107 @@ +--- +id: useFieldGroup +title: useFieldGroup +--- + +```ts +function useFieldGroup(opts): AppFieldExtendedOctaneFieldGroupApi; +``` + +Defined in: [packages/octane-form/src/useFieldGroup.tsrx.d.ts:75](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useFieldGroup.tsrx.d.ts#L75) + +## Type Parameters + +### TFormData + +`TFormData` + +### TFieldGroupData + +`TFieldGroupData` + +### TFields + +`TFields` *extends* + \| `string` + \| \{ \[K in string \| number \| symbol\]: DeepKeysOfType\ \} + +### TOnMount + +`TOnMount` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnChange + +`TOnChange` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnBlur + +`TOnBlur` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnSubmit + +`TOnSubmit` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnDynamic + +`TOnDynamic` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnServer + +`TOnServer` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TComponents + +`TComponents` *extends* `Record`\<`string`, `FieldGroupComponentType`\<`any`\>\> + +### TFormComponents + +`TFormComponents` *extends* `Record`\<`string`, `FieldGroupComponentType`\<`any`\>\> + +### TSubmitMeta + +`TSubmitMeta` = `never` + +## Parameters + +### opts + +#### defaultValues? + +`TFieldGroupData` + +#### fields + +`TFields` + +#### form + + \| `AppFieldExtendedOctaneFormApi`\<`TFormData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TOnServer`, `TSubmitMeta`, `TComponents`, `TFormComponents`\> + \| `AppFieldExtendedOctaneFieldGroupApi`\<`unknown`, `TFormData`, `string` \| `FieldsMap`\<`unknown`, `TFormData`\>, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `any`, `TSubmitMeta`, `TComponents`, `TFormComponents`\> + +#### formComponents + +`TFormComponents` + +#### onSubmitMeta? + +`TSubmitMeta` + +## Returns + +`AppFieldExtendedOctaneFieldGroupApi`\<`TFormData`, `TFieldGroupData`, `TFields`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TOnServer`, `TSubmitMeta`, `TComponents`, `TFormComponents`\> diff --git a/docs/framework/octane/reference/functions/useForm.md b/docs/framework/octane/reference/functions/useForm.md new file mode 100644 index 000000000..23a421e45 --- /dev/null +++ b/docs/framework/octane/reference/functions/useForm.md @@ -0,0 +1,74 @@ +--- +id: useForm +title: useForm +--- + +```ts +function useForm(opts?): OctaneFormExtendedApi; +``` + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:128](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L128) + +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 + +## Type Parameters + +### TFormData + +`TFormData` + +### TOnMount + +`TOnMount` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnChange + +`TOnChange` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnBlur + +`TOnBlur` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnSubmit + +`TOnSubmit` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnDynamic + +`TOnDynamic` *extends* `FormValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TOnServer + +`TOnServer` *extends* `FormAsyncValidateOrFn`\<`TFormData`\> \| `undefined` + +### TSubmitMeta + +`TSubmitMeta` + +## Parameters + +### opts? + +`FormOptions`\<`TFormData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TOnServer`, `TSubmitMeta`\> + +## Returns + +[`OctaneFormExtendedApi`](../type-aliases/OctaneFormExtendedApi.md)\<`TFormData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TOnServer`, `TSubmitMeta`\> diff --git a/docs/framework/octane/reference/functions/useFormGroup.md b/docs/framework/octane/reference/functions/useFormGroup.md new file mode 100644 index 000000000..7f41eb7fe --- /dev/null +++ b/docs/framework/octane/reference/functions/useFormGroup.md @@ -0,0 +1,126 @@ +--- +id: useFormGroup +title: useFormGroup +--- + +```ts +function useFormGroup(opts): FormGroupApi; +``` + +Defined in: [packages/octane-form/src/useFormGroup.tsrx.d.ts:101](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useFormGroup.tsrx.d.ts#L101) + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `string` + +### TData + +`TData` + +### TOnMount + +`TOnMount` *extends* `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnChange + +`TOnChange` *extends* `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnChangeAsync + +`TOnChangeAsync` *extends* + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + \| `undefined` + +### TOnBlur + +`TOnBlur` *extends* `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnBlurAsync + +`TOnBlurAsync` *extends* + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + \| `undefined` + +### TOnSubmit + +`TOnSubmit` *extends* `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + \| `undefined` + +### TOnDynamic + +`TOnDynamic` *extends* `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> \| `undefined` + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + \| `undefined` + +### TSubmitMeta + +`TSubmitMeta` + +### TFormOnMount + +`TFormOnMount` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnChange + +`TFormOnChange` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnBlur + +`TFormOnBlur` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `FormValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TFormOnServer + +`TFormOnServer` *extends* `FormAsyncValidateOrFn`\<`TParentData`\> \| `undefined` + +### TParentSubmitMeta + +`TParentSubmitMeta` + +## Parameters + +### 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`\> + +## Returns + +`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`\> diff --git a/docs/framework/octane/reference/functions/useSelector.md b/docs/framework/octane/reference/functions/useSelector.md new file mode 100644 index 000000000..00e6075e2 --- /dev/null +++ b/docs/framework/octane/reference/functions/useSelector.md @@ -0,0 +1,60 @@ +--- +id: useSelector +title: useSelector +--- + +```ts +function useSelector( + source, + selector?, + options?): TSelected; +``` + +Defined in: node\_modules/.pnpm/@tanstack+octane-store@0.12.2\_octane@0.2.16\_@typescript-eslint+types@8.70.0\_react-dom@1\_a2e82070231a666c986adf906edd0514/node\_modules/@tanstack/octane-store/src/useSelector.ts:48 + +Selects a slice of state from an atom or store and subscribes the component +to that selection. + +This is the primary Octane read hook for TanStack Store. It works with any +source that exposes `get()` and `subscribe()`, including atoms, readonly +atoms, stores, and readonly stores. + +Omit the selector to subscribe to the whole value. + +## Type Parameters + +### TSource + +`TSource` + +### TSelected + +`TSelected` = `NoInfer`\<`TSource`\> + +## Parameters + +### source + +`SelectionSource`\<`TSource`\> + +### selector? + +(`snapshot`) => `TSelected` + +### options? + +`UseSelectorOptions`\<`TSelected`\> + +## Returns + +`TSelected` + +## Examples + +```tsx +const count = useSelector(counterStore, (state) => state.count) +``` + +```tsx +const value = useSelector(countAtom) +``` diff --git a/docs/framework/octane/reference/index.md b/docs/framework/octane/reference/index.md new file mode 100644 index 000000000..b383db083 --- /dev/null +++ b/docs/framework/octane/reference/index.md @@ -0,0 +1,40 @@ +--- +id: "@tanstack/octane-form" +title: "@tanstack/octane-form" +--- + +## Interfaces + +- [CreateFormHookReturn](interfaces/CreateFormHookReturn.md) +- [OctaneFormApi](interfaces/OctaneFormApi.md) +- [SubscribeComponent](interfaces/SubscribeComponent.md) +- [UseFieldOptions](interfaces/UseFieldOptions.md) +- [UseFieldOptionsBound](interfaces/UseFieldOptionsBound.md) +- [WithFieldGroupProps](interfaces/WithFieldGroupProps.md) +- [WithFormProps](interfaces/WithFormProps.md) + +## Type Aliases + +- [FieldComponent](type-aliases/FieldComponent.md) +- [FormGroupComponent](type-aliases/FormGroupComponent.md) +- [LensFieldComponent](type-aliases/LensFieldComponent.md) +- [OctaneFormExtendedApi](type-aliases/OctaneFormExtendedApi.md) +- [ServerFormState](type-aliases/ServerFormState.md) +- [UseField](type-aliases/UseField.md) +- [UseFormGroup](type-aliases/UseFormGroup.md) + +## Variables + +- [Field](variables/Field.md) +- [FormGroup](variables/FormGroup.md) +- [useIsomorphicLayoutEffect](variables/useIsomorphicLayoutEffect.md) + +## Functions + +- [createFormHook](functions/createFormHook.md) +- [createFormHookContexts](functions/createFormHookContexts.md) +- [useField](functions/useField.md) +- [useFieldGroup](functions/useFieldGroup.md) +- [useForm](functions/useForm.md) +- [useFormGroup](functions/useFormGroup.md) +- [useSelector](functions/useSelector.md) diff --git a/docs/framework/octane/reference/interfaces/CreateFormHookReturn.md b/docs/framework/octane/reference/interfaces/CreateFormHookReturn.md new file mode 100644 index 000000000..edfa068e9 --- /dev/null +++ b/docs/framework/octane/reference/interfaces/CreateFormHookReturn.md @@ -0,0 +1,92 @@ +--- +id: CreateFormHookReturn +title: CreateFormHookReturn +--- + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:478](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L478) + +## Type Parameters + +### TComponents + +`TComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TFormComponents + +`TFormComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +## Properties + +### extendForm() + +```ts +extendForm: (extension) => CreateFormHookReturn; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:486](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L486) + +#### Type Parameters + +##### TNewField + +`TNewField` *extends* `FieldComponentExtension`\<`TComponents`\> + +##### TNewForm + +`TNewForm` *extends* `FormComponentExtension`\<`TFormComponents`\> + +#### Parameters + +##### extension + +###### fieldComponents? + +`TNewField` + +###### formComponents? + +`TNewForm` + +#### Returns + +`CreateFormHookReturn`\<`TComponents` & `TNewField`, `TFormComponents` & `TNewForm`\> + +*** + +### useAppForm + +```ts +useAppForm: UseAppForm; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:482](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L482) + +*** + +### useTypedAppFormContext + +```ts +useTypedAppFormContext: UseTypedAppFormContext; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:485](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L485) + +*** + +### withFieldGroup + +```ts +withFieldGroup: WithFieldGroup; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:484](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L484) + +*** + +### withForm + +```ts +withForm: WithForm; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:483](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L483) diff --git a/docs/framework/octane/reference/interfaces/OctaneFormApi.md b/docs/framework/octane/reference/interfaces/OctaneFormApi.md new file mode 100644 index 000000000..44d74f24a --- /dev/null +++ b/docs/framework/octane/reference/interfaces/OctaneFormApi.md @@ -0,0 +1,92 @@ +--- +id: OctaneFormApi +title: OctaneFormApi +--- + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:15](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L15) + +Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm` + +## Type Parameters + +### TFormData + +`TFormData` + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnServer + +`TOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TSubmitMeta + +`TSubmitMeta` + +## Properties + +### Field + +```ts +Field: FieldComponent; +``` + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:32](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L32) + +A component to render form fields. With this, you can render and manage individual form fields. + +*** + +### FormGroup + +```ts +FormGroup: FormGroupComponent; +``` + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:46](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L46) + +*** + +### Subscribe + +```ts +Subscribe: SubscribeComponent>; +``` + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:63](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L63) + +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. diff --git a/docs/framework/octane/reference/interfaces/SubscribeComponent.md b/docs/framework/octane/reference/interfaces/SubscribeComponent.md new file mode 100644 index 000000000..1ecc618e6 --- /dev/null +++ b/docs/framework/octane/reference/interfaces/SubscribeComponent.md @@ -0,0 +1,57 @@ +--- +id: SubscribeComponent +title: SubscribeComponent +--- + +Defined in: [packages/octane-form/src/types.ts:21](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L21) + +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. + +## Type Parameters + +### TState + +`TState` + +```ts +SubscribeComponent(props): unknown; +``` + +Defined in: [packages/octane-form/src/types.ts:22](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L22) + +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. + +## Type Parameters + +### TSelected + +`TSelected` = `NoInfer`\<`TState`\> + +### TChildren + +`TChildren` = `never` + +## Parameters + +### props + +#### children + + \| (`state`) => `unknown` + \| `TChildren` *extends* (...`args`) => `unknown` ? `never` : `TChildren` + +#### selector? + +(`state`) => `TSelected` + +## Returns + +`unknown` diff --git a/docs/framework/octane/reference/interfaces/UseFieldOptions.md b/docs/framework/octane/reference/interfaces/UseFieldOptions.md new file mode 100644 index 000000000..280273065 --- /dev/null +++ b/docs/framework/octane/reference/interfaces/UseFieldOptions.md @@ -0,0 +1,122 @@ +--- +id: UseFieldOptions +title: UseFieldOptions +--- + +Defined in: [packages/octane-form/src/types.ts:37](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L37) + +The field options. + +## 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` + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TSubmitMeta + +`TSubmitMeta` + +## Properties + +### mode? + +```ts +optional mode: "value" | "array"; +``` + +Defined in: [packages/octane-form/src/types.ts:31](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L31) + +#### Inherited from + +```ts +FieldOptionsMode.mode +``` diff --git a/docs/framework/octane/reference/interfaces/UseFieldOptionsBound.md b/docs/framework/octane/reference/interfaces/UseFieldOptionsBound.md new file mode 100644 index 000000000..d7f163794 --- /dev/null +++ b/docs/framework/octane/reference/interfaces/UseFieldOptionsBound.md @@ -0,0 +1,76 @@ +--- +id: UseFieldOptionsBound +title: UseFieldOptionsBound +--- + +Defined in: [packages/octane-form/src/types.ts:94](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L94) + +## Extends + +- `FieldOptions`\<`TParentData`, `TName`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`\>.`FieldOptionsMode` + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +## Properties + +### mode? + +```ts +optional mode: "value" | "array"; +``` + +Defined in: [packages/octane-form/src/types.ts:31](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L31) + +#### Inherited from + +```ts +FieldOptionsMode.mode +``` diff --git a/docs/framework/octane/reference/interfaces/WithFieldGroupProps.md b/docs/framework/octane/reference/interfaces/WithFieldGroupProps.md new file mode 100644 index 000000000..f23d9d384 --- /dev/null +++ b/docs/framework/octane/reference/interfaces/WithFieldGroupProps.md @@ -0,0 +1,52 @@ +--- +id: WithFieldGroupProps +title: WithFieldGroupProps +--- + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:216](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L216) + +## Extends + +- `BaseFormOptions`\<`TFieldGroupData`, `TSubmitMeta`\> + +## Type Parameters + +### TFieldGroupData + +`TFieldGroupData` + +### TFieldComponents + +`TFieldComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TFormComponents + +`TFormComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TSubmitMeta + +`TSubmitMeta` + +### TRenderProps + +`TRenderProps` *extends* `object` = `Record`\<`string`, `never`\> + +## Properties + +### props? + +```ts +optional props: TRenderProps; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:223](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L223) + +*** + +### render + +```ts +render: HookFunctionComponent & object>>; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:224](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L224) diff --git a/docs/framework/octane/reference/interfaces/WithFormProps.md b/docs/framework/octane/reference/interfaces/WithFormProps.md new file mode 100644 index 000000000..33ad2ad6b --- /dev/null +++ b/docs/framework/octane/reference/interfaces/WithFormProps.md @@ -0,0 +1,92 @@ +--- +id: WithFormProps +title: WithFormProps +--- + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:162](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L162) + +## Extends + +- `FormOptions`\<`TFormData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TOnServer`, `TSubmitMeta`\> + +## Type Parameters + +### TFormData + +`TFormData` + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnServer + +`TOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TSubmitMeta + +`TSubmitMeta` + +### TFieldComponents + +`TFieldComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TFormComponents + +`TFormComponents` *extends* `Record`\<`string`, `HookComponentType`\<`any`\>\> + +### TRenderProps + +`TRenderProps` *extends* `object` = `Record`\<`string`, `never`\> + +## Properties + +### props? + +```ts +optional props: TRenderProps; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:192](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L192) + +*** + +### render + +```ts +render: HookFunctionComponent & object>>; +``` + +Defined in: [packages/octane-form/src/createFormHook.tsrx.d.ts:193](https://github.com/TanStack/form/blob/main/packages/octane-form/src/createFormHook.tsrx.d.ts#L193) diff --git a/docs/framework/octane/reference/type-aliases/FieldComponent.md b/docs/framework/octane/reference/type-aliases/FieldComponent.md new file mode 100644 index 000000000..8f46a4a46 --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/FieldComponent.md @@ -0,0 +1,129 @@ +--- +id: FieldComponent +title: FieldComponent +--- + +```ts +type FieldComponent = ({ + children, + ...fieldOptions +}) => ReturnType; +``` + +Defined in: [packages/octane-form/src/useField.tsrx.d.ts:335](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useField.tsrx.d.ts#L335) + +A type alias representing a field component for a specific form data type. + +## Type Parameters + +### TParentData + +`TParentData` + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TPatentSubmitMeta + +`TPatentSubmitMeta` + +### ExtendedApi + +`ExtendedApi` = \{ +\} + +## Type Parameters + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +## Parameters + +### \{ + 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`\> + +## Returns + +`ReturnType`\<`FieldFunctionComponent`\> diff --git a/docs/framework/octane/reference/type-aliases/FormGroupComponent.md b/docs/framework/octane/reference/type-aliases/FormGroupComponent.md new file mode 100644 index 000000000..8858a793a --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/FormGroupComponent.md @@ -0,0 +1,139 @@ +--- +id: FormGroupComponent +title: FormGroupComponent +--- + +```ts +type FormGroupComponent = ({ + children, + ...formGroupOptions +}) => ReturnType; +``` + +Defined in: [packages/octane-form/src/useFormGroup.tsrx.d.ts:364](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useFormGroup.tsrx.d.ts#L364) + +## Type Parameters + +### TParentData + +`TParentData` + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TParentSubmitMeta + +`TParentSubmitMeta` + +### ExtendedApi + +`ExtendedApi` = \{ +\} + +## Type Parameters + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TSubmitMeta + +`TSubmitMeta` + +## Parameters + +### \{ + 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`\> + +## Returns + +`ReturnType`\<`FormGroupFunctionComponent`\> diff --git a/docs/framework/octane/reference/type-aliases/LensFieldComponent.md b/docs/framework/octane/reference/type-aliases/LensFieldComponent.md new file mode 100644 index 000000000..0ee342442 --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/LensFieldComponent.md @@ -0,0 +1,89 @@ +--- +id: LensFieldComponent +title: LensFieldComponent +--- + +```ts +type LensFieldComponent = ({ + children, + ...fieldOptions +}) => ReturnType; +``` + +Defined in: [packages/octane-form/src/useField.tsrx.d.ts:401](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useField.tsrx.d.ts#L401) + +A type alias representing a field component for a form lens data type. + +## Type Parameters + +### TLensData + +`TLensData` + +### TParentSubmitMeta + +`TParentSubmitMeta` + +### ExtendedApi + +`ExtendedApi` = \{ +\} + +## Type Parameters + +### TName + +`TName` *extends* `DeepKeys`\<`TLensData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TLensData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`unknown`, `string`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`unknown`, `string`, `TData`\> + +## Parameters + +### \{ + children, + ...fieldOptions +\} + +`Omit`\<`FieldComponentBoundProps`\<`unknown`, `string`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `undefined` \| `FormValidateOrFn`\<`unknown`\>, `undefined` \| `FormValidateOrFn`\<`unknown`\>, `undefined` \| `FormAsyncValidateOrFn`\<`unknown`\>, `undefined` \| `FormValidateOrFn`\<`unknown`\>, `undefined` \| `FormAsyncValidateOrFn`\<`unknown`\>, `undefined` \| `FormValidateOrFn`\<`unknown`\>, `undefined` \| `FormAsyncValidateOrFn`\<`unknown`\>, `undefined` \| `FormValidateOrFn`\<`unknown`\>, `undefined` \| `FormAsyncValidateOrFn`\<`unknown`\>, `undefined` \| `FormAsyncValidateOrFn`\<`unknown`\>, `TParentSubmitMeta`, `ExtendedApi`\>, `"name"` \| `"validators"`\> & `object` + +## Returns + +`ReturnType`\<`FieldFunctionComponent`\> diff --git a/docs/framework/octane/reference/type-aliases/OctaneFormExtendedApi.md b/docs/framework/octane/reference/type-aliases/OctaneFormExtendedApi.md new file mode 100644 index 000000000..dae78824f --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/OctaneFormExtendedApi.md @@ -0,0 +1,62 @@ +--- +id: OctaneFormExtendedApi +title: OctaneFormExtendedApi +--- + +```ts +type OctaneFormExtendedApi = FormApi & OctaneFormApi; +``` + +Defined in: [packages/octane-form/src/useForm.tsrx.d.ts:82](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useForm.tsrx.d.ts#L82) + +An extended version of the `FormApi` class that includes renderer-specific components from `OctaneFormApi` + +## Type Parameters + +### TFormData + +`TFormData` + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TFormData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TOnServer + +`TOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> + +### TSubmitMeta + +`TSubmitMeta` diff --git a/docs/framework/octane/reference/type-aliases/ServerFormState.md b/docs/framework/octane/reference/type-aliases/ServerFormState.md new file mode 100644 index 000000000..2d74dba42 --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/ServerFormState.md @@ -0,0 +1,20 @@ +--- +id: ServerFormState +title: ServerFormState +--- + +```ts +type ServerFormState = Pick, "values" | "errors" | "errorMap">; +``` + +Defined in: [packages/octane-form/src/types.ts:129](https://github.com/TanStack/form/blob/main/packages/octane-form/src/types.ts#L129) + +## Type Parameters + +### TFormData + +`TFormData` + +### TOnServer + +`TOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TFormData`\> diff --git a/docs/framework/octane/reference/type-aliases/UseField.md b/docs/framework/octane/reference/type-aliases/UseField.md new file mode 100644 index 000000000..c7f8e89d1 --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/UseField.md @@ -0,0 +1,120 @@ +--- +id: UseField +title: UseField +--- + +```ts +type UseField = (opts) => FieldApi; +``` + +Defined in: [packages/octane-form/src/useField.tsrx.d.ts:20](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useField.tsrx.d.ts#L20) + +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. + +## Type Parameters + +### TParentData + +`TParentData` + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TPatentSubmitMeta + +`TPatentSubmitMeta` + +## Type Parameters + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +## Parameters + +### opts + +[`UseFieldOptionsBound`](../interfaces/UseFieldOptionsBound.md)\<`TParentData`, `TName`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`\> + +## Returns + +`FieldApi`\<`TParentData`, `TName`, `TData`, `TOnMount`, `TOnChange`, `TOnChangeAsync`, `TOnBlur`, `TOnBlurAsync`, `TOnSubmit`, `TOnSubmitAsync`, `TOnDynamic`, `TOnDynamicAsync`, `TFormOnMount`, `TFormOnChange`, `TFormOnChangeAsync`, `TFormOnBlur`, `TFormOnBlurAsync`, `TFormOnSubmit`, `TFormOnSubmitAsync`, `TFormOnDynamic`, `TFormOnDynamicAsync`, `TFormOnServer`, `TPatentSubmitMeta`\> diff --git a/docs/framework/octane/reference/type-aliases/UseFormGroup.md b/docs/framework/octane/reference/type-aliases/UseFormGroup.md new file mode 100644 index 000000000..8d1e00dbf --- /dev/null +++ b/docs/framework/octane/reference/type-aliases/UseFormGroup.md @@ -0,0 +1,128 @@ +--- +id: UseFormGroup +title: UseFormGroup +--- + +```ts +type UseFormGroup = (opts) => FormGroupApi; +``` + +Defined in: [packages/octane-form/src/useFormGroup.tsrx.d.ts:15](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useFormGroup.tsrx.d.ts#L15) + +## Type Parameters + +### TParentData + +`TParentData` + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TParentSubmitMeta + +`TParentSubmitMeta` + +## Type Parameters + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TSubmitMeta + +`TSubmitMeta` + +## Parameters + +### 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`\> + +## Returns + +`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`\> diff --git a/docs/framework/octane/reference/variables/Field.md b/docs/framework/octane/reference/variables/Field.md new file mode 100644 index 000000000..e8c24107c --- /dev/null +++ b/docs/framework/octane/reference/variables/Field.md @@ -0,0 +1,124 @@ +--- +id: Field +title: Field +--- + +```ts +const Field: ({ + children, + ...fieldOptions +}) => ReturnType; +``` + +Defined in: [packages/octane-form/src/useField.tsrx.d.ts:486](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useField.tsrx.d.ts#L486) + +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. + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FieldValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* `undefined` \| `FieldAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TPatentSubmitMeta + +`TPatentSubmitMeta` + +## Parameters + +### \{ + 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`\> + +## Returns + +`ReturnType`\<`FieldFunctionComponent`\> diff --git a/docs/framework/octane/reference/variables/FormGroup.md b/docs/framework/octane/reference/variables/FormGroup.md new file mode 100644 index 000000000..f5bc27bf3 --- /dev/null +++ b/docs/framework/octane/reference/variables/FormGroup.md @@ -0,0 +1,132 @@ +--- +id: FormGroup +title: FormGroup +--- + +```ts +const FormGroup: ({ + children, + ...formGroupOptions +}) => ReturnType; +``` + +Defined in: [packages/octane-form/src/useFormGroup.tsrx.d.ts:432](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useFormGroup.tsrx.d.ts#L432) + +## Type Parameters + +### TParentData + +`TParentData` + +### TName + +`TName` *extends* `DeepKeys`\<`TParentData`\> + +### TData + +`TData` *extends* `DeepValue`\<`TParentData`, `TName`\> + +### TOnMount + +`TOnMount` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChange + +`TOnChange` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnChangeAsync + +`TOnChangeAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlur + +`TOnBlur` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnBlurAsync + +`TOnBlurAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmit + +`TOnSubmit` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnSubmitAsync + +`TOnSubmitAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamic + +`TOnDynamic` *extends* `undefined` \| `FormGroupValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TOnDynamicAsync + +`TOnDynamicAsync` *extends* + \| `undefined` + \| `FormGroupAsyncValidateOrFn`\<`TParentData`, `TName`, `TData`\> + +### TSubmitMeta + +`TSubmitMeta` + +### TFormOnMount + +`TFormOnMount` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChange + +`TFormOnChange` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnChangeAsync + +`TFormOnChangeAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnBlur + +`TFormOnBlur` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnBlurAsync + +`TFormOnBlurAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnSubmit + +`TFormOnSubmit` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnSubmitAsync + +`TFormOnSubmitAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnDynamic + +`TFormOnDynamic` *extends* `undefined` \| `FormValidateOrFn`\<`TParentData`\> + +### TFormOnDynamicAsync + +`TFormOnDynamicAsync` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TFormOnServer + +`TFormOnServer` *extends* `undefined` \| `FormAsyncValidateOrFn`\<`TParentData`\> + +### TParentSubmitMeta + +`TParentSubmitMeta` + +## Parameters + +### \{ + 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`\> + +## Returns + +`ReturnType`\<`FormGroupFunctionComponent`\> diff --git a/docs/framework/octane/reference/variables/useIsomorphicLayoutEffect.md b/docs/framework/octane/reference/variables/useIsomorphicLayoutEffect.md new file mode 100644 index 000000000..1ad059c8d --- /dev/null +++ b/docs/framework/octane/reference/variables/useIsomorphicLayoutEffect.md @@ -0,0 +1,28 @@ +--- +id: useIsomorphicLayoutEffect +title: useIsomorphicLayoutEffect +--- + +```ts +const useIsomorphicLayoutEffect: (fn, deps?, slot?) => void; +``` + +Defined in: [packages/octane-form/src/useIsomorphicLayoutEffect.ts:3](https://github.com/TanStack/form/blob/main/packages/octane-form/src/useIsomorphicLayoutEffect.ts#L3) + +## Parameters + +### fn + +`EffectFn` + +### deps? + +`any`[] | `null` + +### slot? + +`symbol` + +## Returns + +`void` diff --git a/docs/framework/preact/reference/functions/useField.md b/docs/framework/preact/reference/functions/useField.md index 1678afaf6..b1d22935a 100644 --- a/docs/framework/preact/reference/functions/useField.md +++ b/docs/framework/preact/reference/functions/useField.md @@ -7,7 +7,7 @@ title: useField function useField(opts): FieldApi; ``` -Defined in: [packages/preact-form/src/useField.tsx:104](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L104) +Defined in: [packages/preact-form/src/useField.tsx:100](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L100) A hook for managing a field in a form. diff --git a/docs/framework/preact/reference/functions/useFormGroup.md b/docs/framework/preact/reference/functions/useFormGroup.md index cb1e3beea..c4b36bf35 100644 --- a/docs/framework/preact/reference/functions/useFormGroup.md +++ b/docs/framework/preact/reference/functions/useFormGroup.md @@ -7,7 +7,7 @@ title: useFormGroup function useFormGroup(opts): FormGroupApi; ``` -Defined in: [packages/preact-form/src/useFormGroup.tsx:111](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L111) +Defined in: [packages/preact-form/src/useFormGroup.tsx:104](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L104) ## Type Parameters diff --git a/docs/framework/preact/reference/functions/useSelector.md b/docs/framework/preact/reference/functions/useSelector.md index 0172c96ba..7b33a5b74 100644 --- a/docs/framework/preact/reference/functions/useSelector.md +++ b/docs/framework/preact/reference/functions/useSelector.md @@ -10,7 +10,7 @@ function useSelector( options?): TSelected; ``` -Defined in: node\_modules/.pnpm/@tanstack+preact-store@0.13.1\_preact@10.29.2/node\_modules/@tanstack/preact-store/dist/useSelector.d.ts:29 +Defined in: node\_modules/.pnpm/@tanstack+preact-store@0.13.2\_preact@10.29.8/node\_modules/@tanstack/preact-store/dist/useSelector.d.ts:29 Selects a slice of state from an atom or store and subscribes the component to that selection. diff --git a/docs/framework/preact/reference/interfaces/UseFieldOptionsBound.md b/docs/framework/preact/reference/interfaces/UseFieldOptionsBound.md index 8ec3e5da8..3bce5282d 100644 --- a/docs/framework/preact/reference/interfaces/UseFieldOptionsBound.md +++ b/docs/framework/preact/reference/interfaces/UseFieldOptionsBound.md @@ -3,7 +3,7 @@ id: UseFieldOptionsBound title: UseFieldOptionsBound --- -Defined in: [packages/preact-form/src/types.ts:82](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L82) +Defined in: [packages/preact-form/src/types.ts:78](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L78) ## Extends diff --git a/docs/framework/preact/reference/type-aliases/FieldComponent.md b/docs/framework/preact/reference/type-aliases/FieldComponent.md index 9ebe02f7d..a6f387df8 100644 --- a/docs/framework/preact/reference/type-aliases/FieldComponent.md +++ b/docs/framework/preact/reference/type-aliases/FieldComponent.md @@ -10,7 +10,7 @@ type FieldComponent ReturnType; ``` -Defined in: [packages/preact-form/src/useField.tsx:472](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L472) +Defined in: [packages/preact-form/src/useField.tsx:456](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L456) A type alias representing a field component for a specific form data type. diff --git a/docs/framework/preact/reference/type-aliases/FormGroupComponent.md b/docs/framework/preact/reference/type-aliases/FormGroupComponent.md index d46b0ce46..25ef60413 100644 --- a/docs/framework/preact/reference/type-aliases/FormGroupComponent.md +++ b/docs/framework/preact/reference/type-aliases/FormGroupComponent.md @@ -10,7 +10,7 @@ type FormGroupComponent ReturnType; ``` -Defined in: [packages/preact-form/src/useFormGroup.tsx:559](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L559) +Defined in: [packages/preact-form/src/useFormGroup.tsx:531](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L531) ## Type Parameters diff --git a/docs/framework/preact/reference/type-aliases/LensFieldComponent.md b/docs/framework/preact/reference/type-aliases/LensFieldComponent.md index 1d46c5808..3cc0f51a0 100644 --- a/docs/framework/preact/reference/type-aliases/LensFieldComponent.md +++ b/docs/framework/preact/reference/type-aliases/LensFieldComponent.md @@ -10,7 +10,7 @@ type LensFieldComponent = ReturnType; ``` -Defined in: [packages/preact-form/src/useField.tsx:547](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L547) +Defined in: [packages/preact-form/src/useField.tsx:523](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L523) A type alias representing a field component for a form lens data type. diff --git a/docs/framework/preact/reference/type-aliases/PropsWithChildren.md b/docs/framework/preact/reference/type-aliases/PropsWithChildren.md index 94fdc49e1..cdceae751 100644 --- a/docs/framework/preact/reference/type-aliases/PropsWithChildren.md +++ b/docs/framework/preact/reference/type-aliases/PropsWithChildren.md @@ -7,7 +7,7 @@ title: PropsWithChildren type PropsWithChildren

= P & object; ``` -Defined in: [packages/preact-form/src/types.ts:141](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L141) +Defined in: [packages/preact-form/src/types.ts:133](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L133) ## Type Declaration diff --git a/docs/framework/preact/reference/type-aliases/ServerFormState.md b/docs/framework/preact/reference/type-aliases/ServerFormState.md index 368fb0a5a..c183e270a 100644 --- a/docs/framework/preact/reference/type-aliases/ServerFormState.md +++ b/docs/framework/preact/reference/type-aliases/ServerFormState.md @@ -7,7 +7,7 @@ title: ServerFormState type ServerFormState = Pick, "values" | "errors" | "errorMap">; ``` -Defined in: [packages/preact-form/src/types.ts:121](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L121) +Defined in: [packages/preact-form/src/types.ts:113](https://github.com/TanStack/form/blob/main/packages/preact-form/src/types.ts#L113) ## Type Parameters diff --git a/docs/framework/preact/reference/variables/Field.md b/docs/framework/preact/reference/variables/Field.md index 257306059..d23f86690 100644 --- a/docs/framework/preact/reference/variables/Field.md +++ b/docs/framework/preact/reference/variables/Field.md @@ -7,7 +7,7 @@ title: Field const Field: (__namedParameters) => ComponentChildren; ``` -Defined in: [packages/preact-form/src/useField.tsx:637](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L637) +Defined in: [packages/preact-form/src/useField.tsx:609](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useField.tsx#L609) A function component that takes field options and a render function as children and returns a React component. diff --git a/docs/framework/preact/reference/variables/FormGroup.md b/docs/framework/preact/reference/variables/FormGroup.md index 72430f4c9..65a2e288d 100644 --- a/docs/framework/preact/reference/variables/FormGroup.md +++ b/docs/framework/preact/reference/variables/FormGroup.md @@ -7,7 +7,7 @@ title: FormGroup const FormGroup: (__namedParameters) => ComponentChildren; ``` -Defined in: [packages/preact-form/src/useFormGroup.tsx:639](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L639) +Defined in: [packages/preact-form/src/useFormGroup.tsx:600](https://github.com/TanStack/form/blob/main/packages/preact-form/src/useFormGroup.tsx#L600) ## Type Parameters diff --git a/docs/framework/preact/reference/variables/useStore.md b/docs/framework/preact/reference/variables/useStore.md index b94bfac78..573a966fc 100644 --- a/docs/framework/preact/reference/variables/useStore.md +++ b/docs/framework/preact/reference/variables/useStore.md @@ -7,7 +7,7 @@ title: useStore const useStore: (source, selector?, compare?) => TSelected; ``` -Defined in: node\_modules/.pnpm/@tanstack+preact-store@0.13.1\_preact@10.29.2/node\_modules/@tanstack/preact-store/dist/useStore.d.ts:12 +Defined in: node\_modules/.pnpm/@tanstack+preact-store@0.13.2\_preact@10.29.8/node\_modules/@tanstack/preact-store/dist/useStore.d.ts:12 Deprecated alias for [useSelector](../functions/useSelector.md). diff --git a/docs/framework/react/reference/functions/useField.md b/docs/framework/react/reference/functions/useField.md index 540fde644..ae0f3962c 100644 --- a/docs/framework/react/reference/functions/useField.md +++ b/docs/framework/react/reference/functions/useField.md @@ -7,7 +7,7 @@ title: useField function useField(opts): FieldApi; ``` -Defined in: [packages/react-form/src/useField.tsx:106](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L106) +Defined in: [packages/react-form/src/useField.tsx:102](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L102) A hook for managing a field in a form. diff --git a/docs/framework/react/reference/functions/useFormGroup.md b/docs/framework/react/reference/functions/useFormGroup.md index 3c8e88024..2d5b328a1 100644 --- a/docs/framework/react/reference/functions/useFormGroup.md +++ b/docs/framework/react/reference/functions/useFormGroup.md @@ -7,7 +7,7 @@ title: useFormGroup function useFormGroup(opts): FormGroupApi; ``` -Defined in: [packages/react-form/src/useFormGroup.tsx:113](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L113) +Defined in: [packages/react-form/src/useFormGroup.tsx:106](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L106) ## Type Parameters diff --git a/docs/framework/react/reference/functions/useSelector.md b/docs/framework/react/reference/functions/useSelector.md index 053e273c3..4d374d3c8 100644 --- a/docs/framework/react/reference/functions/useSelector.md +++ b/docs/framework/react/reference/functions/useSelector.md @@ -10,7 +10,7 @@ function useSelector( options?): TSelected; ``` -Defined in: node\_modules/.pnpm/@tanstack+react-store@0.11.0\_react-dom@19.1.0\_react@19.1.0\_\_react@19.1.0/node\_modules/@tanstack/react-store/dist/useSelector.d.ts:31 +Defined in: node\_modules/.pnpm/@tanstack+react-store@0.11.1\_react-dom@19.1.0\_react@19.1.0\_\_react@19.1.0/node\_modules/@tanstack/react-store/dist/useSelector.d.ts:31 Selects a slice of state from an atom or store and subscribes the component to that selection. diff --git a/docs/framework/react/reference/interfaces/UseFieldOptionsBound.md b/docs/framework/react/reference/interfaces/UseFieldOptionsBound.md index 910bb6e1f..bd1b57b4e 100644 --- a/docs/framework/react/reference/interfaces/UseFieldOptionsBound.md +++ b/docs/framework/react/reference/interfaces/UseFieldOptionsBound.md @@ -3,7 +3,7 @@ id: UseFieldOptionsBound title: UseFieldOptionsBound --- -Defined in: [packages/react-form/src/types.ts:81](https://github.com/TanStack/form/blob/main/packages/react-form/src/types.ts#L81) +Defined in: [packages/react-form/src/types.ts:77](https://github.com/TanStack/form/blob/main/packages/react-form/src/types.ts#L77) ## Extends diff --git a/docs/framework/react/reference/type-aliases/FieldComponent.md b/docs/framework/react/reference/type-aliases/FieldComponent.md index bdb244912..b5c3bd801 100644 --- a/docs/framework/react/reference/type-aliases/FieldComponent.md +++ b/docs/framework/react/reference/type-aliases/FieldComponent.md @@ -10,7 +10,7 @@ type FieldComponent ReturnType; ``` -Defined in: [packages/react-form/src/useField.tsx:480](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L480) +Defined in: [packages/react-form/src/useField.tsx:464](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L464) A type alias representing a field component for a specific form data type. diff --git a/docs/framework/react/reference/type-aliases/FormGroupComponent.md b/docs/framework/react/reference/type-aliases/FormGroupComponent.md index 7cea16091..6b3cb8ee9 100644 --- a/docs/framework/react/reference/type-aliases/FormGroupComponent.md +++ b/docs/framework/react/reference/type-aliases/FormGroupComponent.md @@ -10,7 +10,7 @@ type FormGroupComponent ReturnType; ``` -Defined in: [packages/react-form/src/useFormGroup.tsx:562](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L562) +Defined in: [packages/react-form/src/useFormGroup.tsx:534](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L534) ## Type Parameters diff --git a/docs/framework/react/reference/type-aliases/LensFieldComponent.md b/docs/framework/react/reference/type-aliases/LensFieldComponent.md index 23a2f7353..106b1b9e8 100644 --- a/docs/framework/react/reference/type-aliases/LensFieldComponent.md +++ b/docs/framework/react/reference/type-aliases/LensFieldComponent.md @@ -10,7 +10,7 @@ type LensFieldComponent = ReturnType; ``` -Defined in: [packages/react-form/src/useField.tsx:555](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L555) +Defined in: [packages/react-form/src/useField.tsx:531](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L531) A type alias representing a field component for a form lens data type. diff --git a/docs/framework/react/reference/type-aliases/ServerFormState.md b/docs/framework/react/reference/type-aliases/ServerFormState.md index b1caa5774..78729bde8 100644 --- a/docs/framework/react/reference/type-aliases/ServerFormState.md +++ b/docs/framework/react/reference/type-aliases/ServerFormState.md @@ -7,7 +7,7 @@ title: ServerFormState type ServerFormState = Pick, "values" | "errors" | "errorMap">; ``` -Defined in: [packages/react-form/src/types.ts:120](https://github.com/TanStack/form/blob/main/packages/react-form/src/types.ts#L120) +Defined in: [packages/react-form/src/types.ts:112](https://github.com/TanStack/form/blob/main/packages/react-form/src/types.ts#L112) ## Type Parameters diff --git a/docs/framework/react/reference/variables/Field.md b/docs/framework/react/reference/variables/Field.md index 24ad7900b..5b14c6d26 100644 --- a/docs/framework/react/reference/variables/Field.md +++ b/docs/framework/react/reference/variables/Field.md @@ -7,7 +7,7 @@ title: Field const Field: (__namedParameters) => ReactNode | Promise; ``` -Defined in: [packages/react-form/src/useField.tsx:645](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L645) +Defined in: [packages/react-form/src/useField.tsx:617](https://github.com/TanStack/form/blob/main/packages/react-form/src/useField.tsx#L617) A function component that takes field options and a render function as children and returns a React component. diff --git a/docs/framework/react/reference/variables/FormGroup.md b/docs/framework/react/reference/variables/FormGroup.md index a35f736cc..18e8f442b 100644 --- a/docs/framework/react/reference/variables/FormGroup.md +++ b/docs/framework/react/reference/variables/FormGroup.md @@ -7,7 +7,7 @@ title: FormGroup const FormGroup: (__namedParameters) => ReactNode | Promise; ``` -Defined in: [packages/react-form/src/useFormGroup.tsx:642](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L642) +Defined in: [packages/react-form/src/useFormGroup.tsx:603](https://github.com/TanStack/form/blob/main/packages/react-form/src/useFormGroup.tsx#L603) ## Type Parameters diff --git a/docs/framework/react/reference/variables/useStore.md b/docs/framework/react/reference/variables/useStore.md index c68281ded..af600704e 100644 --- a/docs/framework/react/reference/variables/useStore.md +++ b/docs/framework/react/reference/variables/useStore.md @@ -7,7 +7,7 @@ title: useStore const useStore: (source, selector?, compare?) => TSelected; ``` -Defined in: node\_modules/.pnpm/@tanstack+react-store@0.11.0\_react-dom@19.1.0\_react@19.1.0\_\_react@19.1.0/node\_modules/@tanstack/react-store/dist/useStore.d.ts:12 +Defined in: node\_modules/.pnpm/@tanstack+react-store@0.11.1\_react-dom@19.1.0\_react@19.1.0\_\_react@19.1.0/node\_modules/@tanstack/react-store/dist/useStore.d.ts:12 Deprecated alias for [useSelector](../functions/useSelector.md). diff --git a/docs/framework/solid/reference/functions/Field.md b/docs/framework/solid/reference/functions/Field.md index 0cd65eede..c6bdaa25f 100644 --- a/docs/framework/solid/reference/functions/Field.md +++ b/docs/framework/solid/reference/functions/Field.md @@ -7,7 +7,7 @@ title: Field function Field(props): Element; ``` -Defined in: [packages/solid-form/src/createField.tsx:660](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L660) +Defined in: [packages/solid-form/src/createField.tsx:632](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L632) ## Type Parameters diff --git a/docs/framework/solid/reference/functions/FormGroup.md b/docs/framework/solid/reference/functions/FormGroup.md index 60ae240f4..238c54db3 100644 --- a/docs/framework/solid/reference/functions/FormGroup.md +++ b/docs/framework/solid/reference/functions/FormGroup.md @@ -7,7 +7,7 @@ title: FormGroup function FormGroup(props): Element; ``` -Defined in: [packages/solid-form/src/createFormGroup.tsx:524](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L524) +Defined in: [packages/solid-form/src/createFormGroup.tsx:485](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L485) ## Type Parameters diff --git a/docs/framework/solid/reference/functions/createField.md b/docs/framework/solid/reference/functions/createField.md index 72d113996..a47f767b8 100644 --- a/docs/framework/solid/reference/functions/createField.md +++ b/docs/framework/solid/reference/functions/createField.md @@ -7,7 +7,7 @@ title: createField function createField(opts): () => FieldApi & SolidFieldApi; ``` -Defined in: [packages/solid-form/src/createField.tsx:218](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L218) +Defined in: [packages/solid-form/src/createField.tsx:214](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L214) ## Type Parameters diff --git a/docs/framework/solid/reference/functions/createFormGroup.md b/docs/framework/solid/reference/functions/createFormGroup.md index eb41f65a6..a87d3da95 100644 --- a/docs/framework/solid/reference/functions/createFormGroup.md +++ b/docs/framework/solid/reference/functions/createFormGroup.md @@ -7,7 +7,7 @@ title: createFormGroup function createFormGroup(opts): () => FormGroupApi; ``` -Defined in: [packages/solid-form/src/createFormGroup.tsx:127](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L127) +Defined in: [packages/solid-form/src/createFormGroup.tsx:120](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L120) ## Type Parameters diff --git a/docs/framework/solid/reference/functions/useSelector.md b/docs/framework/solid/reference/functions/useSelector.md index 51d0d73d0..25a265824 100644 --- a/docs/framework/solid/reference/functions/useSelector.md +++ b/docs/framework/solid/reference/functions/useSelector.md @@ -10,7 +10,7 @@ function useSelector( options?): Accessor; ``` -Defined in: node\_modules/.pnpm/@tanstack+solid-store@0.11.0\_solid-js@1.9.13/node\_modules/@tanstack/solid-store/dist/useSelector.d.ts:34 +Defined in: node\_modules/.pnpm/@tanstack+solid-store@0.11.1\_solid-js@1.9.15/node\_modules/@tanstack/solid-store/dist/useSelector.d.ts:34 Selects a slice of state from an atom or store and subscribes the component to that selection. diff --git a/docs/framework/solid/reference/interfaces/CreateFieldOptionsBound.md b/docs/framework/solid/reference/interfaces/CreateFieldOptionsBound.md index 573bf3562..60b2d81ae 100644 --- a/docs/framework/solid/reference/interfaces/CreateFieldOptionsBound.md +++ b/docs/framework/solid/reference/interfaces/CreateFieldOptionsBound.md @@ -3,7 +3,7 @@ id: CreateFieldOptionsBound title: CreateFieldOptionsBound --- -Defined in: [packages/solid-form/src/types.ts:80](https://github.com/TanStack/form/blob/main/packages/solid-form/src/types.ts#L80) +Defined in: [packages/solid-form/src/types.ts:76](https://github.com/TanStack/form/blob/main/packages/solid-form/src/types.ts#L76) ## Extends diff --git a/docs/framework/solid/reference/type-aliases/FieldComponent.md b/docs/framework/solid/reference/type-aliases/FieldComponent.md index 9f02739f0..d7a2c6fab 100644 --- a/docs/framework/solid/reference/type-aliases/FieldComponent.md +++ b/docs/framework/solid/reference/type-aliases/FieldComponent.md @@ -10,7 +10,7 @@ type FieldComponent JSX.Element; ``` -Defined in: [packages/solid-form/src/createField.tsx:414](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L414) +Defined in: [packages/solid-form/src/createField.tsx:402](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L402) A type alias representing a field component for a specific form data type. diff --git a/docs/framework/solid/reference/type-aliases/FormGroupComponent.md b/docs/framework/solid/reference/type-aliases/FormGroupComponent.md index 40e2df8bb..8560de96f 100644 --- a/docs/framework/solid/reference/type-aliases/FormGroupComponent.md +++ b/docs/framework/solid/reference/type-aliases/FormGroupComponent.md @@ -7,7 +7,7 @@ title: FormGroupComponent type FormGroupComponent = (props) => JSXElement; ``` -Defined in: [packages/solid-form/src/createFormGroup.tsx:350](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L350) +Defined in: [packages/solid-form/src/createFormGroup.tsx:329](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createFormGroup.tsx#L329) A type alias representing a form group component for a specific form data type. diff --git a/docs/framework/solid/reference/type-aliases/LensFieldComponent.md b/docs/framework/solid/reference/type-aliases/LensFieldComponent.md index 8f31433b7..7b294cfc8 100644 --- a/docs/framework/solid/reference/type-aliases/LensFieldComponent.md +++ b/docs/framework/solid/reference/type-aliases/LensFieldComponent.md @@ -10,7 +10,7 @@ type LensFieldComponent = JSX.Element; ``` -Defined in: [packages/solid-form/src/createField.tsx:575](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L575) +Defined in: [packages/solid-form/src/createField.tsx:551](https://github.com/TanStack/form/blob/main/packages/solid-form/src/createField.tsx#L551) A type alias representing a field component for a form lens data type. diff --git a/docs/framework/solid/reference/variables/useStore.md b/docs/framework/solid/reference/variables/useStore.md index 4c5e0bc52..b8a963f07 100644 --- a/docs/framework/solid/reference/variables/useStore.md +++ b/docs/framework/solid/reference/variables/useStore.md @@ -7,7 +7,7 @@ title: useStore const useStore: (source, selector?, compare?) => Accessor; ``` -Defined in: node\_modules/.pnpm/@tanstack+solid-store@0.11.0\_solid-js@1.9.13/node\_modules/@tanstack/solid-store/dist/useStore.d.ts:14 +Defined in: node\_modules/.pnpm/@tanstack+solid-store@0.11.1\_solid-js@1.9.15/node\_modules/@tanstack/solid-store/dist/useStore.d.ts:14 Deprecated alias for [useSelector](../functions/useSelector.md). diff --git a/docs/framework/vue/reference/functions/useField.md b/docs/framework/vue/reference/functions/useField.md index e0b034e06..795748b6a 100644 --- a/docs/framework/vue/reference/functions/useField.md +++ b/docs/framework/vue/reference/functions/useField.md @@ -7,7 +7,7 @@ title: useField function useField(opts): object; ``` -Defined in: [packages/vue-form/src/useField.tsx:189](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L189) +Defined in: [packages/vue-form/src/useField.tsx:185](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L185) ## Type Parameters diff --git a/docs/framework/vue/reference/functions/useFormGroup.md b/docs/framework/vue/reference/functions/useFormGroup.md index cc250b5e9..54836eb97 100644 --- a/docs/framework/vue/reference/functions/useFormGroup.md +++ b/docs/framework/vue/reference/functions/useFormGroup.md @@ -7,7 +7,7 @@ title: useFormGroup function useFormGroup(opts): object; ``` -Defined in: [packages/vue-form/src/useFormGroup.tsx:221](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L221) +Defined in: [packages/vue-form/src/useFormGroup.tsx:214](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L214) ## Type Parameters diff --git a/docs/framework/vue/reference/functions/useSelector.md b/docs/framework/vue/reference/functions/useSelector.md index fe1fdfc92..a0c98f321 100644 --- a/docs/framework/vue/reference/functions/useSelector.md +++ b/docs/framework/vue/reference/functions/useSelector.md @@ -10,7 +10,7 @@ function useSelector( options?): Readonly>; ``` -Defined in: node\_modules/.pnpm/@tanstack+vue-store@0.11.0\_vue@3.5.34\_typescript@5.9.3\_/node\_modules/@tanstack/vue-store/dist/useSelector.d.ts:33 +Defined in: node\_modules/.pnpm/@tanstack+vue-store@0.11.1\_vue@3.5.43\_typescript@5.9.3\_/node\_modules/@tanstack/vue-store/dist/useSelector.d.ts:33 Selects a slice of state from an atom or store and subscribes the component to that selection. diff --git a/docs/framework/vue/reference/interfaces/VueFieldApi.md b/docs/framework/vue/reference/interfaces/VueFieldApi.md index 4016e7e5d..018c90981 100644 --- a/docs/framework/vue/reference/interfaces/VueFieldApi.md +++ b/docs/framework/vue/reference/interfaces/VueFieldApi.md @@ -3,7 +3,7 @@ id: VueFieldApi title: VueFieldApi --- -Defined in: [packages/vue-form/src/useField.tsx:159](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L159) +Defined in: [packages/vue-form/src/useField.tsx:155](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L155) ## Type Parameters @@ -63,4 +63,4 @@ Defined in: [packages/vue-form/src/useField.tsx:159](https://github.com/TanStack Field: FieldComponent; ``` -Defined in: [packages/vue-form/src/useField.tsx:173](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L173) +Defined in: [packages/vue-form/src/useField.tsx:169](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L169) diff --git a/docs/framework/vue/reference/interfaces/VueFormGroupApi.md b/docs/framework/vue/reference/interfaces/VueFormGroupApi.md index 677c65273..afa52256f 100644 --- a/docs/framework/vue/reference/interfaces/VueFormGroupApi.md +++ b/docs/framework/vue/reference/interfaces/VueFormGroupApi.md @@ -3,7 +3,7 @@ id: VueFormGroupApi title: VueFormGroupApi --- -Defined in: [packages/vue-form/src/useFormGroup.tsx:191](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L191) +Defined in: [packages/vue-form/src/useFormGroup.tsx:184](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L184) ## Type Parameters @@ -63,4 +63,4 @@ Defined in: [packages/vue-form/src/useFormGroup.tsx:191](https://github.com/TanS FormGroup: FormGroupComponent; ``` -Defined in: [packages/vue-form/src/useFormGroup.tsx:205](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L205) +Defined in: [packages/vue-form/src/useFormGroup.tsx:198](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L198) diff --git a/docs/framework/vue/reference/type-aliases/FieldComponentBoundProps.md b/docs/framework/vue/reference/type-aliases/FieldComponentBoundProps.md index e33e21948..cf4a0df49 100644 --- a/docs/framework/vue/reference/type-aliases/FieldComponentBoundProps.md +++ b/docs/framework/vue/reference/type-aliases/FieldComponentBoundProps.md @@ -7,7 +7,7 @@ title: FieldComponentBoundProps type FieldComponentBoundProps = UseFieldOptionsBound; ``` -Defined in: [packages/vue-form/src/useField.tsx:444](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L444) +Defined in: [packages/vue-form/src/useField.tsx:432](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L432) ## Type Parameters diff --git a/docs/framework/vue/reference/type-aliases/FieldComponentProps.md b/docs/framework/vue/reference/type-aliases/FieldComponentProps.md index 212a14e33..3d3650d4f 100644 --- a/docs/framework/vue/reference/type-aliases/FieldComponentProps.md +++ b/docs/framework/vue/reference/type-aliases/FieldComponentProps.md @@ -7,7 +7,7 @@ title: FieldComponentProps type FieldComponentProps = UseFieldOptions; ``` -Defined in: [packages/vue-form/src/useField.tsx:386](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L386) +Defined in: [packages/vue-form/src/useField.tsx:378](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L378) ## Type Parameters diff --git a/docs/framework/vue/reference/type-aliases/FormGroupComponentBoundProps.md b/docs/framework/vue/reference/type-aliases/FormGroupComponentBoundProps.md index 72750c90e..83504d719 100644 --- a/docs/framework/vue/reference/type-aliases/FormGroupComponentBoundProps.md +++ b/docs/framework/vue/reference/type-aliases/FormGroupComponentBoundProps.md @@ -7,7 +7,7 @@ title: FormGroupComponentBoundProps type FormGroupComponentBoundProps = FormGroupOptions; ``` -Defined in: [packages/vue-form/src/useFormGroup.tsx:384](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L384) +Defined in: [packages/vue-form/src/useFormGroup.tsx:363](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L363) ## Type Parameters diff --git a/docs/framework/vue/reference/type-aliases/FormGroupComponentProps.md b/docs/framework/vue/reference/type-aliases/FormGroupComponentProps.md index bce3f5bd2..989555430 100644 --- a/docs/framework/vue/reference/type-aliases/FormGroupComponentProps.md +++ b/docs/framework/vue/reference/type-aliases/FormGroupComponentProps.md @@ -7,7 +7,7 @@ title: FormGroupComponentProps type FormGroupComponentProps = FormGroupApiOptions; ``` -Defined in: [packages/vue-form/src/useFormGroup.tsx:318](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L318) +Defined in: [packages/vue-form/src/useFormGroup.tsx:304](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L304) ## Type Parameters diff --git a/docs/framework/vue/reference/variables/Field.md b/docs/framework/vue/reference/variables/Field.md index 4114e57f7..7f6626359 100644 --- a/docs/framework/vue/reference/variables/Field.md +++ b/docs/framework/vue/reference/variables/Field.md @@ -20,7 +20,7 @@ const Field: ; ``` -Defined in: [packages/vue-form/src/useField.tsx:480](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L480) +Defined in: [packages/vue-form/src/useField.tsx:464](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useField.tsx#L464) ## Parameters diff --git a/docs/framework/vue/reference/variables/FormGroup.md b/docs/framework/vue/reference/variables/FormGroup.md index 8bb5526f2..35574dbe4 100644 --- a/docs/framework/vue/reference/variables/FormGroup.md +++ b/docs/framework/vue/reference/variables/FormGroup.md @@ -20,7 +20,7 @@ const FormGroup: ; ``` -Defined in: [packages/vue-form/src/useFormGroup.tsx:450](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L450) +Defined in: [packages/vue-form/src/useFormGroup.tsx:422](https://github.com/TanStack/form/blob/main/packages/vue-form/src/useFormGroup.tsx#L422) ## Parameters diff --git a/docs/framework/vue/reference/variables/useStore.md b/docs/framework/vue/reference/variables/useStore.md index 59c7e1df9..5945e5d52 100644 --- a/docs/framework/vue/reference/variables/useStore.md +++ b/docs/framework/vue/reference/variables/useStore.md @@ -7,7 +7,7 @@ title: useStore const useStore: (source, selector?, compare?) => Readonly>; ``` -Defined in: node\_modules/.pnpm/@tanstack+vue-store@0.11.0\_vue@3.5.34\_typescript@5.9.3\_/node\_modules/@tanstack/vue-store/dist/useStore.d.ts:14 +Defined in: node\_modules/.pnpm/@tanstack+vue-store@0.11.1\_vue@3.5.43\_typescript@5.9.3\_/node\_modules/@tanstack/vue-store/dist/useStore.d.ts:14 Deprecated alias for [useSelector](../functions/useSelector.md). diff --git a/docs/reference/classes/FieldApi.md b/docs/reference/classes/FieldApi.md index 0510de519..2fc775700 100644 --- a/docs/reference/classes/FieldApi.md +++ b/docs/reference/classes/FieldApi.md @@ -3,7 +3,7 @@ id: FieldApi title: FieldApi --- -Defined in: [packages/form-core/src/FieldApi.ts:520](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L520) +Defined in: [packages/form-core/src/FieldApi.ts:494](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L494) A class representing the API for managing a form field. @@ -115,7 +115,7 @@ the `new FieldApi` constructor. new FieldApi(opts): FieldApi; ``` -Defined in: [packages/form-core/src/FieldApi.ts:712](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L712) +Defined in: [packages/form-core/src/FieldApi.ts:673](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L673) Initializes a new `FieldApi` instance. @@ -137,7 +137,7 @@ Initializes a new `FieldApi` instance. form: FormApi; ``` -Defined in: [packages/form-core/src/FieldApi.ts:612](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L612) +Defined in: [packages/form-core/src/FieldApi.ts:573](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L573) A reference to the form API instance. @@ -155,7 +155,7 @@ FieldLikeAPI.form name: TName; ``` -Defined in: [packages/form-core/src/FieldApi.ts:640](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L640) +Defined in: [packages/form-core/src/FieldApi.ts:601](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L601) The field name. @@ -173,7 +173,7 @@ FieldLikeAPI.name options: FieldApiOptions; ``` -Defined in: [packages/form-core/src/FieldApi.ts:644](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L644) +Defined in: [packages/form-core/src/FieldApi.ts:605](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L605) The field options. @@ -191,7 +191,7 @@ FieldLikeAPI.options store: ReadonlyStore>; ``` -Defined in: [packages/form-core/src/FieldApi.ts:672](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L672) +Defined in: [packages/form-core/src/FieldApi.ts:633](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L633) The field state store. @@ -209,7 +209,7 @@ FieldLikeAPI.store timeoutIds: object; ``` -Defined in: [packages/form-core/src/FieldApi.ts:703](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L703) +Defined in: [packages/form-core/src/FieldApi.ts:664](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L664) #### formListeners @@ -239,7 +239,7 @@ validations: Record | null>; get state(): FieldLikeState; ``` -Defined in: [packages/form-core/src/FieldApi.ts:700](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L700) +Defined in: [packages/form-core/src/FieldApi.ts:661](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L661) The current field state. @@ -255,7 +255,7 @@ The current field state. clearValues(options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1214](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1214) +Defined in: [packages/form-core/src/FieldApi.ts:1175](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1175) Clear all values from the array. @@ -277,7 +277,7 @@ Clear all values from the array. getInfo(): FieldInfo; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1100](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1100) +Defined in: [packages/form-core/src/FieldApi.ts:1061](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1061) Gets the field information object. @@ -299,7 +299,7 @@ FieldLikeAPI.getInfo getMeta(): FieldLikeMeta; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1064](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1064) +Defined in: [packages/form-core/src/FieldApi.ts:1025](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1025) #### Returns @@ -319,7 +319,7 @@ FieldLikeAPI.getMeta getValue(): TData; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1041](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1041) +Defined in: [packages/form-core/src/FieldApi.ts:1002](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1002) Gets the current field value. @@ -339,7 +339,7 @@ Use `field.state.value` instead. handleBlur(): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1739](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1739) +Defined in: [packages/form-core/src/FieldApi.ts:1700](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1700) Handles the blur event. @@ -355,7 +355,7 @@ Handles the blur event. handleChange(updater): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1732](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1732) +Defined in: [packages/form-core/src/FieldApi.ts:1693](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1693) Handles the change event. @@ -380,7 +380,7 @@ insertValue( options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1123](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1123) +Defined in: [packages/form-core/src/FieldApi.ts:1084](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1084) Inserts a value at the specified index, shifting the subsequent values to the right. @@ -410,7 +410,7 @@ Inserts a value at the specified index, shifting the subsequent values to the ri mount(): () => void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:859](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L859) +Defined in: [packages/form-core/src/FieldApi.ts:820](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L820) Mounts the field instance to the form. @@ -443,7 +443,7 @@ moveValue( options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1198](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1198) +Defined in: [packages/form-core/src/FieldApi.ts:1159](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1159) Moves the value at the first specified index to the second specified index. @@ -475,7 +475,7 @@ parseValueWithSchema(schema): | undefined; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1782](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1782) +Defined in: [packages/form-core/src/FieldApi.ts:1743](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1743) Parses the field's value with the given schema and returns issues (if any). This method does NOT set any internal errors. @@ -503,7 +503,7 @@ parseValueWithSchemaAsync(schema): Promise< | undefined>; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1794](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1794) +Defined in: [packages/form-core/src/FieldApi.ts:1755](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1755) Parses the field's value with the given schema and returns issues (if any). This method does NOT set any internal errors. @@ -530,7 +530,7 @@ The standard schema to parse this field's value with. pushValue(value, options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1105](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1105) +Defined in: [packages/form-core/src/FieldApi.ts:1066](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1066) Pushes a new value to the field. @@ -556,7 +556,7 @@ Pushes a new value to the field. removeValue(index, options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1163](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1163) +Defined in: [packages/form-core/src/FieldApi.ts:1124](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1124) Removes a value at the specified index. @@ -585,7 +585,7 @@ replaceValue( options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1143](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1143) +Defined in: [packages/form-core/src/FieldApi.ts:1104](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1104) Replaces a value at the specified index. @@ -615,7 +615,7 @@ Replaces a value at the specified index. setErrorMap(errorMap): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1755](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1755) +Defined in: [packages/form-core/src/FieldApi.ts:1716](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1716) Updates the field's errorMap @@ -637,7 +637,7 @@ Updates the field's errorMap setMeta(updater): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1069](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1069) +Defined in: [packages/form-core/src/FieldApi.ts:1030](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1030) Sets the field metadata. @@ -665,7 +665,7 @@ FieldLikeAPI.setMeta setValue(updater, options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1048](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1048) +Defined in: [packages/form-core/src/FieldApi.ts:1009](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1009) Sets the field value and run the `change` validator. @@ -700,7 +700,7 @@ swapValues( options?): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1178](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1178) +Defined in: [packages/form-core/src/FieldApi.ts:1139](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1139) Swaps the values at the specified indices. @@ -730,7 +730,7 @@ Swaps the values at the specified indices. update(opts): void; ``` -Defined in: [packages/form-core/src/FieldApi.ts:990](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L990) +Defined in: [packages/form-core/src/FieldApi.ts:951](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L951) Updates the field instance with new options. @@ -752,7 +752,7 @@ Updates the field instance with new options. validate(cause, opts?): unknown[] | Promise; ``` -Defined in: [packages/form-core/src/FieldApi.ts:1615](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1615) +Defined in: [packages/form-core/src/FieldApi.ts:1576](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1576) Validates the field value. diff --git a/docs/reference/classes/FormApi.md b/docs/reference/classes/FormApi.md index 65eb5f338..e81fd8d30 100644 --- a/docs/reference/classes/FormApi.md +++ b/docs/reference/classes/FormApi.md @@ -3,7 +3,7 @@ id: FormApi title: FormApi --- -Defined in: [packages/form-core/src/FormApi.ts:954](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L954) +Defined in: [packages/form-core/src/FormApi.ts:952](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L952) A class representing the Form API. It handles the logic and interactions with the form state. @@ -69,7 +69,7 @@ However, if you need to create a new instance manually, you can do so by calling new FormApi(opts?): FormApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:1073](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1073) +Defined in: [packages/form-core/src/FormApi.ts:1071](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1071) Constructs a new `FormApi` instance with the given form options. @@ -91,7 +91,7 @@ Constructs a new `FormApi` instance with the given form options. baseStore: Store>; ``` -Defined in: [packages/form-core/src/FormApi.ts:986](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L986) +Defined in: [packages/form-core/src/FormApi.ts:984](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L984) *** @@ -101,7 +101,7 @@ Defined in: [packages/form-core/src/FormApi.ts:986](https://github.com/TanStack/ fieldInfo: Partial, FieldInfo>> = {}; ``` -Defined in: [packages/form-core/src/FormApi.ts:1042](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1042) +Defined in: [packages/form-core/src/FormApi.ts:1040](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1040) A record of field information for each field in the form. @@ -113,7 +113,7 @@ A record of field information for each field in the form. fieldMetaDerived: Store, AnyFieldLikeMeta>>>; ``` -Defined in: [packages/form-core/src/FormApi.ts:1001](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1001) +Defined in: [packages/form-core/src/FormApi.ts:999](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L999) *** @@ -123,7 +123,7 @@ Defined in: [packages/form-core/src/FormApi.ts:1001](https://github.com/TanStack formGroupApis: Set; ``` -Defined in: [packages/form-core/src/FormApi.ts:1048](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1048) +Defined in: [packages/form-core/src/FormApi.ts:1046](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1046) The set of currently-mounted `FormGroupApi` instances belonging to this form. Used by `FieldApi.validate` to cascade field-level changes @@ -137,7 +137,7 @@ into the validators of any group that encompasses the field. formGroupMetaDerived: ReadonlyStore>; ``` -Defined in: [packages/form-core/src/FormApi.ts:1023](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1023) +Defined in: [packages/form-core/src/FormApi.ts:1021](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1021) A derived store of every mounted `FormGroupApi`'s `meta`, keyed by group name. Mirrors `fieldMetaDerived` for fields: per-group `meta` @@ -153,7 +153,7 @@ from a `FormGroupApi.store` instance stay minimal. options: FormOptions = {}; ``` -Defined in: [packages/form-core/src/FormApi.ts:971](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L971) +Defined in: [packages/form-core/src/FormApi.ts:969](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L969) The options for the form. @@ -165,7 +165,7 @@ The options for the form. store: ReadonlyStore>; ``` -Defined in: [packages/form-core/src/FormApi.ts:1024](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1024) +Defined in: [packages/form-core/src/FormApi.ts:1022](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1022) ## Accessors @@ -177,7 +177,7 @@ Defined in: [packages/form-core/src/FormApi.ts:1024](https://github.com/TanStack get formId(): string; ``` -Defined in: [packages/form-core/src/FormApi.ts:1629](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1629) +Defined in: [packages/form-core/src/FormApi.ts:1625](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1625) ##### Returns @@ -193,7 +193,7 @@ Defined in: [packages/form-core/src/FormApi.ts:1629](https://github.com/TanStack get state(): FormState; ``` -Defined in: [packages/form-core/src/FormApi.ts:1049](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1049) +Defined in: [packages/form-core/src/FormApi.ts:1047](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1047) ##### Returns @@ -207,7 +207,7 @@ Defined in: [packages/form-core/src/FormApi.ts:1049](https://github.com/TanStack _handleSubmit(submitMeta?): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2420](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2420) +Defined in: [packages/form-core/src/FormApi.ts:2413](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2413) Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks. @@ -229,7 +229,7 @@ Handles the form submission, performs validation, and calls the appropriate onSu clearFieldValues(field, options?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2903](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2903) +Defined in: [packages/form-core/src/FormApi.ts:2896](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2896) Clear all values within an array field. @@ -267,7 +267,7 @@ FormLikeAPI.clearFieldValues deleteField(field): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2691](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2691) +Defined in: [packages/form-core/src/FormApi.ts:2684](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2684) #### Type Parameters @@ -299,7 +299,7 @@ FormLikeAPI.deleteField getAllErrors(): object; ``` -Defined in: [packages/form-core/src/FormApi.ts:3026](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3026) +Defined in: [packages/form-core/src/FormApi.ts:3019](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3019) Returns form and field level errors @@ -352,7 +352,7 @@ errors: NonNullable< getFieldInfo(field): FieldInfo; ``` -Defined in: [packages/form-core/src/FormApi.ts:2595](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2595) +Defined in: [packages/form-core/src/FormApi.ts:2588](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2588) Gets the field info of the specified field. @@ -380,7 +380,7 @@ Gets the field info of the specified field. getFieldMeta(field): AnyFieldLikeMeta | undefined; ``` -Defined in: [packages/form-core/src/FormApi.ts:2577](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2577) +Defined in: [packages/form-core/src/FormApi.ts:2570](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2570) Gets the metadata of the specified field. @@ -414,7 +414,7 @@ FormLikeAPI.getFieldMeta getFieldValue(field): DeepValue; ``` -Defined in: [packages/form-core/src/FormApi.ts:2570](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2570) +Defined in: [packages/form-core/src/FormApi.ts:2563](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2563) Gets the value of the specified field. @@ -448,7 +448,7 @@ FormLikeAPI.getFieldValue getFormGroupMeta(name): AnyFormGroupMeta | undefined; ``` -Defined in: [packages/form-core/src/FormApi.ts:2588](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2588) +Defined in: [packages/form-core/src/FormApi.ts:2581](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2581) Gets the derived `meta` of the form group registered at the given name. Mirrors `getFieldMeta` for fields. Returns `undefined` if no @@ -474,7 +474,7 @@ name. Mirrors `getFieldMeta` for fields. Returns `undefined` if no handleSubmit(): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2411](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2411) +Defined in: [packages/form-core/src/FormApi.ts:2404](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2404) Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks. @@ -494,7 +494,7 @@ FormLikeAPI.handleSubmit handleSubmit(submitMeta): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2412](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2412) +Defined in: [packages/form-core/src/FormApi.ts:2405](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2405) ##### Parameters @@ -524,7 +524,7 @@ insertFieldValue( options?): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2731](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2731) +Defined in: [packages/form-core/src/FormApi.ts:2724](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2724) #### Type Parameters @@ -568,7 +568,7 @@ FormLikeAPI.insertFieldValue mount(): () => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:1658](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1658) +Defined in: [packages/form-core/src/FormApi.ts:1654](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1654) #### Returns @@ -592,7 +592,7 @@ moveFieldValues( options?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2871](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2871) +Defined in: [packages/form-core/src/FormApi.ts:2864](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2864) Moves the value at the first specified index to the second specified index within an array field. @@ -643,7 +643,7 @@ parseValuesWithSchema(schema): | undefined; ``` -Defined in: [packages/form-core/src/FormApi.ts:3092](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3092) +Defined in: [packages/form-core/src/FormApi.ts:3085](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3085) Parses the form's values with a given standard schema and returns issues (if any). This method does NOT set any internal errors. @@ -677,7 +677,7 @@ parseValuesWithSchemaAsync(schema): Promise< | undefined>; ``` -Defined in: [packages/form-core/src/FormApi.ts:3104](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3104) +Defined in: [packages/form-core/src/FormApi.ts:3097](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L3097) Parses the form's values with a given standard schema and returns issues (if any). This method does NOT set any internal errors. @@ -710,7 +710,7 @@ pushFieldValue( options?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2715](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2715) +Defined in: [packages/form-core/src/FormApi.ts:2708](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2708) Pushes a value into an array field. @@ -755,7 +755,7 @@ removeFieldValue( options?): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2799](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2799) +Defined in: [packages/form-core/src/FormApi.ts:2792](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2792) Removes a value from an array field at the specified index. @@ -801,7 +801,7 @@ replaceFieldValue( options?): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:2768](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2768) +Defined in: [packages/form-core/src/FormApi.ts:2761](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2761) Replaces a value into an array field at the specified index. @@ -847,7 +847,7 @@ FormLikeAPI.replaceFieldValue reset(values?, opts?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:1810](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1810) +Defined in: [packages/form-core/src/FormApi.ts:1806](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1806) Resets the form state to the default values. If values are provided, the form will be reset to those values instead and the default values will be updated. @@ -880,7 +880,7 @@ Optional options to control the reset behavior. resetField(field): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2938](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2938) +Defined in: [packages/form-core/src/FormApi.ts:2931](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2931) Resets the field value and meta to default state @@ -914,7 +914,7 @@ FormLikeAPI.resetField resetFieldMeta(fieldMeta): Partial>; ``` -Defined in: [packages/form-core/src/FormApi.ts:2635](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2635) +Defined in: [packages/form-core/src/FormApi.ts:2628](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2628) resets every field's meta @@ -942,7 +942,7 @@ resets every field's meta setErrorMap(errorMap): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2962](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2962) +Defined in: [packages/form-core/src/FormApi.ts:2955](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2955) Updates the form's errorMap @@ -964,7 +964,7 @@ Updates the form's errorMap setFieldMeta(field, updater): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2614](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2614) +Defined in: [packages/form-core/src/FormApi.ts:2607](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2607) Updates the metadata of the specified field. @@ -1005,7 +1005,7 @@ setFieldValue( opts?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2651](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2651) +Defined in: [packages/form-core/src/FormApi.ts:2644](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2644) Sets the value of the specified field and optionally updates the touched state. @@ -1051,7 +1051,7 @@ swapFieldValues( options?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:2839](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2839) +Defined in: [packages/form-core/src/FormApi.ts:2832](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L2832) Swaps the values at the specified indices within an array field. @@ -1097,7 +1097,7 @@ FormLikeAPI.swapFieldValues update(options?): void; ``` -Defined in: [packages/form-core/src/FormApi.ts:1732](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1732) +Defined in: [packages/form-core/src/FormApi.ts:1728](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1728) Updates the form options and form state. @@ -1119,7 +1119,7 @@ Updates the form options and form state. validateAllFields(cause): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:1856](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1856) +Defined in: [packages/form-core/src/FormApi.ts:1852](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1852) Validates all fields according to the FIELD level validators. This will ignore FORM level validators, use form.validate({ValidationCause}) for a complete validation @@ -1151,7 +1151,7 @@ validateArrayFieldsStartingFrom( cause): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:1892](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1892) +Defined in: [packages/form-core/src/FormApi.ts:1888](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1888) Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type. @@ -1193,7 +1193,7 @@ FormLikeAPI.validateArrayFieldsStartingFrom validateField(field, cause): any[] | Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:1933](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1933) +Defined in: [packages/form-core/src/FormApi.ts:1929](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1929) Validates a specified field in the form using the correct handlers for a given validation type. diff --git a/docs/reference/classes/FormGroupApi.md b/docs/reference/classes/FormGroupApi.md index bae71aa89..1005d4bb6 100644 --- a/docs/reference/classes/FormGroupApi.md +++ b/docs/reference/classes/FormGroupApi.md @@ -3,7 +3,7 @@ id: FormGroupApi title: FormGroupApi --- -Defined in: [packages/form-core/src/FormGroupApi.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L970) +Defined in: [packages/form-core/src/FormGroupApi.ts:898](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L898) ## Type Parameters @@ -119,7 +119,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:970](https://github.com/TanS new FormGroupApi(opts): FormGroupApi; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1217](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1217) +Defined in: [packages/form-core/src/FormGroupApi.ts:1132](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1132) #### Parameters @@ -139,7 +139,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:1217](https://github.com/Tan form: FormApi; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1079](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1079) +Defined in: [packages/form-core/src/FormGroupApi.ts:994](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L994) A reference to the form API instance. @@ -157,7 +157,7 @@ FieldLikeAPI.form name: TName; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1108](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1108) +Defined in: [packages/form-core/src/FormGroupApi.ts:1023](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1023) The field name. @@ -175,7 +175,7 @@ FieldLikeAPI.name options: FormGroupApiOptions; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1112](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1112) +Defined in: [packages/form-core/src/FormGroupApi.ts:1027](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1027) The field options. @@ -193,7 +193,7 @@ FieldLikeAPI.options store: ReadonlyStore>; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1141](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1141) +Defined in: [packages/form-core/src/FormGroupApi.ts:1056](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1056) The field state store. @@ -211,7 +211,7 @@ FieldLikeAPI.store timeoutIds: object; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1199](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1199) +Defined in: [packages/form-core/src/FormGroupApi.ts:1114](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1114) #### formListeners @@ -241,7 +241,7 @@ validations: Record | null>; get state(): FormGroupStoreState; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1169](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1169) +Defined in: [packages/form-core/src/FormGroupApi.ts:1084](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1084) The current field state. @@ -257,7 +257,7 @@ The current field state. _handleSubmit(submitMeta?): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2404](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2404) +Defined in: [packages/form-core/src/FormGroupApi.ts:2316](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2316) Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks. @@ -279,7 +279,7 @@ Handles the form submission, performs validation, and calls the appropriate onSu areRelatedFieldsValid(): boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2293](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2293) +Defined in: [packages/form-core/src/FormGroupApi.ts:2205](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2205) #### Returns @@ -293,7 +293,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:2293](https://github.com/Tan clearFieldValues(field): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2274](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2274) +Defined in: [packages/form-core/src/FormGroupApi.ts:2186](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2186) #### Type Parameters @@ -325,7 +325,7 @@ FormLikeAPI.clearFieldValues deleteField(field): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2229](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2229) +Defined in: [packages/form-core/src/FormGroupApi.ts:2141](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2141) #### Type Parameters @@ -357,7 +357,7 @@ FormLikeAPI.deleteField getFieldMeta(field): AnyFieldLikeMeta | undefined; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2209](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2209) +Defined in: [packages/form-core/src/FormGroupApi.ts:2121](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2121) #### Type Parameters @@ -389,7 +389,7 @@ FormLikeAPI.getFieldMeta getFieldValue(field): DeepValue; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2203](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2203) +Defined in: [packages/form-core/src/FormGroupApi.ts:2115](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2115) #### Type Parameters @@ -421,7 +421,7 @@ FormLikeAPI.getFieldValue getInfo(): FieldInfo; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1636](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1636) +Defined in: [packages/form-core/src/FormGroupApi.ts:1551](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1551) Gets the field information object. @@ -443,7 +443,7 @@ FieldLikeAPI.getInfo getMeta(): FormGroupMeta; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1600](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1600) +Defined in: [packages/form-core/src/FormGroupApi.ts:1515](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1515) #### Returns @@ -465,7 +465,7 @@ FieldLikeAPI.getMeta handleSubmit(): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2395](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2395) +Defined in: [packages/form-core/src/FormGroupApi.ts:2307](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2307) Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks. @@ -485,7 +485,7 @@ FormLikeAPI.handleSubmit handleSubmit(submitMeta): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2396](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2396) +Defined in: [packages/form-core/src/FormGroupApi.ts:2308](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2308) ##### Parameters @@ -514,7 +514,7 @@ insertFieldValue( value): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2242](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2242) +Defined in: [packages/form-core/src/FormGroupApi.ts:2154](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2154) #### Type Parameters @@ -554,7 +554,7 @@ FormLikeAPI.insertFieldValue mount(): () => void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1447](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1447) +Defined in: [packages/form-core/src/FormGroupApi.ts:1362](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1362) #### Returns @@ -583,7 +583,7 @@ moveFieldValues( toIndex): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2266](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2266) +Defined in: [packages/form-core/src/FormGroupApi.ts:2178](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2178) #### Type Parameters @@ -623,7 +623,7 @@ FormLikeAPI.moveFieldValues pushFieldValue(field, value): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2235](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2235) +Defined in: [packages/form-core/src/FormGroupApi.ts:2147](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2147) #### Type Parameters @@ -659,7 +659,7 @@ FormLikeAPI.pushFieldValue removeFieldValue(field, index): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2286](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2286) +Defined in: [packages/form-core/src/FormGroupApi.ts:2198](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2198) #### Type Parameters @@ -698,7 +698,7 @@ replaceFieldValue( value): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2250](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2250) +Defined in: [packages/form-core/src/FormGroupApi.ts:2162](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2162) #### Type Parameters @@ -738,7 +738,7 @@ FormLikeAPI.replaceFieldValue resetField(field): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2280](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2280) +Defined in: [packages/form-core/src/FormGroupApi.ts:2192](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2192) #### Type Parameters @@ -770,7 +770,7 @@ FormLikeAPI.resetField setFieldMeta(field, updater): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2215](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2215) +Defined in: [packages/form-core/src/FormGroupApi.ts:2127](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2127) #### Type Parameters @@ -806,7 +806,7 @@ FormLikeAPI.setFieldMeta setFieldValue(field, value): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2222](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2222) +Defined in: [packages/form-core/src/FormGroupApi.ts:2134](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2134) #### Type Parameters @@ -842,7 +842,7 @@ FormLikeAPI.setFieldValue setMeta(updater): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1605](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1605) +Defined in: [packages/form-core/src/FormGroupApi.ts:1520](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1520) Sets the field metadata. @@ -870,7 +870,7 @@ FieldLikeAPI.setMeta setValue(updater, options?): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1584](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1584) +Defined in: [packages/form-core/src/FormGroupApi.ts:1499](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1499) Sets the field value and run the `change` validator. @@ -905,7 +905,7 @@ swapFieldValues( index2): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2258](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2258) +Defined in: [packages/form-core/src/FormGroupApi.ts:2170](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2170) #### Type Parameters @@ -945,7 +945,7 @@ FormLikeAPI.swapFieldValues update(opts): void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:1356](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1356) +Defined in: [packages/form-core/src/FormGroupApi.ts:1271](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L1271) Updates the field instance with new options. @@ -967,7 +967,7 @@ Updates the field instance with new options. validate(cause, opts?): unknown[] | Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2302](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2302) +Defined in: [packages/form-core/src/FormGroupApi.ts:2214](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2214) Validates the form group and all related children. @@ -1005,7 +1005,7 @@ FieldLikeAPI.validate validateAllFields(cause): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2158](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2158) +Defined in: [packages/form-core/src/FormGroupApi.ts:2070](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2070) Validates all fields according to the FIELD level validators. This will ignore FORM level validators, use form.validate({ValidationCause}) for a complete validation @@ -1037,7 +1037,7 @@ validateArrayFieldsStartingFrom( cause): Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2186](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2186) +Defined in: [packages/form-core/src/FormGroupApi.ts:2098](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2098) #### Type Parameters @@ -1077,7 +1077,7 @@ FormLikeAPI.validateArrayFieldsStartingFrom validateField(field, cause): any[] | Promise; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:2196](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2196) +Defined in: [packages/form-core/src/FormGroupApi.ts:2108](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L2108) #### Type Parameters diff --git a/docs/reference/functions/createFieldMap.md b/docs/reference/functions/createFieldMap.md index 1d73a22e1..011459a23 100644 --- a/docs/reference/functions/createFieldMap.md +++ b/docs/reference/functions/createFieldMap.md @@ -7,7 +7,7 @@ title: createFieldMap function createFieldMap(values): { [K in string | number | symbol]: K }; ``` -Defined in: [packages/form-core/src/utils.ts:614](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L614) +Defined in: [packages/form-core/src/utils.ts:613](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L613) ## Type Parameters diff --git a/docs/reference/functions/deepCopy.md b/docs/reference/functions/deepCopy.md index 00bcea75a..f663d27d0 100644 --- a/docs/reference/functions/deepCopy.md +++ b/docs/reference/functions/deepCopy.md @@ -7,7 +7,7 @@ title: deepCopy function deepCopy(obj): T; ``` -Defined in: [packages/form-core/src/utils.ts:694](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L694) +Defined in: [packages/form-core/src/utils.ts:693](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L693) ## Type Parameters diff --git a/docs/reference/functions/evaluate.md b/docs/reference/functions/evaluate.md index 34fe8eaa0..668e406da 100644 --- a/docs/reference/functions/evaluate.md +++ b/docs/reference/functions/evaluate.md @@ -7,7 +7,7 @@ title: evaluate function evaluate(objA, objB): boolean; ``` -Defined in: [packages/form-core/src/utils.ts:483](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L483) +Defined in: [packages/form-core/src/utils.ts:482](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L482) ## Type Parameters diff --git a/docs/reference/functions/isGlobalFormValidationError.md b/docs/reference/functions/isGlobalFormValidationError.md index cac7afd65..8619bb756 100644 --- a/docs/reference/functions/isGlobalFormValidationError.md +++ b/docs/reference/functions/isGlobalFormValidationError.md @@ -7,7 +7,7 @@ title: isGlobalFormValidationError function isGlobalFormValidationError(error): error is GlobalFormValidationError; ``` -Defined in: [packages/form-core/src/utils.ts:477](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L477) +Defined in: [packages/form-core/src/utils.ts:476](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L476) ## Parameters diff --git a/docs/reference/functions/uuid.md b/docs/reference/functions/uuid.md index 164fea770..1a31587cb 100644 --- a/docs/reference/functions/uuid.md +++ b/docs/reference/functions/uuid.md @@ -7,7 +7,7 @@ title: uuid function uuid(): string; ``` -Defined in: [packages/form-core/src/utils.ts:653](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L653) +Defined in: [packages/form-core/src/utils.ts:652](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L652) ## Returns diff --git a/docs/reference/interfaces/BaseFormOptions.md b/docs/reference/interfaces/BaseFormOptions.md index d7db71639..e448ffe94 100644 --- a/docs/reference/interfaces/BaseFormOptions.md +++ b/docs/reference/interfaces/BaseFormOptions.md @@ -3,7 +3,7 @@ id: BaseFormOptions title: BaseFormOptions --- -Defined in: [packages/form-core/src/FormApi.ts:436](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L436) +Defined in: [packages/form-core/src/FormApi.ts:434](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L434) An object representing the base properties of a form, unrelated to any validators @@ -29,7 +29,7 @@ An object representing the base properties of a form, unrelated to any validator optional defaultValues: TFormData; ``` -Defined in: [packages/form-core/src/FormApi.ts:440](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L440) +Defined in: [packages/form-core/src/FormApi.ts:438](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L438) Set initial values for your form. @@ -41,6 +41,6 @@ Set initial values for your form. optional onSubmitMeta: TSubmitMeta; ``` -Defined in: [packages/form-core/src/FormApi.ts:444](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L444) +Defined in: [packages/form-core/src/FormApi.ts:442](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L442) onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props diff --git a/docs/reference/interfaces/FieldApiOptions.md b/docs/reference/interfaces/FieldApiOptions.md index 3a7b5bb27..e5d6d6bcc 100644 --- a/docs/reference/interfaces/FieldApiOptions.md +++ b/docs/reference/interfaces/FieldApiOptions.md @@ -3,7 +3,7 @@ id: FieldApiOptions title: FieldApiOptions --- -Defined in: [packages/form-core/src/FieldApi.ts:383](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L383) +Defined in: [packages/form-core/src/FieldApi.ts:370](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L370) ## Extends @@ -111,7 +111,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:383](https://github.com/TanStack optional asyncAlways: boolean; ``` -Defined in: [packages/form-core/src/types.ts:982](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L982) +Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) If `true`, always run async validation, even if there are errors emitted during synchronous validation. @@ -129,7 +129,7 @@ FieldLikeApiOptions.asyncAlways optional asyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) +Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) The default time to debounce async validation if there is not a more specific debounce time passed. @@ -147,7 +147,7 @@ FieldLikeApiOptions.asyncDebounceMs optional defaultMeta: Partial>; ``` -Defined in: [packages/form-core/src/types.ts:986](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L986) +Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) An optional object with default metadata for the field. @@ -165,7 +165,7 @@ FieldLikeApiOptions.defaultMeta optional defaultValue: NoInfer; ``` -Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) +Defined in: [packages/form-core/src/types.ts:966](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L966) An optional default value for the field. @@ -183,7 +183,7 @@ FieldLikeApiOptions.defaultValue optional disableErrorFlat: boolean; ``` -Defined in: [packages/form-core/src/types.ts:1014](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1014) +Defined in: [packages/form-core/src/types.ts:1006](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1006) Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases. @@ -201,7 +201,7 @@ FieldLikeApiOptions.disableErrorFlat form: FormApi; ``` -Defined in: [packages/form-core/src/types.ts:1094](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1094) +Defined in: [packages/form-core/src/types.ts:1082](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1082) #### Inherited from @@ -217,7 +217,7 @@ FieldLikeApiOptions.form optional listeners: FieldListeners; ``` -Defined in: [packages/form-core/src/FieldApi.ts:325](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L325) +Defined in: [packages/form-core/src/FieldApi.ts:316](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L316) A list of listeners which attach to the corresponding events @@ -235,7 +235,7 @@ FieldExtraOptions.listeners name: TName; ``` -Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) +Defined in: [packages/form-core/src/types.ts:962](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L962) The field name. The type will be `DeepKeys` to ensure your name is a deep key of the parent dataset. @@ -253,7 +253,7 @@ FieldLikeApiOptions.name optional validators: FieldValidators; ``` -Defined in: [packages/form-core/src/FieldApi.ts:307](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L307) +Defined in: [packages/form-core/src/FieldApi.ts:298](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L298) A list of validators to pass to the field diff --git a/docs/reference/interfaces/FieldListeners.md b/docs/reference/interfaces/FieldListeners.md index d04ca0d0f..0df4e5c28 100644 --- a/docs/reference/interfaces/FieldListeners.md +++ b/docs/reference/interfaces/FieldListeners.md @@ -3,7 +3,7 @@ id: FieldListeners title: FieldListeners --- -Defined in: [packages/form-core/src/FieldApi.ts:267](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L267) +Defined in: [packages/form-core/src/FieldApi.ts:262](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L262) ## Type Parameters @@ -27,7 +27,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:267](https://github.com/TanStack optional onBlur: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:274](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L274) +Defined in: [packages/form-core/src/FieldApi.ts:269](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L269) *** @@ -37,7 +37,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:274](https://github.com/TanStack optional onBlurDebounceMs: number; ``` -Defined in: [packages/form-core/src/FieldApi.ts:275](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L275) +Defined in: [packages/form-core/src/FieldApi.ts:270](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L270) *** @@ -47,7 +47,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:275](https://github.com/TanStack optional onChange: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:272](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L272) +Defined in: [packages/form-core/src/FieldApi.ts:267](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L267) *** @@ -57,7 +57,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:272](https://github.com/TanStack optional onChangeDebounceMs: number; ``` -Defined in: [packages/form-core/src/FieldApi.ts:273](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L273) +Defined in: [packages/form-core/src/FieldApi.ts:268](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L268) *** @@ -67,7 +67,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:273](https://github.com/TanStack optional onGroupSubmit: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:279](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L279) +Defined in: [packages/form-core/src/FieldApi.ts:274](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L274) *** @@ -77,7 +77,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:279](https://github.com/TanStack optional onMount: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:276](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L276) +Defined in: [packages/form-core/src/FieldApi.ts:271](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L271) *** @@ -87,7 +87,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:276](https://github.com/TanStack optional onSubmit: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:278](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L278) +Defined in: [packages/form-core/src/FieldApi.ts:273](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L273) *** @@ -97,4 +97,4 @@ Defined in: [packages/form-core/src/FieldApi.ts:278](https://github.com/TanStack optional onUnmount: FieldListenerFn; ``` -Defined in: [packages/form-core/src/FieldApi.ts:277](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L277) +Defined in: [packages/form-core/src/FieldApi.ts:272](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L272) diff --git a/docs/reference/interfaces/FieldOptions.md b/docs/reference/interfaces/FieldOptions.md index dc8ba45af..e25d89fab 100644 --- a/docs/reference/interfaces/FieldOptions.md +++ b/docs/reference/interfaces/FieldOptions.md @@ -3,7 +3,7 @@ id: FieldOptions title: FieldOptions --- -Defined in: [packages/form-core/src/FieldApi.ts:331](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L331) +Defined in: [packages/form-core/src/FieldApi.ts:322](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L322) An object type representing the options for a field in a form. @@ -69,7 +69,7 @@ An object type representing the options for a field in a form. optional asyncAlways: boolean; ``` -Defined in: [packages/form-core/src/types.ts:982](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L982) +Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) If `true`, always run async validation, even if there are errors emitted during synchronous validation. @@ -87,7 +87,7 @@ FieldLikeOptions.asyncAlways optional asyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) +Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) The default time to debounce async validation if there is not a more specific debounce time passed. @@ -105,7 +105,7 @@ FieldLikeOptions.asyncDebounceMs optional defaultMeta: Partial>; ``` -Defined in: [packages/form-core/src/types.ts:986](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L986) +Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) An optional object with default metadata for the field. @@ -123,7 +123,7 @@ FieldLikeOptions.defaultMeta optional defaultValue: NoInfer; ``` -Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) +Defined in: [packages/form-core/src/types.ts:966](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L966) An optional default value for the field. @@ -141,7 +141,7 @@ FieldLikeOptions.defaultValue optional disableErrorFlat: boolean; ``` -Defined in: [packages/form-core/src/types.ts:1014](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1014) +Defined in: [packages/form-core/src/types.ts:1006](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1006) Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases. @@ -159,7 +159,7 @@ FieldLikeOptions.disableErrorFlat optional listeners: FieldListeners; ``` -Defined in: [packages/form-core/src/FieldApi.ts:325](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L325) +Defined in: [packages/form-core/src/FieldApi.ts:316](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L316) A list of listeners which attach to the corresponding events @@ -177,7 +177,7 @@ FieldExtraOptions.listeners name: TName; ``` -Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) +Defined in: [packages/form-core/src/types.ts:962](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L962) The field name. The type will be `DeepKeys` to ensure your name is a deep key of the parent dataset. @@ -195,7 +195,7 @@ FieldLikeOptions.name optional validators: FieldValidators; ``` -Defined in: [packages/form-core/src/FieldApi.ts:307](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L307) +Defined in: [packages/form-core/src/FieldApi.ts:298](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L298) A list of validators to pass to the field diff --git a/docs/reference/interfaces/FieldValidators.md b/docs/reference/interfaces/FieldValidators.md index 69f81c39c..2200e72a5 100644 --- a/docs/reference/interfaces/FieldValidators.md +++ b/docs/reference/interfaces/FieldValidators.md @@ -3,7 +3,7 @@ id: FieldValidators title: FieldValidators --- -Defined in: [packages/form-core/src/FieldApi.ts:179](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L179) +Defined in: [packages/form-core/src/FieldApi.ts:178](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L178) ## Type Parameters @@ -63,7 +63,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:179](https://github.com/TanStack optional onBlur: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FieldApi.ts:232](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L232) +Defined in: [packages/form-core/src/FieldApi.ts:227](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L227) An optional function, that runs on the blur event of input. @@ -81,7 +81,7 @@ z.string().min(1) optional onBlurAsync: TOnBlurAsync; ``` -Defined in: [packages/form-core/src/FieldApi.ts:238](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L238) +Defined in: [packages/form-core/src/FieldApi.ts:233](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L233) An optional property similar to `onBlur` but async validation. @@ -99,7 +99,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) optional onBlurAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FieldApi.ts:245](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L245) +Defined in: [packages/form-core/src/FieldApi.ts:240](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L240) An optional number to represent how long the `onBlurAsync` should wait before running @@ -113,7 +113,7 @@ If set to a number larger than 0, will debounce the async validation event by th optional onBlurListenTo: DeepKeys[]; ``` -Defined in: [packages/form-core/src/FieldApi.ts:249](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L249) +Defined in: [packages/form-core/src/FieldApi.ts:244](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L244) An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes @@ -125,7 +125,7 @@ An optional list of field names that should trigger this field's `onBlur` and `o optional onChange: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FieldApi.ts:210](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L210) +Defined in: [packages/form-core/src/FieldApi.ts:205](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L205) An optional function, that runs on the change event of input. @@ -143,7 +143,7 @@ z.string().min(1) optional onChangeAsync: TOnChangeAsync; ``` -Defined in: [packages/form-core/src/FieldApi.ts:216](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L216) +Defined in: [packages/form-core/src/FieldApi.ts:211](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L211) An optional property similar to `onChange` but async validation @@ -161,7 +161,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) optional onChangeAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FieldApi.ts:222](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L222) +Defined in: [packages/form-core/src/FieldApi.ts:217](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L217) An optional number to represent how long the `onChangeAsync` should wait before running @@ -175,7 +175,7 @@ If set to a number larger than 0, will debounce the async validation event by th optional onChangeListenTo: DeepKeys[]; ``` -Defined in: [packages/form-core/src/FieldApi.ts:226](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L226) +Defined in: [packages/form-core/src/FieldApi.ts:221](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L221) An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes @@ -187,7 +187,7 @@ An optional list of field names that should trigger this field's `onChange` and optional onDynamic: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FieldApi.ts:262](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L262) +Defined in: [packages/form-core/src/FieldApi.ts:257](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L257) *** @@ -197,7 +197,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:262](https://github.com/TanStack optional onDynamicAsync: TOnDynamicAsync; ``` -Defined in: [packages/form-core/src/FieldApi.ts:263](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L263) +Defined in: [packages/form-core/src/FieldApi.ts:258](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L258) *** @@ -207,7 +207,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:263](https://github.com/TanStack optional onDynamicAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FieldApi.ts:264](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L264) +Defined in: [packages/form-core/src/FieldApi.ts:259](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L259) *** @@ -217,7 +217,7 @@ Defined in: [packages/form-core/src/FieldApi.ts:264](https://github.com/TanStack optional onMount: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FieldApi.ts:204](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L204) +Defined in: [packages/form-core/src/FieldApi.ts:199](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L199) An optional function, that runs on the mount event of input. @@ -229,7 +229,7 @@ An optional function, that runs on the mount event of input. optional onSubmit: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FieldApi.ts:255](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L255) +Defined in: [packages/form-core/src/FieldApi.ts:250](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L250) An optional function, that runs on the submit event of form. @@ -247,7 +247,7 @@ z.string().min(1) optional onSubmitAsync: TOnSubmitAsync; ``` -Defined in: [packages/form-core/src/FieldApi.ts:261](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L261) +Defined in: [packages/form-core/src/FieldApi.ts:256](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L256) An optional property similar to `onSubmit` but async validation. diff --git a/docs/reference/interfaces/FormGroupApiOptions.md b/docs/reference/interfaces/FormGroupApiOptions.md index fde097519..dc5c8008f 100644 --- a/docs/reference/interfaces/FormGroupApiOptions.md +++ b/docs/reference/interfaces/FormGroupApiOptions.md @@ -3,7 +3,7 @@ id: FormGroupApiOptions title: FormGroupApiOptions --- -Defined in: [packages/form-core/src/FormGroupApi.ts:562](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L562) +Defined in: [packages/form-core/src/FormGroupApi.ts:529](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L529) ## Extends @@ -123,7 +123,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:562](https://github.com/TanS optional asyncAlways: boolean; ``` -Defined in: [packages/form-core/src/types.ts:982](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L982) +Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) If `true`, always run async validation, even if there are errors emitted during synchronous validation. @@ -139,7 +139,7 @@ If `true`, always run async validation, even if there are errors emitted during optional asyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) +Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) The default time to debounce async validation if there is not a more specific debounce time passed. @@ -155,7 +155,7 @@ The default time to debounce async validation if there is not a more specific de optional canSubmitWhenInvalid: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:381](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L381) +Defined in: [packages/form-core/src/FormGroupApi.ts:361](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L361) If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined. @@ -171,7 +171,7 @@ If true, allows the form to be submitted in an invalid state i.e. canSubmit will optional defaultMeta: Partial>; ``` -Defined in: [packages/form-core/src/types.ts:986](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L986) +Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) An optional object with default metadata for the field. @@ -187,7 +187,7 @@ An optional object with default metadata for the field. optional defaultState: FormGroupState; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:388](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L388) +Defined in: [packages/form-core/src/FormGroupApi.ts:368](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L368) #### Inherited from @@ -201,7 +201,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:388](https://github.com/TanS optional defaultValue: NoInfer; ``` -Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) +Defined in: [packages/form-core/src/types.ts:966](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L966) An optional default value for the field. @@ -217,7 +217,7 @@ An optional default value for the field. optional disableErrorFlat: boolean; ``` -Defined in: [packages/form-core/src/types.ts:1014](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1014) +Defined in: [packages/form-core/src/types.ts:1006](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1006) Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases. @@ -233,7 +233,7 @@ Disable the `flat(1)` operation on `field.errors`. This is useful if you want to form: FormApi; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:639](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L639) +Defined in: [packages/form-core/src/FormGroupApi.ts:593](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L593) *** @@ -243,7 +243,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:639](https://github.com/TanS optional listeners: FormGroupListeners; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:386](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L386) +Defined in: [packages/form-core/src/FormGroupApi.ts:366](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L366) A list of listeners which attach to the corresponding events @@ -259,7 +259,7 @@ A list of listeners which attach to the corresponding events name: TName; ``` -Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) +Defined in: [packages/form-core/src/types.ts:962](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L962) The field name. The type will be `DeepKeys` to ensure your name is a deep key of the parent dataset. @@ -275,7 +275,7 @@ The field name. The type will be `DeepKeys` to ensure your name is optional onGroupSubmit: (props) => any; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:403](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L403) +Defined in: [packages/form-core/src/FormGroupApi.ts:383](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L383) A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise` @@ -311,7 +311,7 @@ A function to be called when the form is submitted, what should happen once the optional onGroupSubmitInvalid: (props) => void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:436](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L436) +Defined in: [packages/form-core/src/FormGroupApi.ts:416](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L416) Specify an action for scenarios where the user tries to submit an invalid form. @@ -347,7 +347,7 @@ Specify an action for scenarios where the user tries to submit an invalid form. optional onSubmitMeta: TSubmitMeta; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:398](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L398) +Defined in: [packages/form-core/src/FormGroupApi.ts:378](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L378) onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props @@ -363,7 +363,7 @@ onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit fun optional validationLogic: ValidationLogicFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:394](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L394) +Defined in: [packages/form-core/src/FormGroupApi.ts:374](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L374) Optional validation logic strategy to use for this group's own validators (e.g. `revalidateLogic()`). When omitted, the parent form's @@ -381,7 +381,7 @@ validators (e.g. `revalidateLogic()`). When omitted, the parent form's optional validators: FormGroupValidators; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:363](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L363) +Defined in: [packages/form-core/src/FormGroupApi.ts:343](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L343) A list of validators to pass to the field diff --git a/docs/reference/interfaces/FormGroupListeners.md b/docs/reference/interfaces/FormGroupListeners.md index 239be5c85..6e4d1a42d 100644 --- a/docs/reference/interfaces/FormGroupListeners.md +++ b/docs/reference/interfaces/FormGroupListeners.md @@ -3,7 +3,7 @@ id: FormGroupListeners title: FormGroupListeners --- -Defined in: [packages/form-core/src/FormGroupApi.ts:293](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L293) +Defined in: [packages/form-core/src/FormGroupApi.ts:286](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L286) ## Type Parameters @@ -27,7 +27,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:293](https://github.com/TanS optional onBlur: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:300](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L300) +Defined in: [packages/form-core/src/FormGroupApi.ts:293](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L293) *** @@ -37,7 +37,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:300](https://github.com/TanS optional onBlurDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:301](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L301) +Defined in: [packages/form-core/src/FormGroupApi.ts:294](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L294) *** @@ -47,7 +47,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:301](https://github.com/TanS optional onChange: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:298](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L298) +Defined in: [packages/form-core/src/FormGroupApi.ts:291](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L291) *** @@ -57,7 +57,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:298](https://github.com/TanS optional onChangeDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:299](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L299) +Defined in: [packages/form-core/src/FormGroupApi.ts:292](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L292) *** @@ -67,7 +67,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:299](https://github.com/TanS optional onGroupSubmit: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:305](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L305) +Defined in: [packages/form-core/src/FormGroupApi.ts:298](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L298) *** @@ -77,7 +77,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:305](https://github.com/TanS optional onMount: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:302](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L302) +Defined in: [packages/form-core/src/FormGroupApi.ts:295](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L295) *** @@ -87,7 +87,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:302](https://github.com/TanS optional onSubmit: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:304](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L304) +Defined in: [packages/form-core/src/FormGroupApi.ts:297](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L297) *** @@ -97,4 +97,4 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:304](https://github.com/TanS optional onUnmount: FormGroupListenerFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:303](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L303) +Defined in: [packages/form-core/src/FormGroupApi.ts:296](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L296) diff --git a/docs/reference/interfaces/FormGroupMeta.md b/docs/reference/interfaces/FormGroupMeta.md index 9f5a0162a..1c7fef22b 100644 --- a/docs/reference/interfaces/FormGroupMeta.md +++ b/docs/reference/interfaces/FormGroupMeta.md @@ -3,7 +3,7 @@ id: FormGroupMeta title: FormGroupMeta --- -Defined in: [packages/form-core/src/FormGroupApi.ts:749](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L749) +Defined in: [packages/form-core/src/FormGroupApi.ts:703](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L703) The `meta` shape exposed on `FormGroupApi.state.meta`. Mirrors `FieldApi.state.meta` (since `FormGroupMeta extends FieldLikeMeta`) but @@ -122,7 +122,7 @@ rather than the group's own field-meta entry. canSubmit: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:827](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L827) +Defined in: [packages/form-core/src/FormGroupApi.ts:768](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L768) *** @@ -132,7 +132,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:827](https://github.com/TanS errorMap: ValidationErrorMap, UnwrapFieldValidateOrFn, UnwrapFieldAsyncValidateOrFn, UnwrapFieldValidateOrFn, UnwrapFieldAsyncValidateOrFn, UnwrapFieldValidateOrFn, UnwrapFieldAsyncValidateOrFn, UnwrapFieldValidateOrFn, UnwrapFieldAsyncValidateOrFn>; ``` -Defined in: [packages/form-core/src/types.ts:536](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L536) +Defined in: [packages/form-core/src/types.ts:528](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L528) A map of errors related to the field value. @@ -159,7 +159,7 @@ errors: ( | UnwrapOneLevelOfArray>)[]; ``` -Defined in: [packages/form-core/src/types.ts:660](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L660) +Defined in: [packages/form-core/src/types.ts:652](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L652) An array of errors related to the field value. @@ -177,7 +177,7 @@ FieldLikeMeta.errors isBlurred: boolean; ``` -Defined in: [packages/form-core/src/types.ts:528](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L528) +Defined in: [packages/form-core/src/types.ts:520](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L520) A flag indicating whether the field has been blurred. @@ -195,7 +195,7 @@ FieldLikeMeta.isBlurred isDefaultValue: boolean; ``` -Defined in: [packages/form-core/src/types.ts:704](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L704) +Defined in: [packages/form-core/src/types.ts:696](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L696) A flag indicating whether the field's current value is the default value @@ -213,7 +213,7 @@ FieldLikeMeta.isDefaultValue isDirty: boolean; ``` -Defined in: [packages/form-core/src/types.ts:532](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L532) +Defined in: [packages/form-core/src/types.ts:524](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L524) A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`. @@ -231,7 +231,7 @@ FieldLikeMeta.isDirty isFieldsValid: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:824](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L824) +Defined in: [packages/form-core/src/FormGroupApi.ts:765](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L765) *** @@ -241,7 +241,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:824](https://github.com/TanS isFieldsValidating: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:823](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L823) +Defined in: [packages/form-core/src/FormGroupApi.ts:764](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L764) *** @@ -251,7 +251,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:823](https://github.com/TanS isGroupValid: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:825](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L825) +Defined in: [packages/form-core/src/FormGroupApi.ts:766](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L766) *** @@ -261,7 +261,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:825](https://github.com/TanS isPristine: boolean; ``` -Defined in: [packages/form-core/src/types.ts:696](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L696) +Defined in: [packages/form-core/src/types.ts:688](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L688) A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`. @@ -279,7 +279,7 @@ FieldLikeMeta.isPristine isSubmitSuccessful: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:688](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L688) +Defined in: [packages/form-core/src/FormGroupApi.ts:642](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L642) A boolean indicating if the last submission was successful. @@ -295,7 +295,7 @@ A boolean indicating if the last submission was successful. isSubmitted: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:676](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L676) +Defined in: [packages/form-core/src/FormGroupApi.ts:630](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L630) A boolean indicating if the `onSubmit` function has completed successfully. @@ -315,7 +315,7 @@ Note: you can use isSubmitting to check if the form is currently submitting. isSubmitting: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:668](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L668) +Defined in: [packages/form-core/src/FormGroupApi.ts:622](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L622) A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called. @@ -339,7 +339,7 @@ This is useful for displaying loading indicators or disabling form inputs during isTouched: boolean; ``` -Defined in: [packages/form-core/src/types.ts:524](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L524) +Defined in: [packages/form-core/src/types.ts:516](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L516) A flag indicating whether the field has been touched. @@ -357,7 +357,7 @@ FieldLikeMeta.isTouched isValid: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:826](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L826) +Defined in: [packages/form-core/src/FormGroupApi.ts:767](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L767) A boolean indicating if the field is valid. Evaluates `true` if there are no field errors. @@ -375,7 +375,7 @@ FieldLikeMeta.isValid isValidating: boolean; ``` -Defined in: [packages/form-core/src/types.ts:555](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L555) +Defined in: [packages/form-core/src/types.ts:547](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L547) A flag indicating whether the field is currently being validated. @@ -391,7 +391,7 @@ A flag indicating whether the field is currently being validated. submissionAttempts: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:684](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L684) +Defined in: [packages/form-core/src/FormGroupApi.ts:638](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L638) A counter for tracking the number of submission attempts. diff --git a/docs/reference/interfaces/FormGroupOptions.md b/docs/reference/interfaces/FormGroupOptions.md index a81435f51..207a3db7b 100644 --- a/docs/reference/interfaces/FormGroupOptions.md +++ b/docs/reference/interfaces/FormGroupOptions.md @@ -3,7 +3,7 @@ id: FormGroupOptions title: FormGroupOptions --- -Defined in: [packages/form-core/src/FormGroupApi.ts:468](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L468) +Defined in: [packages/form-core/src/FormGroupApi.ts:448](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L448) ## Extends @@ -127,7 +127,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:468](https://github.com/TanS optional asyncAlways: boolean; ``` -Defined in: [packages/form-core/src/types.ts:982](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L982) +Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) If `true`, always run async validation, even if there are errors emitted during synchronous validation. @@ -145,7 +145,7 @@ FieldLikeOptions.asyncAlways optional asyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) +Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) The default time to debounce async validation if there is not a more specific debounce time passed. @@ -163,7 +163,7 @@ FieldLikeOptions.asyncDebounceMs optional canSubmitWhenInvalid: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:381](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L381) +Defined in: [packages/form-core/src/FormGroupApi.ts:361](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L361) If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined. @@ -181,7 +181,7 @@ FormGroupExtraOptions.canSubmitWhenInvalid optional defaultMeta: Partial>; ``` -Defined in: [packages/form-core/src/types.ts:986](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L986) +Defined in: [packages/form-core/src/types.ts:978](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L978) An optional object with default metadata for the field. @@ -199,7 +199,7 @@ FieldLikeOptions.defaultMeta optional defaultState: FormGroupState; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:388](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L388) +Defined in: [packages/form-core/src/FormGroupApi.ts:368](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L368) #### Inherited from @@ -215,7 +215,7 @@ FormGroupExtraOptions.defaultState optional defaultValue: NoInfer; ``` -Defined in: [packages/form-core/src/types.ts:974](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L974) +Defined in: [packages/form-core/src/types.ts:966](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L966) An optional default value for the field. @@ -233,7 +233,7 @@ FieldLikeOptions.defaultValue optional disableErrorFlat: boolean; ``` -Defined in: [packages/form-core/src/types.ts:1014](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1014) +Defined in: [packages/form-core/src/types.ts:1006](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L1006) Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases. @@ -251,7 +251,7 @@ FieldLikeOptions.disableErrorFlat optional listeners: FormGroupListeners; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:386](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L386) +Defined in: [packages/form-core/src/FormGroupApi.ts:366](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L366) A list of listeners which attach to the corresponding events @@ -269,7 +269,7 @@ FormGroupExtraOptions.listeners name: TName; ``` -Defined in: [packages/form-core/src/types.ts:970](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L970) +Defined in: [packages/form-core/src/types.ts:962](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L962) The field name. The type will be `DeepKeys` to ensure your name is a deep key of the parent dataset. @@ -287,7 +287,7 @@ FieldLikeOptions.name optional onGroupSubmit: (props) => any; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:403](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L403) +Defined in: [packages/form-core/src/FormGroupApi.ts:383](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L383) A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise` @@ -325,7 +325,7 @@ FormGroupExtraOptions.onGroupSubmit optional onGroupSubmitInvalid: (props) => void; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:436](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L436) +Defined in: [packages/form-core/src/FormGroupApi.ts:416](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L416) Specify an action for scenarios where the user tries to submit an invalid form. @@ -363,7 +363,7 @@ FormGroupExtraOptions.onGroupSubmitInvalid optional onSubmitMeta: TSubmitMeta; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:398](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L398) +Defined in: [packages/form-core/src/FormGroupApi.ts:378](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L378) onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props @@ -381,7 +381,7 @@ FormGroupExtraOptions.onSubmitMeta optional validationLogic: ValidationLogicFn; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:394](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L394) +Defined in: [packages/form-core/src/FormGroupApi.ts:374](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L374) Optional validation logic strategy to use for this group's own validators (e.g. `revalidateLogic()`). When omitted, the parent form's @@ -401,7 +401,7 @@ FormGroupExtraOptions.validationLogic optional validators: FormGroupValidators; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:363](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L363) +Defined in: [packages/form-core/src/FormGroupApi.ts:343](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L343) A list of validators to pass to the field diff --git a/docs/reference/interfaces/FormGroupState.md b/docs/reference/interfaces/FormGroupState.md index 97d01529e..05b8de8b3 100644 --- a/docs/reference/interfaces/FormGroupState.md +++ b/docs/reference/interfaces/FormGroupState.md @@ -3,7 +3,7 @@ id: FormGroupState title: FormGroupState --- -Defined in: [packages/form-core/src/FormGroupApi.ts:655](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L655) +Defined in: [packages/form-core/src/FormGroupApi.ts:609](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L609) ## Extended by @@ -17,7 +17,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:655](https://github.com/TanS isSubmitSuccessful: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:688](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L688) +Defined in: [packages/form-core/src/FormGroupApi.ts:642](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L642) A boolean indicating if the last submission was successful. @@ -29,7 +29,7 @@ A boolean indicating if the last submission was successful. isSubmitted: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:676](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L676) +Defined in: [packages/form-core/src/FormGroupApi.ts:630](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L630) A boolean indicating if the `onSubmit` function has completed successfully. @@ -45,7 +45,7 @@ Note: you can use isSubmitting to check if the form is currently submitting. isSubmitting: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:668](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L668) +Defined in: [packages/form-core/src/FormGroupApi.ts:622](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L622) A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called. @@ -65,7 +65,7 @@ This is useful for displaying loading indicators or disabling form inputs during isValidating: boolean; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:680](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L680) +Defined in: [packages/form-core/src/FormGroupApi.ts:634](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L634) A boolean indicating if the form or any of its fields are currently validating. @@ -77,6 +77,6 @@ A boolean indicating if the form or any of its fields are currently validating. submissionAttempts: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:684](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L684) +Defined in: [packages/form-core/src/FormGroupApi.ts:638](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L638) A counter for tracking the number of submission attempts. diff --git a/docs/reference/interfaces/FormGroupStoreState.md b/docs/reference/interfaces/FormGroupStoreState.md index 589a95559..518dfc81a 100644 --- a/docs/reference/interfaces/FormGroupStoreState.md +++ b/docs/reference/interfaces/FormGroupStoreState.md @@ -3,7 +3,7 @@ id: FormGroupStoreState title: FormGroupStoreState --- -Defined in: [packages/form-core/src/FormGroupApi.ts:859](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L859) +Defined in: [packages/form-core/src/FormGroupApi.ts:800](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L800) ## Type Parameters @@ -107,7 +107,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:859](https://github.com/TanS meta: FormGroupMeta; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:916](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L916) +Defined in: [packages/form-core/src/FormGroupApi.ts:844](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L844) The current metadata of the form group, including aggregated validity, group-level errors, and submission lifecycle. @@ -120,6 +120,6 @@ group-level errors, and submission lifecycle. value: TData; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:911](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L911) +Defined in: [packages/form-core/src/FormGroupApi.ts:839](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L839) The current value of the form group. diff --git a/docs/reference/interfaces/FormGroupValidators.md b/docs/reference/interfaces/FormGroupValidators.md index 7591cb15d..020ce41e5 100644 --- a/docs/reference/interfaces/FormGroupValidators.md +++ b/docs/reference/interfaces/FormGroupValidators.md @@ -71,7 +71,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:199](https://github.com/TanS optional onBlur: TOnBlur; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:258](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L258) +Defined in: [packages/form-core/src/FormGroupApi.ts:251](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L251) An optional function, that runs on the blur event of input. @@ -89,7 +89,7 @@ z.string().min(1) optional onBlurAsync: TOnBlurAsync; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:264](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L264) +Defined in: [packages/form-core/src/FormGroupApi.ts:257](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L257) An optional property similar to `onBlur` but async validation. @@ -107,7 +107,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) optional onBlurAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:271](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L271) +Defined in: [packages/form-core/src/FormGroupApi.ts:264](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L264) An optional number to represent how long the `onBlurAsync` should wait before running @@ -121,7 +121,7 @@ If set to a number larger than 0, will debounce the async validation event by th optional onChange: TOnChange; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:236](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L236) +Defined in: [packages/form-core/src/FormGroupApi.ts:229](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L229) An optional function, that runs on the change event of input. @@ -139,7 +139,7 @@ z.string().min(1) optional onChangeAsync: TOnChangeAsync; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:242](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L242) +Defined in: [packages/form-core/src/FormGroupApi.ts:235](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L235) An optional property similar to `onChange` but async validation @@ -157,7 +157,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) optional onChangeAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:248](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L248) +Defined in: [packages/form-core/src/FormGroupApi.ts:241](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L241) An optional number to represent how long the `onChangeAsync` should wait before running @@ -171,7 +171,7 @@ If set to a number larger than 0, will debounce the async validation event by th optional onDynamic: TOnDynamic; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:288](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L288) +Defined in: [packages/form-core/src/FormGroupApi.ts:281](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L281) *** @@ -181,7 +181,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:288](https://github.com/TanS optional onDynamicAsync: TOnDynamicAsync; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:289](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L289) +Defined in: [packages/form-core/src/FormGroupApi.ts:282](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L282) *** @@ -191,7 +191,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:289](https://github.com/TanS optional onDynamicAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:290](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L290) +Defined in: [packages/form-core/src/FormGroupApi.ts:283](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L283) *** @@ -201,7 +201,7 @@ Defined in: [packages/form-core/src/FormGroupApi.ts:290](https://github.com/TanS optional onMount: TOnMount; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:230](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L230) +Defined in: [packages/form-core/src/FormGroupApi.ts:223](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L223) An optional function, that runs on the mount event of input. @@ -213,7 +213,7 @@ An optional function, that runs on the mount event of input. optional onSubmit: TOnSubmit; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:281](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L281) +Defined in: [packages/form-core/src/FormGroupApi.ts:274](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L274) An optional function, that runs on the submit event of form. @@ -231,7 +231,7 @@ z.string().min(1) optional onSubmitAsync: TOnSubmitAsync; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:287](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L287) +Defined in: [packages/form-core/src/FormGroupApi.ts:280](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L280) An optional property similar to `onSubmit` but async validation. diff --git a/docs/reference/interfaces/FormListeners.md b/docs/reference/interfaces/FormListeners.md index 90ca13818..d93f889ae 100644 --- a/docs/reference/interfaces/FormListeners.md +++ b/docs/reference/interfaces/FormListeners.md @@ -3,7 +3,7 @@ id: FormListeners title: FormListeners --- -Defined in: [packages/form-core/src/FormApi.ts:294](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L294) +Defined in: [packages/form-core/src/FormApi.ts:292](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L292) ## Type Parameters @@ -63,7 +63,7 @@ Defined in: [packages/form-core/src/FormApi.ts:294](https://github.com/TanStack/ optional onBlur: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:344](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L344) +Defined in: [packages/form-core/src/FormApi.ts:342](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L342) #### Parameters @@ -89,7 +89,7 @@ Defined in: [packages/form-core/src/FormApi.ts:344](https://github.com/TanStack/ optional onBlurDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:361](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L361) +Defined in: [packages/form-core/src/FormApi.ts:359](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L359) *** @@ -99,7 +99,7 @@ Defined in: [packages/form-core/src/FormApi.ts:361](https://github.com/TanStack/ optional onChange: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:308](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L308) +Defined in: [packages/form-core/src/FormApi.ts:306](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L306) #### Parameters @@ -119,7 +119,7 @@ Defined in: [packages/form-core/src/FormApi.ts:308](https://github.com/TanStack/ optional onChangeDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:324](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L324) +Defined in: [packages/form-core/src/FormApi.ts:322](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L322) *** @@ -129,7 +129,7 @@ Defined in: [packages/form-core/src/FormApi.ts:324](https://github.com/TanStack/ optional onChangeGroup: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:326](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L326) +Defined in: [packages/form-core/src/FormApi.ts:324](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L324) #### Parameters @@ -149,7 +149,7 @@ Defined in: [packages/form-core/src/FormApi.ts:326](https://github.com/TanStack/ optional onChangeGroupDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:342](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L342) +Defined in: [packages/form-core/src/FormApi.ts:340](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L340) *** @@ -159,7 +159,7 @@ Defined in: [packages/form-core/src/FormApi.ts:342](https://github.com/TanStack/ optional onFieldUnmount: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:398](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L398) +Defined in: [packages/form-core/src/FormApi.ts:396](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L396) #### Parameters @@ -179,7 +179,7 @@ Defined in: [packages/form-core/src/FormApi.ts:398](https://github.com/TanStack/ optional onGroupUnmount: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:415](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L415) +Defined in: [packages/form-core/src/FormApi.ts:413](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L413) #### Parameters @@ -199,7 +199,7 @@ Defined in: [packages/form-core/src/FormApi.ts:415](https://github.com/TanStack/ optional onMount: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:363](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L363) +Defined in: [packages/form-core/src/FormApi.ts:361](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L361) #### Parameters @@ -221,7 +221,7 @@ Defined in: [packages/form-core/src/FormApi.ts:363](https://github.com/TanStack/ optional onSubmit: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:380](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L380) +Defined in: [packages/form-core/src/FormApi.ts:378](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L378) #### Parameters diff --git a/docs/reference/interfaces/FormListenersPropsField.md b/docs/reference/interfaces/FormListenersPropsField.md index d0032e835..d7408a762 100644 --- a/docs/reference/interfaces/FormListenersPropsField.md +++ b/docs/reference/interfaces/FormListenersPropsField.md @@ -3,7 +3,7 @@ id: FormListenersPropsField title: FormListenersPropsField --- -Defined in: [packages/form-core/src/FormApi.ts:263](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L263) +Defined in: [packages/form-core/src/FormApi.ts:261](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L261) ## Type Parameters @@ -63,7 +63,7 @@ Defined in: [packages/form-core/src/FormApi.ts:263](https://github.com/TanStack/ fieldApi: AnyFieldApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:291](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L291) +Defined in: [packages/form-core/src/FormApi.ts:289](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L289) *** @@ -73,4 +73,4 @@ Defined in: [packages/form-core/src/FormApi.ts:291](https://github.com/TanStack/ formApi: FormApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:277](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L277) +Defined in: [packages/form-core/src/FormApi.ts:275](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L275) diff --git a/docs/reference/interfaces/FormListenersPropsGroup.md b/docs/reference/interfaces/FormListenersPropsGroup.md index 0256d79f8..9cd100e71 100644 --- a/docs/reference/interfaces/FormListenersPropsGroup.md +++ b/docs/reference/interfaces/FormListenersPropsGroup.md @@ -3,7 +3,7 @@ id: FormListenersPropsGroup title: FormListenersPropsGroup --- -Defined in: [packages/form-core/src/FormApi.ts:232](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L232) +Defined in: [packages/form-core/src/FormApi.ts:230](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L230) ## Type Parameters @@ -63,7 +63,7 @@ Defined in: [packages/form-core/src/FormApi.ts:232](https://github.com/TanStack/ formApi: FormApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:246](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L246) +Defined in: [packages/form-core/src/FormApi.ts:244](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L244) *** @@ -73,4 +73,4 @@ Defined in: [packages/form-core/src/FormApi.ts:246](https://github.com/TanStack/ groupApi: AnyFormGroupApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:260](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L260) +Defined in: [packages/form-core/src/FormApi.ts:258](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L258) diff --git a/docs/reference/interfaces/FormOptions.md b/docs/reference/interfaces/FormOptions.md index debc220c2..acc430cb7 100644 --- a/docs/reference/interfaces/FormOptions.md +++ b/docs/reference/interfaces/FormOptions.md @@ -3,7 +3,7 @@ id: FormOptions title: FormOptions --- -Defined in: [packages/form-core/src/FormApi.ts:450](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L450) +Defined in: [packages/form-core/src/FormApi.ts:448](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L448) An object representing the options for a form. @@ -69,7 +69,7 @@ An object representing the options for a form. optional asyncAlways: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:489](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L489) +Defined in: [packages/form-core/src/FormApi.ts:487](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L487) If true, always run async validation, even when sync validation has produced an error. Defaults to undefined. @@ -81,7 +81,7 @@ If true, always run async validation, even when sync validation has produced an optional asyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:493](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L493) +Defined in: [packages/form-core/src/FormApi.ts:491](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L491) Optional time in milliseconds if you want to introduce a delay before firing off an async action. @@ -93,7 +93,7 @@ Optional time in milliseconds if you want to introduce a delay before firing off optional canSubmitWhenInvalid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:497](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L497) +Defined in: [packages/form-core/src/FormApi.ts:495](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L495) If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined. @@ -105,7 +105,7 @@ If true, allows the form to be submitted in an invalid state i.e. canSubmit will optional defaultState: Partial>; ``` -Defined in: [packages/form-core/src/FormApi.ts:471](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L471) +Defined in: [packages/form-core/src/FormApi.ts:469](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L469) The default state for the form. @@ -117,7 +117,7 @@ The default state for the form. optional defaultValues: TFormData; ``` -Defined in: [packages/form-core/src/FormApi.ts:440](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L440) +Defined in: [packages/form-core/src/FormApi.ts:438](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L438) Set initial values for your form. @@ -133,7 +133,7 @@ Set initial values for your form. optional formId: string; ``` -Defined in: [packages/form-core/src/FormApi.ts:467](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L467) +Defined in: [packages/form-core/src/FormApi.ts:465](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L465) The form name, used for devtools and identification @@ -145,7 +145,7 @@ The form name, used for devtools and identification optional listeners: FormListeners; ``` -Defined in: [packages/form-core/src/FormApi.ts:519](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L519) +Defined in: [packages/form-core/src/FormApi.ts:517](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L517) form level listeners @@ -157,7 +157,7 @@ form level listeners optional onSubmit: (props) => any; ``` -Defined in: [packages/form-core/src/FormApi.ts:537](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L537) +Defined in: [packages/form-core/src/FormApi.ts:535](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L535) A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise` @@ -189,7 +189,7 @@ A function to be called when the form is submitted, what should happen once the optional onSubmitInvalid: (props) => void; ``` -Defined in: [packages/form-core/src/FormApi.ts:558](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L558) +Defined in: [packages/form-core/src/FormApi.ts:556](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L556) Specify an action for scenarios where the user tries to submit an invalid form. @@ -221,7 +221,7 @@ Specify an action for scenarios where the user tries to submit an invalid form. optional onSubmitMeta: TSubmitMeta; ``` -Defined in: [packages/form-core/src/FormApi.ts:444](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L444) +Defined in: [packages/form-core/src/FormApi.ts:442](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L442) onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props @@ -237,7 +237,7 @@ onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit fun optional transform: (data) => unknown; ``` -Defined in: [packages/form-core/src/FormApi.ts:582](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L582) +Defined in: [packages/form-core/src/FormApi.ts:580](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L580) #### Parameters @@ -257,7 +257,7 @@ Defined in: [packages/form-core/src/FormApi.ts:582](https://github.com/TanStack/ optional validationLogic: ValidationLogicFn; ``` -Defined in: [packages/form-core/src/FormApi.ts:514](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L514) +Defined in: [packages/form-core/src/FormApi.ts:512](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L512) *** @@ -267,6 +267,6 @@ Defined in: [packages/form-core/src/FormApi.ts:514](https://github.com/TanStack/ optional validators: FormValidators; ``` -Defined in: [packages/form-core/src/FormApi.ts:501](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L501) +Defined in: [packages/form-core/src/FormApi.ts:499](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L499) A list of validators to pass to the form diff --git a/docs/reference/interfaces/FormState.md b/docs/reference/interfaces/FormState.md index 844cf484a..56f8cf6f2 100644 --- a/docs/reference/interfaces/FormState.md +++ b/docs/reference/interfaces/FormState.md @@ -3,7 +3,7 @@ id: FormState title: FormState --- -Defined in: [packages/form-core/src/FormApi.ts:793](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L793) +Defined in: [packages/form-core/src/FormApi.ts:791](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L791) An object representing the current state of the form. @@ -65,7 +65,7 @@ An object representing the current state of the form. optional _force_re_eval: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:696](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L696) +Defined in: [packages/form-core/src/FormApi.ts:694](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L694) @private, used to force a re-evaluation of the form state when options change @@ -83,7 +83,7 @@ BaseFormState._force_re_eval canSubmit: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:786](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L786) +Defined in: [packages/form-core/src/FormApi.ts:784](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L784) A boolean indicating if the form can be submitted based on its current state. @@ -101,7 +101,7 @@ DerivedFormState.canSubmit errorMap: ValidationErrorMap, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormAsyncValidateOrFn>; ``` -Defined in: [packages/form-core/src/FormApi.ts:633](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L633) +Defined in: [packages/form-core/src/FormApi.ts:631](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L631) The error map for the form itself. @@ -129,7 +129,7 @@ errors: NonNullable< | UnwrapFormAsyncValidateOrFn>[]; ``` -Defined in: [packages/form-core/src/FormApi.ts:737](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L737) +Defined in: [packages/form-core/src/FormApi.ts:735](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L735) The error array for the form itself. @@ -147,7 +147,7 @@ DerivedFormState.errors fieldMeta: Partial, AnyFieldLikeMeta>>; ``` -Defined in: [packages/form-core/src/FormApi.ts:790](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L790) +Defined in: [packages/form-core/src/FormApi.ts:788](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L788) A record of field metadata for each field in the form. @@ -165,7 +165,7 @@ DerivedFormState.fieldMeta fieldMetaBase: Partial, AnyFieldLikeMetaBase>>; ``` -Defined in: [packages/form-core/src/FormApi.ts:652](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L652) +Defined in: [packages/form-core/src/FormApi.ts:650](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L650) A record of field metadata for each field in the form, not including the derived properties, like `errors` and such @@ -183,7 +183,7 @@ BaseFormState.fieldMetaBase formGroupStateBase: Partial>; ``` -Defined in: [packages/form-core/src/FormApi.ts:659](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L659) +Defined in: [packages/form-core/src/FormApi.ts:657](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L657) A record of submission lifecycle state for each mounted `FormGroupApi`, keyed by the group's fully-qualified field name. Stored on the form so @@ -204,7 +204,7 @@ BaseFormState.formGroupStateBase isBlurred: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:766](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L766) +Defined in: [packages/form-core/src/FormApi.ts:764](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L764) A boolean indicating if any of the form fields have been blurred. @@ -222,7 +222,7 @@ DerivedFormState.isBlurred isDefaultValue: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:778](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L778) +Defined in: [packages/form-core/src/FormApi.ts:776](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L776) A boolean indicating if all of the form's fields are the same as default values. @@ -240,7 +240,7 @@ DerivedFormState.isDefaultValue isDirty: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:770](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L770) +Defined in: [packages/form-core/src/FormApi.ts:768](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L768) A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`. @@ -258,7 +258,7 @@ DerivedFormState.isDirty isFieldsValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:758](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L758) +Defined in: [packages/form-core/src/FormApi.ts:756](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L756) A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors. @@ -276,7 +276,7 @@ DerivedFormState.isFieldsValid isFieldsValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:754](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L754) +Defined in: [packages/form-core/src/FormApi.ts:752](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L752) A boolean indicating if any of the form fields are currently validating. @@ -294,7 +294,7 @@ DerivedFormState.isFieldsValidating isFormValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:733](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L733) +Defined in: [packages/form-core/src/FormApi.ts:731](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L731) A boolean indicating if the form is valid. @@ -312,7 +312,7 @@ DerivedFormState.isFormValid isFormValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:729](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L729) +Defined in: [packages/form-core/src/FormApi.ts:727](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L727) A boolean indicating if the form is currently validating. @@ -330,7 +330,7 @@ DerivedFormState.isFormValidating isPristine: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:774](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L774) +Defined in: [packages/form-core/src/FormApi.ts:772](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L772) A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`. @@ -348,7 +348,7 @@ DerivedFormState.isPristine isSubmitSuccessful: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:692](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L692) +Defined in: [packages/form-core/src/FormApi.ts:690](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L690) A boolean indicating if the last submission was successful. @@ -366,7 +366,7 @@ BaseFormState.isSubmitSuccessful isSubmitted: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:680](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L680) +Defined in: [packages/form-core/src/FormApi.ts:678](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L678) A boolean indicating if the `onSubmit` function has completed successfully. @@ -388,7 +388,7 @@ BaseFormState.isSubmitted isSubmitting: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:672](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L672) +Defined in: [packages/form-core/src/FormApi.ts:670](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L670) A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called. @@ -414,7 +414,7 @@ BaseFormState.isSubmitting isTouched: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:762](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L762) +Defined in: [packages/form-core/src/FormApi.ts:760](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L760) A boolean indicating if any of the form fields have been touched. @@ -432,7 +432,7 @@ DerivedFormState.isTouched isValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:782](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L782) +Defined in: [packages/form-core/src/FormApi.ts:780](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L780) A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors. @@ -450,7 +450,7 @@ DerivedFormState.isValid isValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:684](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L684) +Defined in: [packages/form-core/src/FormApi.ts:682](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L682) A boolean indicating if the form or any of its fields are currently validating. @@ -468,7 +468,7 @@ BaseFormState.isValidating submissionAttempts: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:688](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L688) +Defined in: [packages/form-core/src/FormApi.ts:686](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L686) A counter for tracking the number of submission attempts. @@ -486,7 +486,7 @@ BaseFormState.submissionAttempts validationMetaMap: Record; ``` -Defined in: [packages/form-core/src/FormApi.ts:648](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L648) +Defined in: [packages/form-core/src/FormApi.ts:646](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L646) An internal mechanism used for keeping track of validation logic in a form. @@ -504,7 +504,7 @@ BaseFormState.validationMetaMap values: TFormData; ``` -Defined in: [packages/form-core/src/FormApi.ts:629](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L629) +Defined in: [packages/form-core/src/FormApi.ts:627](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L627) The current values of the form fields. diff --git a/docs/reference/interfaces/FormValidators.md b/docs/reference/interfaces/FormValidators.md index 2b31d4b67..3e47a7d9d 100644 --- a/docs/reference/interfaces/FormValidators.md +++ b/docs/reference/interfaces/FormValidators.md @@ -3,7 +3,7 @@ id: FormValidators title: FormValidators --- -Defined in: [packages/form-core/src/FormApi.ts:185](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L185) +Defined in: [packages/form-core/src/FormApi.ts:183](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L183) ## Type Parameters @@ -55,7 +55,7 @@ Defined in: [packages/form-core/src/FormApi.ts:185](https://github.com/TanStack/ optional onBlur: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FormApi.ts:216](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L216) +Defined in: [packages/form-core/src/FormApi.ts:214](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L214) Optional function that validates the form data when a field loses focus, returns a `FormValidationError` @@ -67,7 +67,7 @@ Optional function that validates the form data when a field loses focus, returns optional onBlurAsync: TOnBlurAsync; ``` -Defined in: [packages/form-core/src/FormApi.ts:220](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L220) +Defined in: [packages/form-core/src/FormApi.ts:218](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L218) Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise` @@ -79,7 +79,7 @@ Optional onBlur asynchronous validation method for when a field loses focus retu optional onBlurAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:224](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L224) +Defined in: [packages/form-core/src/FormApi.ts:222](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L222) The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds. @@ -91,7 +91,7 @@ The default time in milliseconds that if set to a number larger than 0, will deb optional onChange: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FormApi.ts:204](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L204) +Defined in: [packages/form-core/src/FormApi.ts:202](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L202) Optional function that checks the validity of your data whenever a value changes @@ -103,7 +103,7 @@ Optional function that checks the validity of your data whenever a value changes optional onChangeAsync: TOnChangeAsync; ``` -Defined in: [packages/form-core/src/FormApi.ts:208](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L208) +Defined in: [packages/form-core/src/FormApi.ts:206](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L206) Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests. @@ -115,7 +115,7 @@ Optional onChange asynchronous counterpart to onChange. Useful for more complex optional onChangeAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:212](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L212) +Defined in: [packages/form-core/src/FormApi.ts:210](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L210) The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds. @@ -127,7 +127,7 @@ The default time in milliseconds that if set to a number larger than 0, will deb optional onDynamic: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FormApi.ts:227](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L227) +Defined in: [packages/form-core/src/FormApi.ts:225](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L225) *** @@ -137,7 +137,7 @@ Defined in: [packages/form-core/src/FormApi.ts:227](https://github.com/TanStack/ optional onDynamicAsync: TOnDynamicAsync; ``` -Defined in: [packages/form-core/src/FormApi.ts:228](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L228) +Defined in: [packages/form-core/src/FormApi.ts:226](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L226) *** @@ -147,7 +147,7 @@ Defined in: [packages/form-core/src/FormApi.ts:228](https://github.com/TanStack/ optional onDynamicAsyncDebounceMs: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:229](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L229) +Defined in: [packages/form-core/src/FormApi.ts:227](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L227) *** @@ -157,7 +157,7 @@ Defined in: [packages/form-core/src/FormApi.ts:229](https://github.com/TanStack/ optional onMount: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FormApi.ts:200](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L200) +Defined in: [packages/form-core/src/FormApi.ts:198](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L198) Optional function that fires as soon as the component mounts. @@ -169,7 +169,7 @@ Optional function that fires as soon as the component mounts. optional onSubmit: RejectPromiseValidator; ``` -Defined in: [packages/form-core/src/FormApi.ts:225](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L225) +Defined in: [packages/form-core/src/FormApi.ts:223](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L223) *** @@ -179,4 +179,4 @@ Defined in: [packages/form-core/src/FormApi.ts:225](https://github.com/TanStack/ optional onSubmitAsync: TOnSubmitAsync; ``` -Defined in: [packages/form-core/src/FormApi.ts:226](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L226) +Defined in: [packages/form-core/src/FormApi.ts:224](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L224) diff --git a/docs/reference/interfaces/StandardSchemaV1Issue.md b/docs/reference/interfaces/StandardSchemaV1Issue.md index 6e55aa7bf..13d1b8d16 100644 --- a/docs/reference/interfaces/StandardSchemaV1Issue.md +++ b/docs/reference/interfaces/StandardSchemaV1Issue.md @@ -3,7 +3,7 @@ id: StandardSchemaV1Issue title: StandardSchemaV1Issue --- -Defined in: [packages/form-core/src/standardSchemaValidator.ts:181](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L181) +Defined in: [packages/form-core/src/standardSchemaValidator.ts:180](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L180) The issue interface of the failure output. @@ -15,7 +15,7 @@ The issue interface of the failure output. readonly message: string; ``` -Defined in: [packages/form-core/src/standardSchemaValidator.ts:185](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L185) +Defined in: [packages/form-core/src/standardSchemaValidator.ts:184](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L184) The error message of the issue. @@ -27,6 +27,6 @@ The error message of the issue. readonly optional path: readonly (PropertyKey | StandardSchemaV1PathSegment)[]; ``` -Defined in: [packages/form-core/src/standardSchemaValidator.ts:189](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L189) +Defined in: [packages/form-core/src/standardSchemaValidator.ts:188](https://github.com/TanStack/form/blob/main/packages/form-core/src/standardSchemaValidator.ts#L188) The path of the issue, if any. diff --git a/docs/reference/type-aliases/AnyBaseFormState.md b/docs/reference/type-aliases/AnyBaseFormState.md index 9efdb32ea..df173d715 100644 --- a/docs/reference/type-aliases/AnyBaseFormState.md +++ b/docs/reference/type-aliases/AnyBaseFormState.md @@ -7,4 +7,4 @@ title: AnyBaseFormState type AnyBaseFormState = BaseFormState; ``` -Defined in: [packages/form-core/src/FormApi.ts:699](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L699) +Defined in: [packages/form-core/src/FormApi.ts:697](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L697) diff --git a/docs/reference/type-aliases/AnyFieldApi.md b/docs/reference/type-aliases/AnyFieldApi.md index 2607f4244..46e2a195d 100644 --- a/docs/reference/type-aliases/AnyFieldApi.md +++ b/docs/reference/type-aliases/AnyFieldApi.md @@ -7,6 +7,6 @@ title: AnyFieldApi type AnyFieldApi = FieldApi; ``` -Defined in: [packages/form-core/src/FieldApi.ts:480](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L480) +Defined in: [packages/form-core/src/FieldApi.ts:454](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L454) A type representing the Field API with all generics set to `any` for convenience. diff --git a/docs/reference/type-aliases/AnyFieldMeta.md b/docs/reference/type-aliases/AnyFieldMeta.md index 9075545be..873f051a4 100644 --- a/docs/reference/type-aliases/AnyFieldMeta.md +++ b/docs/reference/type-aliases/AnyFieldMeta.md @@ -7,4 +7,4 @@ title: AnyFieldMeta type AnyFieldMeta = AnyFieldLikeMeta; ``` -Defined in: [packages/form-core/src/types.ts:834](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L834) +Defined in: [packages/form-core/src/types.ts:826](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L826) diff --git a/docs/reference/type-aliases/AnyFormApi.md b/docs/reference/type-aliases/AnyFormApi.md index 1d75d7af2..353821984 100644 --- a/docs/reference/type-aliases/AnyFormApi.md +++ b/docs/reference/type-aliases/AnyFormApi.md @@ -7,6 +7,6 @@ title: AnyFormApi type AnyFormApi = FormApi; ``` -Defined in: [packages/form-core/src/FormApi.ts:915](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L915) +Defined in: [packages/form-core/src/FormApi.ts:913](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L913) A type representing the Form API with all generics set to `any` for convenience. diff --git a/docs/reference/type-aliases/AnyFormGroupApi.md b/docs/reference/type-aliases/AnyFormGroupApi.md index 576d193cc..e0c8e05c7 100644 --- a/docs/reference/type-aliases/AnyFormGroupApi.md +++ b/docs/reference/type-aliases/AnyFormGroupApi.md @@ -7,6 +7,6 @@ title: AnyFormGroupApi type AnyFormGroupApi = FormGroupApi; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:708](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L708) +Defined in: [packages/form-core/src/FormGroupApi.ts:662](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L662) A type representing the FormGroup API with all generics set to `any` for convenience. diff --git a/docs/reference/type-aliases/AnyFormGroupMeta.md b/docs/reference/type-aliases/AnyFormGroupMeta.md index 8fbc7f85b..3b4caa031 100644 --- a/docs/reference/type-aliases/AnyFormGroupMeta.md +++ b/docs/reference/type-aliases/AnyFormGroupMeta.md @@ -7,6 +7,6 @@ title: AnyFormGroupMeta type AnyFormGroupMeta = FormGroupMeta; ``` -Defined in: [packages/form-core/src/FormGroupApi.ts:835](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L835) +Defined in: [packages/form-core/src/FormGroupApi.ts:776](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormGroupApi.ts#L776) `FormGroupMeta` with all generics widened to `any`. diff --git a/docs/reference/type-aliases/AnyFormOptions.md b/docs/reference/type-aliases/AnyFormOptions.md index 503632393..9d83322ee 100644 --- a/docs/reference/type-aliases/AnyFormOptions.md +++ b/docs/reference/type-aliases/AnyFormOptions.md @@ -7,4 +7,4 @@ title: AnyFormOptions type AnyFormOptions = FormOptions; ``` -Defined in: [packages/form-core/src/FormApi.ts:585](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L585) +Defined in: [packages/form-core/src/FormApi.ts:583](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L583) diff --git a/docs/reference/type-aliases/AnyFormState.md b/docs/reference/type-aliases/AnyFormState.md index 3cb6f0c9a..cb70f990c 100644 --- a/docs/reference/type-aliases/AnyFormState.md +++ b/docs/reference/type-aliases/AnyFormState.md @@ -7,4 +7,4 @@ title: AnyFormState type AnyFormState = FormState; ``` -Defined in: [packages/form-core/src/FormApi.ts:834](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L834) +Defined in: [packages/form-core/src/FormApi.ts:832](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L832) diff --git a/docs/reference/type-aliases/BaseFormState.md b/docs/reference/type-aliases/BaseFormState.md index bb8fb70f7..29df2c7bf 100644 --- a/docs/reference/type-aliases/BaseFormState.md +++ b/docs/reference/type-aliases/BaseFormState.md @@ -7,7 +7,7 @@ title: BaseFormState type BaseFormState = object; ``` -Defined in: [packages/form-core/src/FormApi.ts:613](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L613) +Defined in: [packages/form-core/src/FormApi.ts:611](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L611) An object representing the current state of the form. @@ -69,7 +69,7 @@ An object representing the current state of the form. optional _force_re_eval: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:696](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L696) +Defined in: [packages/form-core/src/FormApi.ts:694](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L694) @private, used to force a re-evaluation of the form state when options change @@ -81,7 +81,7 @@ Defined in: [packages/form-core/src/FormApi.ts:696](https://github.com/TanStack/ errorMap: ValidationErrorMap, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormValidateOrFn, UnwrapFormAsyncValidateOrFn, UnwrapFormAsyncValidateOrFn>; ``` -Defined in: [packages/form-core/src/FormApi.ts:633](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L633) +Defined in: [packages/form-core/src/FormApi.ts:631](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L631) The error map for the form itself. @@ -93,7 +93,7 @@ The error map for the form itself. fieldMetaBase: Partial, AnyFieldLikeMetaBase>>; ``` -Defined in: [packages/form-core/src/FormApi.ts:652](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L652) +Defined in: [packages/form-core/src/FormApi.ts:650](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L650) A record of field metadata for each field in the form, not including the derived properties, like `errors` and such @@ -105,7 +105,7 @@ A record of field metadata for each field in the form, not including the derived formGroupStateBase: Partial>; ``` -Defined in: [packages/form-core/src/FormApi.ts:659](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L659) +Defined in: [packages/form-core/src/FormApi.ts:657](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L657) A record of submission lifecycle state for each mounted `FormGroupApi`, keyed by the group's fully-qualified field name. Stored on the form so @@ -120,7 +120,7 @@ mounted group instances. isSubmitSuccessful: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:692](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L692) +Defined in: [packages/form-core/src/FormApi.ts:690](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L690) A boolean indicating if the last submission was successful. @@ -132,7 +132,7 @@ A boolean indicating if the last submission was successful. isSubmitted: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:680](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L680) +Defined in: [packages/form-core/src/FormApi.ts:678](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L678) A boolean indicating if the `onSubmit` function has completed successfully. @@ -148,7 +148,7 @@ Note: you can use isSubmitting to check if the form is currently submitting. isSubmitting: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:672](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L672) +Defined in: [packages/form-core/src/FormApi.ts:670](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L670) A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called. @@ -168,7 +168,7 @@ This is useful for displaying loading indicators or disabling form inputs during isValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:684](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L684) +Defined in: [packages/form-core/src/FormApi.ts:682](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L682) A boolean indicating if the form or any of its fields are currently validating. @@ -180,7 +180,7 @@ A boolean indicating if the form or any of its fields are currently validating. submissionAttempts: number; ``` -Defined in: [packages/form-core/src/FormApi.ts:688](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L688) +Defined in: [packages/form-core/src/FormApi.ts:686](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L686) A counter for tracking the number of submission attempts. @@ -192,7 +192,7 @@ A counter for tracking the number of submission attempts. validationMetaMap: Record; ``` -Defined in: [packages/form-core/src/FormApi.ts:648](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L648) +Defined in: [packages/form-core/src/FormApi.ts:646](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L646) An internal mechanism used for keeping track of validation logic in a form. @@ -204,6 +204,6 @@ An internal mechanism used for keeping track of validation logic in a form. values: TFormData; ``` -Defined in: [packages/form-core/src/FormApi.ts:629](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L629) +Defined in: [packages/form-core/src/FormApi.ts:627](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L627) The current values of the form fields. diff --git a/docs/reference/type-aliases/DerivedFormState.md b/docs/reference/type-aliases/DerivedFormState.md index fbb954869..f0893f170 100644 --- a/docs/reference/type-aliases/DerivedFormState.md +++ b/docs/reference/type-aliases/DerivedFormState.md @@ -7,7 +7,7 @@ title: DerivedFormState type DerivedFormState = object; ``` -Defined in: [packages/form-core/src/FormApi.ts:713](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L713) +Defined in: [packages/form-core/src/FormApi.ts:711](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L711) ## Extended by @@ -67,7 +67,7 @@ Defined in: [packages/form-core/src/FormApi.ts:713](https://github.com/TanStack/ canSubmit: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:786](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L786) +Defined in: [packages/form-core/src/FormApi.ts:784](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L784) A boolean indicating if the form can be submitted based on its current state. @@ -89,7 +89,7 @@ errors: NonNullable< | UnwrapFormAsyncValidateOrFn>[]; ``` -Defined in: [packages/form-core/src/FormApi.ts:737](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L737) +Defined in: [packages/form-core/src/FormApi.ts:735](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L735) The error array for the form itself. @@ -101,7 +101,7 @@ The error array for the form itself. fieldMeta: Partial, AnyFieldLikeMeta>>; ``` -Defined in: [packages/form-core/src/FormApi.ts:790](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L790) +Defined in: [packages/form-core/src/FormApi.ts:788](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L788) A record of field metadata for each field in the form. @@ -113,7 +113,7 @@ A record of field metadata for each field in the form. isBlurred: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:766](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L766) +Defined in: [packages/form-core/src/FormApi.ts:764](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L764) A boolean indicating if any of the form fields have been blurred. @@ -125,7 +125,7 @@ A boolean indicating if any of the form fields have been blurred. isDefaultValue: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:778](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L778) +Defined in: [packages/form-core/src/FormApi.ts:776](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L776) A boolean indicating if all of the form's fields are the same as default values. @@ -137,7 +137,7 @@ A boolean indicating if all of the form's fields are the same as default values. isDirty: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:770](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L770) +Defined in: [packages/form-core/src/FormApi.ts:768](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L768) A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`. @@ -149,7 +149,7 @@ A boolean indicating if any of the form's fields' values have been modified by t isFieldsValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:758](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L758) +Defined in: [packages/form-core/src/FormApi.ts:756](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L756) A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors. @@ -161,7 +161,7 @@ A boolean indicating if all the form fields are valid. Evaluates `true` if there isFieldsValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:754](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L754) +Defined in: [packages/form-core/src/FormApi.ts:752](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L752) A boolean indicating if any of the form fields are currently validating. @@ -173,7 +173,7 @@ A boolean indicating if any of the form fields are currently validating. isFormValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:733](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L733) +Defined in: [packages/form-core/src/FormApi.ts:731](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L731) A boolean indicating if the form is valid. @@ -185,7 +185,7 @@ A boolean indicating if the form is valid. isFormValidating: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:729](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L729) +Defined in: [packages/form-core/src/FormApi.ts:727](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L727) A boolean indicating if the form is currently validating. @@ -197,7 +197,7 @@ A boolean indicating if the form is currently validating. isPristine: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:774](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L774) +Defined in: [packages/form-core/src/FormApi.ts:772](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L772) A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`. @@ -209,7 +209,7 @@ A boolean indicating if none of the form's fields' values have been modified by isTouched: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:762](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L762) +Defined in: [packages/form-core/src/FormApi.ts:760](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L760) A boolean indicating if any of the form fields have been touched. @@ -221,6 +221,6 @@ A boolean indicating if any of the form fields have been touched. isValid: boolean; ``` -Defined in: [packages/form-core/src/FormApi.ts:782](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L782) +Defined in: [packages/form-core/src/FormApi.ts:780](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L780) A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors. diff --git a/docs/reference/type-aliases/ExtractGlobalFormError.md b/docs/reference/type-aliases/ExtractGlobalFormError.md index 4a583f458..12e77baa3 100644 --- a/docs/reference/type-aliases/ExtractGlobalFormError.md +++ b/docs/reference/type-aliases/ExtractGlobalFormError.md @@ -7,7 +7,7 @@ title: ExtractGlobalFormError type ExtractGlobalFormError = TFormError extends GlobalFormValidationError ? TFormError["form"] : TFormError; ``` -Defined in: [packages/form-core/src/types.ts:154](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L154) +Defined in: [packages/form-core/src/types.ts:146](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L146) ## Type Parameters diff --git a/docs/reference/type-aliases/FormValidationError.md b/docs/reference/type-aliases/FormValidationError.md index 32ec405f2..11a1d3d73 100644 --- a/docs/reference/type-aliases/FormValidationError.md +++ b/docs/reference/type-aliases/FormValidationError.md @@ -9,7 +9,7 @@ type FormValidationError = | GlobalFormValidationError; ``` -Defined in: [packages/form-core/src/types.ts:132](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L132) +Defined in: [packages/form-core/src/types.ts:125](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L125) ## Type Parameters diff --git a/docs/reference/type-aliases/FormValidator.md b/docs/reference/type-aliases/FormValidator.md index b64efebc9..1979b74d3 100644 --- a/docs/reference/type-aliases/FormValidator.md +++ b/docs/reference/type-aliases/FormValidator.md @@ -7,7 +7,7 @@ title: FormValidator type FormValidator = object; ``` -Defined in: [packages/form-core/src/FormApi.ts:155](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L155) +Defined in: [packages/form-core/src/FormApi.ts:154](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L154) ## Type Parameters @@ -31,7 +31,7 @@ Defined in: [packages/form-core/src/FormApi.ts:155](https://github.com/TanStack/ validate(options, fn): unknown; ``` -Defined in: [packages/form-core/src/FormApi.ts:156](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L156) +Defined in: [packages/form-core/src/FormApi.ts:155](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L155) #### Parameters @@ -57,7 +57,7 @@ Defined in: [packages/form-core/src/FormApi.ts:156](https://github.com/TanStack/ validateAsync(options, fn): Promise; ``` -Defined in: [packages/form-core/src/FormApi.ts:157](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L157) +Defined in: [packages/form-core/src/FormApi.ts:156](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L156) #### Parameters diff --git a/docs/reference/type-aliases/UnwrapFieldAsyncValidateOrFn.md b/docs/reference/type-aliases/UnwrapFieldAsyncValidateOrFn.md index f30a1bee6..0ac3a71c6 100644 --- a/docs/reference/type-aliases/UnwrapFieldAsyncValidateOrFn.md +++ b/docs/reference/type-aliases/UnwrapFieldAsyncValidateOrFn.md @@ -11,7 +11,7 @@ type UnwrapFieldAsyncValidateOrFn = | [TValidateOrFn] extends [FormGroupValidateAsyncFn] ? Awaited> : [TValidateOrFn] extends [StandardSchemaV1] ? StandardSchemaV1Issue[] : undefined; ``` -Defined in: [packages/form-core/src/types.ts:333](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L333) +Defined in: [packages/form-core/src/types.ts:325](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L325) ## Type Parameters diff --git a/docs/reference/type-aliases/UnwrapFieldValidateOrFn.md b/docs/reference/type-aliases/UnwrapFieldValidateOrFn.md index a163ba62d..4f104654c 100644 --- a/docs/reference/type-aliases/UnwrapFieldValidateOrFn.md +++ b/docs/reference/type-aliases/UnwrapFieldValidateOrFn.md @@ -11,7 +11,7 @@ type UnwrapFieldValidateOrFn = | [TValidateOrFn] extends [StandardSchemaV1] ? StandardSchemaV1Issue[] : [TValidateOrFn] extends [FormGroupValidateFn] ? ReturnType : undefined; ``` -Defined in: [packages/form-core/src/types.ts:431](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L431) +Defined in: [packages/form-core/src/types.ts:423](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L423) ## Type Parameters diff --git a/docs/reference/type-aliases/UnwrapFormAsyncValidateOrFn.md b/docs/reference/type-aliases/UnwrapFormAsyncValidateOrFn.md index e7a140a13..e2edb6bf4 100644 --- a/docs/reference/type-aliases/UnwrapFormAsyncValidateOrFn.md +++ b/docs/reference/type-aliases/UnwrapFormAsyncValidateOrFn.md @@ -7,7 +7,7 @@ title: UnwrapFormAsyncValidateOrFn type UnwrapFormAsyncValidateOrFn = [TValidateOrFn] extends [FormValidateAsyncFn] ? ExtractGlobalFormError>> : [TValidateOrFn] extends [StandardSchemaV1] ? Record : undefined; ``` -Defined in: [packages/form-core/src/FormApi.ts:177](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L177) +Defined in: [packages/form-core/src/FormApi.ts:175](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L175) ## Type Parameters diff --git a/docs/reference/type-aliases/UnwrapFormValidateOrFn.md b/docs/reference/type-aliases/UnwrapFormValidateOrFn.md index 1a469ec4f..3fe1fd33d 100644 --- a/docs/reference/type-aliases/UnwrapFormValidateOrFn.md +++ b/docs/reference/type-aliases/UnwrapFormValidateOrFn.md @@ -7,7 +7,7 @@ title: UnwrapFormValidateOrFn type UnwrapFormValidateOrFn = [TValidateOrFn] extends [FormValidateFn] ? ExtractGlobalFormError> : [TValidateOrFn] extends [StandardSchemaV1] ? Record : undefined; ``` -Defined in: [packages/form-core/src/FormApi.ts:123](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L123) +Defined in: [packages/form-core/src/FormApi.ts:122](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L122) ## Type Parameters diff --git a/docs/reference/type-aliases/ValidationMeta.md b/docs/reference/type-aliases/ValidationMeta.md index de7af060b..5615e68cd 100644 --- a/docs/reference/type-aliases/ValidationMeta.md +++ b/docs/reference/type-aliases/ValidationMeta.md @@ -7,7 +7,7 @@ title: ValidationMeta type ValidationMeta = object; ``` -Defined in: [packages/form-core/src/FormApi.ts:603](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L603) +Defined in: [packages/form-core/src/FormApi.ts:601](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L601) An object representing the validation metadata for a field. Not intended for public usage. @@ -19,6 +19,6 @@ An object representing the validation metadata for a field. Not intended for pub lastAbortController: AbortController; ``` -Defined in: [packages/form-core/src/FormApi.ts:607](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L607) +Defined in: [packages/form-core/src/FormApi.ts:605](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L605) An abort controller stored in memory to cancel previous async validation attempts. diff --git a/docs/reference/variables/throttleFormState.md b/docs/reference/variables/throttleFormState.md index 0d07c4b42..559398c09 100644 --- a/docs/reference/variables/throttleFormState.md +++ b/docs/reference/variables/throttleFormState.md @@ -7,7 +7,7 @@ title: throttleFormState const throttleFormState: (...args) => void; ``` -Defined in: [packages/form-core/src/utils.ts:681](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L681) +Defined in: [packages/form-core/src/utils.ts:680](https://github.com/TanStack/form/blob/main/packages/form-core/src/utils.ts#L680) ## Parameters diff --git a/examples/react/nextjs/next-env.d.ts b/examples/react/nextjs/next-env.d.ts index ce4e94a6b..d9391a77d 100644 --- a/examples/react/nextjs/next-env.d.ts +++ b/examples/react/nextjs/next-env.d.ts @@ -1,7 +1,7 @@ /// /// -import "./.next/types/routes.d.ts"; -import "./.next/types/root-params.d.ts"; +import './.next/types/routes.d.ts' +import './.next/types/root-params.d.ts' // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 73d9f4466..380cf0a36 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -11,6 +11,7 @@ await generateReferenceDocs({ entryPoints: [resolve(__dirname, '../packages/form-core/src/index.ts')], tsconfig: resolve(__dirname, '../packages/form-core/tsconfig.docs.json'), outputDir: resolve(__dirname, '../docs/reference'), + exclude: [], }, { name: 'angular-form', @@ -62,6 +63,16 @@ await generateReferenceDocs({ outputDir: resolve(__dirname, '../docs/framework/vue/reference'), exclude: ['packages/form-core/**/*'], }, + { + name: 'octane-form', + entryPoints: [resolve(__dirname, '../packages/octane-form/src/index.ts')], + tsconfig: resolve( + __dirname, + '../packages/octane-form/tsconfig.docs.json', + ), + outputDir: resolve(__dirname, '../docs/framework/octane/reference'), + exclude: ['packages/form-core/**/*'], + }, ], }) From f337950879a9a352d40d46c7cf18b2bb32d19ba1 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 30 Sep 2026 09:28:38 -0700 Subject: [PATCH 22/23] docs: add TSRX + Octane docs --- docs/config.json | 179 +++++ docs/framework/octane/guides/arrays.md | 153 +++++ .../framework/octane/guides/basic-concepts.md | 407 ++++++++++++ docs/framework/octane/guides/custom-errors.md | 297 +++++++++ docs/framework/octane/guides/debugging.md | 88 +++ .../octane/guides/dynamic-validation.md | 234 +++++++ .../octane/guides/focus-management.md | 131 ++++ .../octane/guides/form-composition.md | 609 ++++++++++++++++++ docs/framework/octane/guides/form-groups.md | 227 +++++++ docs/framework/octane/guides/linked-fields.md | 71 ++ docs/framework/octane/guides/listeners.md | 121 ++++ docs/framework/octane/guides/reactivity.md | 98 +++ .../octane/guides/submission-handling.md | 99 +++ docs/framework/octane/guides/validation.md | 534 +++++++++++++++ docs/framework/octane/quick-start.md | 223 +++++++ docs/installation.md | 1 + 16 files changed, 3472 insertions(+) create mode 100644 docs/framework/octane/guides/arrays.md create mode 100644 docs/framework/octane/guides/basic-concepts.md create mode 100644 docs/framework/octane/guides/custom-errors.md create mode 100644 docs/framework/octane/guides/debugging.md create mode 100644 docs/framework/octane/guides/dynamic-validation.md create mode 100644 docs/framework/octane/guides/focus-management.md create mode 100644 docs/framework/octane/guides/form-composition.md create mode 100644 docs/framework/octane/guides/form-groups.md create mode 100644 docs/framework/octane/guides/linked-fields.md create mode 100644 docs/framework/octane/guides/listeners.md create mode 100644 docs/framework/octane/guides/reactivity.md create mode 100644 docs/framework/octane/guides/submission-handling.md create mode 100644 docs/framework/octane/guides/validation.md create mode 100644 docs/framework/octane/quick-start.md diff --git a/docs/config.json b/docs/config.json index 8fe73ca6b..70f577536 100644 --- a/docs/config.json +++ b/docs/config.json @@ -54,6 +54,15 @@ } ] }, + { + "label": "octane", + "children": [ + { + "label": "Quick Start", + "to": "framework/octane/quick-start" + } + ] + }, { "label": "vue", "children": [ @@ -247,6 +256,71 @@ } ] }, + { + "label": "octane", + "children": [ + { + "label": "Basic Concepts", + "to": "framework/octane/guides/basic-concepts" + }, + { + "label": "Form Validation", + "to": "framework/octane/guides/validation" + }, + { + "label": "Dynamic Validation", + "to": "framework/octane/guides/dynamic-validation" + }, + { + "label": "Async Initial Values", + "to": "framework/octane/guides/async-initial-values" + }, + { + "label": "Arrays", + "to": "framework/octane/guides/arrays" + }, + { + "label": "Form Groups", + "to": "framework/octane/guides/form-groups" + }, + { + "label": "Linked Fields", + "to": "framework/octane/guides/linked-fields" + }, + { + "label": "Reactivity", + "to": "framework/octane/guides/reactivity" + }, + { + "label": "Listeners", + "to": "framework/octane/guides/listeners" + }, + { + "label": "Custom Errors", + "to": "framework/octane/guides/custom-errors" + }, + { + "label": "Submission Handling", + "to": "framework/octane/guides/submission-handling" + }, + { + "label": "UI Libraries", + "to": "framework/octane/guides/ui-libraries" + }, + { + "label": "Focus Management", + "to": "framework/octane/guides/focus-management" + }, + { + "label": "Form Composition", + "to": "framework/octane/guides/form-composition" + }, + { + "label": "Debugging", + "to": "framework/octane/guides/debugging" + } + ] + }, { "label": "vue", "children": [ @@ -555,6 +629,111 @@ } ] }, + { + "label": "octane", + "children": [ + { + "label": "Octane Reference", + "to": "framework/octane/reference/index" + }, + { + "label": "Variables / Field", + "to": "framework/octane/reference/variables/Field" + }, + { + "label": "Variables / FormGroup", + "to": "framework/octane/reference/variables/FormGroup" + }, + { + "label": "Variables / useIsomorphicLayoutEffect", + "to": "framework/octane/reference/variables/useIsomorphicLayoutEffect" + }, + { + "label": "Functions / createFormHook", + "to": "framework/octane/reference/functions/createFormHook" + }, + { + "label": "Functions / createFormHookContexts", + "to": "framework/octane/reference/functions/createFormHookContexts" + }, + { + "label": "Functions / useField", + "to": "framework/octane/reference/functions/useField" + }, + { + "label": "Functions / useFieldGroup", + "to": "framework/octane/reference/functions/useFieldGroup" + }, + { + "label": "Functions / useForm", + "to": "framework/octane/reference/functions/useForm" + }, + { + "label": "Functions / useFormGroup", + "to": "framework/octane/reference/functions/useFormGroup" + }, + { + "label": "Functions / useSelector", + "to": "framework/octane/reference/functions/useSelector" + }, + { + "label": "Interfaces / CreateFormHookReturn", + "to": "framework/octane/reference/interfaces/CreateFormHookReturn" + }, + { + "label": "Interfaces / OctaneFormApi", + "to": "framework/octane/reference/interfaces/OctaneFormApi" + }, + { + "label": "Interfaces / SubscribeComponent", + "to": "framework/octane/reference/interfaces/SubscribeComponent" + }, + { + "label": "Interfaces / UseFieldOptions", + "to": "framework/octane/reference/interfaces/UseFieldOptions" + }, + { + "label": "Interfaces / UseFieldOptionsBound", + "to": "framework/octane/reference/interfaces/UseFieldOptionsBound" + }, + { + "label": "Interfaces / WithFieldGroupProps", + "to": "framework/octane/reference/interfaces/WithFieldGroupProps" + }, + { + "label": "Interfaces / WithFormProps", + "to": "framework/octane/reference/interfaces/WithFormProps" + }, + { + "label": "Types / FieldComponent", + "to": "framework/octane/reference/type-aliases/FieldComponent" + }, + { + "label": "Types / FormGroupComponent", + "to": "framework/octane/reference/type-aliases/FormGroupComponent" + }, + { + "label": "Types / LensFieldComponent", + "to": "framework/octane/reference/type-aliases/LensFieldComponent" + }, + { + "label": "Types / OctaneFormExtendedApi", + "to": "framework/octane/reference/type-aliases/OctaneFormExtendedApi" + }, + { + "label": "Types / ServerFormState", + "to": "framework/octane/reference/type-aliases/ServerFormState" + }, + { + "label": "Types / UseField", + "to": "framework/octane/reference/type-aliases/UseField" + }, + { + "label": "Types / UseFormGroup", + "to": "framework/octane/reference/type-aliases/UseFormGroup" + } + ] + }, { "label": "vue", "children": [ diff --git a/docs/framework/octane/guides/arrays.md b/docs/framework/octane/guides/arrays.md new file mode 100644 index 000000000..4c9e4dee4 --- /dev/null +++ b/docs/framework/octane/guides/arrays.md @@ -0,0 +1,153 @@ +--- +id: arrays +title: Arrays +--- + +TanStack Form supports arrays as form values, including objects and nested fields inside an array. In TSRX, render array fields with a keyed `@for` loop. + +## Basic Usage + +Use `mode="array"` to manage the array and read its entries through `field.state.value`. Give an initially empty array a type so that field paths and new entries can be inferred: + +```tsrx +import { useForm } from '@tanstack/octane-form' + +type Person = { + id: string; + name: string; + age: number; +} + +function App() @{ + const form = useForm({ + defaultValues: { + people: [] as Person[], + }, + }) + +

+ @for (const person of field.state.value; index i; key person.id) { +

Person {i + 1}: {person.id}

+ } +
} + /> +} +``` + +Call `pushValue` to add an entry. The array field updates and the loop renders the new row: + +```tsrx + +``` + +Access an entry's nested fields using an indexed path: + +```tsrx + + subField.handleChange(event.currentTarget.value)} + onBlur={subField.handleBlur} + />} +/> +``` + +The loop's `key` identifies the row, while the field's `name` identifies its current position in the form. Use a stable key when rows can be removed or reordered, so Octane can preserve each row's DOM and component state. Native text inputs use `onInput` to update on each edit. + +## Full Example + +Save components that render templates in `.tsrx` files: + +```tsrx +// src/App.tsrx +import { useForm } from '@tanstack/octane-form' + +type Person = { + id: string; + name: string; + age: number; +} + +export function App() @{ + const form = useForm({ + defaultValues: { + people: [] as Person[], + }, + onSubmit: ({ value }) => { + alert(JSON.stringify(value)) + }, + }) + +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > +
+ @for (const person of field.state.value; index i; key person.id) { +
+ } + /> + +
+ } + +
} + /> + [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } + /> + +} +``` diff --git a/docs/framework/octane/guides/basic-concepts.md b/docs/framework/octane/guides/basic-concepts.md new file mode 100644 index 000000000..559788b96 --- /dev/null +++ b/docs/framework/octane/guides/basic-concepts.md @@ -0,0 +1,407 @@ +--- +id: basic-concepts +title: Basic Concepts and Terminology +--- + +This page introduces the basic concepts and terminology used in the `@tanstack/octane-form` library. Familiarizing yourself with these concepts will help you better understand and work with the library. + +## Form Options + +You can customize your form by creating configuration options with the `formOptions` function. These options can be shared between multiple forms. + +Example: + +```ts +import { formOptions } from '@tanstack/octane-form' + +interface User { + firstName: string + lastName: string + hobbies: Array<{ + name: string + description: string + yearsOfExperience: number + }> +} +const defaultUser: User = { firstName: '', lastName: '', hobbies: [] } + +const formOpts = formOptions({ + defaultValues: defaultUser, +}) +``` + +## Form Instance + +A Form instance is an object that represents an individual form and provides methods and properties for working with the form. You create a Form instance using the `useForm` hook from `@tanstack/octane-form` inside an Octane component. The hook accepts an object with an `onSubmit` function, which is called when the form is submitted. + +```ts +const form = useForm({ + ...formOpts, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, +}) +``` + +You may also create a Form instance without using `formOptions` by using the standalone `useForm` API: + +```ts +interface User { + firstName: string + lastName: string + hobbies: Array<{ + name: string + description: string + yearsOfExperience: number + }> +} +const defaultUser: User = { firstName: '', lastName: '', hobbies: [] } + +const form = useForm({ + defaultValues: defaultUser, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, +}) +``` + +## Field + +A Field represents a single form input element, such as a text input or a checkbox. Fields are created using the `form.Field` component provided by the Form instance. The component accepts a `name` prop, which should match a key in the form's default values. It also accepts a `children` prop, which is a render prop function that takes a `field` object as its argument. + +Example: + +```tsrx + <> + field.handleChange(e.currentTarget.value)} + /> + + } +/> +``` + +In TSRX, pass function children explicitly with `children={...}`. Save rendering code in `.tsrx` files and compile it with the Octane Vite plugin described in the [Quick Start](../quick-start.md). + +Octane uses native DOM events. Use `onInput` for per-keystroke text updates, read the input through `event.currentTarget`, and pass its value to `field.handleChange`. `onChange` follows the browser's commit behavior. + +You can show metadata in a reusable component: + +```tsrx +import type { AnyFieldApi } from '@tanstack/octane-form' + +function FieldInfo({ field }: { field: AnyFieldApi }) @{ + <> + @if (field.state.meta.isTouched && !field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + @if (field.state.meta.isValidating) { + Validating... + } + +} +``` + +## Field State + +Each field has its own state, which includes its current value, validation status, error messages, and other metadata. You can access a field's state using the `field.state` property. + +Example: + +```ts +const { + value, + meta: { errors, isValidating }, +} = field.state +``` + +There are five states in the metadata that can be useful for seeing how the user interacts with a field: + +- **isTouched**: is `true` once the user changes or blurs the field +- **isDirty**: is `true` once the field's value is changed, even if it's reverted to the default. Opposite of `isPristine` +- **isPristine**: is `true` until the user changes the field's value. Opposite of `isDirty` +- **isBlurred**: is `true` once the field loses focus (is blurred) +- **isDefaultValue**: is `true` when the field's current value is the default value + +```ts +const { isTouched, isDirty, isPristine, isBlurred } = field.state.meta +``` + +![Field states](https://raw.githubusercontent.com/TanStack/form/main/docs/assets/field-states.png) + +## Understanding 'isDirty' in Different Libraries + +Non-Persistent `dirty` state + +- **Libraries**: React Hook Form (RHF), Formik, Final Form. +- **Behavior**: A field is 'dirty' if its value differs from the default. Reverting to the default value makes it 'clean' again. + +Persistent `dirty` state + +- **Libraries**: Angular Form, Vue FormKit. +- **Behavior**: A field remains 'dirty' once changed, even if reverted to the default value. + +We have chosen the persistent 'dirty' state model. However, we have introduced the `isDefaultValue` flag to also support a non-persistent 'dirty' state. + +```ts +const { isDefaultValue, isTouched } = field.state.meta + +// The following line will re-create the non-persistent `dirty` functionality. +const nonPersistentIsDirty = !isDefaultValue +``` + +![Field states extended](https://raw.githubusercontent.com/TanStack/form/main/docs/assets/field-states-extended.png) + +## Field API + +The Field API is an object passed to the render prop function when creating a field. It provides methods for working with the field's state. + +Example: + +```tsrx + field.handleChange(e.currentTarget.value)} +/> +``` + +## Validation + +`@tanstack/octane-form` provides both synchronous and asynchronous validation out of the box. Validation functions can be passed to the `form.Field` component using the `validators` prop. + +Example: + +```tsrx + !value + ? 'A first name is required' + : value.length < 3 + ? 'First name must be at least 3 characters' + : undefined, + onChangeAsync: async ({ value }) => { + await new Promise((resolve) => setTimeout(resolve, 1000)) + return value.includes('error') && 'No "error" allowed in first name' + }, + }} + children={(field) => <> + field.handleChange(e.currentTarget.value)} + /> + + } +/> +``` + +## Validation with Standard Schema Libraries + +In addition to hand-rolled validation options, we also support the [Standard Schema](https://github.com/standard-schema/standard-schema) specification. + +You can define a schema using any of the libraries implementing the specification and pass it to a form or field validator. + +Supported libraries include: + +- [Zod](https://zod.dev/) (v3.24.0 or higher) +- [Valibot](https://valibot.dev/) (v1.0.0 or higher) +- [ArkType](https://arktype.io/) (v2.1.20 or higher) +- [Yup](https://github.com/jquense/yup) (v1.7.0 or higher) + +```tsrx +import { useForm } from '@tanstack/octane-form' +import { z } from 'zod' + +const userSchema = z.object({ + age: z.number().gte(13, 'You must be 13 to make an account'), +}) + +function App() @{ + const form = useForm({ + defaultValues: { age: 0 }, + validators: { onChange: userSchema }, + }) + + + field.handleChange( + event.currentTarget.valueAsNumber, + )} + />} + /> +} +``` + +## Reactivity + +`@tanstack/octane-form` offers various ways to subscribe to form and field state changes, most notably the `useSelector(form.store, …)` hook and the `form.Subscribe` component. These methods allow you to optimize your form's rendering performance by only updating components when necessary. + +Example (inside a component): + +```tsrx +import { useSelector } from '@tanstack/octane-form' + +const firstName = useSelector(form.store, (state) => state.values.firstName) + +const submitButton = [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } +/> +``` + +It is important to remember that while the `useSelector` hook's `selector` prop is optional, it is strongly recommended to provide one, so that updates to unrelated form state do not update the component. + +```ts +// Subscribe to the values you use +const firstName = useSelector(form.store, (state) => state.values.firstName) +const errors = useSelector(form.store, (state) => state.errorMap) +// Subscribe to the entire state only when you need it +const state = useSelector(form.store) +``` + +The `form.Field` component already subscribes to its field state. For form state outside a field, use `useSelector` or `form.Subscribe`; reading `form.state` alone does not subscribe an Octane component. See [Reactivity](./reactivity.md) for more details. + +## Listeners + +`@tanstack/octane-form` allows you to react to specific triggers and "listen" to them to dispatch side effects. + +Example: + +```tsrx + { + console.log(`Country changed to: ${value}, resetting province`) + form.setFieldValue('province', '') + }, + }} + children={(field) => + field.handleChange(event.currentTarget.value)} + />} +/> +``` + +More information can be found at [Listeners](./listeners.md) + +## Array Fields + +Array fields allow you to manage a list of values within a form, such as a list of hobbies. You can create an array field using the `form.Field` component with the `mode="array"` prop. + +When working with array fields, you can use the `pushValue`, `removeValue`, `swapValues`, and `moveValue` methods to add, remove, swap, and move a value from one index to another within the array, respectively. Additional helper methods such as `insertValue`, `replaceValue`, and `clearValues` are also available for inserting, replacing, and clearing array values. + +Example: + +```tsrx +
+

Hobbies

+ @for (const hobby of hobbiesField.state.value; index i; key i) { +
+
+ + field.handleChange(event.currentTarget.value)} + /> + +
} + /> +
+ + field.handleChange(event.currentTarget.value)} + /> + +
} + /> + +
+ } @empty { +

No hobbies found.

+ } + +
} +/> +``` + +Use TSRX's keyed `@for` directive to render lists. This example binds field paths to array indices. If rows contain their own local state and have stable identifiers, use those identifiers as keys. See [Arrays](./arrays.md) for more details. + +## Reset Buttons + +When using ` + +} +``` + +### Async Validation + +Async validation can also be used with `onDynamicAsync` just like with other validation logic. You can even debounce the async validation to avoid excessive calls. + +```ts +const form = useForm({ + defaultValues: { + username: '', + }, + validationLogic: revalidateLogic(), + validators: { + onDynamicAsyncDebounceMs: 500, // Debounce the async validation by 500ms + onDynamicAsync: async ({ value }) => { + if (!value.username) { + return { username: 'Username is required' } + } + // Simulate an async validation + const isValid = await validateUsername(value.username) + return isValid ? undefined : { username: 'Username is already taken' } + }, + }, +}) +``` + +### Standard Schema Validation + +You can also use standard schema validation libraries like Valibot or Zod with `onDynamic` validation. This allows you to define complex validation rules that can change dynamically based on the form state. + +```ts +import { z } from 'zod' + +const schema = z.object({ + firstName: z.string().min(1, 'A first name is required'), + lastName: z.string().min(1, 'A last name is required'), +}) + +const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + validationLogic: revalidateLogic(), + validators: { + onDynamic: schema, + }, +}) +``` diff --git a/docs/framework/octane/guides/focus-management.md b/docs/framework/octane/guides/focus-management.md new file mode 100644 index 000000000..6ebb37924 --- /dev/null +++ b/docs/framework/octane/guides/focus-management.md @@ -0,0 +1,131 @@ +--- +id: focus-management +title: Focus Management +--- + +You may want to focus the first input with an error after an invalid submission. + +[Because TanStack Form does not control your markup](../../../philosophy.md), focus management belongs in your application. Octane provides native DOM refs that you can use to locate an input within the submitted form. + +## Finding an invalid input + +Set `aria-invalid` based on the field's validation state, then focus the first invalid element in `onSubmitInvalid`. Scope the search to the form so that another form on the page cannot receive focus accidentally. + +```tsrx +import { useRef } from 'octane' +import { useForm } from '@tanstack/octane-form' +import { z } from 'zod' + +export default function App() @{ + const formElement = useRef(null) + const form = useForm({ + defaultValues: { age: 0 }, + validators: { + onChange: z.object({ age: z.number().min(12) }), + }, + onSubmit() { + alert('Submitted!') + }, + onSubmitInvalid() { + requestAnimationFrame(() => { + formElement.current?.querySelector( + '[aria-invalid="true"]', + )?.focus() + }) + }, + }) + +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + } + /> + + +} +``` + +The animation frame lets Octane commit the validation state to the DOM before checking `aria-invalid`. DOM order determines which invalid input receives focus. + +## Managing input refs directly + +For a custom input or a more specific focus order, keep refs to the focusable elements and inspect the corresponding field metadata. You can pass refs directly to DOM elements; Octane does not require `forwardRef`. + +```tsrx +import { useRef } from 'octane' +import { useForm } from '@tanstack/octane-form' + +function App() @{ + const firstNameInput = useRef(null) + const lastNameInput = useRef(null) + const form = useForm({ + defaultValues: { firstName: '', lastName: '' }, + onSubmitInvalid({ formApi }) { + if (formApi.getFieldMeta('firstName')?.isValid === false) { + firstNameInput.current?.focus() + } else if (formApi.getFieldMeta('lastName')?.isValid === false) { + lastNameInput.current?.focus() + } + }, + }) + +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + !value ? 'First name is required' : undefined, + }} + children={(field) => + field.handleChange(event.currentTarget.value)} + />} + /> + !value ? 'Last name is required' : undefined, + }} + children={(field) => + field.handleChange(event.currentTarget.value)} + />} + /> + + +} +``` + +For a reusable custom input, accept a `ref` prop and pass it to the underlying input, or expose a focus method with Octane's `useImperativeHandle`. diff --git a/docs/framework/octane/guides/form-composition.md b/docs/framework/octane/guides/form-composition.md new file mode 100644 index 000000000..68fc646f0 --- /dev/null +++ b/docs/framework/octane/guides/form-composition.md @@ -0,0 +1,609 @@ +--- +id: form-composition +title: Form Composition +--- + +TanStack Form's `form.Field` API gives you control over every input and validation message. That flexibility can also produce repetitive code. Custom form hooks let you bind reusable Octane components to your form while preserving field-name and value types. + +The examples in this guide use TSRX. Save modules that render templates with the `.tsrx` extension and compile them with Octane's Vite plugin, as described in the [quick start](../quick-start.md). + +## Custom Form Hooks + +`createFormHook` takes shared field and form contexts and returns a `useAppForm` hook. With no components registered, `useAppForm` accepts the same options as `useForm`: + +```ts +// src/hooks/form-context.ts +import { createFormHookContexts } from '@tanstack/octane-form' + +export const { fieldContext, formContext, useFieldContext, useFormContext } = + createFormHookContexts() +``` + +```ts +// src/hooks/form.ts +import { createFormHook } from '@tanstack/octane-form' +import { fieldContext, formContext } from './form-context' + +export const { useAppForm } = createFormHook({ + fieldContext, + formContext, + fieldComponents: {}, + formComponents: {}, +}) +``` + +```tsrx +// src/App.tsrx +import { useAppForm } from './hooks/form' + +export function App() @{ + const form = useAppForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }) + + + field.handleChange(event.currentTarget.value)} + onBlur={field.handleBlur} + />} + /> +} +``` + +### Pre-bound Field Components + +Use the `useFieldContext` exported from your shared context module in custom field components. The generic specifies the value type that the component accepts. Use `useSelector` to subscribe to the field state the component needs: + +```tsrx +// src/components/text-field.tsrx +import { useSelector } from '@tanstack/octane-form' +import { useFieldContext } from '../hooks/form-context' + +export function TextField({ + label, + type = 'text', +}: { + label: string; + type?: 'text' | 'password'; +}) @{ + const field = useFieldContext() + const value = useSelector(field.store, (state) => state.value) + + +} +``` + +Register the component with your form hook: + +```tsrx +// src/hooks/form.tsrx +import { createFormHook } from '@tanstack/octane-form' +import { TextField } from '../components/text-field.tsrx' +import { fieldContext, formContext } from './form-context' + +export const { useAppForm } = createFormHook({ + fieldContext, + formContext, + fieldComponents: { TextField }, + formComponents: {}, +}) +``` + +Use `AppField` to provide the field context and access your registered component: + +```tsrx +function App() @{ + const form = useAppForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }) + + } + /> +} +``` + +The field's `name` remains checked against the form's values. Mistyping `firstName` produces a TypeScript error. + +#### A note on performance + +These contexts provide stable form and field API instances. State subscriptions come from `useSelector`, `Field`, and `Subscribe`, so sharing an API instance through context does not subscribe every consumer to every form change. Select only the state that a component needs. + +### Pre-bound Form Components + +Form components can use `useFormContext` to share behavior such as a submission button. Wrap them in `form.AppForm` to provide the context: + +```tsrx +import { createFormHook } from '@tanstack/octane-form' +import { fieldContext, formContext, useFormContext } from './form-context' + +function SubscribeButton({ label }: { label: string }) @{ + const form = useFormContext() + + state.isSubmitting} + children={(isSubmitting) => + } + /> +} + +const { useAppForm, withForm } = createFormHook({ + fieldContext, + formContext, + fieldComponents: {}, + formComponents: { SubscribeButton }, +}) + +function App() @{ + const form = useAppForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + onSubmit: ({ value }) => console.log(value), + }) + +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + + + +
+} +``` + +`AppForm` is a context provider. Use a native `
` element to handle browser submission. + +## Breaking big forms into smaller pieces + +`withForm` creates a component that receives a typed form instance. Its `defaultValues` describe the expected values for type checking; they do not initialize the parent form. `props` declares additional props and their defaults: + +```tsrx +const ChildForm = withForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + props: { title: 'Child Form' }, + render: ({ form, title }) =>
+

{title}

+ } + /> + + + +
, +}) + +function App() @{ + const form = useAppForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + }) + + +} +``` + +This example assumes `TextField` and `SubscribeButton` are both registered with the same `createFormHook` call. + +### `withForm` FAQ + +> Why a higher-order component instead of a hook? + +Passing the form through `withForm` lets TypeScript infer the expected form values and additional props without requiring you to supply the form's generics. + +> How should I write the render callback in TSRX? + +Use an arrow callback. A callback that only renders a template can use `render: ({ form }) =>
...
`. When you need local setup or hooks, use a regular TypeScript callback with an explicit `return`: + +```tsrx +const ChildForm = withForm({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, + render: ({ form }) => { + const firstName = useSelector(form.store, (state) => state.values.firstName) + + return

Hello, {firstName}

+ }, +}) +``` + +Import `useSelector` from `@tanstack/octane-form`. Keep the `render` callback as an ordinary callback: `withForm` calls it with form props. Use TSRX statement containers (`@{ ... }`) and template directives such as `@if` in child components rendered by that callback. + +### Context as a last resort + +Some integrations render children without allowing you to pass the form through their props. `useTypedAppFormContext` provides a fallback for those situations: + +```tsrx +import { createFormHook, formOptions } from '@tanstack/octane-form' +import { fieldContext, formContext } from './hooks/form-context' +import { TextField } from './components/text-field.tsrx' + +const { useAppForm, useTypedAppFormContext } = createFormHook({ + fieldContext, + formContext, + fieldComponents: { TextField }, + formComponents: {}, +}) + +const formOpts = formOptions({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, +}) + +function ParentComponent() @{ + const form = useAppForm(formOpts) + + + + +} + +function ChildComponent() @{ + const form = useTypedAppFormContext(formOpts) + + } + /> +} +``` + +> [!IMPORTANT] Type safety +> Prefer `withForm` when you can pass the form explicitly. Context cannot verify that the provider's actual form matches the options supplied to `useTypedAppFormContext`; mismatched types can cause runtime errors. + +## Reusing groups of fields in multiple forms + +`withFieldGroup` lets related fields, such as the password fields from the [linked fields guide](./linked-fields.md), be reused across forms with different shapes. + +The group's default values describe its fields for typing and mapping. They are not used to initialize the parent form. Validators on the parent can return different error types, so shared error components should accept unknown errors: + +```tsrx +function ErrorInfo() @{ + const field = useFieldContext() + const errors = useSelector(field.store, (state) => state.meta.errors) + +
+ @for (const error of errors; index i; key i) { +

+ {typeof error === 'string' ? error : JSON.stringify(error)} +

+ } +
+} + +const { useAppForm, withFieldGroup } = createFormHook({ + fieldContext, + formContext, + fieldComponents: { TextField, ErrorInfo }, + formComponents: { SubscribeButton }, +}) + +type PasswordFields = { + password: string; + confirm_password: string; +} + +const passwordDefaults: PasswordFields = { + password: '', + confirm_password: '', +} + +function PasswordHint({ password }: { password: string }) @{ + @if (password.length === 0) { +

Choose a password for this account.

+ } +} + +const PasswordGroup = withFieldGroup({ + defaultValues: passwordDefaults, + props: { title: 'Password' }, + render: ({ group, title }) => { + // A group's store exposes its relative values. + const password = useSelector(group.store, (state) => state.values.password) + // The parent form's store remains available too. + const isSubmitting = useSelector( + group.form.store, + (state) => state.isSubmitting, + ) + + return
+ {title} + + } + /> + value !== group.getFieldValue('password') + ? 'Passwords do not match' + : undefined, + }} + children={(field) =>
+ + +
} + /> + +
+ }, +}) +``` + +Inside the group, use relative field names and methods such as `group.getFieldValue('password')`. The parent form's overall values are typed as `unknown`, since the group can be attached to many different form shapes. + +Use `fields` to select where the group's values live: + +```tsrx +type Account = + PasswordFields & { + provider: string; + username: string; + } + +type FormValues = { + name: string; + age: number; + account_data: PasswordFields; + linked_accounts: Account[]; +} + +const defaultValues: FormValues = { + name: '', + age: 0, + account_data: { password: '', confirm_password: '' }, + linked_accounts: [ + { + provider: 'TanStack', + username: '', + password: '', + confirm_password: '', + }, + ], +} + +function App() @{ + const form = useAppForm({ + defaultValues, + onSubmitMeta: { action: '' }, + }) + + + +
+ @for (const account of field.state.value; index i; key account.provider) { + + } +
} + /> +
+} +``` + +This example uses a unique provider as each row's key. If your data allows multiple accounts with the same provider, give each account a stable ID and use that as the key. + +A group can also declare `onSubmitMeta` to restrict the forms that use it to a particular submit metadata type. If it omits that option, the parent form may use any submit metadata. + +### Mapping field group values to a different field + +Pass an object to `fields` to map the group's property names to paths in the parent form: + +```tsrx +function App() @{ + const form = useAppForm({ + defaultValues: { + name: '', + age: 0, + password: '', + passwordConfirmation: '', + }, + }) + + +} +``` + +> [!IMPORTANT] +> TypeScript only supports this property mapping for object groups. A group can have an array or record as its top-level value, but that value cannot use this field mapping. + +When the group property names match the parent field names, `createFieldMap` builds the mapping for you: + +```tsrx +import { createFieldMap } from '@tanstack/octane-form' + +const passwordFields = createFieldMap(passwordDefaults) +// { password: 'password', confirm_password: 'confirm_password' } + + +``` + +## Tree-shaking form and field components + +Registering many components in one shared hook can make every consumer import all of them. Use Octane's `lazy` to split a field component into a separate chunk: + +```tsrx +// src/components/text-field.tsrx +import { useSelector } from '@tanstack/octane-form' +import { useFieldContext } from '../hooks/form-context' + +export default function TextField({ + label, + type = 'text', +}: { + label: string; + type?: 'text' | 'password'; +}) @{ + const field = useFieldContext() + const value = useSelector(field.store, (state) => state.value) + + +} +``` + +```tsrx +// src/hooks/form.tsrx +import { lazy } from 'octane' +import { createFormHook } from '@tanstack/octane-form' +import { fieldContext, formContext } from './form-context' + +const TextField = lazy(() => import('../components/text-field.tsrx')) + +export const { useAppForm, withForm } = createFormHook({ + fieldContext, + formContext, + fieldComponents: { TextField }, + formComponents: {}, +}) +``` + +Wrap the form's page in a TSRX pending boundary to display a fallback while the component loads: + +```tsrx +// src/App.tsrx +import { PeoplePage } from './features/people/page.tsrx' + +export function App() @{ + @try { + + } @pending { +

Loading...

+ } +} +``` + +Keep the context module separate from the component module, so both the form hook and the lazy component import the same contexts without a circular dependency. + +## Putting it all together + +The following example combines shared contexts, bound components, reusable form options, and a typed child form: + +```tsrx +import { + createFormHook, + createFormHookContexts, + formOptions, + useSelector, +} from '@tanstack/octane-form' + +const { fieldContext, useFieldContext, formContext, useFormContext } = + createFormHookContexts() + +function TextField({ + label, + type = 'text', +}: { + label: string; + type?: 'text' | 'password'; +}) @{ + const field = useFieldContext() + const value = useSelector(field.store, (state) => state.value) + + +} + +function SubscribeButton({ label }: { label: string }) @{ + const form = useFormContext() + + state.isSubmitting} + children={(isSubmitting) => + } + /> +} + +const { useAppForm, withForm } = createFormHook({ + fieldComponents: { TextField }, + formComponents: { SubscribeButton }, + fieldContext, + formContext, +}) + +const formOpts = formOptions({ + defaultValues: { firstName: 'John', lastName: 'Doe' }, +}) + +const ChildForm = withForm({ + ...formOpts, + props: { title: 'Child Form' }, + render: ({ form, title }) =>
+

{title}

+ } + /> + + + +
, +}) + +export function Parent() @{ + const form = useAppForm({ + ...formOpts, + onSubmit: ({ value }) => console.log(value), + }) + + { + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + + +} +``` + +## API Usage Guidance + +- Use `Field` for individual fields that need direct control over their UI. +- Use `createFormHook`, `AppField`, and `AppForm` to share your application's field and form components. +- Use `withForm` to split one typed form into smaller components. +- Use `withFieldGroup` to reuse related fields across different form shapes. +- Use `FormGroup` when a stage of a form needs its own validation and submission behavior. +- Use `useTypedAppFormContext` when an integration prevents passing a form explicitly. diff --git a/docs/framework/octane/guides/form-groups.md b/docs/framework/octane/guides/form-groups.md new file mode 100644 index 000000000..1ba70b987 --- /dev/null +++ b/docs/framework/octane/guides/form-groups.md @@ -0,0 +1,227 @@ +--- +id: form-groups +title: Form Groups +--- + +When building a multi-stage form, each step often needs its own validation and submission behavior: + +![Form stepper](https://raw.githubusercontent.com/TanStack/form/main/docs/assets/stepper.png) + +Creating a separate form instance for each step makes it harder to validate and submit all the values together. TanStack Form's `form.FormGroup` lets each step validate a portion of one shared form. + +## Usage + +Create a form with `useForm` or [`useAppForm`](./form-composition.md), then use its `FormGroup` component to select a nested value: + +```tsrx +import { useForm } from '@tanstack/octane-form' + +function App() @{ + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { age: 0 }, + }, + }) + +
{JSON.stringify(group.state.value)}
} + /> +} +``` + +The `group` exposes form-like methods, such as `deleteField`, `insertFieldValue`, and `handleSubmit`. `group.handleSubmit()` validates and submits that group without submitting the parent form. + +Pair a form group with Octane's `useState` and TSRX's `@if` to build a wizard. Field paths on the parent form still include the group name: + +```tsrx +// src/Wizard.tsrx +import { useState } from 'octane' +import { useForm } from '@tanstack/octane-form' + +export function Wizard() @{ + const [step, setStep] = useState(0) + const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { age: 0 }, + }, + onSubmit: ({ value }) => { + console.log(value) + }, + }) + +
+ @if (step === 0) { + value.name.trim() + ? undefined + : 'Please enter your name', + }} + onGroupSubmit={() => setStep(1)} + onGroupSubmitInvalid={() => {}} + children={(group) =>
{ + event.preventDefault() + event.stopPropagation() + void group.handleSubmit() + }} + > + } + /> +

{group.state.meta.errors.join(', ')}

+ + } + /> + } @else { +
{ + event.preventDefault() + event.stopPropagation() + + void form.handleSubmit() + }} + > + } + /> +
{JSON.stringify(group.state.value)}
+ + + } + /> + } +
+} +``` + +You can also set `onSubmitMeta` on a group and pass the matching metadata to `group.handleSubmit(meta)`, independently of the parent's submit metadata. + +## Form Group Validation + +Groups can have their own validators. Read group errors from `group.state.meta.errorMap` and `group.state.meta.errors`: + +```tsrx + 'Group error' }} + children={(group) =>
{JSON.stringify(group.state.meta.errorMap)}
} +/> +``` + +Group validators can also set errors on individual fields. Error keys are relative to the group's value, so use `name` for `step1.name`: + +```tsrx + ({ + group: value.name === 'error' ? 'Group error' : undefined, + fields: { + name: value.name === 'error' ? 'Field error' : undefined, + }, + }), + }} + children={(group) =>
{JSON.stringify(group.state.meta.errors)}
} +/> +``` + +Standard Schema validators work with groups too: + +```tsrx +
{JSON.stringify(group.state.meta.errors)}
} +/> +``` + +Relative field paths let you reuse a group's schema inside the parent's schema: + +```ts +import { z } from 'zod' + +const step1Schema = z.object({ name: z.string().min(2) }) +const step2Schema = z.object({ age: z.number().min(18) }) +const schema = z.object({ + step1: step1Schema, + step2: step2Schema, +}) +``` + +Pass `step1Schema` to its group and `schema` to the parent form. Whole-form validation then checks all stages even if a step was bypassed. + +### Dynamic Group Validation + +With [dynamic validation](./dynamic-validation.md), configure `revalidateLogic()` on the parent and give each group its own `onDynamic` validator: + +```tsrx +const form = useForm({ + defaultValues: { + step1: { name: '' }, + step2: { age: 0 }, + }, + validationLogic: revalidateLogic(), + validators: { + // This follows the parent form's submission attempts. + onDynamic: schema, + }, +}) + + } +/> +``` + +Submitting a group does not increment the parent form's submission attempts. The group's dynamic validation instead uses `group.state.meta.submissionAttempts` to decide when to change its validation mode. + +## Form Group State + +Read the group's current value with `group.state.value`. Its metadata includes: + +- `group.state.meta.isFieldsValid`: whether field-level validators have no errors +- `group.state.meta.isGroupValid`: whether group-level validators have no errors +- `group.state.meta.isValid`: whether both field-level and group-level validators have no errors +- `group.state.meta.isSubmitting`: whether a group submission is in progress + +Within `FormGroup`'s render callback, these values update when the group's state changes. diff --git a/docs/framework/octane/guides/linked-fields.md b/docs/framework/octane/guides/linked-fields.md new file mode 100644 index 000000000..51741883b --- /dev/null +++ b/docs/framework/octane/guides/linked-fields.md @@ -0,0 +1,71 @@ +--- +id: linked-fields +title: Link Two Form Fields Together +--- + +You may find yourself needing to link two fields together, such that one is validated when another's value has changed. +One such use case is when you have both a `password` and a `confirm_password` field. +Here, you want the `confirm_password` field to error out if its value doesn't match that of the `password` field, regardless of which field triggered the value change. + +Imagine the following user flow: + +- User updates the `confirm_password` field. +- User updates the `password` field. + +In this example, the form will still have errors present because the `confirm_password` field's validation has not been re-run to mark the field as valid. + +To solve this, you need to make sure that the `confirm_password` field's validation is re-run when the `password` field is updated. +To do this, add `onChangeListenTo` to the `confirm_password` field's `validators` option. In Octane, use the native `onInput` event to update text fields at each keystroke. + +```tsrx +import { useForm } from '@tanstack/octane-form' + +function App() @{ + const form = useForm({ + defaultValues: { + password: '', + confirm_password: '', + }, + // ... + }) + +
+ } + /> + { + if (value !== fieldApi.form.getFieldValue('password')) { + return 'Passwords do not match' + } + return undefined + }, + }} + children={(field) =>
+ + @for (const error of field.state.meta.errors; index i; key i) { +
{error}
+ } +
} + /> +
+} +``` + +This is similar to the `onBlurListenTo` validator option, which re-runs the validation when the linked field is blurred. Wire `onBlur={field.handleBlur}` on each input when using blur validation. diff --git a/docs/framework/octane/guides/listeners.md b/docs/framework/octane/guides/listeners.md new file mode 100644 index 000000000..8a1d9794e --- /dev/null +++ b/docs/framework/octane/guides/listeners.md @@ -0,0 +1,121 @@ +--- +id: listeners +title: Side effects for event triggers +--- + +Use the listener API to run side effects in response to form events. For example, you might need to reset a field when another field changes. + +Imagine the following user flow: + +- The user selects a country. +- The user selects a province. +- The user changes the country. + +The previously selected province may no longer be valid. A field's `onChange` listener can reset it whenever the country changes. + +Fields support listeners for: + +- `onChange` +- `onBlur` +- `onMount` +- `onSubmit` +- `onUnmount` + +```tsrx +import { useForm } from '@tanstack/octane-form' + +function App() @{ + const form = useForm({ + defaultValues: { + country: '', + province: '', + }, + }) + +
+ { + console.log(`Country changed to: ${value}, resetting province`) + form.setFieldValue('province', '') + }, + }} + children={(field) => } + /> + } + /> +
+} +``` + +`onChange` here is a TanStack Form listener, fired by `field.handleChange`. The native text input uses Octane's `onInput` handler so that the listener runs for each edit. + +## Built-in Debouncing + +When a listener makes an API request or performs expensive work, use `onChangeDebounceMs` or `onBlurDebounceMs` to debounce its calls. + +```tsrx + { + console.log(`Country changed to: ${value} without another edit for 500ms`) + form.setFieldValue('province', '') + }, + }} + children={(field) => + field.handleChange(event.currentTarget.value)} + />} +/> +``` + +## Form listeners + +Form-level listeners provide access to `onMount` and `onSubmit`, and receive `onChange` and `onBlur` events from the form's fields. You can also debounce form-level change and blur listeners. + +`onMount` and `onSubmit` listeners receive `formApi`. `onChange` and `onBlur` listeners receive both `formApi` and the `fieldApi` that triggered the event. + +```ts +const form = useForm({ + defaultValues: { country: '', province: '' }, + onSubmit: async ({ value }) => { + // Save the form values. + console.log(value) + }, + listeners: { + onMount: ({ formApi }) => { + console.log('Form mounted', formApi.state.values) + }, + onChange: ({ formApi, fieldApi }) => { + if (formApi.state.isValid) { + void formApi.handleSubmit() + } + console.log(fieldApi.name, fieldApi.state.value) + }, + onChangeDebounceMs: 500, + }, +}) +``` + +Listeners are for event-driven side effects. To display current values or metadata in your template, use the subscriptions described in [Reactivity](./reactivity.md). diff --git a/docs/framework/octane/guides/reactivity.md b/docs/framework/octane/guides/reactivity.md new file mode 100644 index 000000000..e815ec03a --- /dev/null +++ b/docs/framework/octane/guides/reactivity.md @@ -0,0 +1,98 @@ +--- +id: reactivity +title: Reactivity +--- + +Reading `form.state` gives you the current state, but it does not subscribe an Octane component to later changes. The Octane adapter provides `useSelector` and `form.Subscribe` to create those subscriptions. + +Use subscriptions to display current values, select UI based on field values, or use form state in component logic. The `form.Field` component already subscribes to its own field state, so reading `field.state` inside its render callback updates the field's UI. + +> To run side effects in response to form events, use the [listener](./listeners.md) API. + +## useSelector + +Import `useSelector` from `@tanstack/octane-form` to select a value from the form store. The hook subscribes the component that calls it to changes in that selected value. + +```tsrx +import { useForm, useSelector } from '@tanstack/octane-form' + +function App() @{ + const form = useForm({ + defaultValues: { firstName: '', lastName: '' }, + }) + const firstName = useSelector(form.store, (state) => state.values.firstName) + const errors = useSelector(form.store, (state) => state.errors) + +
+ + field.handleChange(event.currentTarget.value)} + />} + /> +

Hello, {firstName || 'stranger'}!

+

Form errors: {errors.length}

+
+} +``` + +The selector is optional, but selecting only the state you use avoids updates caused by unrelated changes. `useSelector(form.store)` subscribes to the entire form state. + +The hook is re-exported from `@tanstack/octane-store` and compares selected values by identity by default. Prefer selecting a primitive or an existing state object. If your selector creates a new object or array, provide an appropriate `compare` function when you need to avoid updates for equivalent selections. + +```ts +const status = useSelector( + form.store, + (state) => ({ canSubmit: state.canSubmit, isSubmitting: state.isSubmitting }), + { + compare: (previous, next) => + previous.canSubmit === next.canSubmit && + previous.isSubmitting === next.isSubmitting, + }, +) +``` + +## form.Subscribe + +Use `form.Subscribe` when the selected value is needed only within part of your template. Updates to its selection update the subscription component and its rendered content without requiring the containing component to subscribe to that state. + +```tsrx + state.values.firstName} + children={(firstName) =>
+ @if (firstName) { + } + /> + } @else { +

Enter your first name to continue.

+ } +
} +/> +``` + +Pass the render callback explicitly through `children={...}` in TSRX. You can select submission state in the same way: + +```tsrx + state.isSubmitting} + children={(isSubmitting) => } +/> +``` + +Choose `useSelector` when you need the selected value in component logic, and `form.Subscribe` when you can keep the subscription beside the UI that consumes it. Octane's compiler optimizes rendering, but it still needs a subscription to observe changes to TanStack Form's external store. diff --git a/docs/framework/octane/guides/submission-handling.md b/docs/framework/octane/guides/submission-handling.md new file mode 100644 index 000000000..e5f8e53c6 --- /dev/null +++ b/docs/framework/octane/guides/submission-handling.md @@ -0,0 +1,99 @@ +--- +id: submission-handling +title: Submission handling +--- + +## Passing additional data to submission handling + +You may have multiple submission actions, such as continuing to another page or returning to a menu. Define the expected metadata with `onSubmitMeta`, and pass an action to `form.handleSubmit`. The metadata is available in `onSubmit` alongside the submitted value. + +> If `form.handleSubmit()` is called without metadata, it uses the default from `onSubmitMeta`. + +```tsrx +import { useForm } from '@tanstack/octane-form' + +type FormMeta = { + submitAction: 'continue' | 'backToMenu' | null; +} + +const defaultMeta: FormMeta = { + submitAction: null, +} + +function App() @{ + const form = useForm({ + defaultValues: { data: '' }, + onSubmitMeta: defaultMeta, + onSubmit: async ({ value, meta }) => { + console.log(`Selected action - ${meta.submitAction}`, value) + }, + }) + +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + + field.handleChange(event.currentTarget.value)} + />} + /> + + + + +} +``` + +The action buttons use `type="button"` because they call `handleSubmit` themselves. The regular submit button and keyboard submission go through the form's native `onSubmit` handler, which prevents browser navigation and submits with the default metadata. + +## Transforming data with Standard Schemas + +TanStack Form supports [Standard Schemas for validation](./validation.md), but the value passed to `onSubmit` is the schema's input data. To obtain transformed output, parse the submitted value with your schema. + +```ts +import { useForm } from '@tanstack/octane-form' +import { z } from 'zod' + +const schema = z.object({ + age: z.string().transform((age) => Number(age)), +}) + +const defaultValues: z.input = { + age: '13', +} + +// Inside an Octane component: +const form = useForm({ + defaultValues, + validators: { onChange: schema }, + onSubmit: ({ value }) => { + const inputAge: string = value.age + const result = schema.parse(value) + const outputAge: number = result.age + console.log(inputAge, outputAge) + }, +}) +``` diff --git a/docs/framework/octane/guides/validation.md b/docs/framework/octane/guides/validation.md new file mode 100644 index 000000000..a4586e732 --- /dev/null +++ b/docs/framework/octane/guides/validation.md @@ -0,0 +1,534 @@ +--- +id: form-validation +title: Form and Field Validation +--- + +At the core of TanStack Form's functionality is the concept of validation. TanStack Form makes validation highly customizable: + +- You can control when to perform the validation (on change, on input, on blur, on submit, etc.) +- Validation rules can be defined at the field-level or at the form-level +- Validation can be synchronous or asynchronous (for example, as a result of an API call) + +## When is validation performed? + +It's up to you! The `` component accepts validation callbacks through its `validators` option, such as `onChange` or `onBlur`. Those callbacks are passed the current value of the field, as well as the `fieldApi` object, so that you can perform the validation. If you find a validation error, simply return the error message as a string, and it will be available in `field.state.meta.errors`. + +The snippets below belong in `.tsrx` components using `useForm` from `@tanstack/octane-form`. Octane uses native DOM events: `onInput` updates the value at each keystroke and triggers TanStack Form's `onChange` validation; the browser's `onChange` event fires when the input is committed. + +Here is an example: + +```tsrx + value < 13 + ? 'You must be 13 to make an account' + : undefined, + }} + children={(field) => <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } +/> +``` + +In the example above, the validation is done at each keystroke (`onChange`). If, instead, we wanted the validation to be done when the field is blurred, we would change the code above like so: + +```tsrx + value < 13 + ? 'You must be 13 to make an account' + : undefined, + }} + children={(field) => <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } +/> +``` + +So, you can control when the validation is done by implementing the desired callback. You can even perform different pieces of validation at different times: + +```tsrx + value < 13 + ? 'You must be 13 to make an account' + : undefined, + onBlur: ({ value }) => (value < 0 ? 'Invalid value' : undefined), + }} + children={(field) => <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } +/> +``` + +In the example above, we are validating different things on the same field at different times (at each keystroke and when blurring the field). Since `field.state.meta.errors` is an array, all the relevant errors at a given time are displayed. You can also use `field.state.meta.errorMap` to get errors based on _when_ the validation was done (onChange, onBlur, etc.). More information about displaying errors is below. + +## Displaying Errors + +Once you have your validation in place, you can map the errors from an array to be displayed in your UI: + +```tsrx + value < 13 + ? 'You must be 13 to make an account' + : undefined, + }} + children={(field) => <> + {/* ... */} + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(',')} + } + } +/> +``` + +Or use the `errorMap` property to access the specific error you're looking for: + +```tsrx + value < 13 + ? 'You must be 13 to make an account' + : undefined, + }} + children={(field) => <> + {/* ... */} + @if (field.state.meta.errorMap['onChange']) { + {field.state.meta.errorMap['onChange']} + } + } +/> +``` + +It's worth mentioning that our `errors` array and the `errorMap` match the types returned by the validators. This means that: + +```tsrx + (value < 13 ? { isOldEnough: false } : undefined), + }} + children={(field) => <> + {/* ... */} + {/* errorMap.onChange is type `{isOldEnough: false} | undefined` */} + {/* meta.errors is type `Array<{isOldEnough: false} | undefined>` */} + @if (field.state.meta.errorMap.onChange?.isOldEnough === false) { + The user is not old enough + } + } +/> +``` + +## Validation at field-level vs at form-level + +As shown above, each `` accepts its own validation rules via the callbacks such as `onChange` and `onBlur`. It is also possible to define validation rules at the form-level (as opposed to field-by-field) by passing similar callbacks to the `useForm()` hook. + +Example: + +```tsrx +import { useForm, useSelector } from '@tanstack/octane-form' + +export default function App() @{ + const form = useForm({ + defaultValues: { + age: 0, + }, + onSubmit: async ({ value }) => { + console.log(value) + }, + validators: { + // Add validators to the form the same way you would add them to a field + onChange({ value }) { + if (value.age < 13) { + return 'Must be 13 or older to sign' + } + return undefined + }, + }, + }) + + // Subscribe to the form's `errorMap` so that updates to it will cause re-renders + // Alternatively, you can use `form.Subscribe` + const formErrorMap = useSelector(form.store, (state) => state.errorMap) + +
+ {/* ... */} + @if (formErrorMap.onChange) { +
+ There was an error on the form: {formErrorMap.onChange} +
+ } + {/* ... */} +
+} +``` + +### Setting field-level errors from the form's validators + +You can set errors on the fields from the form's validators. One common use case for this is validating all the fields on submit by calling a single API endpoint in the form's `onSubmitAsync` validator. In the example below, `verifyDataOnServer` represents your application's server validation function. + +```tsrx +import { useForm } from '@tanstack/octane-form' + +export default function App() @{ + const form = useForm({ + defaultValues: { + age: 0, + socials: [] as { url: string }[], + details: { + email: '', + }, + }, + validators: { + onSubmitAsync: async ({ value }) => { + // Validate the value on the server + const hasErrors = await verifyDataOnServer(value) + if (hasErrors) { + return { + form: 'Invalid data', // The `form` key is optional + fields: { + age: 'Must be 13 or older to sign', + // Set errors on nested fields with the field's name + 'socials[0].url': 'The provided URL does not exist', + 'details.email': 'An email is required', + }, + } + } + + return null + }, + }, + }) + +
+
{ + e.preventDefault() + e.stopPropagation() + void form.handleSubmit() + }} + > + <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } + /> + state.errorMap} + children={(errorMap) => @if (errorMap.onSubmit) { +
+ There was an error on the form: {errorMap.onSubmit} +
+ }} + /> + {/*...*/} + +
+} +``` + +> Something worth mentioning is that if you have a form validation function that returns an error, that error may be overwritten by the field-specific validation. +> +> This means that: +> +> ```tsrx +> import { useForm } from '@tanstack/octane-form' +> +> function App() @{ +> const form = useForm({ +> defaultValues: { +> age: 0, +> }, +> validators: { +> onChange: ({ value }) => ({ +> fields: { +> age: value.age < 12 ? 'Too young!' : undefined, +> }, +> }), +> }, +> }) +> +> name="age" +> validators={{ +> onChange: ({ value }) => (value % 2 === 0 ? 'Must be odd!' : undefined), +> }} +> children={(field) => {field.state.meta.errors.join(', ')}} +> /> +> } +> ``` +> +> Will only show `'Must be odd!'` even if the 'Too young!' error is returned by the form-level validation. + +## Asynchronous Functional Validation + +While we suspect most validation will be synchronous, there are many instances where a network call or some other async operation would be useful to validate against. + +To do this, we have dedicated `onChangeAsync`, `onBlurAsync`, and other methods that can be used to validate against: + +```tsrx + { + await new Promise((resolve) => setTimeout(resolve, 1000)) + return value < 13 ? 'You must be 13 to make an account' : undefined + }, + }} + children={(field) => <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } +/> +``` + +Synchronous and asynchronous validators can coexist. For example, it is possible to define both `onBlur` and `onBlurAsync` on the same field: + +```tsrx + (value < 13 ? 'You must be at least 13' : undefined), + onBlurAsync: async ({ value }) => { + const currentAge = await fetchCurrentAgeOnProfile() + return value < currentAge ? 'You can only increase the age' : undefined + }, + }} + children={(field) => <> + + field.handleChange(e.currentTarget.valueAsNumber)} + /> + @if (!field.state.meta.isValid) { + {field.state.meta.errors.join(', ')} + } + } +/> +``` + +The synchronous validation method (`onBlur`) is run first, and the asynchronous method (`onBlurAsync`) is only run if the synchronous one (`onBlur`) succeeds. To change this behaviour, set the `asyncAlways` option to `true`, and the async method will be run regardless of the result of the sync method. + +### Built-in Debouncing + +While async calls are the way to go when validating against the database, running a network request on every keystroke is a good way to DDoS your database. + +Instead, we enable an easy method for debouncing your `async` calls by adding a single property: + +```tsrx + { + // ... + }, + }} + children={(field) => <> + {/* ... */} + } +/> +``` + +This will debounce every async call with a 500ms delay. You can even override this property on a per-validation property: + +```tsrx + { + // ... + }, + onBlurAsync: async ({ value }) => { + // ... + }, + }} + children={(field) => <> + {/* ... */} + } +/> +``` + +This will run `onChangeAsync` every 1500ms, whereas `onBlurAsync` will run every 500ms. + +## Validation through Schema Libraries + +While functions provide more flexibility and customization over your validation, they can be a bit verbose. To help solve this, there are libraries that provide schema-based validation to make shorthand and type-strict validation substantially easier. You can also define a single schema for your entire form and pass it to the form-level validators; errors will automatically propagate to the fields. + +### Standard Schema Libraries + +TanStack Form natively supports all libraries following the [Standard Schema specification](https://github.com/standard-schema/standard-schema), most notably: + +- [Zod](https://zod.dev/) +- [Valibot](https://valibot.dev/) +- [ArkType](https://arktype.io/) +- [Effect/Schema](https://effect.website/docs/schema/standard-schema/) + +_Note:_ make sure to use the latest version of the schema libraries as older versions might not support Standard Schema yet. + +> Validation will not provide you with transformed values. See [submission handling](./submission-handling.md) for more information. + +To use schemas from these libraries you can pass them to the `validators` props as you would do with a custom function: + +```tsrx +import { useForm } from '@tanstack/octane-form' +import { z } from 'zod' + +const userSchema = z.object({ + age: z.number().gte(13, 'You must be 13 to make an account'), +}) + +function App() @{ + const form = useForm({ + defaultValues: { + age: 0, + }, + validators: { + onChange: userSchema, + }, + }) + +
+ + field.handleChange( + event.currentTarget.valueAsNumber, + )} + />} + /> +
+} +``` + +Async validators at the form- and field-level are supported as well: + +```tsrx + { + const currentAge = await fetchCurrentAgeOnProfile() + return value >= currentAge + }, { + message: 'You can only increase the age', + }), + }} + children={(field) => <> + {/* ... */} + } +/> +``` + +If you need even more control over your Standard Schema validation, you can combine a Standard Schema with a callback function like so: + +```tsrx + { + const errors = fieldApi.parseValueWithSchema( + z.number().gte(13, 'You must be 13 to make an account'), + ) + if (errors) return errors + // continue with your validation + }, + }} + children={(field) => <> + {/* ... */} + } +/> +``` + +## Preventing invalid forms from being submitted + +The callbacks, such as `onChange` and `onBlur`, are also run when the form is submitted and the submission is blocked because the form is invalid. + +The form state object has a `canSubmit` flag that is `false` when any field is invalid and the form has been touched (`canSubmit` is true until the form has been touched, even if some fields are "technically" invalid based on their `onChange`/`onBlur` props). + +You can subscribe to `canSubmit` 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). + +```tsrx + [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => } +/> +``` + +To prevent the form from being submitted before any interaction, combine `canSubmit` with `isPristine` flags. A simple condition like `!canSubmit || isPristine` effectively disables submissions until the user has made changes. diff --git a/docs/framework/octane/quick-start.md b/docs/framework/octane/quick-start.md new file mode 100644 index 000000000..a038eeb18 --- /dev/null +++ b/docs/framework/octane/quick-start.md @@ -0,0 +1,223 @@ +--- +id: quick-start +title: Quick Start +--- + +TanStack Form is designed for production usage, with a focus on type safety, performance, and composition. + +Our [philosophy around the library's usage](../../philosophy.md) values scalability and long-term developer experience. The Octane adapter follows the same approach, with components authored in TSRX. + +## Set up Octane and TSRX + +Install the form adapter and Octane, along with Vite and the TSRX TypeScript tooling: + +```sh +pnpm add @tanstack/octane-form octane zod +pnpm add -D vite typescript @tsrx/typescript-plugin +``` + +Configure Vite to compile your `.tsrx` files and the adapter's source modules: + +```ts +// vite.config.ts +import { defineConfig } from 'vite' +import { octane } from 'octane/compiler/vite' + +export default defineConfig({ + plugins: [octane()], +}) +``` + +For TypeScript and editor support, configure your project for Octane: + +```json +{ + "tsrx": { + "compiler": "octane/compiler/volar" + }, + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "preserve", + "jsxImportSource": "octane", + "allowImportingTsExtensions": true, + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "plugins": [{ "name": "@tsrx/typescript-plugin" }] + }, + "include": ["src", "vite.config.ts"] +} +``` + +Use `tsrx-tsc --noEmit -p tsconfig.json` to check both TypeScript and TSRX. An HTML entry with `
` can load your form through ``. The [simple example](./examples/simple) includes the complete Vite setup. + +## Compose reusable form components + +The following `src/index.tsrx` example defines reusable inputs and a submit button, then binds them to a form hook. In a larger app, move these components and contexts into their own modules as described in [Form Composition](./guides/form-composition.md). + +```tsrx +import { createRoot } from 'octane' +import { createFormHook, createFormHookContexts } from '@tanstack/octane-form' +// Valibot, ArkType, and other Standard Schema libraries work too. +import { z } from 'zod' + +const { fieldContext, formContext, useFieldContext, useFormContext } = + createFormHookContexts() + +function TextField({ label }: { label: string }) @{ + const field = useFieldContext() + + +} + +function NumberField({ label }: { label: string }) @{ + const field = useFieldContext() + + +} + +function SubmitButton() @{ + const form = useFormContext() + + [state.canSubmit, state.isSubmitting] as const} + children={([canSubmit, isSubmitting]) => } + /> +} + +// Define this hook once for consistent, type-safe forms throughout your app. +const { useAppForm } = createFormHook({ + fieldComponents: { TextField, NumberField }, + formComponents: { SubmitButton }, + fieldContext, + formContext, +}) + +function PeoplePage() @{ + const form = useAppForm({ + defaultValues: { + username: '', + age: 0, + }, + validators: { + onChange: z.object({ + username: z.string(), + age: z.number().min(13), + }), + }, + onSubmit: ({ value }) => { + alert(JSON.stringify(value, null, 2)) + }, + }) + +
{ + event.preventDefault() + void form.handleSubmit() + }} + > +

Personal Information

+ } + /> + } + /> + + + + +} + +const rootElement = document.getElementById('root')! +createRoot(rootElement).render(PeoplePage) +``` + +Octane uses native DOM events. Use `onInput` to update text and number fields as the user types, while keeping TanStack Form's validator names such as `onChange`. Mount the component function with `createRoot(...).render(PeoplePage)`. + +## Use a form directly + +While we suggest `createFormHook` for shared components, `useForm` and `form.Field` also support one-off forms: + +```tsrx +import { createRoot } from 'octane' +import { useForm } from '@tanstack/octane-form' + +function PeoplePage() @{ + const form = useForm({ + defaultValues: { age: 0 }, + onSubmit: ({ value }) => { + alert(JSON.stringify(value, null, 2)) + }, + }) + +
{ + event.preventDefault() + void form.handleSubmit() + }} + > + value >= 13 + ? undefined + : 'Must be 13 or older', + }} + children={(field) => } + /> + + +} + +const rootElement = document.getElementById('root')! +createRoot(rootElement).render(PeoplePage) +``` + +All options from `useForm` can be used in `useAppForm`, and all properties from `form.Field` can be used in `form.AppField`. diff --git a/docs/installation.md b/docs/installation.md index e23e6ecd9..10c49822b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,6 +13,7 @@ angular: @tanstack/angular-form solid: @tanstack/solid-form lit: @tanstack/lit-form svelte: @tanstack/svelte-form +octane: @tanstack/octane-form From 2941bfc675fbace8b66a423e0772cc77239a1019 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 30 Sep 2026 09:55:49 -0700 Subject: [PATCH 23/23] docs: fix tests --- docs/config.json | 8 -------- docs/framework/octane/guides/debugging.md | 2 -- 2 files changed, 10 deletions(-) diff --git a/docs/config.json b/docs/config.json index 70f577536..61d9b390f 100644 --- a/docs/config.json +++ b/docs/config.json @@ -271,10 +271,6 @@ "label": "Dynamic Validation", "to": "framework/octane/guides/dynamic-validation" }, - { - "label": "Async Initial Values", - "to": "framework/octane/guides/async-initial-values" - }, { "label": "Arrays", "to": "framework/octane/guides/arrays" @@ -303,10 +299,6 @@ "label": "Submission Handling", "to": "framework/octane/guides/submission-handling" }, - { - "label": "UI Libraries", - "to": "framework/octane/guides/ui-libraries" - }, { "label": "Focus Management", "to": "framework/octane/guides/focus-management" diff --git a/docs/framework/octane/guides/debugging.md b/docs/framework/octane/guides/debugging.md index 2ed9bd487..71af69ec7 100644 --- a/docs/framework/octane/guides/debugging.md +++ b/docs/framework/octane/guides/debugging.md @@ -20,8 +20,6 @@ const form = useForm({ }) ``` -For fetched data, see [Async Initial Values](./async-initial-values.md). - ## Text values update only after blur Octane uses native DOM events. `onChange` follows the browser's commit behavior; use `onInput` to update a text field after each edit.