@meekojs/meeko 0.0.4 → 0.1.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 (139) hide show
  1. package/README.md +21 -19
  2. package/dist/autoimports-ts.d.ts +4 -4
  3. package/dist/autoimports-ts.js +86 -30
  4. package/dist/autoimports-ts.js.map +1 -1
  5. package/dist/autoimports.d.ts +2 -2
  6. package/dist/autoimports.js +23 -7
  7. package/dist/autoimports.js.map +1 -1
  8. package/dist/check.js +39 -10
  9. package/dist/check.js.map +1 -1
  10. package/dist/cli.js +37 -4
  11. package/dist/cli.js.map +1 -1
  12. package/dist/compiler/events.d.ts +2 -0
  13. package/dist/compiler/events.js +6 -0
  14. package/dist/compiler/events.js.map +1 -0
  15. package/dist/compiler/props.d.ts +12 -0
  16. package/dist/compiler/props.js +32 -0
  17. package/dist/compiler/props.js.map +1 -0
  18. package/dist/compiler.js +55 -12
  19. package/dist/compiler.js.map +1 -1
  20. package/dist/component-errors.d.ts +18 -0
  21. package/dist/component-errors.js +65 -0
  22. package/dist/component-errors.js.map +1 -0
  23. package/dist/devtools.js +2 -4
  24. package/dist/devtools.js.map +1 -1
  25. package/dist/dom.d.ts +11 -5
  26. package/dist/dom.js +288 -88
  27. package/dist/dom.js.map +1 -1
  28. package/dist/error-observer.d.ts +6 -0
  29. package/dist/error-observer.js +41 -0
  30. package/dist/error-observer.js.map +1 -0
  31. package/dist/framework/check-app.js +160 -5
  32. package/dist/framework/check-app.js.map +1 -1
  33. package/dist/framework/check-project.d.ts +4 -0
  34. package/dist/framework/check-project.js +42 -0
  35. package/dist/framework/check-project.js.map +1 -0
  36. package/dist/framework/client.d.ts +3 -0
  37. package/dist/framework/client.js +136 -33
  38. package/dist/framework/client.js.map +1 -1
  39. package/dist/framework/clients.js +12 -4
  40. package/dist/framework/clients.js.map +1 -1
  41. package/dist/framework/contracts-generate.js +66 -3
  42. package/dist/framework/contracts-generate.js.map +1 -1
  43. package/dist/framework/init.js +21 -200
  44. package/dist/framework/init.js.map +1 -1
  45. package/dist/framework/middleware.d.ts +14 -0
  46. package/dist/framework/middleware.js +16 -0
  47. package/dist/framework/middleware.js.map +1 -0
  48. package/dist/framework/page-contracts-check.d.ts +8 -0
  49. package/dist/framework/page-contracts-check.js +110 -0
  50. package/dist/framework/page-contracts-check.js.map +1 -0
  51. package/dist/framework/page-contracts-generate.d.ts +2 -0
  52. package/dist/framework/page-contracts-generate.js +94 -0
  53. package/dist/framework/page-contracts-generate.js.map +1 -0
  54. package/dist/framework/page.d.ts +7 -3
  55. package/dist/framework/page.js +3 -1
  56. package/dist/framework/page.js.map +1 -1
  57. package/dist/framework/prerender.js +11 -5
  58. package/dist/framework/prerender.js.map +1 -1
  59. package/dist/framework/project-templates.d.ts +3 -0
  60. package/dist/framework/project-templates.js +119 -0
  61. package/dist/framework/project-templates.js.map +1 -0
  62. package/dist/framework/project.d.ts +9 -0
  63. package/dist/framework/project.js +272 -0
  64. package/dist/framework/project.js.map +1 -0
  65. package/dist/framework/router.d.ts +3 -1
  66. package/dist/framework/router.js +94 -8
  67. package/dist/framework/router.js.map +1 -1
  68. package/dist/framework/server.d.ts +17 -3
  69. package/dist/framework/server.js +71 -24
  70. package/dist/framework/server.js.map +1 -1
  71. package/dist/framework/socket-contracts-generate.js +8 -5
  72. package/dist/framework/socket-contracts-generate.js.map +1 -1
  73. package/dist/framework/socket.d.ts +2 -0
  74. package/dist/framework/socket.js +119 -17
  75. package/dist/framework/socket.js.map +1 -1
  76. package/dist/framework/standard-schema-types.d.ts +7 -0
  77. package/dist/framework/standard-schema-types.js +69 -0
  78. package/dist/framework/standard-schema-types.js.map +1 -0
  79. package/dist/framework/state.d.ts +7 -0
  80. package/dist/framework/state.js +78 -14
  81. package/dist/framework/state.js.map +1 -1
  82. package/dist/framework/styles.d.ts +2 -0
  83. package/dist/framework/styles.js +6 -0
  84. package/dist/framework/styles.js.map +1 -0
  85. package/dist/framework/type-declarations.d.ts +5 -0
  86. package/dist/framework/type-declarations.js +84 -0
  87. package/dist/framework/type-declarations.js.map +1 -0
  88. package/dist/framework-server/contracts.d.ts +11 -2
  89. package/dist/framework-server/contracts.js +62 -7
  90. package/dist/framework-server/contracts.js.map +1 -1
  91. package/dist/framework-server/discovery.d.ts +4 -1
  92. package/dist/framework-server/discovery.js +21 -16
  93. package/dist/framework-server/discovery.js.map +1 -1
  94. package/dist/framework-server/local.d.ts +2 -0
  95. package/dist/framework-server/local.js +5 -3
  96. package/dist/framework-server/local.js.map +1 -1
  97. package/dist/framework-server/middleware.d.ts +4 -0
  98. package/dist/framework-server/middleware.js +56 -0
  99. package/dist/framework-server/middleware.js.map +1 -0
  100. package/dist/framework-server/node-upgrade.js +27 -9
  101. package/dist/framework-server/node-upgrade.js.map +1 -1
  102. package/dist/framework-server/node-websocket.js +4 -2
  103. package/dist/framework-server/node-websocket.js.map +1 -1
  104. package/dist/framework-server/session-stores.d.ts +9 -2
  105. package/dist/framework-server/session-stores.js +37 -11
  106. package/dist/framework-server/session-stores.js.map +1 -1
  107. package/dist/framework-server/sessions.d.ts +6 -0
  108. package/dist/framework-server/sessions.js +41 -10
  109. package/dist/framework-server/sessions.js.map +1 -1
  110. package/dist/framework-server/socket.js +62 -27
  111. package/dist/framework-server/socket.js.map +1 -1
  112. package/dist/framework-server.d.ts +2 -0
  113. package/dist/framework-server.js +1 -0
  114. package/dist/framework-server.js.map +1 -1
  115. package/dist/framework.d.ts +3 -1
  116. package/dist/framework.js +1 -0
  117. package/dist/framework.js.map +1 -1
  118. package/dist/hmr.js +74 -24
  119. package/dist/hmr.js.map +1 -1
  120. package/dist/index.d.ts +2 -0
  121. package/dist/index.js +1 -0
  122. package/dist/index.js.map +1 -1
  123. package/dist/init.js +27 -1
  124. package/dist/init.js.map +1 -1
  125. package/dist/internal.d.ts +2 -2
  126. package/dist/internal.js +2 -2
  127. package/dist/internal.js.map +1 -1
  128. package/dist/node.d.ts +5 -1
  129. package/dist/node.js +80 -10
  130. package/dist/node.js.map +1 -1
  131. package/dist/reactivity.d.ts +12 -3
  132. package/dist/reactivity.js +94 -17
  133. package/dist/reactivity.js.map +1 -1
  134. package/dist/types.d.ts +2 -0
  135. package/dist/types.js +3 -1
  136. package/dist/types.js.map +1 -1
  137. package/dist/vite.js +29 -9
  138. package/dist/vite.js.map +1 -1
  139. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.js","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DomScope } from \"./dom.js\";\nimport { currentEffectOwner, effect, isWritableSignal, signalReadSites, untrack } from \"./reactivity.js\";\nimport type { EffectSource, Signal } from \"./reactivity.js\";\n\n/** Valores seguros para transportar una captura al panel de desarrollo. */\nexport type DevtoolsValue = null | boolean | number | string | DevtoolsValue[] | { [key: string]: DevtoolsValue };\n\n/** Estado serializable de una instancia hidratada. */\nexport interface DevtoolsInstance {\n id: string;\n componentId: string;\n name: string;\n file: string;\n props: DevtoolsValue;\n signals: Record<string, DevtoolsValue>;\n parentId: string | null;\n childIds: string[];\n status: \"hydrated\";\n breakpoint: boolean;\n}\n\n/** Cambio reciente del árbol de componentes o de una señal. */\nexport interface DevtoolsEvent {\n id: number;\n at: number;\n kind: \"mount\" | \"unmount\" | \"signal\" | \"breakpoint\" | \"select\" | \"hmr\";\n instanceId: string;\n detail?: string;\n /** Identidad del componente conservada incluso después del desmontaje. */\n componentName?: string;\n /** Archivo fuente `.meeko` proporcionado por la compilación de desarrollo. */\n file?: string;\n /** Valor posterior de una señal, copiado con los mismos límites que una captura. */\n value?: DevtoolsValue;\n /** Expresiones de plantilla que dependían de la señal en esta instancia. No son el origen de la escritura. */\n reads?: EffectSource[];\n}\n\n/** Captura independiente de referencias DOM y de valores no serializables. */\nexport interface DevtoolsSnapshot {\n instances: DevtoolsInstance[];\n events: DevtoolsEvent[];\n selectedId: string | null;\n}\n\n/** Interfaz pública que consume una extensión o un panel de desarrollo. */\nexport interface DevtoolsHook {\n snapshot(): DevtoolsSnapshot;\n subscribe(listener: () => void): () => void;\n select(id: string | null): void;\n highlight(id: string | null): void;\n setBreakpoint(id: string, enabled: boolean): void;\n}\n\n/** Datos que entrega un componente compilado cuando se hidrata en desarrollo. */\nexport interface DevtoolsRegistration {\n componentId: string;\n name: string;\n file: string;\n scope: DomScope;\n props: unknown;\n bindings: Record<string, unknown>;\n}\n\ndeclare global {\n interface Window {\n __MEEKO_DEVTOOLS__?: DevtoolsHook;\n }\n}\n\ninterface ActiveInstance extends DevtoolsRegistration {\n id: string;\n key: Node;\n owner: object | undefined;\n breakpoint: boolean;\n stopSignals: Array<() => void>;\n}\n\nconst active = new Map<string, ActiveInstance>();\nconst identities = new WeakMap<Node, { id: string; breakpoint: boolean }>();\nconst listeners = new Set<() => void>();\nconst recent: DevtoolsEvent[] = [];\nlet nextInstance = 1;\nlet nextEvent = 1;\nlet selectedId: string | null = null;\nlet highlightedId: string | null = null;\nlet overlay: HTMLElement | undefined;\nlet highlightObserver: MutationObserver | undefined;\nlet highlightFrame: number | undefined;\n\n/** Copia datos arbitrarios con profundidad y tamaño acotados sin invocar getters. */\nfunction safeValue(value: unknown, depth = 0, seen = new WeakSet<object>()): DevtoolsValue {\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.length > 500 ? `${value.slice(0, 500)}…` : value;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : String(value);\n if (typeof value === \"undefined\") return \"[undefined]\";\n if (typeof value === \"bigint\") return `${value}n`;\n if (typeof value === \"symbol\") return \"[symbol]\";\n if (typeof value === \"function\") return \"[function]\";\n if (typeof value !== \"object\") return \"[unknown]\";\n if (typeof Node !== \"undefined\" && value instanceof Node) return \"[DOM node]\";\n try {\n if (typeof Reflect.get(value, \"nodeType\") === \"number\" && typeof Reflect.get(value, \"nodeName\") === \"string\") return \"[DOM node]\";\n } catch {\n return \"[uninspectable]\";\n }\n if (seen.has(value)) return \"[circular]\";\n if (depth >= 4) return \"[max depth]\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"[invalid date]\" : value.toISOString();\n if (value instanceof Error) return safeValue(`[${value.name}: ${value.message}]`);\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: DevtoolsValue[] = [];\n for (let index = 0; index < Math.min(value.length, 50); index++) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n items.push(descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : descriptor ? \"[accessor]\" : \"[empty]\");\n }\n if (value.length > 50) items.push(`[${value.length - 50} more]`);\n return items;\n }\n const result: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n const keys = Object.keys(value);\n for (const key of keys.slice(0, 50)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n result[key] = descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : \"[accessor]\";\n }\n if (keys.length > 50) result[\"…\"] = `[${keys.length - 50} more]`;\n return result;\n } catch {\n return \"[uninspectable]\";\n } finally {\n seen.delete(value);\n }\n}\n\nfunction notify(): void {\n for (const listener of [...listeners]) {\n try { untrack(listener); } catch { /* Un panel externo no debe romper la aplicación. */ }\n }\n}\n\nfunction record(kind: DevtoolsEvent[\"kind\"], instanceId: string, detail?: string, value?: DevtoolsValue, source?: ActiveInstance, reads?: EffectSource[]): void {\n const event: DevtoolsEvent = { id: nextEvent++, at: Date.now(), kind, instanceId };\n if (detail !== undefined) event.detail = detail;\n const entry = source ?? active.get(instanceId);\n if (entry) {\n event.componentName = entry.name;\n event.file = entry.file;\n }\n if (value !== undefined) event.value = value;\n if (reads?.length) event.reads = reads;\n recent.push(event);\n if (recent.length > 100) recent.shift();\n notify();\n}\n\nfunction keyOf(scope: DomScope): Node {\n return scope.start ?? scope.root;\n}\n\nfunction isInside(parent: ActiveInstance, child: ActiveInstance): boolean {\n if (parent.id === child.id || parent.key === child.key) return false;\n const node = child.key;\n if (!parent.scope.start || !parent.scope.end) return parent.scope.root.contains(node);\n const { start, end } = parent.scope;\n return Boolean(start.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING)\n && Boolean(end.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING);\n}\n\nfunction parentOf(child: ActiveInstance): ActiveInstance | undefined {\n let parent: ActiveInstance | undefined;\n for (const candidate of active.values()) {\n if (!isInside(candidate, child)) continue;\n if (!parent || isInside(parent, candidate)) parent = candidate;\n }\n return parent;\n}\n\nfunction bounds(instance: ActiveInstance): DOMRect {\n if (!instance.scope.start || !instance.scope.end) return instance.scope.root.getBoundingClientRect();\n const range = instance.scope.start.ownerDocument.createRange();\n range.setStartAfter(instance.scope.start);\n range.setEndBefore(instance.scope.end);\n return range.getBoundingClientRect();\n}\n\nfunction positionHighlight(): void {\n const entry = highlightedId ? active.get(highlightedId) : undefined;\n if (!entry || !overlay) return;\n try {\n const rect = bounds(entry);\n Object.assign(overlay.style, {\n left: `${rect.left}px`, top: `${rect.top}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n });\n } catch {\n removeHighlight();\n }\n}\n\nfunction scheduleHighlight(): void {\n if (highlightFrame !== undefined) return;\n highlightFrame = window.requestAnimationFrame(() => {\n highlightFrame = undefined;\n positionHighlight();\n });\n}\n\nfunction removeHighlight(): void {\n window.removeEventListener(\"scroll\", scheduleHighlight, true);\n window.removeEventListener(\"resize\", scheduleHighlight);\n highlightObserver?.disconnect();\n highlightObserver = undefined;\n if (highlightFrame !== undefined) window.cancelAnimationFrame(highlightFrame);\n highlightFrame = undefined;\n overlay?.remove();\n overlay = undefined;\n highlightedId = null;\n}\n\nconst hook: DevtoolsHook = {\n snapshot() {\n return untrack(() => {\n const instances: DevtoolsInstance[] = [];\n for (const entry of active.values()) {\n const signals: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n for (const [name, value] of Object.entries(entry.bindings)) {\n if (isWritableSignal(value)) signals[name] = safeValue(value.value);\n }\n instances.push({\n id: entry.id,\n componentId: entry.componentId,\n name: entry.name,\n file: entry.file,\n props: safeValue(entry.props),\n signals,\n parentId: parentOf(entry)?.id ?? null,\n childIds: [],\n status: \"hydrated\",\n breakpoint: entry.breakpoint,\n });\n }\n const byId = new Map(instances.map((instance) => [instance.id, instance]));\n for (const instance of instances) {\n if (instance.parentId) byId.get(instance.parentId)?.childIds.push(instance.id);\n }\n return { instances, events: recent.map((event) => ({ ...event })), selectedId };\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n select(id) {\n if (id !== null && !active.has(id)) return;\n selectedId = id;\n record(\"select\", id ?? \"\");\n },\n highlight(id) {\n removeHighlight();\n if (id === null) return;\n const entry = active.get(id);\n if (!entry) return;\n const document = entry.key.ownerDocument ?? window.document;\n const element = document.createElement(\"div\");\n element.setAttribute(\"data-meeko-devtools-highlight\", \"\");\n Object.assign(element.style, {\n position: \"fixed\",\n outline: \"2px solid #7c3aed\", background: \"rgba(124, 58, 237, 0.12)\",\n pointerEvents: \"none\", zIndex: \"2147483647\",\n });\n document.body.appendChild(element);\n overlay = element;\n highlightedId = id;\n positionHighlight();\n window.addEventListener(\"scroll\", scheduleHighlight, true);\n window.addEventListener(\"resize\", scheduleHighlight);\n highlightObserver = new window.MutationObserver((mutations) => {\n if (mutations.some((mutation) => mutation.target !== overlay && !overlay?.contains(mutation.target))) scheduleHighlight();\n });\n highlightObserver.observe(entry.scope.root, { attributes: true, characterData: true, childList: true, subtree: true });\n },\n setBreakpoint(id, enabled) {\n const entry = active.get(id);\n if (!entry) return;\n entry.breakpoint = enabled;\n const identity = identities.get(entry.key);\n if (identity) identity.breakpoint = enabled;\n record(\"breakpoint\", id, enabled ? \"enabled\" : \"disabled\");\n },\n};\n\nfunction unregister(entry: ActiveInstance): void {\n if (active.get(entry.id) !== entry) return;\n for (const stop of entry.stopSignals) stop();\n active.delete(entry.id);\n if (selectedId === entry.id) selectedId = null;\n if (highlightedId === entry.id) removeHighlight();\n record(\"unmount\", entry.id, undefined, undefined, entry);\n}\n\n/** Registra señales y ámbito de una instancia hidratada en Vite desarrollo. */\nexport function registerDevtoolsInstance(input: DevtoolsRegistration): () => void {\n if (typeof window === \"undefined\" || typeof Node === \"undefined\") return () => {};\n if (!window.__MEEKO_DEVTOOLS__) {\n window.__MEEKO_DEVTOOLS__ = hook;\n window.dispatchEvent(new window.Event(\"meeko:devtools-ready\"));\n }\n const key = keyOf(input.scope);\n const previous = identities.get(key);\n const identity = previous ?? { id: `meeko-${nextInstance++}`, breakpoint: false };\n identities.set(key, identity);\n const existing = active.get(identity.id);\n if (existing) unregister(existing);\n const entry: ActiveInstance = { ...input, id: identity.id, key, owner: currentEffectOwner(), breakpoint: identity.breakpoint, stopSignals: [] };\n active.set(entry.id, entry);\n for (const [name, value] of Object.entries(input.bindings)) {\n if (!isWritableSignal(value)) continue;\n const signal = value as Signal<unknown>;\n let initial = true;\n entry.stopSignals.push(effect(() => {\n const current = signal.value;\n if (initial) { initial = false; return; }\n record(\"signal\", entry.id, name, safeValue(current), entry, signalReadSites(signal, entry.owner));\n if (entry.breakpoint) {\n debugger;\n }\n }));\n }\n record(previous ? \"hmr\" : \"mount\", entry.id);\n return () => { unregister(entry); };\n}\n"]}
