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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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":["ConstraintBlockError","Error","constructor","message","block","buildSlotPattern","slot","match","undefined","RegExp","replace","findChildPosition","element","document","parent","id","inputs","bindings","slotName","test","directBinding","Array","isArray","static","index","indexOf","count","length","pattern","siblingKeys","key","m","push","idx","parseInt","sort","a","b","position","findIndex","val","includes","buildElementContext","components","manifest","component","name","tags","getParent","parentEl","elements","childIndex","pos","childCount","isLastChild","isFirstChild","buildAncestors","parentElement","ancestors","current","countInstances","componentName","hasDescendantWithTag","elementId","tag","el","isDescendant","elManifest","evaluateConstraints","params","parentId","componentManifest","allowed","parentCtx","parentInputs","ctx","isChildOf","isDescendantOf","some","getAncestor","found","find","hasTag","slotChildCount","items","getAncestorInputs","getElementInputs","log","args","console","runConstraint","constraint","fallbackMessage","err","constraints","violation","label","ancestor","descendantConstraints","evaluateDeleteConstraint","canDelete","elementCtx","Object","fromEntries","entries","map","k","v"],"sources":["ConstraintEvaluator.ts"],"sourcesContent":["import type {\n ComponentManifest,\n ComponentConstraint,\n ConstraintContext,\n ConstraintElementContext,\n Document,\n DocumentElement\n} from \"~/types.js\";\n\nclass ConstraintBlockError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nfunction block(message: string): never {\n throw new ConstraintBlockError(message);\n}\n\nexport type ConstraintViolation = {\n message: string;\n};\n\nexport type ConstraintResult = {\n allowed: boolean;\n violation?: ConstraintViolation;\n};\n\nexport interface EvaluateConstraintsParams {\n /** The component being placed */\n componentName: string;\n /** Target parent element ID */\n parentId: string;\n /** Target slot */\n slot: string;\n /** The document */\n document: Document;\n /** All registered component manifests */\n components: Record<string, ComponentManifest>;\n}\n\n/**\n * Build a regex pattern from a slot path, replacing the numeric index with \\d+.\n * E.g., \"steps/2/step\" → /^steps\\/\\d+\\/step$/\n * Returns undefined if the slot has no index segment.\n */\nfunction buildSlotPattern(slot: string): RegExp | undefined {\n const match = slot.match(/\\/(\\d+)\\//);\n if (!match) {\n return undefined;\n }\n return new RegExp(\"^\" + slot.replace(/\\/\\d+\\//, \"/\\\\d+/\") + \"$\");\n}\n\n/**\n * Find the actual index and sibling count for an element in its parent's bindings.\n * Instead of trusting element.parent.slot (which may be stale after reordering),\n * we scan the parent's binding keys to find which slot holds this element's ID.\n * Returns { index, count } or undefined if not in a list slot.\n */\nfunction findChildPosition(\n element: DocumentElement,\n document: Document\n): { index: number; count: number } | undefined {\n if (!element.parent?.id || !element.parent.slot) {\n return undefined;\n }\n\n const inputs = document.bindings[element.parent.id]?.inputs;\n if (!inputs) {\n return undefined;\n }\n\n // Try direct list slot format: binding key = slot name, static = array of IDs.\n // Only when the slot path itself is NOT an indexed sub-key (e.g., \"steps\", not \"steps/0/step\").\n const slotName = element.parent.slot;\n if (!/\\/\\d+\\//.test(slotName)) {\n const directBinding = inputs[slotName];\n if (directBinding && Array.isArray(directBinding.static)) {\n const index = directBinding.static.indexOf(element.id);\n if (index !== -1) {\n return { index, count: directBinding.static.length };\n }\n }\n }\n\n // Fall back to indexed sub-key format: steps/0/step, steps/1/step, etc.\n const pattern = buildSlotPattern(slotName);\n if (!pattern) {\n return undefined;\n }\n\n const siblingKeys: { key: string; idx: number }[] = [];\n for (const key in inputs) {\n if (pattern.test(key)) {\n const m = key.match(/\\/(\\d+)\\//);\n if (m) {\n siblingKeys.push({ key, idx: parseInt(m[1], 10) });\n }\n }\n }\n siblingKeys.sort((a, b) => a.idx - b.idx);\n\n const position = siblingKeys.findIndex(({ key }) => {\n const val = inputs[key]?.static;\n if (Array.isArray(val)) {\n return val.includes(element.id);\n }\n return val === element.id;\n });\n\n if (position === -1) {\n return undefined;\n }\n\n return { index: position, count: siblingKeys.length };\n}\n\nexport function buildElementContext(\n element: DocumentElement,\n components: Record<string, ComponentManifest>,\n document: Document\n): ConstraintElementContext | undefined {\n const manifest = components[element.component.name];\n if (!manifest) {\n return undefined;\n }\n\n return {\n name: element.component.name,\n tags: manifest.tags ?? [],\n getParent() {\n if (!element.parent?.id) {\n return undefined;\n }\n const parentEl = document.elements[element.parent.id];\n if (!parentEl) {\n return undefined;\n }\n return buildElementContext(parentEl, components, document);\n },\n childIndex() {\n const pos = findChildPosition(element, document);\n return pos ? pos.index : -1;\n },\n childCount() {\n const pos = findChildPosition(element, document);\n return pos ? pos.count : -1;\n },\n isLastChild() {\n const pos = findChildPosition(element, document);\n return pos !== undefined && pos.index === pos.count - 1;\n },\n isFirstChild() {\n const pos = findChildPosition(element, document);\n return pos !== undefined && pos.index === 0;\n }\n };\n}\n\nexport interface InternalAncestor {\n element: DocumentElement;\n manifest: ComponentManifest;\n}\n\nexport function buildAncestors(\n parentElement: DocumentElement,\n components: Record<string, ComponentManifest>,\n document: Document\n): InternalAncestor[] {\n const ancestors: InternalAncestor[] = [];\n let current: DocumentElement | undefined = parentElement;\n\n while (current) {\n const manifest = components[current.component.name];\n if (manifest) {\n ancestors.push({ element: current, manifest });\n }\n\n if (current.parent?.id) {\n current = document.elements[current.parent.id];\n } else {\n break;\n }\n }\n\n return ancestors;\n}\n\nfunction countInstances(document: Document, componentName: string): number {\n let count = 0;\n for (const id in document.elements) {\n if (document.elements[id].component.name === componentName) {\n count++;\n }\n }\n return count;\n}\n\nfunction hasDescendantWithTag(\n document: Document,\n components: Record<string, ComponentManifest>,\n elementId: string,\n tag: string\n): boolean {\n for (const id in document.elements) {\n const el = document.elements[id];\n if (id === elementId) {\n continue;\n }\n // Walk up parent chain to see if elementId is an ancestor.\n let current = el.parent?.id ? document.elements[el.parent.id] : undefined;\n let isDescendant = false;\n while (current) {\n if (current.id === elementId) {\n isDescendant = true;\n break;\n }\n current = current.parent?.id ? document.elements[current.parent.id] : undefined;\n }\n if (!isDescendant) {\n continue;\n }\n const elManifest = components[el.component.name];\n if (elManifest?.tags?.includes(tag)) {\n return true;\n }\n }\n return false;\n}\n\nexport function evaluateConstraints(params: EvaluateConstraintsParams): ConstraintResult {\n const { componentName, parentId, slot, document, components } = params;\n\n const componentManifest = components[componentName];\n if (!componentManifest) {\n return { allowed: true };\n }\n\n const parentElement = document.elements[parentId];\n if (!parentElement) {\n return { allowed: true };\n }\n\n const parentCtx = buildElementContext(parentElement, components, document);\n if (!parentCtx) {\n return { allowed: true };\n }\n\n const ancestors = buildAncestors(parentElement, components, document);\n\n const parentInputs = document.bindings[parentElement.id]?.inputs ?? {};\n\n const ctx: ConstraintContext = {\n component: {\n name: componentManifest.name,\n tags: componentManifest.tags ?? [],\n // During placement, the element doesn't exist yet — position is unknown.\n getParent: () => parentCtx,\n childIndex: () => -1,\n childCount: () => -1,\n isLastChild: () => false,\n isFirstChild: () => false\n },\n parent: parentCtx,\n slot,\n isChildOf: (name: string) => parentElement.component.name === name,\n isDescendantOf: (name: string) => ancestors.some(a => a.manifest.name === name),\n getAncestor: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n return found ? buildElementContext(found.element, components, document) : undefined;\n },\n hasTag: (tag: string) => componentManifest.tags?.includes(tag) ?? false,\n slotChildCount: () => {\n const items = parentInputs[slot]?.static;\n return Array.isArray(items) ? items.length : 0;\n },\n countInstances: (name: string) => countInstances(document, name),\n // Element doesn't exist yet during placement — no descendants or inputs to check.\n hasDescendantWithTag: () => false,\n getAncestorInputs: () => undefined,\n getElementInputs: () => ({}),\n log: (...args: any[]) => console.log(...args),\n block\n };\n\n const runConstraint = (\n constraint: ComponentConstraint,\n fallbackMessage: string\n ): ConstraintViolation | undefined => {\n try {\n constraint(ctx);\n } catch (err) {\n if (err instanceof ConstraintBlockError) {\n return { message: err.message };\n }\n return {\n message: err instanceof Error && err.message ? err.message : fallbackMessage\n };\n }\n return undefined;\n };\n\n // Evaluate the placed component's own constraints.\n if (componentManifest.constraints) {\n for (const constraint of componentManifest.constraints) {\n const violation = runConstraint(\n constraint,\n `Cannot place ${componentManifest.label} here.`\n );\n if (violation) {\n return { allowed: false, violation };\n }\n }\n }\n\n // Evaluate descendantConstraints from all ancestors (including direct parent).\n for (const ancestor of ancestors) {\n if (ancestor.manifest.descendantConstraints) {\n for (const constraint of ancestor.manifest.descendantConstraints) {\n const violation = runConstraint(\n constraint,\n `Cannot place ${componentName} inside ${ancestor.manifest.label}.`\n );\n if (violation) {\n return { allowed: false, violation };\n }\n }\n }\n }\n\n return { allowed: true };\n}\n\nexport interface EvaluateDeleteConstraintParams {\n /** The element being deleted */\n elementId: string;\n /** The document */\n document: Document;\n /** All registered component manifests */\n components: Record<string, ComponentManifest>;\n}\n\nexport function evaluateDeleteConstraint(params: EvaluateDeleteConstraintParams): ConstraintResult {\n const { elementId, document, components } = params;\n\n const element = document.elements[elementId];\n if (!element) {\n return { allowed: true };\n }\n\n const manifest = components[element.component.name];\n if (!manifest) {\n return { allowed: true };\n }\n\n const { canDelete } = manifest;\n\n // undefined or true → allowed\n if (canDelete === undefined || canDelete === true) {\n return { allowed: true };\n }\n\n // false → blocked\n if (canDelete === false) {\n return {\n allowed: false,\n violation: {\n message: `${manifest.label} cannot be deleted.`\n }\n };\n }\n\n // ComponentConstraint → evaluate dynamically\n const parentElement = element.parent?.id ? document.elements[element.parent.id] : undefined;\n const parentCtx = parentElement\n ? buildElementContext(parentElement, components, document)\n : undefined;\n\n const ancestors = parentElement ? buildAncestors(parentElement, components, document) : [];\n\n const parentInputs = parentElement ? (document.bindings[parentElement.id]?.inputs ?? {}) : {};\n\n const slot = element.parent?.slot ?? \"\";\n\n const elementCtx = buildElementContext(element, components, document)!;\n\n const ctx: ConstraintContext = {\n component: elementCtx,\n parent: parentCtx ?? {\n name: \"\",\n tags: [],\n getParent: () => undefined,\n childIndex: () => -1,\n childCount: () => -1,\n isLastChild: () => false,\n isFirstChild: () => false\n },\n slot,\n isChildOf: (name: string) => parentElement?.component.name === name,\n isDescendantOf: (name: string) => ancestors.some(a => a.manifest.name === name),\n getAncestor: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n return found ? buildElementContext(found.element, components, document) : undefined;\n },\n hasTag: (tag: string) => manifest.tags?.includes(tag) ?? false,\n slotChildCount: () => {\n const items = parentInputs[slot]?.static;\n return Array.isArray(items) ? items.length : 0;\n },\n countInstances: (name: string) => countInstances(document, name),\n hasDescendantWithTag: (tag: string) =>\n hasDescendantWithTag(document, components, element.id, tag),\n getAncestorInputs: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n if (!found) {\n return undefined;\n }\n const bindings = document.bindings[found.element.id]?.inputs ?? {};\n return Object.fromEntries(\n Object.entries(bindings).map(([k, v]) => [k, (v as any)?.static])\n );\n },\n getElementInputs: () => {\n const bindings = document.bindings[element.id]?.inputs ?? {};\n return Object.fromEntries(\n Object.entries(bindings).map(([k, v]) => [k, (v as any)?.static])\n );\n },\n log: (...args: any[]) => console.log(...args),\n block\n };\n\n const fallbackMessage = `${manifest.label} cannot be deleted.`;\n try {\n canDelete(ctx);\n } catch (err) {\n if (err instanceof ConstraintBlockError) {\n return { allowed: false, violation: { message: err.message } };\n }\n return {\n allowed: false,\n violation: {\n message: err instanceof Error && err.message ? err.message : fallbackMessage\n }\n };\n }\n\n return { allowed: true };\n}\n"],"mappings":"AASA,MAAMA,oBAAoB,SAASC,KAAK,CAAC;EACrCC,WAAWA,CAACC,OAAe,EAAE;IACzB,KAAK,CAACA,OAAO,CAAC;EAClB;AACJ;AAEA,SAASC,KAAKA,CAACD,OAAe,EAAS;EACnC,MAAM,IAAIH,oBAAoB,CAACG,OAAO,CAAC;AAC3C;AAwBA;AACA;AACA;AACA;AACA;AACA,SAASE,gBAAgBA,CAACC,IAAY,EAAsB;EACxD,MAAMC,KAAK,GAAGD,IAAI,CAACC,KAAK,CAAC,WAAW,CAAC;EACrC,IAAI,CAACA,KAAK,EAAE;IACR,OAAOC,SAAS;EACpB;EACA,OAAO,IAAIC,MAAM,CAAC,GAAG,GAAGH,IAAI,CAACI,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iBAAiBA,CACtBC,OAAwB,EACxBC,QAAkB,EAC0B;EAC5C,IAAI,CAACD,OAAO,CAACE,MAAM,EAAEC,EAAE,IAAI,CAACH,OAAO,CAACE,MAAM,CAACR,IAAI,EAAE;IAC7C,OAAOE,SAAS;EACpB;EAEA,MAAMQ,MAAM,GAAGH,QAAQ,CAACI,QAAQ,CAACL,OAAO,CAACE,MAAM,CAACC,EAAE,CAAC,EAAEC,MAAM;EAC3D,IAAI,CAACA,MAAM,EAAE;IACT,OAAOR,SAAS;EACpB;;EAEA;EACA;EACA,MAAMU,QAAQ,GAAGN,OAAO,CAACE,MAAM,CAACR,IAAI;EACpC,IAAI,CAAC,SAAS,CAACa,IAAI,CAACD,QAAQ,CAAC,EAAE;IAC3B,MAAME,aAAa,GAAGJ,MAAM,CAACE,QAAQ,CAAC;IACtC,IAAIE,aAAa,IAAIC,KAAK,CAACC,OAAO,CAACF,aAAa,CAACG,MAAM,CAAC,EAAE;MACtD,MAAMC,KAAK,GAAGJ,aAAa,CAACG,MAAM,CAACE,OAAO,CAACb,OAAO,CAACG,EAAE,CAAC;MACtD,IAAIS,KAAK,KAAK,CAAC,CAAC,EAAE;QACd,OAAO;UAAEA,KAAK;UAAEE,KAAK,EAAEN,aAAa,CAACG,MAAM,CAACI;QAAO,CAAC;MACxD;IACJ;EACJ;;EAEA;EACA,MAAMC,OAAO,GAAGvB,gBAAgB,CAACa,QAAQ,CAAC;EAC1C,IAAI,CAACU,OAAO,EAAE;IACV,OAAOpB,SAAS;EACpB;EAEA,MAAMqB,WAA2C,GAAG,EAAE;EACtD,KAAK,MAAMC,GAAG,IAAId,MAAM,EAAE;IACtB,IAAIY,OAAO,CAACT,IAAI,CAACW,GAAG,CAAC,EAAE;MACnB,MAAMC,CAAC,GAAGD,GAAG,CAACvB,KAAK,CAAC,WAAW,CAAC;MAChC,IAAIwB,CAAC,EAAE;QACHF,WAAW,CAACG,IAAI,CAAC;UAAEF,GAAG;UAAEG,GAAG,EAAEC,QAAQ,CAACH,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QAAE,CAAC,CAAC;MACtD;IACJ;EACJ;EACAF,WAAW,CAACM,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACH,GAAG,GAAGI,CAAC,CAACJ,GAAG,CAAC;EAEzC,MAAMK,QAAQ,GAAGT,WAAW,CAACU,SAAS,CAAC,CAAC;IAAET;EAAI,CAAC,KAAK;IAChD,MAAMU,GAAG,GAAGxB,MAAM,CAACc,GAAG,CAAC,EAAEP,MAAM;IAC/B,IAAIF,KAAK,CAACC,OAAO,CAACkB,GAAG,CAAC,EAAE;MACpB,OAAOA,GAAG,CAACC,QAAQ,CAAC7B,OAAO,CAACG,EAAE,CAAC;IACnC;IACA,OAAOyB,GAAG,KAAK5B,OAAO,CAACG,EAAE;EAC7B,CAAC,CAAC;EAEF,IAAIuB,QAAQ,KAAK,CAAC,CAAC,EAAE;IACjB,OAAO9B,SAAS;EACpB;EAEA,OAAO;IAAEgB,KAAK,EAAEc,QAAQ;IAAEZ,KAAK,EAAEG,WAAW,CAACF;EAAO,CAAC;AACzD;AAEA,OAAO,SAASe,mBAAmBA,CAC/B9B,OAAwB,EACxB+B,UAA6C,EAC7C9B,QAAkB,EACkB;EACpC,MAAM+B,QAAQ,GAAGD,UAAU,CAAC/B,OAAO,CAACiC,SAAS,CAACC,IAAI,CAAC;EACnD,IAAI,CAACF,QAAQ,EAAE;IACX,OAAOpC,SAAS;EACpB;EAEA,OAAO;IACHsC,IAAI,EAAElC,OAAO,CAACiC,SAAS,CAACC,IAAI;IAC5BC,IAAI,EAAEH,QAAQ,CAACG,IAAI,IAAI,EAAE;IACzBC,SAASA,CAAA,EAAG;MACR,IAAI,CAACpC,OAAO,CAACE,MAAM,EAAEC,EAAE,EAAE;QACrB,OAAOP,SAAS;MACpB;MACA,MAAMyC,QAAQ,GAAGpC,QAAQ,CAACqC,QAAQ,CAACtC,OAAO,CAACE,MAAM,CAACC,EAAE,CAAC;MACrD,IAAI,CAACkC,QAAQ,EAAE;QACX,OAAOzC,SAAS;MACpB;MACA,OAAOkC,mBAAmB,CAACO,QAAQ,EAAEN,UAAU,EAAE9B,QAAQ,CAAC;IAC9D,CAAC;IACDsC,UAAUA,CAAA,EAAG;MACT,MAAMC,GAAG,GAAGzC,iBAAiB,CAACC,OAAO,EAAEC,QAAQ,CAAC;MAChD,OAAOuC,GAAG,GAAGA,GAAG,CAAC5B,KAAK,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD6B,UAAUA,CAAA,EAAG;MACT,MAAMD,GAAG,GAAGzC,iBAAiB,CAACC,OAAO,EAAEC,QAAQ,CAAC;MAChD,OAAOuC,GAAG,GAAGA,GAAG,CAAC1B,KAAK,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD4B,WAAWA,CAAA,EAAG;MACV,MAAMF,GAAG,GAAGzC,iBAAiB,CAACC,OAAO,EAAEC,QAAQ,CAAC;MAChD,OAAOuC,GAAG,KAAK5C,SAAS,IAAI4C,GAAG,CAAC5B,KAAK,KAAK4B,GAAG,CAAC1B,KAAK,GAAG,CAAC;IAC3D,CAAC;IACD6B,YAAYA,CAAA,EAAG;MACX,MAAMH,GAAG,GAAGzC,iBAAiB,CAACC,OAAO,EAAEC,QAAQ,CAAC;MAChD,OAAOuC,GAAG,KAAK5C,SAAS,IAAI4C,GAAG,CAAC5B,KAAK,KAAK,CAAC;IAC/C;EACJ,CAAC;AACL;AAOA,OAAO,SAASgC,cAAcA,CAC1BC,aAA8B,EAC9Bd,UAA6C,EAC7C9B,QAAkB,EACA;EAClB,MAAM6C,SAA6B,GAAG,EAAE;EACxC,IAAIC,OAAoC,GAAGF,aAAa;EAExD,OAAOE,OAAO,EAAE;IACZ,MAAMf,QAAQ,GAAGD,UAAU,CAACgB,OAAO,CAACd,SAAS,CAACC,IAAI,CAAC;IACnD,IAAIF,QAAQ,EAAE;MACVc,SAAS,CAAC1B,IAAI,CAAC;QAAEpB,OAAO,EAAE+C,OAAO;QAAEf;MAAS,CAAC,CAAC;IAClD;IAEA,IAAIe,OAAO,CAAC7C,MAAM,EAAEC,EAAE,EAAE;MACpB4C,OAAO,GAAG9C,QAAQ,CAACqC,QAAQ,CAACS,OAAO,CAAC7C,MAAM,CAACC,EAAE,CAAC;IAClD,CAAC,MAAM;MACH;IACJ;EACJ;EAEA,OAAO2C,SAAS;AACpB;AAEA,SAASE,cAAcA,CAAC/C,QAAkB,EAAEgD,aAAqB,EAAU;EACvE,IAAInC,KAAK,GAAG,CAAC;EACb,KAAK,MAAMX,EAAE,IAAIF,QAAQ,CAACqC,QAAQ,EAAE;IAChC,IAAIrC,QAAQ,CAACqC,QAAQ,CAACnC,EAAE,CAAC,CAAC8B,SAAS,CAACC,IAAI,KAAKe,aAAa,EAAE;MACxDnC,KAAK,EAAE;IACX;EACJ;EACA,OAAOA,KAAK;AAChB;AAEA,SAASoC,oBAAoBA,CACzBjD,QAAkB,EAClB8B,UAA6C,EAC7CoB,SAAiB,EACjBC,GAAW,EACJ;EACP,KAAK,MAAMjD,EAAE,IAAIF,QAAQ,CAACqC,QAAQ,EAAE;IAChC,MAAMe,EAAE,GAAGpD,QAAQ,CAACqC,QAAQ,CAACnC,EAAE,CAAC;IAChC,IAAIA,EAAE,KAAKgD,SAAS,EAAE;MAClB;IACJ;IACA;IACA,IAAIJ,OAAO,GAAGM,EAAE,CAACnD,MAAM,EAAEC,EAAE,GAAGF,QAAQ,CAACqC,QAAQ,CAACe,EAAE,CAACnD,MAAM,CAACC,EAAE,CAAC,GAAGP,SAAS;IACzE,IAAI0D,YAAY,GAAG,KAAK;IACxB,OAAOP,OAAO,EAAE;MACZ,IAAIA,OAAO,CAAC5C,EAAE,KAAKgD,SAAS,EAAE;QAC1BG,YAAY,GAAG,IAAI;QACnB;MACJ;MACAP,OAAO,GAAGA,OAAO,CAAC7C,MAAM,EAAEC,EAAE,GAAGF,QAAQ,CAACqC,QAAQ,CAACS,OAAO,CAAC7C,MAAM,CAACC,EAAE,CAAC,GAAGP,SAAS;IACnF;IACA,IAAI,CAAC0D,YAAY,EAAE;MACf;IACJ;IACA,MAAMC,UAAU,GAAGxB,UAAU,CAACsB,EAAE,CAACpB,SAAS,CAACC,IAAI,CAAC;IAChD,IAAIqB,UAAU,EAAEpB,IAAI,EAAEN,QAAQ,CAACuB,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACf;EACJ;EACA,OAAO,KAAK;AAChB;AAEA,OAAO,SAASI,mBAAmBA,CAACC,MAAiC,EAAoB;EACrF,MAAM;IAAER,aAAa;IAAES,QAAQ;IAAEhE,IAAI;IAAEO,QAAQ;IAAE8B;EAAW,CAAC,GAAG0B,MAAM;EAEtE,MAAME,iBAAiB,GAAG5B,UAAU,CAACkB,aAAa,CAAC;EACnD,IAAI,CAACU,iBAAiB,EAAE;IACpB,OAAO;MAAEC,OAAO,EAAE;IAAK,CAAC;EAC5B;EAEA,MAAMf,aAAa,GAAG5C,QAAQ,CAACqC,QAAQ,CAACoB,QAAQ,CAAC;EACjD,IAAI,CAACb,aAAa,EAAE;IAChB,OAAO;MAAEe,OAAO,EAAE;IAAK,CAAC;EAC5B;EAEA,MAAMC,SAAS,GAAG/B,mBAAmB,CAACe,aAAa,EAAEd,UAAU,EAAE9B,QAAQ,CAAC;EAC1E,IAAI,CAAC4D,SAAS,EAAE;IACZ,OAAO;MAAED,OAAO,EAAE;IAAK,CAAC;EAC5B;EAEA,MAAMd,SAAS,GAAGF,cAAc,CAACC,aAAa,EAAEd,UAAU,EAAE9B,QAAQ,CAAC;EAErE,MAAM6D,YAAY,GAAG7D,QAAQ,CAACI,QAAQ,CAACwC,aAAa,CAAC1C,EAAE,CAAC,EAAEC,MAAM,IAAI,CAAC,CAAC;EAEtE,MAAM2D,GAAsB,GAAG;IAC3B9B,SAAS,EAAE;MACPC,IAAI,EAAEyB,iBAAiB,CAACzB,IAAI;MAC5BC,IAAI,EAAEwB,iBAAiB,CAACxB,IAAI,IAAI,EAAE;MAClC;MACAC,SAAS,EAAEA,CAAA,KAAMyB,SAAS;MAC1BtB,UAAU,EAAEA,CAAA,KAAM,CAAC,CAAC;MACpBE,UAAU,EAAEA,CAAA,KAAM,CAAC,CAAC;MACpBC,WAAW,EAAEA,CAAA,KAAM,KAAK;MACxBC,YAAY,EAAEA,CAAA,KAAM;IACxB,CAAC;IACDzC,MAAM,EAAE2D,SAAS;IACjBnE,IAAI;IACJsE,SAAS,EAAG9B,IAAY,IAAKW,aAAa,CAACZ,SAAS,CAACC,IAAI,KAAKA,IAAI;IAClE+B,cAAc,EAAG/B,IAAY,IAAKY,SAAS,CAACoB,IAAI,CAAC1C,CAAC,IAAIA,CAAC,CAACQ,QAAQ,CAACE,IAAI,KAAKA,IAAI,CAAC;IAC/EiC,WAAW,EAAGjC,IAAY,IAAK;MAC3B,MAAMkC,KAAK,GAAGtB,SAAS,CAACuB,IAAI,CAAC7C,CAAC,IAAIA,CAAC,CAACQ,QAAQ,CAACE,IAAI,KAAKA,IAAI,CAAC;MAC3D,OAAOkC,KAAK,GAAGtC,mBAAmB,CAACsC,KAAK,CAACpE,OAAO,EAAE+B,UAAU,EAAE9B,QAAQ,CAAC,GAAGL,SAAS;IACvF,CAAC;IACD0E,MAAM,EAAGlB,GAAW,IAAKO,iBAAiB,CAACxB,IAAI,EAAEN,QAAQ,CAACuB,GAAG,CAAC,IAAI,KAAK;IACvEmB,cAAc,EAAEA,CAAA,KAAM;MAClB,MAAMC,KAAK,GAAGV,YAAY,CAACpE,IAAI,CAAC,EAAEiB,MAAM;MACxC,OAAOF,KAAK,CAACC,OAAO,CAAC8D,KAAK,CAAC,GAAGA,KAAK,CAACzD,MAAM,GAAG,CAAC;IAClD,CAAC;IACDiC,cAAc,EAAGd,IAAY,IAAKc,cAAc,CAAC/C,QAAQ,EAAEiC,IAAI,CAAC;IAChE;IACAgB,oBAAoB,EAAEA,CAAA,KAAM,KAAK;IACjCuB,iBAAiB,EAAEA,CAAA,KAAM7E,SAAS;IAClC8E,gBAAgB,EAAEA,CAAA,MAAO,CAAC,CAAC,CAAC;IAC5BC,GAAG,EAAEA,CAAC,GAAGC,IAAW,KAAKC,OAAO,CAACF,GAAG,CAAC,GAAGC,IAAI,CAAC;IAC7CpF;EACJ,CAAC;EAED,MAAMsF,aAAa,GAAGA,CAClBC,UAA+B,EAC/BC,eAAuB,KACW;IAClC,IAAI;MACAD,UAAU,CAAChB,GAAG,CAAC;IACnB,CAAC,CAAC,OAAOkB,GAAG,EAAE;MACV,IAAIA,GAAG,YAAY7F,oBAAoB,EAAE;QACrC,OAAO;UAAEG,OAAO,EAAE0F,GAAG,CAAC1F;QAAQ,CAAC;MACnC;MACA,OAAO;QACHA,OAAO,EAAE0F,GAAG,YAAY5F,KAAK,IAAI4F,GAAG,CAAC1F,OAAO,GAAG0F,GAAG,CAAC1F,OAAO,GAAGyF;MACjE,CAAC;IACL;IACA,OAAOpF,SAAS;EACpB,CAAC;;EAED;EACA,IAAI+D,iBAAiB,CAACuB,WAAW,EAAE;IAC/B,KAAK,MAAMH,UAAU,IAAIpB,iBAAiB,CAACuB,WAAW,EAAE;MACpD,MAAMC,SAAS,GAAGL,aAAa,CAC3BC,UAAU,EACV,gBAAgBpB,iBAAiB,CAACyB,KAAK,QAC3C,CAAC;MACD,IAAID,SAAS,EAAE;QACX,OAAO;UAAEvB,OAAO,EAAE,KAAK;UAAEuB;QAAU,CAAC;MACxC;IACJ;EACJ;;EAEA;EACA,KAAK,MAAME,QAAQ,IAAIvC,SAAS,EAAE;IAC9B,IAAIuC,QAAQ,CAACrD,QAAQ,CAACsD,qBAAqB,EAAE;MACzC,KAAK,MAAMP,UAAU,IAAIM,QAAQ,CAACrD,QAAQ,CAACsD,qBAAqB,EAAE;QAC9D,MAAMH,SAAS,GAAGL,aAAa,CAC3BC,UAAU,EACV,gBAAgB9B,aAAa,WAAWoC,QAAQ,CAACrD,QAAQ,CAACoD,KAAK,GACnE,CAAC;QACD,IAAID,SAAS,EAAE;UACX,OAAO;YAAEvB,OAAO,EAAE,KAAK;YAAEuB;UAAU,CAAC;QACxC;MACJ;IACJ;EACJ;EAEA,OAAO;IAAEvB,OAAO,EAAE;EAAK,CAAC;AAC5B;AAWA,OAAO,SAAS2B,wBAAwBA,CAAC9B,MAAsC,EAAoB;EAC/F,MAAM;IAAEN,SAAS;IAAElD,QAAQ;IAAE8B;EAAW,CAAC,GAAG0B,MAAM;EAElD,MAAMzD,OAAO,GAAGC,QAAQ,CAACqC,QAAQ,CAACa,SAAS,CAAC;EAC5C,IAAI,CAACnD,OAAO,EAAE;IACV,OAAO;MAAE4D,OAAO,EAAE;IAAK,CAAC;EAC5B;EAEA,MAAM5B,QAAQ,GAAGD,UAAU,CAAC/B,OAAO,CAACiC,SAAS,CAACC,IAAI,CAAC;EACnD,IAAI,CAACF,QAAQ,EAAE;IACX,OAAO;MAAE4B,OAAO,EAAE;IAAK,CAAC;EAC5B;EAEA,MAAM;IAAE4B;EAAU,CAAC,GAAGxD,QAAQ;;EAE9B;EACA,IAAIwD,SAAS,KAAK5F,SAAS,IAAI4F,SAAS,KAAK,IAAI,EAAE;IAC/C,OAAO;MAAE5B,OAAO,EAAE;IAAK,CAAC;EAC5B;;EAEA;EACA,IAAI4B,SAAS,KAAK,KAAK,EAAE;IACrB,OAAO;MACH5B,OAAO,EAAE,KAAK;MACduB,SAAS,EAAE;QACP5F,OAAO,EAAE,GAAGyC,QAAQ,CAACoD,KAAK;MAC9B;IACJ,CAAC;EACL;;EAEA;EACA,MAAMvC,aAAa,GAAG7C,OAAO,CAACE,MAAM,EAAEC,EAAE,GAAGF,QAAQ,CAACqC,QAAQ,CAACtC,OAAO,CAACE,MAAM,CAACC,EAAE,CAAC,GAAGP,SAAS;EAC3F,MAAMiE,SAAS,GAAGhB,aAAa,GACzBf,mBAAmB,CAACe,aAAa,EAAEd,UAAU,EAAE9B,QAAQ,CAAC,GACxDL,SAAS;EAEf,MAAMkD,SAAS,GAAGD,aAAa,GAAGD,cAAc,CAACC,aAAa,EAAEd,UAAU,EAAE9B,QAAQ,CAAC,GAAG,EAAE;EAE1F,MAAM6D,YAAY,GAAGjB,aAAa,GAAI5C,QAAQ,CAACI,QAAQ,CAACwC,aAAa,CAAC1C,EAAE,CAAC,EAAEC,MAAM,IAAI,CAAC,CAAC,GAAI,CAAC,CAAC;EAE7F,MAAMV,IAAI,GAAGM,OAAO,CAACE,MAAM,EAAER,IAAI,IAAI,EAAE;EAEvC,MAAM+F,UAAU,GAAG3D,mBAAmB,CAAC9B,OAAO,EAAE+B,UAAU,EAAE9B,QAAQ,CAAE;EAEtE,MAAM8D,GAAsB,GAAG;IAC3B9B,SAAS,EAAEwD,UAAU;IACrBvF,MAAM,EAAE2D,SAAS,IAAI;MACjB3B,IAAI,EAAE,EAAE;MACRC,IAAI,EAAE,EAAE;MACRC,SAAS,EAAEA,CAAA,KAAMxC,SAAS;MAC1B2C,UAAU,EAAEA,CAAA,KAAM,CAAC,CAAC;MACpBE,UAAU,EAAEA,CAAA,KAAM,CAAC,CAAC;MACpBC,WAAW,EAAEA,CAAA,KAAM,KAAK;MACxBC,YAAY,EAAEA,CAAA,KAAM;IACxB,CAAC;IACDjD,IAAI;IACJsE,SAAS,EAAG9B,IAAY,IAAKW,aAAa,EAAEZ,SAAS,CAACC,IAAI,KAAKA,IAAI;IACnE+B,cAAc,EAAG/B,IAAY,IAAKY,SAAS,CAACoB,IAAI,CAAC1C,CAAC,IAAIA,CAAC,CAACQ,QAAQ,CAACE,IAAI,KAAKA,IAAI,CAAC;IAC/EiC,WAAW,EAAGjC,IAAY,IAAK;MAC3B,MAAMkC,KAAK,GAAGtB,SAAS,CAACuB,IAAI,CAAC7C,CAAC,IAAIA,CAAC,CAACQ,QAAQ,CAACE,IAAI,KAAKA,IAAI,CAAC;MAC3D,OAAOkC,KAAK,GAAGtC,mBAAmB,CAACsC,KAAK,CAACpE,OAAO,EAAE+B,UAAU,EAAE9B,QAAQ,CAAC,GAAGL,SAAS;IACvF,CAAC;IACD0E,MAAM,EAAGlB,GAAW,IAAKpB,QAAQ,CAACG,IAAI,EAAEN,QAAQ,CAACuB,GAAG,CAAC,IAAI,KAAK;IAC9DmB,cAAc,EAAEA,CAAA,KAAM;MAClB,MAAMC,KAAK,GAAGV,YAAY,CAACpE,IAAI,CAAC,EAAEiB,MAAM;MACxC,OAAOF,KAAK,CAACC,OAAO,CAAC8D,KAAK,CAAC,GAAGA,KAAK,CAACzD,MAAM,GAAG,CAAC;IAClD,CAAC;IACDiC,cAAc,EAAGd,IAAY,IAAKc,cAAc,CAAC/C,QAAQ,EAAEiC,IAAI,CAAC;IAChEgB,oBAAoB,EAAGE,GAAW,IAC9BF,oBAAoB,CAACjD,QAAQ,EAAE8B,UAAU,EAAE/B,OAAO,CAACG,EAAE,EAAEiD,GAAG,CAAC;IAC/DqB,iBAAiB,EAAGvC,IAAY,IAAK;MACjC,MAAMkC,KAAK,GAAGtB,SAAS,CAACuB,IAAI,CAAC7C,CAAC,IAAIA,CAAC,CAACQ,QAAQ,CAACE,IAAI,KAAKA,IAAI,CAAC;MAC3D,IAAI,CAACkC,KAAK,EAAE;QACR,OAAOxE,SAAS;MACpB;MACA,MAAMS,QAAQ,GAAGJ,QAAQ,CAACI,QAAQ,CAAC+D,KAAK,CAACpE,OAAO,CAACG,EAAE,CAAC,EAAEC,MAAM,IAAI,CAAC,CAAC;MAClE,OAAOsF,MAAM,CAACC,WAAW,CACrBD,MAAM,CAACE,OAAO,CAACvF,QAAQ,CAAC,CAACwF,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK,CAACD,CAAC,EAAGC,CAAC,EAAUpF,MAAM,CAAC,CACpE,CAAC;IACL,CAAC;IACD+D,gBAAgB,EAAEA,CAAA,KAAM;MACpB,MAAMrE,QAAQ,GAAGJ,QAAQ,CAACI,QAAQ,CAACL,OAAO,CAACG,EAAE,CAAC,EAAEC,MAAM,IAAI,CAAC,CAAC;MAC5D,OAAOsF,MAAM,CAACC,WAAW,CACrBD,MAAM,CAACE,OAAO,CAACvF,QAAQ,CAAC,CAACwF,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK,CAACD,CAAC,EAAGC,CAAC,EAAUpF,MAAM,CAAC,CACpE,CAAC;IACL,CAAC;IACDgE,GAAG,EAAEA,CAAC,GAAGC,IAAW,KAAKC,OAAO,CAACF,GAAG,CAAC,GAAGC,IAAI,CAAC;IAC7CpF;EACJ,CAAC;EAED,MAAMwF,eAAe,GAAG,GAAGhD,QAAQ,CAACoD,KAAK,qBAAqB;EAC9D,IAAI;IACAI,SAAS,CAACzB,GAAG,CAAC;EAClB,CAAC,CAAC,OAAOkB,GAAG,EAAE;IACV,IAAIA,GAAG,YAAY7F,oBAAoB,EAAE;MACrC,OAAO;QAAEwE,OAAO,EAAE,KAAK;QAAEuB,SAAS,EAAE;UAAE5F,OAAO,EAAE0F,GAAG,CAAC1F;QAAQ;MAAE,CAAC;IAClE;IACA,OAAO;MACHqE,OAAO,EAAE,KAAK;MACduB,SAAS,EAAE;QACP5F,OAAO,EAAE0F,GAAG,YAAY5F,KAAK,IAAI4F,GAAG,CAAC1F,OAAO,GAAG0F,GAAG,CAAC1F,OAAO,GAAGyF;MACjE;IACJ,CAAC;EACL;EAEA,OAAO;IAAEpB,OAAO,EAAE;EAAK,CAAC;AAC5B","ignoreList":[]}
1
+ {"version":3,"file":"ConstraintEvaluator.js","sources":["../src/ConstraintEvaluator.ts"],"sourcesContent":["import type {\n ComponentManifest,\n ComponentConstraint,\n ConstraintContext,\n ConstraintElementContext,\n Document,\n DocumentElement\n} from \"~/types.js\";\n\nclass ConstraintBlockError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nfunction block(message: string): never {\n throw new ConstraintBlockError(message);\n}\n\nexport type ConstraintViolation = {\n message: string;\n};\n\nexport type ConstraintResult = {\n allowed: boolean;\n violation?: ConstraintViolation;\n};\n\nexport interface EvaluateConstraintsParams {\n /** The component being placed */\n componentName: string;\n /** Target parent element ID */\n parentId: string;\n /** Target slot */\n slot: string;\n /** The document */\n document: Document;\n /** All registered component manifests */\n components: Record<string, ComponentManifest>;\n}\n\n/**\n * Build a regex pattern from a slot path, replacing the numeric index with \\d+.\n * E.g., \"steps/2/step\" → /^steps\\/\\d+\\/step$/\n * Returns undefined if the slot has no index segment.\n */\nfunction buildSlotPattern(slot: string): RegExp | undefined {\n const match = slot.match(/\\/(\\d+)\\//);\n if (!match) {\n return undefined;\n }\n return new RegExp(\"^\" + slot.replace(/\\/\\d+\\//, \"/\\\\d+/\") + \"$\");\n}\n\n/**\n * Find the actual index and sibling count for an element in its parent's bindings.\n * Instead of trusting element.parent.slot (which may be stale after reordering),\n * we scan the parent's binding keys to find which slot holds this element's ID.\n * Returns { index, count } or undefined if not in a list slot.\n */\nfunction findChildPosition(\n element: DocumentElement,\n document: Document\n): { index: number; count: number } | undefined {\n if (!element.parent?.id || !element.parent.slot) {\n return undefined;\n }\n\n const inputs = document.bindings[element.parent.id]?.inputs;\n if (!inputs) {\n return undefined;\n }\n\n // Try direct list slot format: binding key = slot name, static = array of IDs.\n // Only when the slot path itself is NOT an indexed sub-key (e.g., \"steps\", not \"steps/0/step\").\n const slotName = element.parent.slot;\n if (!/\\/\\d+\\//.test(slotName)) {\n const directBinding = inputs[slotName];\n if (directBinding && Array.isArray(directBinding.static)) {\n const index = directBinding.static.indexOf(element.id);\n if (index !== -1) {\n return { index, count: directBinding.static.length };\n }\n }\n }\n\n // Fall back to indexed sub-key format: steps/0/step, steps/1/step, etc.\n const pattern = buildSlotPattern(slotName);\n if (!pattern) {\n return undefined;\n }\n\n const siblingKeys: { key: string; idx: number }[] = [];\n for (const key in inputs) {\n if (pattern.test(key)) {\n const m = key.match(/\\/(\\d+)\\//);\n if (m) {\n siblingKeys.push({ key, idx: parseInt(m[1], 10) });\n }\n }\n }\n siblingKeys.sort((a, b) => a.idx - b.idx);\n\n const position = siblingKeys.findIndex(({ key }) => {\n const val = inputs[key]?.static;\n if (Array.isArray(val)) {\n return val.includes(element.id);\n }\n return val === element.id;\n });\n\n if (position === -1) {\n return undefined;\n }\n\n return { index: position, count: siblingKeys.length };\n}\n\nexport function buildElementContext(\n element: DocumentElement,\n components: Record<string, ComponentManifest>,\n document: Document\n): ConstraintElementContext | undefined {\n const manifest = components[element.component.name];\n if (!manifest) {\n return undefined;\n }\n\n return {\n name: element.component.name,\n tags: manifest.tags ?? [],\n getParent() {\n if (!element.parent?.id) {\n return undefined;\n }\n const parentEl = document.elements[element.parent.id];\n if (!parentEl) {\n return undefined;\n }\n return buildElementContext(parentEl, components, document);\n },\n childIndex() {\n const pos = findChildPosition(element, document);\n return pos ? pos.index : -1;\n },\n childCount() {\n const pos = findChildPosition(element, document);\n return pos ? pos.count : -1;\n },\n isLastChild() {\n const pos = findChildPosition(element, document);\n return pos !== undefined && pos.index === pos.count - 1;\n },\n isFirstChild() {\n const pos = findChildPosition(element, document);\n return pos !== undefined && pos.index === 0;\n }\n };\n}\n\nexport interface InternalAncestor {\n element: DocumentElement;\n manifest: ComponentManifest;\n}\n\nexport function buildAncestors(\n parentElement: DocumentElement,\n components: Record<string, ComponentManifest>,\n document: Document\n): InternalAncestor[] {\n const ancestors: InternalAncestor[] = [];\n let current: DocumentElement | undefined = parentElement;\n\n while (current) {\n const manifest = components[current.component.name];\n if (manifest) {\n ancestors.push({ element: current, manifest });\n }\n\n if (current.parent?.id) {\n current = document.elements[current.parent.id];\n } else {\n break;\n }\n }\n\n return ancestors;\n}\n\nfunction countInstances(document: Document, componentName: string): number {\n let count = 0;\n for (const id in document.elements) {\n if (document.elements[id].component.name === componentName) {\n count++;\n }\n }\n return count;\n}\n\nfunction hasDescendantWithTag(\n document: Document,\n components: Record<string, ComponentManifest>,\n elementId: string,\n tag: string\n): boolean {\n for (const id in document.elements) {\n const el = document.elements[id];\n if (id === elementId) {\n continue;\n }\n // Walk up parent chain to see if elementId is an ancestor.\n let current = el.parent?.id ? document.elements[el.parent.id] : undefined;\n let isDescendant = false;\n while (current) {\n if (current.id === elementId) {\n isDescendant = true;\n break;\n }\n current = current.parent?.id ? document.elements[current.parent.id] : undefined;\n }\n if (!isDescendant) {\n continue;\n }\n const elManifest = components[el.component.name];\n if (elManifest?.tags?.includes(tag)) {\n return true;\n }\n }\n return false;\n}\n\nexport function evaluateConstraints(params: EvaluateConstraintsParams): ConstraintResult {\n const { componentName, parentId, slot, document, components } = params;\n\n const componentManifest = components[componentName];\n if (!componentManifest) {\n return { allowed: true };\n }\n\n const parentElement = document.elements[parentId];\n if (!parentElement) {\n return { allowed: true };\n }\n\n const parentCtx = buildElementContext(parentElement, components, document);\n if (!parentCtx) {\n return { allowed: true };\n }\n\n const ancestors = buildAncestors(parentElement, components, document);\n\n const parentInputs = document.bindings[parentElement.id]?.inputs ?? {};\n\n const ctx: ConstraintContext = {\n component: {\n name: componentManifest.name,\n tags: componentManifest.tags ?? [],\n // During placement, the element doesn't exist yet — position is unknown.\n getParent: () => parentCtx,\n childIndex: () => -1,\n childCount: () => -1,\n isLastChild: () => false,\n isFirstChild: () => false\n },\n parent: parentCtx,\n slot,\n isChildOf: (name: string) => parentElement.component.name === name,\n isDescendantOf: (name: string) => ancestors.some(a => a.manifest.name === name),\n getAncestor: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n return found ? buildElementContext(found.element, components, document) : undefined;\n },\n hasTag: (tag: string) => componentManifest.tags?.includes(tag) ?? false,\n slotChildCount: () => {\n const items = parentInputs[slot]?.static;\n return Array.isArray(items) ? items.length : 0;\n },\n countInstances: (name: string) => countInstances(document, name),\n // Element doesn't exist yet during placement — no descendants or inputs to check.\n hasDescendantWithTag: () => false,\n getAncestorInputs: () => undefined,\n getElementInputs: () => ({}),\n log: (...args: any[]) => console.log(...args),\n block\n };\n\n const runConstraint = (\n constraint: ComponentConstraint,\n fallbackMessage: string\n ): ConstraintViolation | undefined => {\n try {\n constraint(ctx);\n } catch (err) {\n if (err instanceof ConstraintBlockError) {\n return { message: err.message };\n }\n return {\n message: err instanceof Error && err.message ? err.message : fallbackMessage\n };\n }\n return undefined;\n };\n\n // Evaluate the placed component's own constraints.\n if (componentManifest.constraints) {\n for (const constraint of componentManifest.constraints) {\n const violation = runConstraint(\n constraint,\n `Cannot place ${componentManifest.label} here.`\n );\n if (violation) {\n return { allowed: false, violation };\n }\n }\n }\n\n // Evaluate descendantConstraints from all ancestors (including direct parent).\n for (const ancestor of ancestors) {\n if (ancestor.manifest.descendantConstraints) {\n for (const constraint of ancestor.manifest.descendantConstraints) {\n const violation = runConstraint(\n constraint,\n `Cannot place ${componentName} inside ${ancestor.manifest.label}.`\n );\n if (violation) {\n return { allowed: false, violation };\n }\n }\n }\n }\n\n return { allowed: true };\n}\n\nexport interface EvaluateDeleteConstraintParams {\n /** The element being deleted */\n elementId: string;\n /** The document */\n document: Document;\n /** All registered component manifests */\n components: Record<string, ComponentManifest>;\n}\n\nexport function evaluateDeleteConstraint(params: EvaluateDeleteConstraintParams): ConstraintResult {\n const { elementId, document, components } = params;\n\n const element = document.elements[elementId];\n if (!element) {\n return { allowed: true };\n }\n\n const manifest = components[element.component.name];\n if (!manifest) {\n return { allowed: true };\n }\n\n const { canDelete } = manifest;\n\n // undefined or true → allowed\n if (canDelete === undefined || canDelete === true) {\n return { allowed: true };\n }\n\n // false → blocked\n if (canDelete === false) {\n return {\n allowed: false,\n violation: {\n message: `${manifest.label} cannot be deleted.`\n }\n };\n }\n\n // ComponentConstraint → evaluate dynamically\n const parentElement = element.parent?.id ? document.elements[element.parent.id] : undefined;\n const parentCtx = parentElement\n ? buildElementContext(parentElement, components, document)\n : undefined;\n\n const ancestors = parentElement ? buildAncestors(parentElement, components, document) : [];\n\n const parentInputs = parentElement ? (document.bindings[parentElement.id]?.inputs ?? {}) : {};\n\n const slot = element.parent?.slot ?? \"\";\n\n const elementCtx = buildElementContext(element, components, document)!;\n\n const ctx: ConstraintContext = {\n component: elementCtx,\n parent: parentCtx ?? {\n name: \"\",\n tags: [],\n getParent: () => undefined,\n childIndex: () => -1,\n childCount: () => -1,\n isLastChild: () => false,\n isFirstChild: () => false\n },\n slot,\n isChildOf: (name: string) => parentElement?.component.name === name,\n isDescendantOf: (name: string) => ancestors.some(a => a.manifest.name === name),\n getAncestor: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n return found ? buildElementContext(found.element, components, document) : undefined;\n },\n hasTag: (tag: string) => manifest.tags?.includes(tag) ?? false,\n slotChildCount: () => {\n const items = parentInputs[slot]?.static;\n return Array.isArray(items) ? items.length : 0;\n },\n countInstances: (name: string) => countInstances(document, name),\n hasDescendantWithTag: (tag: string) =>\n hasDescendantWithTag(document, components, element.id, tag),\n getAncestorInputs: (name: string) => {\n const found = ancestors.find(a => a.manifest.name === name);\n if (!found) {\n return undefined;\n }\n const bindings = document.bindings[found.element.id]?.inputs ?? {};\n return Object.fromEntries(\n Object.entries(bindings).map(([k, v]) => [k, (v as any)?.static])\n );\n },\n getElementInputs: () => {\n const bindings = document.bindings[element.id]?.inputs ?? {};\n return Object.fromEntries(\n Object.entries(bindings).map(([k, v]) => [k, (v as any)?.static])\n );\n },\n log: (...args: any[]) => console.log(...args),\n block\n };\n\n const fallbackMessage = `${manifest.label} cannot be deleted.`;\n try {\n canDelete(ctx);\n } catch (err) {\n if (err instanceof ConstraintBlockError) {\n return { allowed: false, violation: { message: err.message } };\n }\n return {\n allowed: false,\n violation: {\n message: err instanceof Error && err.message ? err.message : fallbackMessage\n }\n };\n }\n\n return { allowed: true };\n}\n"],"names":["ConstraintBlockError","Error","message","block","buildSlotPattern","slot","match","RegExp","findChildPosition","element","document","inputs","slotName","directBinding","Array","index","pattern","siblingKeys","key","m","parseInt","a","b","position","val","buildElementContext","components","manifest","parentEl","pos","undefined","buildAncestors","parentElement","ancestors","current","countInstances","componentName","count","id","hasDescendantWithTag","elementId","tag","el","isDescendant","elManifest","evaluateConstraints","params","parentId","componentManifest","parentCtx","parentInputs","ctx","name","found","items","args","console","runConstraint","constraint","fallbackMessage","err","violation","ancestor","evaluateDeleteConstraint","canDelete","elementCtx","bindings","Object","k","v"],"mappings":"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"}