@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.
- package/README.md +21 -19
- package/dist/autoimports-ts.d.ts +4 -4
- package/dist/autoimports-ts.js +86 -30
- package/dist/autoimports-ts.js.map +1 -1
- package/dist/autoimports.d.ts +2 -2
- package/dist/autoimports.js +23 -7
- package/dist/autoimports.js.map +1 -1
- package/dist/check.js +39 -10
- package/dist/check.js.map +1 -1
- package/dist/cli.js +37 -4
- package/dist/cli.js.map +1 -1
- package/dist/compiler/events.d.ts +2 -0
- package/dist/compiler/events.js +6 -0
- package/dist/compiler/events.js.map +1 -0
- package/dist/compiler/props.d.ts +12 -0
- package/dist/compiler/props.js +32 -0
- package/dist/compiler/props.js.map +1 -0
- package/dist/compiler.js +55 -12
- package/dist/compiler.js.map +1 -1
- package/dist/component-errors.d.ts +18 -0
- package/dist/component-errors.js +65 -0
- package/dist/component-errors.js.map +1 -0
- package/dist/devtools.js +2 -4
- package/dist/devtools.js.map +1 -1
- package/dist/dom.d.ts +11 -5
- package/dist/dom.js +288 -88
- package/dist/dom.js.map +1 -1
- package/dist/error-observer.d.ts +6 -0
- package/dist/error-observer.js +41 -0
- package/dist/error-observer.js.map +1 -0
- package/dist/framework/check-app.js +160 -5
- package/dist/framework/check-app.js.map +1 -1
- package/dist/framework/check-project.d.ts +4 -0
- package/dist/framework/check-project.js +42 -0
- package/dist/framework/check-project.js.map +1 -0
- package/dist/framework/client.d.ts +3 -0
- package/dist/framework/client.js +136 -33
- package/dist/framework/client.js.map +1 -1
- package/dist/framework/clients.js +12 -4
- package/dist/framework/clients.js.map +1 -1
- package/dist/framework/contracts-generate.js +66 -3
- package/dist/framework/contracts-generate.js.map +1 -1
- package/dist/framework/init.js +21 -200
- package/dist/framework/init.js.map +1 -1
- package/dist/framework/middleware.d.ts +14 -0
- package/dist/framework/middleware.js +16 -0
- package/dist/framework/middleware.js.map +1 -0
- package/dist/framework/page-contracts-check.d.ts +8 -0
- package/dist/framework/page-contracts-check.js +110 -0
- package/dist/framework/page-contracts-check.js.map +1 -0
- package/dist/framework/page-contracts-generate.d.ts +2 -0
- package/dist/framework/page-contracts-generate.js +94 -0
- package/dist/framework/page-contracts-generate.js.map +1 -0
- package/dist/framework/page.d.ts +7 -3
- package/dist/framework/page.js +3 -1
- package/dist/framework/page.js.map +1 -1
- package/dist/framework/prerender.js +11 -5
- package/dist/framework/prerender.js.map +1 -1
- package/dist/framework/project-templates.d.ts +3 -0
- package/dist/framework/project-templates.js +119 -0
- package/dist/framework/project-templates.js.map +1 -0
- package/dist/framework/project.d.ts +9 -0
- package/dist/framework/project.js +272 -0
- package/dist/framework/project.js.map +1 -0
- package/dist/framework/router.d.ts +3 -1
- package/dist/framework/router.js +94 -8
- package/dist/framework/router.js.map +1 -1
- package/dist/framework/server.d.ts +17 -3
- package/dist/framework/server.js +71 -24
- package/dist/framework/server.js.map +1 -1
- package/dist/framework/socket-contracts-generate.js +8 -5
- package/dist/framework/socket-contracts-generate.js.map +1 -1
- package/dist/framework/socket.d.ts +2 -0
- package/dist/framework/socket.js +119 -17
- package/dist/framework/socket.js.map +1 -1
- package/dist/framework/standard-schema-types.d.ts +7 -0
- package/dist/framework/standard-schema-types.js +69 -0
- package/dist/framework/standard-schema-types.js.map +1 -0
- package/dist/framework/state.d.ts +7 -0
- package/dist/framework/state.js +78 -14
- package/dist/framework/state.js.map +1 -1
- package/dist/framework/styles.d.ts +2 -0
- package/dist/framework/styles.js +6 -0
- package/dist/framework/styles.js.map +1 -0
- package/dist/framework/type-declarations.d.ts +5 -0
- package/dist/framework/type-declarations.js +84 -0
- package/dist/framework/type-declarations.js.map +1 -0
- package/dist/framework-server/contracts.d.ts +11 -2
- package/dist/framework-server/contracts.js +62 -7
- package/dist/framework-server/contracts.js.map +1 -1
- package/dist/framework-server/discovery.d.ts +4 -1
- package/dist/framework-server/discovery.js +21 -16
- package/dist/framework-server/discovery.js.map +1 -1
- package/dist/framework-server/local.d.ts +2 -0
- package/dist/framework-server/local.js +5 -3
- package/dist/framework-server/local.js.map +1 -1
- package/dist/framework-server/middleware.d.ts +4 -0
- package/dist/framework-server/middleware.js +56 -0
- package/dist/framework-server/middleware.js.map +1 -0
- package/dist/framework-server/node-upgrade.js +27 -9
- package/dist/framework-server/node-upgrade.js.map +1 -1
- package/dist/framework-server/node-websocket.js +4 -2
- package/dist/framework-server/node-websocket.js.map +1 -1
- package/dist/framework-server/session-stores.d.ts +9 -2
- package/dist/framework-server/session-stores.js +37 -11
- package/dist/framework-server/session-stores.js.map +1 -1
- package/dist/framework-server/sessions.d.ts +6 -0
- package/dist/framework-server/sessions.js +41 -10
- package/dist/framework-server/sessions.js.map +1 -1
- package/dist/framework-server/socket.js +62 -27
- package/dist/framework-server/socket.js.map +1 -1
- package/dist/framework-server.d.ts +2 -0
- package/dist/framework-server.js +1 -0
- package/dist/framework-server.js.map +1 -1
- package/dist/framework.d.ts +3 -1
- package/dist/framework.js +1 -0
- package/dist/framework.js.map +1 -1
- package/dist/hmr.js +74 -24
- package/dist/hmr.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +27 -1
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +2 -2
- package/dist/internal.js +2 -2
- package/dist/internal.js.map +1 -1
- package/dist/node.d.ts +5 -1
- package/dist/node.js +80 -10
- package/dist/node.js.map +1 -1
- package/dist/reactivity.d.ts +12 -3
- package/dist/reactivity.js +94 -17
- package/dist/reactivity.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/vite.js +29 -9
- package/dist/vite.js.map +1 -1
- package/package.json +2 -2
package/dist/devtools.js.map
CHANGED
|
@@ -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":"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","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>)
|
|
11
|
-
renderWithState
|
|
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>)
|
|
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:
|
|
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
|
-
|
|
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
|
|
157
|
+
const previousState = release.snapshot?.();
|
|
158
|
+
const state = nextComponent === component ? previousState : undefined;
|
|
129
159
|
const html = nextComponent.renderToString(next, state);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
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
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
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
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
360
|
-
const
|
|
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 () =>
|
|
477
|
+
return () => finishWithCleanup(cleanup, dispose);
|
|
364
478
|
});
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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 (
|
|
374
|
-
|
|
375
|
-
|
|
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 () => {
|
|
380
|
-
|
|
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
|