@cratis/scene.engine 4.11.0 → 4.13.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 (218) hide show
  1. package/dist/cjs/forms/CommandFormLayoutDiagnosticCode.js +20 -0
  2. package/dist/cjs/forms/CommandFormLayoutDiagnosticCode.js.map +1 -0
  3. package/dist/cjs/forms/commitCommandFormLayoutDraft.js +12 -0
  4. package/dist/cjs/forms/commitCommandFormLayoutDraft.js.map +1 -0
  5. package/dist/cjs/forms/defaultCommandFormLayout.js +23 -0
  6. package/dist/cjs/forms/defaultCommandFormLayout.js.map +1 -0
  7. package/dist/cjs/forms/formWidthToCss.js +24 -0
  8. package/dist/cjs/forms/formWidthToCss.js.map +1 -0
  9. package/dist/cjs/forms/normalizeCommandFormLayout.js +42 -0
  10. package/dist/cjs/forms/normalizeCommandFormLayout.js.map +1 -0
  11. package/dist/cjs/forms/parseFormWidth.js +34 -0
  12. package/dist/cjs/forms/parseFormWidth.js.map +1 -0
  13. package/dist/cjs/forms/preserveDirtyCommandValues.js +15 -0
  14. package/dist/cjs/forms/preserveDirtyCommandValues.js.map +1 -0
  15. package/dist/cjs/forms/resizeCommandFormColumn.js +27 -0
  16. package/dist/cjs/forms/resizeCommandFormColumn.js.map +1 -0
  17. package/dist/cjs/forms/updateCommandFormFieldPlacement.js +27 -0
  18. package/dist/cjs/forms/updateCommandFormFieldPlacement.js.map +1 -0
  19. package/dist/cjs/forms/validateCommandFormLayout.js +72 -0
  20. package/dist/cjs/forms/validateCommandFormLayout.js.map +1 -0
  21. package/dist/cjs/index.js +40 -0
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/navigation/NavigationDiagnosticCode.js +19 -0
  24. package/dist/cjs/navigation/NavigationDiagnosticCode.js.map +1 -0
  25. package/dist/cjs/navigation/collectOutlets.js +45 -0
  26. package/dist/cjs/navigation/collectOutlets.js.map +1 -0
  27. package/dist/cjs/navigation/diagnoseNavigation.js +116 -0
  28. package/dist/cjs/navigation/diagnoseNavigation.js.map +1 -0
  29. package/dist/cjs/navigation/findHostingCycles.js +43 -0
  30. package/dist/cjs/navigation/findHostingCycles.js.map +1 -0
  31. package/dist/cjs/navigation/navigationEntriesFrom.js +19 -0
  32. package/dist/cjs/navigation/navigationEntriesFrom.js.map +1 -0
  33. package/dist/cjs/navigation/navigationRoute.js +25 -0
  34. package/dist/cjs/navigation/navigationRoute.js.map +1 -0
  35. package/dist/cjs/packageVersionRange.js +16 -0
  36. package/dist/cjs/packageVersionRange.js.map +1 -1
  37. package/dist/cjs/templates/TemplateCatalogKind.js +15 -0
  38. package/dist/cjs/templates/TemplateCatalogKind.js.map +1 -0
  39. package/dist/cjs/templates/describeTemplateCatalog.js +89 -0
  40. package/dist/cjs/templates/describeTemplateCatalog.js.map +1 -0
  41. package/dist/cjs/templates/templateMetadataRules.js +32 -0
  42. package/dist/cjs/templates/templateMetadataRules.js.map +1 -0
  43. package/dist/cjs/templates/validateTemplateMetadata.js +50 -0
  44. package/dist/cjs/templates/validateTemplateMetadata.js.map +1 -0
  45. package/dist/cjs/validateNavigationDestinations.js +12 -38
  46. package/dist/cjs/validateNavigationDestinations.js.map +1 -1
  47. package/dist/esm/forms/CommandFormLayoutDiagnostic.d.ts +7 -0
  48. package/dist/esm/forms/CommandFormLayoutDiagnostic.d.ts.map +1 -0
  49. package/dist/esm/forms/CommandFormLayoutDiagnostic.js +2 -0
  50. package/dist/esm/forms/CommandFormLayoutDiagnostic.js.map +1 -0
  51. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.d.ts +11 -0
  52. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.d.ts.map +1 -0
  53. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.js +18 -0
  54. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.js.map +1 -0
  55. package/dist/esm/forms/CommandFormLayoutDraft.d.ts +9 -0
  56. package/dist/esm/forms/CommandFormLayoutDraft.d.ts.map +1 -0
  57. package/dist/esm/forms/CommandFormLayoutDraft.js +2 -0
  58. package/dist/esm/forms/CommandFormLayoutDraft.js.map +1 -0
  59. package/dist/esm/forms/commitCommandFormLayoutDraft.d.ts +4 -0
  60. package/dist/esm/forms/commitCommandFormLayoutDraft.d.ts.map +1 -0
  61. package/dist/esm/forms/commitCommandFormLayoutDraft.js +10 -0
  62. package/dist/esm/forms/commitCommandFormLayoutDraft.js.map +1 -0
  63. package/dist/esm/forms/defaultCommandFormLayout.d.ts +3 -0
  64. package/dist/esm/forms/defaultCommandFormLayout.d.ts.map +1 -0
  65. package/dist/esm/forms/defaultCommandFormLayout.js +21 -0
  66. package/dist/esm/forms/defaultCommandFormLayout.js.map +1 -0
  67. package/dist/esm/forms/formWidthToCss.d.ts +3 -0
  68. package/dist/esm/forms/formWidthToCss.d.ts.map +1 -0
  69. package/dist/esm/forms/formWidthToCss.js +22 -0
  70. package/dist/esm/forms/formWidthToCss.js.map +1 -0
  71. package/dist/esm/forms/index.d.ts +13 -0
  72. package/dist/esm/forms/index.d.ts.map +1 -0
  73. package/dist/esm/forms/index.js +13 -0
  74. package/dist/esm/forms/index.js.map +1 -0
  75. package/dist/esm/forms/normalizeCommandFormLayout.d.ts +8 -0
  76. package/dist/esm/forms/normalizeCommandFormLayout.d.ts.map +1 -0
  77. package/dist/esm/forms/normalizeCommandFormLayout.js +40 -0
  78. package/dist/esm/forms/normalizeCommandFormLayout.js.map +1 -0
  79. package/dist/esm/forms/parseFormWidth.d.ts +3 -0
  80. package/dist/esm/forms/parseFormWidth.d.ts.map +1 -0
  81. package/dist/esm/forms/parseFormWidth.js +32 -0
  82. package/dist/esm/forms/parseFormWidth.js.map +1 -0
  83. package/dist/esm/forms/preserveDirtyCommandValues.d.ts +2 -0
  84. package/dist/esm/forms/preserveDirtyCommandValues.d.ts.map +1 -0
  85. package/dist/esm/forms/preserveDirtyCommandValues.js +13 -0
  86. package/dist/esm/forms/preserveDirtyCommandValues.js.map +1 -0
  87. package/dist/esm/forms/resizeCommandFormColumn.d.ts +4 -0
  88. package/dist/esm/forms/resizeCommandFormColumn.d.ts.map +1 -0
  89. package/dist/esm/forms/resizeCommandFormColumn.js +25 -0
  90. package/dist/esm/forms/resizeCommandFormColumn.js.map +1 -0
  91. package/dist/esm/forms/updateCommandFormFieldPlacement.d.ts +4 -0
  92. package/dist/esm/forms/updateCommandFormFieldPlacement.d.ts.map +1 -0
  93. package/dist/esm/forms/updateCommandFormFieldPlacement.js +25 -0
  94. package/dist/esm/forms/updateCommandFormFieldPlacement.js.map +1 -0
  95. package/dist/esm/forms/validateCommandFormLayout.d.ts +4 -0
  96. package/dist/esm/forms/validateCommandFormLayout.d.ts.map +1 -0
  97. package/dist/esm/forms/validateCommandFormLayout.js +70 -0
  98. package/dist/esm/forms/validateCommandFormLayout.js.map +1 -0
  99. package/dist/esm/index.d.ts +3 -0
  100. package/dist/esm/index.d.ts.map +1 -1
  101. package/dist/esm/index.js +19 -1
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/navigation/NavigationDiagnostic.d.ts +7 -0
  104. package/dist/esm/navigation/NavigationDiagnostic.d.ts.map +1 -0
  105. package/dist/esm/navigation/NavigationDiagnostic.js +2 -0
  106. package/dist/esm/navigation/NavigationDiagnostic.js.map +1 -0
  107. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts +9 -0
  108. package/dist/esm/navigation/NavigationDiagnosticCode.d.ts.map +1 -0
  109. package/dist/esm/navigation/NavigationDiagnosticCode.js +17 -0
  110. package/dist/esm/navigation/NavigationDiagnosticCode.js.map +1 -0
  111. package/dist/esm/navigation/NavigationEntry.d.ts +6 -0
  112. package/dist/esm/navigation/NavigationEntry.d.ts.map +1 -0
  113. package/dist/esm/navigation/NavigationEntry.js +2 -0
  114. package/dist/esm/navigation/NavigationEntry.js.map +1 -0
  115. package/dist/esm/navigation/NavigationGraph.d.ts +10 -0
  116. package/dist/esm/navigation/NavigationGraph.d.ts.map +1 -0
  117. package/dist/esm/navigation/NavigationGraph.js +2 -0
  118. package/dist/esm/navigation/NavigationGraph.js.map +1 -0
  119. package/dist/esm/navigation/OutletOwner.d.ts +7 -0
  120. package/dist/esm/navigation/OutletOwner.d.ts.map +1 -0
  121. package/dist/esm/navigation/OutletOwner.js +2 -0
  122. package/dist/esm/navigation/OutletOwner.js.map +1 -0
  123. package/dist/esm/navigation/collectOutlets.d.ts +5 -0
  124. package/dist/esm/navigation/collectOutlets.d.ts.map +1 -0
  125. package/dist/esm/navigation/collectOutlets.js +43 -0
  126. package/dist/esm/navigation/collectOutlets.js.map +1 -0
  127. package/dist/esm/navigation/diagnoseNavigation.d.ts +5 -0
  128. package/dist/esm/navigation/diagnoseNavigation.d.ts.map +1 -0
  129. package/dist/esm/navigation/diagnoseNavigation.js +114 -0
  130. package/dist/esm/navigation/diagnoseNavigation.js.map +1 -0
  131. package/dist/esm/navigation/findHostingCycles.d.ts +2 -0
  132. package/dist/esm/navigation/findHostingCycles.d.ts.map +1 -0
  133. package/dist/esm/navigation/findHostingCycles.js +41 -0
  134. package/dist/esm/navigation/findHostingCycles.js.map +1 -0
  135. package/dist/esm/navigation/index.d.ts +8 -0
  136. package/dist/esm/navigation/index.d.ts.map +1 -0
  137. package/dist/esm/navigation/index.js +8 -0
  138. package/dist/esm/navigation/index.js.map +1 -0
  139. package/dist/esm/navigation/navigationEntriesFrom.d.ts +4 -0
  140. package/dist/esm/navigation/navigationEntriesFrom.d.ts.map +1 -0
  141. package/dist/esm/navigation/navigationEntriesFrom.js +17 -0
  142. package/dist/esm/navigation/navigationEntriesFrom.js.map +1 -0
  143. package/dist/esm/navigation/navigationRoute.d.ts +5 -0
  144. package/dist/esm/navigation/navigationRoute.d.ts.map +1 -0
  145. package/dist/esm/navigation/navigationRoute.js +22 -0
  146. package/dist/esm/navigation/navigationRoute.js.map +1 -0
  147. package/dist/esm/packageVersionRange.d.ts +2 -0
  148. package/dist/esm/packageVersionRange.d.ts.map +1 -1
  149. package/dist/esm/packageVersionRange.js +15 -1
  150. package/dist/esm/packageVersionRange.js.map +1 -1
  151. package/dist/esm/templates/TemplateCatalogEntry.d.ts +20 -0
  152. package/dist/esm/templates/TemplateCatalogEntry.d.ts.map +1 -0
  153. package/dist/esm/templates/TemplateCatalogEntry.js +2 -0
  154. package/dist/esm/templates/TemplateCatalogEntry.js.map +1 -0
  155. package/dist/esm/templates/TemplateCatalogKind.d.ts +6 -0
  156. package/dist/esm/templates/TemplateCatalogKind.d.ts.map +1 -0
  157. package/dist/esm/templates/TemplateCatalogKind.js +13 -0
  158. package/dist/esm/templates/TemplateCatalogKind.js.map +1 -0
  159. package/dist/esm/templates/TemplateSource.d.ts +8 -0
  160. package/dist/esm/templates/TemplateSource.d.ts.map +1 -0
  161. package/dist/esm/templates/TemplateSource.js +2 -0
  162. package/dist/esm/templates/TemplateSource.js.map +1 -0
  163. package/dist/esm/templates/describeTemplateCatalog.d.ts +4 -0
  164. package/dist/esm/templates/describeTemplateCatalog.d.ts.map +1 -0
  165. package/dist/esm/templates/describeTemplateCatalog.js +87 -0
  166. package/dist/esm/templates/describeTemplateCatalog.js.map +1 -0
  167. package/dist/esm/templates/index.d.ts +7 -0
  168. package/dist/esm/templates/index.d.ts.map +1 -0
  169. package/dist/esm/templates/index.js +7 -0
  170. package/dist/esm/templates/index.js.map +1 -0
  171. package/dist/esm/templates/templateMetadataRules.d.ts +3 -0
  172. package/dist/esm/templates/templateMetadataRules.d.ts.map +1 -0
  173. package/dist/esm/templates/templateMetadataRules.js +29 -0
  174. package/dist/esm/templates/templateMetadataRules.js.map +1 -0
  175. package/dist/esm/templates/validateTemplateMetadata.d.ts +3 -0
  176. package/dist/esm/templates/validateTemplateMetadata.d.ts.map +1 -0
  177. package/dist/esm/templates/validateTemplateMetadata.js +48 -0
  178. package/dist/esm/templates/validateTemplateMetadata.js.map +1 -0
  179. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  180. package/dist/esm/validateNavigationDestinations.d.ts +5 -5
  181. package/dist/esm/validateNavigationDestinations.d.ts.map +1 -1
  182. package/dist/esm/validateNavigationDestinations.js +12 -38
  183. package/dist/esm/validateNavigationDestinations.js.map +1 -1
  184. package/forms/CommandFormLayoutDiagnostic.ts +13 -0
  185. package/forms/CommandFormLayoutDiagnosticCode.ts +16 -0
  186. package/forms/CommandFormLayoutDraft.ts +15 -0
  187. package/forms/commitCommandFormLayoutDraft.ts +12 -0
  188. package/forms/defaultCommandFormLayout.ts +12 -0
  189. package/forms/formWidthToCss.ts +21 -0
  190. package/forms/index.ts +15 -0
  191. package/forms/normalizeCommandFormLayout.ts +39 -0
  192. package/forms/parseFormWidth.ts +20 -0
  193. package/forms/preserveDirtyCommandValues.ts +13 -0
  194. package/forms/resizeCommandFormColumn.ts +23 -0
  195. package/forms/updateCommandFormFieldPlacement.ts +22 -0
  196. package/forms/validateCommandFormLayout.ts +74 -0
  197. package/index.ts +3 -0
  198. package/navigation/NavigationDiagnostic.ts +18 -0
  199. package/navigation/NavigationDiagnosticCode.ts +26 -0
  200. package/navigation/NavigationEntry.ts +16 -0
  201. package/navigation/NavigationGraph.ts +26 -0
  202. package/navigation/OutletOwner.ts +13 -0
  203. package/navigation/collectOutlets.ts +36 -0
  204. package/navigation/diagnoseNavigation.ts +136 -0
  205. package/navigation/findHostingCycles.ts +41 -0
  206. package/navigation/index.ts +10 -0
  207. package/navigation/navigationEntriesFrom.ts +16 -0
  208. package/navigation/navigationRoute.ts +25 -0
  209. package/package.json +3 -3
  210. package/packageVersionRange.ts +18 -0
  211. package/templates/TemplateCatalogEntry.ts +35 -0
  212. package/templates/TemplateCatalogKind.ts +11 -0
  213. package/templates/TemplateSource.ts +15 -0
  214. package/templates/describeTemplateCatalog.ts +92 -0
  215. package/templates/index.ts +9 -0
  216. package/templates/templateMetadataRules.ts +25 -0
  217. package/templates/validateTemplateMetadata.ts +55 -0
  218. package/validateNavigationDestinations.ts +12 -32
