@cratis/scene.engine 4.25.0 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/cjs/editing/resolveEffectiveConfiguration.js +8 -0
  2. package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -1
  3. package/dist/cjs/index.js +64 -0
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/navigation/NavigationDiagnosticCode.js +5 -0
  6. package/dist/cjs/navigation/NavigationDiagnosticCode.js.map +1 -1
  7. package/dist/cjs/navigation/NavigationEditKind.js +16 -0
  8. package/dist/cjs/navigation/NavigationEditKind.js.map +1 -0
  9. package/dist/cjs/navigation/NavigationItemOrigin.js +14 -0
  10. package/dist/cjs/navigation/NavigationItemOrigin.js.map +1 -0
  11. package/dist/cjs/navigation/NavigationSourcesKind.js +16 -0
  12. package/dist/cjs/navigation/NavigationSourcesKind.js.map +1 -0
  13. package/dist/cjs/navigation/diagnoseNavigation.js +8 -1
  14. package/dist/cjs/navigation/diagnoseNavigation.js.map +1 -1
  15. package/dist/cjs/navigation/diagnoseNavigationRegions.js +99 -0
  16. package/dist/cjs/navigation/diagnoseNavigationRegions.js.map +1 -0
  17. package/dist/cjs/navigation/effectiveNavigation.js +133 -0
  18. package/dist/cjs/navigation/effectiveNavigation.js.map +1 -0
  19. package/dist/cjs/navigation/navigationEdits.js +230 -0
  20. package/dist/cjs/navigation/navigationEdits.js.map +1 -0
  21. package/dist/cjs/navigation/navigationRegions.js +42 -0
  22. package/dist/cjs/navigation/navigationRegions.js.map +1 -0
  23. package/dist/cjs/sampleData/SampleRandom.js +77 -0
  24. package/dist/cjs/sampleData/SampleRandom.js.map +1 -0
  25. package/dist/cjs/sampleData/describeSampleDataCatalog.js +61 -0
  26. package/dist/cjs/sampleData/describeSampleDataCatalog.js.map +1 -0
  27. package/dist/cjs/sampleData/findSampleDataSet.js +18 -0
  28. package/dist/cjs/sampleData/findSampleDataSet.js.map +1 -0
  29. package/dist/cjs/sampleData/findSampleRowLiterals.js +73 -0
  30. package/dist/cjs/sampleData/findSampleRowLiterals.js.map +1 -0
  31. package/dist/cjs/sampleData/generateSample.js +188 -0
  32. package/dist/cjs/sampleData/generateSample.js.map +1 -0
  33. package/dist/cjs/sampleData/inferSampleFieldKind.js +176 -0
  34. package/dist/cjs/sampleData/inferSampleFieldKind.js.map +1 -0
  35. package/dist/cjs/sampleData/resolveSampleData.js +107 -0
  36. package/dist/cjs/sampleData/resolveSampleData.js.map +1 -0
  37. package/dist/cjs/sampleData/sampleDataRules.js +26 -0
  38. package/dist/cjs/sampleData/sampleDataRules.js.map +1 -0
  39. package/dist/cjs/sampleData/sampleLocales.js +359 -0
  40. package/dist/cjs/sampleData/sampleLocales.js.map +1 -0
  41. package/dist/cjs/sampleData/validateSampleDataPack.js +44 -0
  42. package/dist/cjs/sampleData/validateSampleDataPack.js.map +1 -0
  43. package/dist/cjs/sampleData/validateSampleDataPackages.js +71 -0
  44. package/dist/cjs/sampleData/validateSampleDataPackages.js.map +1 -0
  45. package/dist/cjs/sampleData/validateSampleDataSelection.js +52 -0
  46. package/dist/cjs/sampleData/validateSampleDataSelection.js.map +1 -0
  47. package/dist/cjs/validateNavigationDestinations.js +2 -0
  48. package/dist/cjs/validateNavigationDestinations.js.map +1 -1
  49. package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -1
  50. package/dist/esm/editing/resolveEffectiveConfiguration.js +8 -0
  51. package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -1
  52. package/dist/esm/index.d.ts +1 -0
  53. package/dist/esm/index.d.ts.map +1 -1
  54. package/dist/esm/index.js +19 -0
  55. package/dist/esm/index.js.map +1 -1
  56. package/dist/esm/navigation/EffectiveNavItem.d.ts +14 -0
  57. package/dist/esm/navigation/EffectiveNavItem.d.ts.map +1 -0
  58. package/dist/esm/navigation/EffectiveNavItem.js +2 -0
  59. package/dist/esm/navigation/EffectiveNavItem.js.map +1 -0
  60. package/dist/esm/navigation/EffectiveNavigationRegion.d.ts +11 -0
  61. package/dist/esm/navigation/EffectiveNavigationRegion.d.ts.map +1 -0
  62. package/dist/esm/navigation/EffectiveNavigationRegion.js +2 -0
  63. package/dist/esm/navigation/EffectiveNavigationRegion.js.map +1 -0
  64. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts +6 -1
  65. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts.map +1 -1
  66. package/dist/esm/navigation/NavigationDiagnosticCode.js +5 -0
  67. package/dist/esm/navigation/NavigationDiagnosticCode.js.map +1 -1
  68. package/dist/esm/navigation/NavigationEdit.d.ts +13 -0
  69. package/dist/esm/navigation/NavigationEdit.d.ts.map +1 -0
  70. package/dist/esm/navigation/NavigationEdit.js +2 -0
  71. package/dist/esm/navigation/NavigationEdit.js.map +1 -0
  72. package/dist/esm/navigation/NavigationEditKind.d.ts +7 -0
  73. package/dist/esm/navigation/NavigationEditKind.d.ts.map +1 -0
  74. package/dist/esm/navigation/NavigationEditKind.js +14 -0
  75. package/dist/esm/navigation/NavigationEditKind.js.map +1 -0
  76. package/dist/esm/navigation/NavigationEditOutcome.d.ts +7 -0
  77. package/dist/esm/navigation/NavigationEditOutcome.d.ts.map +1 -0
  78. package/dist/esm/navigation/NavigationEditOutcome.js +2 -0
  79. package/dist/esm/navigation/NavigationEditOutcome.js.map +1 -0
  80. package/dist/esm/navigation/NavigationEditPlan.d.ts +6 -0
  81. package/dist/esm/navigation/NavigationEditPlan.d.ts.map +1 -0
  82. package/dist/esm/navigation/NavigationEditPlan.js +2 -0
  83. package/dist/esm/navigation/NavigationEditPlan.js.map +1 -0
  84. package/dist/esm/navigation/NavigationGraph.d.ts +4 -1
  85. package/dist/esm/navigation/NavigationGraph.d.ts.map +1 -1
  86. package/dist/esm/navigation/NavigationItemOrigin.d.ts +5 -0
  87. package/dist/esm/navigation/NavigationItemOrigin.d.ts.map +1 -0
  88. package/dist/esm/navigation/NavigationItemOrigin.js +12 -0
  89. package/dist/esm/navigation/NavigationItemOrigin.js.map +1 -0
  90. package/dist/esm/navigation/NavigationSources.d.ts +6 -0
  91. package/dist/esm/navigation/NavigationSources.d.ts.map +1 -0
  92. package/dist/esm/navigation/NavigationSources.js +2 -0
  93. package/dist/esm/navigation/NavigationSources.js.map +1 -0
  94. package/dist/esm/navigation/NavigationSourcesKind.d.ts +7 -0
  95. package/dist/esm/navigation/NavigationSourcesKind.d.ts.map +1 -0
  96. package/dist/esm/navigation/NavigationSourcesKind.js +14 -0
  97. package/dist/esm/navigation/NavigationSourcesKind.js.map +1 -0
  98. package/dist/esm/navigation/ResolvedNavigationTarget.d.ts +6 -0
  99. package/dist/esm/navigation/ResolvedNavigationTarget.d.ts.map +1 -0
  100. package/dist/esm/navigation/ResolvedNavigationTarget.js +2 -0
  101. package/dist/esm/navigation/ResolvedNavigationTarget.js.map +1 -0
  102. package/dist/esm/navigation/diagnoseNavigation.d.ts.map +1 -1
  103. package/dist/esm/navigation/diagnoseNavigation.js +8 -1
  104. package/dist/esm/navigation/diagnoseNavigation.js.map +1 -1
  105. package/dist/esm/navigation/diagnoseNavigationRegions.d.ts +8 -0
  106. package/dist/esm/navigation/diagnoseNavigationRegions.d.ts.map +1 -0
  107. package/dist/esm/navigation/diagnoseNavigationRegions.js +97 -0
  108. package/dist/esm/navigation/diagnoseNavigationRegions.js.map +1 -0
  109. package/dist/esm/navigation/effectiveNavigation.d.ts +5 -0
  110. package/dist/esm/navigation/effectiveNavigation.d.ts.map +1 -0
  111. package/dist/esm/navigation/effectiveNavigation.js +131 -0
  112. package/dist/esm/navigation/effectiveNavigation.js.map +1 -0
  113. package/dist/esm/navigation/index.d.ts +14 -0
  114. package/dist/esm/navigation/index.d.ts.map +1 -1
  115. package/dist/esm/navigation/index.js +14 -0
  116. package/dist/esm/navigation/index.js.map +1 -1
  117. package/dist/esm/navigation/navigationEdits.d.ts +11 -0
  118. package/dist/esm/navigation/navigationEdits.d.ts.map +1 -0
  119. package/dist/esm/navigation/navigationEdits.js +225 -0
  120. package/dist/esm/navigation/navigationEdits.js.map +1 -0
  121. package/dist/esm/navigation/navigationRegions.d.ts +9 -0
  122. package/dist/esm/navigation/navigationRegions.d.ts.map +1 -0
  123. package/dist/esm/navigation/navigationRegions.js +34 -0
  124. package/dist/esm/navigation/navigationRegions.js.map +1 -0
  125. package/dist/esm/sampleData/SampleDataPackSource.d.ts +6 -0
  126. package/dist/esm/sampleData/SampleDataPackSource.d.ts.map +1 -0
  127. package/dist/esm/sampleData/SampleDataPackSource.js +2 -0
  128. package/dist/esm/sampleData/SampleDataPackSource.js.map +1 -0
  129. package/dist/esm/sampleData/SampleDataResolution.d.ts +29 -0
  130. package/dist/esm/sampleData/SampleDataResolution.d.ts.map +1 -0
  131. package/dist/esm/sampleData/SampleDataResolution.js +2 -0
  132. package/dist/esm/sampleData/SampleDataResolution.js.map +1 -0
  133. package/dist/esm/sampleData/SampleRandom.d.ts +14 -0
  134. package/dist/esm/sampleData/SampleRandom.d.ts.map +1 -0
  135. package/dist/esm/sampleData/SampleRandom.js +72 -0
  136. package/dist/esm/sampleData/SampleRandom.js.map +1 -0
  137. package/dist/esm/sampleData/describeSampleDataCatalog.d.ts +24 -0
  138. package/dist/esm/sampleData/describeSampleDataCatalog.d.ts.map +1 -0
  139. package/dist/esm/sampleData/describeSampleDataCatalog.js +57 -0
  140. package/dist/esm/sampleData/describeSampleDataCatalog.js.map +1 -0
  141. package/dist/esm/sampleData/findSampleDataSet.d.ts +3 -0
  142. package/dist/esm/sampleData/findSampleDataSet.d.ts.map +1 -0
  143. package/dist/esm/sampleData/findSampleDataSet.js +16 -0
  144. package/dist/esm/sampleData/findSampleDataSet.js.map +1 -0
  145. package/dist/esm/sampleData/findSampleRowLiterals.d.ts +11 -0
  146. package/dist/esm/sampleData/findSampleRowLiterals.d.ts.map +1 -0
  147. package/dist/esm/sampleData/findSampleRowLiterals.js +69 -0
  148. package/dist/esm/sampleData/findSampleRowLiterals.js.map +1 -0
  149. package/dist/esm/sampleData/generateSample.d.ts +6 -0
  150. package/dist/esm/sampleData/generateSample.d.ts.map +1 -0
  151. package/dist/esm/sampleData/generateSample.js +183 -0
  152. package/dist/esm/sampleData/generateSample.js.map +1 -0
  153. package/dist/esm/sampleData/index.d.ts +15 -0
  154. package/dist/esm/sampleData/index.d.ts.map +1 -0
  155. package/dist/esm/sampleData/index.js +15 -0
  156. package/dist/esm/sampleData/index.js.map +1 -0
  157. package/dist/esm/sampleData/inferSampleFieldKind.d.ts +3 -0
  158. package/dist/esm/sampleData/inferSampleFieldKind.d.ts.map +1 -0
  159. package/dist/esm/sampleData/inferSampleFieldKind.js +174 -0
  160. package/dist/esm/sampleData/inferSampleFieldKind.js.map +1 -0
  161. package/dist/esm/sampleData/resolveSampleData.d.ts +3 -0
  162. package/dist/esm/sampleData/resolveSampleData.d.ts.map +1 -0
  163. package/dist/esm/sampleData/resolveSampleData.js +105 -0
  164. package/dist/esm/sampleData/resolveSampleData.js.map +1 -0
  165. package/dist/esm/sampleData/sampleDataRules.d.ts +7 -0
  166. package/dist/esm/sampleData/sampleDataRules.d.ts.map +1 -0
  167. package/dist/esm/sampleData/sampleDataRules.js +19 -0
  168. package/dist/esm/sampleData/sampleDataRules.js.map +1 -0
  169. package/dist/esm/sampleData/sampleLocales.d.ts +13 -0
  170. package/dist/esm/sampleData/sampleLocales.d.ts.map +1 -0
  171. package/dist/esm/sampleData/sampleLocales.js +355 -0
  172. package/dist/esm/sampleData/sampleLocales.js.map +1 -0
  173. package/dist/esm/sampleData/validateSampleDataPack.d.ts +3 -0
  174. package/dist/esm/sampleData/validateSampleDataPack.d.ts.map +1 -0
  175. package/dist/esm/sampleData/validateSampleDataPack.js +42 -0
  176. package/dist/esm/sampleData/validateSampleDataPack.js.map +1 -0
  177. package/dist/esm/sampleData/validateSampleDataPackages.d.ts +3 -0
  178. package/dist/esm/sampleData/validateSampleDataPackages.d.ts.map +1 -0
  179. package/dist/esm/sampleData/validateSampleDataPackages.js +69 -0
  180. package/dist/esm/sampleData/validateSampleDataPackages.js.map +1 -0
  181. package/dist/esm/sampleData/validateSampleDataSelection.d.ts +3 -0
  182. package/dist/esm/sampleData/validateSampleDataSelection.d.ts.map +1 -0
  183. package/dist/esm/sampleData/validateSampleDataSelection.js +50 -0
  184. package/dist/esm/sampleData/validateSampleDataSelection.js.map +1 -0
  185. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  186. package/dist/esm/validateNavigationDestinations.js +2 -0
  187. package/dist/esm/validateNavigationDestinations.js.map +1 -1
  188. package/editing/resolveEffectiveConfiguration.ts +13 -0
  189. package/index.ts +1 -0
  190. package/navigation/EffectiveNavItem.ts +37 -0
  191. package/navigation/EffectiveNavigationRegion.ts +26 -0
  192. package/navigation/NavigationDiagnosticCode.ts +15 -0
  193. package/navigation/NavigationEdit.ts +36 -0
  194. package/navigation/NavigationEditKind.ts +19 -0
  195. package/navigation/NavigationEditOutcome.ts +18 -0
  196. package/navigation/NavigationEditPlan.ts +15 -0
  197. package/navigation/NavigationGraph.ts +10 -1
  198. package/navigation/NavigationItemOrigin.ts +13 -0
  199. package/navigation/NavigationSources.ts +15 -0
  200. package/navigation/NavigationSourcesKind.ts +19 -0
  201. package/navigation/ResolvedNavigationTarget.ts +19 -0
  202. package/navigation/diagnoseNavigation.ts +7 -1
  203. package/navigation/diagnoseNavigationRegions.ts +122 -0
  204. package/navigation/effectiveNavigation.ts +105 -0
  205. package/navigation/index.ts +14 -0
  206. package/navigation/navigationEdits.ts +176 -0
  207. package/navigation/navigationRegions.ts +39 -0
  208. package/package.json +3 -3
  209. package/sampleData/SampleDataPackSource.ts +13 -0
  210. package/sampleData/SampleDataResolution.ts +93 -0
  211. package/sampleData/SampleRandom.ts +85 -0
  212. package/sampleData/describeSampleDataCatalog.ts +108 -0
  213. package/sampleData/findSampleDataSet.ts +18 -0
  214. package/sampleData/findSampleRowLiterals.ts +86 -0
  215. package/sampleData/generateSample.ts +156 -0
  216. package/sampleData/index.ts +17 -0
  217. package/sampleData/inferSampleFieldKind.ts +64 -0
  218. package/sampleData/resolveSampleData.ts +96 -0
  219. package/sampleData/sampleDataRules.ts +30 -0
  220. package/sampleData/sampleLocales.ts +91 -0
  221. package/sampleData/validateSampleDataPack.ts +48 -0
  222. package/sampleData/validateSampleDataPackages.ts +79 -0
  223. package/sampleData/validateSampleDataSelection.ts +55 -0
