@webiny/website-builder-sdk 6.3.0 → 6.4.0-beta.1

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 (154) hide show
  1. package/BindingsApi.js +29 -36
  2. package/BindingsApi.js.map +1 -1
  3. package/BindingsProcessor.js +34 -43
  4. package/BindingsProcessor.js.map +1 -1
  5. package/BindingsProcessor.test.js +82 -78
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.js +92 -119
  8. package/BindingsResolver.js.map +1 -1
  9. package/BindingsResolver.test.js +399 -363
  10. package/BindingsResolver.test.js.map +1 -1
  11. package/ComponentInputTraverser.js +28 -49
  12. package/ComponentInputTraverser.js.map +1 -1
  13. package/ComponentManifestToAstConverter.js +20 -21
  14. package/ComponentManifestToAstConverter.js.map +1 -1
  15. package/ComponentRegistry.js +26 -45
  16. package/ComponentRegistry.js.map +1 -1
  17. package/ComponentResolver.js +25 -29
  18. package/ComponentResolver.js.map +1 -1
  19. package/ConstraintEvaluator.js +246 -353
  20. package/ConstraintEvaluator.js.map +1 -1
  21. package/ConstraintEvaluator.test.js +1616 -1438
  22. package/ConstraintEvaluator.test.js.map +1 -1
  23. package/ContentSdk.js +83 -90
  24. package/ContentSdk.js.map +1 -1
  25. package/DocumentStore.js +47 -59
  26. package/DocumentStore.js.map +1 -1
  27. package/DocumentStoreManager.js +17 -16
  28. package/DocumentStoreManager.js.map +1 -1
  29. package/EditingSdk.js +87 -121
  30. package/EditingSdk.js.map +1 -1
  31. package/ElementFactory.js +126 -174
  32. package/ElementFactory.js.map +1 -1
  33. package/ElementFactory.test.js +234 -263
  34. package/ElementFactory.test.js.map +1 -1
  35. package/Environment.js +18 -19
  36. package/Environment.js.map +1 -1
  37. package/FunctionConverter.js +8 -7
  38. package/FunctionConverter.js.map +1 -1
  39. package/HashObject.js +11 -26
  40. package/HashObject.js.map +1 -1
  41. package/HotkeyManager.js +40 -47
  42. package/HotkeyManager.js.map +1 -1
  43. package/IBindingsUpdater.js +0 -3
  44. package/IRedirects.js +0 -3
  45. package/InheritanceProcessor.js +99 -139
  46. package/InheritanceProcessor.js.map +1 -1
  47. package/InheritanceProcessor.test.js +178 -179
  48. package/InheritanceProcessor.test.js.map +1 -1
  49. package/InheritedValueResolver.js +15 -20
  50. package/InheritedValueResolver.js.map +1 -1
  51. package/InputBindingsProcessor.js +187 -307
  52. package/InputBindingsProcessor.js.map +1 -1
  53. package/InputsBindingsProcessor.test.js +334 -315
  54. package/InputsBindingsProcessor.test.js.map +1 -1
  55. package/InputsUpdater.js +23 -26
  56. package/InputsUpdater.js.map +1 -1
  57. package/LiveSdk.js +12 -13
  58. package/LiveSdk.js.map +1 -1
  59. package/Logger.js +9 -8
  60. package/Logger.js.map +1 -1
  61. package/MouseTracker.js +77 -83
  62. package/MouseTracker.js.map +1 -1
  63. package/NullSdk.js +22 -21
  64. package/NullSdk.js.map +1 -1
  65. package/PreviewDocument.js +27 -30
  66. package/PreviewDocument.js.map +1 -1
  67. package/PreviewSdk.js +16 -17
  68. package/PreviewSdk.js.map +1 -1
  69. package/PreviewViewport.js +51 -63
  70. package/PreviewViewport.js.map +1 -1
  71. package/ResizeObserver.js +24 -31
  72. package/ResizeObserver.js.map +1 -1
  73. package/StylesBindingsProcessor.js +40 -79
  74. package/StylesBindingsProcessor.js.map +1 -1
  75. package/StylesUpdater.js +20 -25
  76. package/StylesUpdater.js.map +1 -1
  77. package/Theme.js +28 -25
  78. package/Theme.js.map +1 -1
  79. package/ViewportManager.js +89 -101
  80. package/ViewportManager.js.map +1 -1
  81. package/constants.js +7 -6
  82. package/constants.js.map +1 -1
  83. package/createElement.js +5 -6
  84. package/createElement.js.map +1 -1
  85. package/createInput.js +85 -143
  86. package/createInput.js.map +1 -1
  87. package/createTheme.js +2 -3
  88. package/createTheme.js.map +1 -1
  89. package/dataProviders/ApiClient.js +40 -49
  90. package/dataProviders/ApiClient.js.map +1 -1
  91. package/dataProviders/DefaultDataProvider.js +56 -58
  92. package/dataProviders/DefaultDataProvider.js.map +1 -1
  93. package/dataProviders/GET_PAGE_BY_ID.js +2 -1
  94. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  95. package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
  96. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  97. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  98. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  99. package/dataProviders/NullDataProvider.js +21 -20
  100. package/dataProviders/NullDataProvider.js.map +1 -1
  101. package/dataProviders/RedirectsProvider.js +24 -27
  102. package/dataProviders/RedirectsProvider.js.map +1 -1
  103. package/defaultBreakpoints.js +23 -22
  104. package/defaultBreakpoints.js.map +1 -1
  105. package/documentOperations/$addElementReferenceToParent.js +29 -32
  106. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  107. package/documentOperations/AddElement.js +8 -7
  108. package/documentOperations/AddElement.js.map +1 -1
  109. package/documentOperations/AddToParent.js +14 -13
  110. package/documentOperations/AddToParent.js.map +1 -1
  111. package/documentOperations/IDocumentOperation.js +0 -3
  112. package/documentOperations/RemoveElement.js +9 -15
  113. package/documentOperations/RemoveElement.js.map +1 -1
  114. package/documentOperations/SetGlobalInputBinding.js +23 -22
  115. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  116. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  117. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  118. package/documentOperations/SetInputBindingOverride.js +30 -29
  119. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  120. package/documentOperations/SetStyleBindingOverride.js +30 -31
  121. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  122. package/documentOperations/index.js +9 -8
  123. package/documentOperations/index.js.map +1 -1
  124. package/findMatchingAstNode.js +11 -13
  125. package/findMatchingAstNode.js.map +1 -1
  126. package/generateElementId.js +2 -1
  127. package/generateElementId.js.map +1 -1
  128. package/headersProvider.js +4 -3
  129. package/headersProvider.js.map +1 -1
  130. package/index.js +0 -2
  131. package/jsonPatch.js +5 -9
  132. package/jsonPatch.js.map +1 -1
  133. package/messages.js +12 -11
  134. package/messages.js.map +1 -1
  135. package/messenger/MessageOrigin.js +12 -11
  136. package/messenger/MessageOrigin.js.map +1 -1
  137. package/messenger/Messenger.js +58 -69
  138. package/messenger/Messenger.js.map +1 -1
  139. package/messenger/index.js +0 -2
  140. package/package.json +5 -5
  141. package/registerComponentGroup.js +5 -6
  142. package/registerComponentGroup.js.map +1 -1
  143. package/types/ShorthandCssProperties.js +0 -3
  144. package/types/WebsiteBuilderTheme.js +0 -3
  145. package/types.d.ts +3 -0
  146. package/types.js +0 -3
  147. package/IBindingsUpdater.js.map +0 -1
  148. package/IRedirects.js.map +0 -1
  149. package/documentOperations/IDocumentOperation.js.map +0 -1
  150. package/index.js.map +0 -1
  151. package/messenger/index.js.map +0 -1
  152. package/types/ShorthandCssProperties.js.map +0 -1
  153. package/types/WebsiteBuilderTheme.js.map +0 -1
  154. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["describe","it","expect","evaluateConstraints","evaluateDeleteConstraint","makeElement","id","componentName","parent","type","component","name","makeManifest","overrides","label","inputs","tags","makeDocument","elements","bindings","elementMap","el","state","version","properties","metadata","extensions","doc","components","Container","Button","result","parentId","slot","document","allowed","toBe","violation","toBeUndefined","TabPanel","constraints","ctx","block","toBeDefined","message","Tabs","root","section","Page","Section","ProductPrice","isDescendantOf","inner","ProductBox","child1","child2","children","static","Grid","Cell","slotChildCount","hero","Hero","countInstances","Widget","child","leftColumn","rightColumn","TwoColumn","leftResult","rightResult","Error","isChildOf","FunnelField","hasTag","ancestor","getAncestor","undefined","hero1","hero2","capturedComponent","toEqual","grandparentName","grandparent","getParent","parentResult","capturedIndex","capturedCount","childIndex","childCount","step","capturedIsLast","capturedIsFirst","FunnelBuilder","Step","isLastChild","isFirstChild","step0","step1","step2","steps","list","captured","comps","index","count","isFirst","isLast","descendantConstraints","TextField","container","page","elementId","canDelete","GridColumn","funnel","step3","Funnel","capturedCtx"],"sources":["ConstraintEvaluator.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { evaluateConstraints, evaluateDeleteConstraint } from \"./ConstraintEvaluator.js\";\nimport type { ComponentManifest, Document, DocumentElement, ConstraintContext } from \"~/types.js\";\n\nfunction makeElement(\n id: string,\n componentName: string,\n parent?: { id: string; slot: string }\n): DocumentElement {\n return {\n type: \"Webiny/Element\",\n id,\n component: { name: componentName },\n parent\n };\n}\n\nfunction makeManifest(name: string, overrides?: Partial<ComponentManifest>): ComponentManifest {\n return { name, label: name, inputs: [], tags: [], ...overrides };\n}\n\nfunction makeDocument(elements: DocumentElement[], bindings: Document[\"bindings\"] = {}): Document {\n const elementMap: Record<string, DocumentElement> = {};\n for (const el of elements) {\n elementMap[el.id] = el;\n }\n return {\n id: \"doc-1\",\n state: {},\n version: 1,\n properties: {},\n metadata: {},\n extensions: {},\n bindings,\n elements: elementMap\n };\n}\n\ndescribe(\"evaluateConstraints\", () => {\n it(\"should allow placement when there are no constraints\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n expect(result.violation).toBeUndefined();\n });\n\n it(\"should block when component's parent constraint fails\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.parent.name !== \"Tabs\") {\n return ctx.block(\"TabPanel must be inside Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation).toBeDefined();\n expect(result.violation!.message).toBe(\"TabPanel must be inside Tabs\");\n });\n\n it(\"should allow when parent constraint passes\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.parent.name !== \"Tabs\") {\n return ctx.block(\"TabPanel must be inside Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n expect(result.violation).toBeUndefined();\n });\n\n it(\"should block when ancestor constraint fails\", () => {\n const root = makeElement(\"root\", \"Page\");\n const section = makeElement(\"section-1\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, section]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"ProductPrice must be inside a ProductBox\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"section-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"ProductPrice must be inside a ProductBox\");\n });\n\n it(\"should allow when grandparent matches ancestor constraint\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner-1\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"ProductPrice must be inside a ProductBox\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block via slot children limit constraint using slotChildCount\", () => {\n const parent = makeElement(\"parent-1\", \"Grid\");\n const child1 = makeElement(\"child-1\", \"Cell\", { id: \"parent-1\", slot: \"children\" });\n const child2 = makeElement(\"child-2\", \"Cell\", { id: \"parent-1\", slot: \"children\" });\n const doc = makeDocument([parent, child1, child2], {\n \"parent-1\": {\n inputs: {\n children: {\n id: \"inp-1\",\n type: \"slot\",\n static: [\"child-1\", \"child-2\"]\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n Cell: makeManifest(\"Cell\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 2)) {\n return ctx.block(\"Maximum 2 children allowed\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Cell\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Maximum 2 children allowed\");\n });\n\n it(\"should block via countInstances when max instances reached\", () => {\n const root = makeElement(\"root\", \"Page\");\n const hero = makeElement(\"hero-1\", \"Hero\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, hero]);\n\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Hero: makeManifest(\"Hero\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Hero\") < 1)) {\n return ctx.block(\"Only one Hero per page\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Hero\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Only one Hero per page\");\n });\n\n it(\"should not evaluate parent's constraints against the placed component\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\", {\n constraints: [\n (ctx: ConstraintContext) => ctx.block(\"This should not run for children\")\n ]\n }),\n Button: makeManifest(\"Button\")\n };\n\n // Parent's constraints should not affect children being dropped into it\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should short-circuit on the first failed constraint\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {},\n (ctx: ConstraintContext) => ctx.block(\"Always fails\"),\n (ctx: ConstraintContext) => ctx.block(\"Also fails\")\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Always fails\");\n });\n\n it(\"should allow placement when component manifest is not found\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Unknown\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow placement when parent element is not found\", () => {\n const doc = makeDocument([]);\n\n const components: Record<string, ComponentManifest> = {\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"nonexistent\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should handle multi-slot parent constraint checking specific slot\", () => {\n const parent = makeElement(\"parent-1\", \"TwoColumn\");\n const child = makeElement(\"child-1\", \"Widget\", {\n id: \"parent-1\",\n slot: \"leftColumn\"\n });\n const doc = makeDocument([parent, child], {\n \"parent-1\": {\n inputs: {\n leftColumn: {\n id: \"inp-left\",\n type: \"slot\",\n static: [\"child-1\"]\n },\n rightColumn: {\n id: \"inp-right\",\n type: \"slot\",\n static: []\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n TwoColumn: makeManifest(\"TwoColumn\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 1)) {\n return ctx.block(\"Slot is full\");\n }\n }\n ]\n })\n };\n\n // leftColumn is full\n const leftResult = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"leftColumn\",\n document: doc,\n components\n });\n expect(leftResult.allowed).toBe(false);\n\n // rightColumn is empty\n const rightResult = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"rightColumn\",\n document: doc,\n components\n });\n expect(rightResult.allowed).toBe(true);\n });\n\n it(\"should provide a default message when constraint has no message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [(ctx: ConstraintContext) => ctx.block(\"Blocked\")]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.violation!.message).toBe(\"Blocked\");\n });\n\n it(\"should use thrown error message as the violation message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n throw new Error(`Widget cannot be placed inside ${ctx.parent.name}`);\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Widget cannot be placed inside Container\");\n });\n\n it(\"should fall back to static message when a non-Error is thrown\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {\n throw \"not an error object\";\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot place Widget here.\");\n });\n\n it(\"should fall back to default message when a non-Error is thrown and no static message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {\n throw null;\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot place Widget here.\");\n });\n\n describe(\"ctx.isChildOf\", () => {\n it(\"should return true when direct parent matches\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isChildOf(\"Tabs\")) {\n return ctx.block(\"TabPanel must be a direct child of Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return false when direct parent does not match\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isChildOf(\"Tabs\")) {\n return ctx.block(\"TabPanel must be a direct child of Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.isDescendantOf\", () => {\n it(\"should return true when direct parent matches\", () => {\n const parent = makeElement(\"parent-1\", \"ProductBox\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return true when grandparent matches\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return false when no ancestor matches\", () => {\n const root = makeElement(\"root\", \"Page\");\n const inner = makeElement(\"inner\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.slotChildCount\", () => {\n it(\"should return the number of children in the target slot\", () => {\n const parent = makeElement(\"parent-1\", \"Grid\");\n const doc = makeDocument([parent], {\n \"parent-1\": {\n inputs: {\n children: {\n id: \"inp-1\",\n type: \"slot\",\n static: [\"child-1\", \"child-2\", \"child-3\"]\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n Cell: makeManifest(\"Cell\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 3)) {\n return ctx.block(\"Max 3 children\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Cell\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n\n it(\"should return 0 when slot has no bindings\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 5)) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n });\n\n describe(\"ctx.hasTag\", () => {\n it(\"should return true when the placed component has the tag\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n FunnelField: makeManifest(\"FunnelField\", {\n tags: [\"funnel-field\", \"input\"],\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Funnel fields not allowed here\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"FunnelField\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n\n it(\"should return false when the placed component does not have the tag\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Button: makeManifest(\"Button\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n });\n\n describe(\"ctx.getAncestor\", () => {\n it(\"should return the matching ancestor element context\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\", { tags: [\"product\"] }),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n const ancestor = ctx.getAncestor(\"ProductBox\");\n if (!(ancestor !== undefined && ancestor.name === \"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return undefined when no ancestor matches\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.getAncestor(\"ProductBox\") === undefined) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.countInstances\", () => {\n it(\"should count instances of a component in the document\", () => {\n const root = makeElement(\"root\", \"Page\");\n const hero1 = makeElement(\"hero-1\", \"Hero\", { id: \"root\", slot: \"children\" });\n const hero2 = makeElement(\"hero-2\", \"Hero\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, hero1, hero2]);\n\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Hero: makeManifest(\"Hero\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Hero\") < 2)) {\n return ctx.block(\"Max 2 Heroes\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Hero\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.component\", () => {\n it(\"should expose the placed component's name and tags\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n let capturedComponent: { name: string; tags: string[] } | undefined;\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n tags: [\"interactive\", \"form\"],\n constraints: [\n (ctx: ConstraintContext) => {\n capturedComponent = ctx.component;\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedComponent).toBeDefined();\n expect(capturedComponent!.name).toBe(\"Widget\");\n expect(capturedComponent!.tags).toEqual([\"interactive\", \"form\"]);\n });\n });\n\n describe(\"parent.getParent\", () => {\n it(\"should return the grandparent element context\", () => {\n const root = makeElement(\"root\", \"Page\");\n const section = makeElement(\"section\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, section]);\n\n let grandparentName: string | undefined;\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n const grandparent = ctx.parent.getParent();\n grandparentName = grandparent?.name;\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"section\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(grandparentName).toBe(\"Page\");\n });\n\n it(\"should return undefined for root element\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n\n let parentResult: unknown = \"not-called\";\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n parentResult = ctx.parent.getParent();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(parentResult).toBeUndefined();\n });\n });\n\n describe(\"parent.childIndex / childCount / isFirstChild / isLastChild\", () => {\n it(\"should return -1 for elements not in a list slot\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n\n let capturedIndex: number | undefined;\n let capturedCount: number | undefined;\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedCount = ctx.parent.childCount();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIndex).toBe(-1);\n expect(capturedCount).toBe(-1);\n });\n\n it(\"should parse child index from list slot path\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps/2/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: [\"step-0\"] },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: [\"step-other\"] },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: [\"step-1\"] }\n }\n }\n });\n\n let capturedIndex: number | undefined;\n let capturedCount: number | undefined;\n let capturedIsLast: boolean | undefined;\n let capturedIsFirst: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedCount = ctx.parent.childCount();\n capturedIsLast = ctx.parent.isLastChild();\n capturedIsFirst = ctx.parent.isFirstChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIndex).toBe(2);\n expect(capturedCount).toBe(3);\n expect(capturedIsLast).toBe(true);\n expect(capturedIsFirst).toBe(false);\n });\n\n it(\"should identify the first child correctly\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step = makeElement(\"step-0\", \"Step\", { id: \"root\", slot: \"steps/0/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: [\"step-0\"] },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: [\"step-1\"] }\n }\n }\n });\n\n let capturedIsFirst: boolean | undefined;\n let capturedIsLast: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIsFirst = ctx.parent.isFirstChild();\n capturedIsLast = ctx.parent.isLastChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-0\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIsFirst).toBe(true);\n expect(capturedIsLast).toBe(false);\n });\n\n it(\"should resolve position from bindings even when element.parent.slot is stale\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n // Element says slot \"steps/1/step\" but bindings put it at steps/3/step\n const step = makeElement(\"step-final\", \"Step\", {\n id: \"root\",\n slot: \"steps/1/step\"\n });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-0\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-1\" },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: \"step-2\" },\n \"steps/3/step\": { id: \"s3\", type: \"slot\", static: \"step-final\" }\n }\n }\n });\n\n let capturedIndex: number | undefined;\n let capturedIsLast: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedIsLast = ctx.parent.isLastChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-final\",\n slot: \"children\",\n document: doc,\n components\n });\n\n // Should find actual position (index 3, last) not stale slot (index 1)\n expect(capturedIndex).toBe(3);\n expect(capturedIsLast).toBe(true);\n });\n\n it(\"should resolve position from direct list slot binding (static is an array of IDs)\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step0 = makeElement(\"step-0\", \"Step\", { id: \"root\", slot: \"steps\" });\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"root\", slot: \"steps\" });\n const doc = makeDocument([root, step0, step1, step2], {\n root: {\n inputs: {\n steps: {\n id: \"s\",\n type: \"slot\",\n list: true,\n static: [\"step-0\", \"step-1\", \"step-2\"]\n }\n }\n }\n });\n\n let captured: Record<string, any> = {};\n const comps: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n captured = {\n index: ctx.parent.childIndex(),\n count: ctx.parent.childCount(),\n isFirst: ctx.parent.isFirstChild(),\n isLast: ctx.parent.isLastChild()\n };\n }\n ]\n })\n };\n\n // Place into first step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-0\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(0);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(true);\n expect(captured.isLast).toBe(false);\n\n // Place into middle step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(1);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(false);\n expect(captured.isLast).toBe(false);\n\n // Place into last step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-2\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(2);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(false);\n expect(captured.isLast).toBe(true);\n });\n });\n\n describe(\"descendantConstraints\", () => {\n it(\"should block a direct child via parent's descendantConstraints\", () => {\n const parent = makeElement(\"parent-1\", \"Step\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"No funnel fields allowed\");\n }\n }\n ]\n }),\n TextField: makeManifest(\"TextField\", { tags: [\"funnel-field\"] })\n };\n\n const result = evaluateConstraints({\n componentName: \"TextField\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"No funnel fields allowed\");\n });\n\n it(\"should block a nested descendant via ancestor's descendantConstraints\", () => {\n const step = makeElement(\"step-1\", \"Step\");\n const container = makeElement(\"container-1\", \"Container\", {\n id: \"step-1\",\n slot: \"children\"\n });\n const doc = makeDocument([step, container]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"No funnel fields in this step\");\n }\n }\n ]\n }),\n Container: makeManifest(\"Container\"),\n TextField: makeManifest(\"TextField\", { tags: [\"funnel-field\"] })\n };\n\n // TextField dropped into Container, which is inside Step\n const result = evaluateConstraints({\n componentName: \"TextField\",\n parentId: \"container-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"No funnel fields in this step\");\n });\n\n it(\"should allow when descendantConstraints pass\", () => {\n const step = makeElement(\"step-1\", \"Step\");\n const doc = makeDocument([step]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n }),\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should not run parent's descendantConstraints for unrelated ancestors\", () => {\n const page = makeElement(\"page\", \"Page\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"page\", slot: \"children\" });\n const doc = makeDocument([page, step]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => ctx.block(\"Page blocks everything\")\n ]\n }),\n Step: makeManifest(\"Step\"),\n Button: makeManifest(\"Button\")\n };\n\n // Button into Step — Page's descendantConstraints should still fire\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Page blocks everything\");\n });\n\n it(\"should evaluate component constraints before descendantConstraints\", () => {\n const parent = makeElement(\"parent-1\", \"Step\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => ctx.block(\"descendant constraint\")\n ]\n }),\n Widget: makeManifest(\"Widget\", {\n constraints: [(ctx: ConstraintContext) => ctx.block(\"component constraint\")]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n // Component's own constraints should short-circuit first\n expect(result.violation!.message).toBe(\"component constraint\");\n });\n });\n});\n\ndescribe(\"evaluateDeleteConstraint\", () => {\n it(\"should allow when canDelete is undefined\", () => {\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\")\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow when canDelete is true\", () => {\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", { canDelete: true })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block when canDelete is false\", () => {\n const el = makeElement(\"el-1\", \"GridColumn\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Grid\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n GridColumn: makeManifest(\"GridColumn\", { canDelete: false })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"GridColumn cannot be deleted.\");\n });\n\n it(\"should allow when canDelete check returns true\", () => {\n const funnel = makeElement(\"funnel\", \"Funnel\");\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"funnel\", slot: \"steps/0/step\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"funnel\", slot: \"steps/1/step\" });\n const step3 = makeElement(\"step-3\", \"Step\", { id: \"funnel\", slot: \"steps/2/step\" });\n const doc = makeDocument([funnel, step1, step2, step3], {\n funnel: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: \"step-3\" }\n }\n }\n });\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n canDelete: (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Step\") > 2)) {\n return ctx.block(\"Blocked\");\n }\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"step-2\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block when canDelete check returns false\", () => {\n const funnel = makeElement(\"funnel\", \"Funnel\");\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"funnel\", slot: \"steps/0/step\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"funnel\", slot: \"steps/1/step\" });\n const doc = makeDocument([funnel, step1, step2], {\n funnel: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" }\n }\n }\n });\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n canDelete: (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Step\") > 2)) {\n return ctx.block(\"Need at least 2 steps\");\n }\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"step-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Need at least 2 steps\");\n });\n\n it(\"should use thrown error message as violation message\", () => {\n const root = makeElement(\"root\", \"Page\");\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n canDelete: () => {\n throw new Error(\"Cannot delete this widget right now\");\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot delete this widget right now\");\n });\n\n it(\"should provide correct context to the check function\", () => {\n const root = makeElement(\"root\", \"Funnel\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps/0/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" }\n }\n }\n });\n\n let capturedCtx: ConstraintContext | undefined;\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n tags: [\"funnel-step\"],\n canDelete: (ctx: ConstraintContext) => {\n capturedCtx = ctx;\n }\n })\n };\n\n evaluateDeleteConstraint({\n elementId: \"step-1\",\n document: doc,\n components\n });\n\n expect(capturedCtx).toBeDefined();\n expect(capturedCtx!.component.name).toBe(\"Step\");\n expect(capturedCtx!.component.tags).toEqual([\"funnel-step\"]);\n expect(capturedCtx!.parent.name).toBe(\"Funnel\");\n expect(capturedCtx!.slot).toBe(\"steps/0/step\");\n expect(capturedCtx!.isChildOf(\"Funnel\")).toBe(true);\n expect(capturedCtx!.hasTag(\"funnel-step\")).toBe(true);\n });\n\n it(\"should allow when element is not found\", () => {\n const doc = makeDocument([]);\n const components: Record<string, ComponentManifest> = {};\n\n const result = evaluateDeleteConstraint({\n elementId: \"nonexistent\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow when manifest is not found\", () => {\n const el = makeElement(\"el-1\", \"Unknown\");\n const doc = makeDocument([el]);\n const components: Record<string, ComponentManifest> = {};\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ConstraintEvaluator.test.js","sources":["../src/ConstraintEvaluator.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { evaluateConstraints, evaluateDeleteConstraint } from \"./ConstraintEvaluator.js\";\nimport type { ComponentManifest, Document, DocumentElement, ConstraintContext } from \"~/types.js\";\n\nfunction makeElement(\n id: string,\n componentName: string,\n parent?: { id: string; slot: string }\n): DocumentElement {\n return {\n type: \"Webiny/Element\",\n id,\n component: { name: componentName },\n parent\n };\n}\n\nfunction makeManifest(name: string, overrides?: Partial<ComponentManifest>): ComponentManifest {\n return { name, label: name, inputs: [], tags: [], ...overrides };\n}\n\nfunction makeDocument(elements: DocumentElement[], bindings: Document[\"bindings\"] = {}): Document {\n const elementMap: Record<string, DocumentElement> = {};\n for (const el of elements) {\n elementMap[el.id] = el;\n }\n return {\n id: \"doc-1\",\n state: {},\n version: 1,\n properties: {},\n metadata: {},\n extensions: {},\n bindings,\n elements: elementMap\n };\n}\n\ndescribe(\"evaluateConstraints\", () => {\n it(\"should allow placement when there are no constraints\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n expect(result.violation).toBeUndefined();\n });\n\n it(\"should block when component's parent constraint fails\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.parent.name !== \"Tabs\") {\n return ctx.block(\"TabPanel must be inside Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation).toBeDefined();\n expect(result.violation!.message).toBe(\"TabPanel must be inside Tabs\");\n });\n\n it(\"should allow when parent constraint passes\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.parent.name !== \"Tabs\") {\n return ctx.block(\"TabPanel must be inside Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n expect(result.violation).toBeUndefined();\n });\n\n it(\"should block when ancestor constraint fails\", () => {\n const root = makeElement(\"root\", \"Page\");\n const section = makeElement(\"section-1\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, section]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"ProductPrice must be inside a ProductBox\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"section-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"ProductPrice must be inside a ProductBox\");\n });\n\n it(\"should allow when grandparent matches ancestor constraint\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner-1\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"ProductPrice must be inside a ProductBox\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block via slot children limit constraint using slotChildCount\", () => {\n const parent = makeElement(\"parent-1\", \"Grid\");\n const child1 = makeElement(\"child-1\", \"Cell\", { id: \"parent-1\", slot: \"children\" });\n const child2 = makeElement(\"child-2\", \"Cell\", { id: \"parent-1\", slot: \"children\" });\n const doc = makeDocument([parent, child1, child2], {\n \"parent-1\": {\n inputs: {\n children: {\n id: \"inp-1\",\n type: \"slot\",\n static: [\"child-1\", \"child-2\"]\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n Cell: makeManifest(\"Cell\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 2)) {\n return ctx.block(\"Maximum 2 children allowed\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Cell\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Maximum 2 children allowed\");\n });\n\n it(\"should block via countInstances when max instances reached\", () => {\n const root = makeElement(\"root\", \"Page\");\n const hero = makeElement(\"hero-1\", \"Hero\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, hero]);\n\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Hero: makeManifest(\"Hero\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Hero\") < 1)) {\n return ctx.block(\"Only one Hero per page\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Hero\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Only one Hero per page\");\n });\n\n it(\"should not evaluate parent's constraints against the placed component\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\", {\n constraints: [\n (ctx: ConstraintContext) => ctx.block(\"This should not run for children\")\n ]\n }),\n Button: makeManifest(\"Button\")\n };\n\n // Parent's constraints should not affect children being dropped into it\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should short-circuit on the first failed constraint\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {},\n (ctx: ConstraintContext) => ctx.block(\"Always fails\"),\n (ctx: ConstraintContext) => ctx.block(\"Also fails\")\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Always fails\");\n });\n\n it(\"should allow placement when component manifest is not found\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Unknown\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow placement when parent element is not found\", () => {\n const doc = makeDocument([]);\n\n const components: Record<string, ComponentManifest> = {\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"nonexistent\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(true);\n });\n\n it(\"should handle multi-slot parent constraint checking specific slot\", () => {\n const parent = makeElement(\"parent-1\", \"TwoColumn\");\n const child = makeElement(\"child-1\", \"Widget\", {\n id: \"parent-1\",\n slot: \"leftColumn\"\n });\n const doc = makeDocument([parent, child], {\n \"parent-1\": {\n inputs: {\n leftColumn: {\n id: \"inp-left\",\n type: \"slot\",\n static: [\"child-1\"]\n },\n rightColumn: {\n id: \"inp-right\",\n type: \"slot\",\n static: []\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n TwoColumn: makeManifest(\"TwoColumn\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 1)) {\n return ctx.block(\"Slot is full\");\n }\n }\n ]\n })\n };\n\n // leftColumn is full\n const leftResult = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"leftColumn\",\n document: doc,\n components\n });\n expect(leftResult.allowed).toBe(false);\n\n // rightColumn is empty\n const rightResult = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"rightColumn\",\n document: doc,\n components\n });\n expect(rightResult.allowed).toBe(true);\n });\n\n it(\"should provide a default message when constraint has no message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [(ctx: ConstraintContext) => ctx.block(\"Blocked\")]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.violation!.message).toBe(\"Blocked\");\n });\n\n it(\"should use thrown error message as the violation message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n throw new Error(`Widget cannot be placed inside ${ctx.parent.name}`);\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Widget cannot be placed inside Container\");\n });\n\n it(\"should fall back to static message when a non-Error is thrown\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {\n throw \"not an error object\";\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot place Widget here.\");\n });\n\n it(\"should fall back to default message when a non-Error is thrown and no static message\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n () => {\n throw null;\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot place Widget here.\");\n });\n\n describe(\"ctx.isChildOf\", () => {\n it(\"should return true when direct parent matches\", () => {\n const parent = makeElement(\"parent-1\", \"Tabs\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Tabs: makeManifest(\"Tabs\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isChildOf(\"Tabs\")) {\n return ctx.block(\"TabPanel must be a direct child of Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return false when direct parent does not match\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n TabPanel: makeManifest(\"TabPanel\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isChildOf(\"Tabs\")) {\n return ctx.block(\"TabPanel must be a direct child of Tabs\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"TabPanel\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.isDescendantOf\", () => {\n it(\"should return true when direct parent matches\", () => {\n const parent = makeElement(\"parent-1\", \"ProductBox\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return true when grandparent matches\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\"),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return false when no ancestor matches\", () => {\n const root = makeElement(\"root\", \"Page\");\n const inner = makeElement(\"inner\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!ctx.isDescendantOf(\"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.slotChildCount\", () => {\n it(\"should return the number of children in the target slot\", () => {\n const parent = makeElement(\"parent-1\", \"Grid\");\n const doc = makeDocument([parent], {\n \"parent-1\": {\n inputs: {\n children: {\n id: \"inp-1\",\n type: \"slot\",\n static: [\"child-1\", \"child-2\", \"child-3\"]\n }\n }\n }\n });\n\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n Cell: makeManifest(\"Cell\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 3)) {\n return ctx.block(\"Max 3 children\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Cell\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n\n it(\"should return 0 when slot has no bindings\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.slotChildCount() < 5)) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n });\n\n describe(\"ctx.hasTag\", () => {\n it(\"should return true when the placed component has the tag\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n FunnelField: makeManifest(\"FunnelField\", {\n tags: [\"funnel-field\", \"input\"],\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Funnel fields not allowed here\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"FunnelField\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n\n it(\"should return false when the placed component does not have the tag\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Button: makeManifest(\"Button\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n });\n\n describe(\"ctx.getAncestor\", () => {\n it(\"should return the matching ancestor element context\", () => {\n const root = makeElement(\"root\", \"ProductBox\");\n const inner = makeElement(\"inner\", \"Container\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, inner]);\n const components: Record<string, ComponentManifest> = {\n ProductBox: makeManifest(\"ProductBox\", { tags: [\"product\"] }),\n Container: makeManifest(\"Container\"),\n ProductPrice: makeManifest(\"ProductPrice\", {\n constraints: [\n (ctx: ConstraintContext) => {\n const ancestor = ctx.getAncestor(\"ProductBox\");\n if (!(ancestor !== undefined && ancestor.name === \"ProductBox\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"ProductPrice\",\n parentId: \"inner\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should return undefined when no ancestor matches\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (ctx.getAncestor(\"ProductBox\") === undefined) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.countInstances\", () => {\n it(\"should count instances of a component in the document\", () => {\n const root = makeElement(\"root\", \"Page\");\n const hero1 = makeElement(\"hero-1\", \"Hero\", { id: \"root\", slot: \"children\" });\n const hero2 = makeElement(\"hero-2\", \"Hero\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, hero1, hero2]);\n\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Hero: makeManifest(\"Hero\", {\n constraints: [\n (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Hero\") < 2)) {\n return ctx.block(\"Max 2 Heroes\");\n }\n }\n ]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Hero\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n });\n });\n\n describe(\"ctx.component\", () => {\n it(\"should expose the placed component's name and tags\", () => {\n const parent = makeElement(\"parent-1\", \"Container\");\n const doc = makeDocument([parent]);\n\n let capturedComponent: { name: string; tags: string[] } | undefined;\n const components: Record<string, ComponentManifest> = {\n Container: makeManifest(\"Container\"),\n Widget: makeManifest(\"Widget\", {\n tags: [\"interactive\", \"form\"],\n constraints: [\n (ctx: ConstraintContext) => {\n capturedComponent = ctx.component;\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedComponent).toBeDefined();\n expect(capturedComponent!.name).toBe(\"Widget\");\n expect(capturedComponent!.tags).toEqual([\"interactive\", \"form\"]);\n });\n });\n\n describe(\"parent.getParent\", () => {\n it(\"should return the grandparent element context\", () => {\n const root = makeElement(\"root\", \"Page\");\n const section = makeElement(\"section\", \"Section\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, section]);\n\n let grandparentName: string | undefined;\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Section: makeManifest(\"Section\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n const grandparent = ctx.parent.getParent();\n grandparentName = grandparent?.name;\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"section\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(grandparentName).toBe(\"Page\");\n });\n\n it(\"should return undefined for root element\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n\n let parentResult: unknown = \"not-called\";\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n parentResult = ctx.parent.getParent();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(parentResult).toBeUndefined();\n });\n });\n\n describe(\"parent.childIndex / childCount / isFirstChild / isLastChild\", () => {\n it(\"should return -1 for elements not in a list slot\", () => {\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root]);\n\n let capturedIndex: number | undefined;\n let capturedCount: number | undefined;\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedCount = ctx.parent.childCount();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"root\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIndex).toBe(-1);\n expect(capturedCount).toBe(-1);\n });\n\n it(\"should parse child index from list slot path\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps/2/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: [\"step-0\"] },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: [\"step-other\"] },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: [\"step-1\"] }\n }\n }\n });\n\n let capturedIndex: number | undefined;\n let capturedCount: number | undefined;\n let capturedIsLast: boolean | undefined;\n let capturedIsFirst: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedCount = ctx.parent.childCount();\n capturedIsLast = ctx.parent.isLastChild();\n capturedIsFirst = ctx.parent.isFirstChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIndex).toBe(2);\n expect(capturedCount).toBe(3);\n expect(capturedIsLast).toBe(true);\n expect(capturedIsFirst).toBe(false);\n });\n\n it(\"should identify the first child correctly\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step = makeElement(\"step-0\", \"Step\", { id: \"root\", slot: \"steps/0/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: [\"step-0\"] },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: [\"step-1\"] }\n }\n }\n });\n\n let capturedIsFirst: boolean | undefined;\n let capturedIsLast: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIsFirst = ctx.parent.isFirstChild();\n capturedIsLast = ctx.parent.isLastChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-0\",\n slot: \"children\",\n document: doc,\n components\n });\n\n expect(capturedIsFirst).toBe(true);\n expect(capturedIsLast).toBe(false);\n });\n\n it(\"should resolve position from bindings even when element.parent.slot is stale\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n // Element says slot \"steps/1/step\" but bindings put it at steps/3/step\n const step = makeElement(\"step-final\", \"Step\", {\n id: \"root\",\n slot: \"steps/1/step\"\n });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-0\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-1\" },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: \"step-2\" },\n \"steps/3/step\": { id: \"s3\", type: \"slot\", static: \"step-final\" }\n }\n }\n });\n\n let capturedIndex: number | undefined;\n let capturedIsLast: boolean | undefined;\n const components: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n capturedIndex = ctx.parent.childIndex();\n capturedIsLast = ctx.parent.isLastChild();\n }\n ]\n })\n };\n\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-final\",\n slot: \"children\",\n document: doc,\n components\n });\n\n // Should find actual position (index 3, last) not stale slot (index 1)\n expect(capturedIndex).toBe(3);\n expect(capturedIsLast).toBe(true);\n });\n\n it(\"should resolve position from direct list slot binding (static is an array of IDs)\", () => {\n const root = makeElement(\"root\", \"FunnelBuilder\");\n const step0 = makeElement(\"step-0\", \"Step\", { id: \"root\", slot: \"steps\" });\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"root\", slot: \"steps\" });\n const doc = makeDocument([root, step0, step1, step2], {\n root: {\n inputs: {\n steps: {\n id: \"s\",\n type: \"slot\",\n list: true,\n static: [\"step-0\", \"step-1\", \"step-2\"]\n }\n }\n }\n });\n\n let captured: Record<string, any> = {};\n const comps: Record<string, ComponentManifest> = {\n FunnelBuilder: makeManifest(\"FunnelBuilder\"),\n Step: makeManifest(\"Step\"),\n Widget: makeManifest(\"Widget\", {\n constraints: [\n (ctx: ConstraintContext) => {\n captured = {\n index: ctx.parent.childIndex(),\n count: ctx.parent.childCount(),\n isFirst: ctx.parent.isFirstChild(),\n isLast: ctx.parent.isLastChild()\n };\n }\n ]\n })\n };\n\n // Place into first step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-0\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(0);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(true);\n expect(captured.isLast).toBe(false);\n\n // Place into middle step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(1);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(false);\n expect(captured.isLast).toBe(false);\n\n // Place into last step\n evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"step-2\",\n slot: \"children\",\n document: doc,\n components: comps\n });\n expect(captured.index).toBe(2);\n expect(captured.count).toBe(3);\n expect(captured.isFirst).toBe(false);\n expect(captured.isLast).toBe(true);\n });\n });\n\n describe(\"descendantConstraints\", () => {\n it(\"should block a direct child via parent's descendantConstraints\", () => {\n const parent = makeElement(\"parent-1\", \"Step\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"No funnel fields allowed\");\n }\n }\n ]\n }),\n TextField: makeManifest(\"TextField\", { tags: [\"funnel-field\"] })\n };\n\n const result = evaluateConstraints({\n componentName: \"TextField\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"No funnel fields allowed\");\n });\n\n it(\"should block a nested descendant via ancestor's descendantConstraints\", () => {\n const step = makeElement(\"step-1\", \"Step\");\n const container = makeElement(\"container-1\", \"Container\", {\n id: \"step-1\",\n slot: \"children\"\n });\n const doc = makeDocument([step, container]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"No funnel fields in this step\");\n }\n }\n ]\n }),\n Container: makeManifest(\"Container\"),\n TextField: makeManifest(\"TextField\", { tags: [\"funnel-field\"] })\n };\n\n // TextField dropped into Container, which is inside Step\n const result = evaluateConstraints({\n componentName: \"TextField\",\n parentId: \"container-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"No funnel fields in this step\");\n });\n\n it(\"should allow when descendantConstraints pass\", () => {\n const step = makeElement(\"step-1\", \"Step\");\n const doc = makeDocument([step]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => {\n if (ctx.hasTag(\"funnel-field\")) {\n return ctx.block(\"Blocked\");\n }\n }\n ]\n }),\n Button: makeManifest(\"Button\")\n };\n\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should not run parent's descendantConstraints for unrelated ancestors\", () => {\n const page = makeElement(\"page\", \"Page\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"page\", slot: \"children\" });\n const doc = makeDocument([page, step]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => ctx.block(\"Page blocks everything\")\n ]\n }),\n Step: makeManifest(\"Step\"),\n Button: makeManifest(\"Button\")\n };\n\n // Button into Step — Page's descendantConstraints should still fire\n const result = evaluateConstraints({\n componentName: \"Button\",\n parentId: \"step-1\",\n slot: \"children\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Page blocks everything\");\n });\n\n it(\"should evaluate component constraints before descendantConstraints\", () => {\n const parent = makeElement(\"parent-1\", \"Step\");\n const doc = makeDocument([parent]);\n const components: Record<string, ComponentManifest> = {\n Step: makeManifest(\"Step\", {\n descendantConstraints: [\n (ctx: ConstraintContext) => ctx.block(\"descendant constraint\")\n ]\n }),\n Widget: makeManifest(\"Widget\", {\n constraints: [(ctx: ConstraintContext) => ctx.block(\"component constraint\")]\n })\n };\n\n const result = evaluateConstraints({\n componentName: \"Widget\",\n parentId: \"parent-1\",\n slot: \"children\",\n document: doc,\n components\n });\n // Component's own constraints should short-circuit first\n expect(result.violation!.message).toBe(\"component constraint\");\n });\n });\n});\n\ndescribe(\"evaluateDeleteConstraint\", () => {\n it(\"should allow when canDelete is undefined\", () => {\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\")\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow when canDelete is true\", () => {\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Page\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", { canDelete: true })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block when canDelete is false\", () => {\n const el = makeElement(\"el-1\", \"GridColumn\", { id: \"root\", slot: \"children\" });\n const root = makeElement(\"root\", \"Grid\");\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Grid: makeManifest(\"Grid\"),\n GridColumn: makeManifest(\"GridColumn\", { canDelete: false })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"GridColumn cannot be deleted.\");\n });\n\n it(\"should allow when canDelete check returns true\", () => {\n const funnel = makeElement(\"funnel\", \"Funnel\");\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"funnel\", slot: \"steps/0/step\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"funnel\", slot: \"steps/1/step\" });\n const step3 = makeElement(\"step-3\", \"Step\", { id: \"funnel\", slot: \"steps/2/step\" });\n const doc = makeDocument([funnel, step1, step2, step3], {\n funnel: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" },\n \"steps/2/step\": { id: \"s2\", type: \"slot\", static: \"step-3\" }\n }\n }\n });\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n canDelete: (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Step\") > 2)) {\n return ctx.block(\"Blocked\");\n }\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"step-2\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should block when canDelete check returns false\", () => {\n const funnel = makeElement(\"funnel\", \"Funnel\");\n const step1 = makeElement(\"step-1\", \"Step\", { id: \"funnel\", slot: \"steps/0/step\" });\n const step2 = makeElement(\"step-2\", \"Step\", { id: \"funnel\", slot: \"steps/1/step\" });\n const doc = makeDocument([funnel, step1, step2], {\n funnel: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" }\n }\n }\n });\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n canDelete: (ctx: ConstraintContext) => {\n if (!(ctx.countInstances(\"Step\") > 2)) {\n return ctx.block(\"Need at least 2 steps\");\n }\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"step-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Need at least 2 steps\");\n });\n\n it(\"should use thrown error message as violation message\", () => {\n const root = makeElement(\"root\", \"Page\");\n const el = makeElement(\"el-1\", \"Widget\", { id: \"root\", slot: \"children\" });\n const doc = makeDocument([root, el]);\n const components: Record<string, ComponentManifest> = {\n Page: makeManifest(\"Page\"),\n Widget: makeManifest(\"Widget\", {\n canDelete: () => {\n throw new Error(\"Cannot delete this widget right now\");\n }\n })\n };\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(false);\n expect(result.violation!.message).toBe(\"Cannot delete this widget right now\");\n });\n\n it(\"should provide correct context to the check function\", () => {\n const root = makeElement(\"root\", \"Funnel\");\n const step = makeElement(\"step-1\", \"Step\", { id: \"root\", slot: \"steps/0/step\" });\n const doc = makeDocument([root, step], {\n root: {\n inputs: {\n \"steps/0/step\": { id: \"s0\", type: \"slot\", static: \"step-1\" },\n \"steps/1/step\": { id: \"s1\", type: \"slot\", static: \"step-2\" }\n }\n }\n });\n\n let capturedCtx: ConstraintContext | undefined;\n const components: Record<string, ComponentManifest> = {\n Funnel: makeManifest(\"Funnel\"),\n Step: makeManifest(\"Step\", {\n tags: [\"funnel-step\"],\n canDelete: (ctx: ConstraintContext) => {\n capturedCtx = ctx;\n }\n })\n };\n\n evaluateDeleteConstraint({\n elementId: \"step-1\",\n document: doc,\n components\n });\n\n expect(capturedCtx).toBeDefined();\n expect(capturedCtx!.component.name).toBe(\"Step\");\n expect(capturedCtx!.component.tags).toEqual([\"funnel-step\"]);\n expect(capturedCtx!.parent.name).toBe(\"Funnel\");\n expect(capturedCtx!.slot).toBe(\"steps/0/step\");\n expect(capturedCtx!.isChildOf(\"Funnel\")).toBe(true);\n expect(capturedCtx!.hasTag(\"funnel-step\")).toBe(true);\n });\n\n it(\"should allow when element is not found\", () => {\n const doc = makeDocument([]);\n const components: Record<string, ComponentManifest> = {};\n\n const result = evaluateDeleteConstraint({\n elementId: \"nonexistent\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n\n it(\"should allow when manifest is not found\", () => {\n const el = makeElement(\"el-1\", \"Unknown\");\n const doc = makeDocument([el]);\n const components: Record<string, ComponentManifest> = {};\n\n const result = evaluateDeleteConstraint({\n elementId: \"el-1\",\n document: doc,\n components\n });\n expect(result.allowed).toBe(true);\n });\n});\n"],"names":["makeElement","id","componentName","parent","makeManifest","name","overrides","makeDocument","elements","bindings","elementMap","el","describe","it","doc","components","result","evaluateConstraints","expect","ctx","root","section","inner","child1","child2","hero","child","leftResult","rightResult","Error","ancestor","undefined","hero1","hero2","capturedComponent","grandparentName","grandparent","parentResult","capturedIndex","capturedCount","step","capturedIsLast","capturedIsFirst","step0","step1","step2","captured","comps","container","page","evaluateDeleteConstraint","funnel","step3","capturedCtx"],"mappings":";;AAIA,SAASA,YACLC,EAAU,EACVC,aAAqB,EACrBC,MAAqC;IAErC,OAAO;QACH,MAAM;QACNF;QACA,WAAW;YAAE,MAAMC;QAAc;QACjCC;IACJ;AACJ;AAEA,SAASC,aAAaC,IAAY,EAAEC,SAAsC;IACtE,OAAO;QAAED;QAAM,OAAOA;QAAM,QAAQ,EAAE;QAAE,MAAM,EAAE;QAAE,GAAGC,SAAS;IAAC;AACnE;AAEA,SAASC,aAAaC,QAA2B,EAAEC,WAAiC,CAAC,CAAC;IAClF,MAAMC,aAA8C,CAAC;IACrD,KAAK,MAAMC,MAAMH,SACbE,UAAU,CAACC,GAAG,EAAE,CAAC,GAAGA;IAExB,OAAO;QACH,IAAI;QACJ,OAAO,CAAC;QACR,SAAS;QACT,YAAY,CAAC;QACb,UAAU,CAAC;QACX,YAAY,CAAC;QACbF;QACA,UAAUC;IACd;AACJ;AAEAE,SAAS,uBAAuB;IAC5BC,GAAG,wDAAwD;QACvD,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QACjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa;QACzB;QAEA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,EAAE,aAAa;IAC1C;IAEAH,GAAG,yDAAyD;QACxD,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QACjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,UAAUA,aAAa,YAAY;gBAC/B,aAAa;oBACT,CAACe;wBACG,IAAIA,AAAoB,WAApBA,IAAI,MAAM,CAAC,IAAI,EACf,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,EAAE,WAAW;QACpCE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,8CAA8C;QAC7C,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QACjC,MAAMY,aAAgD;YAClD,MAAMX,aAAa;YACnB,UAAUA,aAAa,YAAY;gBAC/B,aAAa;oBACT,CAACe;wBACG,IAAIA,AAAoB,WAApBA,IAAI,MAAM,CAAC,IAAI,EACf,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,EAAE,aAAa;IAC1C;IAEAH,GAAG,+CAA+C;QAC9C,MAAMO,OAAOpB,YAAY,QAAQ;QACjC,MAAMqB,UAAUrB,YAAY,aAAa,WAAW;YAAE,IAAI;YAAQ,MAAM;QAAW;QACnF,MAAMc,MAAMP,aAAa;YAACa;YAAMC;SAAQ;QACxC,MAAMN,aAAgD;YAClD,MAAMX,aAAa;YACnB,SAASA,aAAa;YACtB,cAAcA,aAAa,gBAAgB;gBACvC,aAAa;oBACT,CAACe;wBACG,IAAI,CAACA,IAAI,cAAc,CAAC,eACpB,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,6DAA6D;QAC5D,MAAMO,OAAOpB,YAAY,QAAQ;QACjC,MAAMsB,QAAQtB,YAAY,WAAW,aAAa;YAAE,IAAI;YAAQ,MAAM;QAAW;QACjF,MAAMc,MAAMP,aAAa;YAACa;YAAME;SAAM;QACtC,MAAMP,aAAgD;YAClD,YAAYX,aAAa;YACzB,WAAWA,aAAa;YACxB,cAAcA,aAAa,gBAAgB;gBACvC,aAAa;oBACT,CAACe;wBACG,IAAI,CAACA,IAAI,cAAc,CAAC,eACpB,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,wEAAwE;QACvE,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMuB,SAASvB,YAAY,WAAW,QAAQ;YAAE,IAAI;YAAY,MAAM;QAAW;QACjF,MAAMwB,SAASxB,YAAY,WAAW,QAAQ;YAAE,IAAI;YAAY,MAAM;QAAW;QACjF,MAAMc,MAAMP,aAAa;YAACJ;YAAQoB;YAAQC;SAAO,EAAE;YAC/C,YAAY;gBACR,QAAQ;oBACJ,UAAU;wBACN,IAAI;wBACJ,MAAM;wBACN,QAAQ;4BAAC;4BAAW;yBAAU;oBAClC;gBACJ;YACJ;QACJ;QAEA,MAAMT,aAAgD;YAClD,MAAMX,aAAa;YACnB,MAAMA,aAAa,QAAQ;gBACvB,aAAa;oBACT,CAACe;wBACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,KAAK,IACzB,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,8DAA8D;QAC7D,MAAMO,OAAOpB,YAAY,QAAQ;QACjC,MAAMyB,OAAOzB,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAQ,MAAM;QAAW;QAC1E,MAAMc,MAAMP,aAAa;YAACa;YAAMK;SAAK;QAErC,MAAMV,aAAgD;YAClD,MAAMX,aAAa;YACnB,MAAMA,aAAa,QAAQ;gBACvB,aAAa;oBACT,CAACe;wBACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,CAAC,UAAU,IAC/B,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,yEAAyE;QACxE,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,MAAMX,aAAa,QAAQ;gBACvB,aAAa;oBACT,CAACe,MAA2BA,IAAI,KAAK,CAAC;iBACzC;YACL;YACA,QAAQf,aAAa;QACzB;QAGA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,uDAAuD;QACtD,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBACT,KAAO;oBACP,CAACe,MAA2BA,IAAI,KAAK,CAAC;oBACtC,CAACA,MAA2BA,IAAI,KAAK,CAAC;iBACzC;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,+DAA+D;QAC9D,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;QAC5B;QAEA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,2DAA2D;QAC1D,MAAMC,MAAMP,aAAa,EAAE;QAE3B,MAAMQ,aAAgD;YAClD,QAAQX,aAAa;QACzB;QAEA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,qEAAqE;QACpE,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAM0B,QAAQ1B,YAAY,WAAW,UAAU;YAC3C,IAAI;YACJ,MAAM;QACV;QACA,MAAMc,MAAMP,aAAa;YAACJ;YAAQuB;SAAM,EAAE;YACtC,YAAY;gBACR,QAAQ;oBACJ,YAAY;wBACR,IAAI;wBACJ,MAAM;wBACN,QAAQ;4BAAC;yBAAU;oBACvB;oBACA,aAAa;wBACT,IAAI;wBACJ,MAAM;wBACN,QAAQ,EAAE;oBACd;gBACJ;YACJ;QACJ;QAEA,MAAMX,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBACT,CAACe;wBACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,KAAK,IACzB,OAAOA,IAAI,KAAK,CAAC;oBAEzB;iBACH;YACL;QACJ;QAGA,MAAMQ,aAAaV,oBAAoB;YACnC,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QACAG,OAAOS,WAAW,OAAO,EAAE,IAAI,CAAC;QAGhC,MAAMC,cAAcX,oBAAoB;YACpC,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QACAG,OAAOU,YAAY,OAAO,EAAE,IAAI,CAAC;IACrC;IAEAf,GAAG,mEAAmE;QAClE,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBAAC,CAACe,MAA2BA,IAAI,KAAK,CAAC;iBAAW;YACnE;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,4DAA4D;QAC3D,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBACT,CAACe;wBACG,MAAM,IAAIU,MAAM,CAAC,+BAA+B,EAAEV,IAAI,MAAM,CAAC,IAAI,EAAE;oBACvE;iBACH;YACL;QACJ;QAEA,MAAMH,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,iEAAiE;QAChE,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBACT;wBACI,MAAM;oBACV;iBACH;YACL;QACJ;QAEA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,wFAAwF;QACvF,MAAMV,SAASH,YAAY,YAAY;QACvC,MAAMc,MAAMP,aAAa;YAACJ;SAAO;QAEjC,MAAMY,aAAgD;YAClD,WAAWX,aAAa;YACxB,QAAQA,aAAa,UAAU;gBAC3B,aAAa;oBACT;wBACI,MAAM;oBACV;iBACH;YACL;QACJ;QAEA,MAAMY,SAASC,oBAAoB;YAC/B,eAAe;YACf,UAAU;YACV,MAAM;YACN,UAAUH;YACVC;QACJ;QAEAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAJ,SAAS,iBAAiB;QACtBC,GAAG,iDAAiD;YAChD,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,UAAUA,aAAa,YAAY;oBAC/B,aAAa;wBACT,CAACe;4BACG,IAAI,CAACA,IAAI,SAAS,CAAC,SACf,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,yDAAyD;YACxD,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,WAAWX,aAAa;gBACxB,UAAUA,aAAa,YAAY;oBAC/B,aAAa;wBACT,CAACe;4BACG,IAAI,CAACA,IAAI,SAAS,CAAC,SACf,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,sBAAsB;QAC3BC,GAAG,iDAAiD;YAChD,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,YAAYX,aAAa;gBACzB,cAAcA,aAAa,gBAAgB;oBACvC,aAAa;wBACT,CAACe;4BACG,IAAI,CAACA,IAAI,cAAc,CAAC,eACpB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,+CAA+C;YAC9C,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMsB,QAAQtB,YAAY,SAAS,aAAa;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC/E,MAAMc,MAAMP,aAAa;gBAACa;gBAAME;aAAM;YACtC,MAAMP,aAAgD;gBAClD,YAAYX,aAAa;gBACzB,WAAWA,aAAa;gBACxB,cAAcA,aAAa,gBAAgB;oBACvC,aAAa;wBACT,CAACe;4BACG,IAAI,CAACA,IAAI,cAAc,CAAC,eACpB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,gDAAgD;YAC/C,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMsB,QAAQtB,YAAY,SAAS,WAAW;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC7E,MAAMc,MAAMP,aAAa;gBAACa;gBAAME;aAAM;YACtC,MAAMP,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,SAASA,aAAa;gBACtB,cAAcA,aAAa,gBAAgB;oBACvC,aAAa;wBACT,CAACe;4BACG,IAAI,CAACA,IAAI,cAAc,CAAC,eACpB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,sBAAsB;QAC3BC,GAAG,2DAA2D;YAC1D,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO,EAAE;gBAC/B,YAAY;oBACR,QAAQ;wBACJ,UAAU;4BACN,IAAI;4BACJ,MAAM;4BACN,QAAQ;gCAAC;gCAAW;gCAAW;6BAAU;wBAC7C;oBACJ;gBACJ;YACJ;YAEA,MAAMY,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,MAAMA,aAAa,QAAQ;oBACvB,aAAa;wBACT,CAACe;4BACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,KAAK,IACzB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,6CAA6C;YAC5C,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YAEjC,MAAMY,aAAgD;gBAClD,WAAWX,aAAa;gBACxB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,KAAK,IACzB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,cAAc;QACnBC,GAAG,4DAA4D;YAC3D,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,WAAWX,aAAa;gBACxB,aAAaA,aAAa,eAAe;oBACrC,MAAM;wBAAC;wBAAgB;qBAAQ;oBAC/B,aAAa;wBACT,CAACe;4BACG,IAAIA,IAAI,MAAM,CAAC,iBACX,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,uEAAuE;YACtE,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,WAAWX,aAAa;gBACxB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACG,IAAIA,IAAI,MAAM,CAAC,iBACX,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,mBAAmB;QACxBC,GAAG,uDAAuD;YACtD,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMsB,QAAQtB,YAAY,SAAS,aAAa;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC/E,MAAMc,MAAMP,aAAa;gBAACa;gBAAME;aAAM;YACtC,MAAMP,aAAgD;gBAClD,YAAYX,aAAa,cAAc;oBAAE,MAAM;wBAAC;qBAAU;gBAAC;gBAC3D,WAAWA,aAAa;gBACxB,cAAcA,aAAa,gBAAgB;oBACvC,aAAa;wBACT,CAACe;4BACG,MAAMW,WAAWX,IAAI,WAAW,CAAC;4BACjC,IAAI,CAAEW,CAAAA,AAAaC,WAAbD,YAA0BA,AAAkB,iBAAlBA,SAAS,IAAI,AAAgB,GACzD,OAAOX,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,oDAAoD;YACnD,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMc,MAAMP,aAAa;gBAACa;aAAK;YAC/B,MAAML,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACG,IAAIA,AAAkCY,WAAlCZ,IAAI,WAAW,CAAC,eAChB,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,sBAAsB;QAC3BC,GAAG,yDAAyD;YACxD,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMgC,QAAQhC,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC3E,MAAMiC,QAAQjC,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC3E,MAAMc,MAAMP,aAAa;gBAACa;gBAAMY;gBAAOC;aAAM;YAE7C,MAAMlB,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,MAAMA,aAAa,QAAQ;oBACvB,aAAa;wBACT,CAACe;4BACG,IAAI,CAAEA,CAAAA,IAAI,cAAc,CAAC,UAAU,IAC/B,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;IACJ;IAEAJ,SAAS,iBAAiB;QACtBC,GAAG,sDAAsD;YACrD,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YAEjC,IAAI+B;YACJ,MAAMnB,aAAgD;gBAClD,WAAWX,aAAa;gBACxB,QAAQA,aAAa,UAAU;oBAC3B,MAAM;wBAAC;wBAAe;qBAAO;oBAC7B,aAAa;wBACT,CAACe;4BACGe,oBAAoBf,IAAI,SAAS;wBACrC;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOgB,mBAAmB,WAAW;YACrChB,OAAOgB,kBAAmB,IAAI,EAAE,IAAI,CAAC;YACrChB,OAAOgB,kBAAmB,IAAI,EAAE,OAAO,CAAC;gBAAC;gBAAe;aAAO;QACnE;IACJ;IAEAtB,SAAS,oBAAoB;QACzBC,GAAG,iDAAiD;YAChD,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMqB,UAAUrB,YAAY,WAAW,WAAW;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YACjF,MAAMc,MAAMP,aAAa;gBAACa;gBAAMC;aAAQ;YAExC,IAAIc;YACJ,MAAMpB,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,SAASA,aAAa;gBACtB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACG,MAAMiB,cAAcjB,IAAI,MAAM,CAAC,SAAS;4BACxCgB,kBAAkBC,aAAa;wBACnC;qBACH;gBACL;YACJ;YAEAnB,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOiB,iBAAiB,IAAI,CAAC;QACjC;QAEAtB,GAAG,4CAA4C;YAC3C,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMc,MAAMP,aAAa;gBAACa;aAAK;YAE/B,IAAIiB,eAAwB;YAC5B,MAAMtB,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACGkB,eAAelB,IAAI,MAAM,CAAC,SAAS;wBACvC;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOmB,cAAc,aAAa;QACtC;IACJ;IAEAzB,SAAS,+DAA+D;QACpEC,GAAG,oDAAoD;YACnD,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMc,MAAMP,aAAa;gBAACa;aAAK;YAE/B,IAAIkB;YACJ,IAAIC;YACJ,MAAMxB,aAAgD;gBAClD,MAAMX,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACGmB,gBAAgBnB,IAAI,MAAM,CAAC,UAAU;4BACrCoB,gBAAgBpB,IAAI,MAAM,CAAC,UAAU;wBACzC;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOoB,eAAe,IAAI,CAAC;YAC3BpB,OAAOqB,eAAe,IAAI,CAAC;QAC/B;QAEA1B,GAAG,gDAAgD;YAC/C,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMwC,OAAOxC,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAe;YAC9E,MAAMc,MAAMP,aAAa;gBAACa;gBAAMoB;aAAK,EAAE;gBACnC,MAAM;oBACF,QAAQ;wBACJ,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;gCAAC;6BAAS;wBAAC;wBAC7D,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;gCAAC;6BAAa;wBAAC;wBACjE,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;gCAAC;6BAAS;wBAAC;oBACjE;gBACJ;YACJ;YAEA,IAAIF;YACJ,IAAIC;YACJ,IAAIE;YACJ,IAAIC;YACJ,MAAM3B,aAAgD;gBAClD,eAAeX,aAAa;gBAC5B,MAAMA,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACGmB,gBAAgBnB,IAAI,MAAM,CAAC,UAAU;4BACrCoB,gBAAgBpB,IAAI,MAAM,CAAC,UAAU;4BACrCsB,iBAAiBtB,IAAI,MAAM,CAAC,WAAW;4BACvCuB,kBAAkBvB,IAAI,MAAM,CAAC,YAAY;wBAC7C;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOoB,eAAe,IAAI,CAAC;YAC3BpB,OAAOqB,eAAe,IAAI,CAAC;YAC3BrB,OAAOuB,gBAAgB,IAAI,CAAC;YAC5BvB,OAAOwB,iBAAiB,IAAI,CAAC;QACjC;QAEA7B,GAAG,6CAA6C;YAC5C,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAMwC,OAAOxC,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAe;YAC9E,MAAMc,MAAMP,aAAa;gBAACa;gBAAMoB;aAAK,EAAE;gBACnC,MAAM;oBACF,QAAQ;wBACJ,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;gCAAC;6BAAS;wBAAC;wBAC7D,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;gCAAC;6BAAS;wBAAC;oBACjE;gBACJ;YACJ;YAEA,IAAIE;YACJ,IAAID;YACJ,MAAM1B,aAAgD;gBAClD,eAAeX,aAAa;gBAC5B,MAAMA,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACGuB,kBAAkBvB,IAAI,MAAM,CAAC,YAAY;4BACzCsB,iBAAiBtB,IAAI,MAAM,CAAC,WAAW;wBAC3C;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOwB,iBAAiB,IAAI,CAAC;YAC7BxB,OAAOuB,gBAAgB,IAAI,CAAC;QAChC;QAEA5B,GAAG,gFAAgF;YAC/E,MAAMO,OAAOpB,YAAY,QAAQ;YAEjC,MAAMwC,OAAOxC,YAAY,cAAc,QAAQ;gBAC3C,IAAI;gBACJ,MAAM;YACV;YACA,MAAMc,MAAMP,aAAa;gBAACa;gBAAMoB;aAAK,EAAE;gBACnC,MAAM;oBACF,QAAQ;wBACJ,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;wBAAS;wBAC3D,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;wBAAS;wBAC3D,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;wBAAS;wBAC3D,gBAAgB;4BAAE,IAAI;4BAAM,MAAM;4BAAQ,QAAQ;wBAAa;oBACnE;gBACJ;YACJ;YAEA,IAAIF;YACJ,IAAIG;YACJ,MAAM1B,aAAgD;gBAClD,eAAeX,aAAa;gBAC5B,MAAMA,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACGmB,gBAAgBnB,IAAI,MAAM,CAAC,UAAU;4BACrCsB,iBAAiBtB,IAAI,MAAM,CAAC,WAAW;wBAC3C;qBACH;gBACL;YACJ;YAEAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAGAG,OAAOoB,eAAe,IAAI,CAAC;YAC3BpB,OAAOuB,gBAAgB,IAAI,CAAC;QAChC;QAEA5B,GAAG,qFAAqF;YACpF,MAAMO,OAAOpB,YAAY,QAAQ;YACjC,MAAM2C,QAAQ3C,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAQ;YACxE,MAAM4C,QAAQ5C,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAQ;YACxE,MAAM6C,QAAQ7C,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAQ;YACxE,MAAMc,MAAMP,aAAa;gBAACa;gBAAMuB;gBAAOC;gBAAOC;aAAM,EAAE;gBAClD,MAAM;oBACF,QAAQ;wBACJ,OAAO;4BACH,IAAI;4BACJ,MAAM;4BACN,MAAM;4BACN,QAAQ;gCAAC;gCAAU;gCAAU;6BAAS;wBAC1C;oBACJ;gBACJ;YACJ;YAEA,IAAIC,WAAgC,CAAC;YACrC,MAAMC,QAA2C;gBAC7C,eAAe3C,aAAa;gBAC5B,MAAMA,aAAa;gBACnB,QAAQA,aAAa,UAAU;oBAC3B,aAAa;wBACT,CAACe;4BACG2B,WAAW;gCACP,OAAO3B,IAAI,MAAM,CAAC,UAAU;gCAC5B,OAAOA,IAAI,MAAM,CAAC,UAAU;gCAC5B,SAASA,IAAI,MAAM,CAAC,YAAY;gCAChC,QAAQA,IAAI,MAAM,CAAC,WAAW;4BAClC;wBACJ;qBACH;gBACL;YACJ;YAGAF,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACV,YAAYiC;YAChB;YACA7B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,OAAO,EAAE,IAAI,CAAC;YAC9B5B,OAAO4B,SAAS,MAAM,EAAE,IAAI,CAAC;YAG7B7B,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACV,YAAYiC;YAChB;YACA7B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,OAAO,EAAE,IAAI,CAAC;YAC9B5B,OAAO4B,SAAS,MAAM,EAAE,IAAI,CAAC;YAG7B7B,oBAAoB;gBAChB,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACV,YAAYiC;YAChB;YACA7B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,KAAK,EAAE,IAAI,CAAC;YAC5B5B,OAAO4B,SAAS,OAAO,EAAE,IAAI,CAAC;YAC9B5B,OAAO4B,SAAS,MAAM,EAAE,IAAI,CAAC;QACjC;IACJ;IAEAlC,SAAS,yBAAyB;QAC9BC,GAAG,kEAAkE;YACjE,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,MAAMX,aAAa,QAAQ;oBACvB,uBAAuB;wBACnB,CAACe;4BACG,IAAIA,IAAI,MAAM,CAAC,iBACX,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;gBACA,WAAWf,aAAa,aAAa;oBAAE,MAAM;wBAAC;qBAAe;gBAAC;YAClE;YAEA,MAAMY,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;YAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;QAC3C;QAEAH,GAAG,yEAAyE;YACxE,MAAM2B,OAAOxC,YAAY,UAAU;YACnC,MAAMgD,YAAYhD,YAAY,eAAe,aAAa;gBACtD,IAAI;gBACJ,MAAM;YACV;YACA,MAAMc,MAAMP,aAAa;gBAACiC;gBAAMQ;aAAU;YAC1C,MAAMjC,aAAgD;gBAClD,MAAMX,aAAa,QAAQ;oBACvB,uBAAuB;wBACnB,CAACe;4BACG,IAAIA,IAAI,MAAM,CAAC,iBACX,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;gBACA,WAAWf,aAAa;gBACxB,WAAWA,aAAa,aAAa;oBAAE,MAAM;wBAAC;qBAAe;gBAAC;YAClE;YAGA,MAAMY,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;YAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;QAC3C;QAEAH,GAAG,gDAAgD;YAC/C,MAAM2B,OAAOxC,YAAY,UAAU;YACnC,MAAMc,MAAMP,aAAa;gBAACiC;aAAK;YAC/B,MAAMzB,aAAgD;gBAClD,MAAMX,aAAa,QAAQ;oBACvB,uBAAuB;wBACnB,CAACe;4BACG,IAAIA,IAAI,MAAM,CAAC,iBACX,OAAOA,IAAI,KAAK,CAAC;wBAEzB;qBACH;gBACL;gBACA,QAAQf,aAAa;YACzB;YAEA,MAAMY,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAChC;QAEAH,GAAG,yEAAyE;YACxE,MAAMoC,OAAOjD,YAAY,QAAQ;YACjC,MAAMwC,OAAOxC,YAAY,UAAU,QAAQ;gBAAE,IAAI;gBAAQ,MAAM;YAAW;YAC1E,MAAMc,MAAMP,aAAa;gBAAC0C;gBAAMT;aAAK;YACrC,MAAMzB,aAAgD;gBAClD,MAAMX,aAAa,QAAQ;oBACvB,uBAAuB;wBACnB,CAACe,MAA2BA,IAAI,KAAK,CAAC;qBACzC;gBACL;gBACA,MAAMf,aAAa;gBACnB,QAAQA,aAAa;YACzB;YAGA,MAAMY,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;YAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;QAC3C;QAEAH,GAAG,sEAAsE;YACrE,MAAMV,SAASH,YAAY,YAAY;YACvC,MAAMc,MAAMP,aAAa;gBAACJ;aAAO;YACjC,MAAMY,aAAgD;gBAClD,MAAMX,aAAa,QAAQ;oBACvB,uBAAuB;wBACnB,CAACe,MAA2BA,IAAI,KAAK,CAAC;qBACzC;gBACL;gBACA,QAAQf,aAAa,UAAU;oBAC3B,aAAa;wBAAC,CAACe,MAA2BA,IAAI,KAAK,CAAC;qBAAwB;gBAChF;YACJ;YAEA,MAAMH,SAASC,oBAAoB;gBAC/B,eAAe;gBACf,UAAU;gBACV,MAAM;gBACN,UAAUH;gBACVC;YACJ;YAEAG,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;QAC3C;IACJ;AACJ;AAEAJ,SAAS,4BAA4B;IACjCC,GAAG,4CAA4C;QAC3C,MAAMF,KAAKX,YAAY,QAAQ,UAAU;YAAE,IAAI;YAAQ,MAAM;QAAW;QACxE,MAAMoB,OAAOpB,YAAY,QAAQ;QACjC,MAAMc,MAAMP,aAAa;YAACa;YAAMT;SAAG;QACnC,MAAMI,aAAgD;YAClD,MAAMX,aAAa;YACnB,QAAQA,aAAa;QACzB;QAEA,MAAMY,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,uCAAuC;QACtC,MAAMF,KAAKX,YAAY,QAAQ,UAAU;YAAE,IAAI;YAAQ,MAAM;QAAW;QACxE,MAAMoB,OAAOpB,YAAY,QAAQ;QACjC,MAAMc,MAAMP,aAAa;YAACa;YAAMT;SAAG;QACnC,MAAMI,aAAgD;YAClD,MAAMX,aAAa;YACnB,QAAQA,aAAa,UAAU;gBAAE,WAAW;YAAK;QACrD;QAEA,MAAMY,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,wCAAwC;QACvC,MAAMF,KAAKX,YAAY,QAAQ,cAAc;YAAE,IAAI;YAAQ,MAAM;QAAW;QAC5E,MAAMoB,OAAOpB,YAAY,QAAQ;QACjC,MAAMc,MAAMP,aAAa;YAACa;YAAMT;SAAG;QACnC,MAAMI,aAAgD;YAClD,MAAMX,aAAa;YACnB,YAAYA,aAAa,cAAc;gBAAE,WAAW;YAAM;QAC9D;QAEA,MAAMY,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,kDAAkD;QACjD,MAAMsC,SAASnD,YAAY,UAAU;QACrC,MAAM4C,QAAQ5C,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAU,MAAM;QAAe;QACjF,MAAM6C,QAAQ7C,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAU,MAAM;QAAe;QACjF,MAAMoD,QAAQpD,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAU,MAAM;QAAe;QACjF,MAAMc,MAAMP,aAAa;YAAC4C;YAAQP;YAAOC;YAAOO;SAAM,EAAE;YACpD,QAAQ;gBACJ,QAAQ;oBACJ,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;oBAC3D,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;oBAC3D,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;gBAC/D;YACJ;QACJ;QACA,MAAMrC,aAAgD;YAClD,QAAQX,aAAa;YACrB,MAAMA,aAAa,QAAQ;gBACvB,WAAW,CAACe;oBACR,IAAI,CAAEA,CAAAA,IAAI,cAAc,CAAC,UAAU,IAC/B,OAAOA,IAAI,KAAK,CAAC;gBAEzB;YACJ;QACJ;QAEA,MAAMH,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,mDAAmD;QAClD,MAAMsC,SAASnD,YAAY,UAAU;QACrC,MAAM4C,QAAQ5C,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAU,MAAM;QAAe;QACjF,MAAM6C,QAAQ7C,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAU,MAAM;QAAe;QACjF,MAAMc,MAAMP,aAAa;YAAC4C;YAAQP;YAAOC;SAAM,EAAE;YAC7C,QAAQ;gBACJ,QAAQ;oBACJ,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;oBAC3D,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;gBAC/D;YACJ;QACJ;QACA,MAAM9B,aAAgD;YAClD,QAAQX,aAAa;YACrB,MAAMA,aAAa,QAAQ;gBACvB,WAAW,CAACe;oBACR,IAAI,CAAEA,CAAAA,IAAI,cAAc,CAAC,UAAU,IAC/B,OAAOA,IAAI,KAAK,CAAC;gBAEzB;YACJ;QACJ;QAEA,MAAMH,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,wDAAwD;QACvD,MAAMO,OAAOpB,YAAY,QAAQ;QACjC,MAAMW,KAAKX,YAAY,QAAQ,UAAU;YAAE,IAAI;YAAQ,MAAM;QAAW;QACxE,MAAMc,MAAMP,aAAa;YAACa;YAAMT;SAAG;QACnC,MAAMI,aAAgD;YAClD,MAAMX,aAAa;YACnB,QAAQA,aAAa,UAAU;gBAC3B,WAAW;oBACP,MAAM,IAAIyB,MAAM;gBACpB;YACJ;QACJ;QAEA,MAAMb,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;QAC5BE,OAAOF,OAAO,SAAS,CAAE,OAAO,EAAE,IAAI,CAAC;IAC3C;IAEAH,GAAG,wDAAwD;QACvD,MAAMO,OAAOpB,YAAY,QAAQ;QACjC,MAAMwC,OAAOxC,YAAY,UAAU,QAAQ;YAAE,IAAI;YAAQ,MAAM;QAAe;QAC9E,MAAMc,MAAMP,aAAa;YAACa;YAAMoB;SAAK,EAAE;YACnC,MAAM;gBACF,QAAQ;oBACJ,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;oBAC3D,gBAAgB;wBAAE,IAAI;wBAAM,MAAM;wBAAQ,QAAQ;oBAAS;gBAC/D;YACJ;QACJ;QAEA,IAAIa;QACJ,MAAMtC,aAAgD;YAClD,QAAQX,aAAa;YACrB,MAAMA,aAAa,QAAQ;gBACvB,MAAM;oBAAC;iBAAc;gBACrB,WAAW,CAACe;oBACRkC,cAAclC;gBAClB;YACJ;QACJ;QAEA+B,yBAAyB;YACrB,WAAW;YACX,UAAUpC;YACVC;QACJ;QAEAG,OAAOmC,aAAa,WAAW;QAC/BnC,OAAOmC,YAAa,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;QACzCnC,OAAOmC,YAAa,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;YAAC;SAAc;QAC3DnC,OAAOmC,YAAa,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACtCnC,OAAOmC,YAAa,IAAI,EAAE,IAAI,CAAC;QAC/BnC,OAAOmC,YAAa,SAAS,CAAC,WAAW,IAAI,CAAC;QAC9CnC,OAAOmC,YAAa,MAAM,CAAC,gBAAgB,IAAI,CAAC;IACpD;IAEAxC,GAAG,0CAA0C;QACzC,MAAMC,MAAMP,aAAa,EAAE;QAC3B,MAAMQ,aAAgD,CAAC;QAEvD,MAAMC,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;IAEAH,GAAG,2CAA2C;QAC1C,MAAMF,KAAKX,YAAY,QAAQ;QAC/B,MAAMc,MAAMP,aAAa;YAACI;SAAG;QAC7B,MAAMI,aAAgD,CAAC;QAEvD,MAAMC,SAASkC,yBAAyB;YACpC,WAAW;YACX,UAAUpC;YACVC;QACJ;QACAG,OAAOF,OAAO,OAAO,EAAE,IAAI,CAAC;IAChC;AACJ"}