@object-ui/plugin-form 17.6.0 → 17.7.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.
- package/CHANGELOG.md +4187 -0
- package/README.md +376 -44
- package/dist/DrawerForm.d.ts +30 -2
- package/dist/DrawerForm.d.ts.map +1 -1
- package/dist/EmbeddableForm.d.ts.map +1 -1
- package/dist/FormAnalytics.d.ts.map +1 -1
- package/dist/LineItemsPanel.d.ts +6 -3
- package/dist/LineItemsPanel.d.ts.map +1 -1
- package/dist/MasterDetailForm.d.ts +31 -10
- package/dist/MasterDetailForm.d.ts.map +1 -1
- package/dist/ModalForm.d.ts +48 -4
- package/dist/ModalForm.d.ts.map +1 -1
- package/dist/ObjectForm.d.ts.map +1 -1
- package/dist/SplitForm.d.ts +37 -2
- package/dist/SplitForm.d.ts.map +1 -1
- package/dist/TabbedForm.d.ts +65 -3
- package/dist/TabbedForm.d.ts.map +1 -1
- package/dist/WizardForm.d.ts +143 -38
- package/dist/WizardForm.d.ts.map +1 -1
- package/dist/autoLayout.d.ts +12 -3
- package/dist/autoLayout.d.ts.map +1 -1
- package/dist/closedAffordanceNotice.d.ts +14 -0
- package/dist/closedAffordanceNotice.d.ts.map +1 -0
- package/dist/customFieldsMerge.d.ts +29 -0
- package/dist/customFieldsMerge.d.ts.map +1 -0
- package/dist/deriveMasterDetail.d.ts +32 -8
- package/dist/deriveMasterDetail.d.ts.map +1 -1
- package/dist/fieldGroups.d.ts +176 -0
- package/dist/fieldGroups.d.ts.map +1 -1
- package/dist/fieldWriteGate.d.ts +116 -0
- package/dist/fieldWriteGate.d.ts.map +1 -0
- package/dist/flatFields.d.ts +11 -2
- package/dist/flatFields.d.ts.map +1 -1
- package/dist/formChrome.d.ts +55 -0
- package/dist/formChrome.d.ts.map +1 -0
- package/dist/index.d.ts +124 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3435 -2093
- package/dist/index.umd.cjs +1 -1
- package/dist/initialRecord.d.ts +72 -0
- package/dist/initialRecord.d.ts.map +1 -0
- package/dist/loadFailure.d.ts +28 -0
- package/dist/loadFailure.d.ts.map +1 -0
- package/dist/masterDetailTx.d.ts.map +1 -1
- package/dist/occSave.d.ts +6 -1
- package/dist/occSave.d.ts.map +1 -1
- package/dist/recordInvalidation.d.ts +33 -0
- package/dist/recordInvalidation.d.ts.map +1 -0
- package/dist/recordReadGate.d.ts +34 -0
- package/dist/recordReadGate.d.ts.map +1 -0
- package/dist/sanitize.d.ts +187 -5
- package/dist/sanitize.d.ts.map +1 -1
- package/dist/schemaDefaults.d.ts +27 -6
- package/dist/schemaDefaults.d.ts.map +1 -1
- package/dist/sectionFields.d.ts +56 -2
- package/dist/sectionFields.d.ts.map +1 -1
- package/dist/sectionGroups.d.ts +62 -0
- package/dist/sectionGroups.d.ts.map +1 -0
- package/dist/sectionPredicateDiagnostic.d.ts +38 -0
- package/dist/sectionPredicateDiagnostic.d.ts.map +1 -0
- package/dist/submitTarget.d.ts +119 -0
- package/dist/submitTarget.d.ts.map +1 -0
- package/dist/successBehavior.d.ts +44 -25
- package/dist/successBehavior.d.ts.map +1 -1
- package/dist/thankYouRedirectCountdown.d.ts +1 -1
- package/dist/uploadGate.d.ts +35 -0
- package/dist/uploadGate.d.ts.map +1 -0
- package/dist/writePayload.d.ts +68 -0
- package/dist/writePayload.d.ts.map +1 -0
- package/package.json +12 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldGroups.d.ts","sourceRoot":"","sources":["../src/fieldGroups.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EAAE,EACnB,WAAW,EAAE,OAAO,GACnB,iBAAiB,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"fieldGroups.d.ts","sourceRoot":"","sources":["../src/fieldGroups.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EAAE,EACnB,WAAW,EAAE,OAAO,GACnB,iBAAiB,EAAE,GAAG,IAAI,CA6C5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAClF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhE;AAGD;;;;GAIG;AACH,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,EACxD,IAAI,EAAE;IACJ,mEAAmE;IACnE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,GACA;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAWrE;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAgC/E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { SchemaLike } from '@object-ui/core';
|
|
2
|
+
/**
|
|
3
|
+
* The permission surface this module consumes — structurally the subset of
|
|
4
|
+
* `usePermissions()` that answers the write question. Declared structurally so
|
|
5
|
+
* `@object-ui/plugin-form` binds to the two members it actually reads rather
|
|
6
|
+
* than to the whole context type.
|
|
7
|
+
*/
|
|
8
|
+
export interface FieldWritePrincipal {
|
|
9
|
+
isLoaded: boolean;
|
|
10
|
+
checkField: (object: string, field: string, action: 'read' | 'write') => boolean;
|
|
11
|
+
}
|
|
12
|
+
/** A field-name predicate: `true` when the caller may write that field. */
|
|
13
|
+
export type FieldWriteGate = (fieldName: string) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Build the outbound write gate for one object, or `undefined` when there is
|
|
16
|
+
* no resolved principal to ask.
|
|
17
|
+
*
|
|
18
|
+
* `undefined` rather than an always-true function on purpose: the callers hand
|
|
19
|
+
* this straight to `sanitizeFormData`, whose option is absent-or-predicate, so
|
|
20
|
+
* an unresolved principal produces the byte-identical payload it produced
|
|
21
|
+
* before this gate existed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fieldWriteGate(perms: FieldWritePrincipal | null | undefined, objectName: string): FieldWriteGate | undefined;
|
|
24
|
+
export interface ApplyFieldPermissionsOptions {
|
|
25
|
+
perms: FieldWritePrincipal | null | undefined;
|
|
26
|
+
objectName: string;
|
|
27
|
+
/** A `view`-mode form renders everything read-only already. */
|
|
28
|
+
mode?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Optional hint placed on a field the caller may read but not edit, used
|
|
31
|
+
* only when the field declares no description of its own. `ObjectForm`'s
|
|
32
|
+
* simple variant is the one container that shows it.
|
|
33
|
+
*/
|
|
34
|
+
deniedDescription?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The render half for a FORM: drop what the caller may not READ, and mark what
|
|
38
|
+
* they may read but not WRITE as non-editable.
|
|
39
|
+
*/
|
|
40
|
+
export declare function applyFieldPermissions<T extends Record<string, any>>(fields: T[] | undefined, { perms, objectName, mode, deniedDescription }: ApplyFieldPermissionsOptions): T[] | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* The principal surface {@link gateFormFields} reads: the field-level resolver
|
|
43
|
+
* plus the server's effective API operation set for an object (`/me/permissions`
|
|
44
|
+
* `apiOperations`, objectstack#3391). `undefined` from it means "no effective set", which
|
|
45
|
+
* leaves the object's own affordance standing.
|
|
46
|
+
*/
|
|
47
|
+
export interface FormFieldPrincipal extends FieldWritePrincipal {
|
|
48
|
+
getObjectApiOperations?: (object: string) => readonly string[] | undefined;
|
|
49
|
+
}
|
|
50
|
+
export interface GateFormFieldsOptions extends ApplyFieldPermissionsOptions {
|
|
51
|
+
perms: FormFieldPrincipal | null | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* The object schema the form resolved (its `managedBy` bucket and
|
|
54
|
+
* `userActions` opt-ins). `null` while it has not loaded, or when the form
|
|
55
|
+
* has no metadata source, reads as the default bucket.
|
|
56
|
+
*/
|
|
57
|
+
objectSchema: SchemaLike | null | undefined;
|
|
58
|
+
}
|
|
59
|
+
/** The form-level affordance {@link closedFormAffordance} can report closed. */
|
|
60
|
+
export type ClosedFormAffordance = 'create' | 'edit';
|
|
61
|
+
/**
|
|
62
|
+
* Which affordance the managed-object lock found CLOSED for this form, or
|
|
63
|
+
* `undefined` when the lock does not engage (objectui#11000).
|
|
64
|
+
*
|
|
65
|
+
* It is {@link managedModeLocked}, the very predicate {@link gateFormFields}
|
|
66
|
+
* disables every drawn field on, read for its reason: `create` for a create
|
|
67
|
+
* form, `edit` for an edit form. The locked form's notice
|
|
68
|
+
* (`ClosedAffordanceNotice`) and the wizard's navigation gate read THIS, not a
|
|
69
|
+
* verdict of their own, so a form cannot explain a lock it did not draw, nor
|
|
70
|
+
* draw one it does not explain.
|
|
71
|
+
*
|
|
72
|
+
* A per-field lock never answers here: a field the caller may read but not
|
|
73
|
+
* edit ({@link applyFieldPermissions}) or a field declared `readonly` locks
|
|
74
|
+
* that one field while the form's affordance stays open.
|
|
75
|
+
*/
|
|
76
|
+
export declare function closedFormAffordance({ perms, objectName, mode, objectSchema, }: Pick<GateFormFieldsOptions, 'perms' | 'objectName' | 'mode' | 'objectSchema'>): ClosedFormAffordance | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* The ONE field-gate step every `ObjectForm` layout draws its RESOLVED fields
|
|
79
|
+
* through (objectui#10612): the default arm (flat and sectioned), `DrawerForm`
|
|
80
|
+
* and `ModalForm` (sections, derived field groups and flat), and `TabbedForm`,
|
|
81
|
+
* `SplitForm` and `WizardForm` (sections).
|
|
82
|
+
*
|
|
83
|
+
* Two gates, in one pass, so no layout can apply one and skip the other:
|
|
84
|
+
*
|
|
85
|
+
* 1. field-level security — {@link applyFieldPermissions}: drop what the
|
|
86
|
+
* caller may not READ, lock what they may read but not WRITE;
|
|
87
|
+
* 2. the managed-object lock — every drawn field is `disabled` when
|
|
88
|
+
* {@link managedModeLocked} says the mode's affordance is closed. Only
|
|
89
|
+
* `disabled`, not `readOnly`: the default arm's lock always drew a
|
|
90
|
+
* disabled input, and the submit button is left as it is.
|
|
91
|
+
*
|
|
92
|
+
* Before this step the lock was stamped by the default arm's field generator
|
|
93
|
+
* alone, so the drawer, modal, tabbed, split and wizard layouts drew live
|
|
94
|
+
* inputs on a managed object whose write the server refuses (objectui#10613,
|
|
95
|
+
* folded into objectui#10612). It runs on the resolved list rather than in a
|
|
96
|
+
* generator, so every drawn field is locked — an inline `customFields` member
|
|
97
|
+
* and an already-built section entry as much as a field generated from the
|
|
98
|
+
* object — which is what "blanket" says.
|
|
99
|
+
*
|
|
100
|
+
* Entries with no `name` pass through untouched, as in the render pass.
|
|
101
|
+
*/
|
|
102
|
+
export declare function gateFormFields<T extends Record<string, any>>(fields: T[] | undefined, { objectSchema, ...options }: GateFormFieldsOptions): T[] | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* The render half for a line-items GRID: the same pass over its columns — drop
|
|
105
|
+
* what the caller may not READ, and lock the cells of what they may read but
|
|
106
|
+
* not WRITE (objectui#10163).
|
|
107
|
+
*
|
|
108
|
+
* ⛔ Not a second gate: the verdict is {@link gateByPermission}'s, the same one
|
|
109
|
+
* the three form containers render through, so the grid and the form above it
|
|
110
|
+
* cannot disagree about which field is refused. A column that is refused
|
|
111
|
+
* replaces any `readonlyWhen` it declared — a lock on every row already covers
|
|
112
|
+
* every row a narrower lock would. Rows are untouched: whether a line may be
|
|
113
|
+
* added or removed stays the container's own answer.
|
|
114
|
+
*/
|
|
115
|
+
export declare function applyColumnPermissions<T extends Record<string, any>>(columns: T[] | undefined, { perms, objectName }: Pick<ApplyFieldPermissionsOptions, 'perms' | 'objectName'>): T[] | undefined;
|
|
116
|
+
//# sourceMappingURL=fieldWriteGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldWriteGate.d.ts","sourceRoot":"","sources":["../src/fieldWriteGate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC;CAClF;AAED,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC7C,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS,CAG5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAqCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjE,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,4BAA4B,GAC3E,CAAC,EAAE,GAAG,SAAS,CAMjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC5E;AAED,MAAM,WAAW,qBAAsB,SAAQ,4BAA4B;IACzE,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,YAAY,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7C;AAoCD,gFAAgF;AAChF,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,UAAU,EACV,IAAI,EACJ,YAAY,GACb,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,CAAC,GAC5E,oBAAoB,GACpB,SAAS,CAGZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1D,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,qBAAqB,GAClD,CAAC,EAAE,GAAG,SAAS,CAOjB;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClE,OAAO,EAAE,CAAC,EAAE,GAAG,SAAS,EACxB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,GAAG,YAAY,CAAC,GAChF,CAAC,EAAE,GAAG,SAAS,CAKjB"}
|
package/dist/flatFields.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FormField } from '@object-ui/types';
|
|
2
|
-
import { SectionFieldsContext } from './sectionFields';
|
|
2
|
+
import { SectionFieldsContext } from './sectionFields.js';
|
|
3
3
|
export interface FlatFieldsContext extends SectionFieldsContext {
|
|
4
4
|
/**
|
|
5
5
|
* The caller's explicit field whitelist, in render order. Entries are field
|
|
@@ -7,6 +7,13 @@ export interface FlatFieldsContext extends SectionFieldsContext {
|
|
|
7
7
|
* object schema declares, in schema order.
|
|
8
8
|
*/
|
|
9
9
|
fields?: Array<string | Record<string, any>>;
|
|
10
|
+
/**
|
|
11
|
+
* The authored inline members (`schema.customFields`), MERGED over the
|
|
12
|
+
* generated set exactly as `ObjectForm` merges them — override by name in
|
|
13
|
+
* place, keep the rest, append the unmatched in authored order
|
|
14
|
+
* (objectui#10073; the rule lives in `customFieldsMerge.ts`).
|
|
15
|
+
*/
|
|
16
|
+
customFields?: FormField[];
|
|
10
17
|
}
|
|
11
18
|
/**
|
|
12
19
|
* Build the runtime `FormField` list for a container rendering an object's
|
|
@@ -15,7 +22,9 @@ export interface FlatFieldsContext extends SectionFieldsContext {
|
|
|
15
22
|
* Fields the object schema does not declare are SKIPPED — the flat containers
|
|
16
23
|
* have always dropped them rather than rendering `fromObjectSchema`'s bare
|
|
17
24
|
* `input` stub, and a whitelist naming a field the object does not have is an
|
|
18
|
-
* authoring error the form should not paper over with an untyped control.
|
|
25
|
+
* authoring error the form should not paper over with an untyped control. A
|
|
26
|
+
* `customFields` member naming such a field is drawn in its place: the member
|
|
27
|
+
* is a whole definition, not an untyped stub.
|
|
19
28
|
*/
|
|
20
29
|
export declare function buildFlatFields(ctx: FlatFieldsContext): FormField[];
|
|
21
30
|
//# sourceMappingURL=flatFields.d.ts.map
|
package/dist/flatFields.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flatFields.d.ts","sourceRoot":"","sources":["../src/flatFields.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"flatFields.d.ts","sourceRoot":"","sources":["../src/flatFields.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAiD,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG3G,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,SAAS,EAAE,CA8BnE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* What the submitter is told when a DECLARED `navigateOnSuccess` produced no
|
|
10
|
+
* destination — objectui#5034 point 2.
|
|
11
|
+
*
|
|
12
|
+
* The write succeeded, so this rides on the success toast as a note rather than
|
|
13
|
+
* becoming an error or a blocking panel: turning a successful write into an
|
|
14
|
+
* error state would be a worse lie than the silence it replaces. What was
|
|
15
|
+
* missing is one fact, and only one: the navigation the author declared did not
|
|
16
|
+
* happen. Before this, the toast was byte-identical to the toast a form with no
|
|
17
|
+
* `navigateOnSuccess` at all produces, so an author who mistyped the destination
|
|
18
|
+
* — or whose record carried no usable id — saw a form that looked entirely
|
|
19
|
+
* healthy and had silently stopped honouring a key they wrote.
|
|
20
|
+
*
|
|
21
|
+
* Maintainer ruling, 2026-08-17: "A refused declared navigation is surfaced: the
|
|
22
|
+
* success toast carries a note that the declared navigation was not performed —
|
|
23
|
+
* never indistinguishable from the no-key case."
|
|
24
|
+
*
|
|
25
|
+
* The note names no REASON on purpose. `resolveSuccessNavigate` answers null for
|
|
26
|
+
* two different causes (no usable id on the written record; a destination the
|
|
27
|
+
* same-origin guard refused) and returns no discriminant, so a reason in this
|
|
28
|
+
* copy could only be re-derived by reimplementing that helper's internals at the
|
|
29
|
+
* call site — where it would drift from the helper, and would additionally bake
|
|
30
|
+
* an acceptance rule into user-visible prose, which objectui#5034 has since
|
|
31
|
+
* narrowed once already. The diagnosable detail — the template the author
|
|
32
|
+
* actually wrote — goes to `console.warn` at each call site instead.
|
|
33
|
+
*
|
|
34
|
+
* The submitter sees it (it is the toast's description), so it is pack key
|
|
35
|
+
* `form.navigateRefused` and each form renders `t('form.navigateRefused')`
|
|
36
|
+
* (objectui#11039). This constant is that key's English default, read from the
|
|
37
|
+
* table above so there is one spelling of it; `WizardForm` re-exports it,
|
|
38
|
+
* because that is where it used to live and where its tests import it from.
|
|
39
|
+
* Single-sourced so a wizard and a flat form cannot tell a submitter two
|
|
40
|
+
* different things about one refusal; a test pins that they do not.
|
|
41
|
+
*/
|
|
42
|
+
export declare const NAVIGATE_ON_SUCCESS_REFUSED_NOTE: string;
|
|
43
|
+
/**
|
|
44
|
+
* The form family's feedback chrome. Falls back to the English table above
|
|
45
|
+
* when no i18n provider is mounted, or when the mounted catalogue predates
|
|
46
|
+
* these keys (`form.errorLoading` is the probe).
|
|
47
|
+
*/
|
|
48
|
+
export declare const useFormChromeTranslation: () => {
|
|
49
|
+
t: (key: string, options?: Record<string, unknown>) => string;
|
|
50
|
+
language: string;
|
|
51
|
+
} | {
|
|
52
|
+
t: import('i18next').TFunction<string, undefined>;
|
|
53
|
+
language: string;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=formChrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formChrome.d.ts","sourceRoot":"","sources":["../src/formChrome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6EH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,gCAAgC,QAA+C,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;4BAvHpC,CAAC;;;;;CA0HD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ObjectForm } from './ObjectForm';
|
|
1
|
+
import { ObjectForm } from './ObjectForm.js';
|
|
2
2
|
export { ObjectForm };
|
|
3
|
-
export type { ObjectFormComponentProps } from './ObjectForm';
|
|
3
|
+
export type { ObjectFormComponentProps } from './ObjectForm.js';
|
|
4
4
|
/**
|
|
5
5
|
* @deprecated Use `ObjectFormComponentProps`. Renamed in objectui#4650 because
|
|
6
6
|
* `@objectstack/spec/ui` owns `ObjectFormProps` from 17.0.0, where it means the
|
|
@@ -8,28 +8,126 @@ export type { ObjectFormComponentProps } from './ObjectForm';
|
|
|
8
8
|
* props. The alias denotes the SAME type and is kept only so existing importers
|
|
9
9
|
* keep compiling.
|
|
10
10
|
*/
|
|
11
|
-
export type { ObjectFormComponentProps as ObjectFormProps } from './ObjectForm';
|
|
12
|
-
export { FormSectionContainer } from './FormSection';
|
|
13
|
-
export type { FormSectionContainerProps } from './FormSection';
|
|
14
|
-
export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, containerGridColsFor, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout';
|
|
15
|
-
export { TabbedForm } from './TabbedForm';
|
|
16
|
-
export type { TabbedFormProps, TabbedFormSchema, FormSectionConfig } from './TabbedForm';
|
|
17
|
-
export { WizardForm } from './WizardForm';
|
|
18
|
-
export type { WizardFormProps, WizardFormSchema } from './WizardForm';
|
|
19
|
-
export { SplitForm } from './SplitForm';
|
|
20
|
-
export type { SplitFormProps, SplitFormSchema } from './SplitForm';
|
|
21
|
-
export { DrawerForm } from './DrawerForm';
|
|
22
|
-
export type { DrawerFormProps, DrawerFormSchema } from './DrawerForm';
|
|
23
|
-
export { ModalForm } from './ModalForm';
|
|
24
|
-
export type { ModalFormProps, ModalFormSchema } from './ModalForm';
|
|
25
|
-
export { EmbeddableForm } from './EmbeddableForm';
|
|
26
|
-
export type { EmbeddableFormProps, EmbeddableFormConfig, EmbeddableFormTexts } from './EmbeddableForm';
|
|
27
|
-
export { FormAnalytics } from './FormAnalytics';
|
|
28
|
-
export type { FormAnalyticsProps, FormSubmissionMetric } from './FormAnalytics';
|
|
29
|
-
export { MasterDetailForm } from './MasterDetailForm';
|
|
30
|
-
export type { MasterDetailFormProps, MasterDetailFormSchema, MasterDetailDetailConfig, } from './MasterDetailForm';
|
|
31
|
-
export { LineItemsPanel } from './LineItemsPanel';
|
|
32
|
-
export type { LineItemsPanelSchema } from './LineItemsPanel';
|
|
33
|
-
export { deriveDetail, deriveColumns, deriveFormFields, findRelationshipField, resolveInlineMode } from './deriveMasterDetail';
|
|
34
|
-
export type { DerivedDetail, InlineMode } from './deriveMasterDetail';
|
|
11
|
+
export type { ObjectFormComponentProps as ObjectFormProps } from './ObjectForm.js';
|
|
12
|
+
export { FormSectionContainer } from './FormSection.js';
|
|
13
|
+
export type { FormSectionContainerProps } from './FormSection.js';
|
|
14
|
+
export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, containerGridColsFor, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout.js';
|
|
15
|
+
export { TabbedForm } from './TabbedForm.js';
|
|
16
|
+
export type { TabbedFormProps, TabbedFormSchema, FormSectionConfig } from './TabbedForm.js';
|
|
17
|
+
export { WizardForm } from './WizardForm.js';
|
|
18
|
+
export type { WizardFormProps, WizardFormSchema, WizardStepConfig } from './WizardForm.js';
|
|
19
|
+
export { SplitForm } from './SplitForm.js';
|
|
20
|
+
export type { SplitFormProps, SplitFormSchema } from './SplitForm.js';
|
|
21
|
+
export { DrawerForm } from './DrawerForm.js';
|
|
22
|
+
export type { DrawerFormProps, DrawerFormSchema } from './DrawerForm.js';
|
|
23
|
+
export { ModalForm } from './ModalForm.js';
|
|
24
|
+
export type { ModalFormProps, ModalFormSchema } from './ModalForm.js';
|
|
25
|
+
export { EmbeddableForm } from './EmbeddableForm.js';
|
|
26
|
+
export type { EmbeddableFormProps, EmbeddableFormConfig, EmbeddableFormTexts } from './EmbeddableForm.js';
|
|
27
|
+
export { FormAnalytics } from './FormAnalytics.js';
|
|
28
|
+
export type { FormAnalyticsProps, FormSubmissionMetric } from './FormAnalytics.js';
|
|
29
|
+
export { MasterDetailForm } from './MasterDetailForm.js';
|
|
30
|
+
export type { MasterDetailFormProps, MasterDetailFormSchema, MasterDetailDetailConfig, } from './MasterDetailForm.js';
|
|
31
|
+
export { LineItemsPanel } from './LineItemsPanel.js';
|
|
32
|
+
export type { LineItemsPanelSchema } from './LineItemsPanel.js';
|
|
33
|
+
export { deriveDetail, deriveColumns, deriveFormFields, findRelationshipField, resolveInlineMode } from './deriveMasterDetail.js';
|
|
34
|
+
export type { DerivedDetail, InlineMode, ChildObjectSchemaLike } from './deriveMasterDetail.js';
|
|
35
|
+
/**
|
|
36
|
+
* The CREATE-payload rule this package owns, published for the OTHER form
|
|
37
|
+
* renderer (objectui#6059).
|
|
38
|
+
*
|
|
39
|
+
* `omitServerResolvedDefaults` is a pure function over a values object and an
|
|
40
|
+
* object schema — no React, no registry, no container — and it is the
|
|
41
|
+
* COMPOSITION of two `@object-ui/core` predicates (`isRuntimeDefault` AND
|
|
42
|
+
* `isMissingForRequired`, on create only) rather than a third opinion about
|
|
43
|
+
* either. It stayed module-private through the whole #4047 / #4068 / #4069 /
|
|
44
|
+
* #4085 / #5683 / #5727 / #5883 chain, so the console's `FormPage` — the SECOND
|
|
45
|
+
* form renderer in this repo — had to spell that composition out by hand for
|
|
46
|
+
* #5883, and the next renderer would have had to as well. Neither PREDICATE was
|
|
47
|
+
* ever copied (both live in `@object-ui/core` precisely so they cannot fork),
|
|
48
|
+
* but two hand-written copies of the composition are still free to disagree
|
|
49
|
+
* about a case neither author had in mind. One importable function is not.
|
|
50
|
+
*
|
|
51
|
+
* `isRequiredInForm` travels with it because each one's docblock names the
|
|
52
|
+
* other as its half: excusing a server-owned field from `required` and then
|
|
53
|
+
* submitting the key anyway is not half a fix, it is no fix. A consumer able to
|
|
54
|
+
* reach one and not the other can build exactly that state, which is the defect
|
|
55
|
+
* #4069 and #5883 closed on the two chains separately.
|
|
56
|
+
*
|
|
57
|
+
* Deliberately NOT the rest of `schemaDefaults.ts`. `seedCreateValues`,
|
|
58
|
+
* `schemaDefaultValues`, `isSeedableDefault`, `isCreateFormMode` and
|
|
59
|
+
* `SeedContext` are adjacent, not asked for — no consumer outside this package
|
|
60
|
+
* has needed them, and every added name is published surface somebody then has
|
|
61
|
+
* to keep. `isRuntimeDefault` stays out for a stronger reason: it is
|
|
62
|
+
* `@object-ui/core`'s to publish, this module only re-exports it for its own
|
|
63
|
+
* call sites, and a second published spelling of one classifier is the very
|
|
64
|
+
* thing #4085 collapsed.
|
|
65
|
+
*/
|
|
66
|
+
export { omitServerResolvedDefaults, isRequiredInForm } from './schemaDefaults.js';
|
|
67
|
+
/**
|
|
68
|
+
* The `form.sections[].group` RESOLVER, published for the third form-section
|
|
69
|
+
* consumer (objectui#8641).
|
|
70
|
+
*
|
|
71
|
+
* `resolveSectionGroupReferences` replaces every `{ group: 'x' }` section with
|
|
72
|
+
* the section that group declares, and returns its input UNCHANGED — the same
|
|
73
|
+
* array reference — when no section uses the reference form. It is a pure
|
|
74
|
+
* function over plain data: no React, no registry, no container.
|
|
75
|
+
*
|
|
76
|
+
* ## Why it is published rather than copied
|
|
77
|
+
*
|
|
78
|
+
* `apps/console`'s `FormPage` has its OWN section builder (`buildSections`),
|
|
79
|
+
* on none of this package's code path, and it read `sec.fields ?? []` — so a
|
|
80
|
+
* spec-legal `{ group }` section produced a section with no label and no
|
|
81
|
+
* fields, measured in the DOM as an empty bordered card with zero inputs on
|
|
82
|
+
* both the internal `/forms/:name` and public `/f/:slug` routes. That is the
|
|
83
|
+
* silent-drop class objectui#7051 closed HERE, arriving at a renderer #7051's
|
|
84
|
+
* fix could not reach.
|
|
85
|
+
*
|
|
86
|
+
* The standing constraint of objectui#7051 / objectstack#13855 is that no
|
|
87
|
+
* assembly rule may be re-implemented on the objectui side — not declared
|
|
88
|
+
* order, not the empty-group drop, not the ungrouped trailing bucket, not the
|
|
89
|
+
* collapse / `visibleWhen` passthrough. Every one of those comes from
|
|
90
|
+
* `deriveFieldGroupLayout` (ADR-0085 §5) through this package's ONE adapter,
|
|
91
|
+
* `deriveFieldGroupSections`, which this resolver calls. A consumer that
|
|
92
|
+
* reached for `deriveFieldGroupLayout` directly would have to re-spell the
|
|
93
|
+
* `collapse` enum -> `{ collapsible, collapsed }` mapping and the `visibleWhen`
|
|
94
|
+
* passthrough to land on a section shape, which is that constraint's exact
|
|
95
|
+
* prohibition. So the importable resolver is the only arm that keeps one
|
|
96
|
+
* assembler and one behaviour for all three consumers.
|
|
97
|
+
*
|
|
98
|
+
* This is the same surface decision as objectui#6059's create-payload pair,
|
|
99
|
+
* for the same file, and it is deliberately as small: the resolver and the
|
|
100
|
+
* options type its signature requires (objectui#7324's rule — a consumer must
|
|
101
|
+
* be able to NAME what it passes; a type adds no runtime surface).
|
|
102
|
+
* `hasSectionGroupReference` stays module-private because the resolver already
|
|
103
|
+
* answers it by returning its input unchanged, and `resetSectionGroupReports`
|
|
104
|
+
* stays private because it is this package's own test seam.
|
|
105
|
+
*/
|
|
106
|
+
export { resolveSectionGroupReferences } from './sectionGroups.js';
|
|
107
|
+
export type { ResolveSectionGroupsOptions } from './sectionGroups.js';
|
|
108
|
+
/**
|
|
109
|
+
* The parameter types those published signatures require, so a consumer can
|
|
110
|
+
* NAME what it must pass (objectui#7324).
|
|
111
|
+
*
|
|
112
|
+
* Both were unnameable: `ChildObjectSchemaLike` is the `childSchema` of the
|
|
113
|
+
* five derive functions exported above, and `FieldDefaultsSchemaLike` is the
|
|
114
|
+
* `objectSchema` of `omitServerResolvedDefaults`. Neither reached this barrel,
|
|
115
|
+
* so a host held them in a variable it could not annotate and wrote the shape
|
|
116
|
+
* out by hand instead — a producer-owned shape copied into every consumer,
|
|
117
|
+
* which is what `declared = enforced` exists to prevent.
|
|
118
|
+
*
|
|
119
|
+
* Two names, not one. They arrived carrying the SAME name (`ObjectSchemaLike`)
|
|
120
|
+
* in two files, and they are not the same type: measured with `tsc`, the
|
|
121
|
+
* defaults one is a strict subtype of the child one, and the compiler calls
|
|
122
|
+
* them mutually assignable ONLY because the child one's field values are
|
|
123
|
+
* `any` — swap that single `any` for `unknown` and the child -> defaults
|
|
124
|
+
* direction fails (TS2322). Lifting either under the shared name would have
|
|
125
|
+
* put a name on this package's public surface that already meant something
|
|
126
|
+
* else two files over, with nothing in the name to say which.
|
|
127
|
+
*
|
|
128
|
+
* These are types, not values: they add no runtime surface, and each is the
|
|
129
|
+
* type a signature already published requires — not an adjacent name lifted
|
|
130
|
+
* because it was nearby.
|
|
131
|
+
*/
|
|
132
|
+
export type { FieldDefaultsSchemaLike } from './schemaDefaults.js';
|
|
35
133
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;;GAMG;AACH,YAAY,EAAE,wBAAwB,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;;GAMG;AACH,YAAY,EAAE,wBAAwB,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/H,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
|