@cratis/scene.engine 4.2.0 → 4.3.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 (310) 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/describeNode.js +63 -0
  12. package/dist/cjs/editing/describeNode.js.map +1 -0
  13. package/dist/cjs/editing/diagnostics.js +36 -0
  14. package/dist/cjs/editing/diagnostics.js.map +1 -0
  15. package/dist/cjs/editing/documentPaths.js +45 -0
  16. package/dist/cjs/editing/documentPaths.js.map +1 -0
  17. package/dist/cjs/editing/exposureEdits.js +106 -0
  18. package/dist/cjs/editing/exposureEdits.js.map +1 -0
  19. package/dist/cjs/editing/exposureGrants.js +115 -0
  20. package/dist/cjs/editing/exposureGrants.js.map +1 -0
  21. package/dist/cjs/editing/indexDocument.js +400 -0
  22. package/dist/cjs/editing/indexDocument.js.map +1 -0
  23. package/dist/cjs/editing/inspect.js +127 -0
  24. package/dist/cjs/editing/inspect.js.map +1 -0
  25. package/dist/cjs/editing/instanceEdits.js +255 -0
  26. package/dist/cjs/editing/instanceEdits.js.map +1 -0
  27. package/dist/cjs/editing/layoutTypeDescriptors.js +425 -0
  28. package/dist/cjs/editing/layoutTypeDescriptors.js.map +1 -0
  29. package/dist/cjs/editing/layoutTypeEdits.js +141 -0
  30. package/dist/cjs/editing/layoutTypeEdits.js.map +1 -0
  31. package/dist/cjs/editing/nodeIds.js +115 -0
  32. package/dist/cjs/editing/nodeIds.js.map +1 -0
  33. package/dist/cjs/editing/pathAccess.js +53 -0
  34. package/dist/cjs/editing/pathAccess.js.map +1 -0
  35. package/dist/cjs/editing/propertyEdits.js +118 -0
  36. package/dist/cjs/editing/propertyEdits.js.map +1 -0
  37. package/dist/cjs/editing/resolveEffectiveConfiguration.js +200 -0
  38. package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -0
  39. package/dist/cjs/editing/resolveTemplateChain.js +100 -0
  40. package/dist/cjs/editing/resolveTemplateChain.js.map +1 -0
  41. package/dist/cjs/editing/structureEdits.js +231 -0
  42. package/dist/cjs/editing/structureEdits.js.map +1 -0
  43. package/dist/cjs/editing/validateBinding.js +111 -0
  44. package/dist/cjs/editing/validateBinding.js.map +1 -0
  45. package/dist/cjs/editing/validateValue.js +114 -0
  46. package/dist/cjs/editing/validateValue.js.map +1 -0
  47. package/dist/cjs/index.js +51 -0
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/esm/editing/DescriptorCatalog.d.ts +9 -0
  50. package/dist/esm/editing/DescriptorCatalog.d.ts.map +1 -0
  51. package/dist/esm/editing/DescriptorCatalog.js +38 -0
  52. package/dist/esm/editing/DescriptorCatalog.js.map +1 -0
  53. package/dist/esm/editing/DocumentIndex.d.ts +31 -0
  54. package/dist/esm/editing/DocumentIndex.d.ts.map +1 -0
  55. package/dist/esm/editing/DocumentIndex.js +2 -0
  56. package/dist/esm/editing/DocumentIndex.js.map +1 -0
  57. package/dist/esm/editing/EditOutcome.d.ts +7 -0
  58. package/dist/esm/editing/EditOutcome.d.ts.map +1 -0
  59. package/dist/esm/editing/EditOutcome.js +2 -0
  60. package/dist/esm/editing/EditOutcome.js.map +1 -0
  61. package/dist/esm/editing/EditSession.d.ts +20 -0
  62. package/dist/esm/editing/EditSession.d.ts.map +1 -0
  63. package/dist/esm/editing/EditSession.js +42 -0
  64. package/dist/esm/editing/EditSession.js.map +1 -0
  65. package/dist/esm/editing/EditingContext.d.ts +8 -0
  66. package/dist/esm/editing/EditingContext.d.ts.map +1 -0
  67. package/dist/esm/editing/EditingContext.js +2 -0
  68. package/dist/esm/editing/EditingContext.js.map +1 -0
  69. package/dist/esm/editing/TemplateChain.d.ts +13 -0
  70. package/dist/esm/editing/TemplateChain.d.ts.map +1 -0
  71. package/dist/esm/editing/TemplateChain.js +2 -0
  72. package/dist/esm/editing/TemplateChain.js.map +1 -0
  73. package/dist/esm/editing/applyEdit.d.ts +5 -0
  74. package/dist/esm/editing/applyEdit.d.ts.map +1 -0
  75. package/dist/esm/editing/applyEdit.js +81 -0
  76. package/dist/esm/editing/applyEdit.js.map +1 -0
  77. package/dist/esm/editing/applyEffectiveConfiguration.d.ts +3 -0
  78. package/dist/esm/editing/applyEffectiveConfiguration.d.ts.map +1 -0
  79. package/dist/esm/editing/applyEffectiveConfiguration.js +60 -0
  80. package/dist/esm/editing/applyEffectiveConfiguration.js.map +1 -0
  81. package/dist/esm/editing/collectComponents.d.ts +3 -0
  82. package/dist/esm/editing/collectComponents.d.ts.map +1 -0
  83. package/dist/esm/editing/collectComponents.js +32 -0
  84. package/dist/esm/editing/collectComponents.js.map +1 -0
  85. package/dist/esm/editing/describeNode.d.ts +11 -0
  86. package/dist/esm/editing/describeNode.d.ts.map +1 -0
  87. package/dist/esm/editing/describeNode.js +60 -0
  88. package/dist/esm/editing/describeNode.js.map +1 -0
  89. package/dist/esm/editing/diagnostics.d.ts +6 -0
  90. package/dist/esm/editing/diagnostics.d.ts.map +1 -0
  91. package/dist/esm/editing/diagnostics.js +32 -0
  92. package/dist/esm/editing/diagnostics.js.map +1 -0
  93. package/dist/esm/editing/documentPaths.d.ts +8 -0
  94. package/dist/esm/editing/documentPaths.d.ts.map +1 -0
  95. package/dist/esm/editing/documentPaths.js +41 -0
  96. package/dist/esm/editing/documentPaths.js.map +1 -0
  97. package/dist/esm/editing/exposureEdits.d.ts +5 -0
  98. package/dist/esm/editing/exposureEdits.d.ts.map +1 -0
  99. package/dist/esm/editing/exposureEdits.js +103 -0
  100. package/dist/esm/editing/exposureEdits.js.map +1 -0
  101. package/dist/esm/editing/exposureGrants.d.ts +21 -0
  102. package/dist/esm/editing/exposureGrants.d.ts.map +1 -0
  103. package/dist/esm/editing/exposureGrants.js +112 -0
  104. package/dist/esm/editing/exposureGrants.js.map +1 -0
  105. package/dist/esm/editing/given/a_layout_document.d.ts +14 -0
  106. package/dist/esm/editing/given/a_layout_document.d.ts.map +1 -0
  107. package/dist/esm/editing/given/a_layout_document.js +67 -0
  108. package/dist/esm/editing/given/a_layout_document.js.map +1 -0
  109. package/dist/esm/editing/given/a_scene_document.d.ts +20 -0
  110. package/dist/esm/editing/given/a_scene_document.d.ts.map +1 -0
  111. package/dist/esm/editing/given/a_scene_document.js +110 -0
  112. package/dist/esm/editing/given/a_scene_document.js.map +1 -0
  113. package/dist/esm/editing/index.d.ts +19 -0
  114. package/dist/esm/editing/index.d.ts.map +1 -0
  115. package/dist/esm/editing/index.js +19 -0
  116. package/dist/esm/editing/index.js.map +1 -0
  117. package/dist/esm/editing/indexDocument.d.ts +6 -0
  118. package/dist/esm/editing/indexDocument.d.ts.map +1 -0
  119. package/dist/esm/editing/indexDocument.js +396 -0
  120. package/dist/esm/editing/indexDocument.js.map +1 -0
  121. package/dist/esm/editing/inspect.d.ts +8 -0
  122. package/dist/esm/editing/inspect.d.ts.map +1 -0
  123. package/dist/esm/editing/inspect.js +124 -0
  124. package/dist/esm/editing/inspect.js.map +1 -0
  125. package/dist/esm/editing/instanceEdits.d.ts +9 -0
  126. package/dist/esm/editing/instanceEdits.d.ts.map +1 -0
  127. package/dist/esm/editing/instanceEdits.js +248 -0
  128. package/dist/esm/editing/instanceEdits.js.map +1 -0
  129. package/dist/esm/editing/layoutTypeDescriptors.d.ts +5 -0
  130. package/dist/esm/editing/layoutTypeDescriptors.d.ts.map +1 -0
  131. package/dist/esm/editing/layoutTypeDescriptors.js +421 -0
  132. package/dist/esm/editing/layoutTypeDescriptors.js.map +1 -0
  133. package/dist/esm/editing/layoutTypeEdits.d.ts +4 -0
  134. package/dist/esm/editing/layoutTypeEdits.d.ts.map +1 -0
  135. package/dist/esm/editing/layoutTypeEdits.js +139 -0
  136. package/dist/esm/editing/layoutTypeEdits.js.map +1 -0
  137. package/dist/esm/editing/nodeIds.d.ts +14 -0
  138. package/dist/esm/editing/nodeIds.d.ts.map +1 -0
  139. package/dist/esm/editing/nodeIds.js +102 -0
  140. package/dist/esm/editing/nodeIds.js.map +1 -0
  141. package/dist/esm/editing/pathAccess.d.ts +7 -0
  142. package/dist/esm/editing/pathAccess.d.ts.map +1 -0
  143. package/dist/esm/editing/pathAccess.js +48 -0
  144. package/dist/esm/editing/pathAccess.js.map +1 -0
  145. package/dist/esm/editing/propertyEdits.d.ts +15 -0
  146. package/dist/esm/editing/propertyEdits.d.ts.map +1 -0
  147. package/dist/esm/editing/propertyEdits.js +113 -0
  148. package/dist/esm/editing/propertyEdits.js.map +1 -0
  149. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts +5 -0
  150. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -0
  151. package/dist/esm/editing/resolveEffectiveConfiguration.js +198 -0
  152. package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -0
  153. package/dist/esm/editing/resolveTemplateChain.d.ts +4 -0
  154. package/dist/esm/editing/resolveTemplateChain.d.ts.map +1 -0
  155. package/dist/esm/editing/resolveTemplateChain.js +98 -0
  156. package/dist/esm/editing/resolveTemplateChain.js.map +1 -0
  157. package/dist/esm/editing/structureEdits.d.ts +6 -0
  158. package/dist/esm/editing/structureEdits.d.ts.map +1 -0
  159. package/dist/esm/editing/structureEdits.js +227 -0
  160. package/dist/esm/editing/structureEdits.js.map +1 -0
  161. package/dist/esm/editing/validateBinding.d.ts +7 -0
  162. package/dist/esm/editing/validateBinding.d.ts.map +1 -0
  163. package/dist/esm/editing/validateBinding.js +108 -0
  164. package/dist/esm/editing/validateBinding.js.map +1 -0
  165. package/dist/esm/editing/validateValue.d.ts +8 -0
  166. package/dist/esm/editing/validateValue.d.ts.map +1 -0
  167. package/dist/esm/editing/validateValue.js +111 -0
  168. package/dist/esm/editing/validateValue.js.map +1 -0
  169. package/dist/esm/index.d.ts +1 -0
  170. package/dist/esm/index.d.ts.map +1 -1
  171. package/dist/esm/index.js +14 -0
  172. package/dist/esm/index.js.map +1 -1
  173. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  174. package/editing/DescriptorCatalog.ts +51 -0
  175. package/editing/DocumentIndex.ts +73 -0
  176. package/editing/EditOutcome.ts +21 -0
  177. package/editing/EditSession.ts +50 -0
  178. package/editing/EditingContext.ts +23 -0
  179. package/editing/TemplateChain.ts +36 -0
  180. package/editing/applyEdit.ts +69 -0
  181. package/editing/applyEffectiveConfiguration.ts +53 -0
  182. package/editing/collectComponents.ts +36 -0
  183. package/editing/describeNode.ts +61 -0
  184. package/editing/diagnostics.ts +30 -0
  185. package/editing/documentPaths.ts +40 -0
  186. package/editing/exposureEdits.ts +119 -0
  187. package/editing/exposureGrants.ts +159 -0
  188. package/editing/given/a_layout_document.ts +88 -0
  189. package/editing/given/a_scene_document.ts +135 -0
  190. package/editing/index.ts +21 -0
  191. package/editing/indexDocument.ts +237 -0
  192. package/editing/inspect.ts +142 -0
  193. package/editing/instanceEdits.ts +243 -0
  194. package/editing/layoutTypeDescriptors.ts +191 -0
  195. package/editing/layoutTypeEdits.ts +135 -0
  196. package/editing/nodeIds.ts +111 -0
  197. package/editing/pathAccess.ts +81 -0
  198. package/editing/propertyEdits.ts +119 -0
  199. package/editing/resolveEffectiveConfiguration.ts +202 -0
  200. package/editing/resolveTemplateChain.ts +109 -0
  201. package/editing/structureEdits.ts +234 -0
  202. package/editing/validateBinding.ts +103 -0
  203. package/editing/validateValue.ts +130 -0
  204. package/index.ts +1 -0
  205. package/package.json +5 -4
  206. package/dist/esm/for_aggregateContributions/when_aggregating_by_contribution_point.d.ts +0 -2
  207. package/dist/esm/for_aggregateContributions/when_aggregating_by_contribution_point.d.ts.map +0 -1
  208. package/dist/esm/for_aggregateContributions/when_aggregating_by_contribution_point.js +0 -23
  209. package/dist/esm/for_aggregateContributions/when_aggregating_by_contribution_point.js.map +0 -1
  210. package/dist/esm/for_buildStarterProfile/when_checking_against_the_shared_fixture_corpus.d.ts +0 -2
  211. package/dist/esm/for_buildStarterProfile/when_checking_against_the_shared_fixture_corpus.d.ts.map +0 -1
  212. package/dist/esm/for_buildStarterProfile/when_checking_against_the_shared_fixture_corpus.js +0 -16
  213. package/dist/esm/for_buildStarterProfile/when_checking_against_the_shared_fixture_corpus.js.map +0 -1
  214. package/dist/esm/for_computeSizeClass/when_computing_the_size_class.d.ts +0 -2
  215. package/dist/esm/for_computeSizeClass/when_computing_the_size_class.d.ts.map +0 -1
  216. package/dist/esm/for_computeSizeClass/when_computing_the_size_class.js +0 -17
  217. package/dist/esm/for_computeSizeClass/when_computing_the_size_class.js.map +0 -1
  218. package/dist/esm/for_evaluateFlowArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts +0 -2
  219. package/dist/esm/for_evaluateFlowArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts.map +0 -1
  220. package/dist/esm/for_evaluateFlowArrangement/when_evaluating_against_the_shared_fixture_corpus.js +0 -43
  221. package/dist/esm/for_evaluateFlowArrangement/when_evaluating_against_the_shared_fixture_corpus.js.map +0 -1
  222. package/dist/esm/for_evaluateFreeformArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts +0 -2
  223. package/dist/esm/for_evaluateFreeformArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts.map +0 -1
  224. package/dist/esm/for_evaluateFreeformArrangement/when_evaluating_against_the_shared_fixture_corpus.js +0 -46
  225. package/dist/esm/for_evaluateFreeformArrangement/when_evaluating_against_the_shared_fixture_corpus.js.map +0 -1
  226. package/dist/esm/for_evaluateFreeformSlotArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts +0 -2
  227. package/dist/esm/for_evaluateFreeformSlotArrangement/when_evaluating_against_the_shared_fixture_corpus.d.ts.map +0 -1
  228. package/dist/esm/for_evaluateFreeformSlotArrangement/when_evaluating_against_the_shared_fixture_corpus.js +0 -25
  229. package/dist/esm/for_evaluateFreeformSlotArrangement/when_evaluating_against_the_shared_fixture_corpus.js.map +0 -1
  230. package/dist/esm/for_incompatibleStarterThemes/when_checking_against_the_shared_fixture_corpus.d.ts +0 -2
  231. package/dist/esm/for_incompatibleStarterThemes/when_checking_against_the_shared_fixture_corpus.d.ts.map +0 -1
  232. package/dist/esm/for_incompatibleStarterThemes/when_checking_against_the_shared_fixture_corpus.js +0 -17
  233. package/dist/esm/for_incompatibleStarterThemes/when_checking_against_the_shared_fixture_corpus.js.map +0 -1
  234. package/dist/esm/for_packageCatalog/when_querying_against_the_shared_fixture_corpus.d.ts +0 -2
  235. package/dist/esm/for_packageCatalog/when_querying_against_the_shared_fixture_corpus.d.ts.map +0 -1
  236. package/dist/esm/for_packageCatalog/when_querying_against_the_shared_fixture_corpus.js +0 -22
  237. package/dist/esm/for_packageCatalog/when_querying_against_the_shared_fixture_corpus.js.map +0 -1
  238. package/dist/esm/for_packageDependencies/fixtures.d.ts +0 -38
  239. package/dist/esm/for_packageDependencies/fixtures.d.ts.map +0 -1
  240. package/dist/esm/for_packageDependencies/fixtures.js +0 -5
  241. package/dist/esm/for_packageDependencies/fixtures.js.map +0 -1
  242. package/dist/esm/for_packageDependencies/when_resolving_against_the_shared_fixture_corpus.d.ts +0 -2
  243. package/dist/esm/for_packageDependencies/when_resolving_against_the_shared_fixture_corpus.d.ts.map +0 -1
  244. package/dist/esm/for_packageDependencies/when_resolving_against_the_shared_fixture_corpus.js +0 -29
  245. package/dist/esm/for_packageDependencies/when_resolving_against_the_shared_fixture_corpus.js.map +0 -1
  246. package/dist/esm/for_packageVersionRange/when_checking_against_the_shared_fixture_corpus.d.ts +0 -2
  247. package/dist/esm/for_packageVersionRange/when_checking_against_the_shared_fixture_corpus.d.ts.map +0 -1
  248. package/dist/esm/for_packageVersionRange/when_checking_against_the_shared_fixture_corpus.js +0 -10
  249. package/dist/esm/for_packageVersionRange/when_checking_against_the_shared_fixture_corpus.js.map +0 -1
  250. package/dist/esm/for_panelKind/when_telling_the_panels_apart.d.ts +0 -2
  251. package/dist/esm/for_panelKind/when_telling_the_panels_apart.d.ts.map +0 -1
  252. package/dist/esm/for_panelKind/when_telling_the_panels_apart.js +0 -38
  253. package/dist/esm/for_panelKind/when_telling_the_panels_apart.js.map +0 -1
  254. package/dist/esm/for_renderElement/when_rendering_a_mixed_tree.d.ts +0 -2
  255. package/dist/esm/for_renderElement/when_rendering_a_mixed_tree.d.ts.map +0 -1
  256. package/dist/esm/for_renderElement/when_rendering_a_mixed_tree.js +0 -46
  257. package/dist/esm/for_renderElement/when_rendering_a_mixed_tree.js.map +0 -1
  258. package/dist/esm/for_resolveBehaviors/when_resolving_additive_attachments.d.ts +0 -2
  259. package/dist/esm/for_resolveBehaviors/when_resolving_additive_attachments.d.ts.map +0 -1
  260. package/dist/esm/for_resolveBehaviors/when_resolving_additive_attachments.js +0 -68
  261. package/dist/esm/for_resolveBehaviors/when_resolving_additive_attachments.js.map +0 -1
  262. package/dist/esm/for_resolveComponentName/when_resolving_against_the_shared_fixture_corpus.d.ts +0 -2
  263. package/dist/esm/for_resolveComponentName/when_resolving_against_the_shared_fixture_corpus.d.ts.map +0 -1
  264. package/dist/esm/for_resolveComponentName/when_resolving_against_the_shared_fixture_corpus.js +0 -20
  265. package/dist/esm/for_resolveComponentName/when_resolving_against_the_shared_fixture_corpus.js.map +0 -1
  266. package/dist/esm/for_resolveScreenTemplates/when_resolving_against_the_shared_fixture_corpus.d.ts +0 -2
  267. package/dist/esm/for_resolveScreenTemplates/when_resolving_against_the_shared_fixture_corpus.d.ts.map +0 -1
  268. package/dist/esm/for_resolveScreenTemplates/when_resolving_against_the_shared_fixture_corpus.js +0 -30
  269. package/dist/esm/for_resolveScreenTemplates/when_resolving_against_the_shared_fixture_corpus.js.map +0 -1
  270. package/dist/esm/for_resolveStrings/when_resolving_a_strings_reference.d.ts +0 -2
  271. package/dist/esm/for_resolveStrings/when_resolving_a_strings_reference.d.ts.map +0 -1
  272. package/dist/esm/for_resolveStrings/when_resolving_a_strings_reference.js +0 -69
  273. package/dist/esm/for_resolveStrings/when_resolving_a_strings_reference.js.map +0 -1
  274. package/dist/esm/for_runActions/given/a_recording_dispatcher.d.ts +0 -21
  275. package/dist/esm/for_runActions/given/a_recording_dispatcher.d.ts.map +0 -1
  276. package/dist/esm/for_runActions/given/a_recording_dispatcher.js +0 -45
  277. package/dist/esm/for_runActions/given/a_recording_dispatcher.js.map +0 -1
  278. package/dist/esm/for_runActions/when_running_a_sequence_of_actions.d.ts +0 -2
  279. package/dist/esm/for_runActions/when_running_a_sequence_of_actions.d.ts.map +0 -1
  280. package/dist/esm/for_runActions/when_running_a_sequence_of_actions.js +0 -126
  281. package/dist/esm/for_runActions/when_running_a_sequence_of_actions.js.map +0 -1
  282. package/dist/esm/for_runActions/when_running_against_the_shared_fixture_corpus.d.ts +0 -2
  283. package/dist/esm/for_runActions/when_running_against_the_shared_fixture_corpus.d.ts.map +0 -1
  284. package/dist/esm/for_runActions/when_running_against_the_shared_fixture_corpus.js +0 -61
  285. package/dist/esm/for_runActions/when_running_against_the_shared_fixture_corpus.js.map +0 -1
  286. package/dist/esm/for_themeCompatibility/when_checking_against_the_shared_fixture_corpus.d.ts +0 -2
  287. package/dist/esm/for_themeCompatibility/when_checking_against_the_shared_fixture_corpus.d.ts.map +0 -1
  288. package/dist/esm/for_themeCompatibility/when_checking_against_the_shared_fixture_corpus.js +0 -18
  289. package/dist/esm/for_themeCompatibility/when_checking_against_the_shared_fixture_corpus.js.map +0 -1
  290. package/for_aggregateContributions/when_aggregating_by_contribution_point.ts +0 -31
  291. package/for_buildStarterProfile/when_checking_against_the_shared_fixture_corpus.ts +0 -32
  292. package/for_computeSizeClass/when_computing_the_size_class.ts +0 -23
  293. package/for_evaluateFlowArrangement/when_evaluating_against_the_shared_fixture_corpus.ts +0 -67
  294. package/for_evaluateFreeformArrangement/when_evaluating_against_the_shared_fixture_corpus.ts +0 -68
  295. package/for_evaluateFreeformSlotArrangement/when_evaluating_against_the_shared_fixture_corpus.ts +0 -47
  296. package/for_incompatibleStarterThemes/when_checking_against_the_shared_fixture_corpus.ts +0 -34
  297. package/for_packageCatalog/when_querying_against_the_shared_fixture_corpus.ts +0 -26
  298. package/for_packageDependencies/fixtures.ts +0 -44
  299. package/for_packageDependencies/when_resolving_against_the_shared_fixture_corpus.ts +0 -39
  300. package/for_packageVersionRange/when_checking_against_the_shared_fixture_corpus.ts +0 -13
  301. package/for_panelKind/when_telling_the_panels_apart.ts +0 -47
  302. package/for_renderElement/when_rendering_a_mixed_tree.ts +0 -58
  303. package/for_resolveBehaviors/when_resolving_additive_attachments.ts +0 -100
  304. package/for_resolveComponentName/when_resolving_against_the_shared_fixture_corpus.ts +0 -36
  305. package/for_resolveScreenTemplates/when_resolving_against_the_shared_fixture_corpus.ts +0 -49
  306. package/for_resolveStrings/when_resolving_a_strings_reference.ts +0 -85
  307. package/for_runActions/given/a_recording_dispatcher.ts +0 -72
  308. package/for_runActions/when_running_a_sequence_of_actions.ts +0 -226
  309. package/for_runActions/when_running_against_the_shared_fixture_corpus.ts +0 -124
  310. package/for_themeCompatibility/when_checking_against_the_shared_fixture_corpus.ts +0 -37
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var resolveScreenTemplates = require('../resolveScreenTemplates.js');
5
+ var collectComponents = require('./collectComponents.js');
6
+ var diagnostics = require('./diagnostics.js');
7
+
8
+ // Copyright (c) Cratis. All rights reserved.
9
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
10
+ function exposuresOf(document, owner) {
11
+ return document.exposures.find((declaration)=>declaration.owner === owner)?.properties ?? [];
12
+ }
13
+ function level(document, kind, prefix, owner) {
14
+ return {
15
+ owner: owner.name,
16
+ kind,
17
+ instance: `${prefix}:${owner.name}`,
18
+ elements: collectComponents.collectComponents(owner),
19
+ exposures: exposuresOf(document, owner.name)
20
+ };
21
+ }
22
+ function templateLevels(document, layout, template, chain) {
23
+ const placements = resolveScreenTemplates.resolveScreenTemplates(layout, document.screenTemplates).placements;
24
+ const ancestry = [
25
+ template
26
+ ];
27
+ let current = template.name;
28
+ for(let guard = 0; guard <= document.screenTemplates.length; guard++){
29
+ const placement = placements.find((candidate)=>candidate.template === current);
30
+ if (!placement || placement.container === layout.name) break;
31
+ const parent = document.screenTemplates.find((candidate)=>candidate.name === placement.container);
32
+ if (!parent) break;
33
+ ancestry.unshift(parent);
34
+ current = parent.name;
35
+ }
36
+ if (!placements.some((placement)=>placement.template === ancestry[0].name)) {
37
+ chain.diagnostics.push(diagnostics.warningDiagnostic(scene_model.DiagnosticCode.UnknownScope, `The template '${ancestry[0].name}' could not be placed in the layout '${layout.name}', so nothing outside it is part of the chain.`));
38
+ return ancestry.slice(-1).map((item)=>level(document, scene_model.SceneNodeKind.ScreenTemplate, 'template', item));
39
+ }
40
+ return ancestry.map((item)=>level(document, scene_model.SceneNodeKind.ScreenTemplate, 'template', item));
41
+ }
42
+ /**
43
+ * Assembles the chain of owners an editing scope sits inside: the layout, each template down to the one the
44
+ * scope is in, and the scope itself.
45
+ *
46
+ * The same chain feeds {@link resolveEffectiveConfiguration} for the runtime and the editor, so both see the same
47
+ * nesting. A scope that cannot be found yields an empty chain with an error diagnostic.
48
+ *
49
+ * @param document The document to read.
50
+ * @param scope What is being edited.
51
+ * @returns The chain, outermost first.
52
+ */ function resolveTemplateChain(document, scope) {
53
+ const chain = {
54
+ levels: [],
55
+ diagnostics: []
56
+ };
57
+ switch(scope.kind){
58
+ case scene_model.EditingScopeKind.Layout:
59
+ {
60
+ const layout = document.layouts.find((candidate)=>candidate.name === scope.name);
61
+ if (layout) chain.levels.push(level(document, scene_model.SceneNodeKind.Layout, 'layout', layout));
62
+ break;
63
+ }
64
+ case scene_model.EditingScopeKind.DialogTemplate:
65
+ {
66
+ const dialog = document.dialogTemplates.find((candidate)=>candidate.name === scope.name);
67
+ if (dialog) chain.levels.push(level(document, scene_model.SceneNodeKind.DialogTemplate, 'dialog', dialog));
68
+ break;
69
+ }
70
+ case scene_model.EditingScopeKind.ScreenTemplate:
71
+ {
72
+ const template = document.screenTemplates.find((candidate)=>candidate.name === scope.name);
73
+ const layout = document.layouts.find((candidate)=>candidate.name === scope.layout) ?? (scope.layout === undefined && document.layouts.length === 1 ? document.layouts[0] : undefined);
74
+ if (template && layout) {
75
+ chain.levels.push(level(document, scene_model.SceneNodeKind.Layout, 'layout', layout), ...templateLevels(document, layout, template, chain));
76
+ } else if (template) {
77
+ chain.levels.push(level(document, scene_model.SceneNodeKind.ScreenTemplate, 'template', template));
78
+ }
79
+ break;
80
+ }
81
+ default:
82
+ {
83
+ const screen = document.screens.find((candidate)=>candidate.name === scope.name);
84
+ if (!screen) break;
85
+ const layout = document.layouts.find((candidate)=>candidate.name === screen.layout);
86
+ const template = screen.screenTemplate === undefined ? undefined : document.screenTemplates.find((candidate)=>candidate.name === screen.screenTemplate);
87
+ if (layout) chain.levels.push(level(document, scene_model.SceneNodeKind.Layout, 'layout', layout));
88
+ if (layout && template) chain.levels.push(...templateLevels(document, layout, template, chain));
89
+ else if (template) chain.levels.push(level(document, scene_model.SceneNodeKind.ScreenTemplate, 'template', template));
90
+ chain.levels.push(level(document, scene_model.SceneNodeKind.Screen, 'screen', screen));
91
+ }
92
+ }
93
+ if (chain.levels.length === 0) {
94
+ chain.diagnostics.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnknownScope, `There is no ${scope.kind} named '${scope.name}'.`));
95
+ }
96
+ return chain;
97
+ }
98
+
99
+ exports.resolveTemplateChain = resolveTemplateChain;
100
+ //# sourceMappingURL=resolveTemplateChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveTemplateChain.js","sources":["../../../editing/resolveTemplateChain.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, DialogTemplate, EditingScope, EditingScopeKind, ExposedProperty, Layout, SceneDocument,\n SceneNodeKind, Screen, ScreenTemplate,\n} from '@cratis/scene.model';\nimport { resolveScreenTemplates } from '../resolveScreenTemplates';\nimport { collectComponents } from './collectComponents';\nimport { errorDiagnostic, warningDiagnostic } from './diagnostics';\nimport { TemplateChain, TemplateChainLevel } from './TemplateChain';\n\nfunction exposuresOf(document: SceneDocument, owner: string): ExposedProperty[] {\n return document.exposures.find(declaration => declaration.owner === owner)?.properties ?? [];\n}\n\nfunction level(document: SceneDocument, kind: SceneNodeKind, prefix: string, owner: Layout | ScreenTemplate | DialogTemplate | Screen): TemplateChainLevel {\n return {\n owner: owner.name,\n kind,\n instance: `${prefix}:${owner.name}`,\n elements: collectComponents(owner),\n exposures: exposuresOf(document, owner.name),\n };\n}\n\nfunction templateLevels(document: SceneDocument, layout: Layout, template: ScreenTemplate, chain: TemplateChain): TemplateChainLevel[] {\n const placements = resolveScreenTemplates(layout, document.screenTemplates).placements;\n const ancestry: ScreenTemplate[] = [template];\n\n let current = template.name;\n for (let guard = 0; guard <= document.screenTemplates.length; guard++) {\n const placement = placements.find(candidate => candidate.template === current);\n if (!placement || placement.container === layout.name) break;\n\n const parent = document.screenTemplates.find(candidate => candidate.name === placement.container);\n if (!parent) break;\n ancestry.unshift(parent);\n current = parent.name;\n }\n\n if (!placements.some(placement => placement.template === ancestry[0].name)) {\n chain.diagnostics.push(warningDiagnostic(\n DiagnosticCode.UnknownScope,\n `The template '${ancestry[0].name}' could not be placed in the layout '${layout.name}', so nothing outside it is part of the chain.`));\n return ancestry.slice(-1).map(item => level(document, SceneNodeKind.ScreenTemplate, 'template', item));\n }\n\n return ancestry.map(item => level(document, SceneNodeKind.ScreenTemplate, 'template', item));\n}\n\n/**\n * Assembles the chain of owners an editing scope sits inside: the layout, each template down to the one the\n * scope is in, and the scope itself.\n *\n * The same chain feeds {@link resolveEffectiveConfiguration} for the runtime and the editor, so both see the same\n * nesting. A scope that cannot be found yields an empty chain with an error diagnostic.\n *\n * @param document The document to read.\n * @param scope What is being edited.\n * @returns The chain, outermost first.\n */\nexport function resolveTemplateChain(document: SceneDocument, scope: EditingScope): TemplateChain {\n const chain: TemplateChain = { levels: [], diagnostics: [] };\n\n switch (scope.kind) {\n case EditingScopeKind.Layout: {\n const layout = document.layouts.find(candidate => candidate.name === scope.name);\n if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));\n break;\n }\n\n case EditingScopeKind.DialogTemplate: {\n const dialog = document.dialogTemplates.find(candidate => candidate.name === scope.name);\n if (dialog) chain.levels.push(level(document, SceneNodeKind.DialogTemplate, 'dialog', dialog));\n break;\n }\n\n case EditingScopeKind.ScreenTemplate: {\n const template = document.screenTemplates.find(candidate => candidate.name === scope.name);\n const layout = document.layouts.find(candidate => candidate.name === scope.layout) ?? (scope.layout === undefined && document.layouts.length === 1 ? document.layouts[0] : undefined);\n if (template && layout) {\n chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout), ...templateLevels(document, layout, template, chain));\n } else if (template) {\n chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));\n }\n\n break;\n }\n\n default: {\n const screen = document.screens.find(candidate => candidate.name === scope.name);\n if (!screen) break;\n\n const layout = document.layouts.find(candidate => candidate.name === screen.layout);\n const template = screen.screenTemplate === undefined ? undefined : document.screenTemplates.find(candidate => candidate.name === screen.screenTemplate);\n if (layout) chain.levels.push(level(document, SceneNodeKind.Layout, 'layout', layout));\n if (layout && template) chain.levels.push(...templateLevels(document, layout, template, chain));\n else if (template) chain.levels.push(level(document, SceneNodeKind.ScreenTemplate, 'template', template));\n chain.levels.push(level(document, SceneNodeKind.Screen, 'screen', screen));\n }\n }\n\n if (chain.levels.length === 0) {\n chain.diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownScope, `There is no ${scope.kind} named '${scope.name}'.`));\n }\n\n return chain;\n}\n"],"names":["exposuresOf","document","owner","exposures","find","declaration","properties","level","kind","prefix","name","instance","elements","collectComponents","templateLevels","layout","template","chain","placements","resolveScreenTemplates","screenTemplates","ancestry","current","guard","length","placement","candidate","container","parent","unshift","some","diagnostics","push","warningDiagnostic","DiagnosticCode","UnknownScope","slice","map","item","SceneNodeKind","ScreenTemplate","resolveTemplateChain","scope","levels","EditingScopeKind","Layout","layouts","DialogTemplate","dialog","dialogTemplates","undefined","screen","screens","screenTemplate","Screen","errorDiagnostic"],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var elementKind = require('../elementKind.js');
5
+ var diagnostics = require('./diagnostics.js');
6
+ var nodeIds = require('./nodeIds.js');
7
+ var documentPaths = require('./documentPaths.js');
8
+ var DescriptorCatalog = require('./DescriptorCatalog.js');
9
+ var pathAccess = require('./pathAccess.js');
10
+
11
+ // Copyright (c) Cratis. All rights reserved.
12
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
13
+ function elementIdsIn(value, found = []) {
14
+ if (value === null || typeof value !== 'object') return found;
15
+ if (Array.isArray(value)) {
16
+ for (const item of value)elementIdsIn(item, found);
17
+ return found;
18
+ }
19
+ const candidate = value;
20
+ if (typeof candidate.id === 'string' && candidate.properties !== null && typeof candidate.properties === 'object') found.push(candidate.id);
21
+ for (const child of Object.values(value))elementIdsIn(child, found);
22
+ return found;
23
+ }
24
+ function resolveInsertionPoint(session, targetId, slot, diagnostics$1) {
25
+ const record = session.index.nodes.get(targetId);
26
+ const refuse = (code, message)=>{
27
+ diagnostics$1.push(diagnostics.errorDiagnostic(code, message, {
28
+ nodeId: targetId
29
+ }));
30
+ return undefined;
31
+ };
32
+ if (!record) return refuse(scene_model.DiagnosticCode.UnknownNode, `There is no node '${targetId}'.`);
33
+ if (!session.isLocal(record)) return refuse(scene_model.DiagnosticCode.NodeNotEditable, `'${targetId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`);
34
+ const paths = (path)=>documentPaths.mirroredPaths(record.mirror, path);
35
+ switch(record.kind){
36
+ case scene_model.SceneNodeKind.Slot:
37
+ return record.contentPath ? {
38
+ record,
39
+ paths: paths(record.contentPath),
40
+ flow: false
41
+ } : refuse(scene_model.DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' is a slot of a layout; a layout declares slots and screens fill them.`);
42
+ case scene_model.SceneNodeKind.FlowNode:
43
+ return record.typeId === 'flowLeaf' || record.typeId === 'flowSlotLeaf' ? refuse(scene_model.DiagnosticCode.TargetDoesNotAcceptChildren, 'A flow leaf holds one element and takes no children; insert into its container.') : {
44
+ record,
45
+ paths: paths([
46
+ ...record.path,
47
+ 'children'
48
+ ]),
49
+ flow: true
50
+ };
51
+ case scene_model.SceneNodeKind.Element:
52
+ {
53
+ const element = record.value;
54
+ if (elementKind.isExternalComponent(element)) {
55
+ return slot ? {
56
+ record,
57
+ paths: paths([
58
+ ...record.path,
59
+ 'slots',
60
+ slot
61
+ ]),
62
+ flow: false
63
+ } : refuse(scene_model.DiagnosticCode.UnknownSlot, `Say which slot of '${element.componentName}' to insert into.`);
64
+ }
65
+ return elementKind.isPanel(element) ? {
66
+ record,
67
+ paths: paths([
68
+ ...record.path,
69
+ 'children'
70
+ ]),
71
+ flow: false
72
+ } : refuse(scene_model.DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' holds a single element and takes no children.`);
73
+ }
74
+ default:
75
+ return refuse(scene_model.DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' does not take children. Freeform arrangements place elements through their placements.`);
76
+ }
77
+ }
78
+ function checkCapacity(session, point, current, diagnostics$1) {
79
+ const maximum = DescriptorCatalog.findLayoutTypeDescriptor(session.context.catalog, point.record.typeId)?.capabilities.maximumChildren;
80
+ if (maximum !== undefined && current >= maximum) {
81
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.MaximumChildrenExceeded, `'${point.record.label}' holds at most ${maximum} children.`, {
82
+ nodeId: point.record.id
83
+ }));
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ function insertInto(session, clone, point, payload, isFlowNode, index, diagnostics$1) {
89
+ if (isFlowNode && !point.flow) {
90
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', {
91
+ nodeId: point.record.id
92
+ }));
93
+ return;
94
+ }
95
+ const arrays = point.paths.map((path)=>documentPaths.ensureArrayAt(clone, path));
96
+ const length = arrays[0].length;
97
+ if (index !== undefined && (!Number.isInteger(index) || index < 0 || index > length)) {
98
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.IndexOutOfRange, `There is no position ${index} among ${length} children.`, {
99
+ nodeId: point.record.id
100
+ }));
101
+ return;
102
+ }
103
+ if (!checkCapacity(session, point, length, diagnostics$1)) return;
104
+ for (const array of arrays){
105
+ const node = point.flow && !isFlowNode ? {
106
+ content: pathAccess.cloneData(payload)
107
+ } : pathAccess.cloneData(payload);
108
+ array.splice(index ?? array.length, 0, node);
109
+ }
110
+ }
111
+ /**
112
+ * Applies an insert to a copy of the document.
113
+ */ function applyInsertNode(session, edit, clone, diagnostics$1) {
114
+ if (edit.element === undefined === (edit.flowNode === undefined)) {
115
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.InvalidEdit, 'Give exactly one of element and flowNode.', {
116
+ nodeId: edit.target
117
+ }));
118
+ return;
119
+ }
120
+ const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics$1);
121
+ if (!point) return;
122
+ const identities = elementIdsIn(edit.element ?? edit.flowNode);
123
+ const duplicate = identities.find((identity, position)=>identities.indexOf(identity) !== position || session.index.nodes.has(nodeIds.elementNodeId(identity)));
124
+ if (duplicate !== undefined) {
125
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ElementIdInUse, `The element id '${duplicate}' is already used.`, {
126
+ nodeId: edit.target
127
+ }));
128
+ return;
129
+ }
130
+ insertInto(session, clone, point, edit.element ?? edit.flowNode, edit.flowNode !== undefined, edit.index, diagnostics$1);
131
+ }
132
+ function resolveRemoval(session, nodeId, diagnostics$1) {
133
+ const record = session.index.nodes.get(nodeId);
134
+ if (!record) {
135
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnknownNode, `There is no node '${nodeId}'.`, {
136
+ nodeId
137
+ }));
138
+ return undefined;
139
+ }
140
+ if (!session.isLocal(record)) {
141
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.NodeNotEditable, `'${nodeId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`, {
142
+ nodeId
143
+ }));
144
+ return undefined;
145
+ }
146
+ const holder = record.leafId !== undefined ? session.index.nodes.get(record.leafId) : record;
147
+ const isElement = record.kind === scene_model.SceneNodeKind.Element;
148
+ const removable = holder.list !== undefined || isElement && record.placementIds !== undefined;
149
+ if (!removable || record.kind !== scene_model.SceneNodeKind.Element && record.kind !== scene_model.SceneNodeKind.FlowNode) {
150
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.NodeNotRemovable, `'${record.label}' cannot be moved or removed on its own.`, {
151
+ nodeId
152
+ }));
153
+ return undefined;
154
+ }
155
+ return {
156
+ holder: isElement && record.placementIds !== undefined ? record : holder,
157
+ payload: record.value,
158
+ isFlowNode: !isElement
159
+ };
160
+ }
161
+ function takeOut(session, clone, removal) {
162
+ const { holder } = removal;
163
+ if (holder.placementIds !== undefined && holder.kind === scene_model.SceneNodeKind.Element) {
164
+ for (const placementId of holder.placementIds){
165
+ const placement = session.index.nodes.get(placementId);
166
+ const array = documentPaths.getAtPath(clone, placement.list.path);
167
+ array.splice(placement.list.index, 1);
168
+ }
169
+ return;
170
+ }
171
+ for (const path of documentPaths.mirroredPaths(holder.mirror, holder.list.path)){
172
+ const index = holder.list.index;
173
+ documentPaths.getAtPath(clone, path).splice(index, 1);
174
+ }
175
+ }
176
+ /**
177
+ * Applies a removal to a copy of the document. Removing an element a flow leaf holds removes the leaf too, and
178
+ * removing a freeform element removes its placement in every size-class variant.
179
+ */ function applyRemoveNode(session, edit, clone, diagnostics) {
180
+ const removal = resolveRemoval(session, edit.nodeId, diagnostics);
181
+ if (removal) takeOut(session, clone, removal);
182
+ }
183
+ /**
184
+ * Applies a move - a reorder or a reparent - to a copy of the document.
185
+ *
186
+ * `index` is the position the node ends up at among its new siblings. The destination arrays are located before
187
+ * anything is taken out, so removing a sibling that shifts the destination's own address does not misdirect the
188
+ * insert.
189
+ */ function applyMoveNode(session, edit, clone, diagnostics$1) {
190
+ const removal = resolveRemoval(session, edit.nodeId, diagnostics$1);
191
+ if (!removal) return;
192
+ const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics$1);
193
+ if (!point) return;
194
+ const moved = session.index.nodes.get(edit.nodeId);
195
+ for(let ancestor = point.record; ancestor; ancestor = ancestor.parentId === undefined ? undefined : session.index.nodes.get(ancestor.parentId)){
196
+ if (ancestor.id === moved.id) {
197
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ContainmentCycle, `'${moved.label}' cannot be moved into itself or something inside it.`, {
198
+ nodeId: edit.nodeId
199
+ }));
200
+ return;
201
+ }
202
+ }
203
+ const payload = pathAccess.cloneData(removal.payload);
204
+ const arrays = point.paths.map((path)=>documentPaths.ensureArrayAt(clone, path));
205
+ takeOut(session, clone, removal);
206
+ if (removal.isFlowNode && !point.flow) {
207
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', {
208
+ nodeId: edit.nodeId
209
+ }));
210
+ return;
211
+ }
212
+ const length = arrays[0].length;
213
+ if (edit.index !== undefined && (!Number.isInteger(edit.index) || edit.index < 0 || edit.index > length)) {
214
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.IndexOutOfRange, `There is no position ${edit.index} among ${length} children.`, {
215
+ nodeId: edit.target
216
+ }));
217
+ return;
218
+ }
219
+ if (!checkCapacity(session, point, length, diagnostics$1)) return;
220
+ for (const array of arrays){
221
+ const node = point.flow && !removal.isFlowNode ? {
222
+ content: pathAccess.cloneData(payload)
223
+ } : pathAccess.cloneData(payload);
224
+ array.splice(edit.index ?? array.length, 0, node);
225
+ }
226
+ }
227
+
228
+ exports.applyInsertNode = applyInsertNode;
229
+ exports.applyMoveNode = applyMoveNode;
230
+ exports.applyRemoveNode = applyRemoveNode;
231
+ //# sourceMappingURL=structureEdits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structureEdits.js","sources":["../../../editing/structureEdits.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, FlowNode, InsertNodeEdit, MoveNodeEdit, RemoveNodeEdit, SceneDiagnostic, SceneDocument, SceneElement,\n SceneNodeKind,\n} from '@cratis/scene.model';\nimport { isExternalComponent, isPanel } from '../elementKind';\nimport { errorDiagnostic } from './diagnostics';\nimport { DocumentPath, NodeRecord } from './DocumentIndex';\nimport { elementNodeId } from './nodeIds';\nimport { ensureArrayAt, getAtPath, mirroredPaths } from './documentPaths';\nimport { EditSession } from './EditSession';\nimport { findLayoutTypeDescriptor } from './DescriptorCatalog';\nimport { cloneData } from './pathAccess';\n\n/**\n * Where an insert or move puts its node: the arrays (one per freeform size-class copy) and what they hold.\n */\ninterface InsertionPoint {\n record: NodeRecord;\n paths: DocumentPath[];\n\n /** Whether the arrays hold flow nodes (and wrap elements in a leaf) or elements directly. */\n flow: boolean;\n}\n\nfunction elementIdsIn(value: unknown, found: string[] = []): string[] {\n if (value === null || typeof value !== 'object') return found;\n if (Array.isArray(value)) {\n for (const item of value) elementIdsIn(item, found);\n return found;\n }\n\n const candidate = value as { id?: unknown; properties?: unknown };\n if (typeof candidate.id === 'string' && candidate.properties !== null && typeof candidate.properties === 'object') found.push(candidate.id);\n for (const child of Object.values(value)) elementIdsIn(child, found);\n return found;\n}\n\nfunction resolveInsertionPoint(session: EditSession, targetId: string, slot: string | undefined, diagnostics: SceneDiagnostic[]): InsertionPoint | undefined {\n const record = session.index.nodes.get(targetId);\n const refuse = (code: DiagnosticCode, message: string) => {\n diagnostics.push(errorDiagnostic(code, message, { nodeId: targetId }));\n return undefined;\n };\n\n if (!record) return refuse(DiagnosticCode.UnknownNode, `There is no node '${targetId}'.`);\n if (!session.isLocal(record)) return refuse(DiagnosticCode.NodeNotEditable, `'${targetId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`);\n\n const paths = (path: DocumentPath) => mirroredPaths(record.mirror, path);\n switch (record.kind) {\n case SceneNodeKind.Slot:\n return record.contentPath\n ? { record, paths: paths(record.contentPath), flow: false }\n : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' is a slot of a layout; a layout declares slots and screens fill them.`);\n\n case SceneNodeKind.FlowNode:\n return record.typeId === 'flowLeaf' || record.typeId === 'flowSlotLeaf'\n ? refuse(DiagnosticCode.TargetDoesNotAcceptChildren, 'A flow leaf holds one element and takes no children; insert into its container.')\n : { record, paths: paths([...record.path, 'children']), flow: true };\n\n case SceneNodeKind.Element: {\n const element = record.value as SceneElement;\n if (isExternalComponent(element)) {\n return slot\n ? { record, paths: paths([...record.path, 'slots', slot]), flow: false }\n : refuse(DiagnosticCode.UnknownSlot, `Say which slot of '${element.componentName}' to insert into.`);\n }\n\n return isPanel(element)\n ? { record, paths: paths([...record.path, 'children']), flow: false }\n : refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' holds a single element and takes no children.`);\n }\n\n default:\n return refuse(DiagnosticCode.TargetDoesNotAcceptChildren, `'${record.label}' does not take children. Freeform arrangements place elements through their placements.`);\n }\n}\n\nfunction checkCapacity(session: EditSession, point: InsertionPoint, current: number, diagnostics: SceneDiagnostic[]): boolean {\n const maximum = findLayoutTypeDescriptor(session.context.catalog, point.record.typeId)?.capabilities.maximumChildren;\n if (maximum !== undefined && current >= maximum) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.MaximumChildrenExceeded, `'${point.record.label}' holds at most ${maximum} children.`, { nodeId: point.record.id }));\n return false;\n }\n\n return true;\n}\n\nfunction insertInto(session: EditSession, clone: SceneDocument, point: InsertionPoint, payload: SceneElement | FlowNode, isFlowNode: boolean, index: number | undefined, diagnostics: SceneDiagnostic[]): void {\n if (isFlowNode && !point.flow) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', { nodeId: point.record.id }));\n return;\n }\n\n const arrays = point.paths.map(path => ensureArrayAt(clone, path));\n const length = arrays[0].length;\n if (index !== undefined && (!Number.isInteger(index) || index < 0 || index > length)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${index} among ${length} children.`, { nodeId: point.record.id }));\n return;\n }\n\n if (!checkCapacity(session, point, length, diagnostics)) return;\n\n for (const array of arrays) {\n const node = point.flow && !isFlowNode ? { content: cloneData(payload) } : cloneData(payload);\n array.splice(index ?? array.length, 0, node);\n }\n}\n\n/**\n * Applies an insert to a copy of the document.\n */\nexport function applyInsertNode(session: EditSession, edit: InsertNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n if ((edit.element === undefined) === (edit.flowNode === undefined)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'Give exactly one of element and flowNode.', { nodeId: edit.target }));\n return;\n }\n\n const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);\n if (!point) return;\n\n const identities = elementIdsIn(edit.element ?? edit.flowNode);\n const duplicate = identities.find((identity, position) => identities.indexOf(identity) !== position || session.index.nodes.has(elementNodeId(identity)));\n if (duplicate !== undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ElementIdInUse, `The element id '${duplicate}' is already used.`, { nodeId: edit.target }));\n return;\n }\n\n insertInto(session, clone, point, (edit.element ?? edit.flowNode)!, edit.flowNode !== undefined, edit.index, diagnostics);\n}\n\ninterface Removal {\n /** The list record whose array holds the node being taken out (a flow leaf for an element it wraps). */\n holder: NodeRecord;\n payload: SceneElement | FlowNode;\n isFlowNode: boolean;\n}\n\nfunction resolveRemoval(session: EditSession, nodeId: string, diagnostics: SceneDiagnostic[]): Removal | undefined {\n const record = session.index.nodes.get(nodeId);\n if (!record) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownNode, `There is no node '${nodeId}'.`, { nodeId }));\n return undefined;\n }\n\n if (!session.isLocal(record)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotEditable, `'${nodeId}' is inherited from '${session.sourceOf(record)}' and cannot be changed here.`, { nodeId }));\n return undefined;\n }\n\n const holder = record.leafId !== undefined ? session.index.nodes.get(record.leafId)! : record;\n const isElement = record.kind === SceneNodeKind.Element;\n const removable = holder.list !== undefined || (isElement && record.placementIds !== undefined);\n if (!removable || (record.kind !== SceneNodeKind.Element && record.kind !== SceneNodeKind.FlowNode)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.NodeNotRemovable, `'${record.label}' cannot be moved or removed on its own.`, { nodeId }));\n return undefined;\n }\n\n return { holder: isElement && record.placementIds !== undefined ? record : holder, payload: record.value as SceneElement | FlowNode, isFlowNode: !isElement };\n}\n\nfunction takeOut(session: EditSession, clone: SceneDocument, removal: Removal): void {\n const { holder } = removal;\n if (holder.placementIds !== undefined && holder.kind === SceneNodeKind.Element) {\n for (const placementId of holder.placementIds) {\n const placement = session.index.nodes.get(placementId)!;\n const array = getAtPath(clone, placement.list!.path) as unknown[];\n array.splice(placement.list!.index, 1);\n }\n\n return;\n }\n\n for (const path of mirroredPaths(holder.mirror, holder.list!.path)) {\n const index = holder.list!.index;\n (getAtPath(clone, path) as unknown[]).splice(index, 1);\n }\n}\n\n/**\n * Applies a removal to a copy of the document. Removing an element a flow leaf holds removes the leaf too, and\n * removing a freeform element removes its placement in every size-class variant.\n */\nexport function applyRemoveNode(session: EditSession, edit: RemoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n const removal = resolveRemoval(session, edit.nodeId, diagnostics);\n if (removal) takeOut(session, clone, removal);\n}\n\n/**\n * Applies a move - a reorder or a reparent - to a copy of the document.\n *\n * `index` is the position the node ends up at among its new siblings. The destination arrays are located before\n * anything is taken out, so removing a sibling that shifts the destination's own address does not misdirect the\n * insert.\n */\nexport function applyMoveNode(session: EditSession, edit: MoveNodeEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void {\n const removal = resolveRemoval(session, edit.nodeId, diagnostics);\n if (!removal) return;\n\n const point = resolveInsertionPoint(session, edit.target, edit.slot, diagnostics);\n if (!point) return;\n\n const moved = session.index.nodes.get(edit.nodeId)!;\n for (let ancestor: NodeRecord | undefined = point.record; ancestor; ancestor = ancestor.parentId === undefined ? undefined : session.index.nodes.get(ancestor.parentId)) {\n if (ancestor.id === moved.id) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.ContainmentCycle, `'${moved.label}' cannot be moved into itself or something inside it.`, { nodeId: edit.nodeId }));\n return;\n }\n }\n\n const payload = cloneData(removal.payload);\n const arrays = point.paths.map(path => ensureArrayAt(clone, path));\n takeOut(session, clone, removal);\n\n if (removal.isFlowNode && !point.flow) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.InvalidEdit, 'A flow node can only go into a flow container.', { nodeId: edit.nodeId }));\n return;\n }\n\n const length = arrays[0].length;\n if (edit.index !== undefined && (!Number.isInteger(edit.index) || edit.index < 0 || edit.index > length)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.IndexOutOfRange, `There is no position ${edit.index} among ${length} children.`, { nodeId: edit.target }));\n return;\n }\n\n if (!checkCapacity(session, point, length, diagnostics)) return;\n\n for (const array of arrays) {\n const node = point.flow && !removal.isFlowNode ? { content: cloneData(payload) } : cloneData(payload);\n array.splice(edit.index ?? array.length, 0, node);\n }\n}\n"],"names":["elementIdsIn","value","found","Array","isArray","item","candidate","id","properties","push","child","Object","values","resolveInsertionPoint","session","targetId","slot","diagnostics","record","index","nodes","get","refuse","code","message","errorDiagnostic","nodeId","undefined","DiagnosticCode","UnknownNode","isLocal","NodeNotEditable","sourceOf","paths","path","mirroredPaths","mirror","kind","SceneNodeKind","Slot","contentPath","flow","TargetDoesNotAcceptChildren","label","FlowNode","typeId","Element","element","isExternalComponent","UnknownSlot","componentName","isPanel","checkCapacity","point","current","maximum","findLayoutTypeDescriptor","context","catalog","capabilities","maximumChildren","MaximumChildrenExceeded","insertInto","clone","payload","isFlowNode","InvalidEdit","arrays","map","ensureArrayAt","length","Number","isInteger","IndexOutOfRange","array","node","content","cloneData","splice","applyInsertNode","edit","flowNode","target","identities","duplicate","find","identity","position","indexOf","has","elementNodeId","ElementIdInUse","resolveRemoval","holder","leafId","isElement","removable","list","placementIds","NodeNotRemovable","takeOut","removal","placementId","placement","getAtPath","applyRemoveNode","applyMoveNode","moved","ancestor","parentId","ContainmentCycle"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var diagnostics = require('./diagnostics.js');
5
+
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
8
+ const integerTypes = new Set([
9
+ 'int',
10
+ 'integer',
11
+ 'int16',
12
+ 'int32',
13
+ 'int64',
14
+ 'short',
15
+ 'long',
16
+ 'byte',
17
+ 'uint',
18
+ 'uint16',
19
+ 'uint32',
20
+ 'uint64'
21
+ ]);
22
+ const fractionalTypes = new Set([
23
+ 'number',
24
+ 'float',
25
+ 'double',
26
+ 'decimal',
27
+ 'single'
28
+ ]);
29
+ function normalizeType(type) {
30
+ return type.trim().toLowerCase().replace(/\?$/, '');
31
+ }
32
+ /**
33
+ * Whether a value of one type can feed a parameter or field of another.
34
+ *
35
+ * Types compare by name. A whole number may feed a fractional one, never the reverse, and a type called `any` or
36
+ * `unknown` on either side matches anything.
37
+ */ function areTypesCompatible(sourceType, targetType) {
38
+ const source = normalizeType(sourceType);
39
+ const target = normalizeType(targetType);
40
+ if (source === target || source === 'any' || target === 'any' || source === 'unknown' || target === 'unknown') return true;
41
+ if (integerTypes.has(source)) return integerTypes.has(target) || fractionalTypes.has(target);
42
+ return fractionalTypes.has(source) && fractionalTypes.has(target);
43
+ }
44
+ /**
45
+ * Validates a query binding against the query it names and the property it is for.
46
+ *
47
+ * Reports a query that is not among the candidates, a result shape the property cannot bind to, a required
48
+ * parameter nothing supplies, a binding for a parameter the query does not have, an argument whose type does not
49
+ * fit its parameter, and a result binding that names a field the query does not return.
50
+ *
51
+ * @param descriptor The `QueryReference` property the binding is the value of.
52
+ * @param candidate The candidate the binding names, or `undefined` when the host found none.
53
+ * @param binding The binding to check.
54
+ * @param scope The types of the values arguments draw from. Without it argument types are not checked.
55
+ * @returns The problems found; empty when the binding is sound.
56
+ */ function validateBinding(descriptor, candidate, binding, scope) {
57
+ const path = descriptor.path;
58
+ if (!candidate || candidate.id !== binding.queryId) {
59
+ return [
60
+ diagnostics.errorDiagnostic(scene_model.DiagnosticCode.MissingQuery, `The query '${binding.query}' (${binding.queryId}) is not available here.`, {
61
+ path
62
+ })
63
+ ];
64
+ }
65
+ const diagnostics$1 = [];
66
+ const allowedShapes = descriptor.constraints?.resultShapes;
67
+ if (allowedShapes && !allowedShapes.includes(candidate.resultShape)) {
68
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.IncompatibleResultShape, `'${descriptor.label}' binds to ${allowedShapes.join(' or ')} results, but '${candidate.name}' returns ${candidate.resultShape}.`, {
69
+ path
70
+ }));
71
+ }
72
+ for (const argument of binding.arguments){
73
+ const parameter = candidate.parameters.find((candidateParameter)=>candidateParameter.name === argument.parameter);
74
+ if (!parameter) {
75
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnknownParameter, `'${candidate.name}' has no parameter '${argument.parameter}'.`, {
76
+ path
77
+ }));
78
+ continue;
79
+ }
80
+ if (!scope) continue;
81
+ const sourceType = scope.types[argument.source.path];
82
+ if (sourceType === undefined) {
83
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnresolvedArgumentSource, `'${argument.source.path}' is not available to supply '${parameter.name}'.`, {
84
+ path
85
+ }));
86
+ } else if (!areTypesCompatible(sourceType, parameter.type)) {
87
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.ArgumentTypeMismatch, `'${argument.source.path}' is ${sourceType} but '${parameter.name}' expects ${parameter.type}.`, {
88
+ path
89
+ }));
90
+ }
91
+ }
92
+ for (const parameter of candidate.parameters.filter((candidateParameter)=>candidateParameter.required)){
93
+ if (!binding.arguments.some((argument)=>argument.parameter === parameter.name)) {
94
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.MissingRequiredParameter, `'${candidate.name}' needs a value for '${parameter.name}'.`, {
95
+ path
96
+ }));
97
+ }
98
+ }
99
+ for (const result of binding.results){
100
+ if (!candidate.resultFields.some((field)=>field.name === result.field)) {
101
+ diagnostics$1.push(diagnostics.errorDiagnostic(scene_model.DiagnosticCode.UnknownResultField, `'${candidate.name}' does not return a field '${result.field}'.`, {
102
+ path
103
+ }));
104
+ }
105
+ }
106
+ return diagnostics$1;
107
+ }
108
+
109
+ exports.areTypesCompatible = areTypesCompatible;
110
+ exports.validateBinding = validateBinding;
111
+ //# sourceMappingURL=validateBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateBinding.js","sources":["../../../editing/validateBinding.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, PropertyDescriptor, QueryBinding, QueryCandidate, SceneDiagnostic,\n} from '@cratis/scene.model';\nimport { errorDiagnostic } from './diagnostics';\n\n/**\n * The types of the values a binding can draw from, keyed by binding path. Supplied by the host, which knows what\n * is in scope where the query is used.\n */\nexport interface BindingTypeScope {\n types: Record<string, string>;\n}\n\nconst integerTypes = new Set(['int', 'integer', 'int16', 'int32', 'int64', 'short', 'long', 'byte', 'uint', 'uint16', 'uint32', 'uint64']);\nconst fractionalTypes = new Set(['number', 'float', 'double', 'decimal', 'single']);\n\nfunction normalizeType(type: string): string {\n return type.trim().toLowerCase().replace(/\\?$/, '');\n}\n\n/**\n * Whether a value of one type can feed a parameter or field of another.\n *\n * Types compare by name. A whole number may feed a fractional one, never the reverse, and a type called `any` or\n * `unknown` on either side matches anything.\n */\nexport function areTypesCompatible(sourceType: string, targetType: string): boolean {\n const source = normalizeType(sourceType);\n const target = normalizeType(targetType);\n if (source === target || source === 'any' || target === 'any' || source === 'unknown' || target === 'unknown') return true;\n if (integerTypes.has(source)) return integerTypes.has(target) || fractionalTypes.has(target);\n return fractionalTypes.has(source) && fractionalTypes.has(target);\n}\n\n/**\n * Validates a query binding against the query it names and the property it is for.\n *\n * Reports a query that is not among the candidates, a result shape the property cannot bind to, a required\n * parameter nothing supplies, a binding for a parameter the query does not have, an argument whose type does not\n * fit its parameter, and a result binding that names a field the query does not return.\n *\n * @param descriptor The `QueryReference` property the binding is the value of.\n * @param candidate The candidate the binding names, or `undefined` when the host found none.\n * @param binding The binding to check.\n * @param scope The types of the values arguments draw from. Without it argument types are not checked.\n * @returns The problems found; empty when the binding is sound.\n */\nexport function validateBinding(\n descriptor: PropertyDescriptor,\n candidate: QueryCandidate | undefined,\n binding: QueryBinding,\n scope?: BindingTypeScope,\n): SceneDiagnostic[] {\n const path = descriptor.path;\n if (!candidate || candidate.id !== binding.queryId) {\n return [errorDiagnostic(DiagnosticCode.MissingQuery, `The query '${binding.query}' (${binding.queryId}) is not available here.`, { path })];\n }\n\n const diagnostics: SceneDiagnostic[] = [];\n const allowedShapes = descriptor.constraints?.resultShapes;\n if (allowedShapes && !allowedShapes.includes(candidate.resultShape)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.IncompatibleResultShape,\n `'${descriptor.label}' binds to ${allowedShapes.join(' or ')} results, but '${candidate.name}' returns ${candidate.resultShape}.`,\n { path }));\n }\n\n for (const argument of binding.arguments) {\n const parameter = candidate.parameters.find(candidateParameter => candidateParameter.name === argument.parameter);\n if (!parameter) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownParameter, `'${candidate.name}' has no parameter '${argument.parameter}'.`, { path }));\n continue;\n }\n\n if (!scope) continue;\n const sourceType = scope.types[argument.source.path];\n if (sourceType === undefined) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnresolvedArgumentSource, `'${argument.source.path}' is not available to supply '${parameter.name}'.`, { path }));\n } else if (!areTypesCompatible(sourceType, parameter.type)) {\n diagnostics.push(errorDiagnostic(\n DiagnosticCode.ArgumentTypeMismatch,\n `'${argument.source.path}' is ${sourceType} but '${parameter.name}' expects ${parameter.type}.`,\n { path }));\n }\n }\n\n for (const parameter of candidate.parameters.filter(candidateParameter => candidateParameter.required)) {\n if (!binding.arguments.some(argument => argument.parameter === parameter.name)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.MissingRequiredParameter, `'${candidate.name}' needs a value for '${parameter.name}'.`, { path }));\n }\n }\n\n for (const result of binding.results) {\n if (!candidate.resultFields.some(field => field.name === result.field)) {\n diagnostics.push(errorDiagnostic(DiagnosticCode.UnknownResultField, `'${candidate.name}' does not return a field '${result.field}'.`, { path }));\n }\n }\n\n return diagnostics;\n}\n"],"names":["integerTypes","Set","fractionalTypes","normalizeType","type","trim","toLowerCase","replace","areTypesCompatible","sourceType","targetType","source","target","has","validateBinding","descriptor","candidate","binding","scope","path","id","queryId","errorDiagnostic","DiagnosticCode","MissingQuery","query","diagnostics","allowedShapes","constraints","resultShapes","includes","resultShape","push","IncompatibleResultShape","label","join","name","argument","arguments","parameter","parameters","find","candidateParameter","UnknownParameter","types","undefined","UnresolvedArgumentSource","ArgumentTypeMismatch","filter","required","some","MissingRequiredParameter","result","results","resultFields","field","UnknownResultField"],"mappings":"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"}