@@ -0,0 +1,225 @@
1
+ import { NavigationRegionKind, NavigationRegionMode } from '@cratis/scene.model';
2
+ import { NavigationEditKind } from './NavigationEditKind.js';
3
+ import { collectItemIds, modeOfModuleRegion, applicationItems, findNavigationRegion, findModuleNavigation } from './navigationRegions.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
+ const noMode = 'The application is the base of the navigation and has no region mode.';
8
+ const logoLevel = 'The logo is defined at the application level only.';
9
+ const flatTopbar = 'A topbar is flat; only a sidebar item has sub-items.';
10
+ /**
11
+ * Plans a change of a module region's mode. Switching to `inherit` clears the module's items (NAV3); switching from
12
+ * `inherit` to `override` with `copy` first copies the application's items so the module starts from them (NAV5).
13
+ * @param navigation The navigation as it is.
14
+ * @param module The module whose region changes; the application has no mode and is refused.
15
+ * @param region The region.
16
+ * @param mode The mode to switch to.
17
+ * @param options `copy` copies the application items when switching from inherit to override.
18
+ */ function switchRegionMode(navigation, module, region, mode, options = {}) {
19
+ if (module === undefined) return {
20
+ edits: [],
21
+ rejected: noMode
22
+ };
23
+ const current = modeOfModuleRegion(navigation, module, region);
24
+ if (current === mode) return {
25
+ edits: []
26
+ };
27
+ const setMode = {
28
+ kind: NavigationEditKind.SetRegionMode,
29
+ module,
30
+ region,
31
+ mode
32
+ };
33
+ if (mode === NavigationRegionMode.Inherit) {
34
+ return {
35
+ edits: [
36
+ {
37
+ kind: NavigationEditKind.SetRegionItems,
38
+ module,
39
+ region,
40
+ items: []
41
+ },
42
+ setMode
43
+ ]
44
+ };
45
+ }
46
+ if (mode === NavigationRegionMode.Override && current === NavigationRegionMode.Inherit && options.copy === true) {
47
+ return {
48
+ edits: [
49
+ {
50
+ kind: NavigationEditKind.SetRegionItems,
51
+ module,
52
+ region,
53
+ items: structuredClone(applicationItems(navigation.application, region))
54
+ },
55
+ setMode
56
+ ]
57
+ };
58
+ }
59
+ return {
60
+ edits: [
61
+ setMode
62
+ ]
63
+ };
64
+ }
65
+ /**
66
+ * Plans adding an item to a region, after the ones already there. Adding to an inheriting module region first
67
+ * switches it to `extend` (NAV6), so the application's items stay and the new item follows them.
68
+ * @param navigation The navigation as it is.
69
+ * @param module The module that gets the item; undefined for the application.
70
+ * @param region The region.
71
+ * @param item The item to add.
72
+ * @param parent The id of the item it becomes a sub-item of; sidebar only.
73
+ */ function addNavItem(navigation, module, region, item, parent) {
74
+ if (parent !== undefined && region !== NavigationRegionKind.Sidebar) return {
75
+ edits: [],
76
+ rejected: flatTopbar
77
+ };
78
+ const own = ownItems(navigation, module, region);
79
+ const ids = collectItemIds(own, region);
80
+ if (ids.includes(item.id)) return {
81
+ edits: [],
82
+ rejected: `Navigation item id '${item.id}' is already used in this region.`
83
+ };
84
+ if (parent !== undefined && !ids.includes(parent)) return {
85
+ edits: [],
86
+ rejected: `There is no item '${parent}' to add a sub-item to.`
87
+ };
88
+ const add = {
89
+ kind: NavigationEditKind.AddItem,
90
+ module,
91
+ region,
92
+ item: structuredClone(item)
93
+ };
94
+ if (parent !== undefined) add.parent = parent;
95
+ if (module !== undefined && modeOfModuleRegion(navigation, module, region) === NavigationRegionMode.Inherit) {
96
+ return {
97
+ edits: [
98
+ {
99
+ kind: NavigationEditKind.SetRegionMode,
100
+ module,
101
+ region,
102
+ mode: NavigationRegionMode.Extend
103
+ },
104
+ add
105
+ ]
106
+ };
107
+ }
108
+ return {
109
+ edits: [
110
+ add
111
+ ]
112
+ };
113
+ }
114
+ /**
115
+ * Plans setting the logo. The logo is defined at the application level only, so a module is refused.
116
+ * @param navigation The navigation as it is.
117
+ * @param module The module asking; only undefined (the application) is allowed.
118
+ * @param logo The logo.
119
+ */ function setApplicationLogo(navigation, module, logo) {
120
+ return module === undefined ? {
121
+ edits: [
122
+ {
123
+ kind: NavigationEditKind.SetLogo,
124
+ logo: {
125
+ ...logo
126
+ }
127
+ }
128
+ ]
129
+ } : {
130
+ edits: [],
131
+ rejected: logoLevel
132
+ };
133
+ }
134
+ /**
135
+ * Applies navigation edits to a copy of the model. Either every edit applies, or none does.
136
+ * @param navigation The navigation as it is; never changed.
137
+ * @param edits The edits, in order.
138
+ */ function applyNavigationEdits(navigation, edits) {
139
+ const model = structuredClone(navigation);
140
+ for (const edit of edits){
141
+ const rejected = apply(model, edit);
142
+ if (rejected !== undefined) return {
143
+ applied: false,
144
+ model: navigation,
145
+ rejected
146
+ };
147
+ }
148
+ return {
149
+ applied: true,
150
+ model
151
+ };
152
+ }
153
+ function ownItems(navigation, module, region) {
154
+ return module === undefined ? applicationItems(navigation.application, region) : findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];
155
+ }
156
+ function regionOf(model, module, region) {
157
+ let regions;
158
+ if (module === undefined) {
159
+ regions = model.application.regions;
160
+ } else {
161
+ let block = findModuleNavigation(model, module);
162
+ if (!block) {
163
+ block = {
164
+ module,
165
+ regions: []
166
+ };
167
+ model.modules.push(block);
168
+ }
169
+ regions = block.regions;
170
+ }
171
+ let found = findNavigationRegion(regions, region);
172
+ if (!found) {
173
+ found = {
174
+ region,
175
+ items: []
176
+ };
177
+ regions.push(found);
178
+ }
179
+ return found;
180
+ }
181
+ function apply(model, edit) {
182
+ switch(edit.kind){
183
+ case NavigationEditKind.SetRegionMode:
184
+ if (edit.module === undefined) return noMode;
185
+ regionOf(model, edit.module, edit.region).mode = edit.mode;
186
+ return undefined;
187
+ case NavigationEditKind.SetRegionItems:
188
+ regionOf(model, edit.module, edit.region).items = structuredClone(edit.items ?? []);
189
+ return undefined;
190
+ case NavigationEditKind.AddItem:
191
+ {
192
+ const target = regionOf(model, edit.module, edit.region);
193
+ const item = structuredClone(edit.item);
194
+ if (collectItemIds(target.items, target.region).includes(item.id)) return `Navigation item id '${item.id}' is already used in this region.`;
195
+ if (edit.parent === undefined) {
196
+ target.items.push(item);
197
+ return undefined;
198
+ }
199
+ if (target.region !== NavigationRegionKind.Sidebar) return flatTopbar;
200
+ const owner = findItem(target.items, edit.parent);
201
+ if (!owner) return `There is no item '${edit.parent}' to add a sub-item to.`;
202
+ (owner.children ??= []).push(item);
203
+ return undefined;
204
+ }
205
+ case NavigationEditKind.SetLogo:
206
+ if (edit.module !== undefined) return logoLevel;
207
+ model.application.logo = {
208
+ ...edit.logo
209
+ };
210
+ return undefined;
211
+ default:
212
+ return `'${String(edit.kind)}' is not a navigation edit.`;
213
+ }
214
+ }
215
+ function findItem(items, id) {
216
+ for (const item of items){
217
+ if (item.id === id) return item;
218
+ const nested = findItem(item.children ?? [], id);
219
+ if (nested) return nested;
220
+ }
221
+ return undefined;
222
+ }
223
+
224
+ export { addNavItem, applyNavigationEdits, setApplicationLogo, switchRegionMode };
225
+ //# sourceMappingURL=navigationEdits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationEdits.js","sources":["../../../navigation/navigationEdits.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ApplicationLogo, NavigationModel, NavigationRegion, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';\nimport { NavigationEdit } from './NavigationEdit';\nimport { NavigationEditKind } from './NavigationEditKind';\nimport { NavigationEditOutcome } from './NavigationEditOutcome';\nimport { NavigationEditPlan } from './NavigationEditPlan';\nimport { applicationItems, collectItemIds, findModuleNavigation, findNavigationRegion, modeOfModuleRegion } from './navigationRegions';\n\nconst noMode = 'The application is the base of the navigation and has no region mode.';\nconst logoLevel = 'The logo is defined at the application level only.';\nconst flatTopbar = 'A topbar is flat; only a sidebar item has sub-items.';\n\n/**\n * Plans a change of a module region's mode. Switching to `inherit` clears the module's items (NAV3); switching from\n * `inherit` to `override` with `copy` first copies the application's items so the module starts from them (NAV5).\n * @param navigation The navigation as it is.\n * @param module The module whose region changes; the application has no mode and is refused.\n * @param region The region.\n * @param mode The mode to switch to.\n * @param options `copy` copies the application items when switching from inherit to override.\n */\nexport function switchRegionMode(\n navigation: NavigationModel,\n module: string | undefined,\n region: NavigationRegionKind,\n mode: NavigationRegionMode,\n options: { copy?: boolean } = {},\n): NavigationEditPlan {\n if (module === undefined) return { edits: [], rejected: noMode };\n\n const current = modeOfModuleRegion(navigation, module, region);\n if (current === mode) return { edits: [] };\n\n const setMode: NavigationEdit = { kind: NavigationEditKind.SetRegionMode, module, region, mode };\n if (mode === NavigationRegionMode.Inherit) {\n return { edits: [{ kind: NavigationEditKind.SetRegionItems, module, region, items: [] }, setMode] };\n }\n\n if (mode === NavigationRegionMode.Override && current === NavigationRegionMode.Inherit && options.copy === true) {\n return { edits: [{ kind: NavigationEditKind.SetRegionItems, module, region, items: structuredClone(applicationItems(navigation.application, region)) }, setMode] };\n }\n\n return { edits: [setMode] };\n}\n\n/**\n * Plans adding an item to a region, after the ones already there. Adding to an inheriting module region first\n * switches it to `extend` (NAV6), so the application's items stay and the new item follows them.\n * @param navigation The navigation as it is.\n * @param module The module that gets the item; undefined for the application.\n * @param region The region.\n * @param item The item to add.\n * @param parent The id of the item it becomes a sub-item of; sidebar only.\n */\nexport function addNavItem(\n navigation: NavigationModel,\n module: string | undefined,\n region: NavigationRegionKind,\n item: NavItem,\n parent?: string,\n): NavigationEditPlan {\n if (parent !== undefined && region !== NavigationRegionKind.Sidebar) return { edits: [], rejected: flatTopbar };\n\n const own = ownItems(navigation, module, region);\n const ids = collectItemIds(own, region);\n if (ids.includes(item.id)) return { edits: [], rejected: `Navigation item id '${item.id}' is already used in this region.` };\n if (parent !== undefined && !ids.includes(parent)) return { edits: [], rejected: `There is no item '${parent}' to add a sub-item to.` };\n\n const add: NavigationEdit = { kind: NavigationEditKind.AddItem, module, region, item: structuredClone(item) };\n if (parent !== undefined) add.parent = parent;\n if (module !== undefined && modeOfModuleRegion(navigation, module, region) === NavigationRegionMode.Inherit) {\n return { edits: [{ kind: NavigationEditKind.SetRegionMode, module, region, mode: NavigationRegionMode.Extend }, add] };\n }\n\n return { edits: [add] };\n}\n\n/**\n * Plans setting the logo. The logo is defined at the application level only, so a module is refused.\n * @param navigation The navigation as it is.\n * @param module The module asking; only undefined (the application) is allowed.\n * @param logo The logo.\n */\nexport function setApplicationLogo(navigation: NavigationModel, module: string | undefined, logo: ApplicationLogo): NavigationEditPlan {\n void navigation;\n return module === undefined ? { edits: [{ kind: NavigationEditKind.SetLogo, logo: { ...logo } }] } : { edits: [], rejected: logoLevel };\n}\n\n/**\n * Applies navigation edits to a copy of the model. Either every edit applies, or none does.\n * @param navigation The navigation as it is; never changed.\n * @param edits The edits, in order.\n */\nexport function applyNavigationEdits(navigation: NavigationModel, edits: NavigationEdit[]): NavigationEditOutcome {\n const model = structuredClone(navigation);\n for (const edit of edits) {\n const rejected = apply(model, edit);\n if (rejected !== undefined) return { applied: false, model: navigation, rejected };\n }\n\n return { applied: true, model };\n}\n\nfunction ownItems(navigation: NavigationModel, module: string | undefined, region: NavigationRegionKind): NavItem[] {\n return module === undefined\n ? applicationItems(navigation.application, region)\n : findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.items ?? [];\n}\n\nfunction regionOf(model: NavigationModel, module: string | undefined, region: NavigationRegionKind): NavigationRegion {\n let regions: NavigationRegion[];\n if (module === undefined) {\n regions = model.application.regions;\n } else {\n let block = findModuleNavigation(model, module);\n if (!block) {\n block = { module, regions: [] };\n model.modules.push(block);\n }\n\n regions = block.regions;\n }\n\n let found = findNavigationRegion(regions, region);\n if (!found) {\n found = { region, items: [] };\n regions.push(found);\n }\n\n return found;\n}\n\nfunction apply(model: NavigationModel, edit: NavigationEdit): string | undefined {\n switch (edit.kind) {\n case NavigationEditKind.SetRegionMode:\n if (edit.module === undefined) return noMode;\n regionOf(model, edit.module, edit.region!).mode = edit.mode;\n return undefined;\n case NavigationEditKind.SetRegionItems:\n regionOf(model, edit.module, edit.region!).items = structuredClone(edit.items ?? []);\n return undefined;\n case NavigationEditKind.AddItem: {\n const target = regionOf(model, edit.module, edit.region!);\n const item = structuredClone(edit.item!);\n if (collectItemIds(target.items, target.region).includes(item.id)) return `Navigation item id '${item.id}' is already used in this region.`;\n if (edit.parent === undefined) {\n target.items.push(item);\n return undefined;\n }\n\n if (target.region !== NavigationRegionKind.Sidebar) return flatTopbar;\n const owner = findItem(target.items, edit.parent);\n if (!owner) return `There is no item '${edit.parent}' to add a sub-item to.`;\n (owner.children ??= []).push(item);\n return undefined;\n }\n case NavigationEditKind.SetLogo:\n if (edit.module !== undefined) return logoLevel;\n model.application.logo = { ...edit.logo! };\n return undefined;\n default:\n return `'${String((edit as NavigationEdit).kind)}' is not a navigation edit.`;\n }\n}\n\nfunction findItem(items: NavItem[], id: string): NavItem | undefined {\n for (const item of items) {\n if (item.id === id) return item;\n const nested = findItem(item.children ?? [], id);\n if (nested) return nested;\n }\n\n return undefined;\n}\n"],"names":["noMode","logoLevel","flatTopbar","switchRegionMode","navigation","module","region","mode","options","undefined","edits","rejected","current","modeOfModuleRegion","setMode","kind","NavigationEditKind","SetRegionMode","NavigationRegionMode","Inherit","SetRegionItems","items","Override","copy","structuredClone","applicationItems","application","addNavItem","item","parent","NavigationRegionKind","Sidebar","own","ownItems","ids","collectItemIds","includes","id","add","AddItem","Extend","setApplicationLogo","logo","SetLogo","applyNavigationEdits","model","edit","apply","applied","findNavigationRegion","findModuleNavigation","regions","regionOf","block","modules","push","found","target","owner","findItem","children","String","nested"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ApplicationNavigation, ModuleNavigation, NavigationModel, NavigationRegion, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';
2
+ export declare const navigationRegionOrder: NavigationRegionKind[];
3
+ export declare const primarySlot = "content";
4
+ export declare function findNavigationRegion(regions: NavigationRegion[] | undefined, region: NavigationRegionKind): NavigationRegion | undefined;
5
+ export declare function findModuleNavigation(navigation: NavigationModel, module: string): ModuleNavigation | undefined;
6
+ export declare function modeOfModuleRegion(navigation: NavigationModel, module: string, region: NavigationRegionKind): NavigationRegionMode;
7
+ export declare function applicationItems(application: ApplicationNavigation, region: NavigationRegionKind): NavItem[];
8
+ export declare function collectItemIds(items: NavItem[], region: NavigationRegionKind): string[];
9
+ //# sourceMappingURL=navigationRegions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationRegions.d.ts","sourceRoot":"","sources":["../../../navigation/navigationRegions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGtK,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,EAAgE,CAAC;AAGzH,eAAO,MAAM,WAAW,YAAY,CAAC;AAOrC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,GAAG,SAAS,CAExI;AAGD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9G;AAGD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,oBAAoB,CAElI;AAGD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,qBAAqB,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,EAAE,CAE5G;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAEvF"}
@@ -0,0 +1,34 @@
1
+ import { NavigationRegionKind, NavigationRegionMode } 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
+ /** The regions in the order every result lists them. */ const navigationRegionOrder = [
6
+ NavigationRegionKind.Topbar,
7
+ NavigationRegionKind.Sidebar
8
+ ];
9
+ /** The slot an item renders into when it names none: the primary outlet. */ const primarySlot = 'content';
10
+ /**
11
+ * Finds the items a level defines for a region.
12
+ * @param regions The regions of the application or of a module.
13
+ * @param region The region to look for.
14
+ */ function findNavigationRegion(regions, region) {
15
+ return regions?.find((candidate)=>candidate.region === region);
16
+ }
17
+ /** Finds what a module declares; undefined when it declares nothing. */ function findModuleNavigation(navigation, module) {
18
+ return navigation.modules.find((candidate)=>candidate.module === module);
19
+ }
20
+ /** The mode of a module's region: `inherit` when the module does not declare the region or its mode. */ function modeOfModuleRegion(navigation, module, region) {
21
+ return findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.mode ?? NavigationRegionMode.Inherit;
22
+ }
23
+ /** The application-level items of a region. */ function applicationItems(application, region) {
24
+ return findNavigationRegion(application.regions, region)?.items ?? [];
25
+ }
26
+ /** Every id in a list of items, depth first. Sub-items count only in the sidebar. */ function collectItemIds(items, region) {
27
+ return items.flatMap((item)=>[
28
+ item.id,
29
+ ...region === NavigationRegionKind.Sidebar ? collectItemIds(item.children ?? [], region) : []
30
+ ]);
31
+ }
32
+
33
+ export { applicationItems, collectItemIds, findModuleNavigation, findNavigationRegion, modeOfModuleRegion, navigationRegionOrder, primarySlot };
34
+ //# sourceMappingURL=navigationRegions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationRegions.js","sources":["../../../navigation/navigationRegions.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ApplicationNavigation, ModuleNavigation, NavigationModel, NavigationRegion, NavigationRegionKind, NavigationRegionMode, NavItem } from '@cratis/scene.model';\n\n/** The regions in the order every result lists them. */\nexport const navigationRegionOrder: NavigationRegionKind[] = [NavigationRegionKind.Topbar, NavigationRegionKind.Sidebar];\n\n/** The slot an item renders into when it names none: the primary outlet. */\nexport const primarySlot = 'content';\n\n/**\n * Finds the items a level defines for a region.\n * @param regions The regions of the application or of a module.\n * @param region The region to look for.\n */\nexport function findNavigationRegion(regions: NavigationRegion[] | undefined, region: NavigationRegionKind): NavigationRegion | undefined {\n return regions?.find(candidate => candidate.region === region);\n}\n\n/** Finds what a module declares; undefined when it declares nothing. */\nexport function findModuleNavigation(navigation: NavigationModel, module: string): ModuleNavigation | undefined {\n return navigation.modules.find(candidate => candidate.module === module);\n}\n\n/** The mode of a module's region: `inherit` when the module does not declare the region or its mode. */\nexport function modeOfModuleRegion(navigation: NavigationModel, module: string, region: NavigationRegionKind): NavigationRegionMode {\n return findNavigationRegion(findModuleNavigation(navigation, module)?.regions, region)?.mode ?? NavigationRegionMode.Inherit;\n}\n\n/** The application-level items of a region. */\nexport function applicationItems(application: ApplicationNavigation, region: NavigationRegionKind): NavItem[] {\n return findNavigationRegion(application.regions, region)?.items ?? [];\n}\n\n/** Every id in a list of items, depth first. Sub-items count only in the sidebar. */\nexport function collectItemIds(items: NavItem[], region: NavigationRegionKind): string[] {\n return items.flatMap(item => [item.id, ...(region === NavigationRegionKind.Sidebar ? collectItemIds(item.children ?? [], region) : [])]);\n}\n"],"names":["navigationRegionOrder","NavigationRegionKind","Topbar","Sidebar","primarySlot","findNavigationRegion","regions","region","find","candidate","findModuleNavigation","navigation","module","modules","modeOfModuleRegion","mode","NavigationRegionMode","Inherit","applicationItems","application","items","collectItemIds","flatMap","item","id","children"],"mappings":";;AAAA;AACA;AAIA,yDACO,MAAMA,qBAAAA,GAAgD;AAACC,IAAAA,oBAAAA,CAAqBC,MAAM;AAAED,IAAAA,oBAAAA,CAAqBE;;AAEhH,6EACO,MAAMC,WAAAA,GAAc;AAE3B;;;;AAIC,IACM,SAASC,oBAAAA,CAAqBC,OAAuC,EAAEC,MAA4B,EAAA;AACtG,IAAA,OAAOD,SAASE,IAAAA,CAAKC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUF,MAAM,KAAKA,MAAAA,CAAAA;AAC3D;AAEA,yEACO,SAASG,oBAAAA,CAAqBC,UAA2B,EAAEC,MAAc,EAAA;IAC5E,OAAOD,UAAAA,CAAWE,OAAO,CAACL,IAAI,CAACC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUG,MAAM,KAAKA,MAAAA,CAAAA;AACrE;AAEA,yGACO,SAASE,kBAAAA,CAAmBH,UAA2B,EAAEC,MAAc,EAAEL,MAA4B,EAAA;IACxG,OAAOF,oBAAAA,CAAqBK,qBAAqBC,UAAAA,EAAYC,MAAAA,CAAAA,EAASN,SAASC,MAAAA,CAAAA,EAASQ,IAAAA,IAAQC,qBAAqBC,OAAO;AAChI;AAEA,gDACO,SAASC,gBAAAA,CAAiBC,WAAkC,EAAEZ,MAA4B,EAAA;AAC7F,IAAA,OAAOF,qBAAqBc,WAAAA,CAAYb,OAAO,EAAEC,MAAAA,CAAAA,EAASa,SAAS,EAAE;AACzE;AAEA,sFACO,SAASC,cAAAA,CAAeD,KAAgB,EAAEb,MAA4B,EAAA;AACzE,IAAA,OAAOa,KAAAA,CAAME,OAAO,CAACC,CAAAA,IAAAA,GAAQ;AAACA,YAAAA,IAAAA,CAAKC,EAAE;eAAMjB,MAAAA,KAAWN,oBAAAA,CAAqBE,OAAO,GAAGkB,cAAAA,CAAeE,IAAAA,CAAKE,QAAQ,IAAI,EAAE,EAAElB,MAAAA,CAAAA,GAAU;AAAI,SAAA,CAAA;AAC3I;;"}
@@ -0,0 +1,6 @@
1
+ import { SampleDataPack, ScenePackage } from '@cratis/scene.model';
2
+ export interface SampleDataPackSource {
3
+ manifest: ScenePackage;
4
+ packs?: SampleDataPack[];
5
+ }
6
+ //# sourceMappingURL=SampleDataPackSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleDataPackSource.d.ts","sourceRoot":"","sources":["../../../sampleData/SampleDataPackSource.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnE,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SampleDataPackSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleDataPackSource.js","sourceRoot":"","sources":["../../../sampleData/SampleDataPackSource.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { SampleDataPack, SampleShape, UiProfile } from '@cratis/scene.model';
2
+ export type SampleDataResolutionSource = 'binding' | 'activePack' | 'blueprintDefault' | 'generated' | 'disabled' | 'none';
3
+ export interface SampleDataRequest {
4
+ target?: string;
5
+ shape?: SampleShape;
6
+ }
7
+ export interface SampleDataContext {
8
+ packs: SampleDataPack[];
9
+ profile?: Pick<UiProfile, 'sampleData'>;
10
+ sessionActivePack?: string;
11
+ blueprintDefaultPack?: string;
12
+ locale?: string;
13
+ seed?: number;
14
+ rowCount?: number;
15
+ isDesignOrPreview?: boolean;
16
+ }
17
+ export interface SampleDataDiagnostic {
18
+ code: string;
19
+ message: string;
20
+ }
21
+ export interface SampleDataResolution {
22
+ source: SampleDataResolutionSource;
23
+ pack?: string;
24
+ locale: string;
25
+ shape?: string;
26
+ rows: Record<string, unknown>[];
27
+ diagnostics: SampleDataDiagnostic[];
28
+ }
29
+ //# sourceMappingURL=SampleDataResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleDataResolution.d.ts","sourceRoot":"","sources":["../../../sampleData/SampleDataResolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG7E,MAAM,MAAM,0BAA0B,GAEhC,SAAS,GAET,YAAY,GAEZ,kBAAkB,GAElB,WAAW,GAEX,UAAU,GAEV,MAAM,CAAC;AAGb,MAAM,WAAW,iBAAiB;IAE9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,WAAW,CAAC;CACvB;AAGD,MAAM,WAAW,iBAAiB;IAE9B,KAAK,EAAE,cAAc,EAAE,CAAC;IAOxB,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAQxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAG9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAGD,MAAM,WAAW,oBAAoB;IAEjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IAEjC,MAAM,EAAE,0BAA0B,CAAC;IAGnC,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAEhC,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SampleDataResolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleDataResolution.js","sourceRoot":"","sources":["../../../sampleData/SampleDataResolution.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ export declare function hash32(value: number): number;
2
+ export declare function fnv1a32(text: string): number;
3
+ export declare function rowSeed(seed: number, shapeName: string, rowIndex: number): number;
4
+ export declare class SampleRandom {
5
+ private s0;
6
+ private s1;
7
+ private s2;
8
+ private s3;
9
+ constructor(seed: number);
10
+ next(): number;
11
+ nextInt(bound: number): number;
12
+ pick<T>(items: readonly T[]): T;
13
+ }
14
+ //# sourceMappingURL=SampleRandom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleRandom.d.ts","sourceRoot":"","sources":["../../../sampleData/SampleRandom.ts"],"names":[],"mappings":"AAiBA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5C;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjF;AAGD,qBAAa,YAAY;IACrB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IAEnB,YAAY,IAAI,EAAE,MAAM,EAWvB;IAGD,IAAI,IAAI,MAAM,CAUb;IAGD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7B;IAGD,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAE9B;CACJ"}
@@ -0,0 +1,72 @@
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 pseudo-random generator behind generated sample data. The C# engine implements the identical
5
+ * algorithm, and both are asserted against golden rows in `sample-data-resolution-fixtures.json`.
6
+ *
7
+ * Algorithm (all arithmetic on unsigned 32-bit integers, wrapping):
8
+ *
9
+ * - `hash32(x)`: `x = (x ^ (x >>> 16)) * 0x85EBCA6B; x = (x ^ (x >>> 13)) * 0xC2B2AE35; return x ^ (x >>> 16)`.
10
+ * - `splitmix32(state)`: `state += 0x9E3779B9`, then `hash32(state)`.
11
+ * - `fnv1a32(text)`: FNV-1a over the UTF-8 bytes of the text (offset basis `0x811C9DC5`, prime `0x01000193`).
12
+ * - The generator is xoshiro128** seeded with four consecutive `splitmix32` outputs of the seed.
13
+ * - `nextInt(bound)` is `next() % bound`.
14
+ * - Row `i` of a shape named `S` generated with seed `n` uses its own generator seeded with
15
+ * `hash32((n ^ fnv1a32(S)) + (i + 1) * 0x9E3779B9)`, so a row never depends on how many rows are asked for.
16
+ */ function hash32(value) {
17
+ let x = value >>> 0;
18
+ x = Math.imul(x ^ x >>> 16, 0x85EBCA6B) >>> 0;
19
+ x = Math.imul(x ^ x >>> 13, 0xC2B2AE35) >>> 0;
20
+ return (x ^ x >>> 16) >>> 0;
21
+ }
22
+ /** FNV-1a (32-bit) over the UTF-8 bytes of a string. */ function fnv1a32(text) {
23
+ let hash = 0x811C9DC5;
24
+ for (const byte of new TextEncoder().encode(text)){
25
+ hash = Math.imul(hash ^ byte, 0x01000193) >>> 0;
26
+ }
27
+ return hash;
28
+ }
29
+ /** The seed of the generator for one row of one shape. */ function rowSeed(seed, shapeName, rowIndex) {
30
+ return hash32(((seed ^ fnv1a32(shapeName)) >>> 0) + Math.imul(rowIndex + 1, 0x9E3779B9) >>> 0);
31
+ }
32
+ /** xoshiro128** with splitmix32 seeding. */ class SampleRandom {
33
+ s0;
34
+ s1;
35
+ s2;
36
+ s3;
37
+ constructor(seed){
38
+ let state = seed >>> 0;
39
+ const step = ()=>{
40
+ state = state + 0x9E3779B9 >>> 0;
41
+ return hash32(state);
42
+ };
43
+ this.s0 = step();
44
+ this.s1 = step();
45
+ this.s2 = step();
46
+ this.s3 = step();
47
+ if ((this.s0 | this.s1 | this.s2 | this.s3) === 0) this.s0 = 1;
48
+ }
49
+ /** The next unsigned 32-bit value. */ next() {
50
+ const result = Math.imul(rotateLeft(Math.imul(this.s1, 5) >>> 0, 7), 9) >>> 0;
51
+ const t = this.s1 << 9 >>> 0;
52
+ this.s2 = (this.s2 ^ this.s0) >>> 0;
53
+ this.s3 = (this.s3 ^ this.s1) >>> 0;
54
+ this.s1 = (this.s1 ^ this.s2) >>> 0;
55
+ this.s0 = (this.s0 ^ this.s3) >>> 0;
56
+ this.s2 = (this.s2 ^ t) >>> 0;
57
+ this.s3 = rotateLeft(this.s3, 11);
58
+ return result;
59
+ }
60
+ /** A value in `[0, bound)`; zero when the bound is zero. */ nextInt(bound) {
61
+ return bound <= 0 ? 0 : this.next() % bound;
62
+ }
63
+ /** One element of a non-empty list. */ pick(items) {
64
+ return items[this.nextInt(items.length)];
65
+ }
66
+ }
67
+ function rotateLeft(value, bits) {
68
+ return (value << bits | value >>> 32 - bits) >>> 0;
69
+ }
70
+
71
+ export { SampleRandom, fnv1a32, hash32, rowSeed };
72
+ //# sourceMappingURL=SampleRandom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleRandom.js","sources":["../../../sampleData/SampleRandom.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\n/**\n * The pseudo-random generator behind generated sample data. The C# engine implements the identical\n * algorithm, and both are asserted against golden rows in `sample-data-resolution-fixtures.json`.\n *\n * Algorithm (all arithmetic on unsigned 32-bit integers, wrapping):\n *\n * - `hash32(x)`: `x = (x ^ (x >>> 16)) * 0x85EBCA6B; x = (x ^ (x >>> 13)) * 0xC2B2AE35; return x ^ (x >>> 16)`.\n * - `splitmix32(state)`: `state += 0x9E3779B9`, then `hash32(state)`.\n * - `fnv1a32(text)`: FNV-1a over the UTF-8 bytes of the text (offset basis `0x811C9DC5`, prime `0x01000193`).\n * - The generator is xoshiro128** seeded with four consecutive `splitmix32` outputs of the seed.\n * - `nextInt(bound)` is `next() % bound`.\n * - Row `i` of a shape named `S` generated with seed `n` uses its own generator seeded with\n * `hash32((n ^ fnv1a32(S)) + (i + 1) * 0x9E3779B9)`, so a row never depends on how many rows are asked for.\n */\nexport function hash32(value: number): number {\n let x = value >>> 0;\n x = Math.imul(x ^ (x >>> 16), 0x85EBCA6B) >>> 0;\n x = Math.imul(x ^ (x >>> 13), 0xC2B2AE35) >>> 0;\n return (x ^ (x >>> 16)) >>> 0;\n}\n\n/** FNV-1a (32-bit) over the UTF-8 bytes of a string. */\nexport function fnv1a32(text: string): number {\n let hash = 0x811C9DC5;\n for (const byte of new TextEncoder().encode(text)) {\n hash = Math.imul(hash ^ byte, 0x01000193) >>> 0;\n }\n return hash;\n}\n\n/** The seed of the generator for one row of one shape. */\nexport function rowSeed(seed: number, shapeName: string, rowIndex: number): number {\n return hash32((((seed ^ fnv1a32(shapeName)) >>> 0) + Math.imul(rowIndex + 1, 0x9E3779B9)) >>> 0);\n}\n\n/** xoshiro128** with splitmix32 seeding. */\nexport class SampleRandom {\n private s0: number;\n private s1: number;\n private s2: number;\n private s3: number;\n\n constructor(seed: number) {\n let state = seed >>> 0;\n const step = () => {\n state = (state + 0x9E3779B9) >>> 0;\n return hash32(state);\n };\n this.s0 = step();\n this.s1 = step();\n this.s2 = step();\n this.s3 = step();\n if ((this.s0 | this.s1 | this.s2 | this.s3) === 0) this.s0 = 1;\n }\n\n /** The next unsigned 32-bit value. */\n next(): number {\n const result = Math.imul(rotateLeft(Math.imul(this.s1, 5) >>> 0, 7), 9) >>> 0;\n const t = (this.s1 << 9) >>> 0;\n this.s2 = (this.s2 ^ this.s0) >>> 0;\n this.s3 = (this.s3 ^ this.s1) >>> 0;\n this.s1 = (this.s1 ^ this.s2) >>> 0;\n this.s0 = (this.s0 ^ this.s3) >>> 0;\n this.s2 = (this.s2 ^ t) >>> 0;\n this.s3 = rotateLeft(this.s3, 11);\n return result;\n }\n\n /** A value in `[0, bound)`; zero when the bound is zero. */\n nextInt(bound: number): number {\n return bound <= 0 ? 0 : this.next() % bound;\n }\n\n /** One element of a non-empty list. */\n pick<T>(items: readonly T[]): T {\n return items[this.nextInt(items.length)];\n }\n}\n\nfunction rotateLeft(value: number, bits: number): number {\n return ((value << bits) | (value >>> (32 - bits))) >>> 0;\n}\n"],"names":["hash32","value","x","Math","imul","fnv1a32","text","hash","byte","TextEncoder","encode","rowSeed","seed","shapeName","rowIndex","SampleRandom","s0","s1","s2","s3","state","step","next","result","rotateLeft","t","nextInt","bound","pick","items","length","bits"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { SampleDataPackReference } from '@cratis/scene.model';
2
+ import { SampleDataPackSource } from './SampleDataPackSource';
3
+ export declare const sampleDataLabelSeparator = " \u00B7 ";
4
+ export interface SampleDataCatalogEntry {
5
+ id: string;
6
+ isGenerated: boolean;
7
+ name: string;
8
+ label: string;
9
+ locale?: string;
10
+ selected: boolean;
11
+ }
12
+ export interface SampleDataCatalogGroup {
13
+ blueprint: string;
14
+ packs: SampleDataCatalogEntry[];
15
+ }
16
+ export interface SampleDataCatalog {
17
+ generated: SampleDataCatalogEntry;
18
+ own: SampleDataCatalogEntry[];
19
+ blueprints: SampleDataCatalogGroup[];
20
+ problems: string[];
21
+ }
22
+ export declare const generatedSampleDataName = "Generic (typed by field kind)";
23
+ export declare function describeSampleDataCatalog(sources: readonly SampleDataPackSource[], ownPacks?: readonly Pick<SampleDataPackReference, 'id' | 'title' | 'locale'>[], activePack?: string): SampleDataCatalog;
24
+ //# sourceMappingURL=describeSampleDataCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describeSampleDataCatalog.d.ts","sourceRoot":"","sources":["../../../sampleData/describeSampleDataCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAgB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI9D,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IAEnC,EAAE,EAAE,MAAM,CAAC;IAGX,WAAW,EAAE,OAAO,CAAC;IAGrB,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAGD,MAAM,WAAW,sBAAsB;IAEnC,SAAS,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE,sBAAsB,EAAE,CAAC;CACnC;AAGD,MAAM,WAAW,iBAAiB;IAE9B,SAAS,EAAE,sBAAsB,CAAC;IAGlC,GAAG,EAAE,sBAAsB,EAAE,CAAC;IAG9B,UAAU,EAAE,sBAAsB,EAAE,CAAC;IAGrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAGD,eAAO,MAAM,uBAAuB,kCAAkC,CAAC;AAYvE,wBAAgB,yBAAyB,CACrC,OAAO,EAAE,SAAS,oBAAoB,EAAE,EACxC,QAAQ,GAAE,SAAS,IAAI,CAAC,uBAAuB,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC,EAAO,EAClF,UAAU,CAAC,EAAE,MAAM,GACpB,iBAAiB,CAgCnB"}
@@ -0,0 +1,57 @@
1
+ import { validateSampleDataPackages } from './validateSampleDataPackages.js';
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
+ /** The separator between blueprint and pack in a label (`CRM · Nordic SMB`). */ const sampleDataLabelSeparator = ' \u00b7 ';
6
+ /** The name of the generated entry. */ const generatedSampleDataName = 'Generic (typed by field kind)';
7
+ /**
8
+ * Describes the sample data selector's content: the generated entry first, then the author's own packs, then
9
+ * each blueprint's packs grouped by the blueprint's display name (falling back to its package name). A pack
10
+ * whose title already starts with `<Blueprint> · ` shows the rest as its name, so `CRM · Nordic SMB` under
11
+ * `CRM` is `Nordic SMB`. Same own-first, then Blueprints menu pattern as the template picker (spec §11).
12
+ *
13
+ * @param sources The packages and the packs they ship (only their `sampleData` references are listed).
14
+ * @param ownPacks The author's own packs (id, title, locale).
15
+ * @param activePack The selection's active pack id, if any.
16
+ */ function describeSampleDataCatalog(sources, ownPacks = [], activePack) {
17
+ const entry = (id, name, label, locale)=>({
18
+ id,
19
+ isGenerated: false,
20
+ name,
21
+ label,
22
+ locale,
23
+ selected: id === activePack
24
+ });
25
+ const blueprints = [];
26
+ for (const source of sources){
27
+ const references = source.manifest.sampleData ?? [];
28
+ if (references.length === 0) continue;
29
+ const group = groupName(source.manifest);
30
+ const prefix = `${group}${sampleDataLabelSeparator}`;
31
+ blueprints.push({
32
+ blueprint: group,
33
+ packs: references.map((reference)=>{
34
+ const name = reference.title.startsWith(prefix) ? reference.title.slice(prefix.length) : reference.title;
35
+ return entry(reference.id, name, `${group}${sampleDataLabelSeparator}${name}`, reference.locale);
36
+ })
37
+ });
38
+ }
39
+ return {
40
+ generated: {
41
+ id: '',
42
+ isGenerated: true,
43
+ name: generatedSampleDataName,
44
+ label: generatedSampleDataName,
45
+ selected: activePack === undefined || activePack === null || activePack === ''
46
+ },
47
+ own: ownPacks.map((pack)=>entry(pack.id, pack.title, pack.title, pack.locale)),
48
+ blueprints,
49
+ problems: validateSampleDataPackages(sources)
50
+ };
51
+ }
52
+ function groupName(manifest) {
53
+ return manifest.displayName !== undefined && manifest.displayName.trim() !== '' ? manifest.displayName : manifest.name;
54
+ }
55
+
56
+ export { describeSampleDataCatalog, generatedSampleDataName, sampleDataLabelSeparator };
57
+ //# sourceMappingURL=describeSampleDataCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describeSampleDataCatalog.js","sources":["../../../sampleData/describeSampleDataCatalog.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 { SampleDataPackReference, ScenePackage } from '@cratis/scene.model';\nimport { SampleDataPackSource } from './SampleDataPackSource';\nimport { validateSampleDataPackages } from './validateSampleDataPackages';\n\n/** The separator between blueprint and pack in a label (`CRM · Nordic SMB`). */\nexport const sampleDataLabelSeparator = ' \\u00b7 ';\n\n/** One entry of the sample data selector. */\nexport interface SampleDataCatalogEntry {\n /** The pack identity a selection stores as `activePack`; empty for the generated entry. */\n id: string;\n\n /** Whether this is the generated entry, the choice that stores no active pack. */\n isGenerated: boolean;\n\n /** The pack's name within its group (`Nordic SMB`). */\n name: string;\n\n /** The full label (`CRM · Nordic SMB`, or just the name for generated and own packs). */\n label: string;\n\n /** The locale tag, absent for the generated entry. */\n locale?: string;\n\n /** Whether it is the active pack (the generated entry is selected when no pack is active). */\n selected: boolean;\n}\n\n/** A blueprint's packs, one group of the Blueprints submenu. */\nexport interface SampleDataCatalogGroup {\n /** The blueprint's display name (`CRM`). */\n blueprint: string;\n\n packs: SampleDataCatalogEntry[];\n}\n\n/** The selector's content: generated, the author's own sets, then blueprint groups. */\nexport interface SampleDataCatalog {\n /** `Generic (typed by field kind)`. */\n generated: SampleDataCatalogEntry;\n\n /** The author's own data sets, in the order given. */\n own: SampleDataCatalogEntry[];\n\n /** Blueprints that ship at least one pack, in package order; blueprints with none are not listed. */\n blueprints: SampleDataCatalogGroup[];\n\n /** Problems found validating what the packages ship. */\n problems: string[];\n}\n\n/** The name of the generated entry. */\nexport const generatedSampleDataName = 'Generic (typed by field kind)';\n\n/**\n * Describes the sample data selector's content: the generated entry first, then the author's own packs, then\n * each blueprint's packs grouped by the blueprint's display name (falling back to its package name). A pack\n * whose title already starts with `<Blueprint> · ` shows the rest as its name, so `CRM · Nordic SMB` under\n * `CRM` is `Nordic SMB`. Same own-first, then Blueprints menu pattern as the template picker (spec §11).\n *\n * @param sources The packages and the packs they ship (only their `sampleData` references are listed).\n * @param ownPacks The author's own packs (id, title, locale).\n * @param activePack The selection's active pack id, if any.\n */\nexport function describeSampleDataCatalog(\n sources: readonly SampleDataPackSource[],\n ownPacks: readonly Pick<SampleDataPackReference, 'id' | 'title' | 'locale'>[] = [],\n activePack?: string,\n): SampleDataCatalog {\n const entry = (id: string, name: string, label: string, locale: string): SampleDataCatalogEntry => ({\n id, isGenerated: false, name, label, locale, selected: id === activePack,\n });\n\n const blueprints: SampleDataCatalogGroup[] = [];\n for (const source of sources) {\n const references = source.manifest.sampleData ?? [];\n if (references.length === 0) continue;\n const group = groupName(source.manifest);\n const prefix = `${group}${sampleDataLabelSeparator}`;\n blueprints.push({\n blueprint: group,\n packs: references.map(reference => {\n const name = reference.title.startsWith(prefix) ? reference.title.slice(prefix.length) : reference.title;\n return entry(reference.id, name, `${group}${sampleDataLabelSeparator}${name}`, reference.locale);\n }),\n });\n }\n\n return {\n generated: {\n id: '',\n isGenerated: true,\n name: generatedSampleDataName,\n label: generatedSampleDataName,\n selected: activePack === undefined || activePack === null || activePack === '',\n },\n own: ownPacks.map(pack => entry(pack.id, pack.title, pack.title, pack.locale)),\n blueprints,\n problems: validateSampleDataPackages(sources),\n };\n}\n\nfunction groupName(manifest: ScenePackage): string {\n return manifest.displayName !== undefined && manifest.displayName.trim() !== '' ? manifest.displayName : manifest.name;\n}\n"],"names":["sampleDataLabelSeparator","generatedSampleDataName","describeSampleDataCatalog","sources","ownPacks","activePack","entry","id","name","label","locale","isGenerated","selected","blueprints","source","references","manifest","sampleData","length","group","groupName","prefix","push","blueprint","packs","map","reference","title","startsWith","slice","generated","undefined","own","pack","problems","validateSampleDataPackages","displayName","trim"],"mappings":";;AAAA;AACA;AAMA,iFACO,MAAMA,wBAAAA,GAA2B;AA8CxC,wCACO,MAAMC,uBAAAA,GAA0B;AAEvC;;;;;;;;;IAUO,SAASC,yBAAAA,CACZC,OAAwC,EACxCC,QAAAA,GAAgF,EAAE,EAClFC,UAAmB,EAAA;AAEnB,IAAA,MAAMC,QAAQ,CAACC,EAAAA,EAAYC,IAAAA,EAAcC,KAAAA,EAAeC,UAA4C;AAChGH,YAAAA,EAAAA;YAAII,WAAAA,EAAa,KAAA;AAAOH,YAAAA,IAAAA;AAAMC,YAAAA,KAAAA;AAAOC,YAAAA,MAAAA;AAAQE,YAAAA,QAAAA,EAAUL,EAAAA,KAAOF;SAClE,CAAA;AAEA,IAAA,MAAMQ,aAAuC,EAAE;IAC/C,KAAK,MAAMC,UAAUX,OAAAA,CAAS;AAC1B,QAAA,MAAMY,aAAaD,MAAAA,CAAOE,QAAQ,CAACC,UAAU,IAAI,EAAE;QACnD,IAAIF,UAAAA,CAAWG,MAAM,KAAK,CAAA,EAAG;QAC7B,MAAMC,KAAAA,GAAQC,SAAAA,CAAUN,MAAAA,CAAOE,QAAQ,CAAA;QACvC,MAAMK,MAAAA,GAAS,CAAA,EAAGF,KAAAA,CAAAA,EAAQnB,wBAAAA,CAAAA,CAA0B;AACpDa,QAAAA,UAAAA,CAAWS,IAAI,CAAC;YACZC,SAAAA,EAAWJ,KAAAA;YACXK,KAAAA,EAAOT,UAAAA,CAAWU,GAAG,CAACC,CAAAA,SAAAA,GAAAA;AAClB,gBAAA,MAAMlB,OAAOkB,SAAAA,CAAUC,KAAK,CAACC,UAAU,CAACP,MAAAA,CAAAA,GAAUK,SAAAA,CAAUC,KAAK,CAACE,KAAK,CAACR,MAAAA,CAAOH,MAAM,CAAA,GAAIQ,UAAUC,KAAK;gBACxG,OAAOrB,KAAAA,CAAMoB,SAAAA,CAAUnB,EAAE,EAAEC,IAAAA,EAAM,CAAA,EAAGW,KAAAA,CAAAA,EAAQnB,wBAAAA,CAAAA,EAA2BQ,IAAAA,CAAAA,CAAM,EAAEkB,SAAAA,CAAUhB,MAAM,CAAA;AACnG,YAAA,CAAA;AACJ,SAAA,CAAA;AACJ,IAAA;IAEA,OAAO;QACHoB,SAAAA,EAAW;YACPvB,EAAAA,EAAI,EAAA;YACJI,WAAAA,EAAa,IAAA;YACbH,IAAAA,EAAMP,uBAAAA;YACNQ,KAAAA,EAAOR,uBAAAA;AACPW,YAAAA,QAAAA,EAAUP,UAAAA,KAAe0B,SAAAA,IAAa1B,UAAAA,KAAe,IAAA,IAAQA,UAAAA,KAAe;AAChF,SAAA;AACA2B,QAAAA,GAAAA,EAAK5B,SAASqB,GAAG,CAACQ,CAAAA,IAAAA,GAAQ3B,MAAM2B,IAAAA,CAAK1B,EAAE,EAAE0B,IAAAA,CAAKN,KAAK,EAAEM,IAAAA,CAAKN,KAAK,EAAEM,KAAKvB,MAAM,CAAA,CAAA;AAC5EG,QAAAA,UAAAA;AACAqB,QAAAA,QAAAA,EAAUC,0BAAAA,CAA2BhC,OAAAA;AACzC,KAAA;AACJ;AAEA,SAASiB,UAAUJ,QAAsB,EAAA;AACrC,IAAA,OAAOA,QAAAA,CAASoB,WAAW,KAAKL,SAAAA,IAAaf,SAASoB,WAAW,CAACC,IAAI,EAAA,KAAO,EAAA,GAAKrB,QAAAA,CAASoB,WAAW,GAAGpB,SAASR,IAAI;AAC1H;;"}
@@ -0,0 +1,3 @@
1
+ import { SampleDataMapping, SampleDataPack, SampleDataSet } from '@cratis/scene.model';
2
+ export declare function findSampleDataSet(pack: SampleDataPack, target: string, mappings?: readonly SampleDataMapping[]): SampleDataSet | undefined;
3
+ //# sourceMappingURL=findSampleDataSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSampleDataSet.d.ts","sourceRoot":"","sources":["../../../sampleData/findSampleDataSet.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMvF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,iBAAiB,EAAO,GAAG,aAAa,GAAG,SAAS,CAQ9I"}
@@ -0,0 +1,16 @@
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
+ * Finds the set of a pack that supplies rows for a read model or shape. An explicit mapping whose read model is
5
+ * the target wins; otherwise a set whose shape has the target's name (compared exactly, case-sensitively).
6
+ */ function findSampleDataSet(pack, target, mappings = []) {
7
+ for (const mapping of mappings){
8
+ if (mapping.readModel !== target) continue;
9
+ const mapped = (pack.sets ?? []).find((set)=>set.shape === mapping.shape);
10
+ if (mapped !== undefined) return mapped;
11
+ }
12
+ return (pack.sets ?? []).find((set)=>set.shape === target);
13
+ }
14
+
15
+ export { findSampleDataSet };
16
+ //# sourceMappingURL=findSampleDataSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSampleDataSet.js","sources":["../../../sampleData/findSampleDataSet.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 { SampleDataMapping, SampleDataPack, SampleDataSet } from '@cratis/scene.model';\n\n/**\n * Finds the set of a pack that supplies rows for a read model or shape. An explicit mapping whose read model is\n * the target wins; otherwise a set whose shape has the target's name (compared exactly, case-sensitively).\n */\nexport function findSampleDataSet(pack: SampleDataPack, target: string, mappings: readonly SampleDataMapping[] = []): SampleDataSet | undefined {\n for (const mapping of mappings) {\n if (mapping.readModel !== target) continue;\n const mapped = (pack.sets ?? []).find(set => set.shape === mapping.shape);\n if (mapped !== undefined) return mapped;\n }\n\n return (pack.sets ?? []).find(set => set.shape === target);\n}\n"],"names":["findSampleDataSet","pack","target","mappings","mapping","readModel","mapped","sets","find","set","shape","undefined"],"mappings":"AAAA;AACA;AAIA;;;IAIO,SAASA,iBAAAA,CAAkBC,IAAoB,EAAEC,MAAc,EAAEC,WAAyC,EAAE,EAAA;IAC/G,KAAK,MAAMC,WAAWD,QAAAA,CAAU;QAC5B,IAAIC,OAAAA,CAAQC,SAAS,KAAKH,MAAAA,EAAQ;AAClC,QAAA,MAAMI,SAAS,CAACL,IAAAA,CAAKM,IAAI,IAAI,EAAC,EAAGC,IAAI,CAACC,CAAAA,GAAAA,GAAOA,IAAIC,KAAK,KAAKN,QAAQM,KAAK,CAAA;QACxE,IAAIJ,MAAAA,KAAWK,WAAW,OAAOL,MAAAA;AACrC,IAAA;AAEA,IAAA,OAAO,CAACL,IAAAA,CAAKM,IAAI,IAAI,EAAC,EAAGC,IAAI,CAACC,CAAAA,GAAAA,GAAOA,GAAAA,CAAIC,KAAK,KAAKR,MAAAA,CAAAA;AACvD;;"}