@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,111 @@
1
+ import { PropertyValueType } from '@cratis/scene.model';
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
+ function isRecord(value) {
6
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
7
+ }
8
+ function isNonEmptyString(value) {
9
+ return typeof value === 'string' && value.length > 0;
10
+ }
11
+ /**
12
+ * Checks a value against a property descriptor.
13
+ *
14
+ * @param descriptor The property the value is for.
15
+ * @param value The value to check. `undefined` means "not set", which is fine unless the property is required.
16
+ * @returns The reason the value is not acceptable, or `undefined` when it is.
17
+ */ function validateValue(descriptor, value) {
18
+ const constraints = descriptor.constraints ?? {};
19
+ if (value === undefined || value === null) {
20
+ return constraints.required ? 'a value is required' : undefined;
21
+ }
22
+ switch(descriptor.valueType){
23
+ case PropertyValueType.String:
24
+ {
25
+ if (typeof value !== 'string') return 'expected a string';
26
+ if (constraints.minimumLength !== undefined && value.length < constraints.minimumLength) return `must be at least ${constraints.minimumLength} characters`;
27
+ if (constraints.maximumLength !== undefined && value.length > constraints.maximumLength) return `must be at most ${constraints.maximumLength} characters`;
28
+ if (constraints.pattern !== undefined && !new RegExp(`^(?:${constraints.pattern})$`).test(value)) return `must match ${constraints.pattern}`;
29
+ return undefined;
30
+ }
31
+ case PropertyValueType.Number:
32
+ {
33
+ if (typeof value !== 'number' || !Number.isFinite(value)) return 'expected a number';
34
+ if (constraints.integer && !Number.isInteger(value)) return 'expected a whole number';
35
+ if (constraints.minimum !== undefined && value < constraints.minimum) return `must be at least ${constraints.minimum}`;
36
+ if (constraints.maximum !== undefined && value > constraints.maximum) return `must be at most ${constraints.maximum}`;
37
+ return undefined;
38
+ }
39
+ case PropertyValueType.Boolean:
40
+ return typeof value === 'boolean' ? undefined : 'expected true or false';
41
+ case PropertyValueType.Enum:
42
+ return (descriptor.choices ?? []).some((choice)=>choice.value === value) ? undefined : 'not one of the allowed choices';
43
+ case PropertyValueType.Icon:
44
+ if (!isRecord(value) || !isNonEmptyString(value.library) || !isNonEmptyString(value.key)) return 'expected an icon reference with a library and a key';
45
+ return value.variant === undefined || typeof value.variant === 'string' ? undefined : 'the icon variant must be a string';
46
+ case PropertyValueType.Destination:
47
+ if (!isRecord(value) || !isNonEmptyString(value.screen)) return 'expected a destination naming a screen';
48
+ return value.routeParameterBindings === undefined || isRecord(value.routeParameterBindings) ? undefined : 'routeParameterBindings must be an object';
49
+ case PropertyValueType.QueryReference:
50
+ if (isNonEmptyString(value)) return undefined;
51
+ if (!isRecord(value) || !isNonEmptyString(value.queryId) || !isNonEmptyString(value.query)) return 'expected a query name or a query binding';
52
+ return Array.isArray(value.arguments) && Array.isArray(value.results) ? undefined : 'a query binding needs arguments and results lists';
53
+ case PropertyValueType.Collection:
54
+ return validateCollection(descriptor, value);
55
+ default:
56
+ return isRecord(value) || Array.isArray(value) ? undefined : 'expected a structured value';
57
+ }
58
+ }
59
+ function validateCollection(descriptor, value) {
60
+ if (!Array.isArray(value)) return 'expected a list';
61
+ const constraints = descriptor.constraints ?? {};
62
+ if (constraints.minimumItems !== undefined && value.length < constraints.minimumItems) return `needs at least ${constraints.minimumItems} items`;
63
+ if (constraints.maximumItems !== undefined && value.length > constraints.maximumItems) return `allows at most ${constraints.maximumItems} items`;
64
+ const identities = new Set();
65
+ for (const item of value){
66
+ if (!isRecord(item) || !isNonEmptyString(item.id)) return 'every item needs an id';
67
+ if (identities.has(item.id)) return `the item id '${item.id}' is used twice`;
68
+ identities.add(item.id);
69
+ const { id: _identity, ...values } = item;
70
+ const problem = validateItemValues(descriptor.item, values).at(0);
71
+ if (problem) return `item '${item.id}': ${problem.field} ${problem.problem}`;
72
+ }
73
+ return undefined;
74
+ }
75
+ /**
76
+ * Checks a collection item's field values against the collection's item descriptor.
77
+ *
78
+ * @param itemDescriptor What the items look like.
79
+ * @param values The item's field values, keyed by field path.
80
+ * @returns Every field that is unknown or has an unacceptable value.
81
+ */ function validateItemValues(itemDescriptor, values) {
82
+ const fields = itemDescriptor?.properties ?? [];
83
+ const problems = [];
84
+ for (const [field, fieldValue] of Object.entries(values)){
85
+ const fieldDescriptor = fields.find((candidate)=>candidate.path === field);
86
+ if (!fieldDescriptor) {
87
+ problems.push({
88
+ field,
89
+ problem: 'is not a field of this collection\'s items'
90
+ });
91
+ continue;
92
+ }
93
+ const problem = validateValue(fieldDescriptor, fieldValue);
94
+ if (problem) problems.push({
95
+ field,
96
+ problem
97
+ });
98
+ }
99
+ for (const fieldDescriptor of fields){
100
+ if (fieldDescriptor.constraints?.required && values[fieldDescriptor.path] === undefined) {
101
+ problems.push({
102
+ field: fieldDescriptor.path,
103
+ problem: 'a value is required'
104
+ });
105
+ }
106
+ }
107
+ return problems;
108
+ }
109
+
110
+ export { validateItemValues, validateValue };
111
+ //# sourceMappingURL=validateValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateValue.js","sources":["../../../editing/validateValue.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, PropertyDescriptor, PropertyValueType } from '@cratis/scene.model';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Checks a value against a property descriptor.\n *\n * @param descriptor The property the value is for.\n * @param value The value to check. `undefined` means \"not set\", which is fine unless the property is required.\n * @returns The reason the value is not acceptable, or `undefined` when it is.\n */\nexport function validateValue(descriptor: PropertyDescriptor, value: unknown): string | undefined {\n const constraints = descriptor.constraints ?? {};\n if (value === undefined || value === null) {\n return constraints.required ? 'a value is required' : undefined;\n }\n\n switch (descriptor.valueType) {\n case PropertyValueType.String: {\n if (typeof value !== 'string') return 'expected a string';\n if (constraints.minimumLength !== undefined && value.length < constraints.minimumLength) return `must be at least ${constraints.minimumLength} characters`;\n if (constraints.maximumLength !== undefined && value.length > constraints.maximumLength) return `must be at most ${constraints.maximumLength} characters`;\n if (constraints.pattern !== undefined && !new RegExp(`^(?:${constraints.pattern})$`).test(value)) return `must match ${constraints.pattern}`;\n return undefined;\n }\n\n case PropertyValueType.Number: {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 'expected a number';\n if (constraints.integer && !Number.isInteger(value)) return 'expected a whole number';\n if (constraints.minimum !== undefined && value < constraints.minimum) return `must be at least ${constraints.minimum}`;\n if (constraints.maximum !== undefined && value > constraints.maximum) return `must be at most ${constraints.maximum}`;\n return undefined;\n }\n\n case PropertyValueType.Boolean:\n return typeof value === 'boolean' ? undefined : 'expected true or false';\n\n case PropertyValueType.Enum:\n return (descriptor.choices ?? []).some(choice => choice.value === value) ? undefined : 'not one of the allowed choices';\n\n case PropertyValueType.Icon:\n if (!isRecord(value) || !isNonEmptyString(value.library) || !isNonEmptyString(value.key)) return 'expected an icon reference with a library and a key';\n return value.variant === undefined || typeof value.variant === 'string' ? undefined : 'the icon variant must be a string';\n\n case PropertyValueType.Destination:\n if (!isRecord(value) || !isNonEmptyString(value.screen)) return 'expected a destination naming a screen';\n return value.routeParameterBindings === undefined || isRecord(value.routeParameterBindings)\n ? undefined\n : 'routeParameterBindings must be an object';\n\n case PropertyValueType.QueryReference:\n if (isNonEmptyString(value)) return undefined;\n if (!isRecord(value) || !isNonEmptyString(value.queryId) || !isNonEmptyString(value.query)) return 'expected a query name or a query binding';\n return Array.isArray(value.arguments) && Array.isArray(value.results) ? undefined : 'a query binding needs arguments and results lists';\n\n case PropertyValueType.Collection:\n return validateCollection(descriptor, value);\n\n default:\n return isRecord(value) || Array.isArray(value) ? undefined : 'expected a structured value';\n }\n}\n\nfunction validateCollection(descriptor: PropertyDescriptor, value: unknown): string | undefined {\n if (!Array.isArray(value)) return 'expected a list';\n const constraints = descriptor.constraints ?? {};\n if (constraints.minimumItems !== undefined && value.length < constraints.minimumItems) return `needs at least ${constraints.minimumItems} items`;\n if (constraints.maximumItems !== undefined && value.length > constraints.maximumItems) return `allows at most ${constraints.maximumItems} items`;\n\n const identities = new Set<string>();\n for (const item of value) {\n if (!isRecord(item) || !isNonEmptyString(item.id)) return 'every item needs an id';\n if (identities.has(item.id)) return `the item id '${item.id}' is used twice`;\n identities.add(item.id);\n\n const { id: _identity, ...values } = item;\n const problem = validateItemValues(descriptor.item, values).at(0);\n if (problem) return `item '${item.id}': ${problem.field} ${problem.problem}`;\n }\n\n return undefined;\n}\n\n/**\n * One field of a collection item that does not fit its descriptor.\n */\nexport interface ItemFieldProblem {\n field: string;\n problem: string;\n}\n\n/**\n * Checks a collection item's field values against the collection's item descriptor.\n *\n * @param itemDescriptor What the items look like.\n * @param values The item's field values, keyed by field path.\n * @returns Every field that is unknown or has an unacceptable value.\n */\nexport function validateItemValues(itemDescriptor: CollectionItemDescriptor | undefined, values: Record<string, unknown>): ItemFieldProblem[] {\n const fields = itemDescriptor?.properties ?? [];\n const problems: ItemFieldProblem[] = [];\n\n for (const [field, fieldValue] of Object.entries(values)) {\n const fieldDescriptor = fields.find(candidate => candidate.path === field);\n if (!fieldDescriptor) {\n problems.push({ field, problem: 'is not a field of this collection\\'s items' });\n continue;\n }\n\n const problem = validateValue(fieldDescriptor, fieldValue);\n if (problem) problems.push({ field, problem });\n }\n\n for (const fieldDescriptor of fields) {\n if (fieldDescriptor.constraints?.required && values[fieldDescriptor.path] === undefined) {\n problems.push({ field: fieldDescriptor.path, problem: 'a value is required' });\n }\n }\n\n return problems;\n}\n"],"names":["isRecord","value","Array","isArray","isNonEmptyString","length","validateValue","descriptor","constraints","undefined","required","valueType","PropertyValueType","String","minimumLength","maximumLength","pattern","RegExp","test","Number","isFinite","integer","isInteger","minimum","maximum","Boolean","Enum","choices","some","choice","Icon","library","key","variant","Destination","screen","routeParameterBindings","QueryReference","queryId","query","arguments","results","Collection","validateCollection","minimumItems","maximumItems","identities","Set","item","id","has","add","_identity","values","problem","validateItemValues","at","field","itemDescriptor","fields","properties","problems","fieldValue","Object","entries","fieldDescriptor","find","candidate","path","push"],"mappings":";;AAAA;AACA;AAIA,SAASA,SAASC,KAAc,EAAA;IAC5B,OAAOA,KAAAA,KAAU,QAAQ,OAAOA,KAAAA,KAAU,YAAY,CAACC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA;AACzE;AAEA,SAASG,iBAAiBH,KAAc,EAAA;AACpC,IAAA,OAAO,OAAOA,KAAAA,KAAU,QAAA,IAAYA,KAAAA,CAAMI,MAAM,GAAG,CAAA;AACvD;AAEA;;;;;;AAMC,IACM,SAASC,aAAAA,CAAcC,UAA8B,EAAEN,KAAc,EAAA;AACxE,IAAA,MAAMO,WAAAA,GAAcD,UAAAA,CAAWC,WAAW,IAAI,EAAC;IAC/C,IAAIP,KAAAA,KAAUQ,SAAAA,IAAaR,KAAAA,KAAU,IAAA,EAAM;QACvC,OAAOO,WAAAA,CAAYE,QAAQ,GAAG,qBAAA,GAAwBD,SAAAA;AAC1D,IAAA;AAEA,IAAA,OAAQF,WAAWI,SAAS;AACxB,QAAA,KAAKC,kBAAkBC,MAAM;AAAE,YAAA;gBAC3B,IAAI,OAAOZ,KAAAA,KAAU,QAAA,EAAU,OAAO,mBAAA;AACtC,gBAAA,IAAIO,YAAYM,aAAa,KAAKL,aAAaR,KAAAA,CAAMI,MAAM,GAAGG,WAAAA,CAAYM,aAAa,EAAE,OAAO,CAAC,iBAAiB,EAAEN,YAAYM,aAAa,CAAC,WAAW,CAAC;AAC1J,gBAAA,IAAIN,YAAYO,aAAa,KAAKN,aAAaR,KAAAA,CAAMI,MAAM,GAAGG,WAAAA,CAAYO,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAEP,YAAYO,aAAa,CAAC,WAAW,CAAC;gBACzJ,IAAIP,WAAAA,CAAYQ,OAAO,KAAKP,SAAAA,IAAa,CAAC,IAAIQ,MAAAA,CAAO,CAAC,IAAI,EAAET,WAAAA,CAAYQ,OAAO,CAAC,EAAE,CAAC,CAAA,CAAEE,IAAI,CAACjB,KAAAA,CAAAA,EAAQ,OAAO,CAAC,WAAW,EAAEO,WAAAA,CAAYQ,OAAO,CAAA,CAAE;gBAC5I,OAAOP,SAAAA;AACX,YAAA;AAEA,QAAA,KAAKG,kBAAkBO,MAAM;AAAE,YAAA;gBAC3B,IAAI,OAAOlB,UAAU,QAAA,IAAY,CAACkB,OAAOC,QAAQ,CAACnB,QAAQ,OAAO,mBAAA;gBACjE,IAAIO,WAAAA,CAAYa,OAAO,IAAI,CAACF,OAAOG,SAAS,CAACrB,QAAQ,OAAO,yBAAA;AAC5D,gBAAA,IAAIO,WAAAA,CAAYe,OAAO,KAAKd,SAAAA,IAAaR,QAAQO,WAAAA,CAAYe,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAEf,WAAAA,CAAYe,OAAO,CAAA,CAAE;AACtH,gBAAA,IAAIf,WAAAA,CAAYgB,OAAO,KAAKf,SAAAA,IAAaR,QAAQO,WAAAA,CAAYgB,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAEhB,WAAAA,CAAYgB,OAAO,CAAA,CAAE;gBACrH,OAAOf,SAAAA;AACX,YAAA;AAEA,QAAA,KAAKG,kBAAkBa,OAAO;YAC1B,OAAO,OAAOxB,KAAAA,KAAU,SAAA,GAAYQ,SAAAA,GAAY,wBAAA;AAEpD,QAAA,KAAKG,kBAAkBc,IAAI;AACvB,YAAA,OAAO,CAACnB,UAAAA,CAAWoB,OAAO,IAAI,EAAE,EAAEC,IAAI,CAACC,CAAAA,MAAAA,GAAUA,MAAAA,CAAO5B,KAAK,KAAKA,SAASQ,SAAAA,GAAY,gCAAA;AAE3F,QAAA,KAAKG,kBAAkBkB,IAAI;AACvB,YAAA,IAAI,CAAC9B,QAAAA,CAASC,KAAAA,CAAAA,IAAU,CAACG,gBAAAA,CAAiBH,KAAAA,CAAM8B,OAAO,CAAA,IAAK,CAAC3B,gBAAAA,CAAiBH,KAAAA,CAAM+B,GAAG,GAAG,OAAO,qDAAA;YACjG,OAAO/B,KAAAA,CAAMgC,OAAO,KAAKxB,SAAAA,IAAa,OAAOR,KAAAA,CAAMgC,OAAO,KAAK,QAAA,GAAWxB,SAAAA,GAAY,mCAAA;AAE1F,QAAA,KAAKG,kBAAkBsB,WAAW;YAC9B,IAAI,CAAClC,SAASC,KAAAA,CAAAA,IAAU,CAACG,iBAAiBH,KAAAA,CAAMkC,MAAM,GAAG,OAAO,wCAAA;YAChE,OAAOlC,KAAAA,CAAMmC,sBAAsB,KAAK3B,SAAAA,IAAaT,SAASC,KAAAA,CAAMmC,sBAAsB,IACpF3B,SAAAA,GACA,0CAAA;AAEV,QAAA,KAAKG,kBAAkByB,cAAc;YACjC,IAAIjC,gBAAAA,CAAiBH,QAAQ,OAAOQ,SAAAA;AACpC,YAAA,IAAI,CAACT,QAAAA,CAASC,KAAAA,CAAAA,IAAU,CAACG,gBAAAA,CAAiBH,KAAAA,CAAMqC,OAAO,CAAA,IAAK,CAAClC,gBAAAA,CAAiBH,KAAAA,CAAMsC,KAAK,GAAG,OAAO,0CAAA;AACnG,YAAA,OAAOrC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAMuC,SAAS,CAAA,IAAKtC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAMwC,OAAO,CAAA,GAAIhC,SAAAA,GAAY,mDAAA;AAExF,QAAA,KAAKG,kBAAkB8B,UAAU;AAC7B,YAAA,OAAOC,mBAAmBpC,UAAAA,EAAYN,KAAAA,CAAAA;AAE1C,QAAA;AACI,YAAA,OAAOD,SAASC,KAAAA,CAAAA,IAAUC,KAAAA,CAAMC,OAAO,CAACF,SAASQ,SAAAA,GAAY,6BAAA;AACrE;AACJ;AAEA,SAASkC,kBAAAA,CAAmBpC,UAA8B,EAAEN,KAAc,EAAA;AACtE,IAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACF,QAAQ,OAAO,iBAAA;AAClC,IAAA,MAAMO,WAAAA,GAAcD,UAAAA,CAAWC,WAAW,IAAI,EAAC;AAC/C,IAAA,IAAIA,YAAYoC,YAAY,KAAKnC,aAAaR,KAAAA,CAAMI,MAAM,GAAGG,WAAAA,CAAYoC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAEpC,YAAYoC,YAAY,CAAC,MAAM,CAAC;AAChJ,IAAA,IAAIpC,YAAYqC,YAAY,KAAKpC,aAAaR,KAAAA,CAAMI,MAAM,GAAGG,WAAAA,CAAYqC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAErC,YAAYqC,YAAY,CAAC,MAAM,CAAC;AAEhJ,IAAA,MAAMC,aAAa,IAAIC,GAAAA,EAAAA;IACvB,KAAK,MAAMC,QAAQ/C,KAAAA,CAAO;QACtB,IAAI,CAACD,SAASgD,IAAAA,CAAAA,IAAS,CAAC5C,iBAAiB4C,IAAAA,CAAKC,EAAE,GAAG,OAAO,wBAAA;AAC1D,QAAA,IAAIH,UAAAA,CAAWI,GAAG,CAACF,IAAAA,CAAKC,EAAE,CAAA,EAAG,OAAO,CAAC,aAAa,EAAED,IAAAA,CAAKC,EAAE,CAAC,eAAe,CAAC;QAC5EH,UAAAA,CAAWK,GAAG,CAACH,IAAAA,CAAKC,EAAE,CAAA;AAEtB,QAAA,MAAM,EAAEA,EAAAA,EAAIG,SAAS,EAAE,GAAGC,QAAQ,GAAGL,IAAAA;AACrC,QAAA,MAAMM,UAAUC,kBAAAA,CAAmBhD,UAAAA,CAAWyC,IAAI,EAAEK,MAAAA,CAAAA,CAAQG,EAAE,CAAC,CAAA,CAAA;AAC/D,QAAA,IAAIF,SAAS,OAAO,CAAC,MAAM,EAAEN,KAAKC,EAAE,CAAC,GAAG,EAAEK,QAAQG,KAAK,CAAC,CAAC,EAAEH,OAAAA,CAAQA,OAAO,CAAA,CAAE;AAChF,IAAA;IAEA,OAAO7C,SAAAA;AACX;AAUA;;;;;;AAMC,IACM,SAAS8C,kBAAAA,CAAmBG,cAAoD,EAAEL,MAA+B,EAAA;IACpH,MAAMM,MAAAA,GAASD,cAAAA,EAAgBE,UAAAA,IAAc,EAAE;AAC/C,IAAA,MAAMC,WAA+B,EAAE;IAEvC,KAAK,MAAM,CAACJ,KAAAA,EAAOK,UAAAA,CAAW,IAAIC,MAAAA,CAAOC,OAAO,CAACX,MAAAA,CAAAA,CAAS;QACtD,MAAMY,eAAAA,GAAkBN,OAAOO,IAAI,CAACC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUC,IAAI,KAAKX,KAAAA,CAAAA;AACpE,QAAA,IAAI,CAACQ,eAAAA,EAAiB;AAClBJ,YAAAA,QAAAA,CAASQ,IAAI,CAAC;AAAEZ,gBAAAA,KAAAA;gBAAOH,OAAAA,EAAS;AAA6C,aAAA,CAAA;AAC7E,YAAA;AACJ,QAAA;QAEA,MAAMA,OAAAA,GAAUhD,cAAc2D,eAAAA,EAAiBH,UAAAA,CAAAA;QAC/C,IAAIR,OAAAA,EAASO,QAAAA,CAASQ,IAAI,CAAC;AAAEZ,YAAAA,KAAAA;AAAOH,YAAAA;AAAQ,SAAA,CAAA;AAChD,IAAA;IAEA,KAAK,MAAMW,mBAAmBN,MAAAA,CAAQ;QAClC,IAAIM,eAAAA,CAAgBzD,WAAW,EAAEE,QAAAA,IAAY2C,MAAM,CAACY,eAAAA,CAAgBG,IAAI,CAAC,KAAK3D,SAAAA,EAAW;AACrFoD,YAAAA,QAAAA,CAASQ,IAAI,CAAC;AAAEZ,gBAAAA,KAAAA,EAAOQ,gBAAgBG,IAAI;gBAAEd,OAAAA,EAAS;AAAsB,aAAA,CAAA;AAChF,QAAA;AACJ,IAAA;IAEA,OAAOO,QAAAA;AACX;;"}
@@ -0,0 +1,25 @@
1
+ import { IconEntry, IconReference } from '@cratis/scene.model';
2
+ import { EffectiveIconEntry } from './EffectiveIconEntry';
3
+ import { IconCatalogSource } from './IconCatalogSource';
4
+ import { IconDiagnostic } from './IconDiagnostic';
5
+ import { IconLibraryResolution } from './IconLibraryResolution';
6
+ import { IconQuery } from './IconQuery';
7
+ import { IconResolution } from './IconResolution';
8
+ import { IconSearchResult } from './IconSearchResult';
9
+ import { ResolvedIconLibrary } from './ResolvedIconLibrary';
10
+ export declare class EffectiveIconCatalog {
11
+ #private;
12
+ readonly resolution: IconLibraryResolution;
13
+ constructor(resolution: IconLibraryResolution, sources: IconCatalogSource[]);
14
+ get libraries(): ResolvedIconLibrary[];
15
+ get diagnostics(): IconDiagnostic[];
16
+ isLoaded(library: string): boolean;
17
+ entriesOf(library: string): Promise<IconEntry[] | undefined>;
18
+ search(query?: IconQuery): Promise<IconSearchResult>;
19
+ findByName(name: string): Promise<EffectiveIconEntry[]>;
20
+ categories(library?: string): Promise<string[]>;
21
+ resolve(reference: IconReference): Promise<IconResolution>;
22
+ lookup(reference: IconReference): IconResolution | undefined;
23
+ load(library?: string): Promise<IconDiagnostic[]>;
24
+ }
25
+ //# sourceMappingURL=EffectiveIconCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectiveIconCatalog.d.ts","sourceRoot":"","sources":["../../../icons/EffectiveIconCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAqB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,qBAAa,oBAAoB;;IAUjB,QAAQ,CAAC,UAAU,EAAE,qBAAqB;IAAtD,YAAqB,UAAU,EAAE,qBAAqB,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAEnF;IAKD,IAAI,SAAS,IAAI,mBAAmB,EAAE,CAErC;IAKD,IAAI,WAAW,IAAI,cAAc,EAAE,CAElC;IAKD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjC;IAQK,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAiBjE;IAKK,MAAM,CAAC,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmB7D;IAOK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAI5D;IAKK,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpD;IAKK,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ/D;IAWD,MAAM,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAsB3D;IAMK,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAItD;CAkBJ"}
@@ -0,0 +1,210 @@
1
+ import { formatIconReference } from '@cratis/scene.model';
2
+ import { referencesOfEntry } from './EffectiveIconEntry.js';
3
+ import { matchesIconQuery } from './matchesIconQuery.js';
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
+ * The icons a profile can actually use: the active libraries from {@link resolveIconLibraries}, with their
9
+ * catalogs loaded on demand.
10
+ *
11
+ * Opening it costs nothing - no catalog is read until a query or a lookup needs that library, and a
12
+ * query narrowed to one library reads only that one. A catalog is loaded once and kept; a load that
13
+ * fails is not kept, so the next call tries again. Everything that goes wrong is reported as an
14
+ * {@link IconDiagnostic}; nothing is ever answered with a different icon than the one asked for.
15
+ */ class EffectiveIconCatalog {
16
+ resolution;
17
+ #sources;
18
+ #loads = new Map();
19
+ #loadedEntries = new Map();
20
+ /**
21
+ * @param resolution The active libraries and the problems found with them.
22
+ * @param sources The catalog source of each library; a library with none is active but reports
23
+ * 'catalog-unavailable' when its icons are needed.
24
+ */ constructor(resolution, sources){
25
+ this.resolution = resolution;
26
+ this.#sources = new Map(sources.map((source)=>[
27
+ source.library,
28
+ source
29
+ ]));
30
+ }
31
+ /**
32
+ * The active libraries, with provenance.
33
+ */ get libraries() {
34
+ return this.resolution.libraries;
35
+ }
36
+ /**
37
+ * Problems with the libraries themselves, known without loading any catalog.
38
+ */ get diagnostics() {
39
+ return this.resolution.diagnostics;
40
+ }
41
+ /**
42
+ * Whether a library's catalog has been read yet.
43
+ */ isLoaded(library) {
44
+ return this.#loadedEntries.has(library);
45
+ }
46
+ /**
47
+ * The entries of one library, loading its catalog if this is the first time it is needed.
48
+ * Resolves to `undefined` when the library is not active.
49
+ *
50
+ * @throws Whatever the library's source throws, or an Error when an active library has no source.
51
+ */ async entriesOf(library) {
52
+ if (!this.libraries.some((resolved)=>resolved.library === library)) return undefined;
53
+ let load = this.#loads.get(library);
54
+ if (!load) {
55
+ const source = this.#sources.get(library);
56
+ if (!source) throw new Error(`The icon library '${library}' is active but has no catalog source`);
57
+ load = source.loadEntries();
58
+ this.#loads.set(library, load);
59
+ load.then((entries)=>this.#loadedEntries.set(library, entries), ()=>this.#loads.delete(library));
60
+ }
61
+ return load;
62
+ }
63
+ /**
64
+ * Searches the catalogs of the libraries the query covers - all of them, or the one it names.
65
+ */ async search(query = {}) {
66
+ const covered = this.libraries.filter((resolved)=>query.library === undefined || resolved.library === query.library);
67
+ const outcomes = await Promise.all(covered.map(async (resolved)=>this.#entriesOrDiagnostic(resolved)));
68
+ const entries = [];
69
+ const diagnostics = [];
70
+ outcomes.forEach((outcome, position)=>{
71
+ const library = covered[position];
72
+ if ('diagnostic' in outcome) {
73
+ diagnostics.push(outcome.diagnostic);
74
+ return;
75
+ }
76
+ for (const entry of outcome.entries.filter((candidate)=>matchesIconQuery(candidate, query))){
77
+ entries.push({
78
+ library,
79
+ entry,
80
+ references: referencesOfEntry(library.library, entry)
81
+ });
82
+ }
83
+ });
84
+ return {
85
+ entries,
86
+ diagnostics
87
+ };
88
+ }
89
+ /**
90
+ * Every active library's icons whose name or key is exactly `name` (ignoring case) - the several
91
+ * candidates a bare legacy icon name could have meant. More than one is a real answer, not a tie to
92
+ * break: it is the author's decision which library the icon comes from.
93
+ */ async findByName(name) {
94
+ const wanted = name.trim().toLowerCase();
95
+ const { entries } = await this.search({});
96
+ return entries.filter(({ entry })=>entry.key.toLowerCase() === wanted || entry.name.toLowerCase() === wanted);
97
+ }
98
+ /**
99
+ * The categories in use, sorted, across all libraries or one.
100
+ */ async categories(library) {
101
+ const { entries } = await this.search({
102
+ library
103
+ });
104
+ return [
105
+ ...new Set(entries.flatMap(({ entry })=>entry.categories))
106
+ ].sort();
107
+ }
108
+ /**
109
+ * Looks a reference up: the icon it names, or exactly why there is none.
110
+ */ async resolve(reference) {
111
+ const library = this.libraries.find((resolved)=>resolved.library === reference.library);
112
+ if (library && !this.isLoaded(library.library) && !this.#incompatibility(library)) {
113
+ const outcome = await this.#entriesOrDiagnostic(library);
114
+ if ('diagnostic' in outcome) return {
115
+ isResolved: false,
116
+ reference,
117
+ diagnostic: {
118
+ ...outcome.diagnostic,
119
+ reference
120
+ }
121
+ };
122
+ }
123
+ return this.lookup(reference);
124
+ }
125
+ /**
126
+ * Looks a reference up without loading anything, for callers that cannot wait - an edit is applied
127
+ * synchronously. Resolves everything that is decidable from what is already known: a library that is not
128
+ * active, one at an incompatible version, and - once the library's catalog has been loaded - a missing
129
+ * icon or variant.
130
+ *
131
+ * @returns The resolution, or `undefined` when the library is active but its catalog has not been loaded,
132
+ * so nothing can be said about the icon yet. Call {@link load} first to make the answer definite.
133
+ */ lookup(reference) {
134
+ const library = this.libraries.find((resolved)=>resolved.library === reference.library);
135
+ if (!library) {
136
+ return this.#unresolved(reference, 'missing-library', `The icon library '${reference.library}' is not active in this profile`);
137
+ }
138
+ const incompatible = this.#incompatibility(library);
139
+ if (incompatible) return {
140
+ isResolved: false,
141
+ reference,
142
+ diagnostic: {
143
+ ...incompatible,
144
+ reference
145
+ }
146
+ };
147
+ const entries = this.#loadedEntries.get(library.library);
148
+ if (!entries) return undefined;
149
+ const entry = entries.find((candidate)=>candidate.key === reference.key);
150
+ if (!entry) {
151
+ return this.#unresolved(reference, 'missing-icon', `The icon library '${library.library}' has no icon '${reference.key}'`);
152
+ }
153
+ if (reference.variant !== undefined && !(entry.variants ?? []).includes(reference.variant)) {
154
+ return this.#unresolved(reference, 'missing-variant', `The icon '${formatIconReference({
155
+ library: library.library,
156
+ key: entry.key
157
+ })}' has no '${reference.variant}' variant`);
158
+ }
159
+ return {
160
+ isResolved: true,
161
+ reference,
162
+ library,
163
+ entry
164
+ };
165
+ }
166
+ /**
167
+ * Loads the catalogs of one library, or of every active library, so that {@link lookup} can answer
168
+ * definitely. Libraries whose catalog cannot be loaded are reported, not thrown.
169
+ */ async load(library) {
170
+ const covered = this.libraries.filter((resolved)=>library === undefined || resolved.library === library);
171
+ const outcomes = await Promise.all(covered.map(async (resolved)=>this.#entriesOrDiagnostic(resolved)));
172
+ return outcomes.flatMap((outcome)=>'diagnostic' in outcome ? [
173
+ outcome.diagnostic
174
+ ] : []);
175
+ }
176
+ #incompatibility(library) {
177
+ return this.diagnostics.find((diagnostic)=>diagnostic.kind === 'incompatible-version' && diagnostic.library === library.library);
178
+ }
179
+ async #entriesOrDiagnostic(library) {
180
+ try {
181
+ return {
182
+ entries: await this.entriesOf(library.library) ?? []
183
+ };
184
+ } catch (error) {
185
+ const reason = error instanceof Error ? error.message : String(error);
186
+ return {
187
+ diagnostic: {
188
+ kind: 'catalog-unavailable',
189
+ library: library.library,
190
+ message: `The catalog of '${library.library}' could not be loaded: ${reason}`
191
+ }
192
+ };
193
+ }
194
+ }
195
+ #unresolved(reference, kind, message) {
196
+ return {
197
+ isResolved: false,
198
+ reference,
199
+ diagnostic: {
200
+ kind,
201
+ library: reference.library,
202
+ message,
203
+ reference
204
+ }
205
+ };
206
+ }
207
+ }
208
+
209
+ export { EffectiveIconCatalog };
210
+ //# sourceMappingURL=EffectiveIconCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectiveIconCatalog.js","sources":["../../../icons/EffectiveIconCatalog.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 { IconEntry, IconReference, formatIconReference } from '@cratis/scene.model';\nimport { EffectiveIconEntry, referencesOfEntry } from './EffectiveIconEntry';\nimport { IconCatalogSource } from './IconCatalogSource';\nimport { IconDiagnostic } from './IconDiagnostic';\nimport { IconLibraryResolution } from './IconLibraryResolution';\nimport { IconQuery } from './IconQuery';\nimport { IconResolution } from './IconResolution';\nimport { IconSearchResult } from './IconSearchResult';\nimport { ResolvedIconLibrary } from './ResolvedIconLibrary';\nimport { matchesIconQuery } from './matchesIconQuery';\n\n/**\n * The icons a profile can actually use: the active libraries from {@link resolveIconLibraries}, with their\n * catalogs loaded on demand.\n *\n * Opening it costs nothing - no catalog is read until a query or a lookup needs that library, and a\n * query narrowed to one library reads only that one. A catalog is loaded once and kept; a load that\n * fails is not kept, so the next call tries again. Everything that goes wrong is reported as an\n * {@link IconDiagnostic}; nothing is ever answered with a different icon than the one asked for.\n */\nexport class EffectiveIconCatalog {\n readonly #sources: Map<string, IconCatalogSource>;\n readonly #loads = new Map<string, Promise<IconEntry[]>>();\n readonly #loadedEntries = new Map<string, IconEntry[]>();\n\n /**\n * @param resolution The active libraries and the problems found with them.\n * @param sources The catalog source of each library; a library with none is active but reports\n * 'catalog-unavailable' when its icons are needed.\n */\n constructor(readonly resolution: IconLibraryResolution, sources: IconCatalogSource[]) {\n this.#sources = new Map(sources.map((source) => [source.library, source]));\n }\n\n /**\n * The active libraries, with provenance.\n */\n get libraries(): ResolvedIconLibrary[] {\n return this.resolution.libraries;\n }\n\n /**\n * Problems with the libraries themselves, known without loading any catalog.\n */\n get diagnostics(): IconDiagnostic[] {\n return this.resolution.diagnostics;\n }\n\n /**\n * Whether a library's catalog has been read yet.\n */\n isLoaded(library: string): boolean {\n return this.#loadedEntries.has(library);\n }\n\n /**\n * The entries of one library, loading its catalog if this is the first time it is needed.\n * Resolves to `undefined` when the library is not active.\n *\n * @throws Whatever the library's source throws, or an Error when an active library has no source.\n */\n async entriesOf(library: string): Promise<IconEntry[] | undefined> {\n if (!this.libraries.some((resolved) => resolved.library === library)) return undefined;\n\n let load = this.#loads.get(library);\n if (!load) {\n const source = this.#sources.get(library);\n if (!source) throw new Error(`The icon library '${library}' is active but has no catalog source`);\n\n load = source.loadEntries();\n this.#loads.set(library, load);\n load.then(\n (entries) => this.#loadedEntries.set(library, entries),\n () => this.#loads.delete(library)\n );\n }\n\n return load;\n }\n\n /**\n * Searches the catalogs of the libraries the query covers - all of them, or the one it names.\n */\n async search(query: IconQuery = {}): Promise<IconSearchResult> {\n const covered = this.libraries.filter((resolved) => query.library === undefined || resolved.library === query.library);\n const outcomes = await Promise.all(covered.map(async (resolved) => this.#entriesOrDiagnostic(resolved)));\n\n const entries: EffectiveIconEntry[] = [];\n const diagnostics: IconDiagnostic[] = [];\n outcomes.forEach((outcome, position) => {\n const library = covered[position];\n if ('diagnostic' in outcome) {\n diagnostics.push(outcome.diagnostic);\n return;\n }\n\n for (const entry of outcome.entries.filter((candidate) => matchesIconQuery(candidate, query))) {\n entries.push({ library, entry, references: referencesOfEntry(library.library, entry) });\n }\n });\n\n return { entries, diagnostics };\n }\n\n /**\n * Every active library's icons whose name or key is exactly `name` (ignoring case) - the several\n * candidates a bare legacy icon name could have meant. More than one is a real answer, not a tie to\n * break: it is the author's decision which library the icon comes from.\n */\n async findByName(name: string): Promise<EffectiveIconEntry[]> {\n const wanted = name.trim().toLowerCase();\n const { entries } = await this.search({});\n return entries.filter(({ entry }) => entry.key.toLowerCase() === wanted || entry.name.toLowerCase() === wanted);\n }\n\n /**\n * The categories in use, sorted, across all libraries or one.\n */\n async categories(library?: string): Promise<string[]> {\n const { entries } = await this.search({ library });\n return [...new Set(entries.flatMap(({ entry }) => entry.categories))].sort();\n }\n\n /**\n * Looks a reference up: the icon it names, or exactly why there is none.\n */\n async resolve(reference: IconReference): Promise<IconResolution> {\n const library = this.libraries.find((resolved) => resolved.library === reference.library);\n if (library && !this.isLoaded(library.library) && !this.#incompatibility(library)) {\n const outcome = await this.#entriesOrDiagnostic(library);\n if ('diagnostic' in outcome) return { isResolved: false, reference, diagnostic: { ...outcome.diagnostic, reference } };\n }\n\n return this.lookup(reference) as IconResolution;\n }\n\n /**\n * Looks a reference up without loading anything, for callers that cannot wait - an edit is applied\n * synchronously. Resolves everything that is decidable from what is already known: a library that is not\n * active, one at an incompatible version, and - once the library's catalog has been loaded - a missing\n * icon or variant.\n *\n * @returns The resolution, or `undefined` when the library is active but its catalog has not been loaded,\n * so nothing can be said about the icon yet. Call {@link load} first to make the answer definite.\n */\n lookup(reference: IconReference): IconResolution | undefined {\n const library = this.libraries.find((resolved) => resolved.library === reference.library);\n if (!library) {\n return this.#unresolved(reference, 'missing-library', `The icon library '${reference.library}' is not active in this profile`);\n }\n\n const incompatible = this.#incompatibility(library);\n if (incompatible) return { isResolved: false, reference, diagnostic: { ...incompatible, reference } };\n\n const entries = this.#loadedEntries.get(library.library);\n if (!entries) return undefined;\n\n const entry = entries.find((candidate) => candidate.key === reference.key);\n if (!entry) {\n return this.#unresolved(reference, 'missing-icon', `The icon library '${library.library}' has no icon '${reference.key}'`);\n }\n\n if (reference.variant !== undefined && !(entry.variants ?? []).includes(reference.variant)) {\n return this.#unresolved(reference, 'missing-variant', `The icon '${formatIconReference({ library: library.library, key: entry.key })}' has no '${reference.variant}' variant`);\n }\n\n return { isResolved: true, reference, library, entry };\n }\n\n /**\n * Loads the catalogs of one library, or of every active library, so that {@link lookup} can answer\n * definitely. Libraries whose catalog cannot be loaded are reported, not thrown.\n */\n async load(library?: string): Promise<IconDiagnostic[]> {\n const covered = this.libraries.filter((resolved) => library === undefined || resolved.library === library);\n const outcomes = await Promise.all(covered.map(async (resolved) => this.#entriesOrDiagnostic(resolved)));\n return outcomes.flatMap((outcome) => ('diagnostic' in outcome ? [outcome.diagnostic] : []));\n }\n\n #incompatibility(library: ResolvedIconLibrary): IconDiagnostic | undefined {\n return this.diagnostics.find((diagnostic) => diagnostic.kind === 'incompatible-version' && diagnostic.library === library.library);\n }\n\n async #entriesOrDiagnostic(library: ResolvedIconLibrary): Promise<{ entries: IconEntry[] } | { diagnostic: IconDiagnostic }> {\n try {\n return { entries: (await this.entriesOf(library.library)) ?? [] };\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return { diagnostic: { kind: 'catalog-unavailable', library: library.library, message: `The catalog of '${library.library}' could not be loaded: ${reason}` } };\n }\n }\n\n #unresolved(reference: IconReference, kind: IconDiagnostic['kind'], message: string): IconResolution & { isResolved: false } {\n return { isResolved: false, reference, diagnostic: { kind, library: reference.library, message, reference } };\n }\n}\n"],"names":["EffectiveIconCatalog","Map","resolution","sources","map","source","library","libraries","diagnostics","isLoaded","has","entriesOf","some","resolved","undefined","load","get","Error","loadEntries","set","then","entries","delete","search","query","covered","filter","outcomes","Promise","all","forEach","outcome","position","push","diagnostic","entry","candidate","matchesIconQuery","references","referencesOfEntry","findByName","name","wanted","trim","toLowerCase","key","categories","Set","flatMap","sort","resolve","reference","find","isResolved","lookup","incompatible","variant","variants","includes","formatIconReference","kind","error","reason","message","String"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { IconEntry, IconReference } from '@cratis/scene.model';
2
+ import { ResolvedIconLibrary } from './ResolvedIconLibrary';
3
+ export interface EffectiveIconEntry {
4
+ library: ResolvedIconLibrary;
5
+ entry: IconEntry;
6
+ references: IconReference[];
7
+ }
8
+ export declare function referencesOfEntry(library: string, entry: IconEntry): IconReference[];
9
+ //# sourceMappingURL=EffectiveIconEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectiveIconEntry.d.ts","sourceRoot":"","sources":["../../../icons/EffectiveIconEntry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,WAAW,kBAAkB;IAI/B,OAAO,EAAE,mBAAmB,CAAC;IAK7B,KAAK,EAAE,SAAS,CAAC;IAKjB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC/B;AAKD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,EAAE,CAKpF"}
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ /**
4
+ * The references that name an entry of a library: one per variant, or one without a variant.
5
+ */ function referencesOfEntry(library, entry) {
6
+ const variants = entry.variants ?? [];
7
+ return variants.length === 0 ? [
8
+ {
9
+ library,
10
+ key: entry.key
11
+ }
12
+ ] : variants.map((variant)=>({
13
+ library,
14
+ key: entry.key,
15
+ variant
16
+ }));
17
+ }
18
+
19
+ export { referencesOfEntry };
20
+ //# sourceMappingURL=EffectiveIconEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectiveIconEntry.js","sources":["../../../icons/EffectiveIconEntry.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 { IconEntry, IconReference } from '@cratis/scene.model';\nimport { ResolvedIconLibrary } from './ResolvedIconLibrary';\n\n/**\n * An icon as a picker shows it: the catalog entry, the library that provides it (so provenance and\n * attribution are one step away), and the references that name it.\n */\nexport interface EffectiveIconEntry {\n /**\n * The active library that provides the icon.\n */\n library: ResolvedIconLibrary;\n\n /**\n * The catalog entry.\n */\n entry: IconEntry;\n\n /**\n * One reference per variant the icon exists in, or the single variant-less reference when it has none.\n */\n references: IconReference[];\n}\n\n/**\n * The references that name an entry of a library: one per variant, or one without a variant.\n */\nexport function referencesOfEntry(library: string, entry: IconEntry): IconReference[] {\n const variants = entry.variants ?? [];\n return variants.length === 0\n ? [{ library, key: entry.key }]\n : variants.map((variant) => ({ library, key: entry.key, variant }));\n}\n"],"names":["referencesOfEntry","library","entry","variants","length","key","map","variant"],"mappings":"AAAA;AACA;AA0BA;;AAEC,IACM,SAASA,iBAAAA,CAAkBC,OAAe,EAAEC,KAAgB,EAAA;AAC/D,IAAA,MAAMC,QAAAA,GAAWD,KAAAA,CAAMC,QAAQ,IAAI,EAAE;IACrC,OAAOA,QAAAA,CAASC,MAAM,KAAK,CAAA,GACrB;AAAC,QAAA;AAAEH,YAAAA,OAAAA;AAASI,YAAAA,GAAAA,EAAKH,MAAMG;AAAI;AAAE,KAAA,GAC7BF,QAAAA,CAASG,GAAG,CAAC,CAACC,WAAa;AAAEN,YAAAA,OAAAA;AAASI,YAAAA,GAAAA,EAAKH,MAAMG,GAAG;AAAEE,YAAAA;SAAQ,CAAA,CAAA;AACxE;;"}
@@ -0,0 +1,6 @@
1
+ import { IconEntry } from '@cratis/scene.model';
2
+ export interface IconCatalogSource {
3
+ library: string;
4
+ loadEntries(): Promise<IconEntry[]>;
5
+ }
6
+ //# sourceMappingURL=IconCatalogSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconCatalogSource.d.ts","sourceRoot":"","sources":["../../../icons/IconCatalogSource.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAShD,MAAM,WAAW,iBAAiB;IAI9B,OAAO,EAAE,MAAM,CAAC;IAKhB,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconCatalogSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconCatalogSource.js","sourceRoot":"","sources":["../../../icons/IconCatalogSource.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { IconReference } from '@cratis/scene.model';
2
+ export type IconDiagnosticKind = 'missing-library' | 'missing-icon' | 'missing-variant' | 'incompatible-version' | 'catalog-unavailable';
3
+ export interface IconDiagnostic {
4
+ kind: IconDiagnosticKind;
5
+ library: string;
6
+ message: string;
7
+ reference?: IconReference;
8
+ }
9
+ //# sourceMappingURL=IconDiagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconDiagnostic.d.ts","sourceRoot":"","sources":["../../../icons/IconDiagnostic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMpD,MAAM,MAAM,kBAAkB,GAExB,iBAAiB,GAEjB,cAAc,GAEd,iBAAiB,GAEjB,sBAAsB,GAEtB,qBAAqB,CAAC;AAK5B,MAAM,WAAW,cAAc;IAI3B,IAAI,EAAE,kBAAkB,CAAC;IAKzB,OAAO,EAAE,MAAM,CAAC;IAKhB,OAAO,EAAE,MAAM,CAAC;IAKhB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconDiagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconDiagnostic.js","sourceRoot":"","sources":["../../../icons/IconDiagnostic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { EffectiveIconEntry } from './EffectiveIconEntry';
2
+ import { IconDiagnostic } from './IconDiagnostic';
3
+ import { IconUsage } from './IconUsage';
4
+ export interface AffectedIconUsage {
5
+ usage: IconUsage;
6
+ diagnostic: IconDiagnostic;
7
+ wasResolvable: boolean;
8
+ }
9
+ export interface LegacyIconUsage {
10
+ usage: IconUsage;
11
+ candidates: EffectiveIconEntry[];
12
+ }
13
+ export interface IconImpactReport {
14
+ affected: AffectedIconUsage[];
15
+ unaffectedCount: number;
16
+ legacy: LegacyIconUsage[];
17
+ }
18
+ //# sourceMappingURL=IconImpactReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconImpactReport.d.ts","sourceRoot":"","sources":["../../../icons/IconImpactReport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,WAAW,iBAAiB;IAI9B,KAAK,EAAE,SAAS,CAAC;IAKjB,UAAU,EAAE,cAAc,CAAC;IAM3B,aAAa,EAAE,OAAO,CAAC;CAC1B;AAKD,MAAM,WAAW,eAAe;IAI5B,KAAK,EAAE,SAAS,CAAC;IAMjB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAKD,MAAM,WAAW,gBAAgB;IAI7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAK9B,eAAe,EAAE,MAAM,CAAC;IAKxB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconImpactReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconImpactReport.js","sourceRoot":"","sources":["../../../icons/IconImpactReport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { IconDiagnostic } from './IconDiagnostic';
2
+ import { ResolvedIconLibrary } from './ResolvedIconLibrary';
3
+ export interface IconLibraryResolution {
4
+ libraries: ResolvedIconLibrary[];
5
+ diagnostics: IconDiagnostic[];
6
+ }
7
+ //# sourceMappingURL=IconLibraryResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconLibraryResolution.d.ts","sourceRoot":"","sources":["../../../icons/IconLibraryResolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,qBAAqB;IAMlC,SAAS,EAAE,mBAAmB,EAAE,CAAC;IAKjC,WAAW,EAAE,cAAc,EAAE,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconLibraryResolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconLibraryResolution.js","sourceRoot":"","sources":["../../../icons/IconLibraryResolution.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface IconQuery {
2
+ text?: string;
3
+ library?: string;
4
+ category?: string;
5
+ variant?: string;
6
+ }
7
+ //# sourceMappingURL=IconQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconQuery.d.ts","sourceRoot":"","sources":["../../../icons/IconQuery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IAItB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconQuery.js","sourceRoot":"","sources":["../../../icons/IconQuery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { IconEntry, IconReference } from '@cratis/scene.model';
2
+ import { IconDiagnostic } from './IconDiagnostic';
3
+ import { ResolvedIconLibrary } from './ResolvedIconLibrary';
4
+ export type IconResolution = {
5
+ isResolved: true;
6
+ reference: IconReference;
7
+ library: ResolvedIconLibrary;
8
+ entry: IconEntry;
9
+ } | {
10
+ isResolved: false;
11
+ reference: IconReference;
12
+ diagnostic: IconDiagnostic;
13
+ };
14
+ //# sourceMappingURL=IconResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconResolution.d.ts","sourceRoot":"","sources":["../../../icons/IconResolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,MAAM,cAAc,GACpB;IAEI,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;CACpB,GACD;IAEI,UAAU,EAAE,KAAK,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,cAAc,CAAC;CAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconResolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconResolution.js","sourceRoot":"","sources":["../../../icons/IconResolution.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { EffectiveIconEntry } from './EffectiveIconEntry';
2
+ import { IconDiagnostic } from './IconDiagnostic';
3
+ export interface IconSearchResult {
4
+ entries: EffectiveIconEntry[];
5
+ diagnostics: IconDiagnostic[];
6
+ }
7
+ //# sourceMappingURL=IconSearchResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconSearchResult.d.ts","sourceRoot":"","sources":["../../../icons/IconSearchResult.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKlD,MAAM,WAAW,gBAAgB;IAI7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAM9B,WAAW,EAAE,cAAc,EAAE,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IconSearchResult.js.map