@@ -0,0 +1,70 @@
1
+ import { FormWidthUnit } from '@cratis/scene.model';
2
+ import { CommandFormLayoutDiagnosticCode } from './CommandFormLayoutDiagnosticCode.js';
3
+
4
+ // Copyright (c) Cratis. All rights reserved.
5
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
6
+ /**
7
+ * Validates authored command-form geometry without rewriting invalid drafts.
8
+ */ function validateCommandFormLayout(layout, fields = []) {
9
+ const diagnostics = [];
10
+ const columnIndexes = new Set();
11
+ const knownFields = new Set(fields);
12
+ if (!layout.columns.length) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.EmptyColumns, 'At least one column is required.', 'columns'));
13
+ layout.columns.forEach((column, index)=>{
14
+ if (!Number.isInteger(column.index) || column.index < 1) {
15
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidColumnIndex, `Column ${index + 1} must have a one-based integer index.`, `columns.${index}.index`));
16
+ }
17
+ if (columnIndexes.has(column.index)) {
18
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicateColumn, `Column ${column.index} is declared more than once.`, `columns.${index}.index`));
19
+ }
20
+ columnIndexes.add(column.index);
21
+ validateWidth(column.width, `columns.${index}.width`, diagnostics);
22
+ validateWidth(column.minWidth, `columns.${index}.minWidth`, diagnostics);
23
+ validateWidth(column.maxWidth, `columns.${index}.maxWidth`, diagnostics);
24
+ });
25
+ validateWidth(layout.columnGap, 'columnGap', diagnostics);
26
+ validateWidth(layout.rowGap, 'rowGap', diagnostics);
27
+ const placements = new Set();
28
+ layout.placements.forEach((placement, index)=>{
29
+ if (!placement.field.trim()) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, 'A placement must name its field.', `placements.${index}.field`));
30
+ if (knownFields.size && !knownFields.has(placement.field)) {
31
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, `Placement targets unknown field '${placement.field}'.`, `placements.${index}.field`));
32
+ }
33
+ if (placements.has(placement.field)) {
34
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicatePlacement, `Field '${placement.field}' is placed more than once.`, `placements.${index}.field`));
35
+ }
36
+ placements.add(placement.field);
37
+ if (!Number.isInteger(placement.row) || placement.row < 1 || !Number.isInteger(placement.column) || placement.column < 1 || placement.rowSpan !== undefined && (!Number.isInteger(placement.rowSpan) || placement.rowSpan < 1) || placement.columnSpan !== undefined && (!Number.isInteger(placement.columnSpan) || placement.columnSpan < 1)) {
38
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidPlacement, `Placement for '${placement.field}' must use positive integer row, column and span values.`, `placements.${index}`));
39
+ }
40
+ const span = placement.columnSpan ?? 1;
41
+ if (layout.columns.length && placement.column + span - 1 > layout.columns.length) {
42
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.OutOfBoundsPlacement, `Placement for '${placement.field}' extends beyond the declared columns.`, `placements.${index}.columnSpan`));
43
+ }
44
+ validateWidth(placement.width, `placements.${index}.width`, diagnostics);
45
+ });
46
+ return diagnostics;
47
+ }
48
+ function validateWidth(width, path, diagnostics) {
49
+ if (!width) return;
50
+ if (!Object.values(FormWidthUnit).includes(width.unit)) {
51
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' uses an unsupported unit.`, path));
52
+ return;
53
+ }
54
+ if (width.unit === FormWidthUnit.Auto && width.value !== undefined) {
55
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Automatic width at '${path}' must not carry a numeric value.`, path));
56
+ }
57
+ if (width.unit !== FormWidthUnit.Auto && (width.value === undefined || width.value < 0 || !Number.isFinite(width.value))) {
58
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' must carry a non-negative numeric value.`, path));
59
+ }
60
+ }
61
+ function problem(code, message, path) {
62
+ return {
63
+ code,
64
+ message,
65
+ path
66
+ };
67
+ }
68
+
69
+ export { validateCommandFormLayout };
70
+ //# sourceMappingURL=validateCommandFormLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCommandFormLayout.js","sources":["../../../forms/validateCommandFormLayout.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 { CommandFormLayout, FormWidth, FormWidthUnit } from '@cratis/scene.model';\nimport { CommandFormLayoutDiagnostic } from './CommandFormLayoutDiagnostic';\nimport { CommandFormLayoutDiagnosticCode } from './CommandFormLayoutDiagnosticCode';\n\n/**\n * Validates authored command-form geometry without rewriting invalid drafts.\n */\nexport function validateCommandFormLayout(layout: CommandFormLayout, fields: readonly string[] = []): CommandFormLayoutDiagnostic[] {\n const diagnostics: CommandFormLayoutDiagnostic[] = [];\n const columnIndexes = new Set<number>();\n const knownFields = new Set(fields);\n\n if (!layout.columns.length) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.EmptyColumns, 'At least one column is required.', 'columns'));\n layout.columns.forEach((column, index) => {\n if (!Number.isInteger(column.index) || column.index < 1) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidColumnIndex, `Column ${index + 1} must have a one-based integer index.`, `columns.${index}.index`));\n }\n if (columnIndexes.has(column.index)) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicateColumn, `Column ${column.index} is declared more than once.`, `columns.${index}.index`));\n }\n columnIndexes.add(column.index);\n validateWidth(column.width, `columns.${index}.width`, diagnostics);\n validateWidth(column.minWidth, `columns.${index}.minWidth`, diagnostics);\n validateWidth(column.maxWidth, `columns.${index}.maxWidth`, diagnostics);\n });\n\n validateWidth(layout.columnGap, 'columnGap', diagnostics);\n validateWidth(layout.rowGap, 'rowGap', diagnostics);\n\n const placements = new Set<string>();\n layout.placements.forEach((placement, index) => {\n if (!placement.field.trim()) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, 'A placement must name its field.', `placements.${index}.field`));\n if (knownFields.size && !knownFields.has(placement.field)) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, `Placement targets unknown field '${placement.field}'.`, `placements.${index}.field`));\n }\n if (placements.has(placement.field)) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicatePlacement, `Field '${placement.field}' is placed more than once.`, `placements.${index}.field`));\n }\n placements.add(placement.field);\n if (!Number.isInteger(placement.row) || placement.row < 1 || !Number.isInteger(placement.column) || placement.column < 1 ||\n (placement.rowSpan !== undefined && (!Number.isInteger(placement.rowSpan) || placement.rowSpan < 1)) ||\n (placement.columnSpan !== undefined && (!Number.isInteger(placement.columnSpan) || placement.columnSpan < 1))) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidPlacement, `Placement for '${placement.field}' must use positive integer row, column and span values.`, `placements.${index}`));\n }\n const span = placement.columnSpan ?? 1;\n if (layout.columns.length && placement.column + span - 1 > layout.columns.length) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.OutOfBoundsPlacement, `Placement for '${placement.field}' extends beyond the declared columns.`, `placements.${index}.columnSpan`));\n }\n validateWidth(placement.width, `placements.${index}.width`, diagnostics);\n });\n\n return diagnostics;\n}\n\nfunction validateWidth(width: FormWidth | undefined, path: string, diagnostics: CommandFormLayoutDiagnostic[]): void {\n if (!width) return;\n if (!Object.values(FormWidthUnit).includes(width.unit)) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' uses an unsupported unit.`, path));\n return;\n }\n if (width.unit === FormWidthUnit.Auto && width.value !== undefined) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Automatic width at '${path}' must not carry a numeric value.`, path));\n }\n if (width.unit !== FormWidthUnit.Auto && (width.value === undefined || width.value < 0 || !Number.isFinite(width.value))) {\n diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' must carry a non-negative numeric value.`, path));\n }\n}\n\nfunction problem(code: CommandFormLayoutDiagnosticCode, message: string, path: string): CommandFormLayoutDiagnostic {\n return { code, message, path };\n}\n"],"names":["validateCommandFormLayout","layout","fields","diagnostics","columnIndexes","Set","knownFields","columns","length","push","problem","CommandFormLayoutDiagnosticCode","EmptyColumns","forEach","column","index","Number","isInteger","InvalidColumnIndex","has","DuplicateColumn","add","validateWidth","width","minWidth","maxWidth","columnGap","rowGap","placements","placement","field","trim","MissingField","size","DuplicatePlacement","row","rowSpan","undefined","columnSpan","InvalidPlacement","span","OutOfBoundsPlacement","path","Object","values","FormWidthUnit","includes","unit","InvalidWidth","Auto","value","isFinite","code","message"],"mappings":"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"}
@@ -5,6 +5,7 @@ export * from './BindingDiagnostic';
5
5
  export * from './resolveBindingExpression';