1
+ {"version":3,"file":"devtools.js","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA6EzG,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;AACjD,MAAM,UAAU,GAAG,IAAI,OAAO,EAA6C,CAAC;AAC5E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AACxC,MAAM,MAAM,GAAoB,EAAE,CAAC;AACnC,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,UAAU,GAAkB,IAAI,CAAC;AACrC,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,OAAgC,CAAC;AACrC,IAAI,iBAA+C,CAAC;AACpD,IAAI,cAAkC,CAAC;AAEvC,qFAAqF;AACrF,SAAS,SAAS,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,OAAO,EAAU;IACxE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrF,IAAI,OAAO,KAAK,KAAK,WAAW;QAAE,OAAO,aAAa,CAAC;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,YAAY,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,YAAY,CAAC;IAC9E,IAAI,CAAC;QACH,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC;IACpI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACzC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC;IACrC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACzG,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;IAClF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAoB,EAAE,CAAC;YAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzI,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAkC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAkC,CAAC;QACnG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAClH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC;QACjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,MAAM;IACb,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,eAAe,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjH,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAA2B,EAAE,UAAkB,EAAE,MAAe,EAAE,KAAqB,EAAE,MAAuB,EAAE,KAAsB;IACtJ,MAAM,KAAK,GAAkB,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACnF,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;QACjC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7C,IAAI,KAAK,EAAE,MAAM;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAC,KAAe;IAC5B,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAsB,EAAE,KAAqB;IAC7D,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,OAAO,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,2BAA2B,CAAC;WACjF,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,2BAA2B,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAqB;IACrC,IAAI,MAAkC,CAAC;IACvC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;YAAE,MAAM,GAAG,SAAS,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,QAAwB;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACrG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;IAC/D,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,qBAAqB,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YAC3B,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;YAC5C,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI;SACrD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO;IACzC,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;QACjD,cAAc,GAAG,SAAS,CAAC;QAC3B,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACxD,iBAAiB,EAAE,UAAU,EAAE,CAAC;IAChC,iBAAiB,GAAG,SAAS,CAAC;IAC9B,IAAI,cAAc,KAAK,SAAS;QAAE,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC9E,cAAc,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,GAAG,SAAS,CAAC;IACpB,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,IAAI,GAAiB;IACzB,QAAQ;QACN,OAAO,OAAO,CAAC,GAAG,EAAE;YAClB,MAAM,SAAS,GAAuB,EAAE,CAAC;YACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAkC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAkC,CAAC;gBACpG,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3D,IAAI,gBAAgB,CAAC,KAAK,CAAC;wBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtE,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC;oBACb,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC7B,OAAO;oBACP,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,IAAI;oBACrC,QAAQ,EAAE,EAAE;oBACZ,MAAM,EAAE,UAAU;oBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,QAAQ,CAAC,QAAQ;oBAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IACD,SAAS,CAAC,QAAQ;QAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC3C,UAAU,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS,CAAC,EAAE;QACV,eAAe,EAAE,CAAC;QAClB,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC;QAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YAC3B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,0BAA0B;YACpE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;SAC5C,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,OAAO,CAAC;QAClB,aAAa,GAAG,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;QACpB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACrD,iBAAiB,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5D,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAAE,iBAAiB,EAAE,CAAC;QAC5H,CAAC,CAAC,CAAC;QACH,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACzH,CAAC;IACD,aAAa,CAAC,EAAE,EAAE,OAAO;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;QAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC;QAC5C,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,KAAqB;IACvC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK;QAAE,OAAO;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,UAAU,KAAK,KAAK,CAAC,EAAE;QAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,IAAI,aAAa,KAAK,KAAK,CAAC,EAAE;QAAE,eAAe,EAAE,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB,CAAC,KAA2B;IAClE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,IAAI,KAAK,WAAW;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,IAAI,EAAE,EAAE,EAAE,SAAS,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAClF,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,KAAK,GAAmB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAChJ,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAAE,SAAS;QACvC,MAAM,MAAM,GAAG,KAAwB,CAAC;QACxC,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;YAC7B,IAAI,OAAO,EAAE,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;gBAAC,OAAO;YAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAClG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import type { DomScope } from \"./dom.js\";\nimport { logClientError, observeCallback } from \"./error-observer.js\";\nimport { currentEffectOwner, effect, isWritableSignal, signalReadSites, untrack } from \"./reactivity.js\";\nimport type { EffectSource, Signal } from \"./reactivity.js\";\n\n/** Valores seguros para transportar una captura al panel de desarrollo. */\nexport type DevtoolsValue = null | boolean | number | string | DevtoolsValue[] | { [key: string]: DevtoolsValue };\n\n/** Estado serializable de una instancia hidratada. */\nexport interface DevtoolsInstance {\n id: string;\n componentId: string;\n name: string;\n file: string;\n props: DevtoolsValue;\n signals: Record<string, DevtoolsValue>;\n parentId: string | null;\n childIds: string[];\n status: \"hydrated\";\n breakpoint: boolean;\n}\n\n/** Cambio reciente del árbol de componentes o de una señal. */\nexport interface DevtoolsEvent {\n id: number;\n at: number;\n kind: \"mount\" | \"unmount\" | \"signal\" | \"breakpoint\" | \"select\" | \"hmr\";\n instanceId: string;\n detail?: string;\n /** Identidad del componente conservada incluso después del desmontaje. */\n componentName?: string;\n /** Archivo fuente `.meeko` proporcionado por la compilación de desarrollo. */\n file?: string;\n /** Valor posterior de una señal, copiado con los mismos límites que una captura. */\n value?: DevtoolsValue;\n /** Expresiones de plantilla que dependían de la señal en esta instancia. No son el origen de la escritura. */\n reads?: EffectSource[];\n}\n\n/** Captura independiente de referencias DOM y de valores no serializables. */\nexport interface DevtoolsSnapshot {\n instances: DevtoolsInstance[];\n events: DevtoolsEvent[];\n selectedId: string | null;\n}\n\n/** Interfaz pública que consume una extensión o un panel de desarrollo. */\nexport interface DevtoolsHook {\n snapshot(): DevtoolsSnapshot;\n subscribe(listener: () => void): () => void;\n select(id: string | null): void;\n highlight(id: string | null): void;\n setBreakpoint(id: string, enabled: boolean): void;\n}\n\n/** Datos que entrega un componente compilado cuando se hidrata en desarrollo. */\nexport interface DevtoolsRegistration {\n componentId: string;\n name: string;\n file: string;\n scope: DomScope;\n props: unknown;\n bindings: Record<string, unknown>;\n}\n\ndeclare global {\n interface Window {\n __MEEKO_DEVTOOLS__?: DevtoolsHook;\n }\n}\n\ninterface ActiveInstance extends DevtoolsRegistration {\n id: string;\n key: Node;\n owner: object | undefined;\n breakpoint: boolean;\n stopSignals: Array<() => void>;\n}\n\nconst active = new Map<string, ActiveInstance>();\nconst identities = new WeakMap<Node, { id: string; breakpoint: boolean }>();\nconst listeners = new Set<() => void>();\nconst recent: DevtoolsEvent[] = [];\nlet nextInstance = 1;\nlet nextEvent = 1;\nlet selectedId: string | null = null;\nlet highlightedId: string | null = null;\nlet overlay: HTMLElement | undefined;\nlet highlightObserver: MutationObserver | undefined;\nlet highlightFrame: number | undefined;\n\n/** Copia datos arbitrarios con profundidad y tamaño acotados sin invocar getters. */\nfunction safeValue(value: unknown, depth = 0, seen = new WeakSet<object>()): DevtoolsValue {\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.length > 500 ? `${value.slice(0, 500)}…` : value;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : String(value);\n if (typeof value === \"undefined\") return \"[undefined]\";\n if (typeof value === \"bigint\") return `${value}n`;\n if (typeof value === \"symbol\") return \"[symbol]\";\n if (typeof value === \"function\") return \"[function]\";\n if (typeof value !== \"object\") return \"[unknown]\";\n if (typeof Node !== \"undefined\" && value instanceof Node) return \"[DOM node]\";\n try {\n if (typeof Reflect.get(value, \"nodeType\") === \"number\" && typeof Reflect.get(value, \"nodeName\") === \"string\") return \"[DOM node]\";\n } catch {\n return \"[uninspectable]\";\n }\n if (seen.has(value)) return \"[circular]\";\n if (depth >= 4) return \"[max depth]\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"[invalid date]\" : value.toISOString();\n if (value instanceof Error) return safeValue(`[${value.name}: ${value.message}]`);\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: DevtoolsValue[] = [];\n for (let index = 0; index < Math.min(value.length, 50); index++) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n items.push(descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : descriptor ? \"[accessor]\" : \"[empty]\");\n }\n if (value.length > 50) items.push(`[${value.length - 50} more]`);\n return items;\n }\n const result: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n const keys = Object.keys(value);\n for (const key of keys.slice(0, 50)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n result[key] = descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : \"[accessor]\";\n }\n if (keys.length > 50) result[\"…\"] = `[${keys.length - 50} more]`;\n return result;\n } catch {\n return \"[uninspectable]\";\n } finally {\n seen.delete(value);\n }\n}\n\nfunction notify(): void {\n for (const listener of [...listeners]) {\n observeCallback(() => untrack(listener), (error) => logClientError(\"Meeko DevTools subscriber failed\", error));\n }\n}\n\nfunction record(kind: DevtoolsEvent[\"kind\"], instanceId: string, detail?: string, value?: DevtoolsValue, source?: ActiveInstance, reads?: EffectSource[]): void {\n const event: DevtoolsEvent = { id: nextEvent++, at: Date.now(), kind, instanceId };\n if (detail !== undefined) event.detail = detail;\n const entry = source ?? active.get(instanceId);\n if (entry) {\n event.componentName = entry.name;\n event.file = entry.file;\n }\n if (value !== undefined) event.value = value;\n if (reads?.length) event.reads = reads;\n recent.push(event);\n if (recent.length > 100) recent.shift();\n notify();\n}\n\nfunction keyOf(scope: DomScope): Node {\n return scope.start ?? scope.root;\n}\n\nfunction isInside(parent: ActiveInstance, child: ActiveInstance): boolean {\n if (parent.id === child.id || parent.key === child.key) return false;\n const node = child.key;\n if (!parent.scope.start || !parent.scope.end) return parent.scope.root.contains(node);\n const { start, end } = parent.scope;\n return Boolean(start.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING)\n && Boolean(end.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING);\n}\n\nfunction parentOf(child: ActiveInstance): ActiveInstance | undefined {\n let parent: ActiveInstance | undefined;\n for (const candidate of active.values()) {\n if (!isInside(candidate, child)) continue;\n if (!parent || isInside(parent, candidate)) parent = candidate;\n }\n return parent;\n}\n\nfunction bounds(instance: ActiveInstance): DOMRect {\n if (!instance.scope.start || !instance.scope.end) return instance.scope.root.getBoundingClientRect();\n const range = instance.scope.start.ownerDocument.createRange();\n range.setStartAfter(instance.scope.start);\n range.setEndBefore(instance.scope.end);\n return range.getBoundingClientRect();\n}\n\nfunction positionHighlight(): void {\n const entry = highlightedId ? active.get(highlightedId) : undefined;\n if (!entry || !overlay) return;\n try {\n const rect = bounds(entry);\n Object.assign(overlay.style, {\n left: `${rect.left}px`, top: `${rect.top}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n });\n } catch {\n removeHighlight();\n }\n}\n\nfunction scheduleHighlight(): void {\n if (highlightFrame !== undefined) return;\n highlightFrame = window.requestAnimationFrame(() => {\n highlightFrame = undefined;\n positionHighlight();\n });\n}\n\nfunction removeHighlight(): void {\n window.removeEventListener(\"scroll\", scheduleHighlight, true);\n window.removeEventListener(\"resize\", scheduleHighlight);\n highlightObserver?.disconnect();\n highlightObserver = undefined;\n if (highlightFrame !== undefined) window.cancelAnimationFrame(highlightFrame);\n highlightFrame = undefined;\n overlay?.remove();\n overlay = undefined;\n highlightedId = null;\n}\n\nconst hook: DevtoolsHook = {\n snapshot() {\n return untrack(() => {\n const instances: DevtoolsInstance[] = [];\n for (const entry of active.values()) {\n const signals: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n for (const [name, value] of Object.entries(entry.bindings)) {\n if (isWritableSignal(value)) signals[name] = safeValue(value.value);\n }\n instances.push({\n id: entry.id,\n componentId: entry.componentId,\n name: entry.name,\n file: entry.file,\n props: safeValue(entry.props),\n signals,\n parentId: parentOf(entry)?.id ?? null,\n childIds: [],\n status: \"hydrated\",\n breakpoint: entry.breakpoint,\n });\n }\n const byId = new Map(instances.map((instance) => [instance.id, instance]));\n for (const instance of instances) {\n if (instance.parentId) byId.get(instance.parentId)?.childIds.push(instance.id);\n }\n return { instances, events: recent.map((event) => ({ ...event })), selectedId };\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n select(id) {\n if (id !== null && !active.has(id)) return;\n selectedId = id;\n record(\"select\", id ?? \"\");\n },\n highlight(id) {\n removeHighlight();\n if (id === null) return;\n const entry = active.get(id);\n if (!entry) return;\n const document = entry.key.ownerDocument ?? window.document;\n const element = document.createElement(\"div\");\n element.setAttribute(\"data-meeko-devtools-highlight\", \"\");\n Object.assign(element.style, {\n position: \"fixed\",\n outline: \"2px solid #7c3aed\", background: \"rgba(124, 58, 237, 0.12)\",\n pointerEvents: \"none\", zIndex: \"2147483647\",\n });\n document.body.appendChild(element);\n overlay = element;\n highlightedId = id;\n positionHighlight();\n window.addEventListener(\"scroll\", scheduleHighlight, true);\n window.addEventListener(\"resize\", scheduleHighlight);\n highlightObserver = new window.MutationObserver((mutations) => {\n if (mutations.some((mutation) => mutation.target !== overlay && !overlay?.contains(mutation.target))) scheduleHighlight();\n });\n highlightObserver.observe(entry.scope.root, { attributes: true, characterData: true, childList: true, subtree: true });\n },\n setBreakpoint(id, enabled) {\n const entry = active.get(id);\n if (!entry) return;\n entry.breakpoint = enabled;\n const identity = identities.get(entry.key);\n if (identity) identity.breakpoint = enabled;\n record(\"breakpoint\", id, enabled ? \"enabled\" : \"disabled\");\n },\n};\n\nfunction unregister(entry: ActiveInstance): void {\n if (active.get(entry.id) !== entry) return;\n for (const stop of entry.stopSignals) stop();\n active.delete(entry.id);\n if (selectedId === entry.id) selectedId = null;\n if (highlightedId === entry.id) removeHighlight();\n record(\"unmount\", entry.id, undefined, undefined, entry);\n}\n\n/** Registra señales y ámbito de una instancia hidratada en Vite desarrollo. */\nexport function registerDevtoolsInstance(input: DevtoolsRegistration): () => void {\n if (typeof window === \"undefined\" || typeof Node === \"undefined\") return () => {};\n if (!window.__MEEKO_DEVTOOLS__) {\n window.__MEEKO_DEVTOOLS__ = hook;\n window.dispatchEvent(new window.Event(\"meeko:devtools-ready\"));\n }\n const key = keyOf(input.scope);\n const previous = identities.get(key);\n const identity = previous ?? { id: `meeko-${nextInstance++}`, breakpoint: false };\n identities.set(key, identity);\n const existing = active.get(identity.id);\n if (existing) unregister(existing);\n const entry: ActiveInstance = { ...input, id: identity.id, key, owner: currentEffectOwner(), breakpoint: identity.breakpoint, stopSignals: [] };\n active.set(entry.id, entry);\n for (const [name, value] of Object.entries(input.bindings)) {\n if (!isWritableSignal(value)) continue;\n const signal = value as Signal<unknown>;\n let initial = true;\n entry.stopSignals.push(effect(() => {\n const current = signal.value;\n if (initial) { initial = false; return; }\n record(\"signal\", entry.id, name, safeValue(current), entry, signalReadSites(signal, entry.owner));\n if (entry.breakpoint) {\n debugger;\n }\n }));\n }\n record(previous ? \"hmr\" : \"mount\", entry.id);\n return () => { unregister(entry); };\n}\n"]}
package/dist/dom.d.ts CHANGED
@@ -7,16 +7,16 @@ export interface DomScope {
7
7
  }
