@cratis/scene.engine 4.2.1 → 4.4.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/dist/cjs/editing/DescriptorCatalog.js +42 -0
- package/dist/cjs/editing/DescriptorCatalog.js.map +1 -0
- package/dist/cjs/editing/EditSession.js +44 -0
- package/dist/cjs/editing/EditSession.js.map +1 -0
- package/dist/cjs/editing/applyEdit.js +83 -0
- package/dist/cjs/editing/applyEdit.js.map +1 -0
- package/dist/cjs/editing/applyEffectiveConfiguration.js +62 -0
- package/dist/cjs/editing/applyEffectiveConfiguration.js.map +1 -0
- package/dist/cjs/editing/collectComponents.js +34 -0
- package/dist/cjs/editing/collectComponents.js.map +1 -0
- package/dist/cjs/editing/collectIconUsages.js +86 -0
- package/dist/cjs/editing/collectIconUsages.js.map +1 -0
- package/dist/cjs/editing/describeNode.js +63 -0
- package/dist/cjs/editing/describeNode.js.map +1 -0
- package/dist/cjs/editing/diagnoseIcons.js +67 -0
- package/dist/cjs/editing/diagnoseIcons.js.map +1 -0
- package/dist/cjs/editing/diagnostics.js +36 -0
- package/dist/cjs/editing/diagnostics.js.map +1 -0
- package/dist/cjs/editing/documentPaths.js +45 -0
- package/dist/cjs/editing/documentPaths.js.map +1 -0
- package/dist/cjs/editing/exposureEdits.js +106 -0
- package/dist/cjs/editing/exposureEdits.js.map +1 -0
- package/dist/cjs/editing/exposureGrants.js +115 -0
- package/dist/cjs/editing/exposureGrants.js.map +1 -0
- package/dist/cjs/editing/iconDiagnostics.js +103 -0
- package/dist/cjs/editing/iconDiagnostics.js.map +1 -0
- package/dist/cjs/editing/indexDocument.js +400 -0
- package/dist/cjs/editing/indexDocument.js.map +1 -0
- package/dist/cjs/editing/inspect.js +154 -0
- package/dist/cjs/editing/inspect.js.map +1 -0
- package/dist/cjs/editing/instanceEdits.js +267 -0
- package/dist/cjs/editing/instanceEdits.js.map +1 -0
- package/dist/cjs/editing/layoutTypeDescriptors.js +425 -0
- package/dist/cjs/editing/layoutTypeDescriptors.js.map +1 -0
- package/dist/cjs/editing/layoutTypeEdits.js +141 -0
- package/dist/cjs/editing/layoutTypeEdits.js.map +1 -0
- package/dist/cjs/editing/nodeIds.js +115 -0
- package/dist/cjs/editing/nodeIds.js.map +1 -0
- package/dist/cjs/editing/pathAccess.js +53 -0
- package/dist/cjs/editing/pathAccess.js.map +1 -0
- package/dist/cjs/editing/propertyEdits.js +125 -0
- package/dist/cjs/editing/propertyEdits.js.map +1 -0
- package/dist/cjs/editing/resolveEffectiveConfiguration.js +200 -0
- package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -0
- package/dist/cjs/editing/resolveTemplateChain.js +100 -0
- package/dist/cjs/editing/resolveTemplateChain.js.map +1 -0
- package/dist/cjs/editing/structureEdits.js +231 -0
- package/dist/cjs/editing/structureEdits.js.map +1 -0
- package/dist/cjs/editing/validateBinding.js +111 -0
- package/dist/cjs/editing/validateBinding.js.map +1 -0
- package/dist/cjs/editing/validateValue.js +114 -0
- package/dist/cjs/editing/validateValue.js.map +1 -0
- package/dist/cjs/icons/EffectiveIconCatalog.js +212 -0
- package/dist/cjs/icons/EffectiveIconCatalog.js.map +1 -0
- package/dist/cjs/icons/EffectiveIconEntry.js +22 -0
- package/dist/cjs/icons/EffectiveIconEntry.js.map +1 -0
- package/dist/cjs/icons/analyzeIconImpact.js +48 -0
- package/dist/cjs/icons/analyzeIconImpact.js.map +1 -0
- package/dist/cjs/icons/matchesIconQuery.js +22 -0
- package/dist/cjs/icons/matchesIconQuery.js.map +1 -0
- package/dist/cjs/icons/resolveIconLibraries.js +45 -0
- package/dist/cjs/icons/resolveIconLibraries.js.map +1 -0
- package/dist/cjs/index.js +67 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/editing/DescriptorCatalog.d.ts +9 -0
- package/dist/esm/editing/DescriptorCatalog.d.ts.map +1 -0
- package/dist/esm/editing/DescriptorCatalog.js +38 -0
- package/dist/esm/editing/DescriptorCatalog.js.map +1 -0
- package/dist/esm/editing/DocumentIndex.d.ts +31 -0
- package/dist/esm/editing/DocumentIndex.d.ts.map +1 -0
- package/dist/esm/editing/DocumentIndex.js +2 -0
- package/dist/esm/editing/DocumentIndex.js.map +1 -0
- package/dist/esm/editing/EditOutcome.d.ts +7 -0
- package/dist/esm/editing/EditOutcome.d.ts.map +1 -0
- package/dist/esm/editing/EditOutcome.js +2 -0
- package/dist/esm/editing/EditOutcome.js.map +1 -0
- package/dist/esm/editing/EditSession.d.ts +20 -0
- package/dist/esm/editing/EditSession.d.ts.map +1 -0
- package/dist/esm/editing/EditSession.js +42 -0
- package/dist/esm/editing/EditSession.js.map +1 -0
- package/dist/esm/editing/EditingContext.d.ts +10 -0
- package/dist/esm/editing/EditingContext.d.ts.map +1 -0
- package/dist/esm/editing/EditingContext.js +2 -0
- package/dist/esm/editing/EditingContext.js.map +1 -0
- package/dist/esm/editing/TemplateChain.d.ts +13 -0
- package/dist/esm/editing/TemplateChain.d.ts.map +1 -0
- package/dist/esm/editing/TemplateChain.js +2 -0
- package/dist/esm/editing/TemplateChain.js.map +1 -0
- package/dist/esm/editing/applyEdit.d.ts +5 -0
- package/dist/esm/editing/applyEdit.d.ts.map +1 -0
- package/dist/esm/editing/applyEdit.js +81 -0
- package/dist/esm/editing/applyEdit.js.map +1 -0
- package/dist/esm/editing/applyEffectiveConfiguration.d.ts +3 -0
- package/dist/esm/editing/applyEffectiveConfiguration.d.ts.map +1 -0
- package/dist/esm/editing/applyEffectiveConfiguration.js +60 -0
- package/dist/esm/editing/applyEffectiveConfiguration.js.map +1 -0
- package/dist/esm/editing/collectComponents.d.ts +3 -0
- package/dist/esm/editing/collectComponents.d.ts.map +1 -0
- package/dist/esm/editing/collectComponents.js +32 -0
- package/dist/esm/editing/collectComponents.js.map +1 -0
- package/dist/esm/editing/collectIconUsages.d.ts +5 -0
- package/dist/esm/editing/collectIconUsages.d.ts.map +1 -0
- package/dist/esm/editing/collectIconUsages.js +84 -0
- package/dist/esm/editing/collectIconUsages.js.map +1 -0
- package/dist/esm/editing/describeNode.d.ts +11 -0
- package/dist/esm/editing/describeNode.d.ts.map +1 -0
- package/dist/esm/editing/describeNode.js +60 -0
- package/dist/esm/editing/describeNode.js.map +1 -0
- package/dist/esm/editing/diagnoseIcons.d.ts +4 -0
- package/dist/esm/editing/diagnoseIcons.d.ts.map +1 -0
- package/dist/esm/editing/diagnoseIcons.js +65 -0
- package/dist/esm/editing/diagnoseIcons.js.map +1 -0
- package/dist/esm/editing/diagnostics.d.ts +6 -0
- package/dist/esm/editing/diagnostics.d.ts.map +1 -0
- package/dist/esm/editing/diagnostics.js +32 -0
- package/dist/esm/editing/diagnostics.js.map +1 -0
- package/dist/esm/editing/documentPaths.d.ts +8 -0
- package/dist/esm/editing/documentPaths.d.ts.map +1 -0
- package/dist/esm/editing/documentPaths.js +41 -0
- package/dist/esm/editing/documentPaths.js.map +1 -0
- package/dist/esm/editing/exposureEdits.d.ts +5 -0
- package/dist/esm/editing/exposureEdits.d.ts.map +1 -0
- package/dist/esm/editing/exposureEdits.js +103 -0
- package/dist/esm/editing/exposureEdits.js.map +1 -0
- package/dist/esm/editing/exposureGrants.d.ts +21 -0
- package/dist/esm/editing/exposureGrants.d.ts.map +1 -0
- package/dist/esm/editing/exposureGrants.js +112 -0
- package/dist/esm/editing/exposureGrants.js.map +1 -0
- package/dist/esm/editing/given/a_layout_document.d.ts +14 -0
- package/dist/esm/editing/given/a_layout_document.d.ts.map +1 -0
- package/dist/esm/editing/given/a_layout_document.js +67 -0
- package/dist/esm/editing/given/a_layout_document.js.map +1 -0
- package/dist/esm/editing/given/a_scene_document.d.ts +20 -0
- package/dist/esm/editing/given/a_scene_document.d.ts.map +1 -0
- package/dist/esm/editing/given/a_scene_document.js +110 -0
- package/dist/esm/editing/given/a_scene_document.js.map +1 -0
- package/dist/esm/editing/iconDiagnostics.d.ts +11 -0
- package/dist/esm/editing/iconDiagnostics.d.ts.map +1 -0
- package/dist/esm/editing/iconDiagnostics.js +99 -0
- package/dist/esm/editing/iconDiagnostics.js.map +1 -0
- package/dist/esm/editing/index.d.ts +22 -0
- package/dist/esm/editing/index.d.ts.map +1 -0
- package/dist/esm/editing/index.js +22 -0
- package/dist/esm/editing/index.js.map +1 -0
- package/dist/esm/editing/indexDocument.d.ts +6 -0
- package/dist/esm/editing/indexDocument.d.ts.map +1 -0
- package/dist/esm/editing/indexDocument.js +396 -0
- package/dist/esm/editing/indexDocument.js.map +1 -0
- package/dist/esm/editing/inspect.d.ts +8 -0
- package/dist/esm/editing/inspect.d.ts.map +1 -0
- package/dist/esm/editing/inspect.js +151 -0
- package/dist/esm/editing/inspect.js.map +1 -0
- package/dist/esm/editing/instanceEdits.d.ts +9 -0
- package/dist/esm/editing/instanceEdits.d.ts.map +1 -0
- package/dist/esm/editing/instanceEdits.js +260 -0
- package/dist/esm/editing/instanceEdits.js.map +1 -0
- package/dist/esm/editing/layoutTypeDescriptors.d.ts +5 -0
- package/dist/esm/editing/layoutTypeDescriptors.d.ts.map +1 -0
- package/dist/esm/editing/layoutTypeDescriptors.js +421 -0
- package/dist/esm/editing/layoutTypeDescriptors.js.map +1 -0
- package/dist/esm/editing/layoutTypeEdits.d.ts +4 -0
- package/dist/esm/editing/layoutTypeEdits.d.ts.map +1 -0
- package/dist/esm/editing/layoutTypeEdits.js +139 -0
- package/dist/esm/editing/layoutTypeEdits.js.map +1 -0
- package/dist/esm/editing/nodeIds.d.ts +14 -0
- package/dist/esm/editing/nodeIds.d.ts.map +1 -0
- package/dist/esm/editing/nodeIds.js +102 -0
- package/dist/esm/editing/nodeIds.js.map +1 -0
- package/dist/esm/editing/pathAccess.d.ts +7 -0
- package/dist/esm/editing/pathAccess.d.ts.map +1 -0
- package/dist/esm/editing/pathAccess.js +48 -0
- package/dist/esm/editing/pathAccess.js.map +1 -0
- package/dist/esm/editing/propertyEdits.d.ts +15 -0
- package/dist/esm/editing/propertyEdits.d.ts.map +1 -0
- package/dist/esm/editing/propertyEdits.js +120 -0
- package/dist/esm/editing/propertyEdits.js.map +1 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.d.ts +5 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.js +198 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -0
- package/dist/esm/editing/resolveTemplateChain.d.ts +4 -0
- package/dist/esm/editing/resolveTemplateChain.d.ts.map +1 -0
- package/dist/esm/editing/resolveTemplateChain.js +98 -0
- package/dist/esm/editing/resolveTemplateChain.js.map +1 -0
- package/dist/esm/editing/structureEdits.d.ts +6 -0
- package/dist/esm/editing/structureEdits.d.ts.map +1 -0
- package/dist/esm/editing/structureEdits.js +227 -0
- package/dist/esm/editing/structureEdits.js.map +1 -0
- package/dist/esm/editing/validateBinding.d.ts +7 -0
- package/dist/esm/editing/validateBinding.d.ts.map +1 -0
- package/dist/esm/editing/validateBinding.js +108 -0
- package/dist/esm/editing/validateBinding.js.map +1 -0
- package/dist/esm/editing/validateValue.d.ts +8 -0
- package/dist/esm/editing/validateValue.d.ts.map +1 -0
- package/dist/esm/editing/validateValue.js +111 -0
- package/dist/esm/editing/validateValue.js.map +1 -0
- package/dist/esm/icons/EffectiveIconCatalog.d.ts +25 -0
- package/dist/esm/icons/EffectiveIconCatalog.d.ts.map +1 -0
- package/dist/esm/icons/EffectiveIconCatalog.js +210 -0
- package/dist/esm/icons/EffectiveIconCatalog.js.map +1 -0
- package/dist/esm/icons/EffectiveIconEntry.d.ts +9 -0
- package/dist/esm/icons/EffectiveIconEntry.d.ts.map +1 -0
- package/dist/esm/icons/EffectiveIconEntry.js +20 -0
- package/dist/esm/icons/EffectiveIconEntry.js.map +1 -0
- package/dist/esm/icons/IconCatalogSource.d.ts +6 -0
- package/dist/esm/icons/IconCatalogSource.d.ts.map +1 -0
- package/dist/esm/icons/IconCatalogSource.js +2 -0
- package/dist/esm/icons/IconCatalogSource.js.map +1 -0
- package/dist/esm/icons/IconDiagnostic.d.ts +9 -0
- package/dist/esm/icons/IconDiagnostic.d.ts.map +1 -0
- package/dist/esm/icons/IconDiagnostic.js +2 -0
- package/dist/esm/icons/IconDiagnostic.js.map +1 -0
- package/dist/esm/icons/IconImpactReport.d.ts +18 -0
- package/dist/esm/icons/IconImpactReport.d.ts.map +1 -0
- package/dist/esm/icons/IconImpactReport.js +2 -0
- package/dist/esm/icons/IconImpactReport.js.map +1 -0
- package/dist/esm/icons/IconLibraryResolution.d.ts +7 -0
- package/dist/esm/icons/IconLibraryResolution.d.ts.map +1 -0
- package/dist/esm/icons/IconLibraryResolution.js +2 -0
- package/dist/esm/icons/IconLibraryResolution.js.map +1 -0
- package/dist/esm/icons/IconQuery.d.ts +7 -0
- package/dist/esm/icons/IconQuery.d.ts.map +1 -0
- package/dist/esm/icons/IconQuery.js +2 -0
- package/dist/esm/icons/IconQuery.js.map +1 -0
- package/dist/esm/icons/IconResolution.d.ts +14 -0
- package/dist/esm/icons/IconResolution.d.ts.map +1 -0
- package/dist/esm/icons/IconResolution.js +2 -0
- package/dist/esm/icons/IconResolution.js.map +1 -0
- package/dist/esm/icons/IconSearchResult.d.ts +7 -0
- package/dist/esm/icons/IconSearchResult.d.ts.map +1 -0
- package/dist/esm/icons/IconSearchResult.js +2 -0
- package/dist/esm/icons/IconSearchResult.js.map +1 -0
- package/dist/esm/icons/IconUsage.d.ts +6 -0
- package/dist/esm/icons/IconUsage.d.ts.map +1 -0
- package/dist/esm/icons/IconUsage.js +2 -0
- package/dist/esm/icons/IconUsage.js.map +1 -0
- package/dist/esm/icons/ResolvedIconLibrary.d.ts +8 -0
- package/dist/esm/icons/ResolvedIconLibrary.d.ts.map +1 -0
- package/dist/esm/icons/ResolvedIconLibrary.js +2 -0
- package/dist/esm/icons/ResolvedIconLibrary.js.map +1 -0
- package/dist/esm/icons/analyzeIconImpact.d.ts +5 -0
- package/dist/esm/icons/analyzeIconImpact.d.ts.map +1 -0
- package/dist/esm/icons/analyzeIconImpact.js +46 -0
- package/dist/esm/icons/analyzeIconImpact.js.map +1 -0
- package/dist/esm/icons/index.d.ts +14 -0
- package/dist/esm/icons/index.d.ts.map +1 -0
- package/dist/esm/icons/index.js +14 -0
- package/dist/esm/icons/index.js.map +1 -0
- package/dist/esm/icons/matchesIconQuery.d.ts +4 -0
- package/dist/esm/icons/matchesIconQuery.d.ts.map +1 -0
- package/dist/esm/icons/matchesIconQuery.js +20 -0
- package/dist/esm/icons/matchesIconQuery.js.map +1 -0
- package/dist/esm/icons/resolveIconLibraries.d.ts +4 -0
- package/dist/esm/icons/resolveIconLibraries.d.ts.map +1 -0
- package/dist/esm/icons/resolveIconLibraries.js +43 -0
- package/dist/esm/icons/resolveIconLibraries.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/editing/DescriptorCatalog.ts +51 -0
- package/editing/DocumentIndex.ts +73 -0
- package/editing/EditOutcome.ts +21 -0
- package/editing/EditSession.ts +50 -0
- package/editing/EditingContext.ts +34 -0
- package/editing/TemplateChain.ts +36 -0
- package/editing/applyEdit.ts +69 -0
- package/editing/applyEffectiveConfiguration.ts +53 -0
- package/editing/collectComponents.ts +36 -0
- package/editing/collectIconUsages.ts +78 -0
- package/editing/describeNode.ts +61 -0
- package/editing/diagnoseIcons.ts +60 -0
- package/editing/diagnostics.ts +30 -0
- package/editing/documentPaths.ts +40 -0
- package/editing/exposureEdits.ts +119 -0
- package/editing/exposureGrants.ts +159 -0
- package/editing/given/a_layout_document.ts +88 -0
- package/editing/given/a_scene_document.ts +135 -0
- package/editing/iconDiagnostics.ts +90 -0
- package/editing/index.ts +24 -0
- package/editing/indexDocument.ts +237 -0
- package/editing/inspect.ts +165 -0
- package/editing/instanceEdits.ts +251 -0
- package/editing/layoutTypeDescriptors.ts +191 -0
- package/editing/layoutTypeEdits.ts +135 -0
- package/editing/nodeIds.ts +111 -0
- package/editing/pathAccess.ts +81 -0
- package/editing/propertyEdits.ts +127 -0
- package/editing/resolveEffectiveConfiguration.ts +202 -0
- package/editing/resolveTemplateChain.ts +109 -0
- package/editing/structureEdits.ts +234 -0
- package/editing/validateBinding.ts +103 -0
- package/editing/validateValue.ts +130 -0
- package/icons/EffectiveIconCatalog.ts +199 -0
- package/icons/EffectiveIconEntry.ts +36 -0
- package/icons/IconCatalogSource.ts +23 -0
- package/icons/IconDiagnostic.ts +45 -0
- package/icons/IconImpactReport.ts +63 -0
- package/icons/IconLibraryResolution.ts +22 -0
- package/icons/IconQuery.ts +27 -0
- package/icons/IconResolution.ts +25 -0
- package/icons/IconSearchResult.ts +21 -0
- package/icons/IconUsage.ts +21 -0
- package/icons/ResolvedIconLibrary.ts +32 -0
- package/icons/analyzeIconImpact.ts +41 -0
- package/icons/index.ts +16 -0
- package/icons/matchesIconQuery.ts +19 -0
- package/icons/resolveIconLibraries.ts +47 -0
- package/index.ts +2 -0
- package/package.json +3 -3
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { SceneNodeKind, EditingScopeKind, DiagnosticCode } from '@cratis/scene.model';
|
|
2
|
+
import { resolveScreenTemplates } from '../resolveScreenTemplates.js';
|
|
3
|
+
import { collectComponents } from './collectComponents.js';
|
|
4
|
+
import { errorDiagnostic, warningDiagnostic } from './diagnostics.js';
|
|
5
|
+
|
|
6
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
7
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
8
|
+
function exposuresOf(document, owner) {
|
|
9
|
+
return document.exposures.find((declaration)=>declaration.owner === owner)?.properties ?? [];
|
|
10
|
+
}
|
|
11
|
+
function level(document, kind, prefix, owner) {
|
|
12
|
+
return {
|
|
13
|
+
owner: owner.name,
|
|
14
|
+
kind,
|
|
15
|
+
instance: `${prefix}:${owner.name}`,
|
|
16
|
+
elements: collectComponents(owner),
|
|
17
|
+
exposures: exposuresOf(document, owner.name)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function templateLevels(document, layout, template, chain) {
|
|
21
|
+
const placements = resolveScreenTemplates(layout, document.screenTemplates).placements;
|
|
22
|
+
const ancestry = [
|
|
23
|
+
template
|
|
24
|
+
];
|
|
25
|
+
let current = template.name;
|
|
26
|
+
for(let guard = 0; guard <= document.screenTemplates.length; guard++){
|
|
27
|
+
const placement = placements.find((candidate)=>candidate.template === current);
|
|
28
|
+
if (!placement || placement.container === layout.name) break;
|
|
29
|
+
const parent = document.screenTemplates.find((candidate)=>candidate.name === placement.container);
|
|
30
|
+
if (!parent) break;
|
|
31
|
+
ancestry.unshift(parent);
|
|
32
|
+
current = parent.name;
|
|
33
|
+
}
|
|
34
|
+
if (!placements.some((placement)=>placement.template === ancestry[0].name)) {
|
|
35
|
+
chain.diagnostics.push(warningDiagnostic(DiagnosticCode.UnknownScope, `The template '${ancestry[0].name}' could not be placed in the layout '${layout.name}', so nothing outside it is part of the chain.`));
|
|
36
|
+
return ancestry.slice(-1).map((item)=>level(document, SceneNodeKind.ScreenTemplate, 'template', item));
|
|
37
|
+
}
|
|
38
|
+
return ancestry.map((item)=>level(document, SceneNodeKind.ScreenTemplate, 'template', item));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Assembles the chain of owners an editing scope sits inside: the layout, each template down to the one the
|
|
42
|
+
* scope is in, and the scope itself.
|
|
43
|
+
*
|
|
44
|
+
* The same chain feeds {@link resolveEffectiveConfiguration} for the runtime and the editor, so both see the same
|
|
45
|
+
* nesting. A scope that cannot be found yields an empty chain with an error diagnostic.
|
|
46
|
+
*
|
|
47
|
+
* @param document The document to read.
|
|
48
|
+
* @param scope What is being edited.
|
|
49
|
+
* @returns The chain, outermost first.
|
|
50
|
+
*/ function resolveTemplateChain(document, scope) {
|
|
51
|
+
const chain = {
|
|
52
|
+
levels: [],
|
|
53
|
+
diagnostics: []
|
|
54
|
+
};
|
|
55
|
+
switch(scope.kind){
|
|
56
|
+
case EditingScopeKind.Layout:
|
|
57
|
+
{
|
|
58
|
+
const layout = document.layouts.find((candidate)=>candidate.name === scope.name);
|
|
59
|
+
if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case EditingScopeKind.DialogTemplate:
|
|
63
|
+
{
|
|
64
|
+
const dialog = document.dialogTemplates.find((candidate)=>candidate.name === scope.name);
|
|
65
|
+
if (dialog) chain.levels.push(level(document, SceneNodeKind.DialogTemplate, 'dialog', dialog));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case EditingScopeKind.ScreenTemplate:
|
|
69
|
+
{
|
|
70
|
+
const template = document.screenTemplates.find((candidate)=>candidate.name === scope.name);
|
|
71
|
+
const layout = document.layouts.find((candidate)=>candidate.name === scope.layout) ?? (scope.layout === undefined && document.layouts.length === 1 ? document.layouts[0] : undefined);
|
|
72
|
+
if (template && layout) {
|
|
73
|
+
chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout), ...templateLevels(document, layout, template, chain));
|
|
74
|
+
} else if (template) {
|
|
75
|
+
chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
{
|
|
81
|
+
const screen = document.screens.find((candidate)=>candidate.name === scope.name);
|
|
82
|
+
if (!screen) break;
|
|
83
|
+
const layout = document.layouts.find((candidate)=>candidate.name === screen.layout);
|
|
84
|
+
const template = screen.screenTemplate === undefined ? undefined : document.screenTemplates.find((candidate)=>candidate.name === screen.screenTemplate);
|
|
85
|
+
if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));
|
|
86
|
+
if (layout && template) chain.levels.push(...templateLevels(document, layout, template, chain));
|
|
87
|
+
else if (template) chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));
|
|
88
|
+
chain.levels.push(level(document, SceneNodeKind.Screen, 'screen', screen));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (chain.levels.length === 0) {
|
|
92
|
+
chain.diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownScope, `There is no ${scope.kind} named '${scope.name}'.`));
|
|
93
|
+
}
|
|
94
|
+
return chain;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export { resolveTemplateChain };
|
|
98
|
+
//# sourceMappingURL=resolveTemplateChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveTemplateChain.js","sources":["../../../editing/resolveTemplateChain.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, DialogTemplate, EditingScope, EditingScopeKind, ExposedProperty, Layout, SceneDocument,\n SceneNodeKind, Screen, ScreenTemplate,\n} from '@cratis/scene.model';\nimport { resolveScreenTemplates } from '../resolveScreenTemplates';\nimport { collectComponents } from './collectComponents';\nimport { errorDiagnostic, warningDiagnostic } from './diagnostics';\nimport { TemplateChain, TemplateChainLevel } from './TemplateChain';\n\nfunction exposuresOf(document: SceneDocument, owner: string): ExposedProperty[] {\n return document.exposures.find(declaration => declaration.owner === owner)?.properties ?? [];\n}\n\nfunction level(document: SceneDocument, kind: SceneNodeKind, prefix: string, owner: Layout | ScreenTemplate | DialogTemplate | Screen): TemplateChainLevel {\n return {\n owner: owner.name,\n kind,\n instance: `${prefix}:${owner.name}`,\n elements: collectComponents(owner),\n exposures: exposuresOf(document, owner.name),\n };\n}\n\nfunction templateLevels(document: SceneDocument, layout: Layout, template: ScreenTemplate, chain: TemplateChain): TemplateChainLevel[] {\n const placements = resolveScreenTemplates(layout, document.screenTemplates).placements;\n const ancestry: ScreenTemplate[] = [template];\n\n let current = template.name;\n for (let guard = 0; guard <= document.screenTemplates.length; guard++) {\n const placement = placements.find(candidate => candidate.template === current);\n if (!placement || placement.container === layout.name) break;\n\n const parent = document.screenTemplates.find(candidate => candidate.name === placement.container);\n if (!parent) break;\n ancestry.unshift(parent);\n current = parent.name;\n }\n\n if (!placements.some(placement => placement.template === ancestry[0].name)) {\n chain.diagnostics.push(warningDiagnostic(\n DiagnosticCode.UnknownScope,\n `The template '${ancestry[0].name}' could not be placed in the layout '${layout.name}', so nothing outside it is part of the chain.`));\n return ancestry.slice(-1).map(item => level(document, SceneNodeKind.ScreenTemplate, 'template', item));\n }\n\n return ancestry.map(item => level(document, SceneNodeKind.ScreenTemplate, 'template', item));\n}\n\n/**\n * Assembles the chain of owners an editing scope sits inside: the layout, each template down to the one the\n * scope is in, and the scope itself.\n *\n * The same chain feeds {@link resolveEffectiveConfiguration} for the runtime and the editor, so both see the same\n * nesting. A scope that cannot be found yields an empty chain with an error diagnostic.\n *\n * @param document The document to read.\n * @param scope What is being edited.\n * @returns The chain, outermost first.\n */\nexport function resolveTemplateChain(document: SceneDocument, scope: EditingScope): TemplateChain {\n const chain: TemplateChain = { levels: [], diagnostics: [] };\n\n switch (scope.kind) {\n case EditingScopeKind.Layout: {\n const layout = document.layouts.find(candidate => candidate.name === scope.name);\n if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));\n break;\n }\n\n case EditingScopeKind.DialogTemplate: {\n const dialog = document.dialogTemplates.find(candidate => candidate.name === scope.name);\n if (dialog) chain.levels.push(level(document, SceneNodeKind.DialogTemplate, 'dialog', dialog));\n break;\n }\n\n case EditingScopeKind.ScreenTemplate: {\n const template = document.screenTemplates.find(candidate => candidate.name === scope.name);\n const layout = document.layouts.find(candidate => candidate.name === scope.layout) ?? (scope.layout === undefined && document.layouts.length === 1 ? document.layouts[0] : undefined);\n if (template && layout) {\n chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout), ...templateLevels(document, layout, template, chain));\n } else if (template) {\n chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));\n }\n\n break;\n }\n\n default: {\n const screen = document.screens.find(candidate => candidate.name === scope.name);\n if (!screen) break;\n\n const layout = document.layouts.find(candidate => candidate.name === screen.layout);\n const template = screen.screenTemplate === undefined ? undefined : document.screenTemplates.find(candidate => candidate.name === screen.screenTemplate);\n if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));\n if (layout && template) chain.levels.push(...templateLevels(document, layout, template, chain));\n else if (template) chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));\n chain.levels.push(level(document, SceneNodeKind.Screen, 'screen', screen));\n }\n }\n\n if (chain.levels.length === 0) {\n chain.diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownScope, `There is no ${scope.kind} named '${scope.name}'.`));\n }\n\n return chain;\n}\n"],"names":["exposuresOf","document","owner","exposures","find","declaration","properties","level","kind","prefix","name","instance","elements","collectComponents","templateLevels","layout","template","chain","placements","resolveScreenTemplates","screenTemplates","ancestry","current","guard","length","placement","candidate","container","parent","unshift","some","diagnostics","push","warningDiagnostic","DiagnosticCode","UnknownScope","slice","map","item","SceneNodeKind","ScreenTemplate","resolveTemplateChain","scope","levels","EditingScopeKind","Layout","layouts","DialogTemplate","dialog","dialogTemplates","undefined","screen","screens","screenTemplate","Screen","errorDiagnostic"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { InsertNodeEdit, MoveNodeEdit, RemoveNodeEdit, SceneDiagnostic, SceneDocument } from '@cratis/scene.model';
|
|
2
|
+
import { EditSession } from './EditSession';
|
|
3
|
+
export declare function applyInsertNode(session: EditSession, edit: InsertNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
4
|
+
export declare function applyRemoveNode(session: EditSession, edit: RemoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
5
|
+
export declare function applyMoveNode(session: EditSession, edit: MoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
6
|
+
//# sourceMappingURL=structureEdits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structureEdits.d.ts","sourceRoot":"","sources":["../../../editing/structureEdits.ts"],"names":[],"mappings":"AAGA,OAAO,EACuB,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAEzG,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsG5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAiBtI;AAsDD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAGtI;AASD,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAoClI"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { DiagnosticCode, SceneNodeKind } from '@cratis/scene.model';
|
|
2
|
+
import { isExternalComponent, isPanel } from '../elementKind.js';
|
|
3
|
+
import { errorDiagnostic } from './diagnostics.js';
|
|
4
|
+
import { elementNodeId } from './nodeIds.js';
|
|
5
|
+
import { ensureArrayAt, getAtPath, mirroredPaths } from './documentPaths.js';
|
|
6
|
+
import { findLayoutTypeDescriptor } from './DescriptorCatalog.js';
|
|
7
|
+
import { cloneData } from './pathAccess.js';
|
|
8
|
+
|
|
9
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
10
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
11
|
+
function elementIdsIn(value, found = []) {
|
|
12
|
+
if (value === null || typeof value !== 'object') return found;
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
for (const item of value)elementIdsIn(item, found);
|
|
15
|
+
return found;
|
|
16
|
+
}
|
|
17
|
+
const candidate = value;
|
|
18
|
+
if (typeof candidate.id === 'string' && candidate.properties !== null && typeof candidate.properties === 'object') found.push(candidate.id);
|
|
19
|
+
for (const child of Object.values(value))elementIdsIn(child, found);
|
|
20
|
+
return found;
|
|
21
|
+
}
|
|
22
|
+
function resolveInsertionPoint(session, targetId, slot, diagnostics) {
|
|
23
|
+
const record = session.index.nodes.get(targetId);
|
|
24
|
+
const refuse = (code, message)=>{
|
|
25
|
+
diagnostics.push(errorDiagnostic(code, message, {
|
|
26
|
+
nodeId: targetId
|
|
27
|
+
}));
|
|
28
|
+
return undefined;
|
|
29
|
+
};
|
|
30
|
+
if (!record) return refuse(DiagnosticCode.UnknownNode, `There is no node '${targetId}'.`);
|
|
31
|
+
if (!session.isLocal(record)) return refuse(DiagnosticCode.NodeNotEditable, `'${targetId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`);
|
|
32
|
+
const paths = (path)=>mirroredPaths(record.mirror, path);
|
|
33
|
+
switch(record.kind){
|
|
34
|
+
case SceneNodeKind.Slot:
|
|
35
|
+
return record.contentPath ? {
|
|
36
|
+
record,
|
|
37
|
+
paths: paths(record.contentPath),
|
|
38
|
+
flow: false
|
|
39
|
+
} : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' is a slot of a layout; a layout declares slots and screens fill them.`);
|
|
40
|
+
case SceneNodeKind.FlowNode:
|
|
41
|
+
return record.typeId === 'flowLeaf' || record.typeId === 'flowSlotLeaf' ? refuse(DiagnosticCode.TargetDoesNotAcceptChildren, 'A flow leaf holds one element and takes no children; insert into its container.') : {
|
|
42
|
+
record,
|
|
43
|
+
paths: paths([
|
|
44
|
+
...record.path,
|
|
45
|
+
'children'
|
|
46
|
+
]),
|
|
47
|
+
flow: true
|
|
48
|
+
};
|
|
49
|
+
case SceneNodeKind.Element:
|
|
50
|
+
{
|
|
51
|
+
const element = record.value;
|
|
52
|
+
if (isExternalComponent(element)) {
|
|
53
|
+
return slot ? {
|
|
54
|
+
record,
|
|
55
|
+
paths: paths([
|
|
56
|
+
...record.path,
|
|
57
|
+
'slots',
|
|
58
|
+
slot
|
|
59
|
+
]),
|
|
60
|
+
flow: false
|
|
61
|
+
} : refuse(DiagnosticCode.UnknownSlot, `Say which slot of '${element.componentName}' to insert into.`);
|
|
62
|
+
}
|
|
63
|
+
return isPanel(element) ? {
|
|
64
|
+
record,
|
|
65
|
+
paths: paths([
|
|
66
|
+
...record.path,
|
|
67
|
+
'children'
|
|
68
|
+
]),
|
|
69
|
+
flow: false
|
|
70
|
+
} : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' holds a single element and takes no children.`);
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' does not take children. Freeform arrangements place elements through their placements.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function checkCapacity(session, point, current, diagnostics) {
|
|
77
|
+
const maximum = findLayoutTypeDescriptor(session.context.catalog, point.record.typeId)?.capabilities.maximumChildren;
|
|
78
|
+
if (maximum !== undefined && current >= maximum) {
|
|
79
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.MaximumChildrenExceeded, `'${point.record.label}' holds at most ${maximum} children.`, {
|
|
80
|
+
nodeId: point.record.id
|
|
81
|
+
}));
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
function insertInto(session, clone, point, payload, isFlowNode, index, diagnostics) {
|
|
87
|
+
if (isFlowNode && !point.flow) {
|
|
88
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', {
|
|
89
|
+
nodeId: point.record.id
|
|
90
|
+
}));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const arrays = point.paths.map((path)=>ensureArrayAt(clone, path));
|
|
94
|
+
const length = arrays[0].length;
|
|
95
|
+
if (index !== undefined && (!Number.isInteger(index) || index < 0 || index > length)) {
|
|
96
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${index} among ${length} children.`, {
|
|
97
|
+
nodeId: point.record.id
|
|
98
|
+
}));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (!checkCapacity(session, point, length, diagnostics)) return;
|
|
102
|
+
for (const array of arrays){
|
|
103
|
+
const node = point.flow && !isFlowNode ? {
|
|
104
|
+
content: cloneData(payload)
|
|
105
|
+
} : cloneData(payload);
|
|
106
|
+
array.splice(index ?? array.length, 0, node);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Applies an insert to a copy of the document.
|
|
111
|
+
*/ function applyInsertNode(session, edit, clone, diagnostics) {
|
|
112
|
+
if (edit.element === undefined === (edit.flowNode === undefined)) {
|
|
113
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'Give exactly one of element and flowNode.', {
|
|
114
|
+
nodeId: edit.target
|
|
115
|
+
}));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);
|
|
119
|
+
if (!point) return;
|
|
120
|
+
const identities = elementIdsIn(edit.element ?? edit.flowNode);
|
|
121
|
+
const duplicate = identities.find((identity, position)=>identities.indexOf(identity) !== position || session.index.nodes.has(elementNodeId(identity)));
|
|
122
|
+
if (duplicate !== undefined) {
|
|
123
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.ElementIdInUse, `The element id '${duplicate}' is already used.`, {
|
|
124
|
+
nodeId: edit.target
|
|
125
|
+
}));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
insertInto(session, clone, point, edit.element ?? edit.flowNode, edit.flowNode !== undefined, edit.index, diagnostics);
|
|
129
|
+
}
|
|
130
|
+
function resolveRemoval(session, nodeId, diagnostics) {
|
|
131
|
+
const record = session.index.nodes.get(nodeId);
|
|
132
|
+
if (!record) {
|
|
133
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownNode, `There is no node '${nodeId}'.`, {
|
|
134
|
+
nodeId
|
|
135
|
+
}));
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
if (!session.isLocal(record)) {
|
|
139
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotEditable, `'${nodeId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`, {
|
|
140
|
+
nodeId
|
|
141
|
+
}));
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const holder = record.leafId !== undefined ? session.index.nodes.get(record.leafId) : record;
|
|
145
|
+
const isElement = record.kind === SceneNodeKind.Element;
|
|
146
|
+
const removable = holder.list !== undefined || isElement && record.placementIds !== undefined;
|
|
147
|
+
if (!removable || record.kind !== SceneNodeKind.Element && record.kind !== SceneNodeKind.FlowNode) {
|
|
148
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotRemovable, `'${record.label}' cannot be moved or removed on its own.`, {
|
|
149
|
+
nodeId
|
|
150
|
+
}));
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
holder: isElement && record.placementIds !== undefined ? record : holder,
|
|
155
|
+
payload: record.value,
|
|
156
|
+
isFlowNode: !isElement
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function takeOut(session, clone, removal) {
|
|
160
|
+
const { holder } = removal;
|
|
161
|
+
if (holder.placementIds !== undefined && holder.kind === SceneNodeKind.Element) {
|
|
162
|
+
for (const placementId of holder.placementIds){
|
|
163
|
+
const placement = session.index.nodes.get(placementId);
|
|
164
|
+
const array = getAtPath(clone, placement.list.path);
|
|
165
|
+
array.splice(placement.list.index, 1);
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
for (const path of mirroredPaths(holder.mirror, holder.list.path)){
|
|
170
|
+
const index = holder.list.index;
|
|
171
|
+
getAtPath(clone, path).splice(index, 1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Applies a removal to a copy of the document. Removing an element a flow leaf holds removes the leaf too, and
|
|
176
|
+
* removing a freeform element removes its placement in every size-class variant.
|
|
177
|
+
*/ function applyRemoveNode(session, edit, clone, diagnostics) {
|
|
178
|
+
const removal = resolveRemoval(session, edit.nodeId, diagnostics);
|
|
179
|
+
if (removal) takeOut(session, clone, removal);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Applies a move - a reorder or a reparent - to a copy of the document.
|
|
183
|
+
*
|
|
184
|
+
* `index` is the position the node ends up at among its new siblings. The destination arrays are located before
|
|
185
|
+
* anything is taken out, so removing a sibling that shifts the destination's own address does not misdirect the
|
|
186
|
+
* insert.
|
|
187
|
+
*/ function applyMoveNode(session, edit, clone, diagnostics) {
|
|
188
|
+
const removal = resolveRemoval(session, edit.nodeId, diagnostics);
|
|
189
|
+
if (!removal) return;
|
|
190
|
+
const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);
|
|
191
|
+
if (!point) return;
|
|
192
|
+
const moved = session.index.nodes.get(edit.nodeId);
|
|
193
|
+
for(let ancestor = point.record; ancestor; ancestor = ancestor.parentId === undefined ? undefined : session.index.nodes.get(ancestor.parentId)){
|
|
194
|
+
if (ancestor.id === moved.id) {
|
|
195
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.ContainmentCycle, `'${moved.label}' cannot be moved into itself or something inside it.`, {
|
|
196
|
+
nodeId: edit.nodeId
|
|
197
|
+
}));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const payload = cloneData(removal.payload);
|
|
202
|
+
const arrays = point.paths.map((path)=>ensureArrayAt(clone, path));
|
|
203
|
+
takeOut(session, clone, removal);
|
|
204
|
+
if (removal.isFlowNode && !point.flow) {
|
|
205
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', {
|
|
206
|
+
nodeId: edit.nodeId
|
|
207
|
+
}));
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const length = arrays[0].length;
|
|
211
|
+
if (edit.index !== undefined && (!Number.isInteger(edit.index) || edit.index < 0 || edit.index > length)) {
|
|
212
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${edit.index} among ${length} children.`, {
|
|
213
|
+
nodeId: edit.target
|
|
214
|
+
}));
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (!checkCapacity(session, point, length, diagnostics)) return;
|
|
218
|
+
for (const array of arrays){
|
|
219
|
+
const node = point.flow && !removal.isFlowNode ? {
|
|
220
|
+
content: cloneData(payload)
|
|
221
|
+
} : cloneData(payload);
|
|
222
|
+
array.splice(edit.index ?? array.length, 0, node);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export { applyInsertNode, applyMoveNode, applyRemoveNode };
|
|
227
|
+
//# sourceMappingURL=structureEdits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structureEdits.js","sources":["../../../editing/structureEdits.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, FlowNode, InsertNodeEdit, MoveNodeEdit, RemoveNodeEdit, SceneDiagnostic, SceneDocument, SceneElement,\n SceneNodeKind,\n} from '@cratis/scene.model';\nimport { isExternalComponent, isPanel } from '../elementKind';\nimport { errorDiagnostic } from './diagnostics';\nimport { DocumentPath, NodeRecord } from './DocumentIndex';\nimport { elementNodeId } from './nodeIds';\nimport { ensureArrayAt, getAtPath, mirroredPaths } from './documentPaths';\nimport { EditSession } from './EditSession';\nimport { findLayoutTypeDescriptor } from './DescriptorCatalog';\nimport { cloneData } from './pathAccess';\n\n/**\n * Where an insert or move puts its node: the arrays (one per freeform size-class copy) and what they hold.\n */\ninterface InsertionPoint {\n record: NodeRecord;\n paths: DocumentPath[];\n\n /** Whether the arrays hold flow nodes (and wrap elements in a leaf) or elements directly. */\n flow: boolean;\n}\n\nfunction elementIdsIn(value: unknown, found: string[] = []): string[] {\n if (value === null || typeof value !== 'object') return found;\n if (Array.isArray(value)) {\n for (const item of value) elementIdsIn(item, found);\n return found;\n }\n\n const candidate = value as { id?: unknown; properties?: unknown };\n if (typeof candidate.id === 'string' && candidate.properties !== null && typeof candidate.properties === 'object') found.push(candidate.id);\n for (const child of Object.values(value)) elementIdsIn(child, found);\n return found;\n}\n\nfunction resolveInsertionPoint(session: EditSession, targetId: string, slot: string | undefined, diagnostics: SceneDiagnostic[]): InsertionPoint | undefined {\n const record = session.index.nodes.get(targetId);\n const refuse = (code: DiagnosticCode, message: string) => {\n diagnostics.push(errorDiagnostic(code, message, { nodeId: targetId }));\n return undefined;\n };\n\n if (!record) return refuse(DiagnosticCode.UnknownNode, `There is no node '${targetId}'.`);\n if (!session.isLocal(record)) return refuse(DiagnosticCode.NodeNotEditable, `'${targetId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`);\n\n const paths = (path: DocumentPath) => mirroredPaths(record.mirror, path);\n switch (record.kind) {\n case SceneNodeKind.Slot:\n return record.contentPath\n ? { record, paths: paths(record.contentPath), flow: false }\n : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' is a slot of a layout; a layout declares slots and screens fill them.`);\n\n case SceneNodeKind.FlowNode:\n return record.typeId === 'flowLeaf' || record.typeId === 'flowSlotLeaf'\n ? refuse(DiagnosticCode.TargetDoesNotAcceptChildren, 'A flow leaf holds one element and takes no children; insert into its container.')\n : { record, paths: paths([...record.path, 'children']), flow: true };\n\n case SceneNodeKind.Element: {\n const element = record.value as SceneElement;\n if (isExternalComponent(element)) {\n return slot\n ? { record, paths: paths([...record.path, 'slots', slot]), flow: false }\n : refuse(DiagnosticCode.UnknownSlot, `Say which slot of '${element.componentName}' to insert into.`);\n }\n\n return isPanel(element)\n ? { record, paths: paths([...record.path, 'children']), flow: false }\n : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' holds a single element and takes no children.`);\n }\n\n default:\n return refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' does not take children. Freeform arrangements place elements through their placements.`);\n }\n}\n\nfunction checkCapacity(session: EditSession, point: InsertionPoint, current: number, diagnostics: SceneDiagnostic[]): boolean {\n const maximum = findLayoutTypeDescriptor(session.context.catalog, point.record.typeId)?.capabilities.maximumChildren;\n if (maximum !== undefined && current >= maximum) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.MaximumChildrenExceeded, `'${point.record.label}' holds at most ${maximum} children.`, { nodeId: point.record.id }));\n return false;\n }\n\n return true;\n}\n\nfunction insertInto(session: EditSession, clone: SceneDocument, point: InsertionPoint, payload: SceneElement | FlowNode, isFlowNode: boolean, index: number | undefined, diagnostics: SceneDiagnostic[]): void {\n if (isFlowNode && !point.flow) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', { nodeId: point.record.id }));\n return;\n }\n\n const arrays = point.paths.map(path => ensureArrayAt(clone, path));\n const length = arrays[0].length;\n if (index !== undefined && (!Number.isInteger(index) || index < 0 || index > length)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${index} among ${length} children.`, { nodeId: point.record.id }));\n return;\n }\n\n if (!checkCapacity(session, point, length, diagnostics)) return;\n\n for (const array of arrays) {\n const node = point.flow && !isFlowNode ? { content: cloneData(payload) } : cloneData(payload);\n array.splice(index ?? array.length, 0, node);\n }\n}\n\n/**\n * Applies an insert to a copy of the document.\n */\nexport function applyInsertNode(session: EditSession, edit: InsertNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n if ((edit.element === undefined) === (edit.flowNode === undefined)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'Give exactly one of element and flowNode.', { nodeId: edit.target }));\n return;\n }\n\n const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);\n if (!point) return;\n\n const identities = elementIdsIn(edit.element ?? edit.flowNode);\n const duplicate = identities.find((identity, position) => identities.indexOf(identity) !== position || session.index.nodes.has(elementNodeId(identity)));\n if (duplicate !== undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ElementIdInUse, `The element id '${duplicate}' is already used.`, { nodeId: edit.target }));\n return;\n }\n\n insertInto(session, clone, point, (edit.element ?? edit.flowNode)!, edit.flowNode !== undefined, edit.index, diagnostics);\n}\n\ninterface Removal {\n /** The list record whose array holds the node being taken out (a flow leaf for an element it wraps). */\n holder: NodeRecord;\n payload: SceneElement | FlowNode;\n isFlowNode: boolean;\n}\n\nfunction resolveRemoval(session: EditSession, nodeId: string, diagnostics: SceneDiagnostic[]): Removal | undefined {\n const record = session.index.nodes.get(nodeId);\n if (!record) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownNode, `There is no node '${nodeId}'.`, { nodeId }));\n return undefined;\n }\n\n if (!session.isLocal(record)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotEditable, `'${nodeId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`, { nodeId }));\n return undefined;\n }\n\n const holder = record.leafId !== undefined ? session.index.nodes.get(record.leafId)! : record;\n const isElement = record.kind === SceneNodeKind.Element;\n const removable = holder.list !== undefined || (isElement && record.placementIds !== undefined);\n if (!removable || (record.kind !== SceneNodeKind.Element && record.kind !== SceneNodeKind.FlowNode)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotRemovable, `'${record.label}' cannot be moved or removed on its own.`, { nodeId }));\n return undefined;\n }\n\n return { holder: isElement && record.placementIds !== undefined ? record : holder, payload: record.value as SceneElement | FlowNode, isFlowNode: !isElement };\n}\n\nfunction takeOut(session: EditSession, clone: SceneDocument, removal: Removal): void {\n const { holder } = removal;\n if (holder.placementIds !== undefined && holder.kind === SceneNodeKind.Element) {\n for (const placementId of holder.placementIds) {\n const placement = session.index.nodes.get(placementId)!;\n const array = getAtPath(clone, placement.list!.path) as unknown[];\n array.splice(placement.list!.index, 1);\n }\n\n return;\n }\n\n for (const path of mirroredPaths(holder.mirror, holder.list!.path)) {\n const index = holder.list!.index;\n (getAtPath(clone, path) as unknown[]).splice(index, 1);\n }\n}\n\n/**\n * Applies a removal to a copy of the document. Removing an element a flow leaf holds removes the leaf too, and\n * removing a freeform element removes its placement in every size-class variant.\n */\nexport function applyRemoveNode(session: EditSession, edit: RemoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n const removal = resolveRemoval(session, edit.nodeId, diagnostics);\n if (removal) takeOut(session, clone, removal);\n}\n\n/**\n * Applies a move - a reorder or a reparent - to a copy of the document.\n *\n * `index` is the position the node ends up at among its new siblings. The destination arrays are located before\n * anything is taken out, so removing a sibling that shifts the destination's own address does not misdirect the\n * insert.\n */\nexport function applyMoveNode(session: EditSession, edit: MoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n const removal = resolveRemoval(session, edit.nodeId, diagnostics);\n if (!removal) return;\n\n const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);\n if (!point) return;\n\n const moved = session.index.nodes.get(edit.nodeId)!;\n for (let ancestor: NodeRecord | undefined = point.record; ancestor; ancestor = ancestor.parentId === undefined ? undefined : session.index.nodes.get(ancestor.parentId)) {\n if (ancestor.id === moved.id) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContainmentCycle, `'${moved.label}' cannot be moved into itself or something inside it.`, { nodeId: edit.nodeId }));\n return;\n }\n }\n\n const payload = cloneData(removal.payload);\n const arrays = point.paths.map(path => ensureArrayAt(clone, path));\n takeOut(session, clone, removal);\n\n if (removal.isFlowNode && !point.flow) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', { nodeId: edit.nodeId }));\n return;\n }\n\n const length = arrays[0].length;\n if (edit.index !== undefined && (!Number.isInteger(edit.index) || edit.index < 0 || edit.index > length)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${edit.index} among ${length} children.`, { nodeId: edit.target }));\n return;\n }\n\n if (!checkCapacity(session, point, length, diagnostics)) return;\n\n for (const array of arrays) {\n const node = point.flow && !removal.isFlowNode ? { content: cloneData(payload) } : cloneData(payload);\n array.splice(edit.index ?? array.length, 0, node);\n }\n}\n"],"names":["elementIdsIn","value","found","Array","isArray","item","candidate","id","properties","push","child","Object","values","resolveInsertionPoint","session","targetId","slot","diagnostics","record","index","nodes","get","refuse","code","message","errorDiagnostic","nodeId","undefined","DiagnosticCode","UnknownNode","isLocal","NodeNotEditable","sourceOf","paths","path","mirroredPaths","mirror","kind","SceneNodeKind","Slot","contentPath","flow","TargetDoesNotAcceptChildren","label","FlowNode","typeId","Element","element","isExternalComponent","UnknownSlot","componentName","isPanel","checkCapacity","point","current","maximum","findLayoutTypeDescriptor","context","catalog","capabilities","maximumChildren","MaximumChildrenExceeded","insertInto","clone","payload","isFlowNode","InvalidEdit","arrays","map","ensureArrayAt","length","Number","isInteger","IndexOutOfRange","array","node","content","cloneData","splice","applyInsertNode","edit","flowNode","target","identities","duplicate","find","identity","position","indexOf","has","elementNodeId","ElementIdInUse","resolveRemoval","holder","leafId","isElement","removable","list","placementIds","NodeNotRemovable","takeOut","removal","placementId","placement","getAtPath","applyRemoveNode","applyMoveNode","moved","ancestor","parentId","ContainmentCycle"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PropertyDescriptor, QueryBinding, QueryCandidate, SceneDiagnostic } from '@cratis/scene.model';
|
|
2
|
+
export interface BindingTypeScope {
|
|
3
|
+
types: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
export declare function areTypesCompatible(sourceType: string, targetType: string): boolean;
|
|
6
|
+
export declare function validateBinding(descriptor: PropertyDescriptor, candidate: QueryCandidate | undefined, binding: QueryBinding, scope?: BindingTypeScope): SceneDiagnostic[];
|
|
7
|
+
//# sourceMappingURL=validateBinding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateBinding.d.ts","sourceRoot":"","sources":["../../../editing/validateBinding.ts"],"names":[],"mappings":"AAGA,OAAO,EACa,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EACpF,MAAM,qBAAqB,CAAC;AAO7B,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAeD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAMlF;AAeD,wBAAgB,eAAe,CAC3B,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,cAAc,GAAG,SAAS,EACrC,OAAO,EAAE,YAAY,EACrB,KAAK,CAAC,EAAE,gBAAgB,GACzB,eAAe,EAAE,CA+CnB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DiagnosticCode } from '@cratis/scene.model';
|
|
2
|
+
import { errorDiagnostic } from './diagnostics.js';
|
|
3
|
+
|
|
4
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
5
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
6
|
+
const integerTypes = new Set([
|
|
7
|
+
'int',
|
|
8
|
+
'integer',
|
|
9
|
+
'int16',
|
|
10
|
+
'int32',
|
|
11
|
+
'int64',
|
|
12
|
+
'short',
|
|
13
|
+
'long',
|
|
14
|
+
'byte',
|
|
15
|
+
'uint',
|
|
16
|
+
'uint16',
|
|
17
|
+
'uint32',
|
|
18
|
+
'uint64'
|
|
19
|
+
]);
|
|
20
|
+
const fractionalTypes = new Set([
|
|
21
|
+
'number',
|
|
22
|
+
'float',
|
|
23
|
+
'double',
|
|
24
|
+
'decimal',
|
|
25
|
+
'single'
|
|
26
|
+
]);
|
|
27
|
+
function normalizeType(type) {
|
|
28
|
+
return type.trim().toLowerCase().replace(/\?$/, '');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Whether a value of one type can feed a parameter or field of another.
|
|
32
|
+
*
|
|
33
|
+
* Types compare by name. A whole number may feed a fractional one, never the reverse, and a type called `any` or
|
|
34
|
+
* `unknown` on either side matches anything.
|
|
35
|
+
*/ function areTypesCompatible(sourceType, targetType) {
|
|
36
|
+
const source = normalizeType(sourceType);
|
|
37
|
+
const target = normalizeType(targetType);
|
|
38
|
+
if (source === target || source === 'any' || target === 'any' || source === 'unknown' || target === 'unknown') return true;
|
|
39
|
+
if (integerTypes.has(source)) return integerTypes.has(target) || fractionalTypes.has(target);
|
|
40
|
+
return fractionalTypes.has(source) && fractionalTypes.has(target);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validates a query binding against the query it names and the property it is for.
|
|
44
|
+
*
|
|
45
|
+
* Reports a query that is not among the candidates, a result shape the property cannot bind to, a required
|
|
46
|
+
* parameter nothing supplies, a binding for a parameter the query does not have, an argument whose type does not
|
|
47
|
+
* fit its parameter, and a result binding that names a field the query does not return.
|
|
48
|
+
*
|
|
49
|
+
* @param descriptor The `QueryReference` property the binding is the value of.
|
|
50
|
+
* @param candidate The candidate the binding names, or `undefined` when the host found none.
|
|
51
|
+
* @param binding The binding to check.
|
|
52
|
+
* @param scope The types of the values arguments draw from. Without it argument types are not checked.
|
|
53
|
+
* @returns The problems found; empty when the binding is sound.
|
|
54
|
+
*/ function validateBinding(descriptor, candidate, binding, scope) {
|
|
55
|
+
const path = descriptor.path;
|
|
56
|
+
if (!candidate || candidate.id !== binding.queryId) {
|
|
57
|
+
return [
|
|
58
|
+
errorDiagnostic(DiagnosticCode.MissingQuery, `The query '${binding.query}' (${binding.queryId}) is not available here.`, {
|
|
59
|
+
path
|
|
60
|
+
})
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
const diagnostics = [];
|
|
64
|
+
const allowedShapes = descriptor.constraints?.resultShapes;
|
|
65
|
+
if (allowedShapes && !allowedShapes.includes(candidate.resultShape)) {
|
|
66
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.IncompatibleResultShape, `'${descriptor.label}' binds to ${allowedShapes.join(' or ')} results, but '${candidate.name}' returns ${candidate.resultShape}.`, {
|
|
67
|
+
path
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
for (const argument of binding.arguments){
|
|
71
|
+
const parameter = candidate.parameters.find((candidateParameter)=>candidateParameter.name === argument.parameter);
|
|
72
|
+
if (!parameter) {
|
|
73
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownParameter, `'${candidate.name}' has no parameter '${argument.parameter}'.`, {
|
|
74
|
+
path
|
|
75
|
+
}));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!scope) continue;
|
|
79
|
+
const sourceType = scope.types[argument.source.path];
|
|
80
|
+
if (sourceType === undefined) {
|
|
81
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.UnresolvedArgumentSource, `'${argument.source.path}' is not available to supply '${parameter.name}'.`, {
|
|
82
|
+
path
|
|
83
|
+
}));
|
|
84
|
+
} else if (!areTypesCompatible(sourceType, parameter.type)) {
|
|
85
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.ArgumentTypeMismatch, `'${argument.source.path}' is ${sourceType} but '${parameter.name}' expects ${parameter.type}.`, {
|
|
86
|
+
path
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const parameter of candidate.parameters.filter((candidateParameter)=>candidateParameter.required)){
|
|
91
|
+
if (!binding.arguments.some((argument)=>argument.parameter === parameter.name)) {
|
|
92
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.MissingRequiredParameter, `'${candidate.name}' needs a value for '${parameter.name}'.`, {
|
|
93
|
+
path
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const result of binding.results){
|
|
98
|
+
if (!candidate.resultFields.some((field)=>field.name === result.field)) {
|
|
99
|
+
diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownResultField, `'${candidate.name}' does not return a field '${result.field}'.`, {
|
|
100
|
+
path
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return diagnostics;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { areTypesCompatible, validateBinding };
|
|
108
|
+
//# sourceMappingURL=validateBinding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateBinding.js","sources":["../../../editing/validateBinding.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, PropertyDescriptor, QueryBinding, QueryCandidate, SceneDiagnostic,\n} from '@cratis/scene.model';\nimport { errorDiagnostic } from './diagnostics';\n\n/**\n * The types of the values a binding can draw from, keyed by binding path. Supplied by the host, which knows what\n * is in scope where the query is used.\n */\nexport interface BindingTypeScope {\n types: Record<string, string>;\n}\n\nconst integerTypes = new Set(['int', 'integer', 'int16', 'int32', 'int64', 'short', 'long', 'byte', 'uint', 'uint16', 'uint32', 'uint64']);\nconst fractionalTypes = new Set(['number', 'float', 'double', 'decimal', 'single']);\n\nfunction normalizeType(type: string): string {\n return type.trim().toLowerCase().replace(/\\?$/, '');\n}\n\n/**\n * Whether a value of one type can feed a parameter or field of another.\n *\n * Types compare by name. A whole number may feed a fractional one, never the reverse, and a type called `any` or\n * `unknown` on either side matches anything.\n */\nexport function areTypesCompatible(sourceType: string, targetType: string): boolean {\n const source = normalizeType(sourceType);\n const target = normalizeType(targetType);\n if (source === target || source === 'any' || target === 'any' || source === 'unknown' || target === 'unknown') return true;\n if (integerTypes.has(source)) return integerTypes.has(target) || fractionalTypes.has(target);\n return fractionalTypes.has(source) && fractionalTypes.has(target);\n}\n\n/**\n * Validates a query binding against the query it names and the property it is for.\n *\n * Reports a query that is not among the candidates, a result shape the property cannot bind to, a required\n * parameter nothing supplies, a binding for a parameter the query does not have, an argument whose type does not\n * fit its parameter, and a result binding that names a field the query does not return.\n *\n * @param descriptor The `QueryReference` property the binding is the value of.\n * @param candidate The candidate the binding names, or `undefined` when the host found none.\n * @param binding The binding to check.\n * @param scope The types of the values arguments draw from. Without it argument types are not checked.\n * @returns The problems found; empty when the binding is sound.\n */\nexport function validateBinding(\n descriptor: PropertyDescriptor,\n candidate: QueryCandidate | undefined,\n binding: QueryBinding,\n scope?: BindingTypeScope,\n): SceneDiagnostic[] {\n const path = descriptor.path;\n if (!candidate || candidate.id !== binding.queryId) {\n return [errorDiagnostic(DiagnosticCode.MissingQuery, `The query '${binding.query}' (${binding.queryId}) is not available here.`, { path })];\n }\n\n const diagnostics: SceneDiagnostic[] = [];\n const allowedShapes = descriptor.constraints?.resultShapes;\n if (allowedShapes && !allowedShapes.includes(candidate.resultShape)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.IncompatibleResultShape,\n `'${descriptor.label}' binds to ${allowedShapes.join(' or ')} results, but '${candidate.name}' returns ${candidate.resultShape}.`,\n { path }));\n }\n\n for (const argument of binding.arguments) {\n const parameter = candidate.parameters.find(candidateParameter => candidateParameter.name === argument.parameter);\n if (!parameter) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownParameter, `'${candidate.name}' has no parameter '${argument.parameter}'.`, { path }));\n continue;\n }\n\n if (!scope) continue;\n const sourceType = scope.types[argument.source.path];\n if (sourceType === undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnresolvedArgumentSource, `'${argument.source.path}' is not available to supply '${parameter.name}'.`, { path }));\n } else if (!areTypesCompatible(sourceType, parameter.type)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ArgumentTypeMismatch,\n `'${argument.source.path}' is ${sourceType} but '${parameter.name}' expects ${parameter.type}.`,\n { path }));\n }\n }\n\n for (const parameter of candidate.parameters.filter(candidateParameter => candidateParameter.required)) {\n if (!binding.arguments.some(argument => argument.parameter === parameter.name)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.MissingRequiredParameter, `'${candidate.name}' needs a value for '${parameter.name}'.`, { path }));\n }\n }\n\n for (const result of binding.results) {\n if (!candidate.resultFields.some(field => field.name === result.field)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownResultField, `'${candidate.name}' does not return a field '${result.field}'.`, { path }));\n }\n }\n\n return diagnostics;\n}\n"],"names":["integerTypes","Set","fractionalTypes","normalizeType","type","trim","toLowerCase","replace","areTypesCompatible","sourceType","targetType","source","target","has","validateBinding","descriptor","candidate","binding","scope","path","id","queryId","errorDiagnostic","DiagnosticCode","MissingQuery","query","diagnostics","allowedShapes","constraints","resultShapes","includes","resultShape","push","IncompatibleResultShape","label","join","name","argument","arguments","parameter","parameters","find","candidateParameter","UnknownParameter","types","undefined","UnresolvedArgumentSource","ArgumentTypeMismatch","filter","required","some","MissingRequiredParameter","result","results","resultFields","field","UnknownResultField"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CollectionItemDescriptor, PropertyDescriptor } from '@cratis/scene.model';
|
|
2
|
+
export declare function validateValue(descriptor: PropertyDescriptor, value: unknown): string | undefined;
|
|
3
|
+
export interface ItemFieldProblem {
|
|
4
|
+
field: string;
|
|
5
|
+
problem: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateItemValues(itemDescriptor: CollectionItemDescriptor | undefined, values: Record<string, unknown>): ItemFieldProblem[];
|
|
8
|
+
//# sourceMappingURL=validateValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateValue.d.ts","sourceRoot":"","sources":["../../../editing/validateValue.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAqB,MAAM,qBAAqB,CAAC;AAiBtG,wBAAgB,aAAa,CAAC,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkDhG;AAyBD,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB;AASD,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,wBAAwB,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAAE,CAsB5I"}
|