6
6
  export * from './validateBindingExpression';
7
7
  export * from './renderElement';
8
+ export * from './forms';
8
9
  export * from './elementKind';
9
10
  export * from './panelKind';
10
11
  export * from './flowNodeKind';
@@ -23,12 +24,14 @@ export * from './resolvePackageDependencies';
23
24
  export * from './packageCatalog';
24
25
  export * from './resolveScreenTemplates';
25
26
  export * from './templateApplicability';
27
+ export * from './templates';
26
28
  export * from './buildStarterProfile';
27
29
  export * from './incompatibleStarterThemes';
28
30
  export * from './ActionDispatcher';
29
31
  export * from './runActions';
30
32
  export * from './resolveBehaviors';
31
33
  export * from './resolveStrings';
34
+ export * from './navigation';
32
35
  export * from './validateNavigationDestinations';
33
36
  export * from './editing';
34
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kCAAkC,CAAC;AACjD,cAAc,WAAW,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,6 +1,16 @@
1
1
  export { createBindingResolver, resolveBindingExpression } from './resolveBindingExpression.js';
2
2
  export { validateBindingExpression } from './validateBindingExpression.js';
3
3
  export { renderElement } from './renderElement.js';
4
+ export { CommandFormLayoutDiagnosticCode } from './forms/CommandFormLayoutDiagnosticCode.js';
5
+ export { commitCommandFormLayoutDraft } from './forms/commitCommandFormLayoutDraft.js';
6
+ export { defaultCommandFormLayout } from './forms/defaultCommandFormLayout.js';
7
+ export { formWidthToCss } from './forms/formWidthToCss.js';
8
+ export { normalizeCommandFormLayout } from './forms/normalizeCommandFormLayout.js';
9
+ export { parseFormWidth } from './forms/parseFormWidth.js';
10
+ export { preserveDirtyCommandValues } from './forms/preserveDirtyCommandValues.js';
11
+ export { resizeCommandFormColumn } from './forms/resizeCommandFormColumn.js';
12
+ export { updateCommandFormFieldPlacement } from './forms/updateCommandFormFieldPlacement.js';
13
+ export { validateCommandFormLayout } from './forms/validateCommandFormLayout.js';
4
14
  export { isContentControl, isExternalComponent, isItemsControl, isPanel } from './elementKind.js';
