@cratis/scene.engine 4.26.0 → 4.27.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.
Files changed (121) hide show
  1. package/dist/cjs/editing/resolveEffectiveConfiguration.js +8 -0
  2. package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -1
  3. package/dist/cjs/index.js +23 -0
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/navigation/NavigationDiagnosticCode.js +5 -0
  6. package/dist/cjs/navigation/NavigationDiagnosticCode.js.map +1 -1
  7. package/dist/cjs/navigation/NavigationEditKind.js +16 -0
  8. package/dist/cjs/navigation/NavigationEditKind.js.map +1 -0
  9. package/dist/cjs/navigation/NavigationItemOrigin.js +14 -0
  10. package/dist/cjs/navigation/NavigationItemOrigin.js.map +1 -0
  11. package/dist/cjs/navigation/NavigationSourcesKind.js +16 -0
  12. package/dist/cjs/navigation/NavigationSourcesKind.js.map +1 -0
  13. package/dist/cjs/navigation/diagnoseNavigation.js +8 -1
  14. package/dist/cjs/navigation/diagnoseNavigation.js.map +1 -1
  15. package/dist/cjs/navigation/diagnoseNavigationRegions.js +99 -0
  16. package/dist/cjs/navigation/diagnoseNavigationRegions.js.map +1 -0
  17. package/dist/cjs/navigation/effectiveNavigation.js +133 -0
  18. package/dist/cjs/navigation/effectiveNavigation.js.map +1 -0
  19. package/dist/cjs/navigation/navigationEdits.js +230 -0
  20. package/dist/cjs/navigation/navigationEdits.js.map +1 -0
  21. package/dist/cjs/navigation/navigationRegions.js +42 -0
  22. package/dist/cjs/navigation/navigationRegions.js.map +1 -0
  23. package/dist/cjs/validateNavigationDestinations.js +2 -0
  24. package/dist/cjs/validateNavigationDestinations.js.map +1 -1
  25. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -1
  26. package/dist/esm/editing/resolveEffectiveConfiguration.js +8 -0
  27. package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -1
  28. package/dist/esm/index.js +7 -0
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/navigation/EffectiveNavItem.d.ts +14 -0
  31. package/dist/esm/navigation/EffectiveNavItem.d.ts.map +1 -0
  32. package/dist/esm/navigation/EffectiveNavItem.js +2 -0
  33. package/dist/esm/navigation/EffectiveNavItem.js.map +1 -0
  34. package/dist/esm/navigation/EffectiveNavigationRegion.d.ts +11 -0
  35. package/dist/esm/navigation/EffectiveNavigationRegion.d.ts.map +1 -0
  36. package/dist/esm/navigation/EffectiveNavigationRegion.js +2 -0
  37. package/dist/esm/navigation/EffectiveNavigationRegion.js.map +1 -0
  38. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts +6 -1
  39. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts.map +1 -1
  40. package/dist/esm/navigation/NavigationDiagnosticCode.js +5 -0
  41. package/dist/esm/navigation/NavigationDiagnosticCode.js.map +1 -1
  42. package/dist/esm/navigation/NavigationEdit.d.ts +13 -0
  43. package/dist/esm/navigation/NavigationEdit.d.ts.map +1 -0
  44. package/dist/esm/navigation/NavigationEdit.js +2 -0
  45. package/dist/esm/navigation/NavigationEdit.js.map +1 -0
  46. package/dist/esm/navigation/NavigationEditKind.d.ts +7 -0
  47. package/dist/esm/navigation/NavigationEditKind.d.ts.map +1 -0
  48. package/dist/esm/navigation/NavigationEditKind.js +14 -0
  49. package/dist/esm/navigation/NavigationEditKind.js.map +1 -0
  50. package/dist/esm/navigation/NavigationEditOutcome.d.ts +7 -0
  51. package/dist/esm/navigation/NavigationEditOutcome.d.ts.map +1 -0
  52. package/dist/esm/navigation/NavigationEditOutcome.js +2 -0
  53. package/dist/esm/navigation/NavigationEditOutcome.js.map +1 -0
  54. package/dist/esm/navigation/NavigationEditPlan.d.ts +6 -0
  55. package/dist/esm/navigation/NavigationEditPlan.d.ts.map +1 -0
  56. package/dist/esm/navigation/NavigationEditPlan.js +2 -0
  57. package/dist/esm/navigation/NavigationEditPlan.js.map +1 -0
  58. package/dist/esm/navigation/NavigationGraph.d.ts +4 -1
  59. package/dist/esm/navigation/NavigationGraph.d.ts.map +1 -1
  60. package/dist/esm/navigation/NavigationItemOrigin.d.ts +5 -0
  61. package/dist/esm/navigation/NavigationItemOrigin.d.ts.map +1 -0
  62. package/dist/esm/navigation/NavigationItemOrigin.js +12 -0
  63. package/dist/esm/navigation/NavigationItemOrigin.js.map +1 -0
  64. package/dist/esm/navigation/NavigationSources.d.ts +6 -0
  65. package/dist/esm/navigation/NavigationSources.d.ts.map +1 -0
  66. package/dist/esm/navigation/NavigationSources.js +2 -0
  67. package/dist/esm/navigation/NavigationSources.js.map +1 -0
  68. package/dist/esm/navigation/NavigationSourcesKind.d.ts +7 -0
  69. package/dist/esm/navigation/NavigationSourcesKind.d.ts.map +1 -0
  70. package/dist/esm/navigation/NavigationSourcesKind.js +14 -0
  71. package/dist/esm/navigation/NavigationSourcesKind.js.map +1 -0
  72. package/dist/esm/navigation/ResolvedNavigationTarget.d.ts +6 -0
  73. package/dist/esm/navigation/ResolvedNavigationTarget.d.ts.map +1 -0
  74. package/dist/esm/navigation/ResolvedNavigationTarget.js +2 -0
  75. package/dist/esm/navigation/ResolvedNavigationTarget.js.map +1 -0
  76. package/dist/esm/navigation/diagnoseNavigation.d.ts.map +1 -1
  77. package/dist/esm/navigation/diagnoseNavigation.js +8 -1
  78. package/dist/esm/navigation/diagnoseNavigation.js.map +1 -1
  79. package/dist/esm/navigation/diagnoseNavigationRegions.d.ts +8 -0
  80. package/dist/esm/navigation/diagnoseNavigationRegions.d.ts.map +1 -0
  81. package/dist/esm/navigation/diagnoseNavigationRegions.js +97 -0
  82. package/dist/esm/navigation/diagnoseNavigationRegions.js.map +1 -0
  83. package/dist/esm/navigation/effectiveNavigation.d.ts +5 -0
  84. package/dist/esm/navigation/effectiveNavigation.d.ts.map +1 -0
  85. package/dist/esm/navigation/effectiveNavigation.js +131 -0
  86. package/dist/esm/navigation/effectiveNavigation.js.map +1 -0
  87. package/dist/esm/navigation/index.d.ts +14 -0
  88. package/dist/esm/navigation/index.d.ts.map +1 -1
  89. package/dist/esm/navigation/index.js +14 -0
  90. package/dist/esm/navigation/index.js.map +1 -1
  91. package/dist/esm/navigation/navigationEdits.d.ts +11 -0
  92. package/dist/esm/navigation/navigationEdits.d.ts.map +1 -0
  93. package/dist/esm/navigation/navigationEdits.js +225 -0
  94. package/dist/esm/navigation/navigationEdits.js.map +1 -0
  95. package/dist/esm/navigation/navigationRegions.d.ts +9 -0
  96. package/dist/esm/navigation/navigationRegions.d.ts.map +1 -0
  97. package/dist/esm/navigation/navigationRegions.js +34 -0
  98. package/dist/esm/navigation/navigationRegions.js.map +1 -0
  99. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  100. package/dist/esm/validateNavigationDestinations.js +2 -0
  101. package/dist/esm/validateNavigationDestinations.js.map +1 -1
  102. package/editing/resolveEffectiveConfiguration.ts +13 -0
  103. package/navigation/EffectiveNavItem.ts +37 -0
  104. package/navigation/EffectiveNavigationRegion.ts +26 -0
  105. package/navigation/NavigationDiagnosticCode.ts +15 -0
  106. package/navigation/NavigationEdit.ts +36 -0
  107. package/navigation/NavigationEditKind.ts +19 -0
  108. package/navigation/NavigationEditOutcome.ts +18 -0
  109. package/navigation/NavigationEditPlan.ts +15 -0
  110. package/navigation/NavigationGraph.ts +10 -1
  111. package/navigation/NavigationItemOrigin.ts +13 -0
  112. package/navigation/NavigationSources.ts +15 -0
  113. package/navigation/NavigationSourcesKind.ts +19 -0
  114. package/navigation/ResolvedNavigationTarget.ts +19 -0
  115. package/navigation/diagnoseNavigation.ts +7 -1
  116. package/navigation/diagnoseNavigationRegions.ts +122 -0
  117. package/navigation/effectiveNavigation.ts +105 -0
  118. package/navigation/index.ts +14 -0
  119. package/navigation/navigationEdits.ts +176 -0
  120. package/navigation/navigationRegions.ts +39 -0
  121. package/package.json +3 -3
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var ApplicationStructureIndex = require('../structure/ApplicationStructureIndex.js');
5
+ var NavigationItemOrigin = require('./NavigationItemOrigin.js');
6
+ var NavigationSourcesKind = require('./NavigationSourcesKind.js');
7
+ var navigationRegions = require('./navigationRegions.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
+ /**
12
+ * Resolves the items a navigation region effectively shows, for the application or for one module.
13
+ *
14
+ * - Application (no `module`): the application items, editable, `defined here`.
15
+ * - `inherit` (the default at a module): the application items, read-only; the module's own items are cleared.
16
+ * - `extend`: the application items, read-only, followed by the module's items.
17
+ * - `override`: the module's items only.
18
+ *
19
+ * Each item carries its `origin`, whether it is `readOnly`, a `reason`, and its target resolved against the
20
+ * structure: a module target goes to the module's first feature. Sub-items belong to the sidebar; a topbar is flat
21
+ * and its sub-items are ignored. This is the one function React renderers, Stage, Studio design mode and Studio
22
+ * preview call; nothing re-implements it.
23
+ *
24
+ * The C# engine (`EffectiveNavigation.Resolve`) returns the same result; both are asserted against
25
+ * `navigation-inheritance-fixtures.json` and `navigation-targets-fixtures.json`.
26
+ *
27
+ * @param structure The modules, features and slices of the application.
28
+ * @param navigation The application and module regions.
29
+ * @param module The module to resolve for; undefined for the application.
30
+ * @param region Which region to resolve.
31
+ */ function effectiveNavigation(structure, navigation, module, region) {
32
+ const index = structure instanceof ApplicationStructureIndex.ApplicationStructureIndex ? structure : new ApplicationStructureIndex.ApplicationStructureIndex(structure);
33
+ const applicationOwned = navigationRegions.applicationItems(navigation.application, region);
34
+ if (module === undefined) {
35
+ return {
36
+ region,
37
+ sources: {
38
+ kind: NavigationSourcesKind.NavigationSourcesKind.DefinedHere,
39
+ label: 'defined here'
40
+ },
41
+ items: applicationOwned.map((item)=>resolveItem(index, region, item, NavigationItemOrigin.NavigationItemOrigin.Application, false, 'Defined here.'))
42
+ };
43
+ }
44
+ const mode = navigationRegions.modeOfModuleRegion(navigation, module, region);
45
+ const moduleOwned = navigationRegions.findNavigationRegion(navigationRegions.findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];
46
+ const name = index.findModule(module)?.name ?? module;
47
+ const inherited = ()=>applicationOwned.map((item)=>resolveItem(index, region, item, NavigationItemOrigin.NavigationItemOrigin.Application, true, 'Inherited from the application; edit it there.'));
48
+ const own = ()=>moduleOwned.map((item)=>resolveItem(index, region, item, NavigationItemOrigin.NavigationItemOrigin.Module, false, `Defined in ${name}.`));
49
+ switch(mode){
50
+ case scene_model.NavigationRegionMode.Extend:
51
+ return {
52
+ region,
53
+ module,
54
+ mode,
55
+ sources: sourcesOf(NavigationSourcesKind.NavigationSourcesKind.Extended, name),
56
+ items: [
57
+ ...inherited(),
58
+ ...own()
59
+ ]
60
+ };
61
+ case scene_model.NavigationRegionMode.Override:
62
+ return {
63
+ region,
64
+ module,
65
+ mode,
66
+ sources: sourcesOf(NavigationSourcesKind.NavigationSourcesKind.Overridden, name),
67
+ items: own()
68
+ };
69
+ default:
70
+ return {
71
+ region,
72
+ module,
73
+ mode: scene_model.NavigationRegionMode.Inherit,
74
+ sources: sourcesOf(NavigationSourcesKind.NavigationSourcesKind.Inherited, name),
75
+ items: inherited()
76
+ };
77
+ }
78
+ }
79
+ function sourcesOf(kind, moduleName) {
80
+ switch(kind){
81
+ case NavigationSourcesKind.NavigationSourcesKind.Extended:
82
+ return {
83
+ kind,
84
+ label: `Application + ${moduleName}`
85
+ };
86
+ case NavigationSourcesKind.NavigationSourcesKind.Overridden:
87
+ return {
88
+ kind,
89
+ label: `${moduleName} only`
90
+ };
91
+ default:
92
+ return {
93
+ kind: NavigationSourcesKind.NavigationSourcesKind.Inherited,
94
+ label: 'inherited'
95
+ };
96
+ }
97
+ }
98
+ function resolveItem(index, region, item, origin, readOnly, reason) {
99
+ const resolved = {
100
+ id: item.id,
101
+ title: item.title,
102
+ slot: item.slot ?? navigationRegions.primarySlot,
103
+ origin,
104
+ readOnly,
105
+ reason
106
+ };
107
+ if (item.icon !== undefined) resolved.icon = item.icon;
108
+ const target = resolveTarget(index, item);
109
+ if (target) resolved.target = target;
110
+ if (region === scene_model.NavigationRegionKind.Sidebar && item.children && item.children.length > 0) {
111
+ resolved.children = item.children.map((child)=>resolveItem(index, region, child, origin, readOnly, reason));
112
+ }
113
+ return resolved;
114
+ }
115
+ function resolveTarget(index, item) {
116
+ const module = item.target?.module;
117
+ if (!module) return undefined;
118
+ const target = {
119
+ module
120
+ };
121
+ const feature = item.target?.feature;
122
+ if (feature) {
123
+ target.feature = feature;
124
+ if (index.findFeature(`${module}.${feature}`)) target.resolvedFeature = `${module}.${feature}`;
125
+ } else {
126
+ const first = index.firstFeatureId(module);
127
+ if (first !== undefined) target.resolvedFeature = first;
128
+ }
129
+ return target;
130
+ }
131
+
132
+ exports.effectiveNavigation = effectiveNavigation;
133
+ //# sourceMappingURL=effectiveNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effectiveNavigation.js","sources":["../../../navigation/effectiveNavigation.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 { ApplicationStructure, NavigationModel, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';\nimport { ApplicationStructureIndex } from '../structure';\nimport { EffectiveNavigationRegion } from './EffectiveNavigationRegion';\nimport { EffectiveNavItem } from './EffectiveNavItem';\nimport { NavigationItemOrigin } from './NavigationItemOrigin';\nimport { NavigationSources } from './NavigationSources';\nimport { NavigationSourcesKind } from './NavigationSourcesKind';\nimport { applicationItems, findModuleNavigation, findNavigationRegion, modeOfModuleRegion, primarySlot } from './navigationRegions';\nimport { ResolvedNavigationTarget } from './ResolvedNavigationTarget';\n\n/**\n * Resolves the items a navigation region effectively shows, for the application or for one module.\n *\n * - Application (no `module`): the application items, editable, `defined here`.\n * - `inherit` (the default at a module): the application items, read-only; the module's own items are cleared.\n * - `extend`: the application items, read-only, followed by the module's items.\n * - `override`: the module's items only.\n *\n * Each item carries its `origin`, whether it is `readOnly`, a `reason`, and its target resolved against the\n * structure: a module target goes to the module's first feature. Sub-items belong to the sidebar; a topbar is flat\n * and its sub-items are ignored. This is the one function React renderers, Stage, Studio design mode and Studio\n * preview call; nothing re-implements it.\n *\n * The C# engine (`EffectiveNavigation.Resolve`) returns the same result; both are asserted against\n * `navigation-inheritance-fixtures.json` and `navigation-targets-fixtures.json`.\n *\n * @param structure The modules, features and slices of the application.\n * @param navigation The application and module regions.\n * @param module The module to resolve for; undefined for the application.\n * @param region Which region to resolve.\n */\nexport function effectiveNavigation(\n structure: ApplicationStructure | ApplicationStructureIndex,\n navigation: NavigationModel,\n module: string | undefined,\n region: NavigationRegionKind,\n): EffectiveNavigationRegion {\n const index = structure instanceof ApplicationStructureIndex ? structure : new ApplicationStructureIndex(structure);\n const applicationOwned = applicationItems(navigation.application, region);\n\n if (module === undefined) {\n return {\n region,\n sources: { kind: NavigationSourcesKind.DefinedHere, label: 'defined here' },\n items: applicationOwned.map(item => resolveItem(index, region, item, NavigationItemOrigin.Application, false, 'Defined here.')),\n };\n }\n\n const mode = modeOfModuleRegion(navigation, module, region);\n const moduleOwned = findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];\n const name = index.findModule(module)?.name ?? module;\n const inherited = (): EffectiveNavItem[] => applicationOwned.map(item => resolveItem(index, region, item, NavigationItemOrigin.Application, true, 'Inherited from the application; edit it there.'));\n const own = (): EffectiveNavItem[] => moduleOwned.map(item => resolveItem(index, region, item, NavigationItemOrigin.Module, false, `Defined in ${name}.`));\n\n switch (mode) {\n case NavigationRegionMode.Extend:\n return { region, module, mode, sources: sourcesOf(NavigationSourcesKind.Extended, name), items: [...inherited(), ...own()] };\n case NavigationRegionMode.Override:\n return { region, module, mode, sources: sourcesOf(NavigationSourcesKind.Overridden, name), items: own() };\n default:\n return { region, module, mode: NavigationRegionMode.Inherit, sources: sourcesOf(NavigationSourcesKind.Inherited, name), items: inherited() };\n }\n}\n\nfunction sourcesOf(kind: NavigationSourcesKind, moduleName: string): NavigationSources {\n switch (kind) {\n case NavigationSourcesKind.Extended: return { kind, label: `Application + ${moduleName}` };\n case NavigationSourcesKind.Overridden: return { kind, label: `${moduleName} only` };\n default: return { kind: NavigationSourcesKind.Inherited, label: 'inherited' };\n }\n}\n\nfunction resolveItem(index: ApplicationStructureIndex, region: NavigationRegionKind, item: NavItem, origin: NavigationItemOrigin, readOnly: boolean, reason: string): EffectiveNavItem {\n const resolved: EffectiveNavItem = { id: item.id, title: item.title, slot: item.slot ?? primarySlot, origin, readOnly, reason };\n if (item.icon !== undefined) resolved.icon = item.icon;\n\n const target = resolveTarget(index, item);\n if (target) resolved.target = target;\n\n if (region === NavigationRegionKind.Sidebar && item.children && item.children.length > 0) {\n resolved.children = item.children.map(child => resolveItem(index, region, child, origin, readOnly, reason));\n }\n\n return resolved;\n}\n\nfunction resolveTarget(index: ApplicationStructureIndex, item: NavItem): ResolvedNavigationTarget | undefined {\n const module = item.target?.module;\n if (!module) return undefined;\n\n const target: ResolvedNavigationTarget = { module };\n const feature = item.target?.feature;\n if (feature) {\n target.feature = feature;\n if (index.findFeature(`${module}.${feature}`)) target.resolvedFeature = `${module}.${feature}`;\n } else {\n const first = index.firstFeatureId(module);\n if (first !== undefined) target.resolvedFeature = first;\n }\n\n return target;\n}\n"],"names":["effectiveNavigation","structure","navigation","module","region","index","ApplicationStructureIndex","applicationOwned","applicationItems","application","undefined","sources","kind","NavigationSourcesKind","DefinedHere","label","items","map","item","resolveItem","NavigationItemOrigin","Application","mode","modeOfModuleRegion","moduleOwned","findNavigationRegion","findModuleNavigation","regions","name","findModule","inherited","own","Module","NavigationRegionMode","Extend","sourcesOf","Extended","Override","Overridden","Inherit","Inherited","moduleName","origin","readOnly","reason","resolved","id","title","slot","primarySlot","icon","target","resolveTarget","NavigationRegionKind","Sidebar","children","length","child","feature","findFeature","resolvedFeature","first","firstFeatureId"],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var NavigationEditKind = require('./NavigationEditKind.js');
5
+ var navigationRegions = require('./navigationRegions.js');
6
+
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
9
+ const noMode = 'The application is the base of the navigation and has no region mode.';
10
+ const logoLevel = 'The logo is defined at the application level only.';
11
+ const flatTopbar = 'A topbar is flat; only a sidebar item has sub-items.';
12
+ /**
13
+ * Plans a change of a module region's mode. Switching to `inherit` clears the module's items (NAV3); switching from
14
+ * `inherit` to `override` with `copy` first copies the application's items so the module starts from them (NAV5).
15
+ * @param navigation The navigation as it is.
16
+ * @param module The module whose region changes; the application has no mode and is refused.
17
+ * @param region The region.
18
+ * @param mode The mode to switch to.
19
+ * @param options `copy` copies the application items when switching from inherit to override.
20
+ */ function switchRegionMode(navigation, module, region, mode, options = {}) {
21
+ if (module === undefined) return {
22
+ edits: [],
23
+ rejected: noMode
24
+ };
25
+ const current = navigationRegions.modeOfModuleRegion(navigation, module, region);
26
+ if (current === mode) return {
27
+ edits: []
28
+ };
29
+ const setMode = {
30
+ kind: NavigationEditKind.NavigationEditKind.SetRegionMode,
31
+ module,
32
+ region,
33
+ mode
34
+ };
35
+ if (mode === scene_model.NavigationRegionMode.Inherit) {
36
+ return {
37
+ edits: [
38
+ {
39
+ kind: NavigationEditKind.NavigationEditKind.SetRegionItems,
40
+ module,
41
+ region,
42
+ items: []
43
+ },
44
+ setMode
45
+ ]
46
+ };
47
+ }
48
+ if (mode === scene_model.NavigationRegionMode.Override && current === scene_model.NavigationRegionMode.Inherit && options.copy === true) {
49
+ return {
50
+ edits: [
51
+ {
52
+ kind: NavigationEditKind.NavigationEditKind.SetRegionItems,
53
+ module,
54
+ region,
55
+ items: structuredClone(navigationRegions.applicationItems(navigation.application, region))
56
+ },
57
+ setMode
58
+ ]
59
+ };
60
+ }
61
+ return {
62
+ edits: [
63
+ setMode
64
+ ]
65
+ };
66
+ }
67
+ /**
68
+ * Plans adding an item to a region, after the ones already there. Adding to an inheriting module region first
69
+ * switches it to `extend` (NAV6), so the application's items stay and the new item follows them.
70
+ * @param navigation The navigation as it is.
71
+ * @param module The module that gets the item; undefined for the application.
72
+ * @param region The region.
73
+ * @param item The item to add.
74
+ * @param parent The id of the item it becomes a sub-item of; sidebar only.
75
+ */ function addNavItem(navigation, module, region, item, parent) {
76
+ if (parent !== undefined && region !== scene_model.NavigationRegionKind.Sidebar) return {
77
+ edits: [],
78
+ rejected: flatTopbar
79
+ };
80
+ const own = ownItems(navigation, module, region);
81
+ const ids = navigationRegions.collectItemIds(own, region);
82
+ if (ids.includes(item.id)) return {
83
+ edits: [],
84
+ rejected: `Navigation item id '${item.id}' is already used in this region.`
85
+ };
86
+ if (parent !== undefined && !ids.includes(parent)) return {
87
+ edits: [],
88
+ rejected: `There is no item '${parent}' to add a sub-item to.`
89
+ };
90
+ const add = {
91
+ kind: NavigationEditKind.NavigationEditKind.AddItem,
92
+ module,
93
+ region,
94
+ item: structuredClone(item)
95
+ };
96
+ if (parent !== undefined) add.parent = parent;
97
+ if (module !== undefined && navigationRegions.modeOfModuleRegion(navigation, module, region) === scene_model.NavigationRegionMode.Inherit) {
98
+ return {
99
+ edits: [
100
+ {
101
+ kind: NavigationEditKind.NavigationEditKind.SetRegionMode,
102
+ module,
103
+ region,
104
+ mode: scene_model.NavigationRegionMode.Extend
105
+ },
106
+ add
107
+ ]
108
+ };
109
+ }
110
+ return {
111
+ edits: [
112
+ add
113
+ ]
114
+ };
115
+ }
116
+ /**
117
+ * Plans setting the logo. The logo is defined at the application level only, so a module is refused.
118
+ * @param navigation The navigation as it is.
119
+ * @param module The module asking; only undefined (the application) is allowed.
120
+ * @param logo The logo.
121
+ */ function setApplicationLogo(navigation, module, logo) {
122
+ return module === undefined ? {
123
+ edits: [
124
+ {
125
+ kind: NavigationEditKind.NavigationEditKind.SetLogo,
126
+ logo: {
127
+ ...logo
128
+ }
129
+ }
130
+ ]
131
+ } : {
132
+ edits: [],
133
+ rejected: logoLevel
134
+ };
135
+ }
136
+ /**
137
+ * Applies navigation edits to a copy of the model. Either every edit applies, or none does.
138
+ * @param navigation The navigation as it is; never changed.
139
+ * @param edits The edits, in order.
140
+ */ function applyNavigationEdits(navigation, edits) {
141
+ const model = structuredClone(navigation);
142
+ for (const edit of edits){
143
+ const rejected = apply(model, edit);
144
+ if (rejected !== undefined) return {
145
+ applied: false,
146
+ model: navigation,
147
+ rejected
148
+ };
149
+ }
150
+ return {
151
+ applied: true,
152
+ model
153
+ };
154
+ }
155
+ function ownItems(navigation, module, region) {
156
+ return module === undefined ? navigationRegions.applicationItems(navigation.application, region) : navigationRegions.findNavigationRegion(navigationRegions.findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];
157
+ }
158
+ function regionOf(model, module, region) {
159
+ let regions;
160
+ if (module === undefined) {
161
+ regions = model.application.regions;
162
+ } else {
163
+ let block = navigationRegions.findModuleNavigation(model, module);
164
+ if (!block) {
165
+ block = {
166
+ module,
167
+ regions: []
168
+ };
169
+ model.modules.push(block);
170
+ }
171
+ regions = block.regions;
172
+ }
173
+ let found = navigationRegions.findNavigationRegion(regions, region);
174
+ if (!found) {
175
+ found = {
176
+ region,
177
+ items: []
178
+ };
179
+ regions.push(found);
180
+ }
181
+ return found;
182
+ }
183
+ function apply(model, edit) {
184
+ switch(edit.kind){
185
+ case NavigationEditKind.NavigationEditKind.SetRegionMode:
186
+ if (edit.module === undefined) return noMode;
187
+ regionOf(model, edit.module, edit.region).mode = edit.mode;
188
+ return undefined;
189
+ case NavigationEditKind.NavigationEditKind.SetRegionItems:
190
+ regionOf(model, edit.module, edit.region).items = structuredClone(edit.items ?? []);
191
+ return undefined;
192
+ case NavigationEditKind.NavigationEditKind.AddItem:
193
+ {
194
+ const target = regionOf(model, edit.module, edit.region);
195
+ const item = structuredClone(edit.item);
196
+ if (navigationRegions.collectItemIds(target.items, target.region).includes(item.id)) return `Navigation item id '${item.id}' is already used in this region.`;
197
+ if (edit.parent === undefined) {
198
+ target.items.push(item);
199
+ return undefined;
200
+ }
201
+ if (target.region !== scene_model.NavigationRegionKind.Sidebar) return flatTopbar;
202
+ const owner = findItem(target.items, edit.parent);
203
+ if (!owner) return `There is no item '${edit.parent}' to add a sub-item to.`;
204
+ (owner.children ??= []).push(item);
205
+ return undefined;
206
+ }
207
+ case NavigationEditKind.NavigationEditKind.SetLogo:
208
+ if (edit.module !== undefined) return logoLevel;
209
+ model.application.logo = {
210
+ ...edit.logo
211
+ };
212
+ return undefined;
213
+ default:
214
+ return `'${String(edit.kind)}' is not a navigation edit.`;
215
+ }
216
+ }
217
+ function findItem(items, id) {
218
+ for (const item of items){
219
+ if (item.id === id) return item;
220
+ const nested = findItem(item.children ?? [], id);
221
+ if (nested) return nested;
222
+ }
223
+ return undefined;
224
+ }
225
+
226
+ exports.addNavItem = addNavItem;
227
+ exports.applyNavigationEdits = applyNavigationEdits;
228
+ exports.setApplicationLogo = setApplicationLogo;
229
+ exports.switchRegionMode = switchRegionMode;
230
+ //# sourceMappingURL=navigationEdits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationEdits.js","sources":["../../../navigation/navigationEdits.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 { ApplicationLogo, NavigationModel, NavigationRegion, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';\nimport { NavigationEdit } from './NavigationEdit';\nimport { NavigationEditKind } from './NavigationEditKind';\nimport { NavigationEditOutcome } from './NavigationEditOutcome';\nimport { NavigationEditPlan } from './NavigationEditPlan';\nimport { applicationItems, collectItemIds, findModuleNavigation, findNavigationRegion, modeOfModuleRegion } from './navigationRegions';\n\nconst noMode = 'The application is the base of the navigation and has no region mode.';\nconst logoLevel = 'The logo is defined at the application level only.';\nconst flatTopbar = 'A topbar is flat; only a sidebar item has sub-items.';\n\n/**\n * Plans a change of a module region's mode. Switching to `inherit` clears the module's items (NAV3); switching from\n * `inherit` to `override` with `copy` first copies the application's items so the module starts from them (NAV5).\n * @param navigation The navigation as it is.\n * @param module The module whose region changes; the application has no mode and is refused.\n * @param region The region.\n * @param mode The mode to switch to.\n * @param options `copy` copies the application items when switching from inherit to override.\n */\nexport function switchRegionMode(\n navigation: NavigationModel,\n module: string | undefined,\n region: NavigationRegionKind,\n mode: NavigationRegionMode,\n options: { copy?: boolean } = {},\n): NavigationEditPlan {\n if (module === undefined) return { edits: [], rejected: noMode };\n\n const current = modeOfModuleRegion(navigation, module, region);\n if (current === mode) return { edits: [] };\n\n const setMode: NavigationEdit = { kind: NavigationEditKind.SetRegionMode, module, region, mode };\n if (mode === NavigationRegionMode.Inherit) {\n return { edits: [{ kind: NavigationEditKind.SetRegionItems, module, region, items: [] }, setMode] };\n }\n\n if (mode === NavigationRegionMode.Override && current === NavigationRegionMode.Inherit && options.copy === true) {\n return { edits: [{ kind: NavigationEditKind.SetRegionItems, module, region, items: structuredClone(applicationItems(navigation.application, region)) }, setMode] };\n }\n\n return { edits: [setMode] };\n}\n\n/**\n * Plans adding an item to a region, after the ones already there. Adding to an inheriting module region first\n * switches it to `extend` (NAV6), so the application's items stay and the new item follows them.\n * @param navigation The navigation as it is.\n * @param module The module that gets the item; undefined for the application.\n * @param region The region.\n * @param item The item to add.\n * @param parent The id of the item it becomes a sub-item of; sidebar only.\n */\nexport function addNavItem(\n navigation: NavigationModel,\n module: string | undefined,\n region: NavigationRegionKind,\n item: NavItem,\n parent?: string,\n): NavigationEditPlan {\n if (parent !== undefined && region !== NavigationRegionKind.Sidebar) return { edits: [], rejected: flatTopbar };\n\n const own = ownItems(navigation, module, region);\n const ids = collectItemIds(own, region);\n if (ids.includes(item.id)) return { edits: [], rejected: `Navigation item id '${item.id}' is already used in this region.` };\n if (parent !== undefined && !ids.includes(parent)) return { edits: [], rejected: `There is no item '${parent}' to add a sub-item to.` };\n\n const add: NavigationEdit = { kind: NavigationEditKind.AddItem, module, region, item: structuredClone(item) };\n if (parent !== undefined) add.parent = parent;\n if (module !== undefined && modeOfModuleRegion(navigation, module, region) === NavigationRegionMode.Inherit) {\n return { edits: [{ kind: NavigationEditKind.SetRegionMode, module, region, mode: NavigationRegionMode.Extend }, add] };\n }\n\n return { edits: [add] };\n}\n\n/**\n * Plans setting the logo. The logo is defined at the application level only, so a module is refused.\n * @param navigation The navigation as it is.\n * @param module The module asking; only undefined (the application) is allowed.\n * @param logo The logo.\n */\nexport function setApplicationLogo(navigation: NavigationModel, module: string | undefined, logo: ApplicationLogo): NavigationEditPlan {\n void navigation;\n return module === undefined ? { edits: [{ kind: NavigationEditKind.SetLogo, logo: { ...logo } }] } : { edits: [], rejected: logoLevel };\n}\n\n/**\n * Applies navigation edits to a copy of the model. Either every edit applies, or none does.\n * @param navigation The navigation as it is; never changed.\n * @param edits The edits, in order.\n */\nexport function applyNavigationEdits(navigation: NavigationModel, edits: NavigationEdit[]): NavigationEditOutcome {\n const model = structuredClone(navigation);\n for (const edit of edits) {\n const rejected = apply(model, edit);\n if (rejected !== undefined) return { applied: false, model: navigation, rejected };\n }\n\n return { applied: true, model };\n}\n\nfunction ownItems(navigation: NavigationModel, module: string | undefined, region: NavigationRegionKind): NavItem[] {\n return module === undefined\n ? applicationItems(navigation.application, region)\n : findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];\n}\n\nfunction regionOf(model: NavigationModel, module: string | undefined, region: NavigationRegionKind): NavigationRegion {\n let regions: NavigationRegion[];\n if (module === undefined) {\n regions = model.application.regions;\n } else {\n let block = findModuleNavigation(model, module);\n if (!block) {\n block = { module, regions: [] };\n model.modules.push(block);\n }\n\n regions = block.regions;\n }\n\n let found = findNavigationRegion(regions, region);\n if (!found) {\n found = { region, items: [] };\n regions.push(found);\n }\n\n return found;\n}\n\nfunction apply(model: NavigationModel, edit: NavigationEdit): string | undefined {\n switch (edit.kind) {\n case NavigationEditKind.SetRegionMode:\n if (edit.module === undefined) return noMode;\n regionOf(model, edit.module, edit.region!).mode = edit.mode;\n return undefined;\n case NavigationEditKind.SetRegionItems:\n regionOf(model, edit.module, edit.region!).items = structuredClone(edit.items ?? []);\n return undefined;\n case NavigationEditKind.AddItem: {\n const target = regionOf(model, edit.module, edit.region!);\n const item = structuredClone(edit.item!);\n if (collectItemIds(target.items, target.region).includes(item.id)) return `Navigation item id '${item.id}' is already used in this region.`;\n if (edit.parent === undefined) {\n target.items.push(item);\n return undefined;\n }\n\n if (target.region !== NavigationRegionKind.Sidebar) return flatTopbar;\n const owner = findItem(target.items, edit.parent);\n if (!owner) return `There is no item '${edit.parent}' to add a sub-item to.`;\n (owner.children ??= []).push(item);\n return undefined;\n }\n case NavigationEditKind.SetLogo:\n if (edit.module !== undefined) return logoLevel;\n model.application.logo = { ...edit.logo! };\n return undefined;\n default:\n return `'${String((edit as NavigationEdit).kind)}' is not a navigation edit.`;\n }\n}\n\nfunction findItem(items: NavItem[], id: string): NavItem | undefined {\n for (const item of items) {\n if (item.id === id) return item;\n const nested = findItem(item.children ?? [], id);\n if (nested) return nested;\n }\n\n return undefined;\n}\n"],"names":["noMode","logoLevel","flatTopbar","switchRegionMode","navigation","module","region","mode","options","undefined","edits","rejected","current","modeOfModuleRegion","setMode","kind","NavigationEditKind","SetRegionMode","NavigationRegionMode","Inherit","SetRegionItems","items","Override","copy","structuredClone","applicationItems","application","addNavItem","item","parent","NavigationRegionKind","Sidebar","own","ownItems","ids","collectItemIds","includes","id","add","AddItem","Extend","setApplicationLogo","logo","SetLogo","applyNavigationEdits","model","edit","apply","applied","findNavigationRegion","findModuleNavigation","regions","regionOf","block","modules","push","found","target","owner","findItem","children","String","nested"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /** The regions in the order every result lists them. */ const navigationRegionOrder = [
8
+ scene_model.NavigationRegionKind.Topbar,
9
+ scene_model.NavigationRegionKind.Sidebar
10
+ ];
11
+ /** The slot an item renders into when it names none: the primary outlet. */ const primarySlot = 'content';
12
+ /**
13
+ * Finds the items a level defines for a region.
14
+ * @param regions The regions of the application or of a module.
15
+ * @param region The region to look for.
16
+ */ function findNavigationRegion(regions, region) {
17
+ return regions?.find((candidate)=>candidate.region === region);
18
+ }
19
+ /** Finds what a module declares; undefined when it declares nothing. */ function findModuleNavigation(navigation, module) {
20
+ return navigation.modules.find((candidate)=>candidate.module === module);
21
+ }
22
+ /** The mode of a module's region: `inherit` when the module does not declare the region or its mode. */ function modeOfModuleRegion(navigation, module, region) {
23
+ return findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.mode ?? scene_model.NavigationRegionMode.Inherit;
24
+ }
25
+ /** The application-level items of a region. */ function applicationItems(application, region) {
26
+ return findNavigationRegion(application.regions, region)?.items ?? [];
27
+ }
28
+ /** Every id in a list of items, depth first. Sub-items count only in the sidebar. */ function collectItemIds(items, region) {
29
+ return items.flatMap((item)=>[
30
+ item.id,
31
+ ...region === scene_model.NavigationRegionKind.Sidebar ? collectItemIds(item.children ?? [], region) : []
32
+ ]);
33
+ }
34
+
35
+ exports.applicationItems = applicationItems;
36
+ exports.collectItemIds = collectItemIds;
37
+ exports.findModuleNavigation = findModuleNavigation;
38
+ exports.findNavigationRegion = findNavigationRegion;
39
+ exports.modeOfModuleRegion = modeOfModuleRegion;
40
+ exports.navigationRegionOrder = navigationRegionOrder;
41
+ exports.primarySlot = primarySlot;
42
+ //# sourceMappingURL=navigationRegions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationRegions.js","sources":["../../../navigation/navigationRegions.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 { ApplicationNavigation, ModuleNavigation, NavigationModel, NavigationRegion, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';\n\n/** The regions in the order every result lists them. */\nexport const navigationRegionOrder: NavigationRegionKind[] = [NavigationRegionKind.Topbar, NavigationRegionKind.Sidebar];\n\n/** The slot an item renders into when it names none: the primary outlet. */\nexport const primarySlot = 'content';\n\n/**\n * Finds the items a level defines for a region.\n * @param regions The regions of the application or of a module.\n * @param region The region to look for.\n */\nexport function findNavigationRegion(regions: NavigationRegion[] | undefined, region: NavigationRegionKind): NavigationRegion | undefined {\n return regions?.find(candidate => candidate.region === region);\n}\n\n/** Finds what a module declares; undefined when it declares nothing. */\nexport function findModuleNavigation(navigation: NavigationModel, module: string): ModuleNavigation | undefined {\n return navigation.modules.find(candidate => candidate.module === module);\n}\n\n/** The mode of a module's region: `inherit` when the module does not declare the region or its mode. */\nexport function modeOfModuleRegion(navigation: NavigationModel, module: string, region: NavigationRegionKind): NavigationRegionMode {\n return findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.mode ?? NavigationRegionMode.Inherit;\n}\n\n/** The application-level items of a region. */\nexport function applicationItems(application: ApplicationNavigation, region: NavigationRegionKind): NavItem[] {\n return findNavigationRegion(application.regions, region)?.items ?? [];\n}\n\n/** Every id in a list of items, depth first. Sub-items count only in the sidebar. */\nexport function collectItemIds(items: NavItem[], region: NavigationRegionKind): string[] {\n return items.flatMap(item => [item.id, ...(region === NavigationRegionKind.Sidebar ? collectItemIds(item.children ?? [], region) : [])]);\n}\n"],"names":["navigationRegionOrder","NavigationRegionKind","Topbar","Sidebar","primarySlot","findNavigationRegion","regions","region","find","candidate","findModuleNavigation","navigation","module","modules","modeOfModuleRegion","mode","NavigationRegionMode","Inherit","applicationItems","application","items","collectItemIds","flatMap","item","id","children"],"mappings":";;;;AAAA;AACA;AAIA,yDACO,MAAMA,qBAAAA,GAAgD;AAACC,IAAAA,gCAAAA,CAAqBC,MAAM;AAAED,IAAAA,gCAAAA,CAAqBE;;AAEhH,6EACO,MAAMC,WAAAA,GAAc;AAE3B;;;;AAIC,IACM,SAASC,oBAAAA,CAAqBC,OAAuC,EAAEC,MAA4B,EAAA;AACtG,IAAA,OAAOD,SAASE,IAAAA,CAAKC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUF,MAAM,KAAKA,MAAAA,CAAAA;AAC3D;AAEA,yEACO,SAASG,oBAAAA,CAAqBC,UAA2B,EAAEC,MAAc,EAAA;IAC5E,OAAOD,UAAAA,CAAWE,OAAO,CAACL,IAAI,CAACC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUG,MAAM,KAAKA,MAAAA,CAAAA;AACrE;AAEA,yGACO,SAASE,kBAAAA,CAAmBH,UAA2B,EAAEC,MAAc,EAAEL,MAA4B,EAAA;IACxG,OAAOF,oBAAAA,CAAqBK,qBAAqBC,UAAAA,EAAYC,MAAAA,CAAAA,EAASN,SAASC,MAAAA,CAAAA,EAASQ,IAAAA,IAAQC,iCAAqBC,OAAO;AAChI;AAEA,gDACO,SAASC,gBAAAA,CAAiBC,WAAkC,EAAEZ,MAA4B,EAAA;AAC7F,IAAA,OAAOF,qBAAqBc,WAAAA,CAAYb,OAAO,EAAEC,MAAAA,CAAAA,EAASa,SAAS,EAAE;AACzE;AAEA,sFACO,SAASC,cAAAA,CAAeD,KAAgB,EAAEb,MAA4B,EAAA;AACzE,IAAA,OAAOa,KAAAA,CAAME,OAAO,CAACC,CAAAA,IAAAA,GAAQ;AAACA,YAAAA,IAAAA,CAAKC,EAAE;eAAMjB,MAAAA,KAAWN,gCAAAA,CAAqBE,OAAO,GAAGkB,cAAAA,CAAeE,IAAAA,CAAKE,QAAQ,IAAI,EAAE,EAAElB,MAAAA,CAAAA,GAAU;AAAI,SAAA,CAAA;AAC3I;;;;;;;;"}
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var diagnoseNavigation = require('./navigation/diagnoseNavigation.js');
4
+ require('./navigation/navigationRegions.js');
5
+ require('@cratis/scene.model');
4
6
 
