@cratis/scene.engine 4.24.0 → 4.26.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 (170) hide show
  1. package/dist/cjs/index.js +52 -0
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/sampleData/SampleRandom.js +77 -0
  4. package/dist/cjs/sampleData/SampleRandom.js.map +1 -0
  5. package/dist/cjs/sampleData/describeSampleDataCatalog.js +61 -0
  6. package/dist/cjs/sampleData/describeSampleDataCatalog.js.map +1 -0
  7. package/dist/cjs/sampleData/findSampleDataSet.js +18 -0
  8. package/dist/cjs/sampleData/findSampleDataSet.js.map +1 -0
  9. package/dist/cjs/sampleData/findSampleRowLiterals.js +73 -0
  10. package/dist/cjs/sampleData/findSampleRowLiterals.js.map +1 -0
  11. package/dist/cjs/sampleData/generateSample.js +188 -0
  12. package/dist/cjs/sampleData/generateSample.js.map +1 -0
  13. package/dist/cjs/sampleData/inferSampleFieldKind.js +176 -0
  14. package/dist/cjs/sampleData/inferSampleFieldKind.js.map +1 -0
  15. package/dist/cjs/sampleData/resolveSampleData.js +107 -0
  16. package/dist/cjs/sampleData/resolveSampleData.js.map +1 -0
  17. package/dist/cjs/sampleData/sampleDataRules.js +26 -0
  18. package/dist/cjs/sampleData/sampleDataRules.js.map +1 -0
  19. package/dist/cjs/sampleData/sampleLocales.js +359 -0
  20. package/dist/cjs/sampleData/sampleLocales.js.map +1 -0
  21. package/dist/cjs/sampleData/validateSampleDataPack.js +44 -0
  22. package/dist/cjs/sampleData/validateSampleDataPack.js.map +1 -0
  23. package/dist/cjs/sampleData/validateSampleDataPackages.js +71 -0
  24. package/dist/cjs/sampleData/validateSampleDataPackages.js.map +1 -0
  25. package/dist/cjs/sampleData/validateSampleDataSelection.js +52 -0
  26. package/dist/cjs/sampleData/validateSampleDataSelection.js.map +1 -0
  27. package/dist/cjs/templateApplicability.js.map +1 -1
  28. package/dist/cjs/templates/TemplateReferenceResolution.js +15 -0
  29. package/dist/cjs/templates/TemplateReferenceResolution.js.map +1 -0
  30. package/dist/cjs/templates/applicableTemplates.js +199 -0
  31. package/dist/cjs/templates/applicableTemplates.js.map +1 -0
  32. package/dist/cjs/templates/describeTemplateCatalog.js +11 -6
  33. package/dist/cjs/templates/describeTemplateCatalog.js.map +1 -1
  34. package/dist/cjs/templates/resolveTemplateReference.js +89 -0
  35. package/dist/cjs/templates/resolveTemplateReference.js.map +1 -0
  36. package/dist/cjs/templates/validateTemplateMetadata.js +9 -0
  37. package/dist/cjs/templates/validateTemplateMetadata.js.map +1 -1
  38. package/dist/esm/index.d.ts +1 -0
  39. package/dist/esm/index.d.ts.map +1 -1
  40. package/dist/esm/index.js +16 -1
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/sampleData/SampleDataPackSource.d.ts +6 -0
  43. package/dist/esm/sampleData/SampleDataPackSource.d.ts.map +1 -0
  44. package/dist/esm/sampleData/SampleDataPackSource.js +2 -0
  45. package/dist/esm/sampleData/SampleDataPackSource.js.map +1 -0
  46. package/dist/esm/sampleData/SampleDataResolution.d.ts +29 -0
  47. package/dist/esm/sampleData/SampleDataResolution.d.ts.map +1 -0
  48. package/dist/esm/sampleData/SampleDataResolution.js +2 -0
  49. package/dist/esm/sampleData/SampleDataResolution.js.map +1 -0
  50. package/dist/esm/sampleData/SampleRandom.d.ts +14 -0
  51. package/dist/esm/sampleData/SampleRandom.d.ts.map +1 -0
  52. package/dist/esm/sampleData/SampleRandom.js +72 -0
  53. package/dist/esm/sampleData/SampleRandom.js.map +1 -0
  54. package/dist/esm/sampleData/describeSampleDataCatalog.d.ts +24 -0
  55. package/dist/esm/sampleData/describeSampleDataCatalog.d.ts.map +1 -0
  56. package/dist/esm/sampleData/describeSampleDataCatalog.js +57 -0
  57. package/dist/esm/sampleData/describeSampleDataCatalog.js.map +1 -0
  58. package/dist/esm/sampleData/findSampleDataSet.d.ts +3 -0
  59. package/dist/esm/sampleData/findSampleDataSet.d.ts.map +1 -0
  60. package/dist/esm/sampleData/findSampleDataSet.js +16 -0
  61. package/dist/esm/sampleData/findSampleDataSet.js.map +1 -0
  62. package/dist/esm/sampleData/findSampleRowLiterals.d.ts +11 -0
  63. package/dist/esm/sampleData/findSampleRowLiterals.d.ts.map +1 -0
  64. package/dist/esm/sampleData/findSampleRowLiterals.js +69 -0
  65. package/dist/esm/sampleData/findSampleRowLiterals.js.map +1 -0
  66. package/dist/esm/sampleData/generateSample.d.ts +6 -0
  67. package/dist/esm/sampleData/generateSample.d.ts.map +1 -0
  68. package/dist/esm/sampleData/generateSample.js +183 -0
  69. package/dist/esm/sampleData/generateSample.js.map +1 -0
  70. package/dist/esm/sampleData/index.d.ts +15 -0
  71. package/dist/esm/sampleData/index.d.ts.map +1 -0
  72. package/dist/esm/sampleData/index.js +15 -0
  73. package/dist/esm/sampleData/index.js.map +1 -0
  74. package/dist/esm/sampleData/inferSampleFieldKind.d.ts +3 -0
  75. package/dist/esm/sampleData/inferSampleFieldKind.d.ts.map +1 -0
  76. package/dist/esm/sampleData/inferSampleFieldKind.js +174 -0
  77. package/dist/esm/sampleData/inferSampleFieldKind.js.map +1 -0
  78. package/dist/esm/sampleData/resolveSampleData.d.ts +3 -0
  79. package/dist/esm/sampleData/resolveSampleData.d.ts.map +1 -0
  80. package/dist/esm/sampleData/resolveSampleData.js +105 -0
  81. package/dist/esm/sampleData/resolveSampleData.js.map +1 -0
  82. package/dist/esm/sampleData/sampleDataRules.d.ts +7 -0
  83. package/dist/esm/sampleData/sampleDataRules.d.ts.map +1 -0
  84. package/dist/esm/sampleData/sampleDataRules.js +19 -0
  85. package/dist/esm/sampleData/sampleDataRules.js.map +1 -0
  86. package/dist/esm/sampleData/sampleLocales.d.ts +13 -0
  87. package/dist/esm/sampleData/sampleLocales.d.ts.map +1 -0
  88. package/dist/esm/sampleData/sampleLocales.js +355 -0
  89. package/dist/esm/sampleData/sampleLocales.js.map +1 -0
  90. package/dist/esm/sampleData/validateSampleDataPack.d.ts +3 -0
  91. package/dist/esm/sampleData/validateSampleDataPack.d.ts.map +1 -0
  92. package/dist/esm/sampleData/validateSampleDataPack.js +42 -0
  93. package/dist/esm/sampleData/validateSampleDataPack.js.map +1 -0
  94. package/dist/esm/sampleData/validateSampleDataPackages.d.ts +3 -0
  95. package/dist/esm/sampleData/validateSampleDataPackages.d.ts.map +1 -0
  96. package/dist/esm/sampleData/validateSampleDataPackages.js +69 -0
  97. package/dist/esm/sampleData/validateSampleDataPackages.js.map +1 -0
  98. package/dist/esm/sampleData/validateSampleDataSelection.d.ts +3 -0
  99. package/dist/esm/sampleData/validateSampleDataSelection.d.ts.map +1 -0
  100. package/dist/esm/sampleData/validateSampleDataSelection.js +50 -0
  101. package/dist/esm/sampleData/validateSampleDataSelection.js.map +1 -0
  102. package/dist/esm/templateApplicability.d.ts +1 -2
  103. package/dist/esm/templateApplicability.d.ts.map +1 -1
  104. package/dist/esm/templateApplicability.js.map +1 -1
  105. package/dist/esm/templates/ApplicableTemplateSet.d.ts +27 -0
  106. package/dist/esm/templates/ApplicableTemplateSet.d.ts.map +1 -0
  107. package/dist/esm/templates/ApplicableTemplateSet.js +2 -0
  108. package/dist/esm/templates/ApplicableTemplateSet.js.map +1 -0
  109. package/dist/esm/templates/TemplateCatalogEntry.d.ts +3 -1
  110. package/dist/esm/templates/TemplateCatalogEntry.d.ts.map +1 -1
  111. package/dist/esm/templates/TemplateLibrary.d.ts +6 -0
  112. package/dist/esm/templates/TemplateLibrary.d.ts.map +1 -0
  113. package/dist/esm/templates/TemplateLibrary.js +2 -0
  114. package/dist/esm/templates/TemplateLibrary.js.map +1 -0
  115. package/dist/esm/templates/TemplateReferenceResolution.d.ts +16 -0
  116. package/dist/esm/templates/TemplateReferenceResolution.d.ts.map +1 -0
  117. package/dist/esm/templates/TemplateReferenceResolution.js +13 -0
  118. package/dist/esm/templates/TemplateReferenceResolution.js.map +1 -0
  119. package/dist/esm/templates/TemplateTarget.d.ts +9 -0
  120. package/dist/esm/templates/TemplateTarget.d.ts.map +1 -0
  121. package/dist/esm/templates/TemplateTarget.js +2 -0
  122. package/dist/esm/templates/TemplateTarget.js.map +1 -0
  123. package/dist/esm/templates/applicableTemplates.d.ts +9 -0
  124. package/dist/esm/templates/applicableTemplates.d.ts.map +1 -0
  125. package/dist/esm/templates/applicableTemplates.js +194 -0
  126. package/dist/esm/templates/applicableTemplates.js.map +1 -0
  127. package/dist/esm/templates/describeTemplateCatalog.d.ts.map +1 -1
  128. package/dist/esm/templates/describeTemplateCatalog.js +12 -7
  129. package/dist/esm/templates/describeTemplateCatalog.js.map +1 -1
  130. package/dist/esm/templates/index.d.ts +6 -0
  131. package/dist/esm/templates/index.d.ts.map +1 -1
  132. package/dist/esm/templates/index.js +6 -0
  133. package/dist/esm/templates/index.js.map +1 -1
  134. package/dist/esm/templates/resolveTemplateReference.d.ts +5 -0
  135. package/dist/esm/templates/resolveTemplateReference.d.ts.map +1 -0
  136. package/dist/esm/templates/resolveTemplateReference.js +87 -0
  137. package/dist/esm/templates/resolveTemplateReference.js.map +1 -0
  138. package/dist/esm/templates/validateTemplateMetadata.d.ts +2 -0
  139. package/dist/esm/templates/validateTemplateMetadata.d.ts.map +1 -1
  140. package/dist/esm/templates/validateTemplateMetadata.js +8 -1
  141. package/dist/esm/templates/validateTemplateMetadata.js.map +1 -1
  142. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  143. package/index.ts +1 -0
  144. package/package.json +3 -3
  145. package/sampleData/SampleDataPackSource.ts +13 -0
  146. package/sampleData/SampleDataResolution.ts +93 -0
  147. package/sampleData/SampleRandom.ts +85 -0
  148. package/sampleData/describeSampleDataCatalog.ts +108 -0
  149. package/sampleData/findSampleDataSet.ts +18 -0
  150. package/sampleData/findSampleRowLiterals.ts +86 -0
  151. package/sampleData/generateSample.ts +156 -0
  152. package/sampleData/index.ts +17 -0
  153. package/sampleData/inferSampleFieldKind.ts +64 -0
  154. package/sampleData/resolveSampleData.ts +96 -0
  155. package/sampleData/sampleDataRules.ts +30 -0
  156. package/sampleData/sampleLocales.ts +91 -0
  157. package/sampleData/validateSampleDataPack.ts +48 -0
  158. package/sampleData/validateSampleDataPackages.ts +79 -0
  159. package/sampleData/validateSampleDataSelection.ts +55 -0
  160. package/templateApplicability.ts +2 -1
  161. package/templates/ApplicableTemplateSet.ts +54 -0
  162. package/templates/TemplateCatalogEntry.ts +5 -1
  163. package/templates/TemplateLibrary.ts +16 -0
  164. package/templates/TemplateReferenceResolution.ts +35 -0
  165. package/templates/TemplateTarget.ts +23 -0
  166. package/templates/applicableTemplates.ts +148 -0
  167. package/templates/describeTemplateCatalog.ts +11 -7
  168. package/templates/index.ts +6 -0
  169. package/templates/resolveTemplateReference.ts +79 -0
  170. package/templates/validateTemplateMetadata.ts +11 -0