8
8
  /** Contrato de un módulo de componente compilado para composición sin wrapper. */
9
9
  export interface ComponentModule<Props extends object> {
10
- renderToString(props: Props, state?: Record<string, unknown>): string;
11
- renderWithState?(props: Props): {
10
+ readonly renderToString: (props: Props, state?: Record<string, unknown>) => string;
11
+ readonly renderWithState?: (props: Props) => {
12
12
  html: string;
13
13
  state: Record<string, unknown>;
14
14
  };
15
- hydrateScope(scope: DomScope, props: Props, state?: Record<string, unknown>): ComponentRelease;
15
+ readonly hydrateScope: (scope: DomScope, props: Props, state?: Record<string, unknown>) => ComponentRelease;
16
16
  }
17
17
  /** Componente compilado que puede transferir su estado durante SSR. */
18
18
  export type Component<Props extends object> = ComponentModule<Props> & {
19
- renderWithState(props: Props): {
19
+ readonly renderWithState: (props: Props) => {
20
20
  html: string;
21
21
  state: Record<string, unknown>;
22
22
  };
@@ -26,10 +26,16 @@ export interface ComponentRelease {
26
26
  (): void;
27
27
  snapshot?: () => Record<string, unknown>;
28
28
  }
29
+ /** Releases every compiled binding and preserves the failure that triggered cleanup. */
30
+ export declare function releaseAll(cleanups: Array<() => void>, cause: {
31
+ error: unknown;
32
+ }): never;
33
+ export declare function releaseAll(cleanups: Array<() => void>): void;
29
34
  /** Añade una lectura de estado a la limpieza de un componente compilado. */
30
35
  export declare function withStateSnapshot(release: () => void, snapshot: () => Record<string, unknown>): ComponentRelease;
31
36
  /** Renderiza un hijo entre comentarios de ámbito sin añadir un elemento visual. */
32
- export declare function renderComponent<Props extends object>(id: number, component: ComponentModule<Props>, props: Props, transferState?: boolean): string;
37
+ export declare function renderComponent<Props extends object>(id: number, component: Component<Props>, props: Props, transferState: boolean): string;
38
+ export declare function renderComponent<Props extends object>(id: number, component: ComponentModule<Props>, props: Props, transferState?: false): string;
33
39
  /** Hidrata un hijo dentro de su rango y actualiza props reactivas con limpieza previa. */
34
40
  export declare function bindComponent<Props extends object>(scope: DomScope, id: number, input: ComponentModule<Props> | (() => ComponentModule<Props>), read: () => Props, location: string): () => void;
35
41
  /** Conecta un texto reactivo al marcador SSR y comprueba su valor inicial. */
package/dist/dom.js CHANGED
@@ -1,5 +1,22 @@
1
- import { createRoot, effect, signal } from "./reactivity.js";
1
+ import { batch, createRoot, effect, finishWithCleanup, signal } from "./reactivity.js";
2
+ import { observeCallback } from "./error-observer.js";
3
+ import { componentErrorReporter } from "./component-errors.js";
2
4
  import { attributeValue, serializeJson } from "./server.js";
5
+ export function releaseAll(cleanups, cause) {
6
+ const failures = cause ? [cause.error] : [];
7
+ while (cleanups.length) {
8
+ try {
9
+ cleanups.pop()();
10
+ }
11
+ catch (error) {
12
+ failures.push(error);
13
+ }
14
+ }
15
+ if (failures.length > 1)
16
+ throw new AggregateError(failures, "Meeko hydration cleanup failed");
17
+ if (failures.length === 1)
18
+ throw failures[0];
19
+ }
3
20
  /** Añade una lectura de estado a la limpieza de un componente compilado. */
4
21
  export function withStateSnapshot(release, snapshot) {
5
22
  return Object.assign(release, { snapshot });
@@ -67,6 +84,18 @@ function clearRegion(scope) {
67
84
  node = next;
68
85
  }
69
86
  }
87
+ function cloneRegion(scope) {
88
+ if (!scope.start || !scope.end)
89
+ throw new Error("Expected a bounded Meeko region");
90
+ const range = scope.start.ownerDocument.createRange();
91
+ range.setStartAfter(scope.start);
92
+ range.setEndBefore(scope.end);
93
+ return range.cloneContents();
94
+ }
95
+ function restoreRegion(scope, content) {
96
+ clearRegion(scope);
97
+ scope.end.parentNode.insertBefore(content, scope.end);
98
+ }
70
99
  function insertHtml(end, html) {
71
100
  const parent = end.parentNode;
72
101
  if (!parent)
@@ -80,7 +109,6 @@ function sameProps(first, second) {
80
109
  const secondKeys = Object.keys(second);
81
110
  return firstKeys.length === secondKeys.length && firstKeys.every((key) => Object.hasOwn(second, key) && Object.is(first[key], second[key]));
82
111
  }
83
- /** Renderiza un hijo entre comentarios de ámbito sin añadir un elemento visual. */
84
112
  export function renderComponent(id, component, props, transferState = false) {
85
113
  if (transferState) {
86
114
  if (!component.renderWithState)
@@ -120,29 +148,53 @@ export function bindComponent(scope, id, input, read, location) {
120
148
  let component = resolveComponent();
121
149
  let props = read();
122
150
  let release = component.hydrateScope(inner, props, state);
123
- const stop = effect(() => {
151
+ let stop = () => { };
152
+ stop = effect(() => {
124
153
  const nextComponent = resolveComponent();
125
154
  const next = read();
126
155
  if (nextComponent === component && sameProps(props, next))
127
156
  return;
128
- const state = nextComponent === component ? release.snapshot?.() : undefined;
157
+ const previousState = release.snapshot?.();
158
+ const state = nextComponent === component ? previousState : undefined;
129
159
  const html = nextComponent.renderToString(next, state);
130
- release();
131
- clearRegion(inner);
132
- insertHtml(inner.end, html);
133
- release = nextComponent.hydrateScope(inner, next, state);
134
- component = nextComponent;
135
- props = next;
160
+ const previous = cloneRegion(inner);
161
+ try {
162
+ release();
163
+ clearRegion(inner);
164
+ insertHtml(inner.end, html);
165
+ const nextRelease = nextComponent.hydrateScope(inner, next, state);
166
+ release = nextRelease;
167
+ component = nextComponent;
168
+ props = next;
169
+ }
170
+ catch (error) {
171
+ try {
172
+ restoreRegion(inner, previous);
173
+ release = component.hydrateScope(inner, props, previousState);
174
+ }
175
+ catch (rollbackError) {
176
+ release = () => { };
177
+ stop();
178
+ throw new AggregateError([error, rollbackError], `Meeko component update and recovery failed in ${location}`);
179
+ }
180
+ throw error;
181
+ }
136
182
  });
137
183
  return () => { stop(); release(); };
138
184
  }
139
185
  /** Conecta un texto reactivo al marcador SSR y comprueba su valor inicial. */
140
186
  export function bindText(scope, id, read, location, source) {
141
187
  const marker = findComment(scope, `meeko:text:${id}`);
142
- const text = marker.nextSibling;
188
+ const initial = String(read());
189
+ let text = marker.nextSibling;
190
+ // HTML parsing drops empty text nodes. Restore only that empty SSR case so
191
+ // adjacent static text stays untouched and the reactive expression can bind.
192
+ if (initial === "" && (!text || text.nodeType !== 3 || text.textContent !== "")) {
193
+ text = marker.ownerDocument.createTextNode("");
194
+ marker.parentNode.insertBefore(text, marker.nextSibling);
195
+ }
143
196
  if (!text || text.nodeType !== 3)
144
197
  throw new Error(`Missing text node in ${location}`);
145
- const initial = String(read());
146
198
  if (text.textContent !== initial)
147
199
  throw new Error(`Hydration mismatch in ${location}`);
148
200
  let first = true;
@@ -179,8 +231,10 @@ export function bindAttribute(scope, id, name, read, location, source) {
179
231
  /** Conecta un evento al elemento SSR y entrega su función de limpieza. */
180
232
  export function bindEvent(scope, id, name, handler) {
181
233
  const target = findElement(scope, `data-meeko-e-${id}`);
182
- target.addEventListener(name, handler);
183
- return () => target.removeEventListener(name, handler);
234
+ const report = componentErrorReporter();
235
+ const listener = (event) => observeCallback(() => handler(event), report);
236
+ target.addEventListener(name, listener);
237
+ return () => target.removeEventListener(name, listener);
184
238
  }
185
239
  /** Genera los límites estables de una condición en SSR. */
186
240
  export function renderIf(id, condition, render) {
@@ -193,18 +247,51 @@ export function bindIf(scope, id, read, render, hydrate) {
193
247
  if (!active && inner.start?.nextSibling !== inner.end)
194
248
  throw new Error(`Hydration mismatch in condition ${id}`);
195
249
  let release = active ? hydrate(inner) : undefined;
196
- const stop = effect(() => {
250
+ let stop = () => { };
251
+ stop = effect(() => {
197
252
  const next = Boolean(read());
198
253
  if (next === active)
199
254
  return;
200
- release?.();
201
- release = undefined;
202
- clearRegion(inner);
203
255
  if (next) {
204
- insertHtml(inner.end, render());
205
- release = hydrate(inner);
256
+ const html = render();
257
+ try {
258
+ clearRegion(inner);
259
+ insertHtml(inner.end, html);
260
+ release = hydrate(inner);
261
+ active = true;
262
+ }
263
+ catch (error) {
264
+ try {
265
+ clearRegion(inner);
266
+ }
267
+ catch (cleanupError) {
268
+ stop();
269
+ throw new AggregateError([error, cleanupError], `Meeko condition ${id} update and cleanup failed`);
270
+ }
271
+ throw error;
272
+ }
273
+ return;
274
+ }
275
+ const failures = [];
276
+ try {
277
+ release?.();
278
+ }
279
+ catch (error) {
280
+ failures.push(error);
281
+ }
282
+ release = undefined;
283
+ try {
284
+ clearRegion(inner);
206
285
  }
207
- active = next;
286
+ catch (error) {
287
+ failures.push(error);
288
+ stop();
289
+ }
290
+ active = false;
291
+ if (failures.length === 1)
292
+ throw failures[0];
293
+ if (failures.length > 1)
294
+ throw new AggregateError(failures, `Meeko condition ${id} update failed`);
208
295
  });
209
296
  return () => { stop(); release?.(); };
210
297
  }
@@ -235,9 +322,12 @@ function moveRange(start, end, before) {
235
322
  const parent = before.parentNode;
236
323
  if (!parent)
237
324
  throw new Error("Detached Meeko list");
325
+ if (start.parentNode !== parent || end.parentNode !== parent)
326
+ throw new Error("Detached Meeko list row");
238
327
  const document = before.ownerDocument;
239
328
  if (!document)
240
329
  throw new Error("Missing document for Meeko list");
330
+ const originalNext = end.nextSibling;
241
331
  const fragment = document.createDocumentFragment();
242
332
  for (let node = start; node;) {
243
333
  const next = node.nextSibling;
@@ -246,7 +336,30 @@ function moveRange(start, end, before) {
246
336
  break;
247
337
  node = next;
248
338
  }
249
- parent.insertBefore(fragment, before);
339
+ try {
340
+ parent.insertBefore(fragment, before);
341
+ }
342
+ catch (error) {
343
+ try {
344
+ parent.insertBefore(fragment, originalNext);
345
+ }
346
+ catch (restoreError) {
347
+ throw new AggregateError([error, restoreError], "Meeko list move and restoration failed");
348
+ }
349
+ throw error;
350
+ }
351
+ }
352
+ function removeRange(start, end) {
353
+ const parent = start.parentNode;
354
+ if (!parent || end.parentNode !== parent)
355
+ throw new Error("Detached Meeko list row");
356
+ for (let node = start; node;) {
357
+ const next = node.nextSibling;
358
+ parent.removeChild(node);
359
+ if (node === end)
360
+ break;
361
+ node = next;
362
+ }
250
363
  }
251
364
  /** Encuentra las posiciones que ya mantienen el orden relativo de la lista anterior. */
252
365
  function stableListPositions(indices) {
@@ -285,35 +398,46 @@ export function bindFor(scope, id, read, keyOf, render, hydrate, trackIndex = tr
285
398
  const initial = [...read()];
286
399
  let currentKeys = [];
287
400
  let cursor = outer.start.nextSibling;
288
- for (let index = 0; index < initial.length; index++) {
289
- const item = initial[index];
290
- const key = keyToken(keyOf(item, index));
291
- if (entries.has(key))
292
- throw new Error(`Duplicate Meeko list key ${key}`);
293
- const startData = `meeko:item:${id}:${key}`;
294
- const endData = `/meeko:item:${id}:${key}`;
295
- if (!cursor || cursor.nodeType !== 8 || cursor.data !== startData)
296
- throw new Error(`Hydration mismatch in list ${id} at key ${key}`);
297
- const start = cursor;
298
- let end = start.nextSibling;
299
- while (end && (end.nodeType !== 8 || end.data !== endData))
300
- end = end.nextSibling;
301
- if (!end)
302
- throw new Error(`Missing end marker for list key ${key}`);
303
- const value = signal(item);
304
- const position = trackIndex ? signal(index) : undefined;
305
- const release = createRoot((dispose) => {
306
- const cleanup = hydrate(value, position, { root: scope.root, start, end: end });
307
- return () => { cleanup(); dispose(); };
308
- });
309
- entries.set(key, { key, start, end: end, value, index: position, release });
310
- currentKeys.push(key);
311
- cursor = end.nextSibling;
401
+ try {
402
+ for (let index = 0; index < initial.length; index++) {
403
+ const item = initial[index];
404
+ const key = keyToken(keyOf(item, index));
405
+ if (entries.has(key))
406
+ throw new Error(`Duplicate Meeko list key ${key}`);
407
+ const startData = `meeko:item:${id}:${key}`;
408
+ const endData = `/meeko:item:${id}:${key}`;
409
+ if (!cursor || cursor.nodeType !== 8 || cursor.data !== startData)
410
+ throw new Error(`Hydration mismatch in list ${id} at key ${key}`);
411
+ const start = cursor;
412
+ let end = start.nextSibling;
413
+ while (end && (end.nodeType !== 8 || end.data !== endData))
414
+ end = end.nextSibling;
415
+ if (!end)
416
+ throw new Error(`Missing end marker for list key ${key}`);
417
+ const value = signal(item);
418
+ const position = trackIndex ? signal(index) : undefined;
419
+ const release = createRoot((dispose) => {
420
+ const cleanup = hydrate(value, position, { root: scope.root, start, end: end });
421
+ return () => finishWithCleanup(cleanup, dispose);
422
+ });
423
+ entries.set(key, { key, start, end: end, value, index: position, release });
424
+ currentKeys.push(key);
425
+ cursor = end.nextSibling;
426
+ }
427
+ if (cursor !== outer.end)
428
+ throw new Error(`Hydration mismatch in list ${id}: extra nodes`);
429
+ }
430
+ catch (error) {
431
+ try {
432
+ releaseAll([...entries.values()].map((entry) => entry.release), { error });
433
+ }
434
+ finally {
435
+ entries.clear();
436
+ }
312
437
  }
313
- if (cursor !== outer.end)
314
- throw new Error(`Hydration mismatch in list ${id}: extra nodes`);
315
438
  let initialItems = initial;
316
- const stop = effect(() => {
439
+ let stop = () => { };
440
+ stop = effect(() => {
317
441
  const items = [...read()];
318
442
  if (initialItems) {
319
443
  const previous = initialItems;
@@ -328,55 +452,131 @@ export function bindFor(scope, id, read, keyOf, render, hydrate, trackIndex = tr
328
452
  const oldPositions = new Map(currentKeys.map((key, index) => [key, index]));
329
453
  const oldIndices = nextKeys.map((key) => oldPositions.get(key) ?? -1);
330
454
  const stable = stableListPositions(oldIndices);
331
- for (const [key, entry] of entries) {
332
- if (nextKeySet.has(key))
333
- continue;
334
- entry.release();
335
- let node = entry.start;
336
- while (node) {
337
- const next = node.nextSibling;
338
- node.parentNode?.removeChild(node);
339
- if (node === entry.end)
340
- break;
341
- node = next;
342
- }
343
- entries.delete(key);
344
- }
345
- let before = outer.end;
346
- for (let index = items.length - 1; index >= 0; index--) {
347
- const item = items[index];
348
- const key = nextKeys[index];
349
- let entry = entries.get(key);
350
- if (!entry) {
351
- const html = `<!--meeko:item:${id}:${key}-->${render(item, index)}<!--/meeko:item:${id}:${key}-->`;
352
- insertHtml(before, html);
353
- const end = before.previousSibling;
455
+ const newRows = items.flatMap((item, index) => entries.has(nextKeys[index]) ? [] : [{
456
+ key: nextKeys[index], index, item,
457
+ html: `<!--meeko:item:${id}:${nextKeys[index]}-->${render(item, index)}<!--/meeko:item:${id}:${nextKeys[index]}-->`,
458
+ }]);
459
+ const staged = new Map();
460
+ const inserted = [];
461
+ let moving = false;
462
+ try {
463
+ for (const row of newRows) {
464
+ const marker = outer.end;
465
+ insertHtml(marker, row.html);
466
+ const end = marker.previousSibling;
354
467
  let start = end.previousSibling;
355
- while (start && (start.nodeType !== 8 || start.data !== `meeko:item:${id}:${key}`))
468
+ while (start && (start.nodeType !== 8 || start.data !== `meeko:item:${id}:${row.key}`))
356
469
  start = start.previousSibling;
357
470
  if (!start)
358
- throw new Error(`Missing new list marker for ${key}`);
359
- const value = signal(item);
360
- const position = trackIndex ? signal(index) : undefined;
471
+ throw new Error(`Missing new list marker for ${row.key}`);
472
+ inserted.push({ start: start, end });
473
+ const value = signal(row.item);
474
+ const position = trackIndex ? signal(row.index) : undefined;
361
475
  const release = createRoot((dispose) => {
362
476
  const cleanup = hydrate(value, position, { root: scope.root, start: start, end });
363
- return () => { cleanup(); dispose(); };
477
+ return () => finishWithCleanup(cleanup, dispose);
364
478
  });
365
- entry = { key, start: start, end, value, index: position, release };
366
- entries.set(key, entry);
479
+ staged.set(row.key, { key: row.key, start: start, end, value, index: position, release });
480
+ }
481
+ moving = true;
482
+ let before = outer.end;
483
+ for (let index = items.length - 1; index >= 0; index--) {
484
+ const key = nextKeys[index];
485
+ const entry = entries.get(key) ?? staged.get(key);
486
+ if ((oldIndices[index] === -1 || !stable.has(index)) && entry.end.nextSibling !== before) {
487
+ moveRange(entry.start, entry.end, before);
488
+ }
489
+ before = entry.start;
367
490
  }
368
- else {
369
- entry.value.value = item;
370
- if (entry.index)
371
- entry.index.value = index;
491
+ }
492
+ catch (error) {
493
+ const failures = [error];
494
+ for (const entry of [...staged.values()].reverse()) {
495
+ try {
496
+ entry.release();
497
+ }
498
+ catch (cleanupError) {
499
+ failures.push(cleanupError);
500
+ }
501
+ }
502
+ for (const row of inserted.reverse()) {
503
+ try {
504
+ removeRange(row.start, row.end);
505
+ }
506
+ catch (cleanupError) {
507
+ failures.push(cleanupError);
508
+ }
509
+ }
510
+ if (moving) {
511
+ let before = outer.end;
512
+ for (let index = currentKeys.length - 1; index >= 0; index--) {
513
+ const entry = entries.get(currentKeys[index]);
514
+ try {
515
+ if (entry.end.nextSibling !== before)
516
+ moveRange(entry.start, entry.end, before);
517
+ before = entry.start;
518
+ }
519
+ catch (restoreError) {
520
+ failures.push(restoreError);
521
+ }
522
+ }
372
523
  }
373
- if (oldIndices[index] !== -1 && !stable.has(index) && entry.end.nextSibling !== before)
374
- moveRange(entry.start, entry.end, before);
375
- before = entry.start;
524
+ if (failures.length > 1) {
525
+ stop();
526
+ throw new AggregateError(failures, `Meeko list ${id} update and cleanup failed`);
527
+ }
528
+ throw error;
376
529
  }
530
+ const failures = [];
531
+ for (const [key, entry] of entries) {
532
+ if (nextKeySet.has(key))
533
+ continue;
534
+ try {
535
+ entry.release();
536
+ }
537
+ catch (error) {
538
+ failures.push(error);
539
+ }
540
+ try {
541
+ removeRange(entry.start, entry.end);
542
+ }
543
+ catch (error) {
544
+ failures.push(error);
545
+ stop();
546
+ }
547
+ entries.delete(key);
548
+ }
549
+ for (const [key, entry] of staged)
550
+ entries.set(key, entry);
377
551
  currentKeys = nextKeys;
552
+ try {
553
+ batch(() => {
554
+ for (let index = 0; index < items.length; index++) {
555
+ const entry = entries.get(nextKeys[index]);
556
+ if (staged.has(entry.key))
557
+ continue;
558
+ entry.value.value = items[index];
559
+ if (entry.index)
560
+ entry.index.value = index;
561
+ }
562
+ });
563
+ }
564
+ catch (error) {
565
+ failures.push(error);
566
+ }
567
+ if (failures.length === 1)
568
+ throw failures[0];
569
+ if (failures.length > 1)
570
+ throw new AggregateError(failures, `Meeko list ${id} update failed`);
378
571
  });
379
- return () => { stop(); for (const entry of entries.values())
380
- entry.release(); entries.clear(); };
572
+ return () => {
573
+ stop();
574
+ try {
575
+ releaseAll([...entries.values()].map((entry) => entry.release));
576
+ }
577
+ finally {
578
+ entries.clear();
579
+ }
580
+ };
381
581
  }
382
582
  //# sourceMappingURL=dom.js.map