5
7
  // Copyright (c) Cratis. All rights reserved.
6
8
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -1 +1 @@
1
- {"version":3,"file":"validateNavigationDestinations.js","sources":["../../validateNavigationDestinations.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 { DestinationReference, DialogTemplate, Layout, Screen, ScreenTemplate } from '@cratis/scene.model';\nimport { NavigationDiagnostic, diagnoseNavigation } from './navigation';\n\n/**\n * A navigation problem as {@link validateNavigationDestinations} reports it.\n */\nexport type NavigationDestinationDiagnostic = NavigationDiagnostic;\n\n/**\n * Validates destinations against the outlet/route declarations owned by layouts and templates, and - when\n * the screens and dialog templates are given - against the targets that actually exist.\n *\n * A shorthand for {@link diagnoseNavigation} over destinations without entry identities.\n */\nexport function validateNavigationDestinations(\n destinations: DestinationReference[],\n surfaces: { layouts?: Layout[]; screenTemplates?: ScreenTemplate[]; screens?: Screen[]; dialogTemplates?: DialogTemplate[] } = {},\n): NavigationDestinationDiagnostic[] {\n return diagnoseNavigation({ entries: destinations.map(destination => ({ destination })), ...surfaces });\n}\n"],"names":["validateNavigationDestinations","destinations","surfaces","diagnoseNavigation","entries","map","destination"],"mappings":";;;;AAAA;AACA;AAUA;;;;;AAKC,IACM,SAASA,8BAAAA,CACZC,YAAoC,EACpCC,QAAAA,GAA+H,EAAE,EAAA;AAEjI,IAAA,OAAOC,qCAAAA,CAAmB;AAAEC,QAAAA,OAAAA,EAASH,YAAAA,CAAaI,GAAG,CAACC,CAAAA,eAAgB;AAAEA,gBAAAA;aAAY,CAAA,CAAA;AAAK,QAAA,GAAGJ;AAAS,KAAA,CAAA;AACzG;;"}
1
+ {"version":3,"file":"validateNavigationDestinations.js","sources":["../../validateNavigationDestinations.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 { DestinationReference, DialogTemplate, Layout, Screen, ScreenTemplate } from '@cratis/scene.model';\nimport { NavigationDiagnostic, diagnoseNavigation } from './navigation';\n\n/**\n * A navigation problem as {@link validateNavigationDestinations} reports it.\n */\nexport type NavigationDestinationDiagnostic = NavigationDiagnostic;\n\n/**\n * Validates destinations against the outlet/route declarations owned by layouts and templates, and - when\n * the screens and dialog templates are given - against the targets that actually exist.\n *\n * A shorthand for {@link diagnoseNavigation} over destinations without entry identities.\n */\nexport function validateNavigationDestinations(\n destinations: DestinationReference[],\n surfaces: { layouts?: Layout[]; screenTemplates?: ScreenTemplate[]; screens?: Screen[]; dialogTemplates?: DialogTemplate[] } = {},\n): NavigationDestinationDiagnostic[] {\n return diagnoseNavigation({ entries: destinations.map(destination => ({ destination })), ...surfaces });\n}\n"],"names":["validateNavigationDestinations","destinations","surfaces","diagnoseNavigation","entries","map","destination"],"mappings":";;;;;;AAAA;AACA;AAUA;;;;;AAKC,IACM,SAASA,8BAAAA,CACZC,YAAoC,EACpCC,QAAAA,GAA+H,EAAE,EAAA;AAEjI,IAAA,OAAOC,qCAAAA,CAAmB;AAAEC,QAAAA,OAAAA,EAASH,YAAAA,CAAaI,GAAG,CAACC,CAAAA,eAAgB;AAAEA,gBAAAA;aAAY,CAAA,CAAA;AAAK,QAAA,GAAGJ;AAAS,KAAA,CAAA;AACzG;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveEffectiveConfiguration.d.ts","sourceRoot":"","sources":["../../../editing/resolveEffectiveConfiguration.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,sBAAsB,EAA0B,oBAAoB,EACvE,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAA2B,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAoGhD,wBAAgB,6BAA6B,CACzC,aAAa,EAAE,aAAa,EAC5B,qBAAqB,EAAE,oBAAoB,EAAE,EAC7C,OAAO,EAAE,iBAAiB,GAC3B,sBAAsB,CAiGxB"}
1
+ {"version":3,"file":"resolveEffectiveConfiguration.d.ts","sourceRoot":"","sources":["../../../editing/resolveEffectiveConfiguration.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,sBAAsB,EAA0B,oBAAoB,EACvE,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAA2B,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiHhD,wBAAgB,6BAA6B,CACzC,aAAa,EAAE,aAAa,EAC5B,qBAAqB,EAAE,oBAAoB,EAAE,EAC7C,OAAO,EAAE,iBAAiB,GAC3B,sBAAsB,CAiGxB"}
@@ -52,6 +52,14 @@ function collectionValue(grant, matching, instance, items, diagnostics) {
52
52
  diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionTypeMismatch, `The saved value of '${grant.path}' set by '${instance}' is ignored: a collection takes items.`, context));
53
53
  continue;
54
54
  }