@@ -0,0 +1,359 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /** The value pools and formats generated data draws from for one locale. */ const englishWords = [
6
+ 'review',
7
+ 'quarterly',
8
+ 'update',
9
+ 'invoice',
10
+ 'customer',
11
+ 'delivery',
12
+ 'schedule',
13
+ 'renewal',
14
+ 'report',
15
+ 'follow',
16
+ 'up',
17
+ 'meeting'
18
+ ];
19
+ const locales = new Map(Object.entries({
20
+ 'en-GB': {
21
+ firstNames: [
22
+ 'Oliver',
23
+ 'Amelia',
24
+ 'George',
25
+ 'Isla',
26
+ 'Harry',
27
+ 'Ava',
28
+ 'Jack',
29
+ 'Freya',
30
+ 'Arthur',
31
+ 'Poppy'
32
+ ],
33
+ lastNames: [
34
+ 'Smith',
35
+ 'Jones',
36
+ 'Taylor',
37
+ 'Brown',
38
+ 'Wilson',
39
+ 'Evans',
40
+ 'Thomas',
41
+ 'Roberts',
42
+ 'Walker',
43
+ 'Wright'
44
+ ],
45
+ companies: [
46
+ 'Northgate Ltd',
47
+ 'Albion Supplies Ltd',
48
+ 'Thames Logistics Ltd',
49
+ 'Pennine Foods Ltd',
50
+ 'Harbour Digital Ltd',
51
+ 'Cotswold Tools Ltd'
52
+ ],
53
+ cities: [
54
+ 'London',
55
+ 'Manchester',
56
+ 'Leeds',
57
+ 'Bristol',
58
+ 'Glasgow',
59
+ 'Cardiff',
60
+ 'Sheffield',
61
+ 'Newcastle'
62
+ ],
63
+ domains: [
64
+ 'example.co.uk',
65
+ 'example.org.uk',
66
+ 'sample.co.uk'
67
+ ],
68
+ phoneTemplate: '+44 7### ######',
69
+ words: englishWords
70
+ },
71
+ 'en-US': {
72
+ firstNames: [
73
+ 'James',
74
+ 'Emma',
75
+ 'Michael',
76
+ 'Olivia',
77
+ 'William',
78
+ 'Sophia',
79
+ 'Benjamin',
80
+ 'Mia',
81
+ 'Henry',
82
+ 'Grace'
83
+ ],
84
+ lastNames: [
85
+ 'Johnson',
86
+ 'Miller',
87
+ 'Davis',
88
+ 'Garcia',
89
+ 'Anderson',
90
+ 'Martin',
91
+ 'Clark',
92
+ 'Lewis',
93
+ 'Young',
94
+ 'Hall'
95
+ ],
96
+ companies: [
97
+ 'Summit Supply Inc',
98
+ 'Bluebird Software Inc',
99
+ 'Redwood Freight Inc',
100
+ 'Lakeside Foods Inc',
101
+ 'Cardinal Tools Inc',
102
+ 'Pioneer Digital Inc'
103
+ ],
104
+ cities: [
105
+ 'New York',
106
+ 'Chicago',
107
+ 'Austin',
108
+ 'Seattle',
109
+ 'Denver',
110
+ 'Boston',
111
+ 'Atlanta',
112
+ 'Portland'
113
+ ],
114
+ domains: [
115
+ 'example.com',
116
+ 'example.net',
117
+ 'sample.com'
118
+ ],
119
+ phoneTemplate: '+1 (555) ###-####',
120
+ words: englishWords
121
+ },
122
+ 'nb-NO': {
123
+ firstNames: [
124
+ 'Lars',
125
+ 'Ingrid',
126
+ 'Ola',
127
+ 'Kari',
128
+ 'Henrik',
129
+ 'Sigrid',
130
+ 'Magnus',
131
+ 'Åse',
132
+ 'Bjørn',
133
+ 'Mari'
134
+ ],
135
+ lastNames: [
136
+ 'Hansen',
137
+ 'Johansen',
138
+ 'Olsen',
139
+ 'Larsen',
140
+ 'Andersen',
141
+ 'Pedersen',
142
+ 'Nilsen',
143
+ 'Kristiansen',
144
+ 'Berg',
145
+ 'Haugen'
146
+ ],
147
+ companies: [
148
+ 'Fjordline AS',
149
+ 'Nordlys Handel AS',
150
+ 'Fjellvik Maskin AS',
151
+ 'Bergen Logistikk AS',
152
+ 'Havbruk Partner AS',
153
+ 'Skagerrak Digital AS'
154
+ ],
155
+ cities: [
156
+ 'Oslo',
157
+ 'Bergen',
158
+ 'Trondheim',
159
+ 'Stavanger',
160
+ 'Tromsø',
161
+ 'Drammen',
162
+ 'Kristiansand',
163
+ 'Ålesund'
164
+ ],
165
+ domains: [
166
+ 'eksempel.no',
167
+ 'prove.no',
168
+ 'demo.no'
169
+ ],
170
+ phoneTemplate: '+47 9## ## ###',
171
+ words: [
172
+ 'gjennomgang',
173
+ 'kvartal',
174
+ 'oppdatering',
175
+ 'faktura',
176
+ 'kunde',
177
+ 'levering',
178
+ 'avtale',
179
+ 'fornyelse',
180
+ 'rapport',
181
+ 'oppfølging',
182
+ 'møte',
183
+ 'bestilling'
184
+ ]
185
+ },
186
+ 'sv-SE': {
187
+ firstNames: [
188
+ 'Erik',
189
+ 'Astrid',
190
+ 'Lars',
191
+ 'Maja',
192
+ 'Anders',
193
+ 'Elsa',
194
+ 'Johan',
195
+ 'Linnéa',
196
+ 'Gustav',
197
+ 'Åsa'
198
+ ],
199
+ lastNames: [
200
+ 'Andersson',
201
+ 'Johansson',
202
+ 'Karlsson',
203
+ 'Nilsson',
204
+ 'Eriksson',
205
+ 'Larsson',
206
+ 'Olsson',
207
+ 'Persson',
208
+ 'Svensson',
209
+ 'Gustafsson'
210
+ ],
211
+ companies: [
212
+ 'Norrlands Handel AB',
213
+ 'Östersund Teknik AB',
214
+ 'Göta Logistik AB',
215
+ 'Skärgården Livs AB',
216
+ 'Malmö Digital AB',
217
+ 'Vättern Verktyg AB'
218
+ ],
219
+ cities: [
220
+ 'Stockholm',
221
+ 'Göteborg',
222
+ 'Malmö',
223
+ 'Uppsala',
224
+ 'Västerås',
225
+ 'Örebro',
226
+ 'Linköping',
227
+ 'Umeå'
228
+ ],
229
+ domains: [
230
+ 'exempel.se',
231
+ 'prov.se',
232
+ 'demo.se'
233
+ ],
234
+ phoneTemplate: '+46 70 ### ## ##',
235
+ words: [
236
+ 'granskning',
237
+ 'kvartal',
238
+ 'uppdatering',
239
+ 'faktura',
240
+ 'kund',
241
+ 'leverans',
242
+ 'avtal',
243
+ 'förnyelse',
244
+ 'rapport',
245
+ 'uppföljning',
246
+ 'möte',
247
+ 'beställning'
248
+ ]
249
+ },
250
+ 'de-DE': {
251
+ firstNames: [
252
+ 'Lukas',
253
+ 'Anna',
254
+ 'Felix',
255
+ 'Marie',
256
+ 'Jonas',
257
+ 'Sophie',
258
+ 'Maximilian',
259
+ 'Lena',
260
+ 'Paul',
261
+ 'Jördis'
262
+ ],
263
+ lastNames: [
264
+ 'Müller',
265
+ 'Schmidt',
266
+ 'Schneider',
267
+ 'Fischer',
268
+ 'Weber',
269
+ 'Meyer',
270
+ 'Wagner',
271
+ 'Becker',
272
+ 'Schulz',
273
+ 'Hoffmann'
274
+ ],
275
+ companies: [
276
+ 'Rheinwerk GmbH',
277
+ 'Nordsee Handel GmbH',
278
+ 'Isar Logistik GmbH',
279
+ 'Schwarzwald Technik GmbH',
280
+ 'Elbe Digital GmbH',
281
+ 'Bayern Werkzeug GmbH'
282
+ ],
283
+ cities: [
284
+ 'Berlin',
285
+ 'Hamburg',
286
+ 'München',
287
+ 'Köln',
288
+ 'Frankfurt',
289
+ 'Stuttgart',
290
+ 'Düsseldorf',
291
+ 'Leipzig'
292
+ ],
293
+ domains: [
294
+ 'beispiel.de',
295
+ 'muster.de',
296
+ 'demo.de'
297
+ ],
298
+ phoneTemplate: '+49 151 ########',
299
+ words: [
300
+ 'prüfung',
301
+ 'quartal',
302
+ 'aktualisierung',
303
+ 'rechnung',
304
+ 'kunde',
305
+ 'lieferung',
306
+ 'vertrag',
307
+ 'verlängerung',
308
+ 'bericht',
309
+ 'nachfassen',
310
+ 'termin',
311
+ 'bestellung'
312
+ ]
313
+ }
314
+ }));
315
+ const languageDefaults = new Map([
316
+ [
317
+ 'en',
318
+ 'en-GB'
319
+ ],
320
+ [
321
+ 'nb',
322
+ 'nb-NO'
323
+ ],
324
+ [
325
+ 'nn',
326
+ 'nb-NO'
327
+ ],
328
+ [
329
+ 'no',
330
+ 'nb-NO'
331
+ ],
332
+ [
333
+ 'sv',
334
+ 'sv-SE'
335
+ ],
336
+ [
337
+ 'de',
338
+ 'de-DE'
339
+ ]
340
+ ]);
341
+ /** The locale used when a tag matches no pool. */ const defaultSampleLocale = 'en-GB';
342
+ /** The locale tags with their own pools. */ const sampleLocaleTags = [
343
+ ...locales.keys()
344
+ ];
345
+ /**
346
+ * Resolves a BCP 47 tag to a pool: the exact tag (language lower case, region upper case), else the
347
+ * language's default pool, else {@link defaultSampleLocale}.
348
+ */ function sampleLocaleFor(tag) {
349
+ const parts = (tag ?? '').trim().split('-');
350
+ const language = parts[0].toLowerCase();
351
+ const region = parts.length > 1 ? parts[1].toUpperCase() : '';
352
+ const exact = region === '' ? undefined : locales.get(`${language}-${region}`);
353
+ return exact ?? locales.get(languageDefaults.get(language) ?? defaultSampleLocale);
354
+ }
355
+
356
+ exports.defaultSampleLocale = defaultSampleLocale;
357
+ exports.sampleLocaleFor = sampleLocaleFor;
358
+ exports.sampleLocaleTags = sampleLocaleTags;
359
+ //# sourceMappingURL=sampleLocales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleLocales.js","sources":["../../../sampleData/sampleLocales.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/** The value pools and formats generated data draws from for one locale. */\nexport interface SampleLocale {\n firstNames: string[];\n lastNames: string[];\n companies: string[];\n cities: string[];\n domains: string[];\n /** `#` is replaced by a random digit. */\n phoneTemplate: string;\n words: string[];\n}\n\nconst englishWords = ['review', 'quarterly', 'update', 'invoice', 'customer', 'delivery', 'schedule', 'renewal', 'report', 'follow', 'up', 'meeting'];\n\nconst locales = new Map<string, SampleLocale>(Object.entries({\n 'en-GB': {\n firstNames: ['Oliver', 'Amelia', 'George', 'Isla', 'Harry', 'Ava', 'Jack', 'Freya', 'Arthur', 'Poppy'],\n lastNames: ['Smith', 'Jones', 'Taylor', 'Brown', 'Wilson', 'Evans', 'Thomas', 'Roberts', 'Walker', 'Wright'],\n companies: ['Northgate Ltd', 'Albion Supplies Ltd', 'Thames Logistics Ltd', 'Pennine Foods Ltd', 'Harbour Digital Ltd', 'Cotswold Tools Ltd'],\n cities: ['London', 'Manchester', 'Leeds', 'Bristol', 'Glasgow', 'Cardiff', 'Sheffield', 'Newcastle'],\n domains: ['example.co.uk', 'example.org.uk', 'sample.co.uk'],\n phoneTemplate: '+44 7### ######',\n words: englishWords,\n },\n 'en-US': {\n firstNames: ['James', 'Emma', 'Michael', 'Olivia', 'William', 'Sophia', 'Benjamin', 'Mia', 'Henry', 'Grace'],\n lastNames: ['Johnson', 'Miller', 'Davis', 'Garcia', 'Anderson', 'Martin', 'Clark', 'Lewis', 'Young', 'Hall'],\n companies: ['Summit Supply Inc', 'Bluebird Software Inc', 'Redwood Freight Inc', 'Lakeside Foods Inc', 'Cardinal Tools Inc', 'Pioneer Digital Inc'],\n cities: ['New York', 'Chicago', 'Austin', 'Seattle', 'Denver', 'Boston', 'Atlanta', 'Portland'],\n domains: ['example.com', 'example.net', 'sample.com'],\n phoneTemplate: '+1 (555) ###-####',\n words: englishWords,\n },\n 'nb-NO': {\n firstNames: ['Lars', 'Ingrid', 'Ola', 'Kari', 'Henrik', 'Sigrid', 'Magnus', 'Åse', 'Bjørn', 'Mari'],\n lastNames: ['Hansen', 'Johansen', 'Olsen', 'Larsen', 'Andersen', 'Pedersen', 'Nilsen', 'Kristiansen', 'Berg', 'Haugen'],\n companies: ['Fjordline AS', 'Nordlys Handel AS', 'Fjellvik Maskin AS', 'Bergen Logistikk AS', 'Havbruk Partner AS', 'Skagerrak Digital AS'],\n cities: ['Oslo', 'Bergen', 'Trondheim', 'Stavanger', 'Tromsø', 'Drammen', 'Kristiansand', 'Ålesund'],\n domains: ['eksempel.no', 'prove.no', 'demo.no'],\n phoneTemplate: '+47 9## ## ###',\n words: ['gjennomgang', 'kvartal', 'oppdatering', 'faktura', 'kunde', 'levering', 'avtale', 'fornyelse', 'rapport', 'oppfølging', 'møte', 'bestilling'],\n },\n 'sv-SE': {\n firstNames: ['Erik', 'Astrid', 'Lars', 'Maja', 'Anders', 'Elsa', 'Johan', 'Linnéa', 'Gustav', 'Åsa'],\n lastNames: ['Andersson', 'Johansson', 'Karlsson', 'Nilsson', 'Eriksson', 'Larsson', 'Olsson', 'Persson', 'Svensson', 'Gustafsson'],\n companies: ['Norrlands Handel AB', 'Östersund Teknik AB', 'Göta Logistik AB', 'Skärgården Livs AB', 'Malmö Digital AB', 'Vättern Verktyg AB'],\n cities: ['Stockholm', 'Göteborg', 'Malmö', 'Uppsala', 'Västerås', 'Örebro', 'Linköping', 'Umeå'],\n domains: ['exempel.se', 'prov.se', 'demo.se'],\n phoneTemplate: '+46 70 ### ## ##',\n words: ['granskning', 'kvartal', 'uppdatering', 'faktura', 'kund', 'leverans', 'avtal', 'förnyelse', 'rapport', 'uppföljning', 'möte', 'beställning'],\n },\n 'de-DE': {\n firstNames: ['Lukas', 'Anna', 'Felix', 'Marie', 'Jonas', 'Sophie', 'Maximilian', 'Lena', 'Paul', 'Jördis'],\n lastNames: ['Müller', 'Schmidt', 'Schneider', 'Fischer', 'Weber', 'Meyer', 'Wagner', 'Becker', 'Schulz', 'Hoffmann'],\n companies: ['Rheinwerk GmbH', 'Nordsee Handel GmbH', 'Isar Logistik GmbH', 'Schwarzwald Technik GmbH', 'Elbe Digital GmbH', 'Bayern Werkzeug GmbH'],\n cities: ['Berlin', 'Hamburg', 'München', 'Köln', 'Frankfurt', 'Stuttgart', 'Düsseldorf', 'Leipzig'],\n domains: ['beispiel.de', 'muster.de', 'demo.de'],\n phoneTemplate: '+49 151 ########',\n words: ['prüfung', 'quartal', 'aktualisierung', 'rechnung', 'kunde', 'lieferung', 'vertrag', 'verlängerung', 'bericht', 'nachfassen', 'termin', 'bestellung'],\n },\n} as Record<string, SampleLocale>));\n\nconst languageDefaults = new Map<string, string>([\n ['en', 'en-GB'],\n ['nb', 'nb-NO'],\n ['nn', 'nb-NO'],\n ['no', 'nb-NO'],\n ['sv', 'sv-SE'],\n ['de', 'de-DE'],\n]);\n\n/** The locale used when a tag matches no pool. */\nexport const defaultSampleLocale = 'en-GB';\n\n/** The locale tags with their own pools. */\nexport const sampleLocaleTags: string[] = [...locales.keys()];\n\n/**\n * Resolves a BCP 47 tag to a pool: the exact tag (language lower case, region upper case), else the\n * language's default pool, else {@link defaultSampleLocale}.\n */\nexport function sampleLocaleFor(tag: string | undefined): SampleLocale {\n const parts = (tag ?? '').trim().split('-');\n const language = parts[0].toLowerCase();\n const region = parts.length > 1 ? parts[1].toUpperCase() : '';\n const exact = region === '' ? undefined : locales.get(`${language}-${region}`);\n return exact ?? locales.get(languageDefaults.get(language) ?? defaultSampleLocale)!;\n}\n"],"names":["englishWords","locales","Map","Object","entries","firstNames","lastNames","companies","cities","domains","phoneTemplate","words","languageDefaults","defaultSampleLocale","sampleLocaleTags","keys","sampleLocaleFor","tag","parts","trim","split","language","toLowerCase","region","length","toUpperCase","exact","undefined","get"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ var sampleDataRules = require('./sampleDataRules.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
+ * Checks a pack's schema: an id of the allowed form, a title, a well-formed locale tag, an owner that is
9
+ * `user` or `blueprint:<id>`, and sets with a shape each, none repeated. The C# engine
10
+ * (`SampleDataValidation.ValidatePack`) reports the same problems in the same order; both are asserted against
11
+ * `sample-data-resolution-fixtures.json`.
12
+ */ function validateSampleDataPack(pack) {
13
+ const problems = [];
14
+ const id = pack.id ?? '';
15
+ const label = id.trim() === '' ? 'Sample data pack' : `Sample data pack '${id}'`;
16
+ if (id.trim() === '') {
17
+ problems.push('Sample data pack declares no id');
18
+ } else if (!sampleDataRules.sampleDataIdPattern.test(id)) {
19
+ problems.push(`${label} declares an invalid id; use lower-case letters, digits and '.', '_' or '-' separators`);
20
+ }
21
+ if ((pack.title ?? '').trim() === '') problems.push(`${label} declares no title`);
22
+ if ((pack.locale ?? '').trim() === '') {
23
+ problems.push(`${label} declares no locale`);
24
+ } else if (!sampleDataRules.sampleDataLocalePattern.test(pack.locale)) {
25
+ problems.push(`${label} declares an invalid locale '${pack.locale}'`);
26
+ }
27
+ if (!sampleDataRules.isValidSampleDataOwner(pack.owner)) {
28
+ problems.push(`${label} declares owner '${pack.owner ?? ''}', which is neither 'user' nor 'blueprint:<id>'`);
29
+ }
30
+ const seen = new Set();
31
+ for (const set of pack.sets ?? []){
32
+ if ((set.shape ?? '').trim() === '') {
33
+ problems.push(`${label} declares a set without a shape`);
34
+ } else if (seen.has(set.shape)) {
35
+ problems.push(`${label} declares shape '${set.shape}' more than once`);
36
+ } else {
37
+ seen.add(set.shape);
38
+ }
39
+ }
40
+ return problems;
41
+ }
42
+
43
+ exports.validateSampleDataPack = validateSampleDataPack;
44
+ //# sourceMappingURL=validateSampleDataPack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSampleDataPack.js","sources":["../../../sampleData/validateSampleDataPack.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 { SampleDataPack } from '@cratis/scene.model';\nimport { isValidSampleDataOwner, sampleDataIdPattern, sampleDataLocalePattern } from './sampleDataRules';\n\n/**\n * Checks a pack's schema: an id of the allowed form, a title, a well-formed locale tag, an owner that is\n * `user` or `blueprint:<id>`, and sets with a shape each, none repeated. The C# engine\n * (`SampleDataValidation.ValidatePack`) reports the same problems in the same order; both are asserted against\n * `sample-data-resolution-fixtures.json`.\n */\nexport function validateSampleDataPack(pack: SampleDataPack): string[] {\n const problems: string[] = [];\n const id = pack.id ?? '';\n const label = id.trim() === '' ? 'Sample data pack' : `Sample data pack '${id}'`;\n\n if (id.trim() === '') {\n problems.push('Sample data pack declares no id');\n } else if (!sampleDataIdPattern.test(id)) {\n problems.push(`${label} declares an invalid id; use lower-case letters, digits and '.', '_' or '-' separators`);\n }\n\n if ((pack.title ?? '').trim() === '') problems.push(`${label} declares no title`);\n\n if ((pack.locale ?? '').trim() === '') {\n problems.push(`${label} declares no locale`);\n } else if (!sampleDataLocalePattern.test(pack.locale)) {\n problems.push(`${label} declares an invalid locale '${pack.locale}'`);\n }\n\n if (!isValidSampleDataOwner(pack.owner)) {\n problems.push(`${label} declares owner '${pack.owner ?? ''}', which is neither 'user' nor 'blueprint:<id>'`);\n }\n\n const seen = new Set<string>();\n for (const set of pack.sets ?? []) {\n if ((set.shape ?? '').trim() === '') {\n problems.push(`${label} declares a set without a shape`);\n } else if (seen.has(set.shape)) {\n problems.push(`${label} declares shape '${set.shape}' more than once`);\n } else {\n seen.add(set.shape);\n }\n }\n\n return problems;\n}\n"],"names":["validateSampleDataPack","pack","problems","id","label","trim","push","sampleDataIdPattern","test","title","locale","sampleDataLocalePattern","isValidSampleDataOwner","owner","seen","Set","set","sets","shape","has","add"],"mappings":";;;;AAAA;AACA;AAKA;;;;;IAMO,SAASA,sBAAAA,CAAuBC,IAAoB,EAAA;AACvD,IAAA,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,EAAAA,GAAKF,IAAAA,CAAKE,EAAE,IAAI,EAAA;IACtB,MAAMC,KAAAA,GAAQD,EAAAA,CAAGE,IAAI,EAAA,KAAO,EAAA,GAAK,kBAAA,GAAqB,CAAC,kBAAkB,EAAEF,EAAAA,CAAG,CAAC,CAAC;IAEhF,IAAIA,EAAAA,CAAGE,IAAI,EAAA,KAAO,EAAA,EAAI;AAClBH,QAAAA,QAAAA,CAASI,IAAI,CAAC,iCAAA,CAAA;AAClB,IAAA,CAAA,MAAO,IAAI,CAACC,mCAAAA,CAAoBC,IAAI,CAACL,EAAAA,CAAAA,EAAK;AACtCD,QAAAA,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,sFAAsF,CAAC,CAAA;AAClH,IAAA;AAEA,IAAA,IAAI,CAACH,IAAAA,CAAKQ,KAAK,IAAI,EAAC,EAAGJ,IAAI,EAAA,KAAO,EAAA,EAAIH,SAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,kBAAkB,CAAC,CAAA;IAEhF,IAAKH,CAAAA,IAAAA,CAAKS,MAAM,IAAI,EAAC,EAAGL,IAAI,EAAA,KAAO,EAAA,EAAI;AACnCH,QAAAA,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,mBAAmB,CAAC,CAAA;AAC/C,IAAA,CAAA,MAAO,IAAI,CAACO,uCAAAA,CAAwBH,IAAI,CAACP,IAAAA,CAAKS,MAAM,CAAA,EAAG;QACnDR,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,6BAA6B,EAAEH,IAAAA,CAAKS,MAAM,CAAC,CAAC,CAAC,CAAA;AACxE,IAAA;AAEA,IAAA,IAAI,CAACE,sCAAAA,CAAuBX,IAAAA,CAAKY,KAAK,CAAA,EAAG;QACrCX,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,iBAAiB,EAAEH,IAAAA,CAAKY,KAAK,IAAI,EAAA,CAAG,+CAA+C,CAAC,CAAA;AAC/G,IAAA;AAEA,IAAA,MAAMC,OAAO,IAAIC,GAAAA,EAAAA;AACjB,IAAA,KAAK,MAAMC,GAAAA,IAAOf,IAAAA,CAAKgB,IAAI,IAAI,EAAE,CAAE;QAC/B,IAAKD,CAAAA,GAAAA,CAAIE,KAAK,IAAI,EAAC,EAAGb,IAAI,EAAA,KAAO,EAAA,EAAI;AACjCH,YAAAA,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,+BAA+B,CAAC,CAAA;AAC3D,QAAA,CAAA,MAAO,IAAIU,IAAAA,CAAKK,GAAG,CAACH,GAAAA,CAAIE,KAAK,CAAA,EAAG;YAC5BhB,QAAAA,CAASI,IAAI,CAAC,CAAA,EAAGF,KAAAA,CAAM,iBAAiB,EAAEY,GAAAA,CAAIE,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACzE,CAAA,MAAO;YACHJ,IAAAA,CAAKM,GAAG,CAACJ,GAAAA,CAAIE,KAAK,CAAA;AACtB,QAAA;AACJ,IAAA;IAEA,OAAOhB,QAAAA;AACX;;"}
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var sampleDataRules = require('./sampleDataRules.js');
5
+ var validateSampleDataPack = require('./validateSampleDataPack.js');
6
+
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
9
+ /**
10
+ * Checks the sample data the given packages ship, in package then reference order: only a Blueprint package may
11
+ * ship packs; each reference needs a valid id, a title, a locale tag and a `sampleData/*.json` path, with no id
12
+ * or path repeated; and each loaded pack must be valid, match its reference's id and locale, be owned by a
13
+ * blueprint, and be one the manifest references. The C# engine (`SampleDataValidation.ValidatePackages`)
14
+ * reports the same problems in the same order.
15
+ */ function validateSampleDataPackages(sources) {
16
+ const problems = [];
17
+ for (const source of sources){
18
+ const manifest = source.manifest;
19
+ const references = manifest.sampleData ?? [];
20
+ const owner = `Package '${manifest.name}'`;
21
+ if (references.length > 0 && manifest.kind !== scene_model.PackageKind.Blueprint) {
22
+ problems.push(`${owner} ships sample data but is not a Blueprint package`);
23
+ }
24
+ const ids = new Set();
25
+ const paths = new Set();
26
+ for (const reference of references){
27
+ const label = `${owner} sample data pack '${reference.id ?? ''}'`;
28
+ if ((reference.id ?? '').trim() === '') {
29
+ problems.push(`${owner} declares a sample data pack without an id`);
30
+ } else if (!sampleDataRules.sampleDataIdPattern.test(reference.id)) {
31
+ problems.push(`${label} has an invalid id`);
32
+ } else if (ids.has(reference.id)) {
33
+ problems.push(`${label} is declared more than once`);
34
+ } else {
35
+ ids.add(reference.id);
36
+ }
37
+ if ((reference.title ?? '').trim() === '') problems.push(`${label} declares no title`);
38
+ if ((reference.locale ?? '').trim() === '') {
39
+ problems.push(`${label} declares no locale`);
40
+ } else if (!sampleDataRules.sampleDataLocalePattern.test(reference.locale)) {
41
+ problems.push(`${label} declares an invalid locale '${reference.locale}'`);
42
+ }
43
+ if (!sampleDataRules.isValidSampleDataPath(reference.path)) {
44
+ problems.push(`${label} declares path '${reference.path ?? ''}', which is not 'sampleData/<name>.json'`);
45
+ } else if (paths.has(reference.path)) {
46
+ problems.push(`${label} reuses the path '${reference.path}'`);
47
+ } else {
48
+ paths.add(reference.path);
49
+ }
50
+ }
51
+ for (const pack of source.packs ?? []){
52
+ const label = `${owner} sample data pack '${pack.id ?? ''}'`;
53
+ problems.push(...validateSampleDataPack.validateSampleDataPack(pack));
54
+ const reference = references.find((candidate)=>candidate.id === pack.id);
55
+ if (reference === undefined) {
56
+ problems.push(`${label} is not referenced by the package's sampleData`);
57
+ continue;
58
+ }
59
+ if (reference.locale !== pack.locale) {
60
+ problems.push(`${label} has locale '${pack.locale}' but its reference declares '${reference.locale}'`);
61
+ }
62
+ if (sampleDataRules.isValidSampleDataOwner(pack.owner) && pack.owner === 'user') {
63
+ problems.push(`${label} must be owned by a blueprint, not 'user'`);
64
+ }
65
+ }
66
+ }
67
+ return problems;
68
+ }
69
+
70
+ exports.validateSampleDataPackages = validateSampleDataPackages;
71
+ //# sourceMappingURL=validateSampleDataPackages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSampleDataPackages.js","sources":["../../../sampleData/validateSampleDataPackages.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 { PackageKind } from '@cratis/scene.model';\nimport { SampleDataPackSource } from './SampleDataPackSource';\nimport { isValidSampleDataOwner, isValidSampleDataPath, sampleDataIdPattern, sampleDataLocalePattern } from './sampleDataRules';\nimport { validateSampleDataPack } from './validateSampleDataPack';\n\n/**\n * Checks the sample data the given packages ship, in package then reference order: only a Blueprint package may\n * ship packs; each reference needs a valid id, a title, a locale tag and a `sampleData/*.json` path, with no id\n * or path repeated; and each loaded pack must be valid, match its reference's id and locale, be owned by a\n * blueprint, and be one the manifest references. The C# engine (`SampleDataValidation.ValidatePackages`)\n * reports the same problems in the same order.\n */\nexport function validateSampleDataPackages(sources: readonly SampleDataPackSource[]): string[] {\n const problems: string[] = [];\n\n for (const source of sources) {\n const manifest = source.manifest;\n const references = manifest.sampleData ?? [];\n const owner = `Package '${manifest.name}'`;\n\n if (references.length > 0 && manifest.kind !== PackageKind.Blueprint) {\n problems.push(`${owner} ships sample data but is not a Blueprint package`);\n }\n\n const ids = new Set<string>();\n const paths = new Set<string>();\n for (const reference of references) {\n const label = `${owner} sample data pack '${reference.id ?? ''}'`;\n if ((reference.id ?? '').trim() === '') {\n problems.push(`${owner} declares a sample data pack without an id`);\n } else if (!sampleDataIdPattern.test(reference.id)) {\n problems.push(`${label} has an invalid id`);\n } else if (ids.has(reference.id)) {\n problems.push(`${label} is declared more than once`);\n } else {\n ids.add(reference.id);\n }\n\n if ((reference.title ?? '').trim() === '') problems.push(`${label} declares no title`);\n\n if ((reference.locale ?? '').trim() === '') {\n problems.push(`${label} declares no locale`);\n } else if (!sampleDataLocalePattern.test(reference.locale)) {\n problems.push(`${label} declares an invalid locale '${reference.locale}'`);\n }\n\n if (!isValidSampleDataPath(reference.path)) {\n problems.push(`${label} declares path '${reference.path ?? ''}', which is not 'sampleData/<name>.json'`);\n } else if (paths.has(reference.path)) {\n problems.push(`${label} reuses the path '${reference.path}'`);\n } else {\n paths.add(reference.path);\n }\n }\n\n for (const pack of source.packs ?? []) {\n const label = `${owner} sample data pack '${pack.id ?? ''}'`;\n problems.push(...validateSampleDataPack(pack));\n const reference = references.find(candidate => candidate.id === pack.id);\n if (reference === undefined) {\n problems.push(`${label} is not referenced by the package's sampleData`);\n continue;\n }\n\n if (reference.locale !== pack.locale) {\n problems.push(`${label} has locale '${pack.locale}' but its reference declares '${reference.locale}'`);\n }\n\n if (isValidSampleDataOwner(pack.owner) && pack.owner === 'user') {\n problems.push(`${label} must be owned by a blueprint, not 'user'`);\n }\n }\n }\n\n return problems;\n}\n"],"names":["validateSampleDataPackages","sources","problems","source","manifest","references","sampleData","owner","name","length","kind","PackageKind","Blueprint","push","ids","Set","paths","reference","label","id","trim","sampleDataIdPattern","test","has","add","title","locale","sampleDataLocalePattern","isValidSampleDataPath","path","pack","packs","validateSampleDataPack","find","candidate","undefined","isValidSampleDataOwner"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Checks an application's sample data selection against the packs available: the active pack and every bound
7
+ * pack must exist, mappings and bindings must be complete and not repeated, and one read model must not be fed
8
+ * by two different shapes. The C# engine (`SampleDataValidation.ValidateSelection`) reports the same problems in
9
+ * the same order.
10
+ */ function validateSampleDataSelection(selection, packs) {
11
+ const problems = [];
12
+ const known = new Set(packs.map((pack)=>pack.id));
13
+ if (selection.activePack !== undefined && selection.activePack !== null && !known.has(selection.activePack)) {
14
+ problems.push(`The active sample data pack '${selection.activePack}' is not available`);
15
+ }
16
+ const pairs = new Set();
17
+ const shapeByReadModel = new Map();
18
+ for (const mapping of selection.mappings ?? []){
19
+ if ((mapping.shape ?? '').trim() === '') {
20
+ problems.push('A sample data mapping declares no shape');
21
+ } else if ((mapping.readModel ?? '').trim() === '') {
22
+ problems.push(`The sample data mapping for shape '${mapping.shape}' declares no read model`);
23
+ } else if (pairs.has(`${mapping.shape}\u0000${mapping.readModel}`)) {
24
+ problems.push(`The sample data mapping '${mapping.shape}' to '${mapping.readModel}' is declared more than once`);
25
+ } else {
26
+ pairs.add(`${mapping.shape}\u0000${mapping.readModel}`);
27
+ const existing = shapeByReadModel.get(mapping.readModel);
28
+ if (existing === undefined) {
29
+ shapeByReadModel.set(mapping.readModel, mapping.shape);
30
+ } else {
31
+ problems.push(`The read model '${mapping.readModel}' is mapped from both shape '${existing}' and shape '${mapping.shape}'`);
32
+ }
33
+ }
34
+ }
35
+ const targets = new Set();
36
+ for (const binding of selection.bindings ?? []){
37
+ if ((binding.target ?? '').trim() === '') {
38
+ problems.push('A sample data binding declares no target');
39
+ } else if (targets.has(binding.target)) {
40
+ problems.push(`The sample data target '${binding.target}' is bound more than once`);
41
+ } else {
42
+ targets.add(binding.target);
43
+ if (!known.has(binding.pack)) {
44
+ problems.push(`The sample data binding for '${binding.target}' names pack '${binding.pack ?? ''}', which is not available`);
45
+ }
46
+ }
47
+ }
48
+ return problems;
49
+ }
50
+
51
+ exports.validateSampleDataSelection = validateSampleDataSelection;
52
+ //# sourceMappingURL=validateSampleDataSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSampleDataSelection.js","sources":["../../../sampleData/validateSampleDataSelection.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 { SampleDataPack, SampleDataSelection } from '@cratis/scene.model';\n\n/**\n * Checks an application's sample data selection against the packs available: the active pack and every bound\n * pack must exist, mappings and bindings must be complete and not repeated, and one read model must not be fed\n * by two different shapes. The C# engine (`SampleDataValidation.ValidateSelection`) reports the same problems in\n * the same order.\n */\nexport function validateSampleDataSelection(selection: SampleDataSelection, packs: readonly SampleDataPack[]): string[] {\n const problems: string[] = [];\n const known = new Set(packs.map(pack => pack.id));\n\n if (selection.activePack !== undefined && selection.activePack !== null && !known.has(selection.activePack)) {\n problems.push(`The active sample data pack '${selection.activePack}' is not available`);\n }\n\n const pairs = new Set<string>();\n const shapeByReadModel = new Map<string, string>();\n for (const mapping of selection.mappings ?? []) {\n if ((mapping.shape ?? '').trim() === '') {\n problems.push('A sample data mapping declares no shape');\n } else if ((mapping.readModel ?? '').trim() === '') {\n problems.push(`The sample data mapping for shape '${mapping.shape}' declares no read model`);\n } else if (pairs.has(`${mapping.shape}\\u0000${mapping.readModel}`)) {\n problems.push(`The sample data mapping '${mapping.shape}' to '${mapping.readModel}' is declared more than once`);\n } else {\n pairs.add(`${mapping.shape}\\u0000${mapping.readModel}`);\n const existing = shapeByReadModel.get(mapping.readModel);\n if (existing === undefined) {\n shapeByReadModel.set(mapping.readModel, mapping.shape);\n } else {\n problems.push(`The read model '${mapping.readModel}' is mapped from both shape '${existing}' and shape '${mapping.shape}'`);\n }\n }\n }\n\n const targets = new Set<string>();\n for (const binding of selection.bindings ?? []) {\n if ((binding.target ?? '').trim() === '') {\n problems.push('A sample data binding declares no target');\n } else if (targets.has(binding.target)) {\n problems.push(`The sample data target '${binding.target}' is bound more than once`);\n } else {\n targets.add(binding.target);\n if (!known.has(binding.pack)) {\n problems.push(`The sample data binding for '${binding.target}' names pack '${binding.pack ?? ''}', which is not available`);\n }\n }\n }\n\n return problems;\n}\n"],"names":["validateSampleDataSelection","selection","packs","problems","known","Set","map","pack","id","activePack","undefined","has","push","pairs","shapeByReadModel","Map","mapping","mappings","shape","trim","readModel","add","existing","get","set","targets","binding","bindings","target"],"mappings":";;AAAA;AACA;AAIA;;;;;AAKC,IACM,SAASA,2BAAAA,CAA4BC,SAA8B,EAAEC,KAAgC,EAAA;AACxG,IAAA,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,KAAAA,GAAQ,IAAIC,GAAAA,CAAIH,KAAAA,CAAMI,GAAG,CAACC,CAAAA,IAAAA,GAAQA,IAAAA,CAAKC,EAAE,CAAA,CAAA;AAE/C,IAAA,IAAIP,SAAAA,CAAUQ,UAAU,KAAKC,SAAAA,IAAaT,UAAUQ,UAAU,KAAK,IAAA,IAAQ,CAACL,KAAAA,CAAMO,GAAG,CAACV,SAAAA,CAAUQ,UAAU,CAAA,EAAG;QACzGN,QAAAA,CAASS,IAAI,CAAC,CAAC,6BAA6B,EAAEX,SAAAA,CAAUQ,UAAU,CAAC,kBAAkB,CAAC,CAAA;AAC1F,IAAA;AAEA,IAAA,MAAMI,QAAQ,IAAIR,GAAAA,EAAAA;AAClB,IAAA,MAAMS,mBAAmB,IAAIC,GAAAA,EAAAA;AAC7B,IAAA,KAAK,MAAMC,OAAAA,IAAWf,SAAAA,CAAUgB,QAAQ,IAAI,EAAE,CAAE;QAC5C,IAAKD,CAAAA,OAAAA,CAAQE,KAAK,IAAI,EAAC,EAAGC,IAAI,EAAA,KAAO,EAAA,EAAI;AACrChB,YAAAA,QAAAA,CAASS,IAAI,CAAC,yCAAA,CAAA;QAClB,CAAA,MAAO,IAAI,CAACI,OAAAA,CAAQI,SAAS,IAAI,EAAC,EAAGD,IAAI,EAAA,KAAO,EAAA,EAAI;YAChDhB,QAAAA,CAASS,IAAI,CAAC,CAAC,mCAAmC,EAAEI,OAAAA,CAAQE,KAAK,CAAC,wBAAwB,CAAC,CAAA;AAC/F,QAAA,CAAA,MAAO,IAAIL,KAAAA,CAAMF,GAAG,CAAC,CAAA,EAAGK,OAAAA,CAAQE,KAAK,CAAC,MAAM,EAAEF,OAAAA,CAAQI,SAAS,EAAE,CAAA,EAAG;AAChEjB,YAAAA,QAAAA,CAASS,IAAI,CAAC,CAAC,yBAAyB,EAAEI,OAAAA,CAAQE,KAAK,CAAC,MAAM,EAAEF,OAAAA,CAAQI,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACnH,CAAA,MAAO;YACHP,KAAAA,CAAMQ,GAAG,CAAC,CAAA,EAAGL,OAAAA,CAAQE,KAAK,CAAC,MAAM,EAAEF,OAAAA,CAAQI,SAAS,CAAA,CAAE,CAAA;AACtD,YAAA,MAAME,QAAAA,GAAWR,gBAAAA,CAAiBS,GAAG,CAACP,QAAQI,SAAS,CAAA;AACvD,YAAA,IAAIE,aAAaZ,SAAAA,EAAW;AACxBI,gBAAAA,gBAAAA,CAAiBU,GAAG,CAACR,OAAAA,CAAQI,SAAS,EAAEJ,QAAQE,KAAK,CAAA;YACzD,CAAA,MAAO;AACHf,gBAAAA,QAAAA,CAASS,IAAI,CAAC,CAAC,gBAAgB,EAAEI,QAAQI,SAAS,CAAC,6BAA6B,EAAEE,SAAS,aAAa,EAAEN,QAAQE,KAAK,CAAC,CAAC,CAAC,CAAA;AAC9H,YAAA;AACJ,QAAA;AACJ,IAAA;AAEA,IAAA,MAAMO,UAAU,IAAIpB,GAAAA,EAAAA;AACpB,IAAA,KAAK,MAAMqB,OAAAA,IAAWzB,SAAAA,CAAU0B,QAAQ,IAAI,EAAE,CAAE;QAC5C,IAAKD,CAAAA,OAAAA,CAAQE,MAAM,IAAI,EAAC,EAAGT,IAAI,EAAA,KAAO,EAAA,EAAI;AACtChB,YAAAA,QAAAA,CAASS,IAAI,CAAC,0CAAA,CAAA;AAClB,QAAA,CAAA,MAAO,IAAIa,OAAAA,CAAQd,GAAG,CAACe,OAAAA,CAAQE,MAAM,CAAA,EAAG;YACpCzB,QAAAA,CAASS,IAAI,CAAC,CAAC,wBAAwB,EAAEc,OAAAA,CAAQE,MAAM,CAAC,yBAAyB,CAAC,CAAA;QACtF,CAAA,MAAO;YACHH,OAAAA,CAAQJ,GAAG,CAACK,OAAAA,CAAQE,MAAM,CAAA;AAC1B,YAAA,IAAI,CAACxB,KAAAA,CAAMO,GAAG,CAACe,OAAAA,CAAQnB,IAAI,CAAA,EAAG;AAC1BJ,gBAAAA,QAAAA,CAASS,IAAI,CAAC,CAAC,6BAA6B,EAAEc,OAAAA,CAAQE,MAAM,CAAC,cAAc,EAAEF,OAAAA,CAAQnB,IAAI,IAAI,EAAA,CAAG,yBAAyB,CAAC,CAAA;AAC9H,YAAA;AACJ,QAAA;AACJ,IAAA;IAEA,OAAOJ,QAAAA;AACX;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"templateApplicability.js","sources":["../../templateApplicability.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 { DialogTemplate, Layout, ScreenTemplate, TemplateMetadata, TemplateScope } from '@cratis/scene.model';\n\ntype TemplateKind = 'Layout' | 'ScreenTemplate' | 'DialogTemplate';\ntype TemplateContainer = Pick<Layout, 'name' | 'slots'>;\n\n/** Validates application-shell selection without introducing a competing shell model. */\nexport function validateLayoutApplicability(layout: Layout | undefined, scope: TemplateScope): string[] {\n return layout ? validateRole(layout.name, 'Layout', layout.metadata, scope) : [];\n}\n\n/**\n * Validates selection at any depth of the application hierarchy, including qualified fitsSlot names.\n * Undefined represents outlet-only composition and is valid. Invalid author input is never rewritten.\n */\nexport function validateScreenTemplateApplicability(\n template: ScreenTemplate | undefined,\n scope: TemplateScope,\n container?: TemplateContainer,\n): string[] {\n if (!template) return [];\n const problems = validateRole(template.name, 'ScreenTemplate', template.metadata, scope);\n if (template.fitsSlot !== undefined) {\n const separator = template.fitsSlot.lastIndexOf('.');\n const qualifier = separator < 0 ? undefined : template.fitsSlot.slice(0, separator);\n const slot = separator < 0 ? template.fitsSlot : template.fitsSlot.slice(separator + 1);\n if (!container || (qualifier !== undefined && qualifier !== container.name) || !container.slots.some(candidate => candidate.name === slot)) {\n problems.push(`Template '${template.name}' does not fit slot '${template.fitsSlot}' on '${container?.name ?? '(no container)'}'`);\n }\n }\n return problems;\n}\n\n/** Validates an overlay template separately from slot-based screen composition. */\nexport function validateDialogTemplateApplicability(template: DialogTemplate | undefined, scope: TemplateScope): string[] {\n return template ? validateRole(template.name, 'DialogTemplate', template.metadata, scope) : [];\n}\n\n/** The shared picker predicate uses exactly the same rules as validation on apply. */\nexport function filterApplicableScreenTemplates(\n templates: readonly ScreenTemplate[],\n scope: TemplateScope,\n container?: TemplateContainer,\n): ScreenTemplate[] {\n return templates.filter(template => validateScreenTemplateApplicability(template, scope, container).length === 0);\n}\n\nfunction validateRole(name: string, kind: TemplateKind, metadata: TemplateMetadata | undefined, scope: TemplateScope): string[] {\n const problems: string[] = [];\n if (!Object.values(TemplateScope).includes(scope)) {\n problems.push(`Template '${name}' has unknown target scope '${scope}'`);\n } else if ((kind === 'Layout') !== (scope === TemplateScope.Application)) {\n problems.push(`Template '${name}' of kind '${kind}' cannot be applied at scope '${scope}'`);\n }\n if (metadata?.type === 'ApplicationShell' && kind !== 'Layout') {\n problems.push(`Template '${name}' of type 'ApplicationShell' must be a Layout`);\n }\n if (metadata?.type === 'Dialog' && kind !== 'DialogTemplate') {\n problems.push(`Template '${name}' of type 'Dialog' must be a DialogTemplate`);\n }\n if (kind === 'Layout' && ['Workspace', 'List', 'Detail', 'Form'].includes(metadata?.type ?? '')) {\n problems.push(`Template '${name}' of type '${metadata?.type}' must not be a Layout`);\n }\n for (const declaredScope of metadata?.scopes ?? []) {\n if (!Object.values(TemplateScope).includes(declaredScope)) {\n problems.push(`Template '${name}' declares unknown scope '${declaredScope}'`);\n }\n }\n if (metadata?.scopes !== undefined && !metadata.scopes.includes(scope)) {\n problems.push(`Template '${name}' does not declare scope '${scope}'`);\n }\n return problems;\n}\n"],"names":["validateLayoutApplicability","layout","scope","validateRole","name","metadata","validateScreenTemplateApplicability","template","container","problems","fitsSlot","undefined","separator","lastIndexOf","qualifier","slice","slot","slots","some","candidate","push","validateDialogTemplateApplicability","filterApplicableScreenTemplates","templates","filter","length","kind","Object","values","TemplateScope","includes","Application","type","declaredScope","scopes"],"mappings":"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"}
1
+ {"version":3,"file":"templateApplicability.js","sources":["../../templateApplicability.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 { DialogTemplate, Layout, ScreenTemplate, TemplateMetadata, TemplateScope } from '@cratis/scene.model';\n\ntype TemplateKind = 'Layout' | 'ScreenTemplate' | 'DialogTemplate';\n/** The containing layout or screen template against which a fitsSlot selection is checked. */\nexport type TemplateContainer = Pick<Layout, 'name' | 'slots'>;\n\n/** Validates application-shell selection without introducing a competing shell model. */\nexport function validateLayoutApplicability(layout: Layout | undefined, scope: TemplateScope): string[] {\n return layout ? validateRole(layout.name, 'Layout', layout.metadata, scope) : [];\n}\n\n/**\n * Validates selection at any depth of the application hierarchy, including qualified fitsSlot names.\n * Undefined represents outlet-only composition and is valid. Invalid author input is never rewritten.\n */\nexport function validateScreenTemplateApplicability(\n template: ScreenTemplate | undefined,\n scope: TemplateScope,\n container?: TemplateContainer,\n): string[] {\n if (!template) return [];\n const problems = validateRole(template.name, 'ScreenTemplate', template.metadata, scope);\n if (template.fitsSlot !== undefined) {\n const separator = template.fitsSlot.lastIndexOf('.');\n const qualifier = separator < 0 ? undefined : template.fitsSlot.slice(0, separator);\n const slot = separator < 0 ? template.fitsSlot : template.fitsSlot.slice(separator + 1);\n if (!container || (qualifier !== undefined && qualifier !== container.name) || !container.slots.some(candidate => candidate.name === slot)) {\n problems.push(`Template '${template.name}' does not fit slot '${template.fitsSlot}' on '${container?.name ?? '(no container)'}'`);\n }\n }\n return problems;\n}\n\n/** Validates an overlay template separately from slot-based screen composition. */\nexport function validateDialogTemplateApplicability(template: DialogTemplate | undefined, scope: TemplateScope): string[] {\n return template ? validateRole(template.name, 'DialogTemplate', template.metadata, scope) : [];\n}\n\n/** The shared picker predicate uses exactly the same rules as validation on apply. */\nexport function filterApplicableScreenTemplates(\n templates: readonly ScreenTemplate[],\n scope: TemplateScope,\n container?: TemplateContainer,\n): ScreenTemplate[] {\n return templates.filter(template => validateScreenTemplateApplicability(template, scope, container).length === 0);\n}\n\nfunction validateRole(name: string, kind: TemplateKind, metadata: TemplateMetadata | undefined, scope: TemplateScope): string[] {\n const problems: string[] = [];\n if (!Object.values(TemplateScope).includes(scope)) {\n problems.push(`Template '${name}' has unknown target scope '${scope}'`);\n } else if ((kind === 'Layout') !== (scope === TemplateScope.Application)) {\n problems.push(`Template '${name}' of kind '${kind}' cannot be applied at scope '${scope}'`);\n }\n if (metadata?.type === 'ApplicationShell' && kind !== 'Layout') {\n problems.push(`Template '${name}' of type 'ApplicationShell' must be a Layout`);\n }\n if (metadata?.type === 'Dialog' && kind !== 'DialogTemplate') {\n problems.push(`Template '${name}' of type 'Dialog' must be a DialogTemplate`);\n }\n if (kind === 'Layout' && ['Workspace', 'List', 'Detail', 'Form'].includes(metadata?.type ?? '')) {\n problems.push(`Template '${name}' of type '${metadata?.type}' must not be a Layout`);\n }\n for (const declaredScope of metadata?.scopes ?? []) {\n if (!Object.values(TemplateScope).includes(declaredScope)) {\n problems.push(`Template '${name}' declares unknown scope '${declaredScope}'`);\n }\n }\n if (metadata?.scopes !== undefined && !metadata.scopes.includes(scope)) {\n problems.push(`Template '${name}' does not declare scope '${scope}'`);\n }\n return problems;\n}\n"],"names":["validateLayoutApplicability","layout","scope","validateRole","name","metadata","validateScreenTemplateApplicability","template","container","problems","fitsSlot","undefined","separator","lastIndexOf","qualifier","slice","slot","slots","some","candidate","push","validateDialogTemplateApplicability","filterApplicableScreenTemplates","templates","filter","length","kind","Object","values","TemplateScope","includes","Application","type","declaredScope","scopes"],"mappings":";;;;AAAA;AACA;AAQA,0FACO,SAASA,2BAAAA,CAA4BC,MAA0B,EAAEC,KAAoB,EAAA;IACxF,OAAOD,MAAAA,GAASE,YAAAA,CAAaF,MAAAA,CAAOG,IAAI,EAAE,UAAUH,MAAAA,CAAOI,QAAQ,EAAEH,KAAAA,CAAAA,GAAS,EAAE;AACpF;AAEA;;;AAGC,IACM,SAASI,mCAAAA,CACZC,QAAoC,EACpCL,KAAoB,EACpBM,SAA6B,EAAA;IAE7B,IAAI,CAACD,QAAAA,EAAU,OAAO,EAAE;IACxB,MAAME,QAAAA,GAAWN,aAAaI,QAAAA,CAASH,IAAI,EAAE,gBAAA,EAAkBG,QAAAA,CAASF,QAAQ,EAAEH,KAAAA,CAAAA;IAClF,IAAIK,QAAAA,CAASG,QAAQ,KAAKC,SAAAA,EAAW;AACjC,QAAA,MAAMC,SAAAA,GAAYL,QAAAA,CAASG,QAAQ,CAACG,WAAW,CAAC,GAAA,CAAA;QAChD,MAAMC,SAAAA,GAAYF,YAAY,CAAA,GAAID,SAAAA,GAAYJ,SAASG,QAAQ,CAACK,KAAK,CAAC,CAAA,EAAGH,SAAAA,CAAAA;QACzE,MAAMI,IAAAA,GAAOJ,SAAAA,GAAY,CAAA,GAAIL,QAAAA,CAASG,QAAQ,GAAGH,QAAAA,CAASG,QAAQ,CAACK,KAAK,CAACH,SAAAA,GAAY,CAAA,CAAA;AACrF,QAAA,IAAI,CAACJ,SAAAA,IAAcM,SAAAA,KAAcH,aAAaG,SAAAA,KAAcN,SAAAA,CAAUJ,IAAI,IAAK,CAACI,UAAUS,KAAK,CAACC,IAAI,CAACC,CAAAA,YAAaA,SAAAA,CAAUf,IAAI,KAAKY,IAAAA,CAAAA,EAAO;AACxIP,YAAAA,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEb,QAAAA,CAASH,IAAI,CAAC,qBAAqB,EAAEG,QAAAA,CAASG,QAAQ,CAAC,MAAM,EAAEF,WAAWJ,IAAAA,IAAQ,gBAAA,CAAiB,CAAC,CAAC,CAAA;AACpI,QAAA;AACJ,IAAA;IACA,OAAOK,QAAAA;AACX;AAEA,oFACO,SAASY,mCAAAA,CAAoCd,QAAoC,EAAEL,KAAoB,EAAA;IAC1G,OAAOK,QAAAA,GAAWJ,YAAAA,CAAaI,QAAAA,CAASH,IAAI,EAAE,kBAAkBG,QAAAA,CAASF,QAAQ,EAAEH,KAAAA,CAAAA,GAAS,EAAE;AAClG;AAEA,uFACO,SAASoB,+BAAAA,CACZC,SAAoC,EACpCrB,KAAoB,EACpBM,SAA6B,EAAA;IAE7B,OAAOe,SAAAA,CAAUC,MAAM,CAACjB,CAAAA,QAAAA,GAAYD,oCAAoCC,QAAAA,EAAUL,KAAAA,EAAOM,SAAAA,CAAAA,CAAWiB,MAAM,KAAK,CAAA,CAAA;AACnH;AAEA,SAAStB,aAAaC,IAAY,EAAEsB,IAAkB,EAAErB,QAAsC,EAAEH,KAAoB,EAAA;AAChH,IAAA,MAAMO,WAAqB,EAAE;AAC7B,IAAA,IAAI,CAACkB,MAAAA,CAAOC,MAAM,CAACC,yBAAAA,CAAAA,CAAeC,QAAQ,CAAC5B,KAAAA,CAAAA,EAAQ;QAC/CO,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,KAAK,4BAA4B,EAAEF,KAAAA,CAAM,CAAC,CAAC,CAAA;IAC1E,CAAA,MAAO,IAAI,IAACwB,KAAS,QAAA,MAAexB,KAAAA,KAAU2B,yBAAAA,CAAcE,WAAU,CAAA,EAAI;AACtEtB,QAAAA,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,IAAAA,CAAK,WAAW,EAAEsB,IAAAA,CAAK,8BAA8B,EAAExB,KAAAA,CAAM,CAAC,CAAC,CAAA;AAC9F,IAAA;AACA,IAAA,IAAIG,QAAAA,EAAU2B,IAAAA,KAAS,kBAAA,IAAsBN,IAAAA,KAAS,QAAA,EAAU;AAC5DjB,QAAAA,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,IAAAA,CAAK,6CAA6C,CAAC,CAAA;AAClF,IAAA;AACA,IAAA,IAAIC,QAAAA,EAAU2B,IAAAA,KAAS,QAAA,IAAYN,IAAAA,KAAS,gBAAA,EAAkB;AAC1DjB,QAAAA,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,IAAAA,CAAK,2CAA2C,CAAC,CAAA;AAChF,IAAA;AACA,IAAA,IAAIsB,SAAS,QAAA,IAAY;AAAC,QAAA,WAAA;AAAa,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;AAAO,KAAA,CAACI,QAAQ,CAACzB,QAAAA,EAAU2B,IAAAA,IAAQ,EAAA,CAAA,EAAK;QAC7FvB,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,IAAAA,CAAK,WAAW,EAAEC,QAAAA,EAAU2B,IAAAA,CAAK,sBAAsB,CAAC,CAAA;AACvF,IAAA;AACA,IAAA,KAAK,MAAMC,aAAAA,IAAiB5B,QAAAA,EAAU6B,MAAAA,IAAU,EAAE,CAAE;AAChD,QAAA,IAAI,CAACP,MAAAA,CAAOC,MAAM,CAACC,yBAAAA,CAAAA,CAAeC,QAAQ,CAACG,aAAAA,CAAAA,EAAgB;YACvDxB,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,KAAK,0BAA0B,EAAE6B,aAAAA,CAAc,CAAC,CAAC,CAAA;AAChF,QAAA;AACJ,IAAA;IACA,IAAI5B,QAAAA,EAAU6B,WAAWvB,SAAAA,IAAa,CAACN,SAAS6B,MAAM,CAACJ,QAAQ,CAAC5B,KAAAA,CAAAA,EAAQ;QACpEO,QAAAA,CAASW,IAAI,CAAC,CAAC,UAAU,EAAEhB,KAAK,0BAA0B,EAAEF,KAAAA,CAAM,CAAC,CAAC,CAAA;AACxE,IAAA;IACA,OAAOO,QAAAA;AACX;;;;;"}