@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.
Files changed (311) hide show
  1. package/dist/cjs/editing/DescriptorCatalog.js +42 -0
  2. package/dist/cjs/editing/DescriptorCatalog.js.map +1 -0
  3. package/dist/cjs/editing/EditSession.js +44 -0
  4. package/dist/cjs/editing/EditSession.js.map +1 -0
  5. package/dist/cjs/editing/applyEdit.js +83 -0
  6. package/dist/cjs/editing/applyEdit.js.map +1 -0
  7. package/dist/cjs/editing/applyEffectiveConfiguration.js +62 -0
  8. package/dist/cjs/editing/applyEffectiveConfiguration.js.map +1 -0
  9. package/dist/cjs/editing/collectComponents.js +34 -0
  10. package/dist/cjs/editing/collectComponents.js.map +1 -0
  11. package/dist/cjs/editing/collectIconUsages.js +86 -0
  12. package/dist/cjs/editing/collectIconUsages.js.map +1 -0
  13. package/dist/cjs/editing/describeNode.js +63 -0
  14. package/dist/cjs/editing/describeNode.js.map +1 -0
  15. package/dist/cjs/editing/diagnoseIcons.js +67 -0
  16. package/dist/cjs/editing/diagnoseIcons.js.map +1 -0
  17. package/dist/cjs/editing/diagnostics.js +36 -0
  18. package/dist/cjs/editing/diagnostics.js.map +1 -0
  19. package/dist/cjs/editing/documentPaths.js +45 -0
  20. package/dist/cjs/editing/documentPaths.js.map +1 -0
  21. package/dist/cjs/editing/exposureEdits.js +106 -0
  22. package/dist/cjs/editing/exposureEdits.js.map +1 -0
  23. package/dist/cjs/editing/exposureGrants.js +115 -0
  24. package/dist/cjs/editing/exposureGrants.js.map +1 -0
  25. package/dist/cjs/editing/iconDiagnostics.js +103 -0
  26. package/dist/cjs/editing/iconDiagnostics.js.map +1 -0
  27. package/dist/cjs/editing/indexDocument.js +400 -0
  28. package/dist/cjs/editing/indexDocument.js.map +1 -0
  29. package/dist/cjs/editing/inspect.js +154 -0
  30. package/dist/cjs/editing/inspect.js.map +1 -0
  31. package/dist/cjs/editing/instanceEdits.js +267 -0
  32. package/dist/cjs/editing/instanceEdits.js.map +1 -0
  33. package/dist/cjs/editing/layoutTypeDescriptors.js +425 -0
  34. package/dist/cjs/editing/layoutTypeDescriptors.js.map +1 -0
  35. package/dist/cjs/editing/layoutTypeEdits.js +141 -0
  36. package/dist/cjs/editing/layoutTypeEdits.js.map +1 -0
  37. package/dist/cjs/editing/nodeIds.js +115 -0
  38. package/dist/cjs/editing/nodeIds.js.map +1 -0
  39. package/dist/cjs/editing/pathAccess.js +53 -0
  40. package/dist/cjs/editing/pathAccess.js.map +1 -0
  41. package/dist/cjs/editing/propertyEdits.js +125 -0
  42. package/dist/cjs/editing/propertyEdits.js.map +1 -0
  43. package/dist/cjs/editing/resolveEffectiveConfiguration.js +200 -0
  44. package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -0
  45. package/dist/cjs/editing/resolveTemplateChain.js +100 -0
  46. package/dist/cjs/editing/resolveTemplateChain.js.map +1 -0
  47. package/dist/cjs/editing/structureEdits.js +231 -0
  48. package/dist/cjs/editing/structureEdits.js.map +1 -0
  49. package/dist/cjs/editing/validateBinding.js +111 -0
  50. package/dist/cjs/editing/validateBinding.js.map +1 -0
  51. package/dist/cjs/editing/validateValue.js +114 -0
  52. package/dist/cjs/editing/validateValue.js.map +1 -0
  53. package/dist/cjs/icons/EffectiveIconCatalog.js +212 -0
  54. package/dist/cjs/icons/EffectiveIconCatalog.js.map +1 -0
  55. package/dist/cjs/icons/EffectiveIconEntry.js +22 -0
  56. package/dist/cjs/icons/EffectiveIconEntry.js.map +1 -0
  57. package/dist/cjs/icons/analyzeIconImpact.js +48 -0
  58. package/dist/cjs/icons/analyzeIconImpact.js.map +1 -0
  59. package/dist/cjs/icons/matchesIconQuery.js +22 -0
  60. package/dist/cjs/icons/matchesIconQuery.js.map +1 -0
  61. package/dist/cjs/icons/resolveIconLibraries.js +45 -0
  62. package/dist/cjs/icons/resolveIconLibraries.js.map +1 -0
  63. package/dist/cjs/index.js +67 -0
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/esm/editing/DescriptorCatalog.d.ts +9 -0
  66. package/dist/esm/editing/DescriptorCatalog.d.ts.map +1 -0
  67. package/dist/esm/editing/DescriptorCatalog.js +38 -0
  68. package/dist/esm/editing/DescriptorCatalog.js.map +1 -0
  69. package/dist/esm/editing/DocumentIndex.d.ts +31 -0
  70. package/dist/esm/editing/DocumentIndex.d.ts.map +1 -0
  71. package/dist/esm/editing/DocumentIndex.js +2 -0
  72. package/dist/esm/editing/DocumentIndex.js.map +1 -0
  73. package/dist/esm/editing/EditOutcome.d.ts +7 -0
  74. package/dist/esm/editing/EditOutcome.d.ts.map +1 -0
  75. package/dist/esm/editing/EditOutcome.js +2 -0
  76. package/dist/esm/editing/EditOutcome.js.map +1 -0
  77. package/dist/esm/editing/EditSession.d.ts +20 -0
  78. package/dist/esm/editing/EditSession.d.ts.map +1 -0
  79. package/dist/esm/editing/EditSession.js +42 -0
  80. package/dist/esm/editing/EditSession.js.map +1 -0
  81. package/dist/esm/editing/EditingContext.d.ts +10 -0
  82. package/dist/esm/editing/EditingContext.d.ts.map +1 -0
  83. package/dist/esm/editing/EditingContext.js +2 -0
  84. package/dist/esm/editing/EditingContext.js.map +1 -0
  85. package/dist/esm/editing/TemplateChain.d.ts +13 -0
  86. package/dist/esm/editing/TemplateChain.d.ts.map +1 -0
  87. package/dist/esm/editing/TemplateChain.js +2 -0
  88. package/dist/esm/editing/TemplateChain.js.map +1 -0
  89. package/dist/esm/editing/applyEdit.d.ts +5 -0
  90. package/dist/esm/editing/applyEdit.d.ts.map +1 -0
  91. package/dist/esm/editing/applyEdit.js +81 -0
  92. package/dist/esm/editing/applyEdit.js.map +1 -0
  93. package/dist/esm/editing/applyEffectiveConfiguration.d.ts +3 -0
  94. package/dist/esm/editing/applyEffectiveConfiguration.d.ts.map +1 -0
  95. package/dist/esm/editing/applyEffectiveConfiguration.js +60 -0
  96. package/dist/esm/editing/applyEffectiveConfiguration.js.map +1 -0
  97. package/dist/esm/editing/collectComponents.d.ts +3 -0
  98. package/dist/esm/editing/collectComponents.d.ts.map +1 -0
  99. package/dist/esm/editing/collectComponents.js +32 -0
  100. package/dist/esm/editing/collectComponents.js.map +1 -0
  101. package/dist/esm/editing/collectIconUsages.d.ts +5 -0
  102. package/dist/esm/editing/collectIconUsages.d.ts.map +1 -0
  103. package/dist/esm/editing/collectIconUsages.js +84 -0
  104. package/dist/esm/editing/collectIconUsages.js.map +1 -0
  105. package/dist/esm/editing/describeNode.d.ts +11 -0
  106. package/dist/esm/editing/describeNode.d.ts.map +1 -0
  107. package/dist/esm/editing/describeNode.js +60 -0
  108. package/dist/esm/editing/describeNode.js.map +1 -0
  109. package/dist/esm/editing/diagnoseIcons.d.ts +4 -0
  110. package/dist/esm/editing/diagnoseIcons.d.ts.map +1 -0
  111. package/dist/esm/editing/diagnoseIcons.js +65 -0
  112. package/dist/esm/editing/diagnoseIcons.js.map +1 -0
  113. package/dist/esm/editing/diagnostics.d.ts +6 -0
  114. package/dist/esm/editing/diagnostics.d.ts.map +1 -0
  115. package/dist/esm/editing/diagnostics.js +32 -0
  116. package/dist/esm/editing/diagnostics.js.map +1 -0
  117. package/dist/esm/editing/documentPaths.d.ts +8 -0
  118. package/dist/esm/editing/documentPaths.d.ts.map +1 -0
  119. package/dist/esm/editing/documentPaths.js +41 -0
  120. package/dist/esm/editing/documentPaths.js.map +1 -0
  121. package/dist/esm/editing/exposureEdits.d.ts +5 -0
  122. package/dist/esm/editing/exposureEdits.d.ts.map +1 -0
  123. package/dist/esm/editing/exposureEdits.js +103 -0
  124. package/dist/esm/editing/exposureEdits.js.map +1 -0
  125. package/dist/esm/editing/exposureGrants.d.ts +21 -0
  126. package/dist/esm/editing/exposureGrants.d.ts.map +1 -0
  127. package/dist/esm/editing/exposureGrants.js +112 -0
  128. package/dist/esm/editing/exposureGrants.js.map +1 -0
  129. package/dist/esm/editing/given/a_layout_document.d.ts +14 -0
  130. package/dist/esm/editing/given/a_layout_document.d.ts.map +1 -0
  131. package/dist/esm/editing/given/a_layout_document.js +67 -0
  132. package/dist/esm/editing/given/a_layout_document.js.map +1 -0
  133. package/dist/esm/editing/given/a_scene_document.d.ts +20 -0
  134. package/dist/esm/editing/given/a_scene_document.d.ts.map +1 -0
  135. package/dist/esm/editing/given/a_scene_document.js +110 -0
  136. package/dist/esm/editing/given/a_scene_document.js.map +1 -0
  137. package/dist/esm/editing/iconDiagnostics.d.ts +11 -0
  138. package/dist/esm/editing/iconDiagnostics.d.ts.map +1 -0
  139. package/dist/esm/editing/iconDiagnostics.js +99 -0
  140. package/dist/esm/editing/iconDiagnostics.js.map +1 -0
  141. package/dist/esm/editing/index.d.ts +22 -0
  142. package/dist/esm/editing/index.d.ts.map +1 -0
  143. package/dist/esm/editing/index.js +22 -0
  144. package/dist/esm/editing/index.js.map +1 -0
  145. package/dist/esm/editing/indexDocument.d.ts +6 -0
  146. package/dist/esm/editing/indexDocument.d.ts.map +1 -0
  147. package/dist/esm/editing/indexDocument.js +396 -0
  148. package/dist/esm/editing/indexDocument.js.map +1 -0
  149. package/dist/esm/editing/inspect.d.ts +8 -0
  150. package/dist/esm/editing/inspect.d.ts.map +1 -0
  151. package/dist/esm/editing/inspect.js +151 -0
  152. package/dist/esm/editing/inspect.js.map +1 -0
  153. package/dist/esm/editing/instanceEdits.d.ts +9 -0
  154. package/dist/esm/editing/instanceEdits.d.ts.map +1 -0
  155. package/dist/esm/editing/instanceEdits.js +260 -0
  156. package/dist/esm/editing/instanceEdits.js.map +1 -0
  157. package/dist/esm/editing/layoutTypeDescriptors.d.ts +5 -0
  158. package/dist/esm/editing/layoutTypeDescriptors.d.ts.map +1 -0
  159. package/dist/esm/editing/layoutTypeDescriptors.js +421 -0
  160. package/dist/esm/editing/layoutTypeDescriptors.js.map +1 -0
  161. package/dist/esm/editing/layoutTypeEdits.d.ts +4 -0
  162. package/dist/esm/editing/layoutTypeEdits.d.ts.map +1 -0
  163. package/dist/esm/editing/layoutTypeEdits.js +139 -0
  164. package/dist/esm/editing/layoutTypeEdits.js.map +1 -0
  165. package/dist/esm/editing/nodeIds.d.ts +14 -0
  166. package/dist/esm/editing/nodeIds.d.ts.map +1 -0
  167. package/dist/esm/editing/nodeIds.js +102 -0
  168. package/dist/esm/editing/nodeIds.js.map +1 -0
  169. package/dist/esm/editing/pathAccess.d.ts +7 -0
  170. package/dist/esm/editing/pathAccess.d.ts.map +1 -0
  171. package/dist/esm/editing/pathAccess.js +48 -0
  172. package/dist/esm/editing/pathAccess.js.map +1 -0
  173. package/dist/esm/editing/propertyEdits.d.ts +15 -0
  174. package/dist/esm/editing/propertyEdits.d.ts.map +1 -0
  175. package/dist/esm/editing/propertyEdits.js +120 -0
  176. package/dist/esm/editing/propertyEdits.js.map +1 -0
  177. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts +5 -0
  178. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -0
  179. package/dist/esm/editing/resolveEffectiveConfiguration.js +198 -0
  180. package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -0
  181. package/dist/esm/editing/resolveTemplateChain.d.ts +4 -0
  182. package/dist/esm/editing/resolveTemplateChain.d.ts.map +1 -0
  183. package/dist/esm/editing/resolveTemplateChain.js +98 -0
  184. package/dist/esm/editing/resolveTemplateChain.js.map +1 -0
  185. package/dist/esm/editing/structureEdits.d.ts +6 -0
  186. package/dist/esm/editing/structureEdits.d.ts.map +1 -0
  187. package/dist/esm/editing/structureEdits.js +227 -0
  188. package/dist/esm/editing/structureEdits.js.map +1 -0
  189. package/dist/esm/editing/validateBinding.d.ts +7 -0
  190. package/dist/esm/editing/validateBinding.d.ts.map +1 -0
  191. package/dist/esm/editing/validateBinding.js +108 -0
  192. package/dist/esm/editing/validateBinding.js.map +1 -0
  193. package/dist/esm/editing/validateValue.d.ts +8 -0
  194. package/dist/esm/editing/validateValue.d.ts.map +1 -0
  195. package/dist/esm/editing/validateValue.js +111 -0
  196. package/dist/esm/editing/validateValue.js.map +1 -0
  197. package/dist/esm/icons/EffectiveIconCatalog.d.ts +25 -0
  198. package/dist/esm/icons/EffectiveIconCatalog.d.ts.map +1 -0
  199. package/dist/esm/icons/EffectiveIconCatalog.js +210 -0
  200. package/dist/esm/icons/EffectiveIconCatalog.js.map +1 -0
  201. package/dist/esm/icons/EffectiveIconEntry.d.ts +9 -0
  202. package/dist/esm/icons/EffectiveIconEntry.d.ts.map +1 -0
  203. package/dist/esm/icons/EffectiveIconEntry.js +20 -0
  204. package/dist/esm/icons/EffectiveIconEntry.js.map +1 -0
  205. package/dist/esm/icons/IconCatalogSource.d.ts +6 -0
  206. package/dist/esm/icons/IconCatalogSource.d.ts.map +1 -0
  207. package/dist/esm/icons/IconCatalogSource.js +2 -0
  208. package/dist/esm/icons/IconCatalogSource.js.map +1 -0
  209. package/dist/esm/icons/IconDiagnostic.d.ts +9 -0
  210. package/dist/esm/icons/IconDiagnostic.d.ts.map +1 -0
  211. package/dist/esm/icons/IconDiagnostic.js +2 -0
  212. package/dist/esm/icons/IconDiagnostic.js.map +1 -0
  213. package/dist/esm/icons/IconImpactReport.d.ts +18 -0
  214. package/dist/esm/icons/IconImpactReport.d.ts.map +1 -0
  215. package/dist/esm/icons/IconImpactReport.js +2 -0
  216. package/dist/esm/icons/IconImpactReport.js.map +1 -0
  217. package/dist/esm/icons/IconLibraryResolution.d.ts +7 -0
  218. package/dist/esm/icons/IconLibraryResolution.d.ts.map +1 -0
  219. package/dist/esm/icons/IconLibraryResolution.js +2 -0
  220. package/dist/esm/icons/IconLibraryResolution.js.map +1 -0
  221. package/dist/esm/icons/IconQuery.d.ts +7 -0
  222. package/dist/esm/icons/IconQuery.d.ts.map +1 -0
  223. package/dist/esm/icons/IconQuery.js +2 -0
  224. package/dist/esm/icons/IconQuery.js.map +1 -0
  225. package/dist/esm/icons/IconResolution.d.ts +14 -0
  226. package/dist/esm/icons/IconResolution.d.ts.map +1 -0
  227. package/dist/esm/icons/IconResolution.js +2 -0
  228. package/dist/esm/icons/IconResolution.js.map +1 -0
  229. package/dist/esm/icons/IconSearchResult.d.ts +7 -0
  230. package/dist/esm/icons/IconSearchResult.d.ts.map +1 -0
  231. package/dist/esm/icons/IconSearchResult.js +2 -0
  232. package/dist/esm/icons/IconSearchResult.js.map +1 -0
  233. package/dist/esm/icons/IconUsage.d.ts +6 -0
  234. package/dist/esm/icons/IconUsage.d.ts.map +1 -0
  235. package/dist/esm/icons/IconUsage.js +2 -0
  236. package/dist/esm/icons/IconUsage.js.map +1 -0
  237. package/dist/esm/icons/ResolvedIconLibrary.d.ts +8 -0
  238. package/dist/esm/icons/ResolvedIconLibrary.d.ts.map +1 -0
  239. package/dist/esm/icons/ResolvedIconLibrary.js +2 -0
  240. package/dist/esm/icons/ResolvedIconLibrary.js.map +1 -0
  241. package/dist/esm/icons/analyzeIconImpact.d.ts +5 -0
  242. package/dist/esm/icons/analyzeIconImpact.d.ts.map +1 -0
  243. package/dist/esm/icons/analyzeIconImpact.js +46 -0
  244. package/dist/esm/icons/analyzeIconImpact.js.map +1 -0
  245. package/dist/esm/icons/index.d.ts +14 -0
  246. package/dist/esm/icons/index.d.ts.map +1 -0
  247. package/dist/esm/icons/index.js +14 -0
  248. package/dist/esm/icons/index.js.map +1 -0
  249. package/dist/esm/icons/matchesIconQuery.d.ts +4 -0
  250. package/dist/esm/icons/matchesIconQuery.d.ts.map +1 -0
  251. package/dist/esm/icons/matchesIconQuery.js +20 -0
  252. package/dist/esm/icons/matchesIconQuery.js.map +1 -0
  253. package/dist/esm/icons/resolveIconLibraries.d.ts +4 -0
  254. package/dist/esm/icons/resolveIconLibraries.d.ts.map +1 -0
  255. package/dist/esm/icons/resolveIconLibraries.js +43 -0
  256. package/dist/esm/icons/resolveIconLibraries.js.map +1 -0
  257. package/dist/esm/index.d.ts +2 -0
  258. package/dist/esm/index.d.ts.map +1 -1
  259. package/dist/esm/index.js +21 -0
  260. package/dist/esm/index.js.map +1 -1
  261. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  262. package/editing/DescriptorCatalog.ts +51 -0
  263. package/editing/DocumentIndex.ts +73 -0
  264. package/editing/EditOutcome.ts +21 -0
  265. package/editing/EditSession.ts +50 -0
  266. package/editing/EditingContext.ts +34 -0
  267. package/editing/TemplateChain.ts +36 -0
  268. package/editing/applyEdit.ts +69 -0
  269. package/editing/applyEffectiveConfiguration.ts +53 -0
  270. package/editing/collectComponents.ts +36 -0
  271. package/editing/collectIconUsages.ts +78 -0
  272. package/editing/describeNode.ts +61 -0
  273. package/editing/diagnoseIcons.ts +60 -0
  274. package/editing/diagnostics.ts +30 -0
  275. package/editing/documentPaths.ts +40 -0
  276. package/editing/exposureEdits.ts +119 -0
  277. package/editing/exposureGrants.ts +159 -0
  278. package/editing/given/a_layout_document.ts +88 -0
  279. package/editing/given/a_scene_document.ts +135 -0
  280. package/editing/iconDiagnostics.ts +90 -0
  281. package/editing/index.ts +24 -0
  282. package/editing/indexDocument.ts +237 -0
  283. package/editing/inspect.ts +165 -0
  284. package/editing/instanceEdits.ts +251 -0
  285. package/editing/layoutTypeDescriptors.ts +191 -0
  286. package/editing/layoutTypeEdits.ts +135 -0
  287. package/editing/nodeIds.ts +111 -0
  288. package/editing/pathAccess.ts +81 -0
  289. package/editing/propertyEdits.ts +127 -0
  290. package/editing/resolveEffectiveConfiguration.ts +202 -0
  291. package/editing/resolveTemplateChain.ts +109 -0
  292. package/editing/structureEdits.ts +234 -0
  293. package/editing/validateBinding.ts +103 -0
  294. package/editing/validateValue.ts +130 -0
  295. package/icons/EffectiveIconCatalog.ts +199 -0
  296. package/icons/EffectiveIconEntry.ts +36 -0
  297. package/icons/IconCatalogSource.ts +23 -0
  298. package/icons/IconDiagnostic.ts +45 -0
  299. package/icons/IconImpactReport.ts +63 -0
  300. package/icons/IconLibraryResolution.ts +22 -0
  301. package/icons/IconQuery.ts +27 -0
  302. package/icons/IconResolution.ts +25 -0
  303. package/icons/IconSearchResult.ts +21 -0
  304. package/icons/IconUsage.ts +21 -0
  305. package/icons/ResolvedIconLibrary.ts +32 -0
  306. package/icons/analyzeIconImpact.ts +41 -0
  307. package/icons/index.ts +16 -0
  308. package/icons/matchesIconQuery.ts +19 -0
  309. package/icons/resolveIconLibraries.ts +47 -0
  310. package/index.ts +2 -0
  311. package/package.json +3 -3