5
15
  export { isCanvas, isDockPanel, isGrid, isStackPanel, isWrapPanel } from './panelKind.js';
6
16
  export { isFlowColumn, isFlowContainer, isFlowGrid, isFlowLeaf, isFlowRow, isFlowSlotLeaf } from './flowNodeKind.js';
@@ -16,16 +26,24 @@ export { evaluateFreeformSlotArrangement } from './evaluateFreeformSlotArrangeme
16
26
  export { aggregateContributions } from './aggregateContributions.js';
17
27
  export { applicableThemePackages, incompatiblePackages, isThemeCompatible } from './themeCompatibility.js';
18
28
  export { isPackageSelectionValid } from './PackageSelection.js';
19
- export { isVersionSatisfiedBy } from './packageVersionRange.js';
29
+ export { isValidVersion, isValidVersionRange, isVersionSatisfiedBy } from './packageVersionRange.js';
20
30
  export { resolvePackageDependencies } from './resolvePackageDependencies.js';
21
31
  export { availablePackagesFor, baseComponentLibraries, componentsForPackages, packagesOfKind, toComponentCatalog } from './packageCatalog.js';
22
32
  export { isScreenTemplateResolutionValid, resolveScreenTemplates } from './resolveScreenTemplates.js';
23
33
  export { filterApplicableScreenTemplates, validateDialogTemplateApplicability, validateLayoutApplicability, validateScreenTemplateApplicability } from './templateApplicability.js';
34
+ export { TemplateCatalogKind } from './templates/TemplateCatalogKind.js';
35
+ export { describeTemplateCatalog } from './templates/describeTemplateCatalog.js';
36
+ export { isAbsoluteHttpsUrl, isSpdxExpression } from './templates/templateMetadataRules.js';
37
+ export { validateTemplateMetadata } from './templates/validateTemplateMetadata.js';
24
38
  export { buildStarterProfile } from './buildStarterProfile.js';
25
39
  export { incompatibleStarterThemes } from './incompatibleStarterThemes.js';
26
40
  export { InteractionStop, runActions, runBindings } from './runActions.js';
27
41
  export { resolveApplicationTriggerBehaviors, resolveBehaviors, resolveEventBehaviors, resolveIntervalBehaviors } from './resolveBehaviors.js';
28
42
  export { isStringsReference, resolveStringsInElement, resolveStringsValue } from './resolveStrings.js';
43
+ export { NavigationDiagnosticCode } from './navigation/NavigationDiagnosticCode.js';
44
+ export { diagnoseNavigation } from './navigation/diagnoseNavigation.js';
45
+ export { navigationEntriesFrom } from './navigation/navigationEntriesFrom.js';
46
+ export { authoredRouteKey, navigationTarget } from './navigation/navigationRoute.js';
29
47
  export { validateNavigationDestinations } from './validateNavigationDestinations.js';
30
48
  export { errorDiagnostic, hasErrors, warningDiagnostic } from './editing/diagnostics.js';
31
49
  export { dialogTemplateNodeId, elementNodeId, flowNodeId, freeformNodeId, layoutNodeId, ownerArrangementId, placementNodeId, scopeInstanceId, scopeNodeId, screenNodeId, screenTemplateNodeId, slotNodeId } from './editing/nodeIds.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,7 @@
