@businessdash/sdk 0.9.60
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/LICENSE +21 -0
- package/README.md +899 -0
- package/dist/adapters-revalidate.d.ts +44 -0
- package/dist/adapters-revalidate.d.ts.map +1 -0
- package/dist/adapters-revalidate.js +68 -0
- package/dist/adapters-revalidate.js.map +1 -0
- package/dist/alpha.d.ts +21 -0
- package/dist/alpha.d.ts.map +1 -0
- package/dist/alpha.js +21 -0
- package/dist/alpha.js.map +1 -0
- package/dist/analytics-core.d.ts +34 -0
- package/dist/analytics-core.d.ts.map +1 -0
- package/dist/analytics-core.js +138 -0
- package/dist/analytics-core.js.map +1 -0
- package/dist/analytics-server.d.ts +54 -0
- package/dist/analytics-server.d.ts.map +1 -0
- package/dist/analytics-server.js +78 -0
- package/dist/analytics-server.js.map +1 -0
- package/dist/attribution-logo.d.ts +2 -0
- package/dist/attribution-logo.d.ts.map +1 -0
- package/dist/attribution-logo.js +5 -0
- package/dist/attribution-logo.js.map +1 -0
- package/dist/auth-handler.d.ts +92 -0
- package/dist/auth-handler.d.ts.map +1 -0
- package/dist/auth-handler.js +277 -0
- package/dist/auth-handler.js.map +1 -0
- package/dist/biab-forms.css +484 -0
- package/dist/cli.d.ts +46 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1824 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +1681 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2845 -0
- package/dist/client.js.map +1 -0
- package/dist/collections.d.ts +13 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +13 -0
- package/dist/collections.js.map +1 -0
- package/dist/contracts.d.ts +14609 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +2428 -0
- package/dist/contracts.js.map +1 -0
- package/dist/data-model-schema.d.ts +962 -0
- package/dist/data-model-schema.d.ts.map +1 -0
- package/dist/data-model-schema.js +2295 -0
- package/dist/data-model-schema.js.map +1 -0
- package/dist/distribution.d.ts +38 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +61 -0
- package/dist/distribution.js.map +1 -0
- package/dist/element.d.ts +121 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +276 -0
- package/dist/element.js.map +1 -0
- package/dist/enums.d.ts +25 -0
- package/dist/enums.d.ts.map +1 -0
- package/dist/enums.js +38 -0
- package/dist/enums.js.map +1 -0
- package/dist/errors.d.ts +195 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +188 -0
- package/dist/errors.js.map +1 -0
- package/dist/forms-core/autocomplete.d.ts +37 -0
- package/dist/forms-core/autocomplete.d.ts.map +1 -0
- package/dist/forms-core/autocomplete.js +82 -0
- package/dist/forms-core/autocomplete.js.map +1 -0
- package/dist/forms-core/business-function.d.ts +61 -0
- package/dist/forms-core/business-function.d.ts.map +1 -0
- package/dist/forms-core/business-function.js +149 -0
- package/dist/forms-core/business-function.js.map +1 -0
- package/dist/forms-core/calculation.d.ts +72 -0
- package/dist/forms-core/calculation.d.ts.map +1 -0
- package/dist/forms-core/calculation.js +103 -0
- package/dist/forms-core/calculation.js.map +1 -0
- package/dist/forms-core/controller.d.ts +249 -0
- package/dist/forms-core/controller.d.ts.map +1 -0
- package/dist/forms-core/controller.js +590 -0
- package/dist/forms-core/controller.js.map +1 -0
- package/dist/forms-core/elements.d.ts +44 -0
- package/dist/forms-core/elements.d.ts.map +1 -0
- package/dist/forms-core/elements.js +68 -0
- package/dist/forms-core/elements.js.map +1 -0
- package/dist/forms-core/email-domains.d.ts +10 -0
- package/dist/forms-core/email-domains.d.ts.map +1 -0
- package/dist/forms-core/email-domains.js +69 -0
- package/dist/forms-core/email-domains.js.map +1 -0
- package/dist/forms-core/file-rules.d.ts +51 -0
- package/dist/forms-core/file-rules.d.ts.map +1 -0
- package/dist/forms-core/file-rules.js +105 -0
- package/dist/forms-core/file-rules.js.map +1 -0
- package/dist/forms-core/formula.d.ts +114 -0
- package/dist/forms-core/formula.d.ts.map +1 -0
- package/dist/forms-core/formula.js +1170 -0
- package/dist/forms-core/formula.js.map +1 -0
- package/dist/forms-core/index.d.ts +24 -0
- package/dist/forms-core/index.d.ts.map +1 -0
- package/dist/forms-core/index.js +28 -0
- package/dist/forms-core/index.js.map +1 -0
- package/dist/forms-core/units.d.ts +49 -0
- package/dist/forms-core/units.d.ts.map +1 -0
- package/dist/forms-core/units.js +255 -0
- package/dist/forms-core/units.js.map +1 -0
- package/dist/forms-core/us-states.d.ts +14 -0
- package/dist/forms-core/us-states.d.ts.map +1 -0
- package/dist/forms-core/us-states.js +66 -0
- package/dist/forms-core/us-states.js.map +1 -0
- package/dist/forms-core/validation.d.ts +266 -0
- package/dist/forms-core/validation.d.ts.map +1 -0
- package/dist/forms-core/validation.js +850 -0
- package/dist/forms-core/validation.js.map +1 -0
- package/dist/forms.d.ts +19 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +29 -0
- package/dist/forms.js.map +1 -0
- package/dist/gallery-types.d.ts +32 -0
- package/dist/gallery-types.d.ts.map +1 -0
- package/dist/gallery-types.js +2 -0
- package/dist/gallery-types.js.map +1 -0
- package/dist/graphql.d.ts +97 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +212 -0
- package/dist/graphql.js.map +1 -0
- package/dist/index.cjs +19448 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.mts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/marketing-schema.d.ts +216 -0
- package/dist/marketing-schema.d.ts.map +1 -0
- package/dist/marketing-schema.js +200 -0
- package/dist/marketing-schema.js.map +1 -0
- package/dist/mcp.d.ts +42 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +87 -0
- package/dist/mcp.js.map +1 -0
- package/dist/native.d.ts +45 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +43 -0
- package/dist/native.js.map +1 -0
- package/dist/next-revalidate.d.ts +43 -0
- package/dist/next-revalidate.d.ts.map +1 -0
- package/dist/next-revalidate.js +84 -0
- package/dist/next-revalidate.js.map +1 -0
- package/dist/parallel-pages.d.ts +102 -0
- package/dist/parallel-pages.d.ts.map +1 -0
- package/dist/parallel-pages.js +108 -0
- package/dist/parallel-pages.js.map +1 -0
- package/dist/payment-icons.d.ts +66 -0
- package/dist/payment-icons.d.ts.map +1 -0
- package/dist/payment-icons.js +160 -0
- package/dist/payment-icons.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +97 -0
- package/dist/proxy.js.map +1 -0
- package/dist/react-analytics.d.ts +39 -0
- package/dist/react-analytics.d.ts.map +1 -0
- package/dist/react-analytics.js +59 -0
- package/dist/react-analytics.js.map +1 -0
- package/dist/react-attribution.d.ts +99 -0
- package/dist/react-attribution.d.ts.map +1 -0
- package/dist/react-attribution.js +52 -0
- package/dist/react-attribution.js.map +1 -0
- package/dist/react-marketing.d.ts +181 -0
- package/dist/react-marketing.d.ts.map +1 -0
- package/dist/react-marketing.js +215 -0
- package/dist/react-marketing.js.map +1 -0
- package/dist/react.d.ts +727 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +2418 -0
- package/dist/react.js.map +1 -0
- package/dist/reserved-paths.d.ts +24 -0
- package/dist/reserved-paths.d.ts.map +1 -0
- package/dist/reserved-paths.js +60 -0
- package/dist/reserved-paths.js.map +1 -0
- package/dist/revalidate-verify.d.ts +30 -0
- package/dist/revalidate-verify.d.ts.map +1 -0
- package/dist/revalidate-verify.js +74 -0
- package/dist/revalidate-verify.js.map +1 -0
- package/dist/sdk.d.ts +678 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +801 -0
- package/dist/sdk.js.map +1 -0
- package/dist/seo.d.ts +218 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +309 -0
- package/dist/seo.js.map +1 -0
- package/dist/socials.d.ts +47 -0
- package/dist/socials.d.ts.map +1 -0
- package/dist/socials.js +172 -0
- package/dist/socials.js.map +1 -0
- package/dist/static.d.ts +14 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +14 -0
- package/dist/static.js.map +1 -0
- package/dist/url-pattern.d.ts +47 -0
- package/dist/url-pattern.d.ts.map +1 -0
- package/dist/url-pattern.js +124 -0
- package/dist/url-pattern.js.map +1 -0
- package/dist/vanilla.d.ts +77 -0
- package/dist/vanilla.d.ts.map +1 -0
- package/dist/vanilla.js +903 -0
- package/dist/vanilla.js.map +1 -0
- package/openapi.json +13779 -0
- package/package.json +204 -0
- package/src/adapters-revalidate.ts +88 -0
- package/src/alpha.ts +89 -0
- package/src/analytics-core.ts +175 -0
- package/src/analytics-server.ts +99 -0
- package/src/angular/biab-form.component.ts +1443 -0
- package/src/angular/index.ts +26 -0
- package/src/attribution-logo.ts +5 -0
- package/src/auth-handler.ts +352 -0
- package/src/cli.ts +2517 -0
- package/src/client.ts +3578 -0
- package/src/collections.ts +101 -0
- package/src/contracts.ts +3390 -0
- package/src/data-model-schema.ts +4042 -0
- package/src/distribution.ts +73 -0
- package/src/element.ts +321 -0
- package/src/enums.ts +65 -0
- package/src/errors.ts +338 -0
- package/src/forms-core/autocomplete.ts +97 -0
- package/src/forms-core/business-function.ts +209 -0
- package/src/forms-core/calculation.ts +167 -0
- package/src/forms-core/controller.ts +922 -0
- package/src/forms-core/elements.ts +86 -0
- package/src/forms-core/email-domains.ts +68 -0
- package/src/forms-core/file-rules.ts +123 -0
- package/src/forms-core/formula.ts +1339 -0
- package/src/forms-core/index.ts +122 -0
- package/src/forms-core/units.ts +308 -0
- package/src/forms-core/us-states.ts +68 -0
- package/src/forms-core/validation.ts +1037 -0
- package/src/forms.ts +63 -0
- package/src/gallery-types.ts +31 -0
- package/src/graphql.ts +295 -0
- package/src/index.ts +505 -0
- package/src/marketing-schema.ts +395 -0
- package/src/mcp.ts +108 -0
- package/src/native.ts +73 -0
- package/src/next-revalidate.ts +124 -0
- package/src/parallel-pages.ts +192 -0
- package/src/payment-icons.ts +205 -0
- package/src/proxy.ts +173 -0
- package/src/qwik.tsx +1234 -0
- package/src/react-analytics.tsx +76 -0
- package/src/react-attribution.tsx +192 -0
- package/src/react-marketing.tsx +338 -0
- package/src/react.tsx +5495 -0
- package/src/reserved-paths.ts +65 -0
- package/src/revalidate-verify.ts +98 -0
- package/src/sdk.ts +1671 -0
- package/src/seo.ts +488 -0
- package/src/socials.ts +230 -0
- package/src/solid.tsx +1466 -0
- package/src/static.ts +21 -0
- package/src/styles/biab-forms.css +484 -0
- package/src/svelte/BiabForm.svelte +1069 -0
- package/src/svelte/context.ts +57 -0
- package/src/svelte/index.ts +79 -0
- package/src/url-pattern.ts +153 -0
- package/src/vanilla.ts +1290 -0
- package/src/vue/BiabForm.vue +1538 -0
- package/src/vue/index.ts +119 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createFormController — the framework-agnostic observable store that drives
|
|
3
|
+
* every `<BiabForm>` binding (React / Vue / Svelte / Solid / Qwik / Angular /
|
|
4
|
+
* web-component / vanilla).
|
|
5
|
+
*
|
|
6
|
+
* It owns ALL of the form's runtime state and behaviour:
|
|
7
|
+
* - working values (+ seeded defaults), condition-aware visible fields,
|
|
8
|
+
* - field-level validation errors (mirrored from the server's rules),
|
|
9
|
+
* - multi-step ("consecutive") navigation + progress,
|
|
10
|
+
* - concurrent-reveal gating inside groups,
|
|
11
|
+
* - submission lifecycle (submitting / result),
|
|
12
|
+
* - file uploads via the SDK.
|
|
13
|
+
*
|
|
14
|
+
* Bindings stay dumb: subscribe to `snapshot()`, render by field `type` using
|
|
15
|
+
* the `biab-*` class convention (light DOM, no shadow root, so consumer CSS
|
|
16
|
+
* cascades), and call `setValue` / `next` / `back` / `submit` / `uploadFile` /
|
|
17
|
+
* `reset`. The store is a tiny subscribe/notify observable — no framework
|
|
18
|
+
* reactivity primitives leak in.
|
|
19
|
+
*
|
|
20
|
+
* Data flows entirely through the SDK: it calls `client.forms.schema(slug)` to
|
|
21
|
+
* load and `client.forms.submit(slug, data, opts)` to submit, so auth, caching,
|
|
22
|
+
* revalidation, HMAC, retries, and CRM fan-out all stay invisible inside
|
|
23
|
+
* biab-dev. SSR callers can hand a pre-fetched schema instead of a client.
|
|
24
|
+
*/
|
|
25
|
+
import { functionsToEvalOptions, } from "./business-function.js";
|
|
26
|
+
import { computeCalculation } from "./calculation.js";
|
|
27
|
+
import { FORM_WIDE_MAX_FILES } from "./file-rules.js";
|
|
28
|
+
import { concurrentRevealCount, evalCondition, findMissingRequired, isNodeVisible, seedInitialData, toSubmissionPayload, } from "./validation.js";
|
|
29
|
+
export function isPendingFileValue(v) {
|
|
30
|
+
return (!!v && typeof v === "object" && v.pending === true);
|
|
31
|
+
}
|
|
32
|
+
/** Walk the field tree and collect every `file_upload` node. */
|
|
33
|
+
function collectFileFields(nodes) {
|
|
34
|
+
const out = [];
|
|
35
|
+
const walk = (ns) => {
|
|
36
|
+
for (const n of ns) {
|
|
37
|
+
if (n.type === "file_upload")
|
|
38
|
+
out.push(n);
|
|
39
|
+
const kids = n.children;
|
|
40
|
+
if (kids)
|
|
41
|
+
walk(kids);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
walk(nodes);
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `uploadFile` is optional on `BiabFormsClient`, and legitimately so: a
|
|
49
|
+
* same-origin proxy that forwards only `schema` and `submit` is a valid client,
|
|
50
|
+
* and that is exactly what the starter templates ship so the bearer key never
|
|
51
|
+
* reaches the browser. A form with a file field needs more than that.
|
|
52
|
+
*
|
|
53
|
+
* Resolving it here turns the failure into one sentence naming the cause, at
|
|
54
|
+
* the moment of upload. Previously the controller called it unguarded — under
|
|
55
|
+
* the old typing that was invisible, and a proxy client hit
|
|
56
|
+
* `client.forms.uploadFile is not a function` from inside a submit handler.
|
|
57
|
+
*/
|
|
58
|
+
function requireUploadFile(client) {
|
|
59
|
+
const upload = client.forms.uploadFile;
|
|
60
|
+
if (!upload) {
|
|
61
|
+
throw new Error("createFormController: this form has a file field, but the configured client does not implement `forms.uploadFile`.");
|
|
62
|
+
}
|
|
63
|
+
return upload.bind(client.forms);
|
|
64
|
+
}
|
|
65
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
66
|
+
// Implementation
|
|
67
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
68
|
+
const DEFAULT_SETTINGS = {
|
|
69
|
+
animation: "none",
|
|
70
|
+
isConsecutive: false,
|
|
71
|
+
showProgress: false,
|
|
72
|
+
progressStyle: "steps",
|
|
73
|
+
};
|
|
74
|
+
function resolveSettings(settings) {
|
|
75
|
+
return {
|
|
76
|
+
animation: settings?.animation ?? DEFAULT_SETTINGS.animation,
|
|
77
|
+
isConsecutive: settings?.isConsecutive ?? DEFAULT_SETTINGS.isConsecutive,
|
|
78
|
+
showProgress: settings?.showProgress ?? DEFAULT_SETTINGS.showProgress,
|
|
79
|
+
progressStyle: settings?.progressStyle ?? DEFAULT_SETTINGS.progressStyle,
|
|
80
|
+
...(settings?.exitConfirm ? { exitConfirm: settings.exitConfirm } : {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Compute the step partition. Single-page → one step of all fields; consecutive
|
|
85
|
+
* → each top-level node is its own step (mirrors FormPreview's `steps`).
|
|
86
|
+
*
|
|
87
|
+
* A page whose `conditionRule` is currently false is DROPPED rather than left
|
|
88
|
+
* empty, so "Next" skips straight past it and the progress indicator loses its
|
|
89
|
+
* entry. Every renderer reads `stepCount` / `steps` from here, so this one
|
|
90
|
+
* change gives React, Svelte, Vue, Angular, Solid, Qwik and vanilla the same
|
|
91
|
+
* behaviour as the dashboard.
|
|
92
|
+
*/
|
|
93
|
+
function computeSteps(fields, isConsecutive, data) {
|
|
94
|
+
if (!isConsecutive)
|
|
95
|
+
return [fields];
|
|
96
|
+
return fields.filter((f) => isNodeVisible(f, data)).map((f) => [f]);
|
|
97
|
+
}
|
|
98
|
+
export function createFormController(options) {
|
|
99
|
+
if (!options.client && !options.schema) {
|
|
100
|
+
throw new Error("createFormController: provide a `client` (with `slug`) or a pre-fetched `schema`.");
|
|
101
|
+
}
|
|
102
|
+
if (options.client && !options.slug && !options.schema?.slug) {
|
|
103
|
+
throw new Error("createFormController: `slug` is required when loading via `client`.");
|
|
104
|
+
}
|
|
105
|
+
const client = options.client;
|
|
106
|
+
const slug = options.slug ?? options.schema?.slug ?? "";
|
|
107
|
+
// ── Mutable internal state (never exposed directly) ──────────────────────
|
|
108
|
+
let status = "idle";
|
|
109
|
+
let loadError = null;
|
|
110
|
+
let schema = options.schema ?? null;
|
|
111
|
+
let fields = [];
|
|
112
|
+
let settings = DEFAULT_SETTINGS;
|
|
113
|
+
let values = {};
|
|
114
|
+
let errors = {};
|
|
115
|
+
let step = 0;
|
|
116
|
+
let forward = true;
|
|
117
|
+
let submitting = false;
|
|
118
|
+
let uploadingCount = 0;
|
|
119
|
+
let result = null;
|
|
120
|
+
let destroyed = false;
|
|
121
|
+
let cachedSnapshot = null;
|
|
122
|
+
const subscribers = new Set();
|
|
123
|
+
// `calculation` field support: derived once per schema adopt.
|
|
124
|
+
let calcFields = [];
|
|
125
|
+
let calcFunctionsById = {};
|
|
126
|
+
let calcEvalOptions = {};
|
|
127
|
+
/** Walk the field tree and collect every `calculation` node. */
|
|
128
|
+
function collectCalcFields(nodes) {
|
|
129
|
+
const out = [];
|
|
130
|
+
const walk = (ns) => {
|
|
131
|
+
for (const n of ns) {
|
|
132
|
+
if (n.type === "calculation")
|
|
133
|
+
out.push(n);
|
|
134
|
+
const kids = n.children;
|
|
135
|
+
if (kids)
|
|
136
|
+
walk(kids);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
walk(nodes);
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
/** Recompute every `calculation` field into `vals`. Non-sensitive only — a
|
|
143
|
+
* sensitive function has no published def, so it resolves to null here and
|
|
144
|
+
* the server computes the authoritative value on submit. Idempotent. */
|
|
145
|
+
function applyCalcs(vals) {
|
|
146
|
+
if (calcFields.length === 0)
|
|
147
|
+
return vals;
|
|
148
|
+
let changed = false;
|
|
149
|
+
const next = { ...vals };
|
|
150
|
+
for (const f of calcFields) {
|
|
151
|
+
const cfg = f
|
|
152
|
+
.calculationConfig;
|
|
153
|
+
if (!cfg)
|
|
154
|
+
continue;
|
|
155
|
+
const r = computeCalculation(cfg, (id) => next[id], {
|
|
156
|
+
functionsById: calcFunctionsById,
|
|
157
|
+
evalOptions: calcEvalOptions,
|
|
158
|
+
});
|
|
159
|
+
const val = r.ok ? r.value : null;
|
|
160
|
+
if (JSON.stringify(next[f.id] ?? null) !== JSON.stringify(val ?? null)) {
|
|
161
|
+
next[f.id] = val;
|
|
162
|
+
changed = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return changed ? next : vals;
|
|
166
|
+
}
|
|
167
|
+
// ── Snapshot building ────────────────────────────────────────────────────
|
|
168
|
+
function buildSnapshot() {
|
|
169
|
+
const steps = computeSteps(fields, settings.isConsecutive, values);
|
|
170
|
+
const stepCount = Math.max(steps.length, 1);
|
|
171
|
+
const safeStep = Math.min(Math.max(step, 0), stepCount - 1);
|
|
172
|
+
const visibleFields = settings.isConsecutive
|
|
173
|
+
? (steps[safeStep] ?? [])
|
|
174
|
+
: fields;
|
|
175
|
+
const stepFields = steps[safeStep] ?? [];
|
|
176
|
+
const canAdvance = findMissingRequired(stepFields, values).length === 0;
|
|
177
|
+
const canSubmit = findMissingRequired(fields, values).length === 0;
|
|
178
|
+
const errorList = Object.values(errors);
|
|
179
|
+
const progress = stepCount > 0 ? (safeStep + 1) / stepCount : 0;
|
|
180
|
+
return {
|
|
181
|
+
status,
|
|
182
|
+
loadError,
|
|
183
|
+
schema,
|
|
184
|
+
fieldDefs: (schema?.fields ?? []),
|
|
185
|
+
fields,
|
|
186
|
+
settings,
|
|
187
|
+
orgIcon: schema?.orgIcon ?? null,
|
|
188
|
+
title: schema?.title ?? null,
|
|
189
|
+
description: schema?.description ?? null,
|
|
190
|
+
values,
|
|
191
|
+
errors,
|
|
192
|
+
errorList,
|
|
193
|
+
steps,
|
|
194
|
+
step: safeStep,
|
|
195
|
+
stepCount,
|
|
196
|
+
isFirstStep: safeStep === 0,
|
|
197
|
+
isLastStep: safeStep === stepCount - 1,
|
|
198
|
+
visibleFields,
|
|
199
|
+
progress,
|
|
200
|
+
progressPercent: Math.round(progress * 100),
|
|
201
|
+
canAdvance,
|
|
202
|
+
canSubmit,
|
|
203
|
+
forward,
|
|
204
|
+
submitting,
|
|
205
|
+
uploading: uploadingCount > 0,
|
|
206
|
+
result,
|
|
207
|
+
submitted: result?.ok === true,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function notify() {
|
|
211
|
+
if (destroyed)
|
|
212
|
+
return;
|
|
213
|
+
cachedSnapshot = buildSnapshot();
|
|
214
|
+
for (const cb of subscribers)
|
|
215
|
+
cb(cachedSnapshot);
|
|
216
|
+
}
|
|
217
|
+
function snapshot() {
|
|
218
|
+
if (!cachedSnapshot)
|
|
219
|
+
cachedSnapshot = buildSnapshot();
|
|
220
|
+
return cachedSnapshot;
|
|
221
|
+
}
|
|
222
|
+
// ── Error helpers ────────────────────────────────────────────────────────
|
|
223
|
+
function setErrorsFromMissing(missing) {
|
|
224
|
+
const next = {};
|
|
225
|
+
for (const m of missing) {
|
|
226
|
+
next[m.id] = {
|
|
227
|
+
id: m.id,
|
|
228
|
+
label: m.label,
|
|
229
|
+
message: `${m.label} is required.`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
errors = next;
|
|
233
|
+
}
|
|
234
|
+
// ── Field tree extraction ────────────────────────────────────────────────
|
|
235
|
+
function adoptSchema(loaded) {
|
|
236
|
+
schema = loaded;
|
|
237
|
+
// The published schema's `fields` carries the full nested tree (layout
|
|
238
|
+
// nodes, condition_block, or_condition, children, output `key`).
|
|
239
|
+
fields = (loaded.fields ?? []);
|
|
240
|
+
settings = resolveSettings(loaded.settings);
|
|
241
|
+
// Build the calculation context from the schema's (non-sensitive) functions.
|
|
242
|
+
calcFields = collectCalcFields(fields);
|
|
243
|
+
calcFunctionsById = {};
|
|
244
|
+
const bySlug = {};
|
|
245
|
+
for (const fn of loaded.businessFunctions ?? []) {
|
|
246
|
+
const def = {
|
|
247
|
+
slug: fn.slug,
|
|
248
|
+
inputs: fn.inputs,
|
|
249
|
+
outputs: fn.outputs,
|
|
250
|
+
};
|
|
251
|
+
calcFunctionsById[fn.id] = def;
|
|
252
|
+
bySlug[fn.slug.toUpperCase()] = def;
|
|
253
|
+
}
|
|
254
|
+
calcEvalOptions = functionsToEvalOptions(bySlug);
|
|
255
|
+
values = applyCalcs(seedInitialData(fields));
|
|
256
|
+
errors = {};
|
|
257
|
+
step = 0;
|
|
258
|
+
forward = true;
|
|
259
|
+
result = null;
|
|
260
|
+
status = "ready";
|
|
261
|
+
loadError = null;
|
|
262
|
+
}
|
|
263
|
+
// ── Public methods ─────────────────────────────────────────────────────
|
|
264
|
+
async function load() {
|
|
265
|
+
// Revive on (re)load. `load()` is idempotent and "safe to call again",
|
|
266
|
+
// and React StrictMode runs effects mount → cleanup → mount: the cleanup
|
|
267
|
+
// calls `destroy()` (sets `destroyed = true`), so the remount's `load()`
|
|
268
|
+
// must reset the flag or it would bail here and the form would hang on
|
|
269
|
+
// "loading" forever — even after the schema fetch returns 200. A genuine
|
|
270
|
+
// unmount never calls `load()` again, so reviving here is safe.
|
|
271
|
+
destroyed = false;
|
|
272
|
+
// Pre-fetched schema path: adopt synchronously.
|
|
273
|
+
if (options.schema && status === "idle") {
|
|
274
|
+
adoptSchema(options.schema);
|
|
275
|
+
notify();
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (!client) {
|
|
279
|
+
// No client and no (further) schema — nothing to load.
|
|
280
|
+
if (schema && status !== "ready") {
|
|
281
|
+
adoptSchema(schema);
|
|
282
|
+
notify();
|
|
283
|
+
}
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
status = "loading";
|
|
287
|
+
loadError = null;
|
|
288
|
+
notify();
|
|
289
|
+
try {
|
|
290
|
+
const loaded = await client.forms.schema(slug);
|
|
291
|
+
if (destroyed)
|
|
292
|
+
return;
|
|
293
|
+
adoptSchema(loaded);
|
|
294
|
+
notify();
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
if (destroyed)
|
|
298
|
+
return;
|
|
299
|
+
status = "error";
|
|
300
|
+
loadError =
|
|
301
|
+
err instanceof Error ? err.message : "Failed to load the form schema.";
|
|
302
|
+
notify();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function subscribe(callback) {
|
|
306
|
+
subscribers.add(callback);
|
|
307
|
+
return () => {
|
|
308
|
+
subscribers.delete(callback);
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function setValue(id, value) {
|
|
312
|
+
// Recompute calc fields after the change so derived values stay live and
|
|
313
|
+
// flow into the submission + downstream conditions.
|
|
314
|
+
values = applyCalcs({ ...values, [id]: value });
|
|
315
|
+
if (errors[id]) {
|
|
316
|
+
const { [id]: _removed, ...rest } = errors;
|
|
317
|
+
errors = rest;
|
|
318
|
+
}
|
|
319
|
+
notify();
|
|
320
|
+
}
|
|
321
|
+
function validate() {
|
|
322
|
+
const missing = findMissingRequired(fields, values);
|
|
323
|
+
setErrorsFromMissing(missing);
|
|
324
|
+
notify();
|
|
325
|
+
return missing;
|
|
326
|
+
}
|
|
327
|
+
function next() {
|
|
328
|
+
const steps = computeSteps(fields, settings.isConsecutive, values);
|
|
329
|
+
const stepCount = Math.max(steps.length, 1);
|
|
330
|
+
const safeStep = Math.min(Math.max(step, 0), stepCount - 1);
|
|
331
|
+
if (safeStep >= stepCount - 1)
|
|
332
|
+
return;
|
|
333
|
+
const stepFields = steps[safeStep] ?? [];
|
|
334
|
+
const missing = findMissingRequired(stepFields, values);
|
|
335
|
+
if (missing.length > 0) {
|
|
336
|
+
setErrorsFromMissing(missing);
|
|
337
|
+
notify();
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
errors = {};
|
|
341
|
+
forward = true;
|
|
342
|
+
step = safeStep + 1;
|
|
343
|
+
notify();
|
|
344
|
+
}
|
|
345
|
+
function back() {
|
|
346
|
+
const safeStep = Math.max(step, 0);
|
|
347
|
+
if (safeStep <= 0)
|
|
348
|
+
return;
|
|
349
|
+
forward = false;
|
|
350
|
+
step = safeStep - 1;
|
|
351
|
+
errors = {};
|
|
352
|
+
notify();
|
|
353
|
+
}
|
|
354
|
+
function goToStep(index) {
|
|
355
|
+
const steps = computeSteps(fields, settings.isConsecutive, values);
|
|
356
|
+
const stepCount = Math.max(steps.length, 1);
|
|
357
|
+
const target = Math.min(Math.max(index, 0), stepCount - 1);
|
|
358
|
+
forward = target >= step;
|
|
359
|
+
step = target;
|
|
360
|
+
notify();
|
|
361
|
+
}
|
|
362
|
+
async function submit(callOptions) {
|
|
363
|
+
// Validate the WHOLE form (not just the visible step).
|
|
364
|
+
const missing = findMissingRequired(fields, values);
|
|
365
|
+
if (missing.length > 0) {
|
|
366
|
+
setErrorsFromMissing(missing);
|
|
367
|
+
const failure = {
|
|
368
|
+
ok: false,
|
|
369
|
+
status: 0,
|
|
370
|
+
reason: "client_validation_failed",
|
|
371
|
+
message: `Please complete the required field${missing.length === 1 ? "" : "s"}: ${missing.map((m) => m.label).join(", ")}`,
|
|
372
|
+
issues: missing.map((m) => ({
|
|
373
|
+
fieldId: m.id,
|
|
374
|
+
label: m.label,
|
|
375
|
+
reason: "required",
|
|
376
|
+
message: `${m.label} is required.`,
|
|
377
|
+
})),
|
|
378
|
+
};
|
|
379
|
+
result = failure;
|
|
380
|
+
notify();
|
|
381
|
+
options.onError?.(failure);
|
|
382
|
+
return failure;
|
|
383
|
+
}
|
|
384
|
+
if (!client) {
|
|
385
|
+
const failure = {
|
|
386
|
+
ok: false,
|
|
387
|
+
status: 0,
|
|
388
|
+
reason: "network_error",
|
|
389
|
+
message: "createFormController: a `client` is required to submit. Pass one in options.",
|
|
390
|
+
};
|
|
391
|
+
result = failure;
|
|
392
|
+
notify();
|
|
393
|
+
options.onError?.(failure);
|
|
394
|
+
return failure;
|
|
395
|
+
}
|
|
396
|
+
// Form-wide file cap — at most FORM_WIDE_MAX_FILES across all file fields.
|
|
397
|
+
const fileFields = collectFileFields(fields);
|
|
398
|
+
const totalFiles = fileFields.reduce((n, f) => n +
|
|
399
|
+
(Array.isArray(values[f.id]) ? values[f.id].length : 0), 0);
|
|
400
|
+
if (totalFiles > FORM_WIDE_MAX_FILES) {
|
|
401
|
+
const over = fileFields.filter((f) => Array.isArray(values[f.id]) && values[f.id].length > 0);
|
|
402
|
+
const issues = over.map((f) => ({
|
|
403
|
+
fieldId: f.id,
|
|
404
|
+
label: f.label ?? "Files",
|
|
405
|
+
reason: "max",
|
|
406
|
+
message: `At most ${FORM_WIDE_MAX_FILES} files total.`,
|
|
407
|
+
}));
|
|
408
|
+
setErrorsFromMissing(over.map((f) => ({ id: f.id, label: f.label ?? "Files" })));
|
|
409
|
+
const failure = {
|
|
410
|
+
ok: false,
|
|
411
|
+
status: 0,
|
|
412
|
+
reason: "client_validation_failed",
|
|
413
|
+
message: `Please attach at most ${FORM_WIDE_MAX_FILES} files in total.`,
|
|
414
|
+
issues,
|
|
415
|
+
};
|
|
416
|
+
result = failure;
|
|
417
|
+
notify();
|
|
418
|
+
options.onError?.(failure);
|
|
419
|
+
return failure;
|
|
420
|
+
}
|
|
421
|
+
errors = {};
|
|
422
|
+
submitting = true;
|
|
423
|
+
notify();
|
|
424
|
+
// Flush DEFERRED uploads: every buffered PendingFileValue is uploaded now
|
|
425
|
+
// and replaced by its FormFileValue. A failed upload aborts the submit and
|
|
426
|
+
// surfaces as a field error rather than silently dropping the file.
|
|
427
|
+
const uploadIssues = [];
|
|
428
|
+
for (const f of fileFields) {
|
|
429
|
+
const arr = Array.isArray(values[f.id])
|
|
430
|
+
? values[f.id]
|
|
431
|
+
: [];
|
|
432
|
+
const pending = arr.filter(isPendingFileValue);
|
|
433
|
+
if (pending.length === 0)
|
|
434
|
+
continue;
|
|
435
|
+
const done = arr.filter((e) => !isPendingFileValue(e));
|
|
436
|
+
for (const p of pending) {
|
|
437
|
+
try {
|
|
438
|
+
uploadingCount += 1;
|
|
439
|
+
notify();
|
|
440
|
+
done.push(await requireUploadFile(client)(slug, f.id, p.file, {
|
|
441
|
+
filename: p.name,
|
|
442
|
+
}));
|
|
443
|
+
}
|
|
444
|
+
catch (err) {
|
|
445
|
+
uploadIssues.push({
|
|
446
|
+
fieldId: f.id,
|
|
447
|
+
label: f.label ?? "Files",
|
|
448
|
+
reason: "type",
|
|
449
|
+
message: err instanceof Error
|
|
450
|
+
? err.message
|
|
451
|
+
: `Couldn't upload a file for ${f.label}.`,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
finally {
|
|
455
|
+
uploadingCount = Math.max(uploadingCount - 1, 0);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
values = { ...values, [f.id]: done };
|
|
459
|
+
}
|
|
460
|
+
if (uploadIssues.length > 0) {
|
|
461
|
+
submitting = false;
|
|
462
|
+
const next = {};
|
|
463
|
+
for (const issue of uploadIssues) {
|
|
464
|
+
if (issue.fieldId) {
|
|
465
|
+
next[issue.fieldId] = {
|
|
466
|
+
id: issue.fieldId,
|
|
467
|
+
label: issue.label,
|
|
468
|
+
message: issue.message,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
errors = next;
|
|
473
|
+
const failure = {
|
|
474
|
+
ok: false,
|
|
475
|
+
status: 0,
|
|
476
|
+
reason: "network_error",
|
|
477
|
+
message: "Some files couldn't be uploaded — please retry.",
|
|
478
|
+
issues: uploadIssues,
|
|
479
|
+
};
|
|
480
|
+
result = failure;
|
|
481
|
+
notify();
|
|
482
|
+
options.onError?.(failure);
|
|
483
|
+
return failure;
|
|
484
|
+
}
|
|
485
|
+
// Re-key by the published output key for the wire contract (server also
|
|
486
|
+
// accepts the legacy `id`).
|
|
487
|
+
const payload = toSubmissionPayload(fields, values);
|
|
488
|
+
const merged = {
|
|
489
|
+
...options.submitOptions,
|
|
490
|
+
...callOptions,
|
|
491
|
+
};
|
|
492
|
+
let res;
|
|
493
|
+
try {
|
|
494
|
+
res = await client.forms.submit(slug, payload, merged);
|
|
495
|
+
}
|
|
496
|
+
catch (err) {
|
|
497
|
+
// `forms.submit` is designed never to throw for an expected failure;
|
|
498
|
+
// this guards against an unexpected transport error.
|
|
499
|
+
res = {
|
|
500
|
+
ok: false,
|
|
501
|
+
status: 0,
|
|
502
|
+
reason: "network_error",
|
|
503
|
+
message: err instanceof Error ? err.message : "The submission failed.",
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
if (destroyed)
|
|
507
|
+
return res;
|
|
508
|
+
submitting = false;
|
|
509
|
+
result = res;
|
|
510
|
+
// Surface server-side field issues back onto `errors` for inline display.
|
|
511
|
+
if (!res.ok && res.issues && res.issues.length > 0) {
|
|
512
|
+
const next = {};
|
|
513
|
+
for (const issue of res.issues) {
|
|
514
|
+
if (!issue.fieldId)
|
|
515
|
+
continue;
|
|
516
|
+
next[issue.fieldId] = {
|
|
517
|
+
id: issue.fieldId,
|
|
518
|
+
label: issue.label,
|
|
519
|
+
message: issue.message,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
errors = next;
|
|
523
|
+
}
|
|
524
|
+
notify();
|
|
525
|
+
if (res.ok)
|
|
526
|
+
options.onSuccess?.(res);
|
|
527
|
+
else
|
|
528
|
+
options.onError?.(res);
|
|
529
|
+
return res;
|
|
530
|
+
}
|
|
531
|
+
async function uploadFile(fieldId, file, opts) {
|
|
532
|
+
if (!client) {
|
|
533
|
+
throw new Error("createFormController: a `client` is required to upload files.");
|
|
534
|
+
}
|
|
535
|
+
uploadingCount += 1;
|
|
536
|
+
notify();
|
|
537
|
+
try {
|
|
538
|
+
const uploaded = await requireUploadFile(client)(slug, fieldId, file, opts);
|
|
539
|
+
if (destroyed)
|
|
540
|
+
return uploaded;
|
|
541
|
+
const existing = Array.isArray(values[fieldId])
|
|
542
|
+
? values[fieldId]
|
|
543
|
+
: [];
|
|
544
|
+
values = { ...values, [fieldId]: [...existing, uploaded] };
|
|
545
|
+
if (errors[fieldId]) {
|
|
546
|
+
const { [fieldId]: _removed, ...rest } = errors;
|
|
547
|
+
errors = rest;
|
|
548
|
+
}
|
|
549
|
+
return uploaded;
|
|
550
|
+
}
|
|
551
|
+
finally {
|
|
552
|
+
uploadingCount = Math.max(uploadingCount - 1, 0);
|
|
553
|
+
if (!destroyed)
|
|
554
|
+
notify();
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
function reset() {
|
|
558
|
+
values = seedInitialData(fields);
|
|
559
|
+
errors = {};
|
|
560
|
+
step = 0;
|
|
561
|
+
forward = true;
|
|
562
|
+
result = null;
|
|
563
|
+
submitting = false;
|
|
564
|
+
notify();
|
|
565
|
+
}
|
|
566
|
+
function destroy() {
|
|
567
|
+
destroyed = true;
|
|
568
|
+
subscribers.clear();
|
|
569
|
+
}
|
|
570
|
+
// Seed an initial snapshot so `snapshot()` is valid pre-load.
|
|
571
|
+
cachedSnapshot = buildSnapshot();
|
|
572
|
+
return {
|
|
573
|
+
load,
|
|
574
|
+
snapshot,
|
|
575
|
+
subscribe,
|
|
576
|
+
setValue,
|
|
577
|
+
next,
|
|
578
|
+
back,
|
|
579
|
+
goToStep,
|
|
580
|
+
submit,
|
|
581
|
+
uploadFile,
|
|
582
|
+
validate,
|
|
583
|
+
reset,
|
|
584
|
+
destroy,
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
// Re-export the condition primitives bindings commonly need when they render
|
|
588
|
+
// the tree themselves (e.g. deciding whether to show a condition_block child).
|
|
589
|
+
export { concurrentRevealCount, evalCondition, findMissingRequired, isNodeVisible, seedInitialData, };
|
|
590
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/forms-core/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small, framework-free helpers the bindings share when rendering elements.
|
|
3
|
+
*
|
|
4
|
+
* Anything here would otherwise be copy-pasted into React, Svelte, Vue, Angular,
|
|
5
|
+
* Solid, Qwik and vanilla — and then drift. The dashboard renderer keeps its own
|
|
6
|
+
* copy of the threshold only because it can't import from the SDK; the values
|
|
7
|
+
* are deliberately identical.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Past this many options a dropdown grows a search affordance on its own.
|
|
11
|
+
* Scrolling a long list to find one entry is the worse default, and an author
|
|
12
|
+
* shouldn't have to notice their list got long. Mirrors `SEARCHABLE_THRESHOLD`
|
|
13
|
+
* in the dashboard builder's `constants.tsx`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const SEARCHABLE_THRESHOLD = 10;
|
|
16
|
+
/** Should this dropdown offer search? Either the author asked for it (the
|
|
17
|
+
* ComboBox card sets `display: "combobox"`) or the list is long enough. */
|
|
18
|
+
export declare function shouldSearchOptions(optionCount: number, display?: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Where BIAB serves icon art.
|
|
21
|
+
*
|
|
22
|
+
* The `icon_select` element stores an icon NAME, and rendering it back needs the
|
|
23
|
+
* icon set. The SDK deliberately doesn't bundle one: it's ~1,600 icons, and
|
|
24
|
+
* three of the bindings can't import a React package anyway. Names resolve to
|
|
25
|
+
* `<img src="…/api/icons/<name>.svg">`, so the platform stays the single source
|
|
26
|
+
* of truth for what a name means.
|
|
27
|
+
*
|
|
28
|
+
* Override with `NEXT_PUBLIC_BIAB_ORIGIN` when pointing a consumer app at a
|
|
29
|
+
* non-production BIAB.
|
|
30
|
+
*/
|
|
31
|
+
export declare const BIAB_ICON_BASE: string;
|
|
32
|
+
/** SVG URL for one icon name. */
|
|
33
|
+
export declare function iconUrl(name: string): string;
|
|
34
|
+
/** The lazily-fetched icon-name index (only needed when an author hasn't
|
|
35
|
+
* curated `iconConfig.allowedIcons`). */
|
|
36
|
+
export declare const ICON_INDEX_URL: string;
|
|
37
|
+
/** Narrow an icon list by a search query, capped so the grid never mounts
|
|
38
|
+
* thousands of nodes at once. */
|
|
39
|
+
export declare function filterIconNames(names: readonly string[], query: string, limit?: number): string[];
|
|
40
|
+
/** Fetch the icon-name index. Resolves to `[]` on any failure — a missing index
|
|
41
|
+
* leaves the picker's grid empty, which is recoverable; throwing here would
|
|
42
|
+
* take the whole form down. */
|
|
43
|
+
export declare function fetchIconNames(): Promise<string[]>;
|
|
44
|
+
//# sourceMappingURL=elements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../../src/forms-core/elements.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;4EAC4E;AAC5E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,EAAE,MAUzB,CAAC;AAEL,iCAAiC;AACjC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;0CAC0C;AAC1C,eAAO,MAAM,cAAc,QAAgC,CAAC;AAE5D;kCACkC;AAClC,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,SAAM,GACT,MAAM,EAAE,CAMV;AAED;;gCAEgC;AAChC,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CASxD"}
|