@@ -0,0 +1,36 @@
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
+ /**
8
+ * Builds an error diagnostic: the edit or resolution step that produced it did not happen.
9
+ */ function errorDiagnostic(code, message, context = {}) {
10
+ return {
11
+ code,
12
+ severity: scene_model.DiagnosticSeverity.Error,
13
+ message,
14
+ ...context
15
+ };
16
+ }
17
+ /**
18
+ * Builds a warning diagnostic: the work went ahead, and the author should know something about it.
19
+ */ function warningDiagnostic(code, message, context = {}) {
20
+ return {
21
+ code,
22
+ severity: scene_model.DiagnosticSeverity.Warning,
23
+ message,
24
+ ...context
25
+ };
26
+ }
27
+ /**
28
+ * Whether any diagnostic is an error.
29
+ */ function hasErrors(diagnostics) {
30
+ return diagnostics.some((diagnostic)=>diagnostic.severity === scene_model.DiagnosticSeverity.Error);
31
+ }
32
+
33
+ exports.errorDiagnostic = errorDiagnostic;
34
+ exports.hasErrors = hasErrors;
35
+ exports.warningDiagnostic = warningDiagnostic;
36
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sources":["../../../editing/diagnostics.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 { DiagnosticCode, DiagnosticSeverity, SceneDiagnostic } from '@cratis/scene.model';\n\n/**\n * The context a diagnostic can carry besides its code and message.\n */\nexport type DiagnosticContext = Partial<Omit<SceneDiagnostic, 'code' | 'severity' | 'message'>>;\n\n/**\n * Builds an error diagnostic: the edit or resolution step that produced it did not happen.\n */\nexport function errorDiagnostic(code: DiagnosticCode, message: string, context: DiagnosticContext = {}): SceneDiagnostic {\n return { code, severity: DiagnosticSeverity.Error, message, ...context };\n}\n\n/**\n * Builds a warning diagnostic: the work went ahead, and the author should know something about it.\n */\nexport function warningDiagnostic(code: DiagnosticCode, message: string, context: DiagnosticContext = {}): SceneDiagnostic {\n return { code, severity: DiagnosticSeverity.Warning, message, ...context };\n}\n\n/**\n * Whether any diagnostic is an error.\n */\nexport function hasErrors(diagnostics: SceneDiagnostic[]): boolean {\n return diagnostics.some(diagnostic => diagnostic.severity === DiagnosticSeverity.Error);\n}\n"],"names":["errorDiagnostic","code","message","context","severity","DiagnosticSeverity","Error","warningDiagnostic","Warning","hasErrors","diagnostics","some","diagnostic"],"mappings":";;;;AAAA;AACA;AASA;;IAGO,SAASA,eAAAA,CAAgBC,IAAoB,EAAEC,OAAe,EAAEC,OAAAA,GAA6B,EAAE,EAAA;IAClG,OAAO;AAAEF,QAAAA,IAAAA;AAAMG,QAAAA,QAAAA,EAAUC,+BAAmBC,KAAK;AAAEJ,QAAAA,OAAAA;AAAS,QAAA,GAAGC;AAAQ,KAAA;AAC3E;AAEA;;IAGO,SAASI,iBAAAA,CAAkBN,IAAoB,EAAEC,OAAe,EAAEC,OAAAA,GAA6B,EAAE,EAAA;IACpG,OAAO;AAAEF,QAAAA,IAAAA;AAAMG,QAAAA,QAAAA,EAAUC,+BAAmBG,OAAO;AAAEN,QAAAA,OAAAA;AAAS,QAAA,GAAGC;AAAQ,KAAA;AAC7E;AAEA;;IAGO,SAASM,SAAAA,CAAUC,WAA8B,EAAA;IACpD,OAAOA,WAAAA,CAAYC,IAAI,CAACC,CAAAA,aAAcA,UAAAA,CAAWR,QAAQ,KAAKC,8BAAAA,CAAmBC,KAAK,CAAA;AAC1F;;;;"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Reads the value at a document path.
7
+ */ function getAtPath(root, path) {
8
+ let current = root;
9
+ for (const key of path){
10
+ if (current === null || typeof current !== 'object') return undefined;
11
+ current = current[key];
12
+ }
13
+ return current;
14
+ }
15
+ /**
16
+ * Reads the array at a path, creating it - and any objects on the way - when it is not there yet. Mutates `root`,
17
+ * which callers hold a copy of.
18
+ */ function ensureArrayAt(root, path) {
19
+ let current = root;
20
+ path.forEach((key, position)=>{
21
+ if (current[key] === undefined) current[key] = position === path.length - 1 ? [] : {};
22
+ current = current[key];
23
+ });
24
+ return current;
25
+ }
26
+ /**
27
+ * The paths a change to `path` must be made at: the path itself and, for a node inside a freeform element, the same
28
+ * place in every other size-class variant's copy.
29
+ */ function mirroredPaths(mirror, path) {
30
+ if (!mirror || mirror.prefix.some((key, position)=>path[position] !== key)) return [
31
+ path
32
+ ];
33
+ return [
34
+ path,
35
+ ...mirror.others.map((other)=>[
36
+ ...other,
37
+ ...path.slice(mirror.prefix.length)
38
+ ])
39
+ ];
40
+ }
41
+
42
+ exports.ensureArrayAt = ensureArrayAt;
43
+ exports.getAtPath = getAtPath;
44
+ exports.mirroredPaths = mirroredPaths;
45
+ //# sourceMappingURL=documentPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentPaths.js","sources":["../../../editing/documentPaths.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 { DocumentPath } from './DocumentIndex';\n\n/**\n * Reads the value at a document path.\n */\nexport function getAtPath(root: unknown, path: DocumentPath): unknown {\n let current = root;\n for (const key of path) {\n if (current === null || typeof current !== 'object') return undefined;\n current = (current as Record<string | number, unknown>)[key];\n }\n\n return current;\n}\n\n/**\n * Reads the array at a path, creating it - and any objects on the way - when it is not there yet. Mutates `root`,\n * which callers hold a copy of.\n */\nexport function ensureArrayAt(root: unknown, path: DocumentPath): unknown[] {\n let current = root as Record<string | number, unknown>;\n path.forEach((key, position) => {\n if (current[key] === undefined) current[key] = position === path.length - 1 ? [] : {};\n current = current[key] as Record<string | number, unknown>;\n });\n\n return current as unknown as unknown[];\n}\n\n/**\n * The paths a change to `path` must be made at: the path itself and, for a node inside a freeform element, the same\n * place in every other size-class variant's copy.\n */\nexport function mirroredPaths(mirror: { prefix: DocumentPath; others: DocumentPath[] } | undefined, path: DocumentPath): DocumentPath[] {\n if (!mirror || mirror.prefix.some((key, position) => path[position] !== key)) return [path];\n return [path, ...mirror.others.map(other => [...other, ...path.slice(mirror.prefix.length)])];\n}\n"],"names":["getAtPath","root","path","current","key","undefined","ensureArrayAt","forEach","position","length","mirroredPaths","mirror","prefix","some","others","map","other","slice"],"mappings":";;AAAA;AACA;AAIA;;AAEC,IACM,SAASA,SAAAA,CAAUC,IAAa,EAAEC,IAAkB,EAAA;AACvD,IAAA,IAAIC,OAAAA,GAAUF,IAAAA;IACd,KAAK,MAAMG,OAAOF,IAAAA,CAAM;AACpB,QAAA,IAAIC,OAAAA,KAAY,IAAA,IAAQ,OAAOA,OAAAA,KAAY,UAAU,OAAOE,SAAAA;QAC5DF,OAAAA,GAAWA,OAA4C,CAACC,GAAAA,CAAI;AAChE,IAAA;IAEA,OAAOD,OAAAA;AACX;AAEA;;;AAGC,IACM,SAASG,aAAAA,CAAcL,IAAa,EAAEC,IAAkB,EAAA;AAC3D,IAAA,IAAIC,OAAAA,GAAUF,IAAAA;IACdC,IAAAA,CAAKK,OAAO,CAAC,CAACH,GAAAA,EAAKI,QAAAA,GAAAA;AACf,QAAA,IAAIL,OAAO,CAACC,GAAAA,CAAI,KAAKC,SAAAA,EAAWF,OAAO,CAACC,GAAAA,CAAI,GAAGI,QAAAA,KAAaN,KAAKO,MAAM,GAAG,CAAA,GAAI,EAAE,GAAG,EAAC;QACpFN,OAAAA,GAAUA,OAAO,CAACC,GAAAA,CAAI;AAC1B,IAAA,CAAA,CAAA;IAEA,OAAOD,OAAAA;AACX;AAEA;;;AAGC,IACM,SAASO,aAAAA,CAAcC,MAAoE,EAAET,IAAkB,EAAA;AAClH,IAAA,IAAI,CAACS,MAAAA,IAAUA,MAAAA,CAAOC,MAAM,CAACC,IAAI,CAAC,CAACT,GAAAA,EAAKI,WAAaN,IAAI,CAACM,QAAAA,CAAS,KAAKJ,MAAM,OAAO;AAACF,QAAAA;AAAK,KAAA;IAC3F,OAAO;AAACA,QAAAA,IAAAA;AAASS,QAAAA,GAAAA,MAAAA,CAAOG,MAAM,CAACC,GAAG,CAACC,CAAAA,KAAAA,GAAS;AAAIA,gBAAAA,GAAAA,KAAAA;AAAUd,gBAAAA,GAAAA,IAAAA,CAAKe,KAAK,CAACN,MAAAA,CAAOC,MAAM,CAACH,MAAM;AAAE,aAAA;AAAE,KAAA;AACjG;;;;"}
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var DescriptorCatalog = require('./DescriptorCatalog.js');
5
+ var diagnostics = require('./diagnostics.js');
6
+ var exposureGrants = require('./exposureGrants.js');
7
+ var pathAccess = require('./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 ownsDeclaration(session, owner, diagnostics$1) {
12
+ const level = session.chain.levels.at(-1);
13
+ if (!level || level.owner !== owner) {
14
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.NodeNotEditable, `Exposure is declared by the layout or template that owns the component. '${owner}' is not what is being edited.`));
15
+ return false;
16
+ }
17
+ return true;
18
+ }
19
+ function validateExposure(session, property, diagnostics$1) {
20
+ const context = {
21
+ component: property.component,
22
+ path: property.path
23
+ };
24
+ const level = session.chain.levels.at(-1);
25
+ const reExposed = property.reExposes !== undefined;
26
+ if (!reExposed && !level.elements.some((candidate)=>candidate.id === property.component)) {
27
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureTargetMissing, `'${level.owner}' has no component '${property.component}'.`, context));
28
+ return false;
29
+ }
30
+ const grant = reExposed ? session.scopeGrants.get(exposureGrants.grantKey(property.component, property.path)) : undefined;
31
+ if (reExposed && (!grant || grant.owner !== property.reExposes)) {
32
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ReExposureBroken, `'${property.reExposes}' does not expose '${property.path}' on '${property.component}' to '${level.owner}', so it cannot be passed on.`, context));
33
+ return false;
34
+ }
35
+ const element = level.elements.find((candidate)=>candidate.id === property.component);
36
+ const descriptor = grant ? grant.descriptor : DescriptorCatalog.findComponentDescriptor(session.context.catalog, element.componentName)?.properties.find((candidate)=>candidate.path === property.path);
37
+ if (!descriptor) {
38
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureTargetMissing, `There is no editable property '${property.path}' on '${property.component}'.`, context));
39
+ return false;
40
+ }
41
+ const operations = property.operations ?? [];
42
+ if (descriptor.valueType !== scene_model.PropertyValueType.Collection) {
43
+ if (operations.length > 0 || property.editableFields !== undefined) {
44
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.InvalidEdit, `'${descriptor.label}' is not a collection, so operations and editable fields do not apply.`, context));
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ const known = Object.values(scene_model.CollectionOperation);
50
+ const unknown = operations.find((operation)=>!known.includes(operation));
51
+ if (unknown !== undefined) {
52
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.InvalidEdit, `'${unknown}' is not a collection operation.`, context));
53
+ return false;
54
+ }
55
+ const fields = descriptor.item?.properties.map((candidate)=>candidate.path) ?? [];
56
+ const unknownField = property.editableFields?.find((field)=>!fields.includes(field));
57
+ if (unknownField !== undefined) {
58
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnknownCollectionField, `Items of '${descriptor.label}' have no field '${unknownField}'.`, context));
59
+ return false;
60
+ }
61
+ if (grant && (operations.some((operation)=>!grant.operations.includes(operation)) || grant.editableFields !== undefined && (property.editableFields ?? fields).some((field)=>!grant.editableFields.includes(field)))) {
62
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureWidensOwner, `'${property.reExposes}' exposed less of '${descriptor.label}' than this re-exposes.`, context));
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ /**
68
+ * Applies an exposure declaration to a copy of the document.
69
+ *
70
+ * Exposure only narrows: the property has to be one the component's descriptor supports, a collection's
71
+ * operations and fields have to exist, and a re-exposure cannot grant more than the owner it passes on.
72
+ */ function applyExposeProperty(session, edit, clone, diagnostics) {
73
+ if (!ownsDeclaration(session, edit.owner, diagnostics) || !validateExposure(session, edit.property, diagnostics)) return;
74
+ let declaration = clone.exposures.find((candidate)=>candidate.owner === edit.owner);
75
+ if (!declaration) {
76
+ declaration = {
77
+ owner: edit.owner,
78
+ properties: []
79
+ };
80
+ clone.exposures.push(declaration);
81
+ }
82
+ const same = (candidate)=>candidate.component === edit.property.component && candidate.path === edit.property.path && candidate.reExposes === edit.property.reExposes;
83
+ const position = declaration.properties.findIndex(same);
84
+ if (position >= 0) declaration.properties[position] = pathAccess.cloneData(edit.property);
85
+ else declaration.properties.push(pathAccess.cloneData(edit.property));
86
+ }
87
+ /**
88
+ * Applies an exposure withdrawal to a copy of the document. Values already saved against it are not touched.
89
+ */ function applyUnexposeProperty(session, edit, clone, diagnostics$1) {
90
+ if (!ownsDeclaration(session, edit.owner, diagnostics$1)) return;
91
+ const declaration = clone.exposures.find((candidate)=>candidate.owner === edit.owner);
92
+ const remaining = declaration?.properties.filter((candidate)=>!(candidate.component === edit.component && candidate.path === edit.path));
93
+ if (!declaration || remaining.length === declaration.properties.length) {
94
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureTargetMissing, `'${edit.owner}' does not expose '${edit.path}' on '${edit.component}'.`, {
95
+ component: edit.component,
96
+ path: edit.path
97
+ }));
98
+ return;
99
+ }
100
+ if (remaining.length === 0) clone.exposures.splice(clone.exposures.indexOf(declaration), 1);
101
+ else declaration.properties = remaining;
102
+ }
103
+
104
+ exports.applyExposeProperty = applyExposeProperty;
105
+ exports.applyUnexposeProperty = applyUnexposeProperty;
106
+ //# sourceMappingURL=exposureEdits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposureEdits.js","sources":["../../../editing/exposureEdits.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, ExposedProperty, ExposePropertyEdit, PropertyValueType, SceneDiagnostic,\n SceneDocument, UnexposePropertyEdit,\n} from '@cratis/scene.model';\nimport { findComponentDescriptor } from './DescriptorCatalog';\nimport { errorDiagnostic } from './diagnostics';\nimport { EditSession } from './EditSession';\nimport { grantKey } from './exposureGrants';\nimport { cloneData } from './pathAccess';\n\nfunction ownsDeclaration(session: EditSession, owner: string, diagnostics: SceneDiagnostic[]): boolean {\n const level = session.chain.levels.at(-1);\n if (!level || level.owner !== owner) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotEditable, `Exposure is declared by the layout or template that owns the component. '${owner}' is not what is being edited.`));\n return false;\n }\n\n return true;\n}\n\nfunction validateExposure(session: EditSession, property: ExposedProperty, diagnostics: SceneDiagnostic[]): boolean {\n const context = { component: property.component, path: property.path };\n const level = session.chain.levels.at(-1)!;\n const reExposed = property.reExposes !== undefined;\n\n if (!reExposed && !level.elements.some(candidate => candidate.id === property.component)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ExposureTargetMissing, `'${level.owner}' has no component '${property.component}'.`, context));\n return false;\n }\n\n const grant = reExposed ? session.scopeGrants.get(grantKey(property.component, property.path)) : undefined;\n if (reExposed && (!grant || grant.owner !== property.reExposes)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ReExposureBroken, `'${property.reExposes}' does not expose '${property.path}' on '${property.component}' to '${level.owner}', so it cannot be passed on.`, context));\n return false;\n }\n\n const element = level.elements.find(candidate => candidate.id === property.component);\n const descriptor = grant\n ? grant.descriptor\n : findComponentDescriptor(session.context.catalog, element!.componentName)?.properties.find(candidate => candidate.path === property.path);\n if (!descriptor) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ExposureTargetMissing, `There is no editable property '${property.path}' on '${property.component}'.`, context));\n return false;\n }\n\n const operations = property.operations ?? [];\n if (descriptor.valueType !== PropertyValueType.Collection) {\n if (operations.length > 0 || property.editableFields !== undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, `'${descriptor.label}' is not a collection, so operations and editable fields do not apply.`, context));\n return false;\n }\n\n return true;\n }\n\n const known = Object.values(CollectionOperation) as string[];\n const unknown = operations.find(operation => !known.includes(operation));\n if (unknown !== undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, `'${unknown}' is not a collection operation.`, context));\n return false;\n }\n\n const fields = descriptor.item?.properties.map(candidate => candidate.path) ?? [];\n const unknownField = property.editableFields?.find(field => !fields.includes(field));\n if (unknownField !== undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownCollectionField, `Items of '${descriptor.label}' have no field '${unknownField}'.`, context));\n return false;\n }\n\n if (grant && (operations.some(operation => !grant.operations.includes(operation))\n || (grant.editableFields !== undefined && (property.editableFields ?? fields).some(field => !grant.editableFields!.includes(field))))) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ExposureWidensOwner, `'${property.reExposes}' exposed less of '${descriptor.label}' than this re-exposes.`, context));\n return false;\n }\n\n return true;\n}\n\n/**\n * Applies an exposure declaration to a copy of the document.\n *\n * Exposure only narrows: the property has to be one the component's descriptor supports, a collection's\n * operations and fields have to exist, and a re-exposure cannot grant more than the owner it passes on.\n */\nexport function applyExposeProperty(session: EditSession, edit: ExposePropertyEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n if (!ownsDeclaration(session, edit.owner, diagnostics) || !validateExposure(session, edit.property, diagnostics)) return;\n\n let declaration = clone.exposures.find(candidate => candidate.owner === edit.owner);\n if (!declaration) {\n declaration = { owner: edit.owner, properties: [] };\n clone.exposures.push(declaration);\n }\n\n const same = (candidate: ExposedProperty) => candidate.component === edit.property.component\n && candidate.path === edit.property.path && candidate.reExposes === edit.property.reExposes;\n const position = declaration.properties.findIndex(same);\n if (position >= 0) declaration.properties[position] = cloneData(edit.property);\n else declaration.properties.push(cloneData(edit.property));\n}\n\n/**\n * Applies an exposure withdrawal to a copy of the document. Values already saved against it are not touched.\n */\nexport function applyUnexposeProperty(session: EditSession, edit: UnexposePropertyEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n if (!ownsDeclaration(session, edit.owner, diagnostics)) return;\n\n const declaration = clone.exposures.find(candidate => candidate.owner === edit.owner);\n const remaining = declaration?.properties.filter(candidate => !(candidate.component === edit.component && candidate.path === edit.path));\n if (!declaration || remaining!.length === declaration.properties.length) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ExposureTargetMissing, `'${edit.owner}' does not expose '${edit.path}' on '${edit.component}'.`, { component: edit.component, path: edit.path }));\n return;\n }\n\n if (remaining!.length === 0) clone.exposures.splice(clone.exposures.indexOf(declaration), 1);\n else declaration.properties = remaining!;\n}\n"],"names":["ownsDeclaration","session","owner","diagnostics","level","chain","levels","at","push","errorDiagnostic","DiagnosticCode","NodeNotEditable","validateExposure","property","context","component","path","reExposed","reExposes","undefined","elements","some","candidate","id","ExposureTargetMissing","grant","scopeGrants","get","grantKey","ReExposureBroken","element","find","descriptor","findComponentDescriptor","catalog","componentName","properties","operations","valueType","PropertyValueType","Collection","length","editableFields","InvalidEdit","label","known","Object","values","CollectionOperation","unknown","operation","includes","fields","item","map","unknownField","field","UnknownCollectionField","ExposureWidensOwner","applyExposeProperty","edit","clone","declaration","exposures","same","position","findIndex","cloneData","applyUnexposeProperty","remaining","filter","splice","indexOf"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var DescriptorCatalog = require('./DescriptorCatalog.js');
5
+ var diagnostics = require('./diagnostics.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
+ /**
10
+ * The key a grant is stored under.
11
+ */ function grantKey(component, path) {
12
+ return `${component}\u0000${path}`;
13
+ }
14
+ function narrow(grant, reExposure) {
15
+ const requested = reExposure.operations ?? [];
16
+ const operations = requested.filter((operation)=>grant.operations.includes(operation));
17
+ const fields = grant.editableFields === undefined ? reExposure.editableFields : reExposure.editableFields === undefined ? grant.editableFields : reExposure.editableFields.filter((field)=>grant.editableFields.includes(field));
18
+ const widened = operations.length < requested.length || grant.editableFields !== undefined && reExposure.editableFields !== undefined && reExposure.editableFields.some((field)=>!grant.editableFields.includes(field));
19
+ return {
20
+ grant: {
21
+ ...grant,
22
+ operations,
23
+ editableFields: fields,
24
+ label: reExposure.label ?? grant.label
25
+ },
26
+ widened
27
+ };
28
+ }
29
+ /**
30
+ * Works out, for every instance in a chain, which properties it may configure.
31
+ *
32
+ * An owner's exposure reaches the instance directly inside it. It reaches further only through explicit
33
+ * re-exposure by every level in between, and each re-exposure can only narrow what it passes on - a nested
34
+ * template that lists more operations or fields than its owner granted gets the owner's, not its own.
35
+ *
36
+ * @param chain The chain to analyze.
37
+ * @param catalog The descriptors that say what each component supports.
38
+ */ function computeExposureGrants(chain, catalog) {
39
+ const result = {
40
+ exposed: [],
41
+ byInstance: new Map(),
42
+ diagnostics: []
43
+ };
44
+ for (const chainLevel of chain.levels)result.byInstance.set(chainLevel.instance, new Map());
45
+ const consumed = new Set();
46
+ chain.levels.forEach((owner, ownerLevel)=>{
47
+ for (const exposure of owner.exposures.filter((candidate)=>candidate.reExposes === undefined)){
48
+ const element = owner.elements.find((candidate)=>candidate.id === exposure.component);
49
+ if (!element) {
50
+ result.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureTargetMissing, `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but it has no such component.`, {
51
+ component: exposure.component,
52
+ path: exposure.path
53
+ }));
54
+ continue;
55
+ }
56
+ const descriptor = DescriptorCatalog.findComponentDescriptor(catalog, element.componentName);
57
+ if (!descriptor) {
58
+ result.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.MissingComponentDescriptor, `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but nothing describes the component '${element.componentName}'.`, {
59
+ component: exposure.component,
60
+ path: exposure.path
61
+ }));
62
+ continue;
63
+ }
64
+ const property = descriptor.properties.find((candidate)=>candidate.path === exposure.path);
65
+ if (!property) {
66
+ result.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureTargetMissing, `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but '${element.componentName}' no longer has that property.`, {
67
+ component: exposure.component,
68
+ path: exposure.path
69
+ }));
70
+ continue;
71
+ }
72
+ const isCollection = property.valueType === scene_model.PropertyValueType.Collection;
73
+ let current = {
74
+ component: exposure.component,
75
+ path: exposure.path,
76
+ descriptor: property,
77
+ owner: owner.owner,
78
+ ownerLevel,
79
+ operations: isCollection ? [
80
+ ...new Set(exposure.operations ?? [])
81
+ ] : [],
82
+ editableFields: isCollection ? exposure.editableFields : undefined,
83
+ label: exposure.label
84
+ };
85
+ result.exposed.push(current);
86
+ for(let contributor = ownerLevel + 1; contributor < chain.levels.length; contributor++){
87
+ result.byInstance.get(chain.levels[contributor].instance).set(grantKey(exposure.component, exposure.path), current);
88
+ const reExposure = chain.levels[contributor].exposures.find((candidate)=>candidate.reExposes === owner.owner && candidate.component === exposure.component && candidate.path === exposure.path);
89
+ if (!reExposure) break;
90
+ consumed.add(reExposure);
91
+ const narrowed = narrow(current, reExposure);
92
+ if (narrowed.widened) {
93
+ result.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ExposureWidensOwner, `'${chain.levels[contributor].owner}' re-exposes more of '${exposure.path}' than '${owner.owner}' exposed; only what the owner granted is passed on.`, {
94
+ component: exposure.component,
95
+ path: exposure.path
96
+ }));
97
+ }
98
+ current = narrowed.grant;
99
+ }
100
+ }
101
+ });
102
+ for (const chainLevel of chain.levels){
103
+ for (const reExposure of chainLevel.exposures.filter((candidate)=>candidate.reExposes !== undefined && !consumed.has(candidate))){
104
+ result.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ReExposureBroken, `'${chainLevel.owner}' re-exposes '${reExposure.path}' on '${reExposure.component}' from '${reExposure.reExposes}', which does not expose it to this chain.`, {
105
+ component: reExposure.component,
106
+ path: reExposure.path
107
+ }));
108
+ }
109
+ }
110
+ return result;
111
+ }
112
+
113
+ exports.computeExposureGrants = computeExposureGrants;
114
+ exports.grantKey = grantKey;
115
+ //# sourceMappingURL=exposureGrants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposureGrants.js","sources":["../../../editing/exposureGrants.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, ExposedProperty, PropertyDescriptor, PropertyValueType, SceneDiagnostic,\n} from '@cratis/scene.model';\nimport { DescriptorCatalog, findComponentDescriptor } from './DescriptorCatalog';\nimport { errorDiagnostic } from './diagnostics';\nimport { TemplateChain } from './TemplateChain';\n\n/**\n * What one instance may configure on one property: the owner's exposure, narrowed by every re-exposure between the\n * owner and that instance.\n */\nexport interface ExposureGrant {\n /** The id of the element that owns the property. */\n component: string;\n\n path: string;\n descriptor: PropertyDescriptor;\n\n /** The name of the layout or template that owns the element. */\n owner: string;\n\n /** The index of the owner in the chain. */\n ownerLevel: number;\n\n /** For a collection: what may be done to it. Empty for any other property. */\n operations: CollectionOperation[];\n\n /** For a collection: the item fields that may be changed; absent means all of them. */\n editableFields?: string[];\n\n label?: string;\n}\n\n/**\n * The outcome of working out who may configure what.\n */\nexport interface ExposureGrants {\n /** Every valid exposure, one per owner-declared property, at the level of its owner. */\n exposed: ExposureGrant[];\n\n /** For each contributing instance id, what it may configure, keyed by {@link grantKey}. */\n byInstance: Map<string, Map<string, ExposureGrant>>;\n\n diagnostics: SceneDiagnostic[];\n}\n\n/**\n * The key a grant is stored under.\n */\nexport function grantKey(component: string, path: string): string {\n return `${component}\\u0000${path}`;\n}\n\nfunction narrow(grant: ExposureGrant, reExposure: ExposedProperty): { grant: ExposureGrant; widened: boolean } {\n const requested = reExposure.operations ?? [];\n const operations = requested.filter(operation => grant.operations.includes(operation));\n const fields = grant.editableFields === undefined\n ? reExposure.editableFields\n : (reExposure.editableFields === undefined ? grant.editableFields : reExposure.editableFields.filter(field => grant.editableFields!.includes(field)));\n\n const widened = operations.length < requested.length\n || (grant.editableFields !== undefined && reExposure.editableFields !== undefined && reExposure.editableFields.some(field => !grant.editableFields!.includes(field)));\n\n return { grant: { ...grant, operations, editableFields: fields, label: reExposure.label ?? grant.label }, widened };\n}\n\n/**\n * Works out, for every instance in a chain, which properties it may configure.\n *\n * An owner's exposure reaches the instance directly inside it. It reaches further only through explicit\n * re-exposure by every level in between, and each re-exposure can only narrow what it passes on - a nested\n * template that lists more operations or fields than its owner granted gets the owner's, not its own.\n *\n * @param chain The chain to analyze.\n * @param catalog The descriptors that say what each component supports.\n */\nexport function computeExposureGrants(chain: TemplateChain, catalog: DescriptorCatalog): ExposureGrants {\n const result: ExposureGrants = { exposed: [], byInstance: new Map(), diagnostics: [] };\n for (const chainLevel of chain.levels) result.byInstance.set(chainLevel.instance, new Map());\n\n const consumed = new Set<ExposedProperty>();\n\n chain.levels.forEach((owner, ownerLevel) => {\n for (const exposure of owner.exposures.filter(candidate => candidate.reExposes === undefined)) {\n const element = owner.elements.find(candidate => candidate.id === exposure.component);\n if (!element) {\n result.diagnostics.push(errorDiagnostic(\n DiagnosticCode.ExposureTargetMissing,\n `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but it has no such component.`,\n { component: exposure.component, path: exposure.path }));\n continue;\n }\n\n const descriptor = findComponentDescriptor(catalog, element.componentName);\n if (!descriptor) {\n result.diagnostics.push(errorDiagnostic(\n DiagnosticCode.MissingComponentDescriptor,\n `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but nothing describes the component '${element.componentName}'.`,\n { component: exposure.component, path: exposure.path }));\n continue;\n }\n\n const property = descriptor.properties.find(candidate => candidate.path === exposure.path);\n if (!property) {\n result.diagnostics.push(errorDiagnostic(\n DiagnosticCode.ExposureTargetMissing,\n `'${owner.owner}' exposes '${exposure.path}' on '${exposure.component}', but '${element.componentName}' no longer has that property.`,\n { component: exposure.component, path: exposure.path }));\n continue;\n }\n\n const isCollection = property.valueType === PropertyValueType.Collection;\n let current: ExposureGrant = {\n component: exposure.component,\n path: exposure.path,\n descriptor: property,\n owner: owner.owner,\n ownerLevel,\n operations: isCollection ? [...new Set(exposure.operations ?? [])] : [],\n editableFields: isCollection ? exposure.editableFields : undefined,\n label: exposure.label,\n };\n result.exposed.push(current);\n\n for (let contributor = ownerLevel + 1; contributor < chain.levels.length; contributor++) {\n result.byInstance.get(chain.levels[contributor].instance)!.set(grantKey(exposure.component, exposure.path), current);\n\n const reExposure = chain.levels[contributor].exposures.find(candidate =>\n candidate.reExposes === owner.owner && candidate.component === exposure.component && candidate.path === exposure.path);\n if (!reExposure) break;\n\n consumed.add(reExposure);\n const narrowed = narrow(current, reExposure);\n if (narrowed.widened) {\n result.diagnostics.push(errorDiagnostic(\n DiagnosticCode.ExposureWidensOwner,\n `'${chain.levels[contributor].owner}' re-exposes more of '${exposure.path}' than '${owner.owner}' exposed; only what the owner granted is passed on.`,\n { component: exposure.component, path: exposure.path }));\n }\n\n current = narrowed.grant;\n }\n }\n });\n\n for (const chainLevel of chain.levels) {\n for (const reExposure of chainLevel.exposures.filter(candidate => candidate.reExposes !== undefined && !consumed.has(candidate))) {\n result.diagnostics.push(errorDiagnostic(\n DiagnosticCode.ReExposureBroken,\n `'${chainLevel.owner}' re-exposes '${reExposure.path}' on '${reExposure.component}' from '${reExposure.reExposes}', which does not expose it to this chain.`,\n { component: reExposure.component, path: reExposure.path }));\n }\n }\n\n return result;\n}\n"],"names":["grantKey","component","path","narrow","grant","reExposure","requested","operations","filter","operation","includes","fields","editableFields","undefined","field","widened","length","some","label","computeExposureGrants","chain","catalog","result","exposed","byInstance","Map","diagnostics","chainLevel","levels","set","instance","consumed","Set","forEach","owner","ownerLevel","exposure","exposures","candidate","reExposes","element","elements","find","id","push","errorDiagnostic","DiagnosticCode","ExposureTargetMissing","descriptor","findComponentDescriptor","componentName","MissingComponentDescriptor","property","properties","isCollection","valueType","PropertyValueType","Collection","current","contributor","get","add","narrowed","ExposureWidensOwner","has","ReExposureBroken"],"mappings":"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"}
@@ -0,0 +1,103 @@
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
+ const codes = {
8
+ 'missing-library': scene_model.DiagnosticCode.MissingIconLibrary,
9
+ 'missing-icon': scene_model.DiagnosticCode.MissingIcon,
10
+ 'missing-variant': scene_model.DiagnosticCode.MissingIconVariant,
11
+ 'incompatible-version': scene_model.DiagnosticCode.IncompatibleIconLibrary,
12
+ 'catalog-unavailable': scene_model.DiagnosticCode.IconCatalogUnavailable
13
+ };
14
+ /**
15
+ * Checks one icon value against the effective icon catalog.
16
+ *
17
+ * Nothing is rewritten or dropped: this only reports. A value whose library, icon or variant is missing, or
18
+ * whose library is at an incompatible version, produces a diagnostic of the given severity - an error when
19
+ * the value is being *set* (the edit is refused), a warning when it is already stored (it is kept, and
20
+ * applies again if the icon comes back). A value that cannot be judged yet, because its library's catalog has
21
+ * not been loaded, produces an `IconNotVerified` warning rather than silently passing.
22
+ *
23
+ * @param catalog The effective catalog of the profile being edited.
24
+ * @param value The value; anything that is not an icon reference is left to `validateValue`.
25
+ * @param severity How serious a definite problem is.
26
+ * @param context What the diagnostic is about.
27
+ */ function iconProblem(catalog, value, severity, context) {
28
+ if (!scene_model.isIconReference(value)) return undefined;
29
+ const resolution = catalog.lookup(value);
30
+ if (resolution === undefined) {
31
+ return {
32
+ code: scene_model.DiagnosticCode.IconNotVerified,
33
+ severity: scene_model.DiagnosticSeverity.Warning,
34
+ message: `The catalog of the icon library '${value.library}' is not loaded, so '${value.key}' could not be verified.`,
35
+ ...context
36
+ };
37
+ }
38
+ return resolution.isResolved ? undefined : {
39
+ code: codes[resolution.diagnostic.kind],
40
+ severity,
41
+ message: `${resolution.diagnostic.message}.`,
42
+ ...context
43
+ };
44
+ }
45
+ /**
46
+ * Checks the icon fields of collection items.
47
+ *
48
+ * @param itemDescriptor What the items look like.
49
+ * @param items The items, each with its id and field values.
50
+ */ function iconProblemsOfItems(catalog, itemDescriptor, items, severity, context) {
51
+ const iconFields = (itemDescriptor?.properties ?? []).filter((field)=>field.valueType === scene_model.PropertyValueType.Icon);
52
+ return items.flatMap((item)=>iconFields.flatMap((field)=>{
53
+ const problem = iconProblem(catalog, item.values[field.path], severity, {
54
+ ...context,
55
+ itemId: item.id,
56
+ ...item.instance === undefined ? {} : {
57
+ instance: item.instance
58
+ }
59
+ });
60
+ return problem ? [
61
+ {
62
+ ...problem,
63
+ message: `'${field.label}' of '${item.id}': ${problem.message}`
64
+ }
65
+ ] : [];
66
+ }));
67
+ }
68
+ /**
69
+ * Checks a property's value - an icon, or a collection whose items have icon fields - against the effective icon
70
+ * catalog. Any other kind of property has nothing to check.
71
+ *
72
+ * @param descriptor The property.
73
+ * @param value The value; for a collection, the flat items (`{ id, ...fields }`) as they are stored.
74
+ */ function iconProblemsOfProperty(catalog, descriptor, value, severity, context) {
75
+ if (descriptor.valueType === scene_model.PropertyValueType.Icon) {
76
+ const problem = iconProblem(catalog, value, severity, {
77
+ ...context,
78
+ path: descriptor.path
79
+ });
80
+ return problem ? [
81
+ {
82
+ ...problem,
83
+ message: `'${descriptor.label}': ${problem.message}`
84
+ }
85
+ ] : [];
86
+ }
87
+ if (descriptor.valueType === scene_model.PropertyValueType.Collection && Array.isArray(value)) {
88
+ const items = value.filter((item)=>item !== null && typeof item === 'object').map(({ id, ...values })=>({
89
+ id: String(id),
90
+ values
91
+ }));
92
+ return iconProblemsOfItems(catalog, descriptor.item, items, severity, {
93
+ ...context,
94
+ path: descriptor.path
95
+ });
96
+ }
97
+ return [];
98
+ }
99
+
100
+ exports.iconProblem = iconProblem;
101
+ exports.iconProblemsOfItems = iconProblemsOfItems;
102
+ exports.iconProblemsOfProperty = iconProblemsOfProperty;
103
+ //# sourceMappingURL=iconDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconDiagnostics.js","sources":["../../../editing/iconDiagnostics.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 { CollectionItemDescriptor, DiagnosticCode, DiagnosticSeverity, PropertyDescriptor, PropertyValueType, SceneDiagnostic, isIconReference } from '@cratis/scene.model';\nimport { EffectiveIconCatalog } from '../icons/EffectiveIconCatalog';\nimport { IconDiagnosticKind } from '../icons/IconDiagnostic';\nimport { DiagnosticContext } from './diagnostics';\n\nconst codes: Record<IconDiagnosticKind, DiagnosticCode> = {\n 'missing-library': DiagnosticCode.MissingIconLibrary,\n 'missing-icon': DiagnosticCode.MissingIcon,\n 'missing-variant': DiagnosticCode.MissingIconVariant,\n 'incompatible-version': DiagnosticCode.IncompatibleIconLibrary,\n 'catalog-unavailable': DiagnosticCode.IconCatalogUnavailable,\n};\n\n/**\n * Checks one icon value against the effective icon catalog.\n *\n * Nothing is rewritten or dropped: this only reports. A value whose library, icon or variant is missing, or\n * whose library is at an incompatible version, produces a diagnostic of the given severity - an error when\n * the value is being *set* (the edit is refused), a warning when it is already stored (it is kept, and\n * applies again if the icon comes back). A value that cannot be judged yet, because its library's catalog has\n * not been loaded, produces an `IconNotVerified` warning rather than silently passing.\n *\n * @param catalog The effective catalog of the profile being edited.\n * @param value The value; anything that is not an icon reference is left to `validateValue`.\n * @param severity How serious a definite problem is.\n * @param context What the diagnostic is about.\n */\nexport function iconProblem(catalog: EffectiveIconCatalog, value: unknown, severity: DiagnosticSeverity, context: DiagnosticContext): SceneDiagnostic | undefined {\n if (!isIconReference(value)) return undefined;\n\n const resolution = catalog.lookup(value);\n if (resolution === undefined) {\n return {\n code: DiagnosticCode.IconNotVerified,\n severity: DiagnosticSeverity.Warning,\n message: `The catalog of the icon library '${value.library}' is not loaded, so '${value.key}' could not be verified.`,\n ...context,\n };\n }\n\n return resolution.isResolved ? undefined : { code: codes[resolution.diagnostic.kind], severity, message: `${resolution.diagnostic.message}.`, ...context };\n}\n\n/**\n * Checks the icon fields of collection items.\n *\n * @param itemDescriptor What the items look like.\n * @param items The items, each with its id and field values.\n */\nexport function iconProblemsOfItems(\n catalog: EffectiveIconCatalog,\n itemDescriptor: CollectionItemDescriptor | undefined,\n items: { id: string; values: Record<string, unknown>; instance?: string }[],\n severity: DiagnosticSeverity,\n context: DiagnosticContext\n): SceneDiagnostic[] {\n const iconFields = (itemDescriptor?.properties ?? []).filter((field) => field.valueType === PropertyValueType.Icon);\n return items.flatMap((item) =>\n iconFields.flatMap((field) => {\n const problem = iconProblem(catalog, item.values[field.path], severity, { ...context, itemId: item.id, ...(item.instance === undefined ? {} : { instance: item.instance }) });\n return problem ? [{ ...problem, message: `'${field.label}' of '${item.id}': ${problem.message}` }] : [];\n })\n );\n}\n\n/**\n * Checks a property's value - an icon, or a collection whose items have icon fields - against the effective icon\n * catalog. Any other kind of property has nothing to check.\n *\n * @param descriptor The property.\n * @param value The value; for a collection, the flat items (`{ id, ...fields }`) as they are stored.\n */\nexport function iconProblemsOfProperty(catalog: EffectiveIconCatalog, descriptor: PropertyDescriptor, value: unknown, severity: DiagnosticSeverity, context: DiagnosticContext): SceneDiagnostic[] {\n if (descriptor.valueType === PropertyValueType.Icon) {\n const problem = iconProblem(catalog, value, severity, { ...context, path: descriptor.path });\n return problem ? [{ ...problem, message: `'${descriptor.label}': ${problem.message}` }] : [];\n }\n\n if (descriptor.valueType === PropertyValueType.Collection && Array.isArray(value)) {\n const items = value\n .filter((item): item is Record<string, unknown> => item !== null && typeof item === 'object')\n .map(({ id, ...values }) => ({ id: String(id), values }));\n return iconProblemsOfItems(catalog, descriptor.item, items, severity, { ...context, path: descriptor.path });\n }\n\n return [];\n}\n"],"names":["codes","DiagnosticCode","MissingIconLibrary","MissingIcon","MissingIconVariant","IncompatibleIconLibrary","IconCatalogUnavailable","iconProblem","catalog","value","severity","context","isIconReference","undefined","resolution","lookup","code","IconNotVerified","DiagnosticSeverity","Warning","message","library","key","isResolved","diagnostic","kind","iconProblemsOfItems","itemDescriptor","items","iconFields","properties","filter","field","valueType","PropertyValueType","Icon","flatMap","item","problem","values","path","itemId","id","instance","label","iconProblemsOfProperty","descriptor","Collection","Array","isArray","map","String"],"mappings":"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"}