1
+ import { NavigationDiagnosticCode } from './NavigationDiagnosticCode';
2
+ export interface NavigationDiagnostic {
3
+ code: NavigationDiagnosticCode;
4
+ message: string;
5
+ entry?: string;
6
+ }
7
+ //# sourceMappingURL=NavigationDiagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationDiagnostic.d.ts","sourceRoot":"","sources":["../../../navigation/NavigationDiagnostic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,MAAM,WAAW,oBAAoB;IAEjC,IAAI,EAAE,wBAAwB,CAAC;IAG/B,OAAO,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NavigationDiagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationDiagnostic.js","sourceRoot":"","sources":["../../../navigation/NavigationDiagnostic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare enum NavigationDiagnosticCode {
2
+ DuplicateRoute = "duplicateRoute",
3
+ DuplicateOutlet = "duplicateOutlet",
4
+ MissingOutlet = "missingOutlet",
5
+ IncompatibleOutlet = "incompatibleOutlet",
6
+ NavigationCycle = "navigationCycle",
7
+ UnavailableTarget = "unavailableTarget"
8
+ }
9
+ //# sourceMappingURL=NavigationDiagnosticCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationDiagnosticCode.d.ts","sourceRoot":"","sources":["../../../navigation/NavigationDiagnosticCode.ts"],"names":[],"mappings":"AAOA,oBAAY,wBAAwB;IAEhC,cAAc,mBAAmB;IAGjC,eAAe,oBAAoB;IAGnC,aAAa,kBAAkB;IAG/B,kBAAkB,uBAAuB;IAGzC,eAAe,oBAAoB;IAGnC,iBAAiB,sBAAsB;CAC1C"}
@@ -0,0 +1,17 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ /**
4
+ * What is wrong with a navigation destination. The values are shared with the C# engine so both report
5
+ * the same code for the same model.
6
+ */ var NavigationDiagnosticCode = /*#__PURE__*/ function(NavigationDiagnosticCode) {
7
+ /** Two destinations that go to different targets share one URL. */ NavigationDiagnosticCode["DuplicateRoute"] = "duplicateRoute";
8
+ /** Two surfaces declare an outlet with the same name, so a destination cannot tell them apart. */ NavigationDiagnosticCode["DuplicateOutlet"] = "duplicateOutlet";
9
+ /** A destination names an outlet that no layout or screen template declares. */ NavigationDiagnosticCode["MissingOutlet"] = "missingOutlet";
10
+ /** A destination names an outlet that cannot host what it opens. */ NavigationDiagnosticCode["IncompatibleOutlet"] = "incompatibleOutlet";
11
+ /** Screens are placed in outlets owned by each other, so composition never terminates. */ NavigationDiagnosticCode["NavigationCycle"] = "navigationCycle";
12
+ /** A destination opens a screen or dialog that does not exist, or names nothing to open. */ NavigationDiagnosticCode["UnavailableTarget"] = "unavailableTarget";
13
+ return NavigationDiagnosticCode;
14
+ }({});
15
+
16
+ export { NavigationDiagnosticCode };
17
+ //# sourceMappingURL=NavigationDiagnosticCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationDiagnosticCode.js","sources":["../../../navigation/NavigationDiagnosticCode.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * What is wrong with a navigation destination. The values are shared with the C# engine so both report\n * the same code for the same model.\n */\nexport enum NavigationDiagnosticCode {\n /** Two destinations that go to different targets share one URL. */\n DuplicateRoute = 'duplicateRoute',\n\n /** Two surfaces declare an outlet with the same name, so a destination cannot tell them apart. */\n DuplicateOutlet = 'duplicateOutlet',\n\n /** A destination names an outlet that no layout or screen template declares. */\n MissingOutlet = 'missingOutlet',\n\n /** A destination names an outlet that cannot host what it opens. */\n IncompatibleOutlet = 'incompatibleOutlet',\n\n /** Screens are placed in outlets owned by each other, so composition never terminates. */\n NavigationCycle = 'navigationCycle',\n\n /** A destination opens a screen or dialog that does not exist, or names nothing to open. */\n UnavailableTarget = 'unavailableTarget',\n}\n"],"names":["NavigationDiagnosticCode"],"mappings":"AAAA;AACA;AAEA;;;IAIO,IAAKA,wBAAAA,iBAAAA,SAAAA,wBAAAA,EAAAA;wEACyD,wBAAA,CAAA,gBAAA,CAAA,GAAA,gBAAA;uGAG+B,wBAAA,CAAA,iBAAA,CAAA,GAAA,iBAAA;qFAGlB,wBAAA,CAAA,eAAA,CAAA,GAAA,eAAA;yEAGZ,wBAAA,CAAA,oBAAA,CAAA,GAAA,oBAAA;+FAGsB,wBAAA,CAAA,iBAAA,CAAA,GAAA,iBAAA;iGAGE,wBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAA;AAhBlFA,IAAAA,OAAAA,wBAAAA;AAkBX,CAAA,CAAA,EAAA;;"}
@@ -0,0 +1,6 @@
1
+ import { DestinationReference } from '@cratis/scene.model';
2
+ export interface NavigationEntry {
3
+ id?: string;
4
+ destination: DestinationReference;
5
+ }
6
+ //# sourceMappingURL=NavigationEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationEntry.d.ts","sourceRoot":"","sources":["../../../navigation/NavigationEntry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAM3D,MAAM,WAAW,eAAe;IAE5B,EAAE,CAAC,EAAE,MAAM,CAAC;IAGZ,WAAW,EAAE,oBAAoB,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NavigationEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationEntry.js","sourceRoot":"","sources":["../../../navigation/NavigationEntry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { DialogTemplate, Layout, Screen, ScreenTemplate } from '@cratis/scene.model';
2
+ import { NavigationEntry } from './NavigationEntry';
3
+ export interface NavigationGraph {
4
+ entries: NavigationEntry[];
5
+ screens?: Screen[];
6
+ layouts?: Layout[];
7
+ screenTemplates?: ScreenTemplate[];
8
+ dialogTemplates?: DialogTemplate[];
9
+ }
10
+ //# sourceMappingURL=NavigationGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationGraph.d.ts","sourceRoot":"","sources":["../../../navigation/NavigationGraph.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,MAAM,WAAW,eAAe;IAE5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAG3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAGnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAGnB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAGnC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NavigationGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationGraph.js","sourceRoot":"","sources":["../../../navigation/NavigationGraph.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { Outlet } from '@cratis/scene.model';
2
+ export interface OutletOwner {
3
+ outlet: Outlet;
4
+ owner: string;
5
+ ownerKind: 'Layout' | 'ScreenTemplate';
6
+ }
7
+ //# sourceMappingURL=OutletOwner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutletOwner.d.ts","sourceRoot":"","sources":["../../../navigation/OutletOwner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAK7C,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,QAAQ,GAAG,gBAAgB,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=OutletOwner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutletOwner.js","sourceRoot":"","sources":["../../../navigation/OutletOwner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { NavigationDiagnostic } from './NavigationDiagnostic';
2
+ import { NavigationGraph } from './NavigationGraph';
3
+ import { OutletOwner } from './OutletOwner';
4
+ export declare function collectOutlets(graph: NavigationGraph, diagnostics: NavigationDiagnostic[]): Map<string, OutletOwner>;
5
+ //# sourceMappingURL=collectOutlets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectOutlets.d.ts","sourceRoot":"","sources":["../../../navigation/collectOutlets.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAuBpH"}
@@ -0,0 +1,43 @@
1
+ import { NavigationDiagnosticCode } from './NavigationDiagnosticCode.js';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Indexes every declared outlet by name, keeping the first declaration and reporting each later one as a
7
+ * duplicate - a destination names an outlet only by name, so two of them are ambiguous.
8
+ */ function collectOutlets(graph, diagnostics) {
9
+ const owners = new Map();
10
+ const surfaces = [
11
+ ...(graph.layouts ?? []).map((layout)=>({
12
+ name: layout.name,
13
+ kind: 'Layout',
14
+ outlets: layout.outlets ?? []
15
+ })),
16
+ ...(graph.screenTemplates ?? []).map((template)=>({
17
+ name: template.name,
18
+ kind: 'ScreenTemplate',
19
+ outlets: template.outlets ?? []
20
+ }))
21
+ ];
22
+ for (const surface of surfaces){
23
+ for (const outlet of surface.outlets){
24
+ const existing = owners.get(outlet.name);
25
+ if (existing) {
26
+ diagnostics.push({
27
+ code: NavigationDiagnosticCode.DuplicateOutlet,
28
+ message: `Outlet '${outlet.name}' is declared by both '${existing.owner}' and '${surface.name}'; destinations cannot tell them apart.`
29
+ });
30
+ continue;
31
+ }
32
+ owners.set(outlet.name, {
33
+ outlet,
34
+ owner: surface.name,
35
+ ownerKind: surface.kind
36
+ });
37
+ }
38
+ }
39
+ return owners;
40
+ }
41
+
42
+ export { collectOutlets };
43
+ //# sourceMappingURL=collectOutlets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectOutlets.js","sources":["../../../navigation/collectOutlets.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 { NavigationDiagnostic } from './NavigationDiagnostic';\nimport { NavigationDiagnosticCode } from './NavigationDiagnosticCode';\nimport { NavigationGraph } from './NavigationGraph';\nimport { OutletOwner } from './OutletOwner';\n\n/**\n * Indexes every declared outlet by name, keeping the first declaration and reporting each later one as a\n * duplicate - a destination names an outlet only by name, so two of them are ambiguous.\n */\nexport function collectOutlets(graph: NavigationGraph, diagnostics: NavigationDiagnostic[]): Map<string, OutletOwner> {\n const owners = new Map<string, OutletOwner>();\n const surfaces = [\n ...(graph.layouts ?? []).map(layout => ({ name: layout.name, kind: 'Layout' as const, outlets: layout.outlets ?? [] })),\n ...(graph.screenTemplates ?? []).map(template => ({ name: template.name, kind: 'ScreenTemplate' as const, outlets: template.outlets ?? [] })),\n ];\n\n for (const surface of surfaces) {\n for (const outlet of surface.outlets) {\n const existing = owners.get(outlet.name);\n if (existing) {\n diagnostics.push({\n code: NavigationDiagnosticCode.DuplicateOutlet,\n message: `Outlet '${outlet.name}' is declared by both '${existing.owner}' and '${surface.name}'; destinations cannot tell them apart.`,\n });\n continue;\n }\n\n owners.set(outlet.name, { outlet, owner: surface.name, ownerKind: surface.kind });\n }\n }\n\n return owners;\n}\n"],"names":["collectOutlets","graph","diagnostics","owners","Map","surfaces","layouts","map","layout","name","kind","outlets","screenTemplates","template","surface","outlet","existing","get","push","code","NavigationDiagnosticCode","DuplicateOutlet","message","owner","set","ownerKind"],"mappings":";;AAAA;AACA;AAOA;;;AAGC,IACM,SAASA,cAAAA,CAAeC,KAAsB,EAAEC,WAAmC,EAAA;AACtF,IAAA,MAAMC,SAAS,IAAIC,GAAAA,EAAAA;AACnB,IAAA,MAAMC,QAAAA,GAAW;WACV,CAACJ,KAAAA,CAAMK,OAAO,IAAI,EAAE,EAAEC,GAAG,CAACC,CAAAA,MAAAA,IAAW;AAAEC,gBAAAA,IAAAA,EAAMD,OAAOC,IAAI;gBAAEC,IAAAA,EAAM,QAAA;gBAAmBC,OAAAA,EAASH,MAAAA,CAAOG,OAAO,IAAI;aAAG,CAAA,CAAA;WACjH,CAACV,KAAAA,CAAMW,eAAe,IAAI,EAAE,EAAEL,GAAG,CAACM,CAAAA,QAAAA,IAAa;AAAEJ,gBAAAA,IAAAA,EAAMI,SAASJ,IAAI;gBAAEC,IAAAA,EAAM,gBAAA;gBAA2BC,OAAAA,EAASE,QAAAA,CAASF,OAAO,IAAI;aAAG,CAAA;AAC7I,KAAA;IAED,KAAK,MAAMG,WAAWT,QAAAA,CAAU;AAC5B,QAAA,KAAK,MAAMU,MAAAA,IAAUD,OAAAA,CAAQH,OAAO,CAAE;AAClC,YAAA,MAAMK,QAAAA,GAAWb,MAAAA,CAAOc,GAAG,CAACF,OAAON,IAAI,CAAA;AACvC,YAAA,IAAIO,QAAAA,EAAU;AACVd,gBAAAA,WAAAA,CAAYgB,IAAI,CAAC;AACbC,oBAAAA,IAAAA,EAAMC,yBAAyBC,eAAe;AAC9CC,oBAAAA,OAAAA,EAAS,CAAC,QAAQ,EAAEP,MAAAA,CAAON,IAAI,CAAC,uBAAuB,EAAEO,QAAAA,CAASO,KAAK,CAAC,OAAO,EAAET,QAAQL,IAAI,CAAC,uCAAuC;AACzI,iBAAA,CAAA;AACA,gBAAA;AACJ,YAAA;AAEAN,YAAAA,MAAAA,CAAOqB,GAAG,CAACT,MAAAA,CAAON,IAAI,EAAE;AAAEM,gBAAAA,MAAAA;AAAQQ,gBAAAA,KAAAA,EAAOT,QAAQL,IAAI;AAAEgB,gBAAAA,SAAAA,EAAWX,QAAQJ;AAAK,aAAA,CAAA;AACnF,QAAA;AACJ,IAAA;IAEA,OAAOP,MAAAA;AACX;;"}
@@ -0,0 +1,5 @@
1
+ import { NavigationDiagnostic } from './NavigationDiagnostic';
2
+ import { NavigationGraph } from './NavigationGraph';
3
+ import { NavigationRouteKey } from './navigationRoute';
4
+ export declare function diagnoseNavigation(graph: NavigationGraph, routeKey?: NavigationRouteKey): NavigationDiagnostic[];
5
+ //# sourceMappingURL=diagnoseNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnoseNavigation.d.ts","sourceRoot":"","sources":["../../../navigation/diagnoseNavigation.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAsC,MAAM,mBAAmB,CAAC;AAW3F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,GAAE,kBAAqC,GAAG,oBAAoB,EAAE,CA6ClI"}
@@ -0,0 +1,114 @@
1
+ import { DestinationKind } from '@cratis/scene.model';
2
+ import { collectOutlets } from './collectOutlets.js';
3
+ import { findHostingCycles } from './findHostingCycles.js';
4
+ import { NavigationDiagnosticCode } from './NavigationDiagnosticCode.js';
5
+ import { authoredRouteKey, navigationTarget } from './navigationRoute.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
+ * Diagnoses how destinations, outlets, routes and targets fit together: duplicate routes, duplicate,
11
+ * missing or incompatible outlets, hosting cycles and unavailable targets.
12
+ *
13
+ * Routes are compared by `routeKey` - by default the authored route override, since the engine constructs no
14
+ * URLs. Nothing is rewritten. The C# engine (`NavigationDiagnostics.Diagnose`) reports the same codes and
15
+ * messages in the same order for the same model; both are asserted against `navigation-diagnostic-fixtures.json`.
16
+ */ function diagnoseNavigation(graph, routeKey = authoredRouteKey) {
17
+ const diagnostics = [];
18
+ const outlets = collectOutlets(graph, diagnostics);
19
+ const screens = graph.screens ? new Map(graph.screens.map((screen)=>[
20
+ screen.name,
21
+ screen
22
+ ])) : undefined;
23
+ const routes = new Map();
24
+ const hostedIn = new Map();
25
+ graph.entries.forEach((navigationEntry, index)=>{
26
+ const entry = navigationEntry.id ?? `#${index + 1}`;
27
+ const destination = navigationEntry.destination;
28
+ const kind = destination.kind ?? (destination.dialog ? DestinationKind.Dialog : DestinationKind.Outlet);
29
+ const report = (code, message)=>diagnostics.push({
30
+ code,
31
+ message,
32
+ entry
33
+ });
34
+ if (!destination.screen && !destination.module && !destination.route && !destination.dialog) {
35
+ report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' names no screen, stable identity, route or dialog.`);
36
+ return;
37
+ }
38
+ diagnoseTarget(graph, screens, destination, kind, entry, report);
39
+ const owner = diagnoseOutlet(graph, outlets, screens, destination, kind, entry, report);
40
+ if (owner?.ownerKind === 'ScreenTemplate' && destination.screen && screens?.has(destination.screen)) {
41
+ const hosts = graph.screens.filter((screen)=>screen.screenTemplate === owner.owner).map((screen)=>screen.name);
42
+ hostedIn.set(destination.screen, [
43
+ ...new Set([
44
+ ...hostedIn.get(destination.screen) ?? [],
45
+ ...hosts
46
+ ])
47
+ ]);
48
+ }
49
+ const route = kind === DestinationKind.External ? undefined : routeKey(destination);
50
+ if (route) {
51
+ const target = navigationTarget(destination, kind);
52
+ const existing = routes.get(route);
53
+ if (!existing) {
54
+ routes.set(route, {
55
+ entry,
56
+ target
57
+ });
58
+ } else if (existing.target !== target) {
59
+ report(NavigationDiagnosticCode.DuplicateRoute, `Route '${destination.route ?? route}' is used by destinations '${existing.entry}' and '${entry}', which open different targets.`);
60
+ }
61
+ }
62
+ });
63
+ for (const cycle of findHostingCycles(graph.screens?.map((screen)=>screen.name) ?? [], hostedIn)){
64
+ diagnostics.push({
65
+ code: NavigationDiagnosticCode.NavigationCycle,
66
+ message: `Navigation cycle ${[
67
+ ...cycle,
68
+ cycle[0]
69
+ ].join(' -> ')}: each screen is placed in an outlet owned by the next, so composition never terminates.`
70
+ });
71
+ }
72
+ return diagnostics;
73
+ }
74
+ function diagnoseTarget(graph, screens, destination, kind, entry, report) {
75
+ if (kind === DestinationKind.Dialog) {
76
+ if (!destination.dialog) {
77
+ report(NavigationDiagnosticCode.UnavailableTarget, `Dialog destination '${entry}' names no dialog.`);
78
+ } else if (graph.dialogTemplates && !graph.dialogTemplates.some((template)=>template.name === destination.dialog)) {
79
+ report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' opens dialog '${destination.dialog}', which no dialog template provides.`);
80
+ }
81
+ return;
82
+ }
83
+ if (kind === DestinationKind.Outlet && destination.screen && screens && !screens.has(destination.screen)) {
84
+ report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' opens screen '${destination.screen}', which does not exist.`);
85
+ }
86
+ }
87
+ function diagnoseOutlet(graph, outlets, screens, destination, kind, entry, report) {
88
+ if (!destination.outlet) return undefined;
89
+ if (kind !== DestinationKind.Outlet) {
90
+ const opens = kind === DestinationKind.Dialog ? 'a dialog' : 'an external target';
91
+ report(NavigationDiagnosticCode.IncompatibleOutlet, `Destination '${entry}' opens ${opens} but names outlet '${destination.outlet}'; only outlet destinations render in outlets.`);
92
+ return undefined;
93
+ }
94
+ const owner = outlets.get(destination.outlet);
95
+ if (!owner) {
96
+ report(NavigationDiagnosticCode.MissingOutlet, `Destination '${entry}' targets missing outlet '${destination.outlet}'.`);
97
+ return undefined;
98
+ }
99
+ const screen = destination.screen ? screens?.get(destination.screen) : undefined;
100
+ if (!screen) return owner;
101
+ if (owner.ownerKind === 'Layout' && screen.layout !== owner.owner) {
102
+ report(NavigationDiagnosticCode.IncompatibleOutlet, `Outlet '${owner.outlet.name}' belongs to layout '${owner.owner}', but destination '${entry}' places '${screen.name}', which renders in layout '${screen.layout}'.`);
103
+ }
104
+ if (owner.outlet.accepts) {
105
+ const type = graph.screenTemplates?.find((template)=>template.name === screen.screenTemplate)?.metadata?.type;
106
+ if (!type || !owner.outlet.accepts.includes(type)) {
107
+ report(NavigationDiagnosticCode.IncompatibleOutlet, `Outlet '${owner.outlet.name}' accepts ${owner.outlet.accepts.join(', ')} screens, but destination '${entry}' places '${screen.name}' of type '${type ?? 'untyped'}'.`);
108
+ }
109
+ }
110
+ return owner;
111
+ }
112
+
113
+ export { diagnoseNavigation };
114
+ //# sourceMappingURL=diagnoseNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnoseNavigation.js","sources":["../../../navigation/diagnoseNavigation.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 { DestinationKind, DestinationReference, Screen } from '@cratis/scene.model';\nimport { collectOutlets } from './collectOutlets';\nimport { findHostingCycles } from './findHostingCycles';\nimport { NavigationDiagnostic } from './NavigationDiagnostic';\nimport { NavigationDiagnosticCode } from './NavigationDiagnosticCode';\nimport { NavigationGraph } from './NavigationGraph';\nimport { NavigationRouteKey, authoredRouteKey, navigationTarget } from './navigationRoute';\nimport { OutletOwner } from './OutletOwner';\n\n/**\n * Diagnoses how destinations, outlets, routes and targets fit together: duplicate routes, duplicate,\n * missing or incompatible outlets, hosting cycles and unavailable targets.\n *\n * Routes are compared by `routeKey` - by default the authored route override, since the engine constructs no\n * URLs. Nothing is rewritten. The C# engine (`NavigationDiagnostics.Diagnose`) reports the same codes and\n * messages in the same order for the same model; both are asserted against `navigation-diagnostic-fixtures.json`.\n */\nexport function diagnoseNavigation(graph: NavigationGraph, routeKey: NavigationRouteKey = authoredRouteKey): NavigationDiagnostic[] {\n const diagnostics: NavigationDiagnostic[] = [];\n const outlets = collectOutlets(graph, diagnostics);\n const screens = graph.screens ? new Map(graph.screens.map(screen => [screen.name, screen])) : undefined;\n const routes = new Map<string, { entry: string; target: string }>();\n const hostedIn = new Map<string, string[]>();\n\n graph.entries.forEach((navigationEntry, index) => {\n const entry = navigationEntry.id ?? `#${index + 1}`;\n const destination = navigationEntry.destination;\n const kind = destination.kind ?? (destination.dialog ? DestinationKind.Dialog : DestinationKind.Outlet);\n const report = (code: NavigationDiagnosticCode, message: string) => diagnostics.push({ code, message, entry });\n\n if (!destination.screen && !destination.module && !destination.route && !destination.dialog) {\n report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' names no screen, stable identity, route or dialog.`);\n return;\n }\n\n diagnoseTarget(graph, screens, destination, kind, entry, report);\n const owner = diagnoseOutlet(graph, outlets, screens, destination, kind, entry, report);\n if (owner?.ownerKind === 'ScreenTemplate' && destination.screen && screens?.has(destination.screen)) {\n const hosts = graph.screens!.filter(screen => screen.screenTemplate === owner.owner).map(screen => screen.name);\n hostedIn.set(destination.screen, [...new Set([...(hostedIn.get(destination.screen) ?? []), ...hosts])]);\n }\n\n const route = kind === DestinationKind.External ? undefined : routeKey(destination);\n if (route) {\n const target = navigationTarget(destination, kind);\n const existing = routes.get(route);\n if (!existing) {\n routes.set(route, { entry, target });\n } else if (existing.target !== target) {\n report(NavigationDiagnosticCode.DuplicateRoute, `Route '${destination.route ?? route}' is used by destinations '${existing.entry}' and '${entry}', which open different targets.`);\n }\n }\n });\n\n for (const cycle of findHostingCycles(graph.screens?.map(screen => screen.name) ?? [], hostedIn)) {\n diagnostics.push({\n code: NavigationDiagnosticCode.NavigationCycle,\n message: `Navigation cycle ${[...cycle, cycle[0]].join(' -> ')}: each screen is placed in an outlet owned by the next, so composition never terminates.`,\n });\n }\n\n return diagnostics;\n}\n\ntype Report = (code: NavigationDiagnosticCode, message: string) => void;\n\nfunction diagnoseTarget(\n graph: NavigationGraph,\n screens: Map<string, Screen> | undefined,\n destination: DestinationReference,\n kind: DestinationKind,\n entry: string,\n report: Report,\n) {\n if (kind === DestinationKind.Dialog) {\n if (!destination.dialog) {\n report(NavigationDiagnosticCode.UnavailableTarget, `Dialog destination '${entry}' names no dialog.`);\n } else if (graph.dialogTemplates && !graph.dialogTemplates.some(template => template.name === destination.dialog)) {\n report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' opens dialog '${destination.dialog}', which no dialog template provides.`);\n }\n return;\n }\n\n if (kind === DestinationKind.Outlet && destination.screen && screens && !screens.has(destination.screen)) {\n report(NavigationDiagnosticCode.UnavailableTarget, `Destination '${entry}' opens screen '${destination.screen}', which does not exist.`);\n }\n}\n\nfunction diagnoseOutlet(\n graph: NavigationGraph,\n outlets: Map<string, OutletOwner>,\n screens: Map<string, Screen> | undefined,\n destination: DestinationReference,\n kind: DestinationKind,\n entry: string,\n report: Report,\n): OutletOwner | undefined {\n if (!destination.outlet) return undefined;\n\n if (kind !== DestinationKind.Outlet) {\n const opens = kind === DestinationKind.Dialog ? 'a dialog' : 'an external target';\n report(NavigationDiagnosticCode.IncompatibleOutlet, `Destination '${entry}' opens ${opens} but names outlet '${destination.outlet}'; only outlet destinations render in outlets.`);\n return undefined;\n }\n\n const owner = outlets.get(destination.outlet);\n if (!owner) {\n report(NavigationDiagnosticCode.MissingOutlet, `Destination '${entry}' targets missing outlet '${destination.outlet}'.`);\n return undefined;\n }\n\n const screen = destination.screen ? screens?.get(destination.screen) : undefined;\n if (!screen) return owner;\n\n if (owner.ownerKind === 'Layout' && screen.layout !== owner.owner) {\n report(\n NavigationDiagnosticCode.IncompatibleOutlet,\n `Outlet '${owner.outlet.name}' belongs to layout '${owner.owner}', but destination '${entry}' places '${screen.name}', which renders in layout '${screen.layout}'.`,\n );\n }\n\n if (owner.outlet.accepts) {\n const type = graph.screenTemplates?.find(template => template.name === screen.screenTemplate)?.metadata?.type;\n if (!type || !owner.outlet.accepts.includes(type)) {\n report(\n NavigationDiagnosticCode.IncompatibleOutlet,\n `Outlet '${owner.outlet.name}' accepts ${owner.outlet.accepts.join(', ')} screens, but destination '${entry}' places '${screen.name}' of type '${type ?? 'untyped'}'.`,\n );\n }\n }\n\n return owner;\n}\n"],"names":["diagnoseNavigation","graph","routeKey","authoredRouteKey","diagnostics","outlets","collectOutlets","screens","Map","map","screen","name","undefined","routes","hostedIn","entries","forEach","navigationEntry","index","entry","id","destination","kind","dialog","DestinationKind","Dialog","Outlet","report","code","message","push","module","route","NavigationDiagnosticCode","UnavailableTarget","diagnoseTarget","owner","diagnoseOutlet","ownerKind","has","hosts","filter","screenTemplate","set","Set","get","External","target","navigationTarget","existing","DuplicateRoute","cycle","findHostingCycles","NavigationCycle","join","dialogTemplates","some","template","outlet","opens","IncompatibleOutlet","MissingOutlet","layout","accepts","type","screenTemplates","find","metadata","includes"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function findHostingCycles(screens: string[], edges: Map<string, string[]>): string[][];
2
+ //# sourceMappingURL=findHostingCycles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findHostingCycles.d.ts","sourceRoot":"","sources":["../../../navigation/findHostingCycles.ts"],"names":[],"mappings":"AASA,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CA+B7F"}
@@ -0,0 +1,41 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ /**
4
+ * Finds cycles in a "renders inside" graph, where an edge from a screen to another means the first is
5
+ * placed in an outlet the second one's template owns. Screens are visited in the given order and edges in
6
+ * insertion order, so the same graph always yields the same cycles in the same order. Each set of screens
7
+ * is reported once, starting from the screen the walk reached it through.
8
+ */ function findHostingCycles(screens, edges) {
9
+ const state = new Map();
10
+ const stack = [];
11
+ const reported = new Set();
12
+ const cycles = [];
13
+ const visit = (screen)=>{
14
+ state.set(screen, 'visiting');
15
+ stack.push(screen);
16
+ for (const host of edges.get(screen) ?? []){
17
+ const hostState = state.get(host);
18
+ if (hostState === 'visiting') {
19
+ const cycle = stack.slice(stack.indexOf(host));
20
+ const key = [
21
+ ...cycle
22
+ ].sort().join('\u0000');
23
+ if (!reported.has(key)) {
24
+ reported.add(key);
25
+ cycles.push(cycle);
26
+ }
27
+ } else if (hostState === undefined) {
28
+ visit(host);
29
+ }
30
+ }
31
+ stack.pop();
32
+ state.set(screen, 'done');
33
+ };
34
+ for (const screen of screens){
35
+ if (!state.has(screen)) visit(screen);
36
+ }
37
+ return cycles;
38
+ }
39
+
40
+ export { findHostingCycles };
41
+ //# sourceMappingURL=findHostingCycles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findHostingCycles.js","sources":["../../../navigation/findHostingCycles.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Finds cycles in a \"renders inside\" graph, where an edge from a screen to another means the first is\n * placed in an outlet the second one's template owns. Screens are visited in the given order and edges in\n * insertion order, so the same graph always yields the same cycles in the same order. Each set of screens\n * is reported once, starting from the screen the walk reached it through.\n */\nexport function findHostingCycles(screens: string[], edges: Map<string, string[]>): string[][] {\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n const reported = new Set<string>();\n const cycles: string[][] = [];\n\n const visit = (screen: string) => {\n state.set(screen, 'visiting');\n stack.push(screen);\n for (const host of edges.get(screen) ?? []) {\n const hostState = state.get(host);\n if (hostState === 'visiting') {\n const cycle = stack.slice(stack.indexOf(host));\n const key = [...cycle].sort().join('\\u0000');\n if (!reported.has(key)) {\n reported.add(key);\n cycles.push(cycle);\n }\n } else if (hostState === undefined) {\n visit(host);\n }\n }\n stack.pop();\n state.set(screen, 'done');\n };\n\n for (const screen of screens) {\n if (!state.has(screen)) visit(screen);\n }\n\n return cycles;\n}\n"],"names":["findHostingCycles","screens","edges","state","Map","stack","reported","Set","cycles","visit","screen","set","push","host","get","hostState","cycle","slice","indexOf","key","sort","join","has","add","undefined","pop"],"mappings":"AAAA;AACA;AAEA;;;;;AAKC,IACM,SAASA,iBAAAA,CAAkBC,OAAiB,EAAEC,KAA4B,EAAA;AAC7E,IAAA,MAAMC,QAAQ,IAAIC,GAAAA,EAAAA;AAClB,IAAA,MAAMC,QAAkB,EAAE;AAC1B,IAAA,MAAMC,WAAW,IAAIC,GAAAA,EAAAA;AACrB,IAAA,MAAMC,SAAqB,EAAE;AAE7B,IAAA,MAAMC,QAAQ,CAACC,MAAAA,GAAAA;QACXP,KAAAA,CAAMQ,GAAG,CAACD,MAAAA,EAAQ,UAAA,CAAA;AAClBL,QAAAA,KAAAA,CAAMO,IAAI,CAACF,MAAAA,CAAAA;AACX,QAAA,KAAK,MAAMG,IAAAA,IAAQX,KAAAA,CAAMY,GAAG,CAACJ,MAAAA,CAAAA,IAAW,EAAE,CAAE;YACxC,MAAMK,SAAAA,GAAYZ,KAAAA,CAAMW,GAAG,CAACD,IAAAA,CAAAA;AAC5B,YAAA,IAAIE,cAAc,UAAA,EAAY;AAC1B,gBAAA,MAAMC,QAAQX,KAAAA,CAAMY,KAAK,CAACZ,KAAAA,CAAMa,OAAO,CAACL,IAAAA,CAAAA,CAAAA;AACxC,gBAAA,MAAMM,GAAAA,GAAM;AAAIH,oBAAAA,GAAAA;iBAAM,CAACI,IAAI,EAAA,CAAGC,IAAI,CAAC,QAAA,CAAA;AACnC,gBAAA,IAAI,CAACf,QAAAA,CAASgB,GAAG,CAACH,GAAAA,CAAAA,EAAM;AACpBb,oBAAAA,QAAAA,CAASiB,GAAG,CAACJ,GAAAA,CAAAA;AACbX,oBAAAA,MAAAA,CAAOI,IAAI,CAACI,KAAAA,CAAAA;AAChB,gBAAA;YACJ,CAAA,MAAO,IAAID,cAAcS,SAAAA,EAAW;gBAChCf,KAAAA,CAAMI,IAAAA,CAAAA;AACV,YAAA;AACJ,QAAA;AACAR,QAAAA,KAAAA,CAAMoB,GAAG,EAAA;QACTtB,KAAAA,CAAMQ,GAAG,CAACD,MAAAA,EAAQ,MAAA,CAAA;AACtB,IAAA,CAAA;IAEA,KAAK,MAAMA,UAAUT,OAAAA,CAAS;AAC1B,QAAA,IAAI,CAACE,KAAAA,CAAMmB,GAAG,CAACZ,SAASD,KAAAA,CAAMC,MAAAA,CAAAA;AAClC,IAAA;IAEA,OAAOF,MAAAA;AACX;;"}
@@ -0,0 +1,8 @@
1
+ export * from './NavigationDiagnostic';
2
+ export * from './NavigationDiagnosticCode';
3
+ export * from './NavigationEntry';
4
+ export * from './NavigationGraph';
5
+ export * from './diagnoseNavigation';
6
+ export * from './navigationEntriesFrom';
7
+ export * from './navigationRoute';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../navigation/index.ts"],"names":[],"mappings":"AAGA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}