@atscript/ui 0.1.103 → 0.1.104
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.cjs +301 -10
- package/dist/index.d.cts +205 -6
- package/dist/index.d.mts +205 -6
- package/dist/index.mjs +293 -9
- package/dist/plugin.cjs +2 -2
- package/dist/plugin.mjs +2 -2
- package/package.json +3 -3
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
|
|
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,
|
|
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
|
|
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,
|
|
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 };
|