55
+ if (contribution.replaceOwnerItems === true) {
56
+ if (!grant.operations.includes(CollectionOperation.Replace)) {
57
+ diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionOperationNotPermitted, `'${instance}' replaces the items it inherits in '${grant.path}', but replacing items is not exposed. It is ignored and kept.`, context));
58
+ continue;
59
+ }
60
+ items.splice(0, items.length);
61
+ contributed = true;
62
+ }
55
63
  if (contribution.items.length > 0 && !grant.operations.includes(CollectionOperation.Add)) {
56
64
  diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionOperationNotPermitted, `'${instance}' has items in '${grant.path}', but adding items is not exposed. They are ignored and kept.`, context));
57
65
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"resolveEffectiveConfiguration.js","sources":["../../../editing/resolveEffectiveConfiguration.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 CollectionOperation, DiagnosticCode, EffectiveCollectionItem, EffectiveComponentConfiguration,\n EffectiveConfiguration, EffectivePropertyValue, InstanceContribution, PropertyValueType, SceneDiagnostic, ValueSource,\n} from '@cratis/scene.model';\nimport { DescriptorCatalog, findComponentDescriptor } from './DescriptorCatalog';\nimport { errorDiagnostic } from './diagnostics';\nimport { computeExposureGrants, ExposureGrant, grantKey } from './exposureGrants';\nimport { cloneData, getValueAtPath, setValueAtPath } from './pathAccess';\nimport { TemplateChain } from './TemplateChain';\nimport { validateItemValues, validateValue } from './validateValue';\n\n/**\n * Splits a flat collection item as it is stored on an element - `{ id, label, ... }` - into its id and fields.\n */\nfunction toEffectiveItem(item: unknown, index: number): EffectiveCollectionItem {\n const { id, ...values } = (item !== null && typeof item === 'object' ? item : {}) as Record<string, unknown>;\n return { id: typeof id === 'string' && id.length > 0 ? id : `owner-${index}`, values, origin: 'owner', fixed: true };\n}\n\nfunction toFlatItem(item: EffectiveCollectionItem): Record<string, unknown> {\n return { id: item.id, ...item.values };\n}\n\nfunction scalarValue(grant: ExposureGrant, matching: InstanceContribution[], instance: string, current: EffectivePropertyValue, diagnostics: SceneDiagnostic[]): void {\n for (const contribution of matching) {\n const problem = contribution.value === undefined ? 'a value is required' : validateValue(grant.descriptor, contribution.value);\n if (problem) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTypeMismatch,\n `The saved value of '${grant.path}' set by '${instance}' is ignored: ${problem}. It is kept, and applies again when it fits.`,\n { instance, component: grant.component, path: grant.path }));\n continue;\n }\n\n current.value = contribution.value;\n current.source = ValueSource.Instance;\n current.contributedBy = instance;\n }\n}\n\nfunction collectionValue(grant: ExposureGrant, matching: InstanceContribution[], instance: string, items: EffectiveCollectionItem[], diagnostics: SceneDiagnostic[]): boolean {\n let contributed = false;\n\n for (const contribution of matching) {\n const context = { instance, component: grant.component, path: grant.path };\n if (contribution.items === undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionTypeMismatch, `The saved value of '${grant.path}' set by '${instance}' is ignored: a collection takes items.`, context));\n continue;\n }\n\n if (contribution.items.length > 0 && !grant.operations.includes(CollectionOperation.Add)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionOperationNotPermitted,\n `'${instance}' has items in '${grant.path}', but adding items is not exposed. They are ignored and kept.`,\n context));\n continue;\n }\n\n for (const item of contribution.items) {\n const itemContext = { ...context, itemId: item.id };\n if (items.some(existing => existing.id === item.id)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.DuplicateCollectionItem, `The item id '${item.id}' in '${grant.path}' is already used.`, itemContext));\n continue;\n }\n\n const values: Record<string, unknown> = {};\n for (const [field, value] of Object.entries(item.values)) {\n if (grant.editableFields !== undefined && !grant.editableFields.includes(field)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionOperationNotPermitted, `The field '${field}' of '${grant.path}' is not exposed for editing.`, itemContext));\n continue;\n }\n\n const problem = validateItemValues(grant.descriptor.item, { [field]: value }).find(candidate => candidate.field === field);\n if (problem) {\n diagnostics.push(errorDiagnostic(\n problem.problem.startsWith('is not a field') ? DiagnosticCode.UnknownCollectionField : DiagnosticCode.ContributionTypeMismatch,\n `The field '${field}' of an item in '${grant.path}' is ignored: ${problem.problem}.`,\n itemContext));\n continue;\n }\n\n values[field] = value;\n }\n\n items.push({ id: item.id, values, origin: instance, fixed: false });\n contributed = true;\n }\n }\n\n return contributed;\n}\n\n/**\n * Resolves what every configurable component in a template chain is worth: the owner's own values, with each\n * instance's contributions applied in nesting order.\n *\n * This is the one merge. The editor shows its result and the runtime renders from it, so what an author sees is\n * what Play renders. Order is fixed: the owner's value first, then each level from the outermost inwards, so a\n * later level wins a scalar and appends to a collection after the earlier ones.\n *\n * Nothing in the persisted data is changed. A contribution that cannot apply - the exposure was withdrawn, the\n * property's type changed, the component is gone - is reported in `diagnostics` and left out of the result, and\n * stays in `instanceContributions`, so restoring the exposure brings its value back.\n *\n * @param templateChain The nesting, from {@link resolveTemplateChain} or built by hand.\n * @param instanceContributions What each instance has set.\n * @param catalog The descriptors saying what each component supports.\n */\nexport function resolveEffectiveConfiguration(\n templateChain: TemplateChain,\n instanceContributions: InstanceContribution[],\n catalog: DescriptorCatalog,\n): EffectiveConfiguration {\n const grants = computeExposureGrants(templateChain, catalog);\n const diagnostics: SceneDiagnostic[] = [...templateChain.diagnostics, ...grants.diagnostics];\n const handled = new Set<InstanceContribution>();\n const components = new Map<string, EffectiveComponentConfiguration>();\n\n for (const grant of grants.exposed) {\n const owner = templateChain.levels[grant.ownerLevel];\n const element = owner.elements.find(candidate => candidate.id === grant.component)!;\n\n let configuration = components.get(grant.component);\n if (!configuration) {\n configuration = { component: grant.component, owner: owner.owner, properties: cloneData(element.properties), values: [] };\n components.set(grant.component, configuration);\n }\n\n const stored = getValueAtPath(element.properties, grant.path);\n const base = stored === undefined ? cloneData(grant.descriptor.default) : cloneData(stored);\n const isCollection = grant.descriptor.valueType === PropertyValueType.Collection;\n const baseItems = isCollection && Array.isArray(base) ? base.map(toEffectiveItem) : [];\n const items = [...baseItems];\n\n const current: EffectivePropertyValue = {\n path: grant.path,\n value: base,\n source: stored === undefined ? ValueSource.Default : ValueSource.Local,\n inheritedValue: base,\n };\n let contributed = false;\n\n for (let index = grant.ownerLevel + 1; index < templateChain.levels.length; index++) {\n const instance = templateChain.levels[index].instance;\n if (!grants.byInstance.get(instance)?.has(grantKey(grant.component, grant.path))) continue;\n\n const effectiveGrant = grants.byInstance.get(instance)!.get(grantKey(grant.component, grant.path))!;\n const matching = instanceContributions.filter(contribution =>\n contribution.instance === instance && contribution.component === grant.component && contribution.path === grant.path);\n for (const contribution of matching) handled.add(contribution);\n\n if (isCollection) {\n if (collectionValue(effectiveGrant, matching, instance, items, diagnostics)) {\n contributed = true;\n current.contributedBy = instance;\n }\n } else {\n scalarValue(effectiveGrant, matching, instance, current, diagnostics);\n }\n }\n\n const maximumItems = grant.descriptor.constraints?.maximumItems;\n if (isCollection && maximumItems !== undefined && items.length > maximumItems) {\n // Saved items that no longer fit - the owner lowered the limit after they were added - are left out of\n // the result in order and kept in the saved data, like any other saved value that no longer fits.\n const dropped = items.splice(maximumItems);\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTypeMismatch,\n `'${grant.path}' on '${grant.component}' allows at most ${maximumItems} items; ${dropped.map(item => `'${item.id}'`).join(', ')} ${dropped.length === 1 ? 'is' : 'are'} ignored and kept.`,\n { instance: current.contributedBy ?? owner.instance, component: grant.component, path: grant.path }));\n }\n\n if (isCollection) {\n current.items = items;\n current.inheritedValue = baseItems.map(toFlatItem);\n current.value = items.map(toFlatItem);\n if (contributed) current.source = ValueSource.Instance;\n }\n\n if (current.value !== undefined) setValueAtPath(configuration.properties, grant.path, current.value);\n configuration.values.push(current);\n }\n\n const levelOf = new Map(templateChain.levels.map((chainLevel, index) => [chainLevel.instance, index]));\n for (const contribution of instanceContributions) {\n const contributorLevel = levelOf.get(contribution.instance);\n if (contributorLevel === undefined || handled.has(contribution)) continue;\n\n const context = { instance: contribution.instance, component: contribution.component, path: contribution.path };\n const owner = templateChain.levels.slice(0, contributorLevel).find(chainLevel => chainLevel.elements.some(element => element.id === contribution.component));\n if (!owner) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTargetMissing,\n `'${contribution.instance}' has saved values for '${contribution.component}', which is not in any layout or template above it. They are kept.`,\n context));\n } else if (!findComponentDescriptor(catalog, owner.elements.find(element => element.id === contribution.component)!.componentName)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.MissingComponentDescriptor,\n `'${contribution.instance}' has saved values for '${contribution.component}', but nothing describes that component any more. They are kept.`,\n context));\n } else {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionNotExposed,\n `'${contribution.instance}' has a saved value for '${contribution.path}' on '${contribution.component}', which is not exposed to it. It is ignored and kept.`,\n context));\n }\n }\n\n return { components: [...components.values()], diagnostics };\n}\n"],"names":["toEffectiveItem","item","index","id","values","length","origin","fixed","toFlatItem","scalarValue","grant","matching","instance","current","diagnostics","contribution","problem","value","undefined","validateValue","descriptor","push","errorDiagnostic","DiagnosticCode","ContributionTypeMismatch","path","component","source","ValueSource","Instance","contributedBy","collectionValue","items","contributed","context","operations","includes","CollectionOperation","Add","ContributionOperationNotPermitted","itemContext","itemId","some","existing","DuplicateCollectionItem","field","Object","entries","editableFields","validateItemValues","find","candidate","startsWith","UnknownCollectionField","resolveEffectiveConfiguration","templateChain","instanceContributions","catalog","grants","computeExposureGrants","handled","Set","components","Map","exposed","owner","levels","ownerLevel","element","elements","configuration","get","properties","cloneData","set","stored","getValueAtPath","base","default","isCollection","valueType","PropertyValueType","Collection","baseItems","Array","isArray","map","Default","Local","inheritedValue","byInstance","has","grantKey","effectiveGrant","filter","add","maximumItems","constraints","dropped","splice","join","setValueAtPath","levelOf","chainLevel","contributorLevel","slice","ContributionTargetMissing","findComponentDescriptor","componentName","MissingComponentDescriptor","ContributionNotExposed"],"mappings":"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"}
1
+ {"version":3,"file":"resolveEffectiveConfiguration.js","sources":["../../../editing/resolveEffectiveConfiguration.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 CollectionOperation, DiagnosticCode, EffectiveCollectionItem, EffectiveComponentConfiguration,\n EffectiveConfiguration, EffectivePropertyValue, InstanceContribution, PropertyValueType, SceneDiagnostic, ValueSource,\n} from '@cratis/scene.model';\nimport { DescriptorCatalog, findComponentDescriptor } from './DescriptorCatalog';\nimport { errorDiagnostic } from './diagnostics';\nimport { computeExposureGrants, ExposureGrant, grantKey } from './exposureGrants';\nimport { cloneData, getValueAtPath, setValueAtPath } from './pathAccess';\nimport { TemplateChain } from './TemplateChain';\nimport { validateItemValues, validateValue } from './validateValue';\n\n/**\n * Splits a flat collection item as it is stored on an element - `{ id, label, ... }` - into its id and fields.\n */\nfunction toEffectiveItem(item: unknown, index: number): EffectiveCollectionItem {\n const { id, ...values } = (item !== null && typeof item === 'object' ? item : {}) as Record<string, unknown>;\n return { id: typeof id === 'string' && id.length > 0 ? id : `owner-${index}`, values, origin: 'owner', fixed: true };\n}\n\nfunction toFlatItem(item: EffectiveCollectionItem): Record<string, unknown> {\n return { id: item.id, ...item.values };\n}\n\nfunction scalarValue(grant: ExposureGrant, matching: InstanceContribution[], instance: string, current: EffectivePropertyValue, diagnostics: SceneDiagnostic[]): void {\n for (const contribution of matching) {\n const problem = contribution.value === undefined ? 'a value is required' : validateValue(grant.descriptor, contribution.value);\n if (problem) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTypeMismatch,\n `The saved value of '${grant.path}' set by '${instance}' is ignored: ${problem}. It is kept, and applies again when it fits.`,\n { instance, component: grant.component, path: grant.path }));\n continue;\n }\n\n current.value = contribution.value;\n current.source = ValueSource.Instance;\n current.contributedBy = instance;\n }\n}\n\nfunction collectionValue(grant: ExposureGrant, matching: InstanceContribution[], instance: string, items: EffectiveCollectionItem[], diagnostics: SceneDiagnostic[]): boolean {\n let contributed = false;\n\n for (const contribution of matching) {\n const context = { instance, component: grant.component, path: grant.path };\n if (contribution.items === undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionTypeMismatch, `The saved value of '${grant.path}' set by '${instance}' is ignored: a collection takes items.`, context));\n continue;\n }\n\n if (contribution.replaceOwnerItems === true) {\n if (!grant.operations.includes(CollectionOperation.Replace)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionOperationNotPermitted,\n `'${instance}' replaces the items it inherits in '${grant.path}', but replacing items is not exposed. It is ignored and kept.`,\n context));\n continue;\n }\n\n items.splice(0, items.length);\n contributed = true;\n }\n\n if (contribution.items.length > 0 && !grant.operations.includes(CollectionOperation.Add)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionOperationNotPermitted,\n `'${instance}' has items in '${grant.path}', but adding items is not exposed. They are ignored and kept.`,\n context));\n continue;\n }\n\n for (const item of contribution.items) {\n const itemContext = { ...context, itemId: item.id };\n if (items.some(existing => existing.id === item.id)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.DuplicateCollectionItem, `The item id '${item.id}' in '${grant.path}' is already used.`, itemContext));\n continue;\n }\n\n const values: Record<string, unknown> = {};\n for (const [field, value] of Object.entries(item.values)) {\n if (grant.editableFields !== undefined && !grant.editableFields.includes(field)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContributionOperationNotPermitted, `The field '${field}' of '${grant.path}' is not exposed for editing.`, itemContext));\n continue;\n }\n\n const problem = validateItemValues(grant.descriptor.item, { [field]: value }).find(candidate => candidate.field === field);\n if (problem) {\n diagnostics.push(errorDiagnostic(\n problem.problem.startsWith('is not a field') ? DiagnosticCode.UnknownCollectionField : DiagnosticCode.ContributionTypeMismatch,\n `The field '${field}' of an item in '${grant.path}' is ignored: ${problem.problem}.`,\n itemContext));\n continue;\n }\n\n values[field] = value;\n }\n\n items.push({ id: item.id, values, origin: instance, fixed: false });\n contributed = true;\n }\n }\n\n return contributed;\n}\n\n/**\n * Resolves what every configurable component in a template chain is worth: the owner's own values, with each\n * instance's contributions applied in nesting order.\n *\n * This is the one merge. The editor shows its result and the runtime renders from it, so what an author sees is\n * what Play renders. Order is fixed: the owner's value first, then each level from the outermost inwards, so a\n * later level wins a scalar and appends to a collection after the earlier ones.\n *\n * Nothing in the persisted data is changed. A contribution that cannot apply - the exposure was withdrawn, the\n * property's type changed, the component is gone - is reported in `diagnostics` and left out of the result, and\n * stays in `instanceContributions`, so restoring the exposure brings its value back.\n *\n * @param templateChain The nesting, from {@link resolveTemplateChain} or built by hand.\n * @param instanceContributions What each instance has set.\n * @param catalog The descriptors saying what each component supports.\n */\nexport function resolveEffectiveConfiguration(\n templateChain: TemplateChain,\n instanceContributions: InstanceContribution[],\n catalog: DescriptorCatalog,\n): EffectiveConfiguration {\n const grants = computeExposureGrants(templateChain, catalog);\n const diagnostics: SceneDiagnostic[] = [...templateChain.diagnostics, ...grants.diagnostics];\n const handled = new Set<InstanceContribution>();\n const components = new Map<string, EffectiveComponentConfiguration>();\n\n for (const grant of grants.exposed) {\n const owner = templateChain.levels[grant.ownerLevel];\n const element = owner.elements.find(candidate => candidate.id === grant.component)!;\n\n let configuration = components.get(grant.component);\n if (!configuration) {\n configuration = { component: grant.component, owner: owner.owner, properties: cloneData(element.properties), values: [] };\n components.set(grant.component, configuration);\n }\n\n const stored = getValueAtPath(element.properties, grant.path);\n const base = stored === undefined ? cloneData(grant.descriptor.default) : cloneData(stored);\n const isCollection = grant.descriptor.valueType === PropertyValueType.Collection;\n const baseItems = isCollection && Array.isArray(base) ? base.map(toEffectiveItem) : [];\n const items = [...baseItems];\n\n const current: EffectivePropertyValue = {\n path: grant.path,\n value: base,\n source: stored === undefined ? ValueSource.Default : ValueSource.Local,\n inheritedValue: base,\n };\n let contributed = false;\n\n for (let index = grant.ownerLevel + 1; index < templateChain.levels.length; index++) {\n const instance = templateChain.levels[index].instance;\n if (!grants.byInstance.get(instance)?.has(grantKey(grant.component, grant.path))) continue;\n\n const effectiveGrant = grants.byInstance.get(instance)!.get(grantKey(grant.component, grant.path))!;\n const matching = instanceContributions.filter(contribution =>\n contribution.instance === instance && contribution.component === grant.component && contribution.path === grant.path);\n for (const contribution of matching) handled.add(contribution);\n\n if (isCollection) {\n if (collectionValue(effectiveGrant, matching, instance, items, diagnostics)) {\n contributed = true;\n current.contributedBy = instance;\n }\n } else {\n scalarValue(effectiveGrant, matching, instance, current, diagnostics);\n }\n }\n\n const maximumItems = grant.descriptor.constraints?.maximumItems;\n if (isCollection && maximumItems !== undefined && items.length > maximumItems) {\n // Saved items that no longer fit - the owner lowered the limit after they were added - are left out of\n // the result in order and kept in the saved data, like any other saved value that no longer fits.\n const dropped = items.splice(maximumItems);\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTypeMismatch,\n `'${grant.path}' on '${grant.component}' allows at most ${maximumItems} items; ${dropped.map(item => `'${item.id}'`).join(', ')} ${dropped.length === 1 ? 'is' : 'are'} ignored and kept.`,\n { instance: current.contributedBy ?? owner.instance, component: grant.component, path: grant.path }));\n }\n\n if (isCollection) {\n current.items = items;\n current.inheritedValue = baseItems.map(toFlatItem);\n current.value = items.map(toFlatItem);\n if (contributed) current.source = ValueSource.Instance;\n }\n\n if (current.value !== undefined) setValueAtPath(configuration.properties, grant.path, current.value);\n configuration.values.push(current);\n }\n\n const levelOf = new Map(templateChain.levels.map((chainLevel, index) => [chainLevel.instance, index]));\n for (const contribution of instanceContributions) {\n const contributorLevel = levelOf.get(contribution.instance);\n if (contributorLevel === undefined || handled.has(contribution)) continue;\n\n const context = { instance: contribution.instance, component: contribution.component, path: contribution.path };\n const owner = templateChain.levels.slice(0, contributorLevel).find(chainLevel => chainLevel.elements.some(element => element.id === contribution.component));\n if (!owner) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionTargetMissing,\n `'${contribution.instance}' has saved values for '${contribution.component}', which is not in any layout or template above it. They are kept.`,\n context));\n } else if (!findComponentDescriptor(catalog, owner.elements.find(element => element.id === contribution.component)!.componentName)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.MissingComponentDescriptor,\n `'${contribution.instance}' has saved values for '${contribution.component}', but nothing describes that component any more. They are kept.`,\n context));\n } else {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ContributionNotExposed,\n `'${contribution.instance}' has a saved value for '${contribution.path}' on '${contribution.component}', which is not exposed to it. It is ignored and kept.`,\n context));\n }\n }\n\n return { components: [...components.values()], diagnostics };\n}\n"],"names":["toEffectiveItem","item","index","id","values","length","origin","fixed","toFlatItem","scalarValue","grant","matching","instance","current","diagnostics","contribution","problem","value","undefined","validateValue","descriptor","push","errorDiagnostic","DiagnosticCode","ContributionTypeMismatch","path","component","source","ValueSource","Instance","contributedBy","collectionValue","items","contributed","context","replaceOwnerItems","operations","includes","CollectionOperation","Replace","ContributionOperationNotPermitted","splice","Add","itemContext","itemId","some","existing","DuplicateCollectionItem","field","Object","entries","editableFields","validateItemValues","find","candidate","startsWith","UnknownCollectionField","resolveEffectiveConfiguration","templateChain","instanceContributions","catalog","grants","computeExposureGrants","handled","Set","components","Map","exposed","owner","levels","ownerLevel","element","elements","configuration","get","properties","cloneData","set","stored","getValueAtPath","base","default","isCollection","valueType","PropertyValueType","Collection","baseItems","Array","isArray","map","Default","Local","inheritedValue","byInstance","has","grantKey","effectiveGrant","filter","add","maximumItems","constraints","dropped","join","setValueAtPath","levelOf","chainLevel","contributorLevel","slice","ContributionTargetMissing","findComponentDescriptor","componentName","MissingComponentDescriptor","ContributionNotExposed"],"mappings":"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"}