import { RENDERER_SOURCE, HOST_SOURCE } from './protocol.js'; import type { FiberNode, DOMRectLike } from './protocol.js'; // ── Legacy fiber hook script ────────────────────────────────────────────────── // @deprecated Use buildProxyFiberHookScript() instead. This version bakes // the artboard ID into the script at generation time; the proxy-compatible // version reads it from window.name at runtime. export function buildFiberHookScript(artboardId: string): string { return `(function(artboardId) { var SOURCE = ${JSON.stringify(RENDERER_SOURCE)}; var hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__; if (!hook) { var _legacyNextId = 0; hook = { renderers: new Map(), supportsFiber: true, _isDisabled: false, inject: function(r) { var id = ++_legacyNextId; hook.renderers.set(id, r); return id; }, }; window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook; } else if (typeof hook.inject !== 'function') { var _legacyNextId2 = 0; hook.inject = function(r) { var id = ++_legacyNextId2; hook.renderers.set(id, r); return id; }; } var originalOnCommitFiberRoot = hook.onCommitFiberRoot; hook.onCommitFiberRoot = function(rendererId, root, priorityLevel, didError) { if (typeof originalOnCommitFiberRoot === 'function') { originalOnCommitFiberRoot.call(this, rendererId, root, priorityLevel, didError); } try { var fiberRoot = root.current; var tree = serializeFiber(fiberRoot); window.parent.postMessage( { source: SOURCE, artboardId: artboardId, message: { type: 'FIBER_TREE_UPDATE', root: tree } }, '*' ); } catch (err) { window.parent.postMessage( { source: SOURCE, artboardId: artboardId, message: { type: 'ERROR', message: String(err) } }, '*' ); } }; function serializeFiber(fiber) { if (!fiber) return null; var name = getDisplayName(fiber); if (!name) return serializeFiber(fiber.child) || null; var rect = getDomRect(fiber); var node = { id: String(fiber.index || Math.random()), name: name, props: serializeProps(fiber.memoizedProps), children: [], domRect: rect || undefined, }; var child = fiber.child; while (child) { var serialized = serializeFiber(child); if (serialized) node.children.push(serialized); child = child.sibling; } return node; } function getDisplayName(fiber) { var type = fiber.type; if (!type) return null; if (typeof type === 'string') return type; if (typeof type === 'function') return type.displayName || type.name || null; if (type.$$typeof) return type.displayName || type.name || null; return null; } function getDomRect(fiber) { try { var dom = fiber.stateNode; if (dom && dom.getBoundingClientRect) { var r = dom.getBoundingClientRect(); return { x: r.x, y: r.y, width: r.width, height: r.height }; } } catch (_) {} return null; } function serializeProps(props) { if (!props || typeof props !== 'object') return {}; var out = {}; for (var key in props) { if (key === 'children') continue; var val = props[key]; var type = typeof val; if (type === 'string' || type === 'number' || type === 'boolean' || val === null) { out[key] = val; } } return out; } window.parent.postMessage( { source: SOURCE, artboardId: artboardId, message: { type: 'READY' } }, '*' ); })(${JSON.stringify(artboardId)});`; } // ── Proxy-compatible fiber hook script ──────────────────────────────────────── // Reads the artboard ID from window.name at runtime (set by LiveArtboard: //