@tanstack/angular-form 1.12.3 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,86 +1,124 @@
1
- import { FormApi, FieldApi } from '@tanstack/form-core';
1
+ import { FieldApi, FormApi } from '@tanstack/form-core';
2
2
  export * from '@tanstack/form-core';
3
- import { injectStore as injectStore$1 } from '@tanstack/angular-store';
4
3
  import * as i0 from '@angular/core';
5
- import { booleanAttribute, numberAttribute, Input, Directive } from '@angular/core';
6
-
7
- function injectForm(opts) {
8
- const api = new FormApi(opts);
9
- injectStore$1(api.store, (state) => state.isSubmitting);
10
- return api;
11
- }
4
+ import { input, numberAttribute, booleanAttribute, computed, untracked, inject, Injector, effect, ChangeDetectorRef, Directive, signal, Injectable } from '@angular/core';
5
+ import { injectStore as injectStore$1 } from '@tanstack/angular-store';
12
6
 
13
7
  class TanStackField {
14
- name;
15
- defaultValue;
16
- asyncDebounceMs;
17
- asyncAlways;
18
- tanstackField;
19
- validators;
20
- listeners;
21
- defaultMeta;
22
- disableErrorFlat;
23
- api;
24
- getOptions() {
25
- return {
26
- defaultValue: this.defaultValue,
27
- asyncDebounceMs: this.asyncDebounceMs,
28
- asyncAlways: this.asyncAlways,
29
- disableErrorFlat: this.disableErrorFlat,
30
- validators: this.validators,
31
- listeners: this.listeners,
32
- defaultMeta: this.defaultMeta,
33
- name: this.name,
34
- form: this.tanstackField,
35
- };
36
- }
37
- unmount;
38
- ngOnInit() {
39
- this.api = new FieldApi(this.getOptions());
40
- this.unmount = this.api.mount();
8
+ name = input.required();
9
+ defaultValue = input();
10
+ asyncDebounceMs = input(undefined, {
11
+ transform: numberAttribute,
12
+ });
13
+ asyncAlways = input(undefined, {
14
+ transform: booleanAttribute,
15
+ });
16
+ tanstackField = input.required();
17
+ validators = input();
18
+ listeners = input();
19
+ defaultMeta = input();
20
+ mode = input();
21
+ disableErrorFlat = input();
22
+ _api = computed(() => {
23
+ return new FieldApi(untracked(this.options));
24
+ });
25
+ get api() {
26
+ return this._api();
41
27
  }
42
- ngOnDestroy() {
43
- this.unmount?.();
28
+ options = computed(() => ({
29
+ defaultValue: this.defaultValue(),
30
+ asyncDebounceMs: this.asyncDebounceMs(),
31
+ asyncAlways: this.asyncAlways(),
32
+ disableErrorFlat: this.disableErrorFlat(),
33
+ validators: this.validators(),
34
+ listeners: this.listeners(),
35
+ defaultMeta: this.defaultMeta(),
36
+ name: this.name(),
37
+ form: this.tanstackField(),
38
+ }));
39
+ injector = inject(Injector);
40
+ constructor() {
41
+ effect((onCleanup) => {
42
+ const unmount = this._api().mount();
43
+ onCleanup(() => {
44
+ unmount();
45
+ });
46
+ });
47
+ effect(() => {
48
+ this._api().update(this.options());
49
+ });
44
50
  }
45
- ngOnChanges() {
46
- const api = this.api;
47
- if (!api)
48
- return;
49
- api.update(this.getOptions());
51
+ cd = inject(ChangeDetectorRef);
52
+ ngOnInit() {
53
+ const vals = injectStore$1(this._api().store, this.mode() === 'array'
54
+ ? (state) => {
55
+ return [
56
+ state.meta,
57
+ Object.keys(state.value ?? []).length,
58
+ ];
59
+ }
60
+ : undefined, {
61
+ injector: this.injector,
62
+ });
63
+ effect(() => {
64
+ // Load bearing change detection check
65
+ const _values = vals();
66
+ this.cd.markForCheck();
67
+ }, { injector: this.injector });
50
68
  }
51
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TanStackField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
52
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.14", type: TanStackField, isStandalone: true, selector: "[tanstackField]", inputs: { name: "name", defaultValue: "defaultValue", asyncDebounceMs: ["asyncDebounceMs", "asyncDebounceMs", numberAttribute], asyncAlways: ["asyncAlways", "asyncAlways", booleanAttribute], tanstackField: "tanstackField", validators: "validators", listeners: "listeners", defaultMeta: "defaultMeta", disableErrorFlat: "disableErrorFlat" }, exportAs: ["field"], usesOnChanges: true, ngImport: i0 });
69
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
70
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.6", type: TanStackField, isStandalone: true, selector: "[tanstackField]", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, asyncDebounceMs: { classPropertyName: "asyncDebounceMs", publicName: "asyncDebounceMs", isSignal: true, isRequired: false, transformFunction: null }, asyncAlways: { classPropertyName: "asyncAlways", publicName: "asyncAlways", isSignal: true, isRequired: false, transformFunction: null }, tanstackField: { classPropertyName: "tanstackField", publicName: "tanstackField", isSignal: true, isRequired: true, transformFunction: null }, validators: { classPropertyName: "validators", publicName: "validators", isSignal: true, isRequired: false, transformFunction: null }, listeners: { classPropertyName: "listeners", publicName: "listeners", isSignal: true, isRequired: false, transformFunction: null }, defaultMeta: { classPropertyName: "defaultMeta", publicName: "defaultMeta", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, disableErrorFlat: { classPropertyName: "disableErrorFlat", publicName: "disableErrorFlat", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["field"], ngImport: i0 });
53
71
  }
54
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TanStackField, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackField, decorators: [{
55
73
  type: Directive,
56
74
  args: [{
57
75
  selector: '[tanstackField]',
58
76
  standalone: true,
59
77
  exportAs: 'field',
60
78
  }]
61
- }], propDecorators: { name: [{
62
- type: Input,
63
- args: [{ required: true }]
64
- }], defaultValue: [{
65
- type: Input
66
- }], asyncDebounceMs: [{
67
- type: Input,
68
- args: [{ transform: numberAttribute }]
69
- }], asyncAlways: [{
70
- type: Input,
71
- args: [{ transform: booleanAttribute }]
72
- }], tanstackField: [{
73
- type: Input,
74
- args: [{ required: true }]
75
- }], validators: [{
76
- type: Input
77
- }], listeners: [{
78
- type: Input
79
- }], defaultMeta: [{
80
- type: Input
81
- }], disableErrorFlat: [{
82
- type: Input
83
- }] } });
79
+ }], ctorParameters: () => [] });
80
+
81
+ class TanStackFieldInjectable {
82
+ _api = signal(null);
83
+ get api() {
84
+ return this._api();
85
+ }
86
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackFieldInjectable, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
87
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackFieldInjectable, providedIn: null });
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackFieldInjectable, decorators: [{
90
+ type: Injectable,
91
+ args: [{ providedIn: null }]
92
+ }] });
93
+ function injectField() {
94
+ return inject((TanStackFieldInjectable));
95
+ }
96
+
97
+ class TanStackAppField extends TanStackField {
98
+ base = inject(TanStackFieldInjectable);
99
+ constructor() {
100
+ super();
101
+ effect(() => {
102
+ this.base._api.set(this.api);
103
+ });
104
+ }
105
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackAppField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
106
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.6", type: TanStackAppField, isStandalone: true, selector: "[tanstack-app-field]", providers: [TanStackFieldInjectable], usesInheritance: true, ngImport: i0 });
107
+ }
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TanStackAppField, decorators: [{
109
+ type: Directive,
110
+ args: [{
111
+ selector: '[tanstack-app-field]',
112
+ standalone: true,
113
+ providers: [TanStackFieldInjectable],
114
+ }]
115
+ }], ctorParameters: () => [] });
116
+
117
+ function injectForm(opts) {
118
+ const api = new FormApi(opts);
119
+ injectStore$1(api.store, (state) => state.isSubmitting);
120
+ return api;
121
+ }
84
122
 
85
123
  function injectStore(form, selector) {
86
124
  return injectStore$1(form.store, selector);
@@ -90,5 +128,5 @@ function injectStore(form, selector) {
90
128
  * Generated bundle index. Do not edit.
91
129
  */
92
130
 
93
- export { TanStackField, injectForm, injectStore };
131
+ export { TanStackAppField, TanStackField, TanStackFieldInjectable, injectField, injectForm, injectStore };
94
132
  //# sourceMappingURL=tanstack-angular-form.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-angular-form.mjs","sources":["../../src/inject-form.ts","../../src/tanstack-field.directive.ts","../../src/inject-store.ts","../../src/tanstack-angular-form.ts"],"sourcesContent":["import { FormApi } from '@tanstack/form-core'\nimport { injectStore } from '@tanstack/angular-store'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\nexport function injectForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n>(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >,\n) {\n const api = new FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >(opts)\n\n injectStore(api.store, (state) => state.isSubmitting)\n\n return api\n}\n","import {\n Directive,\n Input,\n booleanAttribute,\n numberAttribute,\n} from '@angular/core'\nimport {\n FieldApi,\n FieldApiOptions,\n FieldAsyncValidateOrFn,\n FieldValidateOrFn,\n FormApi,\n} from '@tanstack/form-core'\nimport type {\n DeepKeys,\n DeepValue,\n FieldListeners,\n FieldMeta,\n FieldOptions,\n FieldValidators,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { OnChanges, OnDestroy, OnInit } from '@angular/core'\n\n@Directive({\n selector: '[tanstackField]',\n standalone: true,\n exportAs: 'field',\n})\nexport class TanStackField<\n TParentData,\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TSubmitMeta,\n >\n implements\n OnInit,\n OnChanges,\n OnDestroy,\n FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n{\n @Input({ required: true }) name!: TName\n @Input() defaultValue?: NoInfer<TData>\n @Input({ transform: numberAttribute }) asyncDebounceMs?: number\n @Input({ transform: booleanAttribute }) asyncAlways?: boolean\n @Input({ required: true }) tanstackField!: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n >\n @Input() validators?: NoInfer<\n FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n @Input() listeners?: NoInfer<FieldListeners<TParentData, TName, TData>>\n @Input() defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n @Input() disableErrorFlat?: boolean\n\n api!: FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n >\n\n private getOptions(): FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n > {\n return {\n defaultValue: this.defaultValue,\n asyncDebounceMs: this.asyncDebounceMs,\n asyncAlways: this.asyncAlways,\n disableErrorFlat: this.disableErrorFlat,\n validators: this.validators,\n listeners: this.listeners,\n defaultMeta: this.defaultMeta,\n name: this.name,\n form: this.tanstackField,\n }\n }\n\n unmount?: () => void\n\n ngOnInit() {\n this.api = new FieldApi(this.getOptions())\n\n this.unmount = this.api.mount()\n }\n\n ngOnDestroy() {\n this.unmount?.()\n }\n\n ngOnChanges() {\n const api = this.api as typeof this.api | undefined\n if (!api) return\n api.update(this.getOptions())\n }\n}\n","import { injectStore as injectAngularStore } from '@tanstack/angular-store'\nimport type {\n FormApi,\n FormAsyncValidateOrFn,\n FormState,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\nexport function injectStore<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TSelected = NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >\n >,\n>(\n form: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >,\n selector?: (\n state: NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >\n >,\n ) => TSelected,\n) {\n return injectAngularStore(form.store, selector)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["injectStore","injectAngularStore"],"mappings":"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"}
1
+ {"version":3,"file":"tanstack-angular-form.mjs","sources":["../../src/tanstack-field.ts","../../src/injectable.ts","../../src/app-field.ts","../../src/inject-form.ts","../../src/inject-store.ts","../../src/tanstack-angular-form.ts"],"sourcesContent":["import {\n ChangeDetectorRef,\n Directive,\n Injector,\n OnInit,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n untracked,\n} from '@angular/core'\nimport {\n FieldApi,\n FieldApiOptions,\n FieldAsyncValidateOrFn,\n FieldValidateOrFn,\n FormApi,\n} from '@tanstack/form-core'\nimport { injectStore } from '@tanstack/angular-store'\nimport type {\n DeepKeys,\n DeepValue,\n FieldListeners,\n FieldMeta,\n FieldValidators,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\n@Directive({\n selector: '[tanstackField]',\n standalone: true,\n exportAs: 'field',\n})\nexport class TanStackField<\n TParentData,\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TSubmitMeta,\n> implements OnInit\n{\n name = input.required<TName>()\n defaultValue = input<NoInfer<TData>>()\n asyncDebounceMs = input(undefined as never as number, {\n transform: numberAttribute,\n })\n asyncAlways = input(undefined as never as boolean, {\n transform: booleanAttribute,\n })\n tanstackField =\n input.required<\n FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n >\n >()\n\n validators =\n input<\n NoInfer<\n FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n >()\n\n listeners = input<NoInfer<FieldListeners<TParentData, TName, TData>>>()\n defaultMeta =\n input<\n Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n >()\n\n mode = input<'value' | 'array'>()\n\n disableErrorFlat = input<boolean>()\n\n _api = computed(() => {\n return new FieldApi(untracked(this.options))\n })\n\n get api(): FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n > {\n return this._api()\n }\n\n options = computed(\n () =>\n ({\n defaultValue: this.defaultValue(),\n asyncDebounceMs: this.asyncDebounceMs(),\n asyncAlways: this.asyncAlways(),\n disableErrorFlat: this.disableErrorFlat(),\n validators: this.validators(),\n listeners: this.listeners(),\n defaultMeta: this.defaultMeta(),\n name: this.name(),\n form: this.tanstackField(),\n }) as FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n >,\n )\n\n injector = inject(Injector)\n\n constructor() {\n effect((onCleanup) => {\n const unmount = this._api().mount()\n\n onCleanup(() => {\n unmount()\n })\n })\n\n effect(() => {\n this._api().update(this.options())\n })\n }\n\n cd = inject(ChangeDetectorRef)\n\n ngOnInit() {\n const vals = injectStore(\n this._api().store,\n this.mode() === 'array'\n ? (state) => {\n return [\n state.meta,\n Object.keys((state.value as unknown) ?? []).length,\n ]\n }\n : undefined,\n {\n injector: this.injector,\n },\n )\n\n effect(\n () => {\n // Load bearing change detection check\n const _values = vals()\n this.cd.markForCheck()\n },\n { injector: this.injector },\n )\n }\n}\n","import { Injectable, inject, signal } from '@angular/core'\nimport { FieldApi } from '@tanstack/form-core'\n\n@Injectable({ providedIn: null })\nexport class TanStackFieldInjectable<T> {\n _api = signal<\n FieldApi<\n any,\n any,\n T,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >(null as never)\n\n get api() {\n return this._api()\n }\n}\n\nexport function injectField<T>(): TanStackFieldInjectable<T> {\n return inject(TanStackFieldInjectable<T>)\n}\n","import { Directive, effect, inject } from '@angular/core'\nimport {\n DeepKeys,\n DeepValue,\n FieldAsyncValidateOrFn,\n FieldValidateOrFn,\n} from '@tanstack/form-core'\nimport { TanStackField } from './tanstack-field'\nimport { TanStackFieldInjectable } from './injectable'\nimport type {\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\n@Directive({\n selector: '[tanstack-app-field]',\n standalone: true,\n providers: [TanStackFieldInjectable],\n})\nexport class TanStackAppField<\n TParentData,\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TSubmitMeta,\n> extends TanStackField<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TSubmitMeta\n> {\n base = inject(TanStackFieldInjectable)\n\n constructor() {\n super()\n effect(() => {\n this.base._api.set(this.api)\n })\n }\n}\n","import { FormApi } from '@tanstack/form-core'\nimport { injectStore } from '@tanstack/angular-store'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\nexport function injectForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n>(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >,\n) {\n const api = new FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >(opts)\n\n injectStore(api.store, (state) => state.isSubmitting)\n\n return api\n}\n","import { injectStore as injectAngularStore } from '@tanstack/angular-store'\nimport type {\n FormApi,\n FormAsyncValidateOrFn,\n FormState,\n FormValidateOrFn,\n} from '@tanstack/form-core'\n\nexport function injectStore<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TSelected = NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >\n >,\n>(\n form: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer,\n TSubmitMeta\n >,\n selector?: (\n state: NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >\n >,\n ) => TSelected,\n) {\n return injectAngularStore(form.store, selector)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["injectStore","injectAngularStore"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,47 @@
1
+ import { DeepKeys, DeepValue, FieldValidateOrFn, FieldAsyncValidateOrFn, FormValidateOrFn, FormAsyncValidateOrFn, FormApi, FieldValidators, FieldListeners, FieldMeta, FieldApi, FieldApiOptions, FormOptions, FormState } from '@tanstack/form-core';
1
2
  export * from '@tanstack/form-core';
2
- export { injectForm } from './inject-form';
3
- export { TanStackField } from './tanstack-field.directive';
4
- export { injectStore } from './inject-store';
3
+ import * as _angular_core from '@angular/core';
4
+ import { OnInit, Injector, ChangeDetectorRef } from '@angular/core';
5
+
6
+ declare class TanStackField<TParentData, const TName extends DeepKeys<TParentData>, TData extends DeepValue<TParentData, TName>, TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>, TSubmitMeta> implements OnInit {
7
+ name: _angular_core.InputSignal<TName>;
8
+ defaultValue: _angular_core.InputSignal<NoInfer<TData>>;
9
+ asyncDebounceMs: _angular_core.InputSignalWithTransform<number, unknown>;
10
+ asyncAlways: _angular_core.InputSignalWithTransform<boolean, unknown>;
11
+ tanstackField: _angular_core.InputSignal<FormApi<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>>;
12
+ validators: _angular_core.InputSignal<NoInfer<FieldValidators<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>>>;
13
+ listeners: _angular_core.InputSignal<NoInfer<FieldListeners<TParentData, TName, TData>>>;
14
+ defaultMeta: _angular_core.InputSignal<Partial<FieldMeta<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync>>>;
15
+ mode: _angular_core.InputSignal<"value" | "array">;
16
+ disableErrorFlat: _angular_core.InputSignal<boolean>;
17
+ _api: _angular_core.Signal<FieldApi<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>>;
18
+ get api(): FieldApi<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>;
19
+ options: _angular_core.Signal<FieldApiOptions<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>>;
20
+ injector: Injector;
21
+ constructor();
22
+ cd: ChangeDetectorRef;
23
+ ngOnInit(): void;
24
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TanStackField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, never>;
25
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TanStackField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, "[tanstackField]", ["field"], { "name": { "alias": "name"; "required": true; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "asyncDebounceMs": { "alias": "asyncDebounceMs"; "required": false; "isSignal": true; }; "asyncAlways": { "alias": "asyncAlways"; "required": false; "isSignal": true; }; "tanstackField": { "alias": "tanstackField"; "required": true; "isSignal": true; }; "validators": { "alias": "validators"; "required": false; "isSignal": true; }; "listeners": { "alias": "listeners"; "required": false; "isSignal": true; }; "defaultMeta": { "alias": "defaultMeta"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "disableErrorFlat": { "alias": "disableErrorFlat"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
26
+ }
27
+
28
+ declare class TanStackFieldInjectable<T> {
29
+ _api: _angular_core.WritableSignal<FieldApi<any, any, T, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>>;
30
+ get api(): FieldApi<any, any, T, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TanStackFieldInjectable<any>, never>;
32
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TanStackFieldInjectable<any>>;
33
+ }
34
+ declare function injectField<T>(): TanStackFieldInjectable<T>;
35
+
36
+ declare class TanStackAppField<TParentData, const TName extends DeepKeys<TParentData>, TData extends DeepValue<TParentData, TName>, TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>, TSubmitMeta> extends TanStackField<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta> {
37
+ base: TanStackFieldInjectable<any>;
38
+ constructor();
39
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TanStackAppField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, never>;
40
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TanStackAppField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, "[tanstack-app-field]", never, {}, {}, never, never, true, never>;
41
+ }
42
+
43
+ declare function injectForm<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta>(opts?: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>): FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>;
44
+
45
+ declare function injectStore<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta, TSelected = NoInfer<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>>(form: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>, selector?: (state: NoInfer<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>) => TSelected): _angular_core.Signal<TSelected>;
46
+
47
+ export { TanStackAppField, TanStackField, TanStackFieldInjectable, injectField, injectForm, injectStore };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/angular-form",
3
- "version": "1.12.3",
3
+ "version": "1.13.0",
4
4
  "description": "Powerful, type-safe forms for Angular.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -34,20 +34,22 @@
34
34
  "dependencies": {
35
35
  "@tanstack/angular-store": "^0.7.1",
36
36
  "tslib": "^2.8.1",
37
- "@tanstack/form-core": "1.12.3"
37
+ "@tanstack/form-core": "1.12.4"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@analogjs/vite-plugin-angular": "^1.17.1",
41
- "@angular/common": "^19.2.14",
42
- "@angular/compiler": "^19.2.14",
43
- "@angular/compiler-cli": "^19.2.14",
44
- "@angular/core": "^19.2.14",
45
- "@angular/platform-browser": "^19.2.14",
46
- "@angular/platform-browser-dynamic": "^19.2.14",
41
+ "@analogjs/vitest-angular": "^1.17.1",
42
+ "@angular/common": "^20.0.0",
43
+ "@angular/compiler": "^20.0.0",
44
+ "@angular/compiler-cli": "^20.0.0",
45
+ "@angular/core": "^20.0.0",
46
+ "@angular/platform-browser": "^20.0.0",
47
+ "@angular/platform-browser-dynamic": "^20.0.0",
47
48
  "@testing-library/angular": "^17.4.0",
48
- "ng-packagr": "^19.2.2",
49
+ "ng-packagr": "^20.0.0",
49
50
  "typescript": "5.8.2",
50
- "zone.js": "^0.15.1"
51
+ "vite-tsconfig-paths": "^5.1.4",
52
+ "zone.js": "0.15.1"
51
53
  },
52
54
  "peerDependencies": {
53
55
  "@angular/core": ">=19.0.0"
@@ -0,0 +1,75 @@
1
+ import { Directive, effect, inject } from '@angular/core'
2
+ import {
3
+ DeepKeys,
4
+ DeepValue,
5
+ FieldAsyncValidateOrFn,
6
+ FieldValidateOrFn,
7
+ } from '@tanstack/form-core'
8
+ import { TanStackField } from './tanstack-field'
9
+ import { TanStackFieldInjectable } from './injectable'
10
+ import type {
11
+ FormAsyncValidateOrFn,
12
+ FormValidateOrFn,
13
+ } from '@tanstack/form-core'
14
+
15
+ @Directive({
16
+ selector: '[tanstack-app-field]',
17
+ standalone: true,
18
+ providers: [TanStackFieldInjectable],
19
+ })
20
+ export class TanStackAppField<
21
+ TParentData,
22
+ const TName extends DeepKeys<TParentData>,
23
+ TData extends DeepValue<TParentData, TName>,
24
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
25
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
26
+ TOnChangeAsync extends
27
+ | undefined
28
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
29
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
30
+ TOnBlurAsync extends
31
+ | undefined
32
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
33
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
34
+ TOnSubmitAsync extends
35
+ | undefined
36
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
37
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
38
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
39
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
40
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
41
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
42
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
43
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
44
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
45
+ TSubmitMeta,
46
+ > extends TanStackField<
47
+ TParentData,
48
+ TName,
49
+ TData,
50
+ TOnMount,
51
+ TOnChange,
52
+ TOnChangeAsync,
53
+ TOnBlur,
54
+ TOnBlurAsync,
55
+ TOnSubmit,
56
+ TOnSubmitAsync,
57
+ TFormOnMount,
58
+ TFormOnChange,
59
+ TFormOnChangeAsync,
60
+ TFormOnBlur,
61
+ TFormOnBlurAsync,
62
+ TFormOnSubmit,
63
+ TFormOnSubmitAsync,
64
+ TFormOnServer,
65
+ TSubmitMeta
66
+ > {
67
+ base = inject(TanStackFieldInjectable)
68
+
69
+ constructor() {
70
+ super()
71
+ effect(() => {
72
+ this.base._api.set(this.api)
73
+ })
74
+ }
75
+ }
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from '@tanstack/form-core'
2
2
 
3
+ export { TanStackAppField } from './app-field'
3
4
  export { injectForm } from './inject-form'
4
- export { TanStackField } from './tanstack-field.directive'
5
+ export { TanStackField } from './tanstack-field'
5
6
  export { injectStore } from './inject-store'
7
+ export { TanStackFieldInjectable, injectField } from './injectable'
@@ -0,0 +1,37 @@
1
+ import { Injectable, inject, signal } from '@angular/core'
2
+ import { FieldApi } from '@tanstack/form-core'
3
+
4
+ @Injectable({ providedIn: null })
5
+ export class TanStackFieldInjectable<T> {
6
+ _api = signal<
7
+ FieldApi<
8
+ any,
9
+ any,
10
+ T,
11
+ any,
12
+ any,
13
+ any,
14
+ any,
15
+ any,
16
+ any,
17
+ any,
18
+ any,
19
+ any,
20
+ any,
21
+ any,
22
+ any,
23
+ any,
24
+ any,
25
+ any,
26
+ any
27
+ >
28
+ >(null as never)
29
+
30
+ get api() {
31
+ return this._api()
32
+ }
33
+ }
34
+
35
+ export function injectField<T>(): TanStackFieldInjectable<T> {
36
+ return inject(TanStackFieldInjectable<T>)
37
+ }
@@ -0,0 +1,243 @@
1
+ import {
2
+ ChangeDetectorRef,
3
+ Directive,
4
+ Injector,
5
+ OnInit,
6
+ booleanAttribute,
7
+ computed,
8
+ effect,
9
+ inject,
10
+ input,
11
+ numberAttribute,
12
+ untracked,
13
+ } from '@angular/core'
14
+ import {
15
+ FieldApi,
16
+ FieldApiOptions,
17
+ FieldAsyncValidateOrFn,
18
+ FieldValidateOrFn,
19
+ FormApi,
20
+ } from '@tanstack/form-core'
21
+ import { injectStore } from '@tanstack/angular-store'
22
+ import type {
23
+ DeepKeys,
24
+ DeepValue,
25
+ FieldListeners,
26
+ FieldMeta,
27
+ FieldValidators,
28
+ FormAsyncValidateOrFn,
29
+ FormValidateOrFn,
30
+ } from '@tanstack/form-core'
31
+
32
+ @Directive({
33
+ selector: '[tanstackField]',
34
+ standalone: true,
35
+ exportAs: 'field',
36
+ })
37
+ export class TanStackField<
38
+ TParentData,
39
+ const TName extends DeepKeys<TParentData>,
40
+ TData extends DeepValue<TParentData, TName>,
41
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
42
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
43
+ TOnChangeAsync extends
44
+ | undefined
45
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
46
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
47
+ TOnBlurAsync extends
48
+ | undefined
49
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
50
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
51
+ TOnSubmitAsync extends
52
+ | undefined
53
+ | FieldAsyncValidateOrFn<TParentData, TName, TData>,
54
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
55
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
56
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
57
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
58
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
59
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
60
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
61
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
62
+ TSubmitMeta,
63
+ > implements OnInit
64
+ {
65
+ name = input.required<TName>()
66
+ defaultValue = input<NoInfer<TData>>()
67
+ asyncDebounceMs = input(undefined as never as number, {
68
+ transform: numberAttribute,
69
+ })
70
+ asyncAlways = input(undefined as never as boolean, {
71
+ transform: booleanAttribute,
72
+ })
73
+ tanstackField =
74
+ input.required<
75
+ FormApi<
76
+ TParentData,
77
+ TFormOnMount,
78
+ TFormOnChange,
79
+ TFormOnChangeAsync,
80
+ TFormOnBlur,
81
+ TFormOnBlurAsync,
82
+ TFormOnSubmit,
83
+ TFormOnSubmitAsync,
84
+ TFormOnServer,
85
+ TSubmitMeta
86
+ >
87
+ >()
88
+
89
+ validators =
90
+ input<
91
+ NoInfer<
92
+ FieldValidators<
93
+ TParentData,
94
+ TName,
95
+ TData,
96
+ TOnMount,
97
+ TOnChange,
98
+ TOnChangeAsync,
99
+ TOnBlur,
100
+ TOnBlurAsync,
101
+ TOnSubmit,
102
+ TOnSubmitAsync
103
+ >
104
+ >
105
+ >()
106
+
107
+ listeners = input<NoInfer<FieldListeners<TParentData, TName, TData>>>()
108
+ defaultMeta =
109
+ input<
110
+ Partial<
111
+ FieldMeta<
112
+ TParentData,
113
+ TName,
114
+ TData,
115
+ TOnMount,
116
+ TOnChange,
117
+ TOnChangeAsync,
118
+ TOnBlur,
119
+ TOnBlurAsync,
120
+ TOnSubmit,
121
+ TOnSubmitAsync,
122
+ TFormOnMount,
123
+ TFormOnChange,
124
+ TFormOnChangeAsync,
125
+ TFormOnBlur,
126
+ TFormOnBlurAsync,
127
+ TFormOnSubmit,
128
+ TFormOnSubmitAsync
129
+ >
130
+ >
131
+ >()
132
+
133
+ mode = input<'value' | 'array'>()
134
+
135
+ disableErrorFlat = input<boolean>()
136
+
137
+ _api = computed(() => {
138
+ return new FieldApi(untracked(this.options))
139
+ })
140
+
141
+ get api(): FieldApi<
142
+ TParentData,
143
+ TName,
144
+ TData,
145
+ TOnMount,
146
+ TOnChange,
147
+ TOnChangeAsync,
148
+ TOnBlur,
149
+ TOnBlurAsync,
150
+ TOnSubmit,
151
+ TOnSubmitAsync,
152
+ TFormOnMount,
153
+ TFormOnChange,
154
+ TFormOnChangeAsync,
155
+ TFormOnBlur,
156
+ TFormOnBlurAsync,
157
+ TFormOnSubmit,
158
+ TFormOnSubmitAsync,
159
+ TFormOnServer,
160
+ TSubmitMeta
161
+ > {
162
+ return this._api()
163
+ }
164
+
165
+ options = computed(
166
+ () =>
167
+ ({
168
+ defaultValue: this.defaultValue(),
169
+ asyncDebounceMs: this.asyncDebounceMs(),
170
+ asyncAlways: this.asyncAlways(),
171
+ disableErrorFlat: this.disableErrorFlat(),
172
+ validators: this.validators(),
173
+ listeners: this.listeners(),
174
+ defaultMeta: this.defaultMeta(),
175
+ name: this.name(),
176
+ form: this.tanstackField(),
177
+ }) as FieldApiOptions<
178
+ TParentData,
179
+ TName,
180
+ TData,
181
+ TOnMount,
182
+ TOnChange,
183
+ TOnChangeAsync,
184
+ TOnBlur,
185
+ TOnBlurAsync,
186
+ TOnSubmit,
187
+ TOnSubmitAsync,
188
+ TFormOnMount,
189
+ TFormOnChange,
190
+ TFormOnChangeAsync,
191
+ TFormOnBlur,
192
+ TFormOnBlurAsync,
193
+ TFormOnSubmit,
194
+ TFormOnSubmitAsync,
195
+ TFormOnServer,
196
+ TSubmitMeta
197
+ >,
198
+ )
199
+
200
+ injector = inject(Injector)
201
+
202
+ constructor() {
203
+ effect((onCleanup) => {
204
+ const unmount = this._api().mount()
205
+
206
+ onCleanup(() => {
207
+ unmount()
208
+ })
209
+ })
210
+
211
+ effect(() => {
212
+ this._api().update(this.options())
213
+ })
214
+ }
215
+
216
+ cd = inject(ChangeDetectorRef)
217
+
218
+ ngOnInit() {
219
+ const vals = injectStore(
220
+ this._api().store,
221
+ this.mode() === 'array'
222
+ ? (state) => {
223
+ return [
224
+ state.meta,
225
+ Object.keys((state.value as unknown) ?? []).length,
226
+ ]
227
+ }
228
+ : undefined,
229
+ {
230
+ injector: this.injector,
231
+ },
232
+ )
233
+
234
+ effect(
235
+ () => {
236
+ // Load bearing change detection check
237
+ const _values = vals()
238
+ this.cd.markForCheck()
239
+ },
240
+ { injector: this.injector },
241
+ )
242
+ }
243
+ }
@@ -1,3 +0,0 @@
1
- import { FormApi } from '@tanstack/form-core';
2
- import type { FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core';
3
- export declare function injectForm<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta>(opts?: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>): FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>;
@@ -1,2 +0,0 @@
1
- import type { FormApi, FormAsyncValidateOrFn, FormState, FormValidateOrFn } from '@tanstack/form-core';
2
- export declare function injectStore<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta, TSelected = NoInfer<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>>(form: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer, TSubmitMeta>, selector?: (state: NoInfer<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>) => TSelected): import("@angular/core").Signal<TSelected>;
@@ -1,25 +0,0 @@
1
- import { FieldApi, FieldAsyncValidateOrFn, FieldValidateOrFn, FormApi } from '@tanstack/form-core';
2
- import type { DeepKeys, DeepValue, FieldListeners, FieldMeta, FieldOptions, FieldValidators, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core';
3
- import type { OnChanges, OnDestroy, OnInit } from '@angular/core';
4
- import * as i0 from "@angular/core";
5
- export declare class TanStackField<TParentData, const TName extends DeepKeys<TParentData>, TData extends DeepValue<TParentData, TName>, TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>, TSubmitMeta> implements OnInit, OnChanges, OnDestroy, FieldOptions<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync> {
6
- name: TName;
7
- defaultValue?: NoInfer<TData>;
8
- asyncDebounceMs?: number;
9
- asyncAlways?: boolean;
10
- tanstackField: FormApi<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>;
11
- validators?: NoInfer<FieldValidators<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>>;
12
- listeners?: NoInfer<FieldListeners<TParentData, TName, TData>>;
13
- defaultMeta?: Partial<FieldMeta<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync>>;
14
- disableErrorFlat?: boolean;
15
- api: FieldApi<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer, TSubmitMeta>;
16
- private getOptions;
17
- unmount?: () => void;
18
- ngOnInit(): void;
19
- ngOnDestroy(): void;
20
- ngOnChanges(): void;
21
- static ɵfac: i0.ɵɵFactoryDeclaration<TanStackField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, never>;
22
- static ɵdir: i0.ɵɵDirectiveDeclaration<TanStackField<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>, "[tanstackField]", ["field"], { "name": { "alias": "name"; "required": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; }; "asyncDebounceMs": { "alias": "asyncDebounceMs"; "required": false; }; "asyncAlways": { "alias": "asyncAlways"; "required": false; }; "tanstackField": { "alias": "tanstackField"; "required": true; }; "validators": { "alias": "validators"; "required": false; }; "listeners": { "alias": "listeners"; "required": false; }; "defaultMeta": { "alias": "defaultMeta"; "required": false; }; "disableErrorFlat": { "alias": "disableErrorFlat"; "required": false; }; }, {}, never, never, true, never>;
23
- static ngAcceptInputType_asyncDebounceMs: unknown;
24
- static ngAcceptInputType_asyncAlways: unknown;
25
- }
@@ -1,202 +0,0 @@
1
- import {
2
- Directive,
3
- Input,
4
- booleanAttribute,
5
- numberAttribute,
6
- } from '@angular/core'
7
- import {
8
- FieldApi,
9
- FieldApiOptions,
10
- FieldAsyncValidateOrFn,
11
- FieldValidateOrFn,
12
- FormApi,
13
- } from '@tanstack/form-core'
14
- import type {
15
- DeepKeys,
16
- DeepValue,
17
- FieldListeners,
18
- FieldMeta,
19
- FieldOptions,
20
- FieldValidators,
21
- FormAsyncValidateOrFn,
22
- FormValidateOrFn,
23
- } from '@tanstack/form-core'
24
- import type { OnChanges, OnDestroy, OnInit } from '@angular/core'
25
-
26
- @Directive({
27
- selector: '[tanstackField]',
28
- standalone: true,
29
- exportAs: 'field',
30
- })
31
- export class TanStackField<
32
- TParentData,
33
- const TName extends DeepKeys<TParentData>,
34
- TData extends DeepValue<TParentData, TName>,
35
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
36
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
37
- TOnChangeAsync extends
38
- | undefined
39
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
40
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
41
- TOnBlurAsync extends
42
- | undefined
43
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
44
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
45
- TOnSubmitAsync extends
46
- | undefined
47
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
48
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
49
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
50
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
51
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
52
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
53
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
54
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
55
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
56
- TSubmitMeta,
57
- >
58
- implements
59
- OnInit,
60
- OnChanges,
61
- OnDestroy,
62
- FieldOptions<
63
- TParentData,
64
- TName,
65
- TData,
66
- TOnMount,
67
- TOnChange,
68
- TOnChangeAsync,
69
- TOnBlur,
70
- TOnBlurAsync,
71
- TOnSubmit,
72
- TOnSubmitAsync
73
- >
74
- {
75
- @Input({ required: true }) name!: TName
76
- @Input() defaultValue?: NoInfer<TData>
77
- @Input({ transform: numberAttribute }) asyncDebounceMs?: number
78
- @Input({ transform: booleanAttribute }) asyncAlways?: boolean
79
- @Input({ required: true }) tanstackField!: FormApi<
80
- TParentData,
81
- TFormOnMount,
82
- TFormOnChange,
83
- TFormOnChangeAsync,
84
- TFormOnBlur,
85
- TFormOnBlurAsync,
86
- TFormOnSubmit,
87
- TFormOnSubmitAsync,
88
- TFormOnServer,
89
- TSubmitMeta
90
- >
91
- @Input() validators?: NoInfer<
92
- FieldValidators<
93
- TParentData,
94
- TName,
95
- TData,
96
- TOnMount,
97
- TOnChange,
98
- TOnChangeAsync,
99
- TOnBlur,
100
- TOnBlurAsync,
101
- TOnSubmit,
102
- TOnSubmitAsync
103
- >
104
- >
105
- @Input() listeners?: NoInfer<FieldListeners<TParentData, TName, TData>>
106
- @Input() defaultMeta?: Partial<
107
- FieldMeta<
108
- TParentData,
109
- TName,
110
- TData,
111
- TOnMount,
112
- TOnChange,
113
- TOnChangeAsync,
114
- TOnBlur,
115
- TOnBlurAsync,
116
- TOnSubmit,
117
- TOnSubmitAsync,
118
- TFormOnMount,
119
- TFormOnChange,
120
- TFormOnChangeAsync,
121
- TFormOnBlur,
122
- TFormOnBlurAsync,
123
- TFormOnSubmit,
124
- TFormOnSubmitAsync
125
- >
126
- >
127
- @Input() disableErrorFlat?: boolean
128
-
129
- api!: FieldApi<
130
- TParentData,
131
- TName,
132
- TData,
133
- TOnMount,
134
- TOnChange,
135
- TOnChangeAsync,
136
- TOnBlur,
137
- TOnBlurAsync,
138
- TOnSubmit,
139
- TOnSubmitAsync,
140
- TFormOnMount,
141
- TFormOnChange,
142
- TFormOnChangeAsync,
143
- TFormOnBlur,
144
- TFormOnBlurAsync,
145
- TFormOnSubmit,
146
- TFormOnSubmitAsync,
147
- TFormOnServer,
148
- TSubmitMeta
149
- >
150
-
151
- private getOptions(): FieldApiOptions<
152
- TParentData,
153
- TName,
154
- TData,
155
- TOnMount,
156
- TOnChange,
157
- TOnChangeAsync,
158
- TOnBlur,
159
- TOnBlurAsync,
160
- TOnSubmit,
161
- TOnSubmitAsync,
162
- TFormOnMount,
163
- TFormOnChange,
164
- TFormOnChangeAsync,
165
- TFormOnBlur,
166
- TFormOnBlurAsync,
167
- TFormOnSubmit,
168
- TFormOnSubmitAsync,
169
- TFormOnServer,
170
- TSubmitMeta
171
- > {
172
- return {
173
- defaultValue: this.defaultValue,
174
- asyncDebounceMs: this.asyncDebounceMs,
175
- asyncAlways: this.asyncAlways,
176
- disableErrorFlat: this.disableErrorFlat,
177
- validators: this.validators,
178
- listeners: this.listeners,
179
- defaultMeta: this.defaultMeta,
180
- name: this.name,
181
- form: this.tanstackField,
182
- }
183
- }
184
-
185
- unmount?: () => void
186
-
187
- ngOnInit() {
188
- this.api = new FieldApi(this.getOptions())
189
-
190
- this.unmount = this.api.mount()
191
- }
192
-
193
- ngOnDestroy() {
194
- this.unmount?.()
195
- }
196
-
197
- ngOnChanges() {
198
- const api = this.api as typeof this.api | undefined
199
- if (!api) return
200
- api.update(this.getOptions())
201
- }
202
- }