@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,18 @@
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
+ * Finds the set of a pack that supplies rows for a read model or shape. An explicit mapping whose read model is
7
+ * the target wins; otherwise a set whose shape has the target's name (compared exactly, case-sensitively).
8
+ */ function findSampleDataSet(pack, target, mappings = []) {
9
+ for (const mapping of mappings){
10
+ if (mapping.readModel !== target) continue;
11
+ const mapped = (pack.sets ?? []).find((set)=>set.shape === mapping.shape);
12
+ if (mapped !== undefined) return mapped;
13
+ }
14
+ return (pack.sets ?? []).find((set)=>set.shape === target);
15
+ }
16
+
17
+ exports.findSampleDataSet = findSampleDataSet;
18
+ //# 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;;"}
@@ -0,0 +1,73 @@
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
+ * Finds sample-row literals inside a value: an array holding plain objects of two or more keys, which is what
7
+ * a hand-written list of demo rows looks like. Returns the path of each, e.g. `rows` or `items[2].children`.
8
+ * A single-key object is a choice or a token, not a row, and is not reported.
9
+ *
10
+ * Spec §11 SD1: components keep declaring shapes only, so a component descriptor's defaults and a template's
11
+ * properties must not carry row literals; demo rows belong to sample-data packs.
12
+ *
13
+ * @param value The value to inspect.
14
+ * @param path The path prefix of the value, empty for the root.
15
+ */ function findSampleRowLiterals(value, path = '') {
16
+ const found = [];
17
+ if (Array.isArray(value)) {
18
+ if (value.some(isRow)) found.push(path === '' ? '(root)' : path);
19
+ value.forEach((item, index)=>found.push(...findSampleRowLiterals(item, `${path}[${index}]`)));
20
+ } else if (typeof value === 'object' && value !== null) {
21
+ for (const [key, child] of Object.entries(value)){
22
+ found.push(...findSampleRowLiterals(child, path === '' ? key : `${path}.${key}`));
23
+ }
24
+ }
25
+ return found;
26
+ }
27
+ /**
28
+ * Finds the sample-row literals in the defaults of component descriptors, as `<component>: <property path>`
29
+ * entries (the property path is followed by the location inside the default).
30
+ *
31
+ * @param descriptors The descriptors to inspect.
32
+ */ function findDescriptorSampleRowLiterals(descriptors) {
33
+ const found = [];
34
+ for (const descriptor of descriptors){
35
+ for (const property of descriptor.properties ?? []){
36
+ for (const location of findSampleRowLiterals(property.default)){
37
+ const suffix = location === '(root)' ? '' : location.startsWith('[') ? location : `.${location}`;
38
+ found.push(`${descriptor.component}: ${property.path}${suffix}`);
39
+ }
40
+ }
41
+ }
42
+ return found;
43
+ }
44
+ function isRow(item) {
45
+ return typeof item === 'object' && item !== null && !Array.isArray(item) && Object.keys(item).length >= 2;
46
+ }
47
+ /**
48
+ * Finds the sample-row literals in the element properties of a template's content, as
49
+ * `<componentName>.<property>` entries (with the location inside the value when it is nested). Only property
50
+ * values are scanned: the element tree itself is made of objects and is not data.
51
+ *
52
+ * @param content A template's content, keyed by slot name.
53
+ */ function findTemplateSampleRowLiterals(content) {
54
+ const found = [];
55
+ const visit = (elements)=>{
56
+ for (const element of elements ?? []){
57
+ for (const [name, value] of Object.entries(element.properties ?? {})){
58
+ for (const location of findSampleRowLiterals(value)){
59
+ const suffix = location === '(root)' ? '' : location.startsWith('[') ? location : `.${location}`;
60
+ found.push(`${element.componentName ?? '(unnamed)'}.${name}${suffix}`);
61
+ }
62
+ }
63
+ Object.values(element.slots ?? {}).forEach(visit);
64
+ }
65
+ };
66
+ Object.values(content ?? {}).forEach(visit);
67
+ return found;
68
+ }
69
+
70
+ exports.findDescriptorSampleRowLiterals = findDescriptorSampleRowLiterals;
71
+ exports.findSampleRowLiterals = findSampleRowLiterals;
72
+ exports.findTemplateSampleRowLiterals = findTemplateSampleRowLiterals;
73
+ //# sourceMappingURL=findSampleRowLiterals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSampleRowLiterals.js","sources":["../../../sampleData/findSampleRowLiterals.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 { ComponentDescriptor } from '@cratis/scene.model';\n\n/**\n * Finds sample-row literals inside a value: an array holding plain objects of two or more keys, which is what\n * a hand-written list of demo rows looks like. Returns the path of each, e.g. `rows` or `items[2].children`.\n * A single-key object is a choice or a token, not a row, and is not reported.\n *\n * Spec §11 SD1: components keep declaring shapes only, so a component descriptor's defaults and a template's\n * properties must not carry row literals; demo rows belong to sample-data packs.\n *\n * @param value The value to inspect.\n * @param path The path prefix of the value, empty for the root.\n */\nexport function findSampleRowLiterals(value: unknown, path = ''): string[] {\n const found: string[] = [];\n if (Array.isArray(value)) {\n if (value.some(isRow)) found.push(path === '' ? '(root)' : path);\n value.forEach((item, index) => found.push(...findSampleRowLiterals(item, `${path}[${index}]`)));\n } else if (typeof value === 'object' && value !== null) {\n for (const [key, child] of Object.entries(value)) {\n found.push(...findSampleRowLiterals(child, path === '' ? key : `${path}.${key}`));\n }\n }\n\n return found;\n}\n\n/**\n * Finds the sample-row literals in the defaults of component descriptors, as `<component>: <property path>`\n * entries (the property path is followed by the location inside the default).\n *\n * @param descriptors The descriptors to inspect.\n */\nexport function findDescriptorSampleRowLiterals(descriptors: readonly ComponentDescriptor[]): string[] {\n const found: string[] = [];\n for (const descriptor of descriptors) {\n for (const property of descriptor.properties ?? []) {\n for (const location of findSampleRowLiterals(property.default)) {\n const suffix = location === '(root)' ? '' : (location.startsWith('[') ? location : `.${location}`);\n found.push(`${descriptor.component}: ${property.path}${suffix}`);\n }\n }\n }\n\n return found;\n}\n\nfunction isRow(item: unknown): boolean {\n return typeof item === 'object' && item !== null && !Array.isArray(item) && Object.keys(item).length >= 2;\n}\n\n/** The part of a scene element the scan reads: its properties and the child elements in its slots. */\ninterface ScannedElement {\n componentName?: string;\n properties?: Record<string, unknown>;\n slots?: Record<string, ScannedElement[]>;\n}\n\n/**\n * Finds the sample-row literals in the element properties of a template's content, as\n * `<componentName>.<property>` entries (with the location inside the value when it is nested). Only property\n * values are scanned: the element tree itself is made of objects and is not data.\n *\n * @param content A template's content, keyed by slot name.\n */\nexport function findTemplateSampleRowLiterals(content: Record<string, ScannedElement[]> | undefined): string[] {\n const found: string[] = [];\n const visit = (elements: ScannedElement[] | undefined) => {\n for (const element of elements ?? []) {\n for (const [name, value] of Object.entries(element.properties ?? {})) {\n for (const location of findSampleRowLiterals(value)) {\n const suffix = location === '(root)' ? '' : (location.startsWith('[') ? location : `.${location}`);\n found.push(`${element.componentName ?? '(unnamed)'}.${name}${suffix}`);\n }\n }\n\n Object.values(element.slots ?? {}).forEach(visit);\n }\n };\n\n Object.values(content ?? {}).forEach(visit);\n return found;\n}\n"],"names":["findSampleRowLiterals","value","path","found","Array","isArray","some","isRow","push","forEach","item","index","key","child","Object","entries","findDescriptorSampleRowLiterals","descriptors","descriptor","property","properties","location","default","suffix","startsWith","component","keys","length","findTemplateSampleRowLiterals","content","visit","elements","element","name","componentName","values","slots"],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+ var inferSampleFieldKind = require('./inferSampleFieldKind.js');
5
+ var sampleLocales = require('./sampleLocales.js');
6
+ var SampleRandom = require('./SampleRandom.js');
7
+
8
+ // Copyright (c) Cratis. All rights reserved.
9
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
10
+ /** The seed used when none is given, so previews are stable without any configuration. */ const defaultSampleSeed = 1;
11
+ /** How many rows are generated when no count is given. */ const defaultSampleRowCount = 5;
12
+ /** The most rows one call generates. */ const maximumSampleRowCount = 1000;
13
+ /** Days since 1970-01-01 of 2024-01-01, the anchor generated dates count forward from. */ const anchorDay = 19723;
14
+ /** Generated dates fall within this many days after the anchor. */ const dateSpanDays = 731;
15
+ /**
16
+ * Generates `rowCount` rows of a shape, deterministically for a seed: the same shape, seed, row count and
17
+ * locale yield the same rows (byte-identical once serialized) in the C# and TypeScript engines.
18
+ *
19
+ * Each row has its own generator (see {@link rowSeed}), so row `i` is the same however many rows are asked
20
+ * for. Within a row the fields are generated in declaration order. A nullable field first draws whether it is
21
+ * null (one in five is) and then always draws its value, so the sequence never depends on nullability
22
+ * outcomes. Values follow the field's kind and locale; enum fields only ever produce one of their values,
23
+ * dates stay within 2024-2025 and amounts have two decimals.
24
+ *
25
+ * @param shape The shape to generate rows for.
26
+ * @param seed The seed; defaults to {@link defaultSampleSeed}.
27
+ * @param rowCount The number of rows; defaults to {@link defaultSampleRowCount}, clamped to `[0, 1000]`.
28
+ * @param locale The BCP 47 locale tag selecting names, cities and formats; unknown tags use the default pool.
29
+ */ function generateSample(shape, seed, rowCount, locale) {
30
+ const count = Math.min(Math.max(Math.trunc(rowCount ?? defaultSampleRowCount), 0), maximumSampleRowCount);
31
+ const effectiveSeed = (seed ?? defaultSampleSeed) >>> 0;
32
+ const pool = sampleLocales.sampleLocaleFor(locale);
33
+ const rows = [];
34
+ for(let index = 0; index < count; index++){
35
+ const random = new SampleRandom.SampleRandom(SampleRandom.rowSeed(effectiveSeed, shape.name, index));
36
+ const row = {};
37
+ for (const field of shape.fields){
38
+ const isNull = field.nullable === true && random.nextInt(5) === 0;
39
+ const value = generateValue(field, inferSampleFieldKind.inferSampleFieldKind(field), random, pool);
40
+ row[field.name] = isNull ? null : value;
41
+ }
42
+ rows.push(row);
43
+ }
44
+ return rows;
45
+ }
46
+ function generateValue(field, kind, random, pool) {
47
+ switch(kind){
48
+ case scene_model.SampleFieldKind.Id:
49
+ return generateId(random);
50
+ case scene_model.SampleFieldKind.Name:
51
+ return `${random.pick(pool.firstNames)} ${random.pick(pool.lastNames)}`;
52
+ case scene_model.SampleFieldKind.Company:
53
+ return random.pick(pool.companies);
54
+ case scene_model.SampleFieldKind.Email:
55
+ {
56
+ const first = random.pick(pool.firstNames);
57
+ const last = random.pick(pool.lastNames);
58
+ return `${slug(first)}.${slug(last)}@${random.pick(pool.domains)}`;
59
+ }
60
+ case scene_model.SampleFieldKind.Phone:
61
+ return [
62
+ ...pool.phoneTemplate
63
+ ].map((character)=>character === '#' ? String(random.nextInt(10)) : character).join('');
64
+ case scene_model.SampleFieldKind.City:
65
+ return random.pick(pool.cities);
66
+ case scene_model.SampleFieldKind.Text:
67
+ {
68
+ const words = Array.from({
69
+ length: 3 + random.nextInt(4)
70
+ }, ()=>random.pick(pool.words));
71
+ return capitalize(words.join(' '));
72
+ }
73
+ case scene_model.SampleFieldKind.WholeNumber:
74
+ {
75
+ const [low, high] = range(field.min, field.max, 0, 1000, Math.trunc);
76
+ return low + random.nextInt(high - low + 1);
77
+ }
78
+ case scene_model.SampleFieldKind.Amount:
79
+ {
80
+ const [low, high] = range(field.min, field.max, 10, 5000, (value)=>Math.floor(value * 100 + 0.5));
81
+ return (low + random.nextInt(high - low + 1)) / 100;
82
+ }
83
+ case scene_model.SampleFieldKind.Boolean:
84
+ return random.nextInt(2) === 1;
85
+ case scene_model.SampleFieldKind.Date:
86
+ return formatDay(anchorDay + random.nextInt(dateSpanDays));
87
+ case scene_model.SampleFieldKind.DateTime:
88
+ {
89
+ const day = anchorDay + random.nextInt(dateSpanDays);
90
+ const seconds = random.nextInt(86400);
91
+ return `${formatDay(day)}T${pad(Math.floor(seconds / 3600))}:${pad(Math.floor(seconds / 60) % 60)}:${pad(seconds % 60)}Z`;
92
+ }
93
+ case scene_model.SampleFieldKind.Enum:
94
+ return field.enumValues !== undefined && field.enumValues !== null && field.enumValues.length > 0 ? random.pick(field.enumValues) : null;
95
+ default:
96
+ return null;
97
+ }
98
+ }
99
+ function range(min, max, defaultMin, defaultMax, convert) {
100
+ const low = convert(min ?? defaultMin);
101
+ const high = convert(max ?? defaultMax);
102
+ return high < low ? [
103
+ high,
104
+ low
105
+ ] : [
106
+ low,
107
+ high
108
+ ];
109
+ }
110
+ function generateId(random) {
111
+ const a = random.next();
112
+ const b = (random.next() & 0xFFFF0FFF | 0x00004000) >>> 0;
113
+ const c = (random.next() & 0x3FFFFFFF | 0x80000000) >>> 0;
114
+ const d = random.next();
115
+ return `${hex(a, 8)}-${hex(b >>> 16, 4)}-${hex(b & 0xFFFF, 4)}-${hex(c >>> 16, 4)}-${hex(c & 0xFFFF, 4)}${hex(d, 8)}`;
116
+ }
117
+ const transliterations = new Map([
118
+ [
119
+ 'æ',
120
+ 'ae'
121
+ ],
122
+ [
123
+ 'ø',
124
+ 'o'
125
+ ],
126
+ [
127
+ 'å',
128
+ 'a'
129
+ ],
130
+ [
131
+ 'ä',
132
+ 'a'
133
+ ],
134
+ [
135
+ 'ö',
136
+ 'o'
137
+ ],
138
+ [
139
+ 'ü',
140
+ 'u'
141
+ ],
142
+ [
143
+ 'ß',
144
+ 'ss'
145
+ ],
146
+ [
147
+ 'é',
148
+ 'e'
149
+ ]
150
+ ]);
151
+ function slug(text) {
152
+ let result = '';
153
+ for (const character of text.toLowerCase()){
154
+ const mapped = transliterations.get(character) ?? character;
155
+ for (const part of mapped){
156
+ if (part >= 'a' && part <= 'z' || part >= '0' && part <= '9') result += part;
157
+ }
158
+ }
159
+ return result;
160
+ }
161
+ function capitalize(text) {
162
+ const first = text.charAt(0);
163
+ return first >= 'a' && first <= 'z' ? first.toUpperCase() + text.slice(1) : text;
164
+ }
165
+ function hex(value, digits) {
166
+ return (value >>> 0).toString(16).padStart(digits, '0');
167
+ }
168
+ function pad(value) {
169
+ return value < 10 ? `0${value}` : String(value);
170
+ }
171
+ /** Formats days since 1970-01-01 as `yyyy-MM-dd` (Howard Hinnant's civil-from-days). */ function formatDay(days) {
172
+ const shifted = days + 719468;
173
+ const era = Math.floor(shifted / 146097);
174
+ const dayOfEra = shifted - era * 146097;
175
+ const yearOfEra = Math.floor((dayOfEra - Math.floor(dayOfEra / 1460) + Math.floor(dayOfEra / 36524) - Math.floor(dayOfEra / 146096)) / 365);
176
+ const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));
177
+ const monthPrime = Math.floor((5 * dayOfYear + 2) / 153);
178
+ const day = dayOfYear - Math.floor((153 * monthPrime + 2) / 5) + 1;
179
+ const month = monthPrime < 10 ? monthPrime + 3 : monthPrime - 9;
180
+ const year = yearOfEra + era * 400 + (month <= 2 ? 1 : 0);
181
+ return `${String(year).padStart(4, '0')}-${pad(month)}-${pad(day)}`;
182
+ }
183
+
184
+ exports.defaultSampleRowCount = defaultSampleRowCount;
185
+ exports.defaultSampleSeed = defaultSampleSeed;
186
+ exports.generateSample = generateSample;
187
+ exports.maximumSampleRowCount = maximumSampleRowCount;
188
+ //# sourceMappingURL=generateSample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSample.js","sources":["../../../sampleData/generateSample.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 { SampleFieldKind, SampleShape, SampleShapeField } from '@cratis/scene.model';\nimport { inferSampleFieldKind } from './inferSampleFieldKind';\nimport { SampleLocale, sampleLocaleFor } from './sampleLocales';\nimport { SampleRandom, rowSeed } from './SampleRandom';\n\n/** The seed used when none is given, so previews are stable without any configuration. */\nexport const defaultSampleSeed = 1;\n\n/** How many rows are generated when no count is given. */\nexport const defaultSampleRowCount = 5;\n\n/** The most rows one call generates. */\nexport const maximumSampleRowCount = 1000;\n\n/** Days since 1970-01-01 of 2024-01-01, the anchor generated dates count forward from. */\nconst anchorDay = 19723;\n\n/** Generated dates fall within this many days after the anchor. */\nconst dateSpanDays = 731;\n\n/**\n * Generates `rowCount` rows of a shape, deterministically for a seed: the same shape, seed, row count and\n * locale yield the same rows (byte-identical once serialized) in the C# and TypeScript engines.\n *\n * Each row has its own generator (see {@link rowSeed}), so row `i` is the same however many rows are asked\n * for. Within a row the fields are generated in declaration order. A nullable field first draws whether it is\n * null (one in five is) and then always draws its value, so the sequence never depends on nullability\n * outcomes. Values follow the field's kind and locale; enum fields only ever produce one of their values,\n * dates stay within 2024-2025 and amounts have two decimals.\n *\n * @param shape The shape to generate rows for.\n * @param seed The seed; defaults to {@link defaultSampleSeed}.\n * @param rowCount The number of rows; defaults to {@link defaultSampleRowCount}, clamped to `[0, 1000]`.\n * @param locale The BCP 47 locale tag selecting names, cities and formats; unknown tags use the default pool.\n */\nexport function generateSample(shape: SampleShape, seed?: number, rowCount?: number, locale?: string): Record<string, unknown>[] {\n const count = Math.min(Math.max(Math.trunc(rowCount ?? defaultSampleRowCount), 0), maximumSampleRowCount);\n const effectiveSeed = (seed ?? defaultSampleSeed) >>> 0;\n const pool = sampleLocaleFor(locale);\n const rows: Record<string, unknown>[] = [];\n\n for (let index = 0; index < count; index++) {\n const random = new SampleRandom(rowSeed(effectiveSeed, shape.name, index));\n const row: Record<string, unknown> = {};\n for (const field of shape.fields) {\n const isNull = field.nullable === true && random.nextInt(5) === 0;\n const value = generateValue(field, inferSampleFieldKind(field), random, pool);\n row[field.name] = isNull ? null : value;\n }\n rows.push(row);\n }\n\n return rows;\n}\n\nfunction generateValue(field: SampleShapeField, kind: SampleFieldKind, random: SampleRandom, pool: SampleLocale): unknown {\n switch (kind) {\n case SampleFieldKind.Id:\n return generateId(random);\n case SampleFieldKind.Name:\n return `${random.pick(pool.firstNames)} ${random.pick(pool.lastNames)}`;\n case SampleFieldKind.Company:\n return random.pick(pool.companies);\n case SampleFieldKind.Email: {\n const first = random.pick(pool.firstNames);\n const last = random.pick(pool.lastNames);\n return `${slug(first)}.${slug(last)}@${random.pick(pool.domains)}`;\n }\n case SampleFieldKind.Phone:\n return [...pool.phoneTemplate].map(character => (character === '#' ? String(random.nextInt(10)) : character)).join('');\n case SampleFieldKind.City:\n return random.pick(pool.cities);\n case SampleFieldKind.Text: {\n const words = Array.from({ length: 3 + random.nextInt(4) }, () => random.pick(pool.words));\n return capitalize(words.join(' '));\n }\n case SampleFieldKind.WholeNumber: {\n const [low, high] = range(field.min, field.max, 0, 1000, Math.trunc);\n return low + random.nextInt(high - low + 1);\n }\n case SampleFieldKind.Amount: {\n const [low, high] = range(field.min, field.max, 10, 5000, value => Math.floor(value * 100 + 0.5));\n return (low + random.nextInt(high - low + 1)) / 100;\n }\n case SampleFieldKind.Boolean:\n return random.nextInt(2) === 1;\n case SampleFieldKind.Date:\n return formatDay(anchorDay + random.nextInt(dateSpanDays));\n case SampleFieldKind.DateTime: {\n const day = anchorDay + random.nextInt(dateSpanDays);\n const seconds = random.nextInt(86400);\n return `${formatDay(day)}T${pad(Math.floor(seconds / 3600))}:${pad(Math.floor(seconds / 60) % 60)}:${pad(seconds % 60)}Z`;\n }\n case SampleFieldKind.Enum:\n return field.enumValues !== undefined && field.enumValues !== null && field.enumValues.length > 0 ? random.pick(field.enumValues) : null;\n default:\n return null;\n }\n}\n\nfunction range(min: number | undefined, max: number | undefined, defaultMin: number, defaultMax: number, convert: (value: number) => number): [number, number] {\n const low = convert(min ?? defaultMin);\n const high = convert(max ?? defaultMax);\n return high < low ? [high, low] : [low, high];\n}\n\nfunction generateId(random: SampleRandom): string {\n const a = random.next();\n const b = ((random.next() & 0xFFFF0FFF) | 0x00004000) >>> 0;\n const c = ((random.next() & 0x3FFFFFFF) | 0x80000000) >>> 0;\n const d = random.next();\n return `${hex(a, 8)}-${hex(b >>> 16, 4)}-${hex(b & 0xFFFF, 4)}-${hex(c >>> 16, 4)}-${hex(c & 0xFFFF, 4)}${hex(d, 8)}`;\n}\n\nconst transliterations = new Map<string, string>([['æ', 'ae'], ['ø', 'o'], ['å', 'a'], ['ä', 'a'], ['ö', 'o'], ['ü', 'u'], ['ß', 'ss'], ['é', 'e']]);\n\nfunction slug(text: string): string {\n let result = '';\n for (const character of text.toLowerCase()) {\n const mapped = transliterations.get(character) ?? character;\n for (const part of mapped) {\n if ((part >= 'a' && part <= 'z') || (part >= '0' && part <= '9')) result += part;\n }\n }\n return result;\n}\n\nfunction capitalize(text: string): string {\n const first = text.charAt(0);\n return first >= 'a' && first <= 'z' ? first.toUpperCase() + text.slice(1) : text;\n}\n\nfunction hex(value: number, digits: number): string {\n return (value >>> 0).toString(16).padStart(digits, '0');\n}\n\nfunction pad(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** Formats days since 1970-01-01 as `yyyy-MM-dd` (Howard Hinnant's civil-from-days). */\nfunction formatDay(days: number): string {\n const shifted = days + 719468;\n const era = Math.floor(shifted / 146097);\n const dayOfEra = shifted - era * 146097;\n const yearOfEra = Math.floor((dayOfEra - Math.floor(dayOfEra / 1460) + Math.floor(dayOfEra / 36524) - Math.floor(dayOfEra / 146096)) / 365);\n const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));\n const monthPrime = Math.floor((5 * dayOfYear + 2) / 153);\n const day = dayOfYear - Math.floor((153 * monthPrime + 2) / 5) + 1;\n const month = monthPrime < 10 ? monthPrime + 3 : monthPrime - 9;\n const year = yearOfEra + era * 400 + (month <= 2 ? 1 : 0);\n return `${String(year).padStart(4, '0')}-${pad(month)}-${pad(day)}`;\n}\n"],"names":["defaultSampleSeed","defaultSampleRowCount","maximumSampleRowCount","anchorDay","dateSpanDays","generateSample","shape","seed","rowCount","locale","count","Math","min","max","trunc","effectiveSeed","pool","sampleLocaleFor","rows","index","random","SampleRandom","rowSeed","name","row","field","fields","isNull","nullable","nextInt","value","generateValue","inferSampleFieldKind","push","kind","SampleFieldKind","Id","generateId","Name","pick","firstNames","lastNames","Company","companies","Email","first","last","slug","domains","Phone","phoneTemplate","map","character","String","join","City","cities","Text","words","Array","from","length","capitalize","WholeNumber","low","high","range","Amount","floor","Boolean","Date","formatDay","DateTime","day","seconds","pad","Enum","enumValues","undefined","defaultMin","defaultMax","convert","a","next","b","c","d","hex","transliterations","Map","text","result","toLowerCase","mapped","get","part","charAt","toUpperCase","slice","digits","toString","padStart","days","shifted","era","dayOfEra","yearOfEra","dayOfYear","monthPrime","month","year"],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ const typeKinds = new Map([
8
+ [
9
+ 'guid',
10
+ scene_model.SampleFieldKind.Id
11
+ ],
12
+ [
13
+ 'uuid',
14
+ scene_model.SampleFieldKind.Id
15
+ ],
16
+ [
17
+ 'int',
18
+ scene_model.SampleFieldKind.WholeNumber
19
+ ],
20
+ [
21
+ 'int16',
22
+ scene_model.SampleFieldKind.WholeNumber
23
+ ],
24
+ [
25
+ 'int32',
26
+ scene_model.SampleFieldKind.WholeNumber
27
+ ],
28
+ [
29
+ 'int64',
30
+ scene_model.SampleFieldKind.WholeNumber
31
+ ],
32
+ [
33
+ 'short',
34
+ scene_model.SampleFieldKind.WholeNumber
35
+ ],
36
+ [
37
+ 'long',
38
+ scene_model.SampleFieldKind.WholeNumber
39
+ ],
40
+ [
41
+ 'integer',
42
+ scene_model.SampleFieldKind.WholeNumber
43
+ ],
44
+ [
45
+ 'number',
46
+ scene_model.SampleFieldKind.WholeNumber
47
+ ],
48
+ [
49
+ 'decimal',
50
+ scene_model.SampleFieldKind.Amount
51
+ ],
52
+ [
53
+ 'double',
54
+ scene_model.SampleFieldKind.Amount
55
+ ],
56
+ [
57
+ 'float',
58
+ scene_model.SampleFieldKind.Amount
59
+ ],
60
+ [
61
+ 'single',
62
+ scene_model.SampleFieldKind.Amount
63
+ ],
64
+ [
65
+ 'money',
66
+ scene_model.SampleFieldKind.Amount
67
+ ],
68
+ [
69
+ 'currency',
70
+ scene_model.SampleFieldKind.Amount
71
+ ],
72
+ [
73
+ 'bool',
74
+ scene_model.SampleFieldKind.Boolean
75
+ ],
76
+ [
77
+ 'boolean',
78
+ scene_model.SampleFieldKind.Boolean
79
+ ],
80
+ [
81
+ 'date',
82
+ scene_model.SampleFieldKind.Date
83
+ ],
84
+ [
85
+ 'dateonly',
86
+ scene_model.SampleFieldKind.Date
87
+ ],
88
+ [
89
+ 'datetime',
90
+ scene_model.SampleFieldKind.DateTime
91
+ ],
92
+ [
93
+ 'datetimeoffset',
94
+ scene_model.SampleFieldKind.DateTime
95
+ ],
96
+ [
97
+ 'timestamp',
98
+ scene_model.SampleFieldKind.DateTime
99
+ ]
100
+ ]);
101
+ const nameKinds = [
102
+ [
103
+ [
104
+ 'email'
105
+ ],
106
+ scene_model.SampleFieldKind.Email
107
+ ],
108
+ [
109
+ [
110
+ 'phone',
111
+ 'mobile'
112
+ ],
113
+ scene_model.SampleFieldKind.Phone
114
+ ],
115
+ [
116
+ [
117
+ 'company',
118
+ 'organization',
119
+ 'organisation'
120
+ ],
121
+ scene_model.SampleFieldKind.Company
122
+ ],
123
+ [
124
+ [
125
+ 'city',
126
+ 'town'
127
+ ],
128
+ scene_model.SampleFieldKind.City
129
+ ],
130
+ [
131
+ [
132
+ 'product',
133
+ 'item',
134
+ 'title',
135
+ 'subject',
136
+ 'description'
137
+ ],
138
+ scene_model.SampleFieldKind.Text
139
+ ],
140
+ [
141
+ [
142
+ 'name',
143
+ 'customer',
144
+ 'assignee',
145
+ 'owner',
146
+ 'author',
147
+ 'contact',
148
+ 'manager',
149
+ 'employee'
150
+ ],
151
+ scene_model.SampleFieldKind.Name
152
+ ]
153
+ ];
154
+ /**
155
+ * The kind of value to generate for a field. An explicit `kind` wins; otherwise a field with `enumValues` is
156
+ * an enum, a recognised `type` decides, and failing that the field's name does (an `Id` suffix, `email`,
157
+ * `phone`, `company`, `city`, person-like names), with free text as the fallback. A trailing `?` on the type
158
+ * is ignored and type names compare case-insensitively.
159
+ */ function inferSampleFieldKind(field) {
160
+ if (field.kind !== undefined && field.kind !== null) return field.kind;
161
+ if (field.enumValues !== undefined && field.enumValues !== null && field.enumValues.length > 0) return scene_model.SampleFieldKind.Enum;
162
+ let type = (field.type ?? '').trim().toLowerCase();
163
+ if (type.endsWith('?')) type = type.slice(0, -1);
164
+ const byType = typeKinds.get(type);
165
+ if (byType !== undefined) return byType;
166
+ const name = field.name ?? '';
167
+ const lower = name.toLowerCase();
168
+ if (lower === 'id' || name.length > 2 && name.endsWith('Id')) return scene_model.SampleFieldKind.Id;
169
+ for (const [fragments, kind] of nameKinds){
170
+ if (fragments.some((fragment)=>lower.includes(fragment))) return kind;
171
+ }
172
+ return scene_model.SampleFieldKind.Text;
173
+ }
174
+
175
+ exports.inferSampleFieldKind = inferSampleFieldKind;
176
+ //# sourceMappingURL=inferSampleFieldKind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferSampleFieldKind.js","sources":["../../../sampleData/inferSampleFieldKind.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 { SampleFieldKind, SampleShapeField } from '@cratis/scene.model';\n\nconst typeKinds = new Map<string, SampleFieldKind>([\n ['guid', SampleFieldKind.Id],\n ['uuid', SampleFieldKind.Id],\n ['int', SampleFieldKind.WholeNumber],\n ['int16', SampleFieldKind.WholeNumber],\n ['int32', SampleFieldKind.WholeNumber],\n ['int64', SampleFieldKind.WholeNumber],\n ['short', SampleFieldKind.WholeNumber],\n ['long', SampleFieldKind.WholeNumber],\n ['integer', SampleFieldKind.WholeNumber],\n ['number', SampleFieldKind.WholeNumber],\n ['decimal', SampleFieldKind.Amount],\n ['double', SampleFieldKind.Amount],\n ['float', SampleFieldKind.Amount],\n ['single', SampleFieldKind.Amount],\n ['money', SampleFieldKind.Amount],\n ['currency', SampleFieldKind.Amount],\n ['bool', SampleFieldKind.Boolean],\n ['boolean', SampleFieldKind.Boolean],\n ['date', SampleFieldKind.Date],\n ['dateonly', SampleFieldKind.Date],\n ['datetime', SampleFieldKind.DateTime],\n ['datetimeoffset', SampleFieldKind.DateTime],\n ['timestamp', SampleFieldKind.DateTime],\n]);\n\nconst nameKinds: [string[], SampleFieldKind][] = [\n [['email'], SampleFieldKind.Email],\n [['phone', 'mobile'], SampleFieldKind.Phone],\n [['company', 'organization', 'organisation'], SampleFieldKind.Company],\n [['city', 'town'], SampleFieldKind.City],\n [['product', 'item', 'title', 'subject', 'description'], SampleFieldKind.Text],\n [['name', 'customer', 'assignee', 'owner', 'author', 'contact', 'manager', 'employee'], SampleFieldKind.Name],\n];\n\n/**\n * The kind of value to generate for a field. An explicit `kind` wins; otherwise a field with `enumValues` is\n * an enum, a recognised `type` decides, and failing that the field's name does (an `Id` suffix, `email`,\n * `phone`, `company`, `city`, person-like names), with free text as the fallback. A trailing `?` on the type\n * is ignored and type names compare case-insensitively.\n */\nexport function inferSampleFieldKind(field: SampleShapeField): SampleFieldKind {\n if (field.kind !== undefined && field.kind !== null) return field.kind as SampleFieldKind;\n if (field.enumValues !== undefined && field.enumValues !== null && field.enumValues.length > 0) return SampleFieldKind.Enum;\n\n let type = (field.type ?? '').trim().toLowerCase();\n if (type.endsWith('?')) type = type.slice(0, -1);\n const byType = typeKinds.get(type);\n if (byType !== undefined) return byType;\n\n const name = field.name ?? '';\n const lower = name.toLowerCase();\n if (lower === 'id' || (name.length > 2 && name.endsWith('Id'))) return SampleFieldKind.Id;\n for (const [fragments, kind] of nameKinds) {\n if (fragments.some(fragment => lower.includes(fragment))) return kind;\n }\n\n return SampleFieldKind.Text;\n}\n"],"names":["typeKinds","Map","SampleFieldKind","Id","WholeNumber","Amount","Boolean","Date","DateTime","nameKinds","Email","Phone","Company","City","Text","Name","inferSampleFieldKind","field","kind","undefined","enumValues","length","Enum","type","trim","toLowerCase","endsWith","slice","byType","get","name","lower","fragments","some","fragment","includes"],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ var generateSample = require('./generateSample.js');
4
+ var sampleLocales = require('./sampleLocales.js');
5
+ var findSampleDataSet = require('./findSampleDataSet.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
+ * Resolves the rows to show for a read model or shape at design or preview time, by the order of spec §11.2:
11
+ *
12
+ * 1. the pack bound to the target (`profile.sampleData.bindings`, a rare override);
13
+ * 2. the application's active pack: the UI profile's `sampleData.activePack`, chosen once for the whole
14
+ * application, or the session-only override (`context.sessionActivePack`) the preview strip sets;
15
+ * 3. the default pack of the blueprint the template came from (`blueprintDefaultPack`);
16
+ * 4. generated data typed by field kind ({@link generateSample}), when the request carries a shape.
17
+ *
18
+ * A pack supplies rows when it has a set for the target, by an explicit `shape → read model` mapping or else by
19
+ * name ({@link findSampleDataSet}). A rung that cannot supply rows falls through to the next; an unknown pack
20
+ * id, or a bound pack without the target's shape, is reported in `diagnostics` (an active or blueprint pack
21
+ * that merely lacks the shape is normal and not reported). The locale carried is the supplying pack's; for
22
+ * generated data it is the first existing bound, active or blueprint pack's, else `context.locale`.
23
+ *
24
+ * Outside design and preview (`context.isDesignOrPreview` not true) nothing resolves (spec SD6).
25
+ */ function resolveSampleData(request, context) {
26
+ const target = request.target ?? request.shape?.name ?? '';
27
+ const fallbackLocale = context.locale ?? sampleLocales.defaultSampleLocale;
28
+ const diagnostics = [];
29
+ if (context.isDesignOrPreview !== true) {
30
+ return {
31
+ source: 'disabled',
32
+ locale: fallbackLocale,
33
+ rows: [],
34
+ diagnostics
35
+ };
36
+ }
37
+ const packs = context.packs ?? [];
38
+ const selection = context.profile?.sampleData;
39
+ const mappings = selection?.mappings ?? [];
40
+ const find = (id)=>id === undefined || id === null ? undefined : packs.find((pack)=>pack.id === id);
41
+ const missing = (id, role)=>{
42
+ diagnostics.push({
43
+ code: 'packNotFound',
44
+ message: `The ${role} sample data pack '${id}' is not available`
45
+ });
46
+ };
47
+ const bindingPackId = (selection?.bindings ?? []).find((binding)=>binding.target === target)?.pack;
48
+ const bindingPack = find(bindingPackId);
49
+ if (bindingPackId !== undefined && bindingPack === undefined) {
50
+ missing(bindingPackId, `bound`);
51
+ } else if (bindingPack !== undefined) {
52
+ const set = findSampleDataSet.findSampleDataSet(bindingPack, target, mappings);
53
+ if (set !== undefined) return fromSet('binding', bindingPack, set.shape, set.rows, diagnostics);
54
+ diagnostics.push({
55
+ code: 'shapeNotInPack',
56
+ message: `The bound sample data pack '${bindingPack.id}' has no rows for '${target}'`
57
+ });
58
+ }
59
+ const sessionPackId = context.sessionActivePack;
60
+ const chosenPackId = sessionPackId !== undefined ? sessionPackId : selection?.activePack;
61
+ const activePackId = chosenPackId === '' ? undefined : chosenPackId;
62
+ const activePack = find(activePackId);
63
+ if (activePackId !== undefined && activePackId !== null && activePack === undefined) {
64
+ missing(activePackId, 'active');
65
+ } else if (activePack !== undefined) {
66
+ const set = findSampleDataSet.findSampleDataSet(activePack, target, mappings);
67
+ if (set !== undefined) return fromSet('activePack', activePack, set.shape, set.rows, diagnostics);
68
+ }
69
+ const blueprintPackId = context.blueprintDefaultPack;
70
+ const blueprintPack = find(blueprintPackId);
71
+ if (blueprintPackId !== undefined && blueprintPackId !== null && blueprintPack === undefined) {
72
+ missing(blueprintPackId, 'blueprint default');
73
+ } else if (blueprintPack !== undefined) {
74
+ const set = findSampleDataSet.findSampleDataSet(blueprintPack, target, mappings);
75
+ if (set !== undefined) return fromSet('blueprintDefault', blueprintPack, set.shape, set.rows, diagnostics);
76
+ }
77
+ const locale = bindingPack?.locale ?? activePack?.locale ?? blueprintPack?.locale ?? fallbackLocale;
78
+ if (request.shape === undefined) {
79
+ return {
80
+ source: 'none',
81
+ locale,
82
+ shape: target,
83
+ rows: [],
84
+ diagnostics
85
+ };
86
+ }
87
+ return {
88
+ source: 'generated',
89
+ locale,
90
+ shape: request.shape.name,
91
+ rows: generateSample.generateSample(request.shape, context.seed, context.rowCount, locale),
92
+ diagnostics
93
+ };
94
+ }
95
+ function fromSet(source, pack, shape, rows, diagnostics) {
96
+ return {
97
+ source,
98
+ pack: pack.id,
99
+ locale: pack.locale,
100
+ shape,
101
+ rows: structuredClone(rows),
102
+ diagnostics
103
+ };
104
+ }
105
+
106
+ exports.resolveSampleData = resolveSampleData;
107
+ //# sourceMappingURL=resolveSampleData.js.map