@ankhorage/studio 0.13.0 → 0.14.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/README.md +9 -1
- package/dist/bindingAuthoringContracts.d.ts +37 -0
- package/dist/bindingAuthoringContracts.d.ts.map +1 -0
- package/dist/bindingAuthoringContracts.js +2 -0
- package/dist/bindingAuthoringContracts.js.map +1 -0
- package/dist/bindingAuthoringModel.d.ts +7 -0
- package/dist/bindingAuthoringModel.d.ts.map +1 -0
- package/dist/bindingAuthoringModel.js +7 -0
- package/dist/bindingAuthoringModel.js.map +1 -0
- package/dist/bindingDiagnosticsModel.d.ts +10 -0
- package/dist/bindingDiagnosticsModel.d.ts.map +1 -0
- package/dist/bindingDiagnosticsModel.js +116 -0
- package/dist/bindingDiagnosticsModel.js.map +1 -0
- package/dist/bindingMetadataModel.d.ts +5 -0
- package/dist/bindingMetadataModel.d.ts.map +1 -0
- package/dist/bindingMetadataModel.js +17 -0
- package/dist/bindingMetadataModel.js.map +1 -0
- package/dist/bindingMutationModel.d.ts +6 -0
- package/dist/bindingMutationModel.d.ts.map +1 -0
- package/dist/bindingMutationModel.js +55 -0
- package/dist/bindingMutationModel.js.map +1 -0
- package/dist/bindingOperationModel.d.ts +10 -0
- package/dist/bindingOperationModel.d.ts.map +1 -0
- package/dist/bindingOperationModel.js +69 -0
- package/dist/bindingOperationModel.js.map +1 -0
- package/dist/bindingSchemaModel.d.ts +6 -0
- package/dist/bindingSchemaModel.d.ts.map +1 -0
- package/dist/bindingSchemaModel.js +95 -0
- package/dist/bindingSchemaModel.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/studioAdminRouteModel.d.ts +4 -1
- package/dist/studioAdminRouteModel.d.ts.map +1 -1
- package/dist/studioAdminRouteModel.js +46 -16
- package/dist/studioAdminRouteModel.js.map +1 -1
- package/dist/ui/admin/AnkhAdminPage.d.ts.map +1 -1
- package/dist/ui/admin/AnkhAdminPage.js +3 -1
- package/dist/ui/admin/AnkhAdminPage.js.map +1 -1
- package/dist/ui/admin/pages/BindingsAdminPage.d.ts +5 -0
- package/dist/ui/admin/pages/BindingsAdminPage.d.ts.map +1 -0
- package/dist/ui/admin/pages/BindingsAdminPage.js +38 -0
- package/dist/ui/admin/pages/BindingsAdminPage.js.map +1 -0
- package/dist/ui/admin/pages/bindings/BindingDiagnosticsCard.d.ts +5 -0
- package/dist/ui/admin/pages/bindings/BindingDiagnosticsCard.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/BindingDiagnosticsCard.js +8 -0
- package/dist/ui/admin/pages/bindings/BindingDiagnosticsCard.js.map +1 -0
- package/dist/ui/admin/pages/bindings/EventBindingComposer.d.ts +8 -0
- package/dist/ui/admin/pages/bindings/EventBindingComposer.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/EventBindingComposer.js +60 -0
- package/dist/ui/admin/pages/bindings/EventBindingComposer.js.map +1 -0
- package/dist/ui/admin/pages/bindings/EventBindingsCard.d.ts +9 -0
- package/dist/ui/admin/pages/bindings/EventBindingsCard.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/EventBindingsCard.js +27 -0
- package/dist/ui/admin/pages/bindings/EventBindingsCard.js.map +1 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingEditor.d.ts +10 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingEditor.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingEditor.js +61 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingEditor.js.map +1 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingsCard.d.ts +9 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingsCard.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingsCard.js +13 -0
- package/dist/ui/admin/pages/bindings/PropertyBindingsCard.js.map +1 -0
- package/dist/ui/admin/pages/bindings/bindingAdminStyles.d.ts +28 -0
- package/dist/ui/admin/pages/bindings/bindingAdminStyles.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/bindingAdminStyles.js +29 -0
- package/dist/ui/admin/pages/bindings/bindingAdminStyles.js.map +1 -0
- package/dist/ui/admin/pages/bindings/bindingEditorModel.d.ts +30 -0
- package/dist/ui/admin/pages/bindings/bindingEditorModel.d.ts.map +1 -0
- package/dist/ui/admin/pages/bindings/bindingEditorModel.js +107 -0
- package/dist/ui/admin/pages/bindings/bindingEditorModel.js.map +1 -0
- package/dist/ui/studioAppBarModel.d.ts +1 -1
- package/dist/ui/studioAppBarModel.d.ts.map +1 -1
- package/dist/ui/studioAppBarModel.js +4 -1
- package/dist/ui/studioAppBarModel.js.map +1 -1
- package/dist/ui/useStudioAppBarAugmentation.d.ts.map +1 -1
- package/dist/ui/useStudioAppBarAugmentation.js +16 -7
- package/dist/ui/useStudioAppBarAugmentation.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
# @ankhorage/studio
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Standalone Studio authoring package for Ankhorage apps.
|
|
9
9
|
|
|
@@ -30,12 +30,20 @@ Manage Studio development and projects through the Ankh CLI.
|
|
|
30
30
|
- [Module relationships](././paradox/diagrams/module-relationships.mmd)
|
|
31
31
|
- [Export graph](././paradox/diagrams/export-graph.mmd)
|
|
32
32
|
- [addNodeToTree sequence](././paradox/diagrams/sequences/add-node-to-tree.mmd)
|
|
33
|
+
- [appendStudioEventBinding sequence](././paradox/diagrams/sequences/append-studio-event-binding.mmd)
|
|
34
|
+
- [assessStudioBindingCompatibility sequence](././paradox/diagrams/sequences/assess-studio-binding-compatibility.mmd)
|
|
33
35
|
- [buildInsertCatalogEntries sequence](././paradox/diagrams/sequences/build-insert-catalog-entries.mmd)
|
|
34
36
|
- [cloneWithNewIds sequence](././paradox/diagrams/sequences/clone-with-new-ids.mmd)
|
|
37
|
+
- [collectStudioResponsePaths sequence](././paradox/diagrams/sequences/collect-studio-response-paths.mmd)
|
|
35
38
|
- [createNodeFromCatalogEntry sequence](././paradox/diagrams/sequences/create-node-from-catalog-entry.mmd)
|
|
39
|
+
- [diagnoseStudioComponentBindings sequence](././paradox/diagrams/sequences/diagnose-studio-component-bindings.mmd)
|
|
36
40
|
- [findNodeById sequence](././paradox/diagrams/sequences/find-node-by-id.mmd)
|
|
41
|
+
- [removeStudioEventBinding sequence](././paradox/diagrams/sequences/remove-studio-event-binding.mmd)
|
|
42
|
+
- [removeStudioPropBinding sequence](././paradox/diagrams/sequences/remove-studio-prop-binding.mmd)
|
|
37
43
|
- [resolveStudioInstancePropertyGroups sequence](././paradox/diagrams/sequences/resolve-studio-instance-property-groups.mmd)
|
|
44
|
+
- [resolveStudioSchemaValueMeta sequence](././paradox/diagrams/sequences/resolve-studio-schema-value-meta.mmd)
|
|
38
45
|
- [updateNodeInTree sequence](././paradox/diagrams/sequences/update-node-in-tree.mmd)
|
|
46
|
+
- [upsertStudioPropBinding sequence](././paradox/diagrams/sequences/upsert-studio-prop-binding.mmd)
|
|
39
47
|
- [validateInsertRecipe sequence](././paradox/diagrams/sequences/validate-insert-recipe.mmd)
|
|
40
48
|
- [validateNodePlacement sequence](././paradox/diagrams/sequences/validate-node-placement.mmd)
|
|
41
49
|
- [validateProjectCreationInput sequence](././paradox/diagrams/sequences/validate-project-creation-input.mmd)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BindingOperationRef, UiBindableEventMeta, UiBindablePropMeta, UiBindableValueMeta } from '@ankhorage/contracts';
|
|
2
|
+
export type StudioBindingCompatibility = 'compatible' | 'incompatible' | 'unknown';
|
|
3
|
+
export interface StudioBindablePropOption {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly meta: UiBindablePropMeta;
|
|
7
|
+
}
|
|
8
|
+
export interface StudioBindableEventOption {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly label: string;
|
|
11
|
+
readonly meta: UiBindableEventMeta;
|
|
12
|
+
}
|
|
13
|
+
export interface StudioBindingInputFieldOption {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
readonly value: UiBindableValueMeta;
|
|
17
|
+
readonly required: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface StudioBindingResponsePathOption {
|
|
20
|
+
readonly path: string;
|
|
21
|
+
readonly label: string;
|
|
22
|
+
readonly value: UiBindableValueMeta;
|
|
23
|
+
}
|
|
24
|
+
export interface StudioBindingOperationOption {
|
|
25
|
+
readonly operation: BindingOperationRef;
|
|
26
|
+
readonly label: string;
|
|
27
|
+
readonly sourceLabel: string;
|
|
28
|
+
readonly inputFields: readonly StudioBindingInputFieldOption[];
|
|
29
|
+
readonly responsePaths: readonly StudioBindingResponsePathOption[];
|
|
30
|
+
}
|
|
31
|
+
export interface StudioBindingDiagnostic {
|
|
32
|
+
readonly code: 'incompatible-input' | 'incompatible-response' | 'missing-action' | 'missing-binding-meta' | 'missing-input' | 'missing-operation' | 'missing-response-path' | 'unknown-event' | 'unknown-prop';
|
|
33
|
+
readonly message: string;
|
|
34
|
+
readonly severity: 'error' | 'warning';
|
|
35
|
+
readonly path?: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=bindingAuthoringContracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingAuthoringContracts.d.ts","sourceRoot":"","sources":["../src/bindingAuthoringContracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,0BAA0B,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,SAAS,+BAA+B,EAAE,CAAC;CACpE;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EACT,oBAAoB,GACpB,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,GACtB,eAAe,GACf,mBAAmB,GACnB,uBAAuB,GACvB,eAAe,GACf,cAAc,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingAuthoringContracts.js","sourceRoot":"","sources":["../src/bindingAuthoringContracts.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './bindingAuthoringContracts';
|
|
2
|
+
export * from './bindingDiagnosticsModel';
|
|
3
|
+
export * from './bindingMetadataModel';
|
|
4
|
+
export * from './bindingMutationModel';
|
|
5
|
+
export * from './bindingOperationModel';
|
|
6
|
+
export * from './bindingSchemaModel';
|
|
7
|
+
//# sourceMappingURL=bindingAuthoringModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingAuthoringModel.d.ts","sourceRoot":"","sources":["../src/bindingAuthoringModel.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './bindingAuthoringContracts';
|
|
2
|
+
export * from './bindingDiagnosticsModel';
|
|
3
|
+
export * from './bindingMetadataModel';
|
|
4
|
+
export * from './bindingMutationModel';
|
|
5
|
+
export * from './bindingOperationModel';
|
|
6
|
+
export * from './bindingSchemaModel';
|
|
7
|
+
//# sourceMappingURL=bindingAuthoringModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingAuthoringModel.js","sourceRoot":"","sources":["../src/bindingAuthoringModel.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentDataBindingRegistry, UiComponentMetaRegistry, UiNode } from '@ankhorage/contracts';
|
|
2
|
+
import type { StudioBindingDiagnostic, StudioBindingOperationOption } from './bindingAuthoringContracts';
|
|
3
|
+
export declare function diagnoseStudioComponentBindings(args: {
|
|
4
|
+
readonly node: UiNode;
|
|
5
|
+
readonly registry: ComponentDataBindingRegistry;
|
|
6
|
+
readonly componentMeta: UiComponentMetaRegistry;
|
|
7
|
+
readonly operations: readonly StudioBindingOperationOption[];
|
|
8
|
+
readonly actionTypes: readonly string[];
|
|
9
|
+
}): readonly StudioBindingDiagnostic[];
|
|
10
|
+
//# sourceMappingURL=bindingDiagnosticsModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingDiagnosticsModel.d.ts","sourceRoot":"","sources":["../src/bindingDiagnosticsModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,4BAA4B,EAI5B,uBAAuB,EACvB,MAAM,EACP,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,uBAAuB,EAEvB,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAIrC,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAC7D,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,GAAG,SAAS,uBAAuB,EAAE,CAkBrC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { findStudioBindingOperationOption } from './bindingOperationModel';
|
|
2
|
+
import { assessStudioBindingCompatibility } from './bindingSchemaModel';
|
|
3
|
+
export function diagnoseStudioComponentBindings(args) {
|
|
4
|
+
const binding = args.registry[args.node.id];
|
|
5
|
+
if (!binding)
|
|
6
|
+
return [];
|
|
7
|
+
const meta = args.componentMeta[args.node.type]?.bindings;
|
|
8
|
+
if (!meta) {
|
|
9
|
+
return [
|
|
10
|
+
diagnostic('missing-binding-meta', 'This component exposes no canonical binding metadata.'),
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
return [
|
|
14
|
+
...Object.entries(binding.props ?? {}).flatMap(([name, prop]) => diagnosePropBinding(name, prop, args)),
|
|
15
|
+
...Object.entries(binding.events ?? {}).flatMap(([name, events]) => events.flatMap((event, index) => diagnoseEventBinding(name, index, event, args))),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
function diagnosePropBinding(name, binding, args) {
|
|
19
|
+
const propMeta = args.componentMeta[args.node.type]?.bindings?.props?.[name];
|
|
20
|
+
if (!propMeta) {
|
|
21
|
+
return [diagnostic('unknown-prop', `Property '${name}' is not bindable.`, `props.${name}`)];
|
|
22
|
+
}
|
|
23
|
+
if (binding.source.kind !== 'operation')
|
|
24
|
+
return [];
|
|
25
|
+
const operation = findStudioBindingOperationOption(args.operations, binding.source.operation);
|
|
26
|
+
if (!operation) {
|
|
27
|
+
return [missingOperationDiagnostic(binding.source.operation, `props.${name}`)];
|
|
28
|
+
}
|
|
29
|
+
const path = binding.source.path ?? '';
|
|
30
|
+
const response = operation.responsePaths.find((candidate) => candidate.path === path);
|
|
31
|
+
if (!response) {
|
|
32
|
+
return [
|
|
33
|
+
diagnostic('missing-response-path', `Response path '${path || '<response>'}' is unavailable.`, `props.${name}`),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
const compatibility = assessStudioBindingCompatibility(propMeta.value, response.value);
|
|
37
|
+
return compatibility === 'incompatible'
|
|
38
|
+
? [
|
|
39
|
+
diagnostic('incompatible-response', `Response '${response.label}' is incompatible with ${propMeta.value.type}.`, `props.${name}`),
|
|
40
|
+
]
|
|
41
|
+
: [];
|
|
42
|
+
}
|
|
43
|
+
function diagnoseEventBinding(eventName, index, binding, args) {
|
|
44
|
+
const eventMeta = args.componentMeta[args.node.type]?.bindings?.events?.[eventName];
|
|
45
|
+
const path = `events.${eventName}.${index}`;
|
|
46
|
+
if (!eventMeta) {
|
|
47
|
+
return [diagnostic('unknown-event', `Event '${eventName}' is not bindable.`, path)];
|
|
48
|
+
}
|
|
49
|
+
if (binding.target.kind === 'action') {
|
|
50
|
+
return args.actionTypes.includes(binding.target.type)
|
|
51
|
+
? []
|
|
52
|
+
: [diagnostic('missing-action', `Action '${binding.target.type}' is unavailable.`, path)];
|
|
53
|
+
}
|
|
54
|
+
const operation = findStudioBindingOperationOption(args.operations, binding.target.operation);
|
|
55
|
+
if (!operation) {
|
|
56
|
+
return [missingOperationDiagnostic(binding.target.operation, path)];
|
|
57
|
+
}
|
|
58
|
+
return diagnoseEventInputs(binding, operation.inputFields, eventMeta.payload?.fields ?? [], path);
|
|
59
|
+
}
|
|
60
|
+
function diagnoseEventInputs(binding, fields, eventFields, path) {
|
|
61
|
+
return fields.flatMap((field) => {
|
|
62
|
+
const input = binding.input?.[field.name];
|
|
63
|
+
if (!input) {
|
|
64
|
+
return field.required
|
|
65
|
+
? [
|
|
66
|
+
diagnostic('missing-input', `Required input '${field.name}' is not mapped.`, `${path}.input.${field.name}`),
|
|
67
|
+
]
|
|
68
|
+
: [];
|
|
69
|
+
}
|
|
70
|
+
return diagnoseInputCompatibility(input, field, eventFields, `${path}.input.${field.name}`);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function diagnoseInputCompatibility(input, field, eventFields, path) {
|
|
74
|
+
if (input.kind !== 'source' || input.source.kind !== 'event')
|
|
75
|
+
return [];
|
|
76
|
+
const eventValue = resolveEventSourceValue(input.source.path, eventFields);
|
|
77
|
+
if (!eventValue) {
|
|
78
|
+
return [
|
|
79
|
+
diagnostic('incompatible-input', `Event path '${input.source.path}' is unavailable.`, path),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
const compatibility = assessStudioBindingCompatibility(field.value, eventValue);
|
|
83
|
+
return compatibility === 'incompatible'
|
|
84
|
+
? [
|
|
85
|
+
diagnostic('incompatible-input', `Event path '${input.source.path}' is incompatible with ${field.value.type}.`, path),
|
|
86
|
+
]
|
|
87
|
+
: [];
|
|
88
|
+
}
|
|
89
|
+
function resolveEventSourceValue(path, eventFields) {
|
|
90
|
+
const exact = eventFields.find((candidate) => candidate.path === path);
|
|
91
|
+
if (exact)
|
|
92
|
+
return { type: toBindableType(exact.type) };
|
|
93
|
+
const parent = eventFields.find((candidate) => path.startsWith(`${candidate.path}.`) &&
|
|
94
|
+
(candidate.type === 'object' || candidate.type === 'record' || candidate.type === 'unknown'));
|
|
95
|
+
return parent ? { type: 'unknown' } : undefined;
|
|
96
|
+
}
|
|
97
|
+
function missingOperationDiagnostic(operation, path) {
|
|
98
|
+
const ref = [operation.dataSourceId, operation.endpointId, operation.operationId]
|
|
99
|
+
.filter((part) => part !== undefined)
|
|
100
|
+
.join(' · ');
|
|
101
|
+
return diagnostic('missing-operation', `Operation '${ref}' is unavailable.`, path);
|
|
102
|
+
}
|
|
103
|
+
function toBindableType(type) {
|
|
104
|
+
if (type === 'string' ||
|
|
105
|
+
type === 'number' ||
|
|
106
|
+
type === 'boolean' ||
|
|
107
|
+
type === 'object' ||
|
|
108
|
+
type === 'record') {
|
|
109
|
+
return type;
|
|
110
|
+
}
|
|
111
|
+
return 'unknown';
|
|
112
|
+
}
|
|
113
|
+
function diagnostic(code, message, path) {
|
|
114
|
+
return { code, message, severity: 'error', ...(path ? { path } : {}) };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=bindingDiagnosticsModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingDiagnosticsModel.js","sourceRoot":"","sources":["../src/bindingDiagnosticsModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UiComponentMetaRegistry, UiNode } from '@ankhorage/contracts';
|
|
2
|
+
import type { StudioBindableEventOption, StudioBindablePropOption } from './bindingAuthoringContracts';
|
|
3
|
+
export declare function resolveStudioBindableProps(node: UiNode, registry: UiComponentMetaRegistry): readonly StudioBindablePropOption[];
|
|
4
|
+
export declare function resolveStudioBindableEvents(node: UiNode, registry: UiComponentMetaRegistry): readonly StudioBindableEventOption[];
|
|
5
|
+
//# sourceMappingURL=bindingMetadataModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingMetadataModel.d.ts","sourceRoot":"","sources":["../src/bindingMetadataModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AAErC,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,uBAAuB,GAChC,SAAS,wBAAwB,EAAE,CAQrC;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,uBAAuB,GAChC,SAAS,yBAAyB,EAAE,CAQtC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function resolveStudioBindableProps(node, registry) {
|
|
2
|
+
const props = registry[node.type]?.bindings?.props ?? {};
|
|
3
|
+
return Object.entries(props).map(([name, meta]) => ({
|
|
4
|
+
name,
|
|
5
|
+
label: meta.label ?? name,
|
|
6
|
+
meta,
|
|
7
|
+
}));
|
|
8
|
+
}
|
|
9
|
+
export function resolveStudioBindableEvents(node, registry) {
|
|
10
|
+
const events = registry[node.type]?.bindings?.events ?? {};
|
|
11
|
+
return Object.entries(events).map(([name, meta]) => ({
|
|
12
|
+
name,
|
|
13
|
+
label: meta.label ?? name,
|
|
14
|
+
meta,
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=bindingMetadataModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingMetadataModel.js","sourceRoot":"","sources":["../src/bindingMetadataModel.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,QAAiC;IAEjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;IAEzD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,IAAI;KACL,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,QAAiC;IAEjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;IAE3D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,IAAI;KACL,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ComponentDataBindingRegistry, EventBinding, PropBinding, UiNode } from '@ankhorage/contracts';
|
|
2
|
+
export declare function upsertStudioPropBinding(registry: ComponentDataBindingRegistry, node: UiNode, propName: string, binding: PropBinding): ComponentDataBindingRegistry;
|
|
3
|
+
export declare function removeStudioPropBinding(registry: ComponentDataBindingRegistry, node: UiNode, propName: string): ComponentDataBindingRegistry;
|
|
4
|
+
export declare function appendStudioEventBinding(registry: ComponentDataBindingRegistry, node: UiNode, eventName: string, binding: EventBinding): ComponentDataBindingRegistry;
|
|
5
|
+
export declare function removeStudioEventBinding(registry: ComponentDataBindingRegistry, node: UiNode, eventName: string, bindingIndex: number): ComponentDataBindingRegistry;
|
|
6
|
+
//# sourceMappingURL=bindingMutationModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingMutationModel.d.ts","sourceRoot":"","sources":["../src/bindingMutationModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,MAAM,EACP,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,4BAA4B,EACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,4BAA4B,CAM9B;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,4BAA4B,EACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,4BAA4B,CAM9B;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,4BAA4B,EACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,GACpB,4BAA4B,CAS9B;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,4BAA4B,EACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,4BAA4B,CAS9B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function upsertStudioPropBinding(registry, node, propName, binding) {
|
|
2
|
+
const current = registry[node.id];
|
|
3
|
+
return writeBinding(registry, node, {
|
|
4
|
+
...current,
|
|
5
|
+
props: { ...(current?.props ?? {}), [propName]: binding },
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function removeStudioPropBinding(registry, node, propName) {
|
|
9
|
+
const current = registry[node.id];
|
|
10
|
+
if (!current?.props?.[propName])
|
|
11
|
+
return registry;
|
|
12
|
+
const props = { ...current.props };
|
|
13
|
+
delete props[propName];
|
|
14
|
+
return writeBinding(registry, node, { ...current, props });
|
|
15
|
+
}
|
|
16
|
+
export function appendStudioEventBinding(registry, node, eventName, binding) {
|
|
17
|
+
const current = registry[node.id];
|
|
18
|
+
return writeBinding(registry, node, {
|
|
19
|
+
...current,
|
|
20
|
+
events: {
|
|
21
|
+
...(current?.events ?? {}),
|
|
22
|
+
[eventName]: [...(current?.events?.[eventName] ?? []), binding],
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function removeStudioEventBinding(registry, node, eventName, bindingIndex) {
|
|
27
|
+
const current = registry[node.id];
|
|
28
|
+
const bindings = current?.events?.[eventName];
|
|
29
|
+
if (!current || !bindings?.[bindingIndex])
|
|
30
|
+
return registry;
|
|
31
|
+
const events = { ...(current.events ?? {}) };
|
|
32
|
+
const next = bindings.filter((_, index) => index !== bindingIndex);
|
|
33
|
+
if (next.length > 0)
|
|
34
|
+
events[eventName] = next;
|
|
35
|
+
else
|
|
36
|
+
delete events[eventName];
|
|
37
|
+
return writeBinding(registry, node, { ...current, events });
|
|
38
|
+
}
|
|
39
|
+
function writeBinding(registry, node, value) {
|
|
40
|
+
const next = { ...registry };
|
|
41
|
+
const binding = {
|
|
42
|
+
...value,
|
|
43
|
+
componentId: node.id,
|
|
44
|
+
componentType: node.type,
|
|
45
|
+
};
|
|
46
|
+
if (isEmptyBinding(binding))
|
|
47
|
+
delete next[node.id];
|
|
48
|
+
else
|
|
49
|
+
next[node.id] = binding;
|
|
50
|
+
return next;
|
|
51
|
+
}
|
|
52
|
+
function isEmptyBinding(binding) {
|
|
53
|
+
return (Object.keys(binding.props ?? {}).length === 0 && Object.keys(binding.events ?? {}).length === 0);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=bindingMutationModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingMutationModel.js","sourceRoot":"","sources":["../src/bindingMutationModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BindingOperationRef, DataSourceRegistry } from '@ankhorage/contracts';
|
|
2
|
+
import type { StudioBindingInputFieldOption, StudioBindingOperationOption } from './bindingAuthoringContracts';
|
|
3
|
+
export declare function collectStudioBindingOperationOptions(dataSources: DataSourceRegistry): readonly StudioBindingOperationOption[];
|
|
4
|
+
export declare function findStudioBindingOperationOption(options: readonly StudioBindingOperationOption[], ref: BindingOperationRef): StudioBindingOperationOption | undefined;
|
|
5
|
+
export declare function createStudioActionInputFields(payloadSchema: Readonly<Record<string, {
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly type: string;
|
|
8
|
+
readonly required?: boolean;
|
|
9
|
+
}>> | undefined): readonly StudioBindingInputFieldOption[];
|
|
10
|
+
//# sourceMappingURL=bindingOperationModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingOperationModel.d.ts","sourceRoot":"","sources":["../src/bindingOperationModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAInB,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAGrC,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,kBAAkB,GAC9B,SAAS,4BAA4B,EAAE,CAIzC;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,SAAS,4BAA4B,EAAE,EAChD,GAAG,EAAE,mBAAmB,GACvB,4BAA4B,GAAG,SAAS,CAO1C;AA6DD,wBAAgB,6BAA6B,CAC3C,aAAa,EACT,QAAQ,CACN,MAAM,CACJ,MAAM,EACN;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAC/E,CACF,GACD,SAAS,GACZ,SAAS,6BAA6B,EAAE,CAO1C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { collectStudioResponsePaths, resolveStudioSchemaValueMeta } from './bindingSchemaModel';
|
|
2
|
+
export function collectStudioBindingOperationOptions(dataSources) {
|
|
3
|
+
return Object.values(dataSources)
|
|
4
|
+
.flatMap((source) => collectSourceOperations(source))
|
|
5
|
+
.sort((left, right) => left.label.localeCompare(right.label));
|
|
6
|
+
}
|
|
7
|
+
export function findStudioBindingOperationOption(options, ref) {
|
|
8
|
+
return options.find((option) => option.operation.dataSourceId === ref.dataSourceId &&
|
|
9
|
+
option.operation.operationId === ref.operationId &&
|
|
10
|
+
option.operation.endpointId === ref.endpointId);
|
|
11
|
+
}
|
|
12
|
+
function collectSourceOperations(source) {
|
|
13
|
+
return Object.values(source.endpoints).flatMap((endpoint) => Object.values(endpoint.operations).map((operation) => ({
|
|
14
|
+
operation: {
|
|
15
|
+
dataSourceId: source.id,
|
|
16
|
+
endpointId: endpoint.id,
|
|
17
|
+
operationId: operation.id,
|
|
18
|
+
},
|
|
19
|
+
label: `${source.name ?? source.id} · ${operation.name ?? operation.id}`,
|
|
20
|
+
sourceLabel: describeSource(source),
|
|
21
|
+
inputFields: collectOperationInputFields(source, operation),
|
|
22
|
+
responsePaths: collectStudioResponsePaths(resolveSlotSchema(source, operation.response), source.schemas),
|
|
23
|
+
})));
|
|
24
|
+
}
|
|
25
|
+
function collectOperationInputFields(source, operation) {
|
|
26
|
+
const fields = new Map();
|
|
27
|
+
for (const parameter of operation.request?.parameters ?? []) {
|
|
28
|
+
fields.set(parameter.name, {
|
|
29
|
+
name: parameter.name,
|
|
30
|
+
label: parameter.description ?? parameter.name,
|
|
31
|
+
value: resolveStudioSchemaValueMeta(resolveSlotSchema(source, parameter), source.schemas),
|
|
32
|
+
required: parameter.required ?? false,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const requestSchema = resolveSlotSchema(source, operation.request);
|
|
36
|
+
for (const [name, schema] of Object.entries(requestSchema?.properties ?? {})) {
|
|
37
|
+
if (fields.has(name))
|
|
38
|
+
continue;
|
|
39
|
+
fields.set(name, {
|
|
40
|
+
name,
|
|
41
|
+
label: schema.title ?? name,
|
|
42
|
+
value: resolveStudioSchemaValueMeta(schema, source.schemas),
|
|
43
|
+
required: requestSchema?.required?.includes(name) ?? false,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return [...fields.values()];
|
|
47
|
+
}
|
|
48
|
+
function resolveSlotSchema(source, slot) {
|
|
49
|
+
return slot?.schema ?? (slot?.schemaRef ? source.schemas?.[slot.schemaRef.id] : undefined);
|
|
50
|
+
}
|
|
51
|
+
function describeSource(source) {
|
|
52
|
+
if (source.kind === 'database')
|
|
53
|
+
return `${source.id} · database`;
|
|
54
|
+
return `${source.id} · ${source.origin} · ${source.protocol}`;
|
|
55
|
+
}
|
|
56
|
+
export function createStudioActionInputFields(payloadSchema) {
|
|
57
|
+
return Object.entries(payloadSchema ?? {}).map(([name, field]) => ({
|
|
58
|
+
name,
|
|
59
|
+
label: field.label,
|
|
60
|
+
value: { type: toBindableType(field.type) },
|
|
61
|
+
required: field.required ?? false,
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
function toBindableType(type) {
|
|
65
|
+
if (type === 'string' || type === 'number' || type === 'boolean' || type === 'object')
|
|
66
|
+
return type;
|
|
67
|
+
return 'unknown';
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=bindingOperationModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingOperationModel.js","sourceRoot":"","sources":["../src/bindingOperationModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DataSchema, DataSchemaRegistry, UiBindableValueMeta } from '@ankhorage/contracts';
|
|
2
|
+
import type { StudioBindingCompatibility, StudioBindingResponsePathOption } from './bindingAuthoringContracts';
|
|
3
|
+
export declare function resolveStudioSchemaValueMeta(schema: DataSchema | undefined, schemas: DataSchemaRegistry | undefined, seen?: ReadonlySet<string>): UiBindableValueMeta;
|
|
4
|
+
export declare function collectStudioResponsePaths(schema: DataSchema | undefined, schemas: DataSchemaRegistry | undefined): readonly StudioBindingResponsePathOption[];
|
|
5
|
+
export declare function assessStudioBindingCompatibility(expected: UiBindableValueMeta, actual: UiBindableValueMeta): StudioBindingCompatibility;
|
|
6
|
+
//# sourceMappingURL=bindingSchemaModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingSchemaModel.d.ts","sourceRoot":"","sources":["../src/bindingSchemaModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAEV,kBAAkB,EAElB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,0BAA0B,EAC1B,+BAA+B,EAChC,MAAM,6BAA6B,CAAC;AAErC,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,IAAI,GAAE,WAAW,CAAC,MAAM,CAAa,GACpC,mBAAmB,CAarB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,SAAS,+BAA+B,EAAE,CAK5C;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,mBAAmB,GAC1B,0BAA0B,CAU5B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export function resolveStudioSchemaValueMeta(schema, schemas, seen = new Set()) {
|
|
2
|
+
const resolved = resolveSchemaRef(schema, schemas, seen);
|
|
3
|
+
if (!resolved)
|
|
4
|
+
return { type: 'unknown' };
|
|
5
|
+
const type = resolveSchemaType(resolved);
|
|
6
|
+
const fields = resolveSchemaFields(resolved, schemas, seen);
|
|
7
|
+
const itemType = type === 'array' ? resolveStudioSchemaValueMeta(resolved.items, schemas, seen).type : undefined;
|
|
8
|
+
return {
|
|
9
|
+
type,
|
|
10
|
+
...(fields.length > 0 ? { fields } : {}),
|
|
11
|
+
...(itemType ? { itemType } : {}),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function collectStudioResponsePaths(schema, schemas) {
|
|
15
|
+
const root = resolveStudioSchemaValueMeta(schema, schemas);
|
|
16
|
+
const paths = [{ path: '', label: 'Response', value: root }];
|
|
17
|
+
collectObjectPaths(schema, schemas, '', paths, new Set());
|
|
18
|
+
return paths;
|
|
19
|
+
}
|
|
20
|
+
export function assessStudioBindingCompatibility(expected, actual) {
|
|
21
|
+
if (expected.type === 'unknown' || actual.type === 'unknown')
|
|
22
|
+
return 'unknown';
|
|
23
|
+
if (expected.type === actual.type) {
|
|
24
|
+
if (expected.type !== 'array')
|
|
25
|
+
return 'compatible';
|
|
26
|
+
if (!expected.itemType || !actual.itemType)
|
|
27
|
+
return 'unknown';
|
|
28
|
+
return expected.itemType === actual.itemType ? 'compatible' : 'incompatible';
|
|
29
|
+
}
|
|
30
|
+
if (isObjectLike(expected.type) && isObjectLike(actual.type))
|
|
31
|
+
return 'compatible';
|
|
32
|
+
if (expected.type === 'imageAsset' && isImageAssetShape(actual))
|
|
33
|
+
return 'compatible';
|
|
34
|
+
return 'incompatible';
|
|
35
|
+
}
|
|
36
|
+
function collectObjectPaths(schema, schemas, prefix, paths, seen) {
|
|
37
|
+
const resolved = resolveSchemaRef(schema, schemas, seen);
|
|
38
|
+
if (!resolved?.properties)
|
|
39
|
+
return;
|
|
40
|
+
for (const [name, property] of Object.entries(resolved.properties)) {
|
|
41
|
+
const path = prefix ? `${prefix}.${name}` : name;
|
|
42
|
+
paths.push({
|
|
43
|
+
path,
|
|
44
|
+
label: path,
|
|
45
|
+
value: resolveStudioSchemaValueMeta(property, schemas, seen),
|
|
46
|
+
});
|
|
47
|
+
collectObjectPaths(property, schemas, path, paths, new Set(seen));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function resolveSchemaRef(schema, schemas, seen) {
|
|
51
|
+
const refId = schema?.ref?.id;
|
|
52
|
+
if (!refId || !schemas?.[refId] || seen.has(refId))
|
|
53
|
+
return schema;
|
|
54
|
+
return resolveSchemaRef(schemas[refId], schemas, new Set([...seen, refId]));
|
|
55
|
+
}
|
|
56
|
+
function resolveSchemaFields(schema, schemas, seen) {
|
|
57
|
+
return Object.entries(schema.properties ?? {}).map(([path, property]) => ({
|
|
58
|
+
path,
|
|
59
|
+
type: resolveStudioSchemaValueMeta(property, schemas, seen).type,
|
|
60
|
+
required: schema.required?.includes(path) ?? false,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
function resolveSchemaType(schema) {
|
|
64
|
+
if (schema.format === 'date' || schema.format === 'date-time')
|
|
65
|
+
return 'date';
|
|
66
|
+
const rawType = resolveSingleSchemaType(schema.type);
|
|
67
|
+
if (rawType === 'integer')
|
|
68
|
+
return 'number';
|
|
69
|
+
if (rawType === 'object')
|
|
70
|
+
return schema.additionalProperties ? 'record' : 'object';
|
|
71
|
+
if (rawType === 'array' ||
|
|
72
|
+
rawType === 'boolean' ||
|
|
73
|
+
rawType === 'number' ||
|
|
74
|
+
rawType === 'string') {
|
|
75
|
+
return rawType;
|
|
76
|
+
}
|
|
77
|
+
if (!rawType && schema.properties)
|
|
78
|
+
return 'object';
|
|
79
|
+
if (!rawType && schema.items)
|
|
80
|
+
return 'array';
|
|
81
|
+
return 'unknown';
|
|
82
|
+
}
|
|
83
|
+
function resolveSingleSchemaType(type) {
|
|
84
|
+
if (typeof type === 'string')
|
|
85
|
+
return type;
|
|
86
|
+
return type?.length === 1 ? type[0] : undefined;
|
|
87
|
+
}
|
|
88
|
+
function isObjectLike(type) {
|
|
89
|
+
return type === 'object' || type === 'record';
|
|
90
|
+
}
|
|
91
|
+
function isImageAssetShape(value) {
|
|
92
|
+
return (isObjectLike(value.type) &&
|
|
93
|
+
value.fields?.some((field) => field.path === 'uri' && field.type === 'string') === true);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=bindingSchemaModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingSchemaModel.js","sourceRoot":"","sources":["../src/bindingSchemaModel.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ActionType, AppManifest, AuthOAuthProviderConfig, ComponentDataBindingRegistry, DataSourceDiagnostic, DataSourceRegistry, GeneratedApiDefinition, NavigatorType, RouteDefinition, ThemeConfig, ThemeModeConfig, UiNode } from '@ankhorage/contracts';
|
|
2
2
|
import type { StudioAuthSettings, StudioAuthSettingsMutation } from './authSettings';
|
|
3
|
+
export * from './bindingAuthoringModel';
|
|
3
4
|
export type { ProjectAuthDiagnostic, ProjectAuthDiagnosticSeverity, ProjectAuthHealth, ProjectAuthHealthStatus, ProjectOAuthProviderHealth, ProjectOAuthProviderHealthStatus, } from './projectAuthHealth';
|
|
4
5
|
export { deriveProjectId, ProjectCreationValidationError, validateProjectCreationInput, } from './projectIdentity';
|
|
5
6
|
export type { ProjectSecretUsage, ProjectSecretUsageCategory, ProjectSecretUsageSummary, } from './projectSecretUsage';
|
|
@@ -13,7 +14,7 @@ export interface StudioPackageBoundary {
|
|
|
13
14
|
readonly doesNotOwn: readonly string[];
|
|
14
15
|
}
|
|
15
16
|
export declare const STUDIO_PACKAGE_BOUNDARY: StudioPackageBoundary;
|
|
16
|
-
export declare const STUDIO_PUBLIC_CONTRACTS: readonly ["StudioManifest", "StudioContextValue", "StudioSelectionState", "NodePlacement", "InsertCatalogEntry", "ActionDefinition", "StudioCommand", "StudioEvent", "StudioComponentMetaRegistry", "StudioInstancePropertyField", "resolveStudioInstancePropertyGroups", "createStudioInstancePropertyPatch", "ProjectAuthHealth", "ProjectSecretUsageSummary", "StudioAdminRouteId", "StudioAdminRoutePath", "ACTION_REGISTRY", "TPL_SCREEN_EMPTY", "resolveDefaultInsertPlacement", "buildInsertCatalogEntries"];
|
|
17
|
+
export declare const STUDIO_PUBLIC_CONTRACTS: readonly ["StudioManifest", "StudioContextValue", "StudioSelectionState", "NodePlacement", "InsertCatalogEntry", "ActionDefinition", "StudioCommand", "StudioEvent", "StudioComponentMetaRegistry", "StudioInstancePropertyField", "resolveStudioInstancePropertyGroups", "createStudioInstancePropertyPatch", "resolveStudioBindableProps", "resolveStudioBindableEvents", "collectStudioBindingOperationOptions", "ProjectAuthHealth", "ProjectSecretUsageSummary", "StudioAdminRouteId", "StudioAdminRoutePath", "ACTION_REGISTRY", "TPL_SCREEN_EMPTY", "resolveDefaultInsertPlacement", "buildInsertCatalogEntries"];
|
|
17
18
|
export type StudioPublicContract = (typeof STUDIO_PUBLIC_CONTRACTS)[number];
|
|
18
19
|
export type StudioProjectId = string;
|
|
19
20
|
export type StudioSessionId = string;
|
|
@@ -24,9 +25,9 @@ export type StudioLocale = string;
|
|
|
24
25
|
export type StudioMode = 'light' | 'dark';
|
|
25
26
|
export type StudioSaveStatus = 'idle' | 'saving' | 'saved' | 'error';
|
|
26
27
|
export type StudioPanelId = 'layers' | 'modules' | 'localization';
|
|
27
|
-
export type StudioAdminRouteId = 'overview' | 'apis' | 'api-data-sources' | 'api-operations' | 'auth' | 'auth-providers' | 'auth-routes' | 'auth-profile' | 'secrets' | 'theme' | 'properties';
|
|
28
|
+
export type StudioAdminRouteId = 'overview' | 'apis' | 'api-data-sources' | 'api-operations' | 'auth' | 'auth-providers' | 'auth-routes' | 'auth-profile' | 'secrets' | 'theme' | 'bindings' | 'properties';
|
|
28
29
|
export type StudioAdminStaticRoutePath = '/ankh' | '/ankh/apis' | '/ankh/apis/data-sources' | '/ankh/apis/operations' | '/ankh/auth' | '/ankh/auth/providers' | '/ankh/auth/routes' | '/ankh/auth/profile' | '/ankh/secrets' | '/ankh/theme';
|
|
29
|
-
export type StudioAdminRoutePath = StudioAdminStaticRoutePath | `/ankh/properties/${string}`;
|
|
30
|
+
export type StudioAdminRoutePath = StudioAdminStaticRoutePath | `/ankh/bindings/${string}` | `/ankh/properties/${string}`;
|
|
30
31
|
export type StudioManifest = AppManifest & {
|
|
31
32
|
infra: AppManifest['infra'] & {
|
|
32
33
|
modulesConfig?: Record<string, unknown>;
|