@atscript/ui 0.1.103 → 0.1.105

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.
package/dist/index.d.cts CHANGED
@@ -29,7 +29,7 @@ declare const UI_FORM_SUFFIX_ICON: "ui.form.suffix.icon";
29
29
  declare const UI_TABLE_WIDTH: "ui.table.width";
30
30
  declare const UI_TABLE_COMPONENT: "ui.table.component";
31
31
  declare const UI_TABLE_SELECT_WITH: "ui.table.selectWith";
32
- declare const UI_TABLE_HIDDEN: "ui.table.hidden";
32
+ declare const UI_TABLE_EXCLUDE: "ui.table.exclude";
33
33
  declare const UI_TABLE_ATTR: "ui.table.attr";
34
34
  declare const UI_TABLE_CLASSES: "ui.table.classes";
35
35
  declare const UI_TABLE_STYLES: "ui.table.styles";
@@ -442,6 +442,20 @@ declare function getByPath(obj: Record<string, unknown>, path: string): unknown;
442
442
  * Creates intermediate objects if they do not exist.
443
443
  */
444
444
  declare function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void;
445
+ /**
446
+ * Deletes the own key at a dot-separated path (form-data wrapper aware — derefs
447
+ * `obj.value` first). Walks to the parent WITHOUT vivifying intermediate nodes:
448
+ * if any ancestor is missing, the call is a no-op (nothing to delete).
449
+ *
450
+ * Unlike `setByPath(obj, path, undefined)`, this leaves NO own key behind — the
451
+ * leaf reads as absent (`'k' in parent === false`), which keeps `deepEqual`
452
+ * structural comparisons in sync (a present `undefined` own-key and an absent
453
+ * key are NOT structurally equal under the own-key walk). Used by
454
+ * {@link applyFormChanges} to apply a clear-to-`undefined` change as a delete.
455
+ *
456
+ * Empty path clears the root domain value (`obj.value = undefined`).
457
+ */
458
+ declare function deleteByPath(obj: Record<string, unknown>, path: string): void;
445
459
  /** Value resolver function type — created once per form, reused across calls. */
446
460
  type TFormValueResolver = (prop: TAtscriptAnnotatedType, path: string) => unknown;
447
461
  declare function createFormValueResolver(data?: Record<string, unknown>, context?: Record<string, unknown>): TFormValueResolver;
@@ -450,6 +464,28 @@ declare function createFormData<T extends TAtscriptAnnotatedType>(type: T, resol
450
464
  };
451
465
  declare function detectUnionVariant(value: unknown, variants: FormUnionVariant[]): number;
452
466
  //#endregion
467
+ //#region src/form/clone.d.ts
468
+ /**
469
+ * Optional per-value unwrap hook. Lets a framework caller strip a reactive
470
+ * proxy off every visited value before it is copied (e.g. Vue's `toRaw`). The
471
+ * core never needs it — it is `undefined` here and the value passes through.
472
+ */
473
+ type CloneUnwrap = (value: unknown) => unknown;
474
+ /**
475
+ * Structural deep clone of plain JSON-ish data (objects / arrays / primitives /
476
+ * `Date`). Walks OWN-ENUMERABLE keys only (matches the own-key discipline in
477
+ * `diff.ts` — never copies an accidental prototype) and copies leaves by value.
478
+ *
479
+ * `structuredClone` is deliberately NOT used: it throws on functions and on Vue
480
+ * reactive proxies. The optional `unwrap` hook lets a framework caller
481
+ * de-proxy each value first (vue-form passes `toRaw`); the core omits it.
482
+ *
483
+ * The SINGLE deep-clone primitive for the form engine — used by
484
+ * `applyFormChanges`, `buildFormRebase`, and vue-form's baseline snapshot. Do
485
+ * not reimplement structural cloning elsewhere.
486
+ */
487
+ declare function deepClone<T>(value: T, unwrap?: CloneUnwrap): T;
488
+ //#endregion
453
489
  //#region src/form/validate.d.ts
454
490
  /** Per-call options for the form validator function. */
455
491
  interface TFormValidatorCallOptions {
@@ -550,6 +586,168 @@ interface FormDiffResult {
550
586
  * time on a frozen clone). This is the common Vue v-model flow.
551
587
  */
552
588
  declare function buildFormDiff(def: FormDef, baseline: Record<string, unknown>, current: Record<string, unknown>, opts?: FormDiffOptions): FormDiffResult;
589
+ /**
590
+ * Structural deep equality (order-sensitive for arrays). `NaN` equals `NaN`
591
+ * (revert-aware for NaN scalars) while `0` / `-0` stay equal (matches DB
592
+ * intent — `===` treats them equal, only NaN is special-cased).
593
+ *
594
+ * The single comparator shared across the form engine: diff, conflict
595
+ * detection ({@link buildFormRebase}), and apply all route through this — never
596
+ * reimplement equality elsewhere.
597
+ */
598
+ declare function deepEqual(a: unknown, b: unknown): boolean;
599
+ //#endregion
600
+ //#region src/form/dirty.d.ts
601
+ /**
602
+ * True when the field at dot-path `path` is dirty given a {@link FormFieldChange}
603
+ * list (as produced by {@link buildFormDiff}).
604
+ *
605
+ * The change list is leaf-grained for scalars/objects but WHOLE-ARRAY for arrays,
606
+ * so a field at `path` is dirty iff some change path equals `path` OR starts with
607
+ * `path + "."`:
608
+ *
609
+ * - scalar / leaf field (incl. nested `address.city`) → exact match.
610
+ * - object / section container → no entry at its own path, only its leaves →
611
+ * matched by the PREFIX branch.
612
+ * - whole-array field → one entry at the array root → exact match.
613
+ * - a field rendered for an array-ITEM leaf (e.g. `items.0.qty`) → NOT detectable:
614
+ * the array diff emits a single whole-array change at the array root, never
615
+ * per-item leaf paths, so this correctly returns false (the array container
616
+ * lights up instead). This is a known, documented limitation.
617
+ *
618
+ * The prefix uses `path + "."` so field `item` never matches a change at `items`
619
+ * (no false positives).
620
+ *
621
+ * Empty `path` `''` is the wrapped form root — every change is nested under it,
622
+ * so it is considered dirty iff there are ANY changes.
623
+ */
624
+ declare function isPathDirty(changes: FormFieldChange[], path: string): boolean;
625
+ /**
626
+ * Precomputes the set of ALL dirty paths from a {@link FormFieldChange} list so
627
+ * that membership is an O(1) `Set.has(path)` instead of {@link isPathDirty}'s
628
+ * per-call O(changes) prefix scan. Callers that probe many fields against the
629
+ * same change list (e.g. a form rendering one field per leaf) build this once
630
+ * and query it per field.
631
+ *
632
+ * For each change path `C` it adds `C` AND every dot-prefix ancestor of `C`
633
+ * (so `'address.city'` adds both `'address.city'` and `'address'`), matching
634
+ * `isPathDirty`'s "exact OR `path + '.'` prefix" predicate — an ancestor
635
+ * container is dirty exactly when some change is nested under it. The wrapped
636
+ * root `''` is added iff there are ANY changes, mirroring `isPathDirty('')`.
637
+ *
638
+ * INVARIANT (locked, tested): for EVERY path `P`,
639
+ * `collectDirtyPaths(changes).has(P) === isPathDirty(changes, P)`. This is a
640
+ * precompute of the SAME predicate, not a second one — keep them in lockstep.
641
+ */
642
+ declare function collectDirtyPaths(changes: FormFieldChange[]): Set<string>;
643
+ //#endregion
644
+ //#region src/form/apply.d.ts
645
+ /**
646
+ * Applies a {@link FormFieldChange} list onto a WRAPPED form-data container
647
+ * (`{ value: domainData }`), mutating it in place and returning the same
648
+ * reference. The inverse direction of {@link buildFormDiff}: where the diff
649
+ * READS `(baseline, current)` into changes, this WRITES changes onto data.
650
+ *
651
+ * IMPORTANT: pass a CLONE, never the live fetched row — every write mutates
652
+ * `data` directly. Callers that need the original intact should
653
+ * `deepClone(data)` first (see {@link deepClone}).
654
+ *
655
+ * Per-change semantics (the single place the apply rules live, so
656
+ * {@link buildFormRebase} stays consistent):
657
+ *
658
+ * - `kind: 'set'`:
659
+ * - `change.after === undefined` → DELETE the own key at `change.path` (walk
660
+ * to parent, `delete`). A cleared field must read as ABSENT, not as a
661
+ * present `undefined` own-key — otherwise a re-diff sees a structural
662
+ * mismatch where the form intends "no value". `setByPath(…, undefined)`
663
+ * leaves an own key behind, so we use {@link deleteByPath} instead.
664
+ * - otherwise → `setByPath(data, change.path, change.after)`.
665
+ * - `kind: 'array'`: whole-array set via `setByPath(data, change.path,
666
+ * change.after)` (LOCKED Option A — no per-element merge; the diff already
667
+ * carried the full after-array).
668
+ *
669
+ * The `def` is currently unused by the apply walk (paths fully describe the
670
+ * write target) but is part of the signature for parity with
671
+ * `buildFormDiff`/`buildFormRebase`, so the rebase engine threads one `def`
672
+ * uniformly through diff + apply.
673
+ */
674
+ declare function applyFormChanges(_def: FormDef, data: Record<string, unknown>, changes: FormFieldChange[]): Record<string, unknown>;
675
+ //#endregion
676
+ //#region src/form/rebase.d.ts
677
+ /** Options for {@link buildFormRebase}. */
678
+ interface FormRebaseOptions {
679
+ /**
680
+ * How to resolve a field changed on BOTH sides (local edit vs. upstream
681
+ * edit) to a different value:
682
+ * - `'ours'` (default) — keep the local edit, discard upstream's value.
683
+ * - `'theirs'` — take upstream's value, discard the local edit.
684
+ *
685
+ * A field changed on both sides to the SAME value is never a conflict.
686
+ */
687
+ conflict?: "ours" | "theirs";
688
+ }
689
+ /** Result of {@link buildFormRebase}. */
690
+ interface FormRebaseResult {
691
+ /**
692
+ * The rebased WRAPPED form-data container (`{ value }`). Always a fresh deep
693
+ * clone of `upstream` with the local diff reapplied — never aliases any
694
+ * input container.
695
+ */
696
+ next: Record<string, unknown>;
697
+ /**
698
+ * Paths that were changed on both sides to different values (same-path
699
+ * conflicts), plus ancestor paths whose subtree upstream cleared while local
700
+ * still edited a leaf under it (ancestor-clear conflicts). De-duplicated.
701
+ */
702
+ conflicts: string[];
703
+ /**
704
+ * The diff of `next` against the NEW baseline (`upstream`) — i.e. exactly the
705
+ * changes that survive on top of upstream. Empty `[]` when the rebased form
706
+ * equals upstream (a fully clean / fully reverted rebase).
707
+ *
708
+ * The returned `reapplied` does NOT alias the returned `next`, so installing
709
+ * `next` as live form data never retroactively mutates the returned change set.
710
+ */
711
+ reapplied: FormFieldChange[];
712
+ }
713
+ /**
714
+ * Pure 3-way rebase for a change-tracked form. Given the current baseline `B0`,
715
+ * the live form `C`, and a fresh upstream `U`, produces the form rewritten as
716
+ * `U` + the local diff (`C` vs `B0`) reapplied on top:
717
+ *
718
+ * - Fields the user never touched adopt upstream's value.
719
+ * - Local edits survive (reapplied onto the upstream clone).
720
+ * - Fields changed on BOTH sides to different values are conflicts, resolved by
721
+ * `opts.conflict` (`'ours'` keeps local, `'theirs'` takes upstream).
722
+ *
723
+ * All inputs are WRAPPED form-data containers (`{ value: domainData }`). The
724
+ * result `next` is a fresh container; no input is mutated.
725
+ *
726
+ * `diffOptions` are forwarded to BOTH internal `buildFormDiff` passes so the
727
+ * same field exclusions apply (notably the `@db.column.version` column and the
728
+ * `$cas` policy) on the local and upstream sides — keep them identical to the
729
+ * options the caller uses for its own change tracking.
730
+ */
731
+ declare function buildFormRebase(def: FormDef, baseline: Record<string, unknown>, current: Record<string, unknown>, upstream: Record<string, unknown>, opts?: FormRebaseOptions, diffOptions?: FormDiffOptions): FormRebaseResult;
732
+ //#endregion
733
+ //#region src/form/union-detect.d.ts
734
+ /**
735
+ * True when ANY union field in the form resolves to a DIFFERENT discriminated
736
+ * variant between two wrapped data containers. A variant picker typically
737
+ * detects its variant index once at setup and keys the variant subtree on it,
738
+ * so a rebase that lands a different variant (via conflict OR an upstream-only
739
+ * switch) needs a remount to re-detect. This walks union + nested-object fields
740
+ * and compares `detectUnionVariant` at each union path.
741
+ *
742
+ * Scope note (pragmatic): walks standalone + nested-OBJECT union fields. Unions
743
+ * nested INSIDE array items are not walked — an array renderer that keeps a
744
+ * stable per-item key across in-place value mutations would not remount an
745
+ * existing row's picker on an upstream-driven variant flip, but that collision
746
+ * (a 3-way rebase landing a different union variant inside an unchanged array
747
+ * row) is a rare edge. TODO: extend to array-item unions if a real consumer
748
+ * hits a stuck picker inside an array row.
749
+ */
750
+ declare function unionVariantChanged(def: FormDef, before: Record<string, unknown>, after: Record<string, unknown>): boolean;
553
751
  //#endregion
554
752
  //#region src/form/error-utils.d.ts
555
753
  /**
@@ -819,6 +1017,11 @@ interface TableDef {
819
1017
  * of re-walking the type.
820
1018
  */
821
1019
  flatMap: Map<string, TAtscriptAnnotatedType>;
1020
+ /**
1021
+ * Server-returnable field paths (from meta.fields) — the gate for
1022
+ * @ui.table.selectWith targets, includes @ui.table.exclude fields.
1023
+ */
1024
+ fetchableFields: Set<string>;
822
1025
  primaryKeys: string[];
823
1026
  /** Preferred row identifier — see `MetaResponse.preferredId`. */
824
1027
  preferredId: string[];
@@ -859,8 +1062,6 @@ interface ColumnDef {
859
1062
  * for non-nullable columns since they can never match.
860
1063
  */
861
1064
  nullable: boolean;
862
- /** Whether this column is visible by default. */
863
- visible: boolean;
864
1065
  /** Default column width from @ui.table.width. */
865
1066
  width?: string;
866
1067
  /** Maximum length constraint from @expect.maxLen — used to derive default column width. */
@@ -970,8 +1171,6 @@ declare function resetMetaCache(): void;
970
1171
  declare function str(value: unknown): string;
971
1172
  //#endregion
972
1173
  //#region src/table/column-resolver.d.ts
973
- /** Get visible columns only, already sorted by order. */
974
- declare function getVisibleColumns(def: TableDef): ColumnDef[];
975
1174
  /** Get sortable columns. */
976
1175
  declare function getSortableColumns(def: TableDef): ColumnDef[];
977
1176
  /** Get filterable columns. */
@@ -979,4 +1178,4 @@ declare function getFilterableColumns(def: TableDef): ColumnDef[];
979
1178
  /** Find a column by path. */
980
1179
  declare function getColumn(def: TableDef, path: string): ColumnDef | undefined;
981
1180
  //#endregion
982
- export { type ClientFactory, type ColumnDef, type CurrencyDisplay, DB_AMOUNT_CURRENCY, DB_AMOUNT_CURRENCY_REF, DB_COLUMN_PRECISION, DB_HTTP_PATH, DB_REL_FK, DB_UNIT, DB_UNIT_REF, DEFAULT_COL_SPAN, DEFAULT_ROW_SPAN, type DecimalParts, EXPECT_MAX_LENGTH, type FieldMeta, type FieldResolver, type FormActionInfo, type FormArrayFieldDef, type FormDef, type FormDiffOptions, type FormDiffResult, type FormFieldChange, type FormFieldDef, type FormObjectFieldDef, type FormTupleFieldDef, type FormUnionFieldDef, type FormUnionVariant, type FormatDecimalOptions, type GridSpanArgs, type GridSpec, META_DEFAULT, META_DESCRIPTION, META_ID, META_LABEL, META_READONLY, META_REQUIRED, META_SENSITIVE, type MeasurementInfo, type MetaCacheEntry, type MetaResponse, type PaginationControl, type RelationInfo, type ResolvedValueHelp, type SearchIndexInfo, type SortControl, StaticFieldResolver, type TCrudOp, type TCrudPermissions, type TDbActionInfo, type TDbActionIntent, type TDbActionLevel, type TDbActionProcessor, type TFieldValidatorOptions, type TFormAction, type TFormEntryOptions, type TFormValidatorCallOptions, type TFormValueResolver, type TResolveOptions, type TableActionsModel, type TableDef, type TableQueryState, UI_DICT_ATTR, UI_DICT_DESCR, UI_DICT_FILTERABLE, UI_DICT_LABEL, UI_DICT_SEARCHABLE, UI_DICT_SORTABLE, UI_FORM_ACTION, UI_FORM_ATTR, UI_FORM_AUTOCOMPLETE, UI_FORM_CLASSES, UI_FORM_COMPONENT, UI_FORM_DISABLED, UI_FORM_FN_ATTR, UI_FORM_FN_CLASSES, UI_FORM_FN_DESCRIPTION, UI_FORM_FN_DISABLED, UI_FORM_FN_HIDDEN, UI_FORM_FN_HINT, UI_FORM_FN_LABEL, UI_FORM_FN_OPTIONS, UI_FORM_FN_PLACEHOLDER, UI_FORM_FN_PREFIX, UI_FORM_FN_READONLY, UI_FORM_FN_STYLES, UI_FORM_FN_SUBMIT_DISABLED, UI_FORM_FN_SUBMIT_TEXT, UI_FORM_FN_TITLE, UI_FORM_FN_VALUE, UI_FORM_GRID_COL_SPAN, UI_FORM_GRID_ROW_SPAN, UI_FORM_HIDDEN, UI_FORM_HINT, UI_FORM_LABEL_SINGULAR, UI_FORM_OPTIONS, UI_FORM_ORDER, UI_FORM_PLACEHOLDER, UI_FORM_PREFIX, UI_FORM_PREFIX_ICON, UI_FORM_PREFIX_REF, UI_FORM_STYLES, UI_FORM_SUBMIT_TEXT, UI_FORM_SUFFIX, UI_FORM_SUFFIX_ICON, UI_FORM_SUFFIX_REF, UI_FORM_TYPE, UI_FORM_VALIDATE, UI_TABLE_ATTR, UI_TABLE_CLASSES, UI_TABLE_COMPONENT, UI_TABLE_FN_ATTR, UI_TABLE_FN_CLASSES, UI_TABLE_FN_PREFIX, UI_TABLE_FN_STYLES, UI_TABLE_HIDDEN, UI_TABLE_ORDER, UI_TABLE_SELECT_WITH, UI_TABLE_STYLES, UI_TABLE_TYPE, UI_TABLE_WIDTH, UI_TYPE, ValueHelpClient, type ValueHelpInfo, type ValueHelpResult, type ValueHelpSearchOptions, WF_ACTION_WITH_DATA, asArray, buildDescendantErrorCounts, buildFormDiff, buildGridClasses, buildUnionVariants, createFieldValidator, createFormData, createFormDef, createFormValueResolver, createTableDef, defaultResolver, detectUnionVariant, enforceScale, extractLiteralOptions, extractMeasurement, extractValueHelp, formatDecimalForDisplay, getByPath, getColumn, getCurrencyDecimals, getCurrencyDisplayParts, getDecimalSeparator, getDeclaredFormActions, getDefaultClientFactory, getDefaultValidatorPlugins, getFieldMeta, getFilterableColumns, getFormValidator, getMetaEntry, getResolver, getSortableColumns, getThousandsSeparator, getVisibleColumns, groupInteger, hasComputedAnnotations, isArrayField, isObjectField, isPureLiteralUnion, isTupleField, isUnionField, iteratePathAncestors, joinDecimalString, mergeErrorMaps, optKey, optLabel, parseColSpan, parseDecimalInput, parseRowSpan, parseStaticAttrs, parseStaticOptions, resetDefaultClientFactory, resetMetaCache, resetValueHelpCache, resolveAttrs, resolveFieldProp, resolveFormProp, resolveGridSpec, resolveOptions, resolveSingularLabel, resolveStatic, resolveValueHelp, setByPath, setDefaultClientFactory, setDefaultValidatorPlugins, setResolver, splitDecimalString, str, valueHelpDictPaths };
1181
+ export { type ClientFactory, type CloneUnwrap, type ColumnDef, type CurrencyDisplay, DB_AMOUNT_CURRENCY, DB_AMOUNT_CURRENCY_REF, DB_COLUMN_PRECISION, DB_HTTP_PATH, DB_REL_FK, DB_UNIT, DB_UNIT_REF, DEFAULT_COL_SPAN, DEFAULT_ROW_SPAN, type DecimalParts, EXPECT_MAX_LENGTH, type FieldMeta, type FieldResolver, type FormActionInfo, type FormArrayFieldDef, type FormDef, type FormDiffOptions, type FormDiffResult, type FormFieldChange, type FormFieldDef, type FormObjectFieldDef, type FormRebaseOptions, type FormRebaseResult, type FormTupleFieldDef, type FormUnionFieldDef, type FormUnionVariant, type FormatDecimalOptions, type GridSpanArgs, type GridSpec, META_DEFAULT, META_DESCRIPTION, META_ID, META_LABEL, META_READONLY, META_REQUIRED, META_SENSITIVE, type MeasurementInfo, type MetaCacheEntry, type MetaResponse, type PaginationControl, type RelationInfo, type ResolvedValueHelp, type SearchIndexInfo, type SortControl, StaticFieldResolver, type TCrudOp, type TCrudPermissions, type TDbActionInfo, type TDbActionIntent, type TDbActionLevel, type TDbActionProcessor, type TFieldValidatorOptions, type TFormAction, type TFormEntryOptions, type TFormValidatorCallOptions, type TFormValueResolver, type TResolveOptions, type TableActionsModel, type TableDef, type TableQueryState, UI_DICT_ATTR, UI_DICT_DESCR, UI_DICT_FILTERABLE, UI_DICT_LABEL, UI_DICT_SEARCHABLE, UI_DICT_SORTABLE, UI_FORM_ACTION, UI_FORM_ATTR, UI_FORM_AUTOCOMPLETE, UI_FORM_CLASSES, UI_FORM_COMPONENT, UI_FORM_DISABLED, UI_FORM_FN_ATTR, UI_FORM_FN_CLASSES, UI_FORM_FN_DESCRIPTION, UI_FORM_FN_DISABLED, UI_FORM_FN_HIDDEN, UI_FORM_FN_HINT, UI_FORM_FN_LABEL, UI_FORM_FN_OPTIONS, UI_FORM_FN_PLACEHOLDER, UI_FORM_FN_PREFIX, UI_FORM_FN_READONLY, UI_FORM_FN_STYLES, UI_FORM_FN_SUBMIT_DISABLED, UI_FORM_FN_SUBMIT_TEXT, UI_FORM_FN_TITLE, UI_FORM_FN_VALUE, UI_FORM_GRID_COL_SPAN, UI_FORM_GRID_ROW_SPAN, UI_FORM_HIDDEN, UI_FORM_HINT, UI_FORM_LABEL_SINGULAR, UI_FORM_OPTIONS, UI_FORM_ORDER, UI_FORM_PLACEHOLDER, UI_FORM_PREFIX, UI_FORM_PREFIX_ICON, UI_FORM_PREFIX_REF, UI_FORM_STYLES, UI_FORM_SUBMIT_TEXT, UI_FORM_SUFFIX, UI_FORM_SUFFIX_ICON, UI_FORM_SUFFIX_REF, UI_FORM_TYPE, UI_FORM_VALIDATE, UI_TABLE_ATTR, UI_TABLE_CLASSES, UI_TABLE_COMPONENT, UI_TABLE_EXCLUDE, UI_TABLE_FN_ATTR, UI_TABLE_FN_CLASSES, UI_TABLE_FN_PREFIX, UI_TABLE_FN_STYLES, UI_TABLE_ORDER, UI_TABLE_SELECT_WITH, UI_TABLE_STYLES, UI_TABLE_TYPE, UI_TABLE_WIDTH, UI_TYPE, ValueHelpClient, type ValueHelpInfo, type ValueHelpResult, type ValueHelpSearchOptions, WF_ACTION_WITH_DATA, applyFormChanges, asArray, buildDescendantErrorCounts, buildFormDiff, buildFormRebase, buildGridClasses, buildUnionVariants, collectDirtyPaths, createFieldValidator, createFormData, createFormDef, createFormValueResolver, createTableDef, deepClone, deepEqual, defaultResolver, deleteByPath, detectUnionVariant, enforceScale, extractLiteralOptions, extractMeasurement, extractValueHelp, formatDecimalForDisplay, getByPath, getColumn, getCurrencyDecimals, getCurrencyDisplayParts, getDecimalSeparator, getDeclaredFormActions, getDefaultClientFactory, getDefaultValidatorPlugins, getFieldMeta, getFilterableColumns, getFormValidator, getMetaEntry, getResolver, getSortableColumns, getThousandsSeparator, groupInteger, hasComputedAnnotations, isArrayField, isObjectField, isPathDirty, isPureLiteralUnion, isTupleField, isUnionField, iteratePathAncestors, joinDecimalString, mergeErrorMaps, optKey, optLabel, parseColSpan, parseDecimalInput, parseRowSpan, parseStaticAttrs, parseStaticOptions, resetDefaultClientFactory, resetMetaCache, resetValueHelpCache, resolveAttrs, resolveFieldProp, resolveFormProp, resolveGridSpec, resolveOptions, resolveSingularLabel, resolveStatic, resolveValueHelp, setByPath, setDefaultClientFactory, setDefaultValidatorPlugins, setResolver, splitDecimalString, str, unionVariantChanged, valueHelpDictPaths };
package/dist/index.d.mts CHANGED
@@ -29,7 +29,7 @@ declare const UI_FORM_SUFFIX_ICON: "ui.form.suffix.icon";
29
29
  declare const UI_TABLE_WIDTH: "ui.table.width";
30
30
  declare const UI_TABLE_COMPONENT: "ui.table.component";
31
31
  declare const UI_TABLE_SELECT_WITH: "ui.table.selectWith";
32
- declare const UI_TABLE_HIDDEN: "ui.table.hidden";
32
+ declare const UI_TABLE_EXCLUDE: "ui.table.exclude";
33
33
  declare const UI_TABLE_ATTR: "ui.table.attr";
34
34
  declare const UI_TABLE_CLASSES: "ui.table.classes";
35
35
  declare const UI_TABLE_STYLES: "ui.table.styles";
@@ -442,6 +442,20 @@ declare function getByPath(obj: Record<string, unknown>, path: string): unknown;
442
442
  * Creates intermediate objects if they do not exist.
443
443
  */
444
444
  declare function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void;
445
+ /**
446
+ * Deletes the own key at a dot-separated path (form-data wrapper aware — derefs
447
+ * `obj.value` first). Walks to the parent WITHOUT vivifying intermediate nodes:
448
+ * if any ancestor is missing, the call is a no-op (nothing to delete).
449
+ *
450
+ * Unlike `setByPath(obj, path, undefined)`, this leaves NO own key behind — the
451
+ * leaf reads as absent (`'k' in parent === false`), which keeps `deepEqual`
452
+ * structural comparisons in sync (a present `undefined` own-key and an absent
453
+ * key are NOT structurally equal under the own-key walk). Used by
454
+ * {@link applyFormChanges} to apply a clear-to-`undefined` change as a delete.
455
+ *
456
+ * Empty path clears the root domain value (`obj.value = undefined`).
457
+ */
458
+ declare function deleteByPath(obj: Record<string, unknown>, path: string): void;
445
459
  /** Value resolver function type — created once per form, reused across calls. */
446
460
  type TFormValueResolver = (prop: TAtscriptAnnotatedType, path: string) => unknown;
447
461
  declare function createFormValueResolver(data?: Record<string, unknown>, context?: Record<string, unknown>): TFormValueResolver;
@@ -450,6 +464,28 @@ declare function createFormData<T extends TAtscriptAnnotatedType>(type: T, resol
450
464
  };
451
465
  declare function detectUnionVariant(value: unknown, variants: FormUnionVariant[]): number;
452
466
  //#endregion
467
+ //#region src/form/clone.d.ts
468
+ /**
469
+ * Optional per-value unwrap hook. Lets a framework caller strip a reactive
470
+ * proxy off every visited value before it is copied (e.g. Vue's `toRaw`). The
471
+ * core never needs it — it is `undefined` here and the value passes through.
472
+ */
473
+ type CloneUnwrap = (value: unknown) => unknown;
474
+ /**
475
+ * Structural deep clone of plain JSON-ish data (objects / arrays / primitives /
476
+ * `Date`). Walks OWN-ENUMERABLE keys only (matches the own-key discipline in
477
+ * `diff.ts` — never copies an accidental prototype) and copies leaves by value.
478
+ *
479
+ * `structuredClone` is deliberately NOT used: it throws on functions and on Vue
480
+ * reactive proxies. The optional `unwrap` hook lets a framework caller
481
+ * de-proxy each value first (vue-form passes `toRaw`); the core omits it.
482
+ *
483
+ * The SINGLE deep-clone primitive for the form engine — used by
484
+ * `applyFormChanges`, `buildFormRebase`, and vue-form's baseline snapshot. Do
485
+ * not reimplement structural cloning elsewhere.
486
+ */
487
+ declare function deepClone<T>(value: T, unwrap?: CloneUnwrap): T;
488
+ //#endregion
453
489
  //#region src/form/validate.d.ts
454
490
  /** Per-call options for the form validator function. */
455
491
  interface TFormValidatorCallOptions {
@@ -550,6 +586,168 @@ interface FormDiffResult {
550
586
  * time on a frozen clone). This is the common Vue v-model flow.
551
587
  */
552
588
  declare function buildFormDiff(def: FormDef, baseline: Record<string, unknown>, current: Record<string, unknown>, opts?: FormDiffOptions): FormDiffResult;
589
+ /**
590
+ * Structural deep equality (order-sensitive for arrays). `NaN` equals `NaN`
591
+ * (revert-aware for NaN scalars) while `0` / `-0` stay equal (matches DB
592
+ * intent — `===` treats them equal, only NaN is special-cased).
593
+ *
594
+ * The single comparator shared across the form engine: diff, conflict
595
+ * detection ({@link buildFormRebase}), and apply all route through this — never
596
+ * reimplement equality elsewhere.
597
+ */
598
+ declare function deepEqual(a: unknown, b: unknown): boolean;
599
+ //#endregion
600
+ //#region src/form/dirty.d.ts
601
+ /**
602
+ * True when the field at dot-path `path` is dirty given a {@link FormFieldChange}
603
+ * list (as produced by {@link buildFormDiff}).
604
+ *
605
+ * The change list is leaf-grained for scalars/objects but WHOLE-ARRAY for arrays,
606
+ * so a field at `path` is dirty iff some change path equals `path` OR starts with
607
+ * `path + "."`:
608
+ *
609
+ * - scalar / leaf field (incl. nested `address.city`) → exact match.
610
+ * - object / section container → no entry at its own path, only its leaves →
611
+ * matched by the PREFIX branch.
612
+ * - whole-array field → one entry at the array root → exact match.
613
+ * - a field rendered for an array-ITEM leaf (e.g. `items.0.qty`) → NOT detectable:
614
+ * the array diff emits a single whole-array change at the array root, never
615
+ * per-item leaf paths, so this correctly returns false (the array container
616
+ * lights up instead). This is a known, documented limitation.
617
+ *
618
+ * The prefix uses `path + "."` so field `item` never matches a change at `items`
619
+ * (no false positives).
620
+ *
621
+ * Empty `path` `''` is the wrapped form root — every change is nested under it,
622
+ * so it is considered dirty iff there are ANY changes.
623
+ */
624
+ declare function isPathDirty(changes: FormFieldChange[], path: string): boolean;
625
+ /**
626
+ * Precomputes the set of ALL dirty paths from a {@link FormFieldChange} list so
627
+ * that membership is an O(1) `Set.has(path)` instead of {@link isPathDirty}'s
628
+ * per-call O(changes) prefix scan. Callers that probe many fields against the
629
+ * same change list (e.g. a form rendering one field per leaf) build this once
630
+ * and query it per field.
631
+ *
632
+ * For each change path `C` it adds `C` AND every dot-prefix ancestor of `C`
633
+ * (so `'address.city'` adds both `'address.city'` and `'address'`), matching
634
+ * `isPathDirty`'s "exact OR `path + '.'` prefix" predicate — an ancestor
635
+ * container is dirty exactly when some change is nested under it. The wrapped
636
+ * root `''` is added iff there are ANY changes, mirroring `isPathDirty('')`.
637
+ *
638
+ * INVARIANT (locked, tested): for EVERY path `P`,
639
+ * `collectDirtyPaths(changes).has(P) === isPathDirty(changes, P)`. This is a
640
+ * precompute of the SAME predicate, not a second one — keep them in lockstep.
641
+ */
642
+ declare function collectDirtyPaths(changes: FormFieldChange[]): Set<string>;
643
+ //#endregion
644
+ //#region src/form/apply.d.ts
645
+ /**
646
+ * Applies a {@link FormFieldChange} list onto a WRAPPED form-data container
647
+ * (`{ value: domainData }`), mutating it in place and returning the same
648
+ * reference. The inverse direction of {@link buildFormDiff}: where the diff
649
+ * READS `(baseline, current)` into changes, this WRITES changes onto data.
650
+ *
651
+ * IMPORTANT: pass a CLONE, never the live fetched row — every write mutates
652
+ * `data` directly. Callers that need the original intact should
653
+ * `deepClone(data)` first (see {@link deepClone}).
654
+ *
655
+ * Per-change semantics (the single place the apply rules live, so
656
+ * {@link buildFormRebase} stays consistent):
657
+ *
658
+ * - `kind: 'set'`:
659
+ * - `change.after === undefined` → DELETE the own key at `change.path` (walk
660
+ * to parent, `delete`). A cleared field must read as ABSENT, not as a
661
+ * present `undefined` own-key — otherwise a re-diff sees a structural
662
+ * mismatch where the form intends "no value". `setByPath(…, undefined)`
663
+ * leaves an own key behind, so we use {@link deleteByPath} instead.
664
+ * - otherwise → `setByPath(data, change.path, change.after)`.
665
+ * - `kind: 'array'`: whole-array set via `setByPath(data, change.path,
666
+ * change.after)` (LOCKED Option A — no per-element merge; the diff already
667
+ * carried the full after-array).
668
+ *
669
+ * The `def` is currently unused by the apply walk (paths fully describe the
670
+ * write target) but is part of the signature for parity with
671
+ * `buildFormDiff`/`buildFormRebase`, so the rebase engine threads one `def`
672
+ * uniformly through diff + apply.
673
+ */
674
+ declare function applyFormChanges(_def: FormDef, data: Record<string, unknown>, changes: FormFieldChange[]): Record<string, unknown>;
675
+ //#endregion
676
+ //#region src/form/rebase.d.ts
677
+ /** Options for {@link buildFormRebase}. */
678
+ interface FormRebaseOptions {
679
+ /**
680
+ * How to resolve a field changed on BOTH sides (local edit vs. upstream
681
+ * edit) to a different value:
682
+ * - `'ours'` (default) — keep the local edit, discard upstream's value.
683
+ * - `'theirs'` — take upstream's value, discard the local edit.
684
+ *
685
+ * A field changed on both sides to the SAME value is never a conflict.
686
+ */
687
+ conflict?: "ours" | "theirs";
688
+ }
689
+ /** Result of {@link buildFormRebase}. */
690
+ interface FormRebaseResult {
691
+ /**
692
+ * The rebased WRAPPED form-data container (`{ value }`). Always a fresh deep
693
+ * clone of `upstream` with the local diff reapplied — never aliases any
694
+ * input container.
695
+ */
696
+ next: Record<string, unknown>;
697
+ /**
698
+ * Paths that were changed on both sides to different values (same-path
699
+ * conflicts), plus ancestor paths whose subtree upstream cleared while local
700
+ * still edited a leaf under it (ancestor-clear conflicts). De-duplicated.
701
+ */
702
+ conflicts: string[];
703
+ /**
704
+ * The diff of `next` against the NEW baseline (`upstream`) — i.e. exactly the
705
+ * changes that survive on top of upstream. Empty `[]` when the rebased form
706
+ * equals upstream (a fully clean / fully reverted rebase).
707
+ *
708
+ * The returned `reapplied` does NOT alias the returned `next`, so installing
709
+ * `next` as live form data never retroactively mutates the returned change set.
710
+ */
711
+ reapplied: FormFieldChange[];
712
+ }
713
+ /**
714
+ * Pure 3-way rebase for a change-tracked form. Given the current baseline `B0`,
715
+ * the live form `C`, and a fresh upstream `U`, produces the form rewritten as
716
+ * `U` + the local diff (`C` vs `B0`) reapplied on top:
717
+ *
718
+ * - Fields the user never touched adopt upstream's value.
719
+ * - Local edits survive (reapplied onto the upstream clone).
720
+ * - Fields changed on BOTH sides to different values are conflicts, resolved by
721
+ * `opts.conflict` (`'ours'` keeps local, `'theirs'` takes upstream).
722
+ *
723
+ * All inputs are WRAPPED form-data containers (`{ value: domainData }`). The
724
+ * result `next` is a fresh container; no input is mutated.
725
+ *
726
+ * `diffOptions` are forwarded to BOTH internal `buildFormDiff` passes so the
727
+ * same field exclusions apply (notably the `@db.column.version` column and the
728
+ * `$cas` policy) on the local and upstream sides — keep them identical to the
729
+ * options the caller uses for its own change tracking.
730
+ */
731
+ declare function buildFormRebase(def: FormDef, baseline: Record<string, unknown>, current: Record<string, unknown>, upstream: Record<string, unknown>, opts?: FormRebaseOptions, diffOptions?: FormDiffOptions): FormRebaseResult;
732
+ //#endregion
733
+ //#region src/form/union-detect.d.ts
734
+ /**
735
+ * True when ANY union field in the form resolves to a DIFFERENT discriminated
736
+ * variant between two wrapped data containers. A variant picker typically
737
+ * detects its variant index once at setup and keys the variant subtree on it,
738
+ * so a rebase that lands a different variant (via conflict OR an upstream-only
739
+ * switch) needs a remount to re-detect. This walks union + nested-object fields
740
+ * and compares `detectUnionVariant` at each union path.
741
+ *
742
+ * Scope note (pragmatic): walks standalone + nested-OBJECT union fields. Unions
743
+ * nested INSIDE array items are not walked — an array renderer that keeps a
744
+ * stable per-item key across in-place value mutations would not remount an
745
+ * existing row's picker on an upstream-driven variant flip, but that collision
746
+ * (a 3-way rebase landing a different union variant inside an unchanged array
747
+ * row) is a rare edge. TODO: extend to array-item unions if a real consumer
748
+ * hits a stuck picker inside an array row.
749
+ */
750
+ declare function unionVariantChanged(def: FormDef, before: Record<string, unknown>, after: Record<string, unknown>): boolean;
553
751
  //#endregion
554
752
  //#region src/form/error-utils.d.ts
555
753
  /**
@@ -819,6 +1017,11 @@ interface TableDef {
819
1017
  * of re-walking the type.
820
1018
  */
821
1019
  flatMap: Map<string, TAtscriptAnnotatedType>;
1020
+ /**
1021
+ * Server-returnable field paths (from meta.fields) — the gate for
1022
+ * @ui.table.selectWith targets, includes @ui.table.exclude fields.
1023
+ */
1024
+ fetchableFields: Set<string>;
822
1025
  primaryKeys: string[];
823
1026
  /** Preferred row identifier — see `MetaResponse.preferredId`. */
824
1027
  preferredId: string[];
@@ -859,8 +1062,6 @@ interface ColumnDef {
859
1062
  * for non-nullable columns since they can never match.
860
1063
  */
861
1064
  nullable: boolean;
862
- /** Whether this column is visible by default. */
863
- visible: boolean;
864
1065
  /** Default column width from @ui.table.width. */
865
1066
  width?: string;
866
1067
  /** Maximum length constraint from @expect.maxLen — used to derive default column width. */
@@ -970,8 +1171,6 @@ declare function resetMetaCache(): void;
970
1171
  declare function str(value: unknown): string;
971
1172
  //#endregion
972
1173
  //#region src/table/column-resolver.d.ts
973
- /** Get visible columns only, already sorted by order. */
974
- declare function getVisibleColumns(def: TableDef): ColumnDef[];
975
1174
  /** Get sortable columns. */
976
1175
  declare function getSortableColumns(def: TableDef): ColumnDef[];
977
1176
  /** Get filterable columns. */
@@ -979,4 +1178,4 @@ declare function getFilterableColumns(def: TableDef): ColumnDef[];
979
1178
  /** Find a column by path. */
980
1179
  declare function getColumn(def: TableDef, path: string): ColumnDef | undefined;
981
1180
  //#endregion
982
- export { type ClientFactory, type ColumnDef, type CurrencyDisplay, DB_AMOUNT_CURRENCY, DB_AMOUNT_CURRENCY_REF, DB_COLUMN_PRECISION, DB_HTTP_PATH, DB_REL_FK, DB_UNIT, DB_UNIT_REF, DEFAULT_COL_SPAN, DEFAULT_ROW_SPAN, type DecimalParts, EXPECT_MAX_LENGTH, type FieldMeta, type FieldResolver, type FormActionInfo, type FormArrayFieldDef, type FormDef, type FormDiffOptions, type FormDiffResult, type FormFieldChange, type FormFieldDef, type FormObjectFieldDef, type FormTupleFieldDef, type FormUnionFieldDef, type FormUnionVariant, type FormatDecimalOptions, type GridSpanArgs, type GridSpec, META_DEFAULT, META_DESCRIPTION, META_ID, META_LABEL, META_READONLY, META_REQUIRED, META_SENSITIVE, type MeasurementInfo, type MetaCacheEntry, type MetaResponse, type PaginationControl, type RelationInfo, type ResolvedValueHelp, type SearchIndexInfo, type SortControl, StaticFieldResolver, type TCrudOp, type TCrudPermissions, type TDbActionInfo, type TDbActionIntent, type TDbActionLevel, type TDbActionProcessor, type TFieldValidatorOptions, type TFormAction, type TFormEntryOptions, type TFormValidatorCallOptions, type TFormValueResolver, type TResolveOptions, type TableActionsModel, type TableDef, type TableQueryState, UI_DICT_ATTR, UI_DICT_DESCR, UI_DICT_FILTERABLE, UI_DICT_LABEL, UI_DICT_SEARCHABLE, UI_DICT_SORTABLE, UI_FORM_ACTION, UI_FORM_ATTR, UI_FORM_AUTOCOMPLETE, UI_FORM_CLASSES, UI_FORM_COMPONENT, UI_FORM_DISABLED, UI_FORM_FN_ATTR, UI_FORM_FN_CLASSES, UI_FORM_FN_DESCRIPTION, UI_FORM_FN_DISABLED, UI_FORM_FN_HIDDEN, UI_FORM_FN_HINT, UI_FORM_FN_LABEL, UI_FORM_FN_OPTIONS, UI_FORM_FN_PLACEHOLDER, UI_FORM_FN_PREFIX, UI_FORM_FN_READONLY, UI_FORM_FN_STYLES, UI_FORM_FN_SUBMIT_DISABLED, UI_FORM_FN_SUBMIT_TEXT, UI_FORM_FN_TITLE, UI_FORM_FN_VALUE, UI_FORM_GRID_COL_SPAN, UI_FORM_GRID_ROW_SPAN, UI_FORM_HIDDEN, UI_FORM_HINT, UI_FORM_LABEL_SINGULAR, UI_FORM_OPTIONS, UI_FORM_ORDER, UI_FORM_PLACEHOLDER, UI_FORM_PREFIX, UI_FORM_PREFIX_ICON, UI_FORM_PREFIX_REF, UI_FORM_STYLES, UI_FORM_SUBMIT_TEXT, UI_FORM_SUFFIX, UI_FORM_SUFFIX_ICON, UI_FORM_SUFFIX_REF, UI_FORM_TYPE, UI_FORM_VALIDATE, UI_TABLE_ATTR, UI_TABLE_CLASSES, UI_TABLE_COMPONENT, UI_TABLE_FN_ATTR, UI_TABLE_FN_CLASSES, UI_TABLE_FN_PREFIX, UI_TABLE_FN_STYLES, UI_TABLE_HIDDEN, UI_TABLE_ORDER, UI_TABLE_SELECT_WITH, UI_TABLE_STYLES, UI_TABLE_TYPE, UI_TABLE_WIDTH, UI_TYPE, ValueHelpClient, type ValueHelpInfo, type ValueHelpResult, type ValueHelpSearchOptions, WF_ACTION_WITH_DATA, asArray, buildDescendantErrorCounts, buildFormDiff, buildGridClasses, buildUnionVariants, createFieldValidator, createFormData, createFormDef, createFormValueResolver, createTableDef, defaultResolver, detectUnionVariant, enforceScale, extractLiteralOptions, extractMeasurement, extractValueHelp, formatDecimalForDisplay, getByPath, getColumn, getCurrencyDecimals, getCurrencyDisplayParts, getDecimalSeparator, getDeclaredFormActions, getDefaultClientFactory, getDefaultValidatorPlugins, getFieldMeta, getFilterableColumns, getFormValidator, getMetaEntry, getResolver, getSortableColumns, getThousandsSeparator, getVisibleColumns, groupInteger, hasComputedAnnotations, isArrayField, isObjectField, isPureLiteralUnion, isTupleField, isUnionField, iteratePathAncestors, joinDecimalString, mergeErrorMaps, optKey, optLabel, parseColSpan, parseDecimalInput, parseRowSpan, parseStaticAttrs, parseStaticOptions, resetDefaultClientFactory, resetMetaCache, resetValueHelpCache, resolveAttrs, resolveFieldProp, resolveFormProp, resolveGridSpec, resolveOptions, resolveSingularLabel, resolveStatic, resolveValueHelp, setByPath, setDefaultClientFactory, setDefaultValidatorPlugins, setResolver, splitDecimalString, str, valueHelpDictPaths };
1181
+ export { type ClientFactory, type CloneUnwrap, type ColumnDef, type CurrencyDisplay, DB_AMOUNT_CURRENCY, DB_AMOUNT_CURRENCY_REF, DB_COLUMN_PRECISION, DB_HTTP_PATH, DB_REL_FK, DB_UNIT, DB_UNIT_REF, DEFAULT_COL_SPAN, DEFAULT_ROW_SPAN, type DecimalParts, EXPECT_MAX_LENGTH, type FieldMeta, type FieldResolver, type FormActionInfo, type FormArrayFieldDef, type FormDef, type FormDiffOptions, type FormDiffResult, type FormFieldChange, type FormFieldDef, type FormObjectFieldDef, type FormRebaseOptions, type FormRebaseResult, type FormTupleFieldDef, type FormUnionFieldDef, type FormUnionVariant, type FormatDecimalOptions, type GridSpanArgs, type GridSpec, META_DEFAULT, META_DESCRIPTION, META_ID, META_LABEL, META_READONLY, META_REQUIRED, META_SENSITIVE, type MeasurementInfo, type MetaCacheEntry, type MetaResponse, type PaginationControl, type RelationInfo, type ResolvedValueHelp, type SearchIndexInfo, type SortControl, StaticFieldResolver, type TCrudOp, type TCrudPermissions, type TDbActionInfo, type TDbActionIntent, type TDbActionLevel, type TDbActionProcessor, type TFieldValidatorOptions, type TFormAction, type TFormEntryOptions, type TFormValidatorCallOptions, type TFormValueResolver, type TResolveOptions, type TableActionsModel, type TableDef, type TableQueryState, UI_DICT_ATTR, UI_DICT_DESCR, UI_DICT_FILTERABLE, UI_DICT_LABEL, UI_DICT_SEARCHABLE, UI_DICT_SORTABLE, UI_FORM_ACTION, UI_FORM_ATTR, UI_FORM_AUTOCOMPLETE, UI_FORM_CLASSES, UI_FORM_COMPONENT, UI_FORM_DISABLED, UI_FORM_FN_ATTR, UI_FORM_FN_CLASSES, UI_FORM_FN_DESCRIPTION, UI_FORM_FN_DISABLED, UI_FORM_FN_HIDDEN, UI_FORM_FN_HINT, UI_FORM_FN_LABEL, UI_FORM_FN_OPTIONS, UI_FORM_FN_PLACEHOLDER, UI_FORM_FN_PREFIX, UI_FORM_FN_READONLY, UI_FORM_FN_STYLES, UI_FORM_FN_SUBMIT_DISABLED, UI_FORM_FN_SUBMIT_TEXT, UI_FORM_FN_TITLE, UI_FORM_FN_VALUE, UI_FORM_GRID_COL_SPAN, UI_FORM_GRID_ROW_SPAN, UI_FORM_HIDDEN, UI_FORM_HINT, UI_FORM_LABEL_SINGULAR, UI_FORM_OPTIONS, UI_FORM_ORDER, UI_FORM_PLACEHOLDER, UI_FORM_PREFIX, UI_FORM_PREFIX_ICON, UI_FORM_PREFIX_REF, UI_FORM_STYLES, UI_FORM_SUBMIT_TEXT, UI_FORM_SUFFIX, UI_FORM_SUFFIX_ICON, UI_FORM_SUFFIX_REF, UI_FORM_TYPE, UI_FORM_VALIDATE, UI_TABLE_ATTR, UI_TABLE_CLASSES, UI_TABLE_COMPONENT, UI_TABLE_EXCLUDE, UI_TABLE_FN_ATTR, UI_TABLE_FN_CLASSES, UI_TABLE_FN_PREFIX, UI_TABLE_FN_STYLES, UI_TABLE_ORDER, UI_TABLE_SELECT_WITH, UI_TABLE_STYLES, UI_TABLE_TYPE, UI_TABLE_WIDTH, UI_TYPE, ValueHelpClient, type ValueHelpInfo, type ValueHelpResult, type ValueHelpSearchOptions, WF_ACTION_WITH_DATA, applyFormChanges, asArray, buildDescendantErrorCounts, buildFormDiff, buildFormRebase, buildGridClasses, buildUnionVariants, collectDirtyPaths, createFieldValidator, createFormData, createFormDef, createFormValueResolver, createTableDef, deepClone, deepEqual, defaultResolver, deleteByPath, detectUnionVariant, enforceScale, extractLiteralOptions, extractMeasurement, extractValueHelp, formatDecimalForDisplay, getByPath, getColumn, getCurrencyDecimals, getCurrencyDisplayParts, getDecimalSeparator, getDeclaredFormActions, getDefaultClientFactory, getDefaultValidatorPlugins, getFieldMeta, getFilterableColumns, getFormValidator, getMetaEntry, getResolver, getSortableColumns, getThousandsSeparator, groupInteger, hasComputedAnnotations, isArrayField, isObjectField, isPathDirty, isPureLiteralUnion, isTupleField, isUnionField, iteratePathAncestors, joinDecimalString, mergeErrorMaps, optKey, optLabel, parseColSpan, parseDecimalInput, parseRowSpan, parseStaticAttrs, parseStaticOptions, resetDefaultClientFactory, resetMetaCache, resetValueHelpCache, resolveAttrs, resolveFieldProp, resolveFormProp, resolveGridSpec, resolveOptions, resolveSingularLabel, resolveStatic, resolveValueHelp, setByPath, setDefaultClientFactory, setDefaultValidatorPlugins, setResolver, splitDecimalString, str, unionVariantChanged, valueHelpDictPaths };