@iteraai/react-component-inspector 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 (59) hide show
  1. package/README.md +168 -0
  2. package/dist/adapters/base/baseAdapter.d.ts +24 -0
  3. package/dist/adapters/base/createReactInspectorAdapter.d.ts +6 -0
  4. package/dist/adapters/base/index.d.ts +4 -0
  5. package/dist/adapters/base/runtimeConfig.d.ts +4 -0
  6. package/dist/adapters/base/sourceMetadata.d.ts +3 -0
  7. package/dist/adapters/base/types.d.ts +23 -0
  8. package/dist/adapters/cra/craAdapter.d.ts +6 -0
  9. package/dist/adapters/cra/index.d.ts +3 -0
  10. package/dist/adapters/fiber/fiberAdapter.d.ts +9 -0
  11. package/dist/adapters/fiber/highlightTarget.d.ts +2 -0
  12. package/dist/adapters/fiber/index.d.ts +3 -0
  13. package/dist/adapters/fiber/nodeIdentity.d.ts +14 -0
  14. package/dist/adapters/fiber/nodeLookup.d.ts +23 -0
  15. package/dist/adapters/fiber/props.d.ts +2 -0
  16. package/dist/adapters/fiber/rootDiscovery.d.ts +2 -0
  17. package/dist/adapters/fiber/source.d.ts +2 -0
  18. package/dist/adapters/fiber/spike/devtoolsProbe.d.ts +2 -0
  19. package/dist/adapters/fiber/spike/displayName.d.ts +1 -0
  20. package/dist/adapters/fiber/spike/fallbackDecision.d.ts +26 -0
  21. package/dist/adapters/fiber/spike/fiberTraversal.d.ts +12 -0
  22. package/dist/adapters/fiber/spike/types.d.ts +35 -0
  23. package/dist/adapters/fiber/traversal.d.ts +31 -0
  24. package/dist/adapters/fiber/treeMapping.d.ts +8 -0
  25. package/dist/adapters/fiber/types.d.ts +35 -0
  26. package/dist/adapters/next/index.d.ts +3 -0
  27. package/dist/adapters/next/nextAdapter.d.ts +6 -0
  28. package/dist/adapters/vite/index.d.ts +3 -0
  29. package/dist/adapters/vite/viteAdapter.d.ts +6 -0
  30. package/dist/bridgeRuntime.d.ts +37 -0
  31. package/dist/bridgeRuntime.js +7 -0
  32. package/dist/bridgeRuntime.js.map +1 -0
  33. package/dist/chunks/bridgeRuntime-Da4khSK2.js +2278 -0
  34. package/dist/chunks/bridgeRuntime-Da4khSK2.js.map +1 -0
  35. package/dist/chunks/embeddedBootstrap-v-MS8cPB.js +358 -0
  36. package/dist/chunks/embeddedBootstrap-v-MS8cPB.js.map +1 -0
  37. package/dist/devtoolsInlineBackendHook.d.ts +5 -0
  38. package/dist/embeddedBootstrap.d.ts +24 -0
  39. package/dist/embeddedBootstrap.js +7 -0
  40. package/dist/embeddedBootstrap.js.map +1 -0
  41. package/dist/embeddedRuntimeTelemetry.d.ts +34 -0
  42. package/dist/highlighter.d.ts +6 -0
  43. package/dist/index.d.ts +13 -0
  44. package/dist/index.js +49 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/iterationInspector/index.d.ts +2 -0
  47. package/dist/iterationInspector/runtime.d.ts +23 -0
  48. package/dist/iterationInspector/types.d.ts +74 -0
  49. package/dist/iterationInspector.js +708 -0
  50. package/dist/iterationInspector.js.map +1 -0
  51. package/dist/reactDevtoolsInlineBackend.d.ts +7 -0
  52. package/dist/reactTreeAdapter.d.ts +3 -0
  53. package/dist/security/bridgeTelemetry.d.ts +50 -0
  54. package/dist/security/inspectorSecurityEvents.d.ts +18 -0
  55. package/dist/security/messageSizePolicy.d.ts +19 -0
  56. package/dist/security/redactionPolicy.d.ts +2 -0
  57. package/dist/security/tokenValidation.d.ts +15 -0
  58. package/dist/serializer.d.ts +10 -0
  59. package/package.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridgeRuntime-Da4khSK2.js","sources":["../../src/adapters/base/baseAdapter.ts","../../src/adapters/base/runtimeConfig.ts","../../src/adapters/base/sourceMetadata.ts","../../src/adapters/cra/craAdapter.ts","../../src/adapters/fiber/highlightTarget.ts","../../src/adapters/fiber/nodeIdentity.ts","../../src/adapters/fiber/nodeLookup.ts","../../src/adapters/fiber/props.ts","../../src/adapters/fiber/rootDiscovery.ts","../../src/adapters/fiber/source.ts","../../src/adapters/fiber/treeMapping.ts","../../src/adapters/fiber/traversal.ts","../../src/adapters/fiber/fiberAdapter.ts","../../src/adapters/next/nextAdapter.ts","../../src/adapters/vite/viteAdapter.ts","../../src/security/bridgeTelemetry.ts","../../src/adapters/base/createReactInspectorAdapter.ts","../../src/highlighter.ts","../../src/security/inspectorSecurityEvents.ts","../../src/security/messageSizePolicy.ts","../../src/security/tokenValidation.ts","../../src/security/redactionPolicy.ts","../../src/serializer.ts","../../src/bridgeRuntime.ts"],"sourcesContent":["import type { TreeNode, TreeSnapshotMeta } from '@iteraai/inspector-protocol';\nimport type { ReactInspectorAdapterContract } from './types';\n\nexport type ReactTreeSnapshot = {\n nodes: TreeNode[];\n rootIds: string[];\n meta?: TreeSnapshotMeta;\n};\n\nexport type CappedReactTreeSnapshot = ReactTreeSnapshot & {\n meta?: TreeSnapshotMeta;\n};\n\nexport const MAX_TREE_SNAPSHOT_NODE_COUNT = 200;\n\nconst toUniqueNodeById = (nodes: TreeNode[]) => {\n const nodeById = new Map<string, TreeNode>();\n\n nodes.forEach((node) => {\n if (nodeById.has(node.id)) {\n return;\n }\n\n nodeById.set(node.id, node);\n });\n\n return nodeById;\n};\n\nconst toTraversalSeedNodeIds = (\n snapshot: ReactTreeSnapshot,\n nodeById: Map<string, TreeNode>,\n) => {\n const seedNodeIds: string[] = [];\n const seenSeedNodeIds = new Set<string>();\n\n const appendSeedNodeId = (nodeId: string | null | undefined) => {\n if (\n nodeId === undefined ||\n nodeId === null ||\n seenSeedNodeIds.has(nodeId) ||\n !nodeById.has(nodeId)\n ) {\n return;\n }\n\n seenSeedNodeIds.add(nodeId);\n seedNodeIds.push(nodeId);\n };\n\n snapshot.rootIds.forEach((rootId) => {\n appendSeedNodeId(rootId);\n });\n\n snapshot.nodes.forEach((node) => {\n if (node.parentId === null) {\n appendSeedNodeId(node.id);\n }\n });\n\n snapshot.nodes.forEach((node) => {\n appendSeedNodeId(node.id);\n });\n\n return seedNodeIds;\n};\n\nconst toTruncatedNodes = (\n snapshot: ReactTreeSnapshot,\n includedNodeIdSet: Set<string>,\n) => {\n const emittedNodeIds = new Set<string>();\n\n return snapshot.nodes.flatMap((node) => {\n if (!includedNodeIdSet.has(node.id) || emittedNodeIds.has(node.id)) {\n return [];\n }\n\n emittedNodeIds.add(node.id);\n\n return [\n {\n ...node,\n parentId:\n node.parentId !== null && includedNodeIdSet.has(node.parentId)\n ? node.parentId\n : null,\n childrenIds: node.childrenIds.filter((childId) =>\n includedNodeIdSet.has(childId),\n ),\n },\n ];\n });\n};\n\nconst toTruncatedRootIds = (\n snapshot: ReactTreeSnapshot,\n truncatedNodes: TreeNode[],\n) => {\n const includedNodeById = new Map(\n truncatedNodes.map((node) => [node.id, node]),\n );\n const includedRootIds: string[] = [];\n const seenRootIds = new Set<string>();\n\n snapshot.rootIds.forEach((rootId) => {\n if (seenRootIds.has(rootId)) {\n return;\n }\n\n const includedNode = includedNodeById.get(rootId);\n\n if (includedNode === undefined || includedNode.parentId !== null) {\n return;\n }\n\n seenRootIds.add(rootId);\n includedRootIds.push(rootId);\n });\n\n truncatedNodes.forEach((node) => {\n if (node.parentId !== null || seenRootIds.has(node.id)) {\n return;\n }\n\n seenRootIds.add(node.id);\n includedRootIds.push(node.id);\n });\n\n return includedRootIds;\n};\n\nexport const capTreeSnapshot = (\n snapshot: ReactTreeSnapshot,\n maxNodeCount = MAX_TREE_SNAPSHOT_NODE_COUNT,\n): CappedReactTreeSnapshot => {\n const totalNodeCount = snapshot.nodes.length;\n\n if (maxNodeCount <= 0) {\n return {\n nodes: [],\n rootIds: [],\n meta: {\n truncated: true,\n totalNodeCount,\n includedNodeCount: 0,\n truncatedNodeCount: totalNodeCount,\n },\n };\n }\n\n if (totalNodeCount <= maxNodeCount) {\n return snapshot;\n }\n\n const nodeById = toUniqueNodeById(snapshot.nodes);\n const traversalQueue = toTraversalSeedNodeIds(snapshot, nodeById);\n const visitedNodeIds = new Set<string>();\n const includedNodeIds: string[] = [];\n let queueIndex = 0;\n\n while (\n queueIndex < traversalQueue.length &&\n includedNodeIds.length < maxNodeCount\n ) {\n const nodeId = traversalQueue[queueIndex];\n queueIndex += 1;\n\n if (visitedNodeIds.has(nodeId)) {\n continue;\n }\n\n const node = nodeById.get(nodeId);\n\n if (node === undefined) {\n continue;\n }\n\n visitedNodeIds.add(nodeId);\n includedNodeIds.push(nodeId);\n\n node.childrenIds.forEach((childId) => {\n if (!visitedNodeIds.has(childId) && nodeById.has(childId)) {\n traversalQueue.push(childId);\n }\n });\n }\n\n if (includedNodeIds.length < maxNodeCount) {\n snapshot.nodes.forEach((node) => {\n if (\n includedNodeIds.length >= maxNodeCount ||\n visitedNodeIds.has(node.id)\n ) {\n return;\n }\n\n if (!nodeById.has(node.id)) {\n return;\n }\n\n visitedNodeIds.add(node.id);\n includedNodeIds.push(node.id);\n });\n }\n\n const includedNodeIdSet = new Set(includedNodeIds);\n const truncatedNodes = toTruncatedNodes(snapshot, includedNodeIdSet);\n const truncatedRootIds = toTruncatedRootIds(snapshot, truncatedNodes);\n const includedNodeCount = truncatedNodes.length;\n\n return {\n nodes: truncatedNodes,\n rootIds: truncatedRootIds,\n meta: {\n truncated: true,\n totalNodeCount,\n includedNodeCount,\n truncatedNodeCount: totalNodeCount - includedNodeCount,\n },\n };\n};\n\nexport type BaseAdapterNodeLookup = {\n node: TreeNode;\n nodeById: ReadonlyMap<string, TreeNode>;\n snapshot: ReactTreeSnapshot;\n};\n\nconst resolveNodeLookup = (\n snapshot: ReactTreeSnapshot,\n nodeId: string,\n): BaseAdapterNodeLookup | undefined => {\n const nodeById = toUniqueNodeById(snapshot.nodes);\n const node = nodeById.get(nodeId);\n\n if (node === undefined) {\n return undefined;\n }\n\n return {\n node,\n nodeById,\n snapshot,\n };\n};\n\nexport type CreateBaseReactInspectorAdapterOptions = {\n getTreeSnapshot: () => ReactTreeSnapshot;\n getNodeProps?: (lookup: BaseAdapterNodeLookup) => unknown | undefined;\n getDomElement?: (lookup: BaseAdapterNodeLookup) => Element | null;\n getReactComponentPathForElement?: (\n element: Element,\n ) => ReadonlyArray<string> | undefined;\n};\n\nexport const createBaseReactInspectorAdapter = (\n options: CreateBaseReactInspectorAdapterOptions,\n): ReactInspectorAdapterContract => {\n return {\n getTreeSnapshot: () => options.getTreeSnapshot(),\n getNodeProps: (nodeId: string) => {\n if (options.getNodeProps === undefined) {\n return undefined;\n }\n\n const snapshot = options.getTreeSnapshot();\n const lookup = resolveNodeLookup(snapshot, nodeId);\n\n if (lookup === undefined) {\n return undefined;\n }\n\n return options.getNodeProps(lookup);\n },\n getDomElement: (nodeId: string) => {\n if (options.getDomElement === undefined) {\n return null;\n }\n\n const snapshot = options.getTreeSnapshot();\n const lookup = resolveNodeLookup(snapshot, nodeId);\n\n if (lookup === undefined) {\n return null;\n }\n\n return options.getDomElement(lookup);\n },\n getReactComponentPathForElement: options.getReactComponentPathForElement,\n };\n};\n","import type {\n ReactInspectorAdapterCapabilities,\n ReactInspectorRuntimeConfig,\n ResolvedReactInspectorRuntimeConfig,\n} from './types';\n\nexport const defaultReactInspectorAdapterCapabilities: ReactInspectorAdapterCapabilities =\n Object.freeze({\n tree: true,\n props: true,\n highlight: true,\n });\n\nexport const defaultReactInspectorRuntimeConfig: ResolvedReactInspectorRuntimeConfig =\n Object.freeze({\n adapter: 'auto',\n capabilities: defaultReactInspectorAdapterCapabilities,\n });\n\nconst resolveCapabilities = (\n capabilities: ReactInspectorRuntimeConfig['capabilities'],\n): ReactInspectorAdapterCapabilities => {\n return {\n tree: capabilities?.tree ?? defaultReactInspectorAdapterCapabilities.tree,\n props:\n capabilities?.props ?? defaultReactInspectorAdapterCapabilities.props,\n highlight:\n capabilities?.highlight ??\n defaultReactInspectorAdapterCapabilities.highlight,\n };\n};\n\nexport const resolveReactInspectorRuntimeConfig = (\n runtimeConfig?: ReactInspectorRuntimeConfig,\n): ResolvedReactInspectorRuntimeConfig => {\n return {\n adapter: runtimeConfig?.adapter ?? defaultReactInspectorRuntimeConfig.adapter,\n capabilities: resolveCapabilities(runtimeConfig?.capabilities),\n };\n};\n","import type { TreeNodeSource } from '@iteraai/inspector-protocol';\n\nconst INSPECTOR_SOURCE_ATTRIBUTE = 'data-inspector-source';\nconst INSPECTOR_SOURCE_FILE_ATTRIBUTE = 'data-inspector-source-file';\nconst INSPECTOR_SOURCE_LINE_ATTRIBUTE = 'data-inspector-source-line';\nconst INSPECTOR_SOURCE_COLUMN_ATTRIBUTE = 'data-inspector-source-column';\nconst SOURCE_LOCATION_PATTERN = /^(.*?):(\\d+)(?::(\\d+))?$/;\n\ntype RawSourceMetadata = {\n file?: unknown;\n line?: unknown;\n column?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst toNormalizedFile = (value: unknown) => {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (trimmedValue.length === 0) {\n return undefined;\n }\n\n return trimmedValue;\n};\n\nconst toNormalizedPositiveInteger = (value: unknown) => {\n if (typeof value === 'number') {\n return Number.isInteger(value) && value >= 1 ? value : undefined;\n }\n\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!/^\\d+$/.test(trimmedValue)) {\n return undefined;\n }\n\n const parsedValue = Number(trimmedValue);\n\n return Number.isInteger(parsedValue) && parsedValue >= 1\n ? parsedValue\n : undefined;\n};\n\nconst toSourceFromLocationString = (value: string) => {\n const locationMatch = value.trim().match(SOURCE_LOCATION_PATTERN);\n\n if (locationMatch === null) {\n return undefined;\n }\n\n const [, file, line, column] = locationMatch;\n\n return normalizeTreeNodeSource({\n file,\n line,\n ...(column !== undefined && {\n column,\n }),\n });\n};\n\nconst toSourceFromSourceAttribute = (sourceValue: string) => {\n const trimmedValue = sourceValue.trim();\n\n if (trimmedValue.length === 0) {\n return undefined;\n }\n\n if (trimmedValue.startsWith('{')) {\n try {\n const parsedValue = JSON.parse(trimmedValue) as unknown;\n\n return normalizeTreeNodeSource(parsedValue);\n } catch {\n return undefined;\n }\n }\n\n return toSourceFromLocationString(trimmedValue);\n};\n\nexport const normalizeTreeNodeSource = (\n value: unknown,\n): TreeNodeSource | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const source = value as RawSourceMetadata;\n const file = toNormalizedFile(source.file);\n const line = toNormalizedPositiveInteger(source.line);\n\n if (file === undefined || line === undefined) {\n return undefined;\n }\n\n const normalizedColumn = toNormalizedPositiveInteger(source.column);\n\n return normalizedColumn === undefined\n ? {\n file,\n line,\n }\n : {\n file,\n line,\n column: normalizedColumn,\n };\n};\n\nexport const getNormalizedTreeNodeSourceFromElement = (\n element: Element,\n): TreeNodeSource | undefined => {\n const sourceAttribute = element.getAttribute(INSPECTOR_SOURCE_ATTRIBUTE);\n\n if (sourceAttribute !== null) {\n const sourceFromAttribute = toSourceFromSourceAttribute(sourceAttribute);\n\n if (sourceFromAttribute !== undefined) {\n return sourceFromAttribute;\n }\n }\n\n const sourceFile = element.getAttribute(INSPECTOR_SOURCE_FILE_ATTRIBUTE);\n const sourceLine = element.getAttribute(INSPECTOR_SOURCE_LINE_ATTRIBUTE);\n const sourceColumn = element.getAttribute(INSPECTOR_SOURCE_COLUMN_ATTRIBUTE);\n\n if (sourceFile === null && sourceLine === null && sourceColumn === null) {\n return undefined;\n }\n\n return normalizeTreeNodeSource({\n ...(sourceFile !== null && {\n file: sourceFile,\n }),\n ...(sourceLine !== null && {\n line: sourceLine,\n }),\n ...(sourceColumn !== null && {\n column: sourceColumn,\n }),\n });\n};\n","import type { TreeNode } from '@iteraai/inspector-protocol';\nimport { createBaseReactInspectorAdapter } from '../base/baseAdapter';\nimport { getNormalizedTreeNodeSourceFromElement } from '../base/sourceMetadata';\nimport type { ReactInspectorAdapterContract } from '../base/types';\n\nconst INSPECTOR_NODE_ID_ATTRIBUTE = 'data-inspector-node-id';\nconst INSPECTOR_DISPLAY_NAME_ATTRIBUTE = 'data-inspector-display-name';\nconst CRA_ROOT_ID = 'root';\nconst LEGACY_REACT_ROOT_ATTRIBUTE = 'data-reactroot';\nconst CRA_ROOT_NODE_ID = 'cra-root';\nconst CRA_LEGACY_ROOT_NODE_ID = 'cra-legacy-root';\nconst MAX_TEXT_PREVIEW_LENGTH = 120;\n\ntype CraTreeModel = {\n snapshot: {\n nodes: TreeNode[];\n rootIds: string[];\n };\n nodeElementById: Map<string, Element>;\n};\n\ntype CreateCraReactInspectorAdapterOptions = {\n doc?: Document;\n};\n\nconst toDisplayName = (element: Element, nodeId: string) => {\n const explicitDisplayName = element\n .getAttribute(INSPECTOR_DISPLAY_NAME_ATTRIBUTE)\n ?.trim();\n\n if (explicitDisplayName !== undefined && explicitDisplayName.length > 0) {\n return explicitDisplayName;\n }\n\n const displayNameFromNodeId = nodeId\n .split(/[\\s_-]+/)\n .filter((segment) => segment.length > 0)\n .map((segment) => segment[0].toUpperCase() + segment.slice(1))\n .join('');\n\n if (displayNameFromNodeId.length > 0) {\n return displayNameFromNodeId;\n }\n\n return element.tagName.toLowerCase();\n};\n\nconst getExplicitNodeIdFromElement = (element: Element) => {\n const nodeId = element.getAttribute(INSPECTOR_NODE_ID_ATTRIBUTE)?.trim();\n\n if (nodeId === undefined || nodeId.length === 0) {\n return undefined;\n }\n\n return nodeId;\n};\n\nconst toTreeCandidates = (doc: Document) => {\n const explicitInspectorNodes = Array.from(\n doc.querySelectorAll(`[${INSPECTOR_NODE_ID_ATTRIBUTE}]`),\n ).filter((element) => getExplicitNodeIdFromElement(element) !== undefined);\n\n if (explicitInspectorNodes.length > 0) {\n return explicitInspectorNodes;\n }\n\n const craRoot = doc.getElementById(CRA_ROOT_ID);\n\n if (craRoot !== null) {\n return [craRoot];\n }\n\n const legacyReactRoot = doc.querySelector(`[${LEGACY_REACT_ROOT_ATTRIBUTE}]`);\n\n if (legacyReactRoot !== null) {\n return [legacyReactRoot];\n }\n\n return [];\n};\n\nconst resolveNodeIdForCandidate = (element: Element) => {\n const explicitNodeId = getExplicitNodeIdFromElement(element);\n\n if (explicitNodeId !== undefined) {\n return explicitNodeId;\n }\n\n if ((element.getAttribute('id') ?? '').trim() === CRA_ROOT_ID) {\n return CRA_ROOT_NODE_ID;\n }\n\n if (element.hasAttribute(LEGACY_REACT_ROOT_ATTRIBUTE)) {\n return CRA_LEGACY_ROOT_NODE_ID;\n }\n\n return CRA_ROOT_NODE_ID;\n};\n\nconst buildTreeModel = (doc: Document): CraTreeModel => {\n const nodeElementById = new Map<string, Element>();\n\n toTreeCandidates(doc).forEach((element) => {\n const nodeId = resolveNodeIdForCandidate(element);\n\n if (nodeElementById.has(nodeId)) {\n return;\n }\n\n nodeElementById.set(nodeId, element);\n });\n\n const nodesById = new Map<string, TreeNode>();\n\n nodeElementById.forEach((element, nodeId) => {\n const source = getNormalizedTreeNodeSourceFromElement(element);\n\n nodesById.set(nodeId, {\n id: nodeId,\n displayName: toDisplayName(element, nodeId),\n parentId: null,\n childrenIds: [],\n tags: [element.tagName.toLowerCase()],\n ...(source && { source }),\n });\n });\n\n nodeElementById.forEach((element, nodeId) => {\n const node = nodesById.get(nodeId);\n\n if (node === undefined) {\n return;\n }\n\n const parentInspectorElement = element.parentElement?.closest(\n `[${INSPECTOR_NODE_ID_ATTRIBUTE}]`,\n );\n const parentNodeId =\n parentInspectorElement == null\n ? undefined\n : getExplicitNodeIdFromElement(parentInspectorElement);\n\n if (\n parentNodeId === undefined ||\n parentNodeId === nodeId ||\n !nodesById.has(parentNodeId)\n ) {\n return;\n }\n\n node.parentId = parentNodeId;\n const parentNode = nodesById.get(parentNodeId);\n\n if (parentNode === undefined) {\n return;\n }\n\n parentNode.childrenIds.push(nodeId);\n });\n\n const nodes = Array.from(nodesById.values());\n const rootIds = nodes\n .filter((node) => node.parentId === null)\n .map((node) => node.id);\n\n return {\n snapshot: {\n nodes,\n rootIds,\n },\n nodeElementById,\n };\n};\n\nconst toTextPreview = (element: Element) => {\n const rawText = element.textContent?.replace(/\\s+/g, ' ').trim();\n\n if (rawText === undefined || rawText.length === 0) {\n return undefined;\n }\n\n if (rawText.length <= MAX_TEXT_PREVIEW_LENGTH) {\n return rawText;\n }\n\n return `${rawText.slice(0, MAX_TEXT_PREVIEW_LENGTH - 3)}...`;\n};\n\nconst toNodeProps = (nodeId: string, element: Element) => {\n const props: Record<string, unknown> = {\n nodeId,\n tagName: element.tagName.toLowerCase(),\n };\n const classList = Array.from(element.classList);\n const textPreview = toTextPreview(element);\n const role = element.getAttribute('role');\n const ariaLabel = element.getAttribute('aria-label');\n const hasExplicitNodeId = getExplicitNodeIdFromElement(element) !== undefined;\n\n if (element.id.length > 0) {\n props.elementId = element.id;\n }\n\n if (classList.length > 0) {\n props.classList = classList;\n }\n\n if (!hasExplicitNodeId) {\n props.runtimeMode = 'cra-like';\n props.introspection = 'fallback-root';\n\n if ((element.getAttribute('id') ?? '').trim() === CRA_ROOT_ID) {\n props.fallbackReason = 'root-container';\n } else if (element.hasAttribute(LEGACY_REACT_ROOT_ATTRIBUTE)) {\n props.fallbackReason = 'legacy-reactroot';\n }\n }\n\n if (role !== null && role.length > 0) {\n props.role = role;\n }\n\n if (ariaLabel !== null && ariaLabel.length > 0) {\n props.ariaLabel = ariaLabel;\n }\n\n if (textPreview !== undefined) {\n props.textPreview = textPreview;\n }\n\n if (element instanceof HTMLIFrameElement && element.src.length > 0) {\n props.src = element.src;\n }\n\n return props;\n};\n\nexport const createCraReactInspectorAdapter = (\n options: CreateCraReactInspectorAdapterOptions = {},\n): ReactInspectorAdapterContract => {\n const doc = options.doc ?? document;\n let latestTreeModel: CraTreeModel | undefined;\n\n const captureTreeModel = () => {\n latestTreeModel = buildTreeModel(doc);\n\n return latestTreeModel.snapshot;\n };\n\n const getLatestElementByNodeId = (nodeId: string) => {\n return latestTreeModel?.nodeElementById.get(nodeId);\n };\n\n return createBaseReactInspectorAdapter({\n getTreeSnapshot: captureTreeModel,\n getNodeProps: ({ node }) => {\n const element = getLatestElementByNodeId(node.id);\n\n if (element === undefined) {\n return undefined;\n }\n\n return toNodeProps(node.id, element);\n },\n getDomElement: ({ node }) => {\n return getLatestElementByNodeId(node.id) ?? null;\n },\n });\n};\n","import type { FiberNodeLookupPayload } from './nodeLookup';\n\ntype FiberLike = Record<string, unknown>;\n\nconst hostComponentTag = 5;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst toFiber = (value: unknown): FiberLike | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n};\n\nconst toFiberTag = (fiber: FiberLike): number | undefined => {\n const tag = readRecordValue(fiber, 'tag');\n\n if (typeof tag !== 'number' || !Number.isInteger(tag)) {\n return undefined;\n }\n\n return tag;\n};\n\nconst toElement = (value: unknown): Element | undefined => {\n if (typeof Element === 'undefined') {\n return undefined;\n }\n\n if (!(value instanceof Element)) {\n return undefined;\n }\n\n return value;\n};\n\nconst readHostFiberElement = (fiber: FiberLike): Element | undefined => {\n if (toFiberTag(fiber) !== hostComponentTag) {\n return undefined;\n }\n\n return toElement(readRecordValue(fiber, 'stateNode'));\n};\n\nconst readChildFiber = (fiber: FiberLike): FiberLike | undefined => {\n return toFiber(readRecordValue(fiber, 'child'));\n};\n\nconst readSiblingFiber = (fiber: FiberLike): FiberLike | undefined => {\n return toFiber(readRecordValue(fiber, 'sibling'));\n};\n\nconst findFirstHostDescendantElement = (\n entryFiber: FiberLike,\n): Element | undefined => {\n const firstChildFiber = readChildFiber(entryFiber);\n\n if (firstChildFiber === undefined) {\n return undefined;\n }\n\n const stack: FiberLike[] = [firstChildFiber];\n const visitedFibers = new Set<unknown>();\n\n while (stack.length > 0) {\n const currentFiber = stack.pop();\n\n if (currentFiber === undefined || visitedFibers.has(currentFiber)) {\n continue;\n }\n\n visitedFibers.add(currentFiber);\n\n const currentElement = readHostFiberElement(currentFiber);\n\n if (currentElement !== undefined) {\n return currentElement;\n }\n\n const siblingFiber = readSiblingFiber(currentFiber);\n\n if (siblingFiber !== undefined) {\n stack.push(siblingFiber);\n }\n\n const childFiber = readChildFiber(currentFiber);\n\n if (childFiber !== undefined) {\n stack.push(childFiber);\n }\n }\n\n return undefined;\n};\n\nexport const resolveFiberHighlightTarget = (\n lookupPayload: FiberNodeLookupPayload,\n): Element | null => {\n const fiber = toFiber(lookupPayload.fiber);\n\n if (fiber === undefined) {\n return null;\n }\n\n const directHostElement = readHostFiberElement(fiber);\n\n if (directHostElement !== undefined) {\n return directHostElement;\n }\n\n return findFirstHostDescendantElement(fiber) ?? null;\n};\n","import type { FiberTraversalRecord } from './traversal';\n\nconst FNV_32_OFFSET_BASIS = 2166136261;\nconst FNV_32_PRIME = 16777619;\nconst NODE_ID_PREFIX = 'fiber-node';\nconst COLLISION_SUFFIX_SEPARATOR = '~';\n\ntype FiberNodeIdentitySessionState = {\n nodeIdByFiberRef: WeakMap<object, string>;\n nodeIdByRecordKey: Map<string, string>;\n allocatedNodeIds: Set<string>;\n nextCollisionIndexByBaseId: Map<string, number>;\n};\n\nexport type FiberNodeIdentityResult = Readonly<{\n nodeIdByRecordKey: ReadonlyMap<string, string>;\n}>;\n\nexport type FiberNodeIdentityAllocator = Readonly<{\n allocateNodeIds: (\n records: FiberTraversalRecord[],\n ) => FiberNodeIdentityResult;\n}>;\n\nconst createSessionState = (): FiberNodeIdentitySessionState => {\n return {\n nodeIdByFiberRef: new WeakMap<object, string>(),\n nodeIdByRecordKey: new Map<string, string>(),\n allocatedNodeIds: new Set<string>(),\n nextCollisionIndexByBaseId: new Map<string, number>(),\n };\n};\n\nconst toFiberRef = (fiber: unknown): object | undefined => {\n if (typeof fiber !== 'object' || fiber === null) {\n return undefined;\n }\n\n return fiber;\n};\n\nconst readFiberRefValue = (fiberRef: object, key: string) => {\n try {\n return (fiberRef as Record<string, unknown>)[key];\n } catch {\n return undefined;\n }\n};\n\nconst toAlternateFiberRef = (fiberRef: object): object | undefined => {\n return toFiberRef(readFiberRefValue(fiberRef, 'alternate'));\n};\n\nconst toStableHash = (value: string) => {\n let hash = FNV_32_OFFSET_BASIS;\n\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, FNV_32_PRIME);\n }\n\n return (hash >>> 0).toString(36);\n};\n\nexport const toFiberNodeIdentitySignature = (\n record: FiberTraversalRecord,\n) => {\n // The signature uses deterministic traversal context only.\n return {\n rendererId: record.rendererId,\n rendererRootIndex: record.rendererRootIndex,\n parentKey: record.parentKey ?? 'root',\n tag: record.tag,\n } as const;\n};\n\nconst toBaseNodeId = (record: FiberTraversalRecord) => {\n const signature = toFiberNodeIdentitySignature(record);\n const parentHash = toStableHash(signature.parentKey);\n\n return `${NODE_ID_PREFIX}-r${signature.rendererId}-root${signature.rendererRootIndex}-p${parentHash}-t${signature.tag}`;\n};\n\nconst toUniqueNodeId = (\n state: FiberNodeIdentitySessionState,\n baseNodeId: string,\n) => {\n const nextCollisionIndex =\n state.nextCollisionIndexByBaseId.get(baseNodeId) ?? 1;\n let collisionIndex = nextCollisionIndex;\n let candidateNodeId =\n collisionIndex === 1\n ? baseNodeId\n : `${baseNodeId}${COLLISION_SUFFIX_SEPARATOR}${collisionIndex}`;\n\n while (state.allocatedNodeIds.has(candidateNodeId)) {\n collisionIndex += 1;\n candidateNodeId =\n collisionIndex === 1\n ? baseNodeId\n : `${baseNodeId}${COLLISION_SUFFIX_SEPARATOR}${collisionIndex}`;\n }\n\n state.nextCollisionIndexByBaseId.set(baseNodeId, collisionIndex + 1);\n state.allocatedNodeIds.add(candidateNodeId);\n\n return candidateNodeId;\n};\n\nconst storeNodeIdMapping = (\n state: FiberNodeIdentitySessionState,\n record: FiberTraversalRecord,\n nodeId: string,\n) => {\n const fiberRef = toFiberRef(record.fiber);\n\n if (fiberRef !== undefined) {\n state.nodeIdByFiberRef.set(fiberRef, nodeId);\n const alternateFiberRef = toAlternateFiberRef(fiberRef);\n\n if (alternateFiberRef !== undefined) {\n state.nodeIdByFiberRef.set(alternateFiberRef, nodeId);\n }\n }\n\n state.nodeIdByRecordKey.set(record.key, nodeId);\n};\n\nconst resolveNodeIdByFiberFamily = (\n state: FiberNodeIdentitySessionState,\n fiber: unknown,\n) => {\n const fiberRef = toFiberRef(fiber);\n\n if (fiberRef === undefined) {\n return undefined;\n }\n\n const nodeIdFromFiberRef = state.nodeIdByFiberRef.get(fiberRef);\n\n if (nodeIdFromFiberRef !== undefined) {\n return nodeIdFromFiberRef;\n }\n\n const alternateFiberRef = toAlternateFiberRef(fiberRef);\n\n if (alternateFiberRef === undefined) {\n return undefined;\n }\n\n return state.nodeIdByFiberRef.get(alternateFiberRef);\n};\n\nexport const createFiberNodeIdentityAllocator = (): FiberNodeIdentityAllocator => {\n const state = createSessionState();\n\n return {\n allocateNodeIds: (records: FiberTraversalRecord[]) => {\n const nodeIdByRecordKey = new Map<string, string>();\n const allocatedNodeIdsInSnapshot = new Set<string>();\n const nodeIdsReservedForExistingFiberRefs = new Set<string>();\n\n records.forEach((record) => {\n const nodeIdFromFiberFamily = resolveNodeIdByFiberFamily(\n state,\n record.fiber,\n );\n\n if (nodeIdFromFiberFamily === undefined) {\n return;\n }\n\n nodeIdsReservedForExistingFiberRefs.add(nodeIdFromFiberFamily);\n });\n\n const tryAssignNodeId = (nodeId: string | undefined) => {\n if (nodeId === undefined || allocatedNodeIdsInSnapshot.has(nodeId)) {\n return undefined;\n }\n\n allocatedNodeIdsInSnapshot.add(nodeId);\n state.allocatedNodeIds.add(nodeId);\n\n return nodeId;\n };\n\n records.forEach((record) => {\n const nodeIdFromFiberFamily = resolveNodeIdByFiberFamily(\n state,\n record.fiber,\n );\n const assignedNodeIdFromFiberFamily = tryAssignNodeId(\n nodeIdFromFiberFamily,\n );\n\n if (assignedNodeIdFromFiberFamily !== undefined) {\n nodeIdByRecordKey.set(record.key, assignedNodeIdFromFiberFamily);\n storeNodeIdMapping(state, record, assignedNodeIdFromFiberFamily);\n return;\n }\n\n const nodeIdFromRecordKey = state.nodeIdByRecordKey.get(record.key);\n const shouldSkipRecordKeyNodeId =\n nodeIdFromRecordKey !== undefined &&\n nodeIdsReservedForExistingFiberRefs.has(nodeIdFromRecordKey);\n const assignedNodeIdFromRecordKey = shouldSkipRecordKeyNodeId\n ? undefined\n : tryAssignNodeId(nodeIdFromRecordKey);\n\n if (assignedNodeIdFromRecordKey !== undefined) {\n nodeIdByRecordKey.set(record.key, assignedNodeIdFromRecordKey);\n storeNodeIdMapping(state, record, assignedNodeIdFromRecordKey);\n return;\n }\n\n const baseNodeId = toBaseNodeId(record);\n const nodeId = toUniqueNodeId(state, baseNodeId);\n\n allocatedNodeIdsInSnapshot.add(nodeId);\n nodeIdByRecordKey.set(record.key, nodeId);\n storeNodeIdMapping(state, record, nodeId);\n });\n\n return {\n nodeIdByRecordKey,\n };\n },\n };\n};\n","import type { ReactTreeSnapshot } from '../base/baseAdapter';\nimport type { FiberTraversalRecord, FiberTraversalResult } from './traversal';\n\nexport type FiberNodeLookupPayload = Readonly<{\n nodeId: string;\n recordKey: string;\n fiber: unknown;\n tag: number;\n rendererId: number;\n rendererRootIndex: number;\n path: string;\n parentNodeId: string | null;\n childNodeIds: string[];\n}>;\n\nexport type FiberNodeLookup = Readonly<{\n refreshFromSnapshot: (options: {\n traversalResult: FiberTraversalResult;\n nodeIdByRecordKey: ReadonlyMap<string, string>;\n snapshot: ReactTreeSnapshot;\n }) => void;\n resolveByNodeId: (nodeId: string) => FiberNodeLookupPayload | undefined;\n resolveClosestComponentPathForElement: (\n element: Element,\n ) => ReadonlyArray<string> | undefined;\n}>;\n\ntype FiberLike = Record<string, unknown>;\ntype ReactManagedElement = Element & Record<string, unknown>;\n\nconst REACT_FIBER_POINTER_PREFIXES = [\n '__reactFiber$',\n '__reactInternalInstance$',\n] as const;\n\nconst toChildNodeIds = (\n childKeys: string[],\n nodeIdByRecordKey: ReadonlyMap<string, string>,\n includedNodeIdSet: ReadonlySet<string>,\n) => {\n const childNodeIds: string[] = [];\n const seenChildNodeIds = new Set<string>();\n\n childKeys.forEach((childKey) => {\n const childNodeId = nodeIdByRecordKey.get(childKey);\n\n if (\n childNodeId === undefined ||\n !includedNodeIdSet.has(childNodeId) ||\n seenChildNodeIds.has(childNodeId)\n ) {\n return;\n }\n\n seenChildNodeIds.add(childNodeId);\n childNodeIds.push(childNodeId);\n });\n\n return childNodeIds;\n};\n\nconst toParentNodeId = (\n record: FiberTraversalRecord,\n nodeIdByRecordKey: ReadonlyMap<string, string>,\n includedNodeIdSet: ReadonlySet<string>,\n) => {\n if (record.parentKey === null) {\n return null;\n }\n\n const parentNodeId = nodeIdByRecordKey.get(record.parentKey);\n\n if (parentNodeId === undefined || !includedNodeIdSet.has(parentNodeId)) {\n return null;\n }\n\n return parentNodeId;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst toFiber = (value: unknown): FiberLike | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n};\n\nconst readAlternateFiber = (fiber: FiberLike): FiberLike | undefined => {\n return toFiber(readRecordValue(fiber, 'alternate'));\n};\n\nconst readReturnFiber = (fiber: FiberLike): FiberLike | undefined => {\n return toFiber(readRecordValue(fiber, 'return'));\n};\n\nconst readFiberFromManagedElement = (\n element: ReactManagedElement,\n): FiberLike | undefined => {\n for (const key of Reflect.ownKeys(element)) {\n if (\n typeof key !== 'string' ||\n !REACT_FIBER_POINTER_PREFIXES.some((prefix) => key.startsWith(prefix))\n ) {\n continue;\n }\n\n const fiber = toFiber(element[key]);\n\n if (fiber !== undefined) {\n return fiber;\n }\n }\n\n return undefined;\n};\n\nconst resolveFiberFromElement = (element: Element) => {\n let current: Element | null = element;\n\n while (current !== null) {\n const fiber = readFiberFromManagedElement(current as ReactManagedElement);\n\n if (fiber !== undefined) {\n return fiber;\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n};\n\nconst buildComponentPath = (\n nodeId: string,\n nodeById: ReadonlyMap<string, ReactTreeSnapshot['nodes'][number]>,\n) => {\n const componentPath: string[] = [];\n const visitedNodeIds = new Set<string>();\n let currentNodeId: string | null = nodeId;\n\n while (currentNodeId !== null && !visitedNodeIds.has(currentNodeId)) {\n visitedNodeIds.add(currentNodeId);\n\n const currentNode = nodeById.get(currentNodeId);\n\n if (currentNode === undefined) {\n break;\n }\n\n componentPath.unshift(currentNode.displayName);\n currentNodeId = currentNode.parentId;\n }\n\n return componentPath.length > 0 ? componentPath : undefined;\n};\n\nexport const createFiberNodeLookup = (): FiberNodeLookup => {\n let payloadByNodeId = new Map<string, FiberNodeLookupPayload>();\n let nodeIdByFiberRef = new WeakMap<object, string>();\n let nodeById = new Map<string, ReactTreeSnapshot['nodes'][number]>();\n\n return {\n refreshFromSnapshot: (options) => {\n const nextPayloadByNodeId = new Map<string, FiberNodeLookupPayload>();\n const nextNodeIdByFiberRef = new WeakMap<object, string>();\n const nextNodeById = new Map(\n options.snapshot.nodes.map((node) => [node.id, node]),\n );\n const includedNodeIdSet = new Set(\n options.snapshot.nodes.map((node) => node.id),\n );\n\n options.traversalResult.records.forEach((record) => {\n const nodeId = options.nodeIdByRecordKey.get(record.key);\n\n if (\n nodeId === undefined ||\n !includedNodeIdSet.has(nodeId) ||\n nextPayloadByNodeId.has(nodeId)\n ) {\n return;\n }\n\n nextPayloadByNodeId.set(nodeId, {\n nodeId,\n recordKey: record.key,\n fiber: record.fiber,\n tag: record.tag,\n rendererId: record.rendererId,\n rendererRootIndex: record.rendererRootIndex,\n path: record.path,\n parentNodeId: toParentNodeId(\n record,\n options.nodeIdByRecordKey,\n includedNodeIdSet,\n ),\n childNodeIds: toChildNodeIds(\n record.childKeys,\n options.nodeIdByRecordKey,\n includedNodeIdSet,\n ),\n });\n\n const fiber = toFiber(record.fiber);\n\n if (fiber !== undefined) {\n nextNodeIdByFiberRef.set(fiber, nodeId);\n\n const alternateFiber = readAlternateFiber(fiber);\n\n if (alternateFiber !== undefined) {\n nextNodeIdByFiberRef.set(alternateFiber, nodeId);\n }\n }\n });\n\n payloadByNodeId = nextPayloadByNodeId;\n nodeIdByFiberRef = nextNodeIdByFiberRef;\n nodeById = nextNodeById;\n },\n resolveByNodeId: (nodeId: string) => {\n return payloadByNodeId.get(nodeId);\n },\n resolveClosestComponentPathForElement: (element: Element) => {\n const entryFiber = resolveFiberFromElement(element);\n\n if (entryFiber === undefined) {\n return undefined;\n }\n\n const visitedFibers = new Set<unknown>();\n let currentFiber: FiberLike | undefined = entryFiber;\n\n while (currentFiber !== undefined && !visitedFibers.has(currentFiber)) {\n visitedFibers.add(currentFiber);\n\n const nodeId = nodeIdByFiberRef.get(currentFiber);\n\n if (nodeId !== undefined) {\n return buildComponentPath(nodeId, nodeById);\n }\n\n currentFiber = readReturnFiber(currentFiber);\n }\n\n return undefined;\n },\n };\n};\n","import type { FiberNodeLookupPayload } from './nodeLookup';\n\ntype FiberLike = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst toFiber = (value: unknown): FiberLike | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n};\n\nexport const readFiberNodeProps = (\n lookupPayload: FiberNodeLookupPayload,\n): unknown | undefined => {\n const fiber = toFiber(lookupPayload.fiber);\n\n if (fiber === undefined) {\n return undefined;\n }\n\n const memoizedProps = readRecordValue(fiber, 'memoizedProps');\n\n if (memoizedProps === undefined) {\n return undefined;\n }\n\n return memoizedProps;\n};\n","import type {\n FiberRootRef,\n RendererRef,\n RootDiscoveryResult,\n RootDiscoveryWindow,\n} from './types';\n\ntype DevtoolsHookRecord = Record<string, unknown> & {\n renderers?: unknown;\n getFiberRoots?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst hasObjectTag = (value: unknown, tagName: string) => {\n return Object.prototype.toString.call(value) === `[object ${tagName}]`;\n};\n\nconst isReadonlyMap = (value: unknown): value is ReadonlyMap<unknown, unknown> => {\n if (!hasObjectTag(value, 'Map')) {\n return false;\n }\n\n if (!isRecord(value)) {\n return false;\n }\n\n return typeof value.forEach === 'function' && typeof value.entries === 'function';\n};\n\nconst isReadonlyArray = (value: unknown): value is ReadonlyArray<unknown> => {\n return Array.isArray(value);\n};\n\nconst isReadonlySet = (value: unknown): value is ReadonlySet<unknown> => {\n if (!hasObjectTag(value, 'Set')) {\n return false;\n }\n\n if (!isRecord(value)) {\n return false;\n }\n\n return typeof value.forEach === 'function' && typeof value.values === 'function';\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return (\n value !== null &&\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst readPlainObjectValues = (record: Record<string, unknown>) => {\n try {\n return Object.keys(record).flatMap((key) => {\n const value = readRecordValue(record, key);\n\n return value === undefined ? [] : [value];\n });\n } catch {\n return [];\n }\n};\n\nconst readPlainObjectEntries = (record: Record<string, unknown>) => {\n try {\n return Object.keys(record).flatMap((key) => {\n const value = readRecordValue(record, key);\n\n return value === undefined ? [] : [[key, value] as const];\n });\n } catch {\n return [];\n }\n};\n\nconst resolveWindowRef = (windowRef?: RootDiscoveryWindow) => {\n if (windowRef !== undefined) {\n return windowRef;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n return window as unknown as RootDiscoveryWindow;\n};\n\nconst readDevtoolsHook = (windowRef?: RootDiscoveryWindow) => {\n return resolveWindowRef(windowRef)?.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n};\n\nconst toRendererId = (value: unknown) => {\n if (typeof value === 'number') {\n return Number.isInteger(value) ? value : undefined;\n }\n\n if (typeof value !== 'string' || value.trim().length === 0) {\n return undefined;\n }\n\n const parsedRendererId = Number(value);\n\n if (!Number.isInteger(parsedRendererId)) {\n return undefined;\n }\n\n return parsedRendererId;\n};\n\nconst toRendererEntries = (\n value: unknown,\n): ReadonlyArray<readonly [number, unknown]> => {\n if (isReadonlyMap(value)) {\n return Array.from(value.entries()).flatMap(\n ([rendererIdCandidate, renderer]) => {\n const rendererId = toRendererId(rendererIdCandidate);\n\n if (rendererId === undefined) {\n return [];\n }\n\n return [[rendererId, renderer]];\n },\n );\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n return readPlainObjectEntries(value).flatMap(([rendererIdCandidate, renderer]) => {\n const rendererId = toRendererId(rendererIdCandidate);\n\n if (rendererId === undefined) {\n return [];\n }\n\n return [[rendererId, renderer]];\n });\n};\n\nconst toRendererRefs = (renderers: unknown) => {\n const rendererRefs: RendererRef[] = [];\n\n toRendererEntries(renderers).forEach(([rendererId, renderer]) => {\n rendererRefs.push({\n rendererId,\n renderer,\n });\n });\n\n return rendererRefs.sort((leftRenderer, rightRenderer) => {\n return leftRenderer.rendererId - rightRenderer.rendererId;\n });\n};\n\nconst isRootSet = (value: unknown): value is ReadonlySet<unknown> => {\n return isReadonlySet(value);\n};\n\nconst toRoots = (value: unknown): ReadonlyArray<unknown> | undefined => {\n if (isRootSet(value)) {\n return Array.from(value);\n }\n\n if (isReadonlyArray(value)) {\n return value;\n }\n\n if (isPlainObject(value)) {\n return readPlainObjectValues(value);\n }\n\n return undefined;\n};\n\nexport const discoverFiberRoots = (\n windowRef?: RootDiscoveryWindow,\n): RootDiscoveryResult => {\n try {\n const hookValue = readDevtoolsHook(windowRef);\n\n if (hookValue === undefined) {\n return {\n status: 'unsupported',\n reason: 'hook-missing',\n };\n }\n\n if (!isRecord(hookValue)) {\n return {\n status: 'unsupported',\n reason: 'hook-malformed',\n };\n }\n\n const hookRecord = hookValue as DevtoolsHookRecord;\n\n if (hookRecord.renderers === undefined) {\n return {\n status: 'unsupported',\n reason: 'renderers-malformed',\n };\n }\n\n const rendererRefs = toRendererRefs(hookRecord.renderers);\n\n if (rendererRefs.length === 0) {\n return {\n status: 'empty',\n reason: 'renderer-empty',\n renderers: [],\n };\n }\n\n if (typeof hookRecord.getFiberRoots !== 'function') {\n return {\n status: 'unsupported',\n reason: 'fiber-roots-reader-missing',\n };\n }\n\n const fiberRootsReader = hookRecord.getFiberRoots as (\n rendererId: number,\n ) => unknown;\n const roots: FiberRootRef[] = [];\n\n for (const rendererRef of rendererRefs) {\n try {\n const rootsValue = fiberRootsReader.call(\n hookRecord,\n rendererRef.rendererId,\n );\n\n const rootsFromRenderer = toRoots(rootsValue);\n\n if (rootsFromRenderer === undefined) {\n return {\n status: 'unsupported',\n reason: 'fiber-roots-malformed',\n };\n }\n\n rootsFromRenderer.forEach((root) => {\n roots.push({\n rendererId: rendererRef.rendererId,\n root,\n });\n });\n } catch (error: unknown) {\n return {\n status: 'error',\n reason: 'fiber-roots-read-failed',\n rendererId: rendererRef.rendererId,\n details: error,\n };\n }\n }\n\n if (roots.length === 0) {\n return {\n status: 'empty',\n reason: 'root-empty',\n renderers: rendererRefs,\n };\n }\n\n return {\n status: 'ok',\n renderers: rendererRefs,\n roots,\n };\n } catch (error: unknown) {\n return {\n status: 'error',\n reason: 'probe-failed',\n details: error,\n };\n }\n};\n","import type { TreeNodeSource } from '@iteraai/inspector-protocol';\n\ntype FiberLike = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst toFiber = (value: unknown): FiberLike | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n};\n\nconst toDebugSource = (fiber: FiberLike) => {\n const debugSource = readRecordValue(fiber, '_debugSource');\n\n if (!isRecord(debugSource)) {\n return undefined;\n }\n\n return debugSource;\n};\n\nconst toNormalizedFile = (value: unknown) => {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (trimmedValue.length === 0) {\n return undefined;\n }\n\n return trimmedValue;\n};\n\nconst toNormalizedPositiveInteger = (value: unknown) => {\n if (typeof value === 'number') {\n return Number.isInteger(value) && value >= 1 ? value : undefined;\n }\n\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!/^\\d+$/.test(trimmedValue)) {\n return undefined;\n }\n\n const parsedValue = Number(trimmedValue);\n\n return Number.isInteger(parsedValue) && parsedValue >= 1\n ? parsedValue\n : undefined;\n};\n\nconst toBestEffortFile = (debugSource: Record<string, unknown>) => {\n return (\n toNormalizedFile(readRecordValue(debugSource, 'fileName')) ??\n toNormalizedFile(readRecordValue(debugSource, 'file'))\n );\n};\n\nconst toBestEffortLine = (debugSource: Record<string, unknown>) => {\n return (\n toNormalizedPositiveInteger(readRecordValue(debugSource, 'lineNumber')) ??\n toNormalizedPositiveInteger(readRecordValue(debugSource, 'line'))\n );\n};\n\nconst toBestEffortColumn = (debugSource: Record<string, unknown>) => {\n return (\n toNormalizedPositiveInteger(readRecordValue(debugSource, 'columnNumber')) ??\n toNormalizedPositiveInteger(readRecordValue(debugSource, 'column'))\n );\n};\n\nexport const readFiberNodeSource = (\n fiberValue: unknown,\n): TreeNodeSource | undefined => {\n const fiber = toFiber(fiberValue);\n\n if (fiber === undefined) {\n return undefined;\n }\n\n const debugSource = toDebugSource(fiber);\n\n if (debugSource === undefined) {\n return undefined;\n }\n\n const file = toBestEffortFile(debugSource);\n const line = toBestEffortLine(debugSource);\n\n if (file === undefined || line === undefined) {\n return undefined;\n }\n\n const column = toBestEffortColumn(debugSource);\n\n return column === undefined\n ? {\n file,\n line,\n }\n : {\n file,\n line,\n column,\n };\n};\n","import type { TreeNode } from '@iteraai/inspector-protocol';\nimport type { ReactTreeSnapshot } from '../base/baseAdapter';\nimport { readFiberNodeSource } from './source';\nimport type { FiberTraversalRecord, FiberTraversalResult } from './traversal';\n\nconst REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nconst REACT_MEMO_TYPE = Symbol.for('react.memo');\n\nconst FIBER_NODE_TAG = 'fiber';\n\ntype FiberLike = Record<string, unknown> & {\n type?: unknown;\n};\n\ntype FiberTypeLike = Record<string, unknown> & {\n $$typeof?: unknown;\n displayName?: unknown;\n name?: unknown;\n render?: unknown;\n type?: unknown;\n};\n\ntype FiberTreeMappingOptions = Readonly<{\n traversalResult: FiberTraversalResult;\n nodeIdByRecordKey: ReadonlyMap<string, string>;\n}>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst toNonEmptyString = (value: unknown) => {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const normalized = value.trim();\n\n if (normalized.length === 0) {\n return undefined;\n }\n\n return normalized;\n};\n\nconst toFunctionDisplayName = (value: unknown) => {\n if (typeof value !== 'function') {\n return undefined;\n }\n\n const functionRecord = value as unknown as Record<string, unknown>;\n\n return (\n toNonEmptyString(readRecordValue(functionRecord, 'displayName')) ??\n toNonEmptyString(readRecordValue(functionRecord, 'name'))\n );\n};\n\nconst resolveDisplayNameFromType = (\n typeValue: unknown,\n seenTypeValues: Set<unknown>,\n): string | undefined => {\n if (typeValue === undefined || typeValue === null) {\n return undefined;\n }\n\n if (typeof typeValue === 'string') {\n return toNonEmptyString(typeValue);\n }\n\n const functionDisplayName = toFunctionDisplayName(typeValue);\n\n if (functionDisplayName !== undefined) {\n return functionDisplayName;\n }\n\n if (!isRecord(typeValue)) {\n return undefined;\n }\n\n if (seenTypeValues.has(typeValue)) {\n return undefined;\n }\n\n seenTypeValues.add(typeValue);\n\n const fiberType = typeValue as FiberTypeLike;\n const explicitDisplayName = toNonEmptyString(\n readRecordValue(fiberType, 'displayName'),\n );\n const fiberTypeKind = readRecordValue(fiberType, '$$typeof');\n\n if (explicitDisplayName !== undefined) {\n return explicitDisplayName;\n }\n\n if (fiberTypeKind === REACT_FORWARD_REF_TYPE) {\n const renderDisplayName = toFunctionDisplayName(\n readRecordValue(fiberType, 'render'),\n );\n\n if (renderDisplayName !== undefined) {\n return `ForwardRef(${renderDisplayName})`;\n }\n\n return 'ForwardRef';\n }\n\n if (fiberTypeKind === REACT_MEMO_TYPE) {\n const wrappedDisplayName = resolveDisplayNameFromType(\n readRecordValue(fiberType, 'type'),\n seenTypeValues,\n );\n\n if (wrappedDisplayName !== undefined) {\n return `Memo(${wrappedDisplayName})`;\n }\n\n return 'Memo';\n }\n\n return toNonEmptyString(readRecordValue(fiberType, 'name'));\n};\n\nconst resolveFiberDisplayName = (fiber: unknown) => {\n if (!isRecord(fiber)) {\n return 'Anonymous';\n }\n\n const fiberLike = fiber as FiberLike;\n const displayName = resolveDisplayNameFromType(\n readRecordValue(fiberLike, 'type'),\n new Set(),\n );\n\n if (displayName !== undefined) {\n return displayName;\n }\n\n return 'Anonymous';\n};\n\nconst toFiberKindTag = (fiberTag: number) => {\n switch (fiberTag) {\n case 0:\n return 'fiber-kind:function';\n case 1:\n return 'fiber-kind:class';\n case 2:\n return 'fiber-kind:indeterminate';\n case 11:\n return 'fiber-kind:forward-ref';\n case 14:\n return 'fiber-kind:memo';\n case 15:\n return 'fiber-kind:simple-memo';\n default:\n return 'fiber-kind:unknown';\n }\n};\n\nconst toFiberTags = (record: FiberTraversalRecord) => {\n return [\n FIBER_NODE_TAG,\n toFiberKindTag(record.tag),\n `fiber-tag:${record.tag}`,\n ];\n};\n\nconst toIncludedRecords = (options: FiberTreeMappingOptions) => {\n const includedRecords: FiberTraversalRecord[] = [];\n const includedRecordByKey = new Map<string, FiberTraversalRecord>();\n const includedNodeIdByRecordKey = new Map<string, string>();\n const seenNodeIds = new Set<string>();\n\n options.traversalResult.records.forEach((record) => {\n const nodeId = options.nodeIdByRecordKey.get(record.key);\n\n if (\n nodeId === undefined ||\n includedRecordByKey.has(record.key) ||\n seenNodeIds.has(nodeId)\n ) {\n return;\n }\n\n includedRecords.push(record);\n includedRecordByKey.set(record.key, record);\n includedNodeIdByRecordKey.set(record.key, nodeId);\n seenNodeIds.add(nodeId);\n });\n\n return {\n includedRecords,\n includedRecordByKey,\n includedNodeIdByRecordKey,\n };\n};\n\nconst toParentRecordKeyByRecordKey = (\n includedRecords: FiberTraversalRecord[],\n includedRecordByKey: ReadonlyMap<string, FiberTraversalRecord>,\n) => {\n const parentRecordKeyByRecordKey = new Map<string, string | null>();\n\n includedRecords.forEach((record) => {\n const parentKey = record.parentKey;\n\n if (parentKey === null || !includedRecordByKey.has(parentKey)) {\n parentRecordKeyByRecordKey.set(record.key, null);\n return;\n }\n\n parentRecordKeyByRecordKey.set(record.key, parentKey);\n });\n\n return parentRecordKeyByRecordKey;\n};\n\nconst toChildRecordKeysByParentKey = (\n includedRecords: FiberTraversalRecord[],\n includedRecordByKey: ReadonlyMap<string, FiberTraversalRecord>,\n parentRecordKeyByRecordKey: ReadonlyMap<string, string | null>,\n) => {\n const childRecordKeysByParentKey = new Map<string, string[]>();\n\n const appendChildRecordKey = (parentKey: string, childKey: string) => {\n const existingChildren = childRecordKeysByParentKey.get(parentKey);\n\n if (existingChildren === undefined) {\n childRecordKeysByParentKey.set(parentKey, [childKey]);\n return;\n }\n\n if (!existingChildren.includes(childKey)) {\n existingChildren.push(childKey);\n }\n };\n\n includedRecords.forEach((record) => {\n record.childKeys.forEach((childKey) => {\n if (\n !includedRecordByKey.has(childKey) ||\n parentRecordKeyByRecordKey.get(childKey) !== record.key\n ) {\n return;\n }\n\n appendChildRecordKey(record.key, childKey);\n });\n });\n\n includedRecords.forEach((record) => {\n const parentKey = parentRecordKeyByRecordKey.get(record.key);\n\n if (parentKey === undefined || parentKey === null) {\n return;\n }\n\n appendChildRecordKey(parentKey, record.key);\n });\n\n return childRecordKeysByParentKey;\n};\n\nconst toNodes = (\n includedRecords: FiberTraversalRecord[],\n includedNodeIdByRecordKey: ReadonlyMap<string, string>,\n parentRecordKeyByRecordKey: ReadonlyMap<string, string | null>,\n childRecordKeysByParentKey: ReadonlyMap<string, string[]>,\n) => {\n return includedRecords.map((record): TreeNode => {\n const nodeId = includedNodeIdByRecordKey.get(record.key) as string;\n const parentKey = parentRecordKeyByRecordKey.get(record.key);\n const parentId =\n parentKey === undefined || parentKey === null\n ? null\n : (includedNodeIdByRecordKey.get(parentKey) ?? null);\n const childrenIds =\n childRecordKeysByParentKey.get(record.key)?.flatMap((childKey) => {\n const childId = includedNodeIdByRecordKey.get(childKey);\n\n return childId === undefined ? [] : [childId];\n }) ?? [];\n const source = readFiberNodeSource(record.fiber);\n\n return {\n id: nodeId,\n displayName: resolveFiberDisplayName(record.fiber),\n parentId,\n childrenIds,\n ...(source !== undefined && {\n source,\n }),\n tags: toFiberTags(record),\n };\n });\n};\n\nconst toRootIds = (\n traversalResult: FiberTraversalResult,\n includedRecords: FiberTraversalRecord[],\n includedNodeIdByRecordKey: ReadonlyMap<string, string>,\n parentRecordKeyByRecordKey: ReadonlyMap<string, string | null>,\n) => {\n const rootIds: string[] = [];\n const seenRootIds = new Set<string>();\n\n const appendRootId = (recordKey: string) => {\n const nodeId = includedNodeIdByRecordKey.get(recordKey);\n\n if (\n nodeId === undefined ||\n seenRootIds.has(nodeId) ||\n parentRecordKeyByRecordKey.get(recordKey) !== null\n ) {\n return;\n }\n\n seenRootIds.add(nodeId);\n rootIds.push(nodeId);\n };\n\n traversalResult.rootRecordKeys.forEach((rootRecordKey) => {\n appendRootId(rootRecordKey);\n });\n\n includedRecords.forEach((record) => {\n appendRootId(record.key);\n });\n\n return rootIds;\n};\n\nconst toTraversalMeta = (\n traversalResult: FiberTraversalResult,\n includedNodeCount: number,\n) => {\n if (traversalResult.meta?.truncated !== true) {\n return undefined;\n }\n\n return {\n truncated: true,\n includedNodeCount,\n };\n};\n\nexport const mapFiberTraversalToTreeSnapshot = (\n options: FiberTreeMappingOptions,\n): ReactTreeSnapshot => {\n const { includedRecords, includedRecordByKey, includedNodeIdByRecordKey } =\n toIncludedRecords(options);\n const parentRecordKeyByRecordKey = toParentRecordKeyByRecordKey(\n includedRecords,\n includedRecordByKey,\n );\n const childRecordKeysByParentKey = toChildRecordKeysByParentKey(\n includedRecords,\n includedRecordByKey,\n parentRecordKeyByRecordKey,\n );\n\n const nodes = toNodes(\n includedRecords,\n includedNodeIdByRecordKey,\n parentRecordKeyByRecordKey,\n childRecordKeysByParentKey,\n );\n const rootIds = toRootIds(\n options.traversalResult,\n includedRecords,\n includedNodeIdByRecordKey,\n parentRecordKeyByRecordKey,\n );\n const meta = toTraversalMeta(options.traversalResult, nodes.length);\n\n return {\n nodes,\n rootIds,\n ...(meta !== undefined && {\n meta,\n }),\n };\n};\n","import type { FiberRootRef, RootDiscoveryResult } from './types';\n\nconst componentFiberTagSet = new Set<number>([0, 1, 2, 11, 14, 15]);\n\ntype FiberLike = Record<string, unknown>;\n\nconst MAX_ROOT_DISCOVERY_DEPTH = 8;\n\nconst ROOT_WRAPPER_KEYS = [\n '_internalRoot',\n 'childRoot',\n 'containerInfo',\n 'current',\n 'root',\n 'rootNode',\n 'stateNode',\n];\n\ntype TraversalStackEntry = Readonly<{\n fiber: FiberLike;\n rendererId: number;\n rendererRootIndex: number;\n path: string;\n parentRecordKey: string | null;\n}>;\n\nexport type FiberTraversalBudget = Readonly<{\n maxRecords: number;\n maxTraversalSteps: number;\n}>;\n\nexport type FiberTraversalExhaustedBy = 'record-limit' | 'step-limit';\n\nexport type FiberTraversalMeta = Readonly<{\n truncated: boolean;\n exhaustedBy: FiberTraversalExhaustedBy | null;\n includedRecordCount: number;\n traversalStepCount: number;\n budget: FiberTraversalBudget;\n}>;\n\nexport type FiberTraversalRecord = Readonly<{\n key: string;\n rendererId: number;\n rendererRootIndex: number;\n path: string;\n tag: number;\n fiber: unknown;\n parentKey: string | null;\n childKeys: string[];\n}>;\n\nexport type FiberTraversalResult = Readonly<{\n records: FiberTraversalRecord[];\n rootRecordKeys: string[];\n meta?: FiberTraversalMeta;\n}>;\n\nexport const DEFAULT_FIBER_TRAVERSAL_BUDGET: FiberTraversalBudget = {\n maxRecords: 2_000,\n maxTraversalSteps: 20_000,\n};\n\nconst toNonNegativeInteger = (value: number, fallback: number) => {\n if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n return fallback;\n }\n\n return value;\n};\n\nconst resolveTraversalBudget = (\n budget: Partial<FiberTraversalBudget> | undefined,\n): FiberTraversalBudget => {\n return {\n maxRecords: toNonNegativeInteger(\n budget?.maxRecords ?? DEFAULT_FIBER_TRAVERSAL_BUDGET.maxRecords,\n DEFAULT_FIBER_TRAVERSAL_BUDGET.maxRecords,\n ),\n maxTraversalSteps: toNonNegativeInteger(\n budget?.maxTraversalSteps ?? DEFAULT_FIBER_TRAVERSAL_BUDGET.maxTraversalSteps,\n DEFAULT_FIBER_TRAVERSAL_BUDGET.maxTraversalSteps,\n ),\n };\n};\n\nconst toTraversalMeta = (\n records: FiberTraversalRecord[],\n traversalStepCount: number,\n budget: FiberTraversalBudget,\n exhaustedBy: FiberTraversalExhaustedBy | null,\n): FiberTraversalMeta => {\n return {\n truncated: exhaustedBy !== null,\n exhaustedBy,\n includedRecordCount: records.length,\n traversalStepCount,\n budget,\n };\n};\n\nconst createEmptyTraversalResult = (\n budget: FiberTraversalBudget = DEFAULT_FIBER_TRAVERSAL_BUDGET,\n): FiberTraversalResult => {\n return {\n records: [],\n rootRecordKeys: [],\n meta: toTraversalMeta([], 0, budget, null),\n };\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst toFiber = (value: unknown): FiberLike | undefined => {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n};\n\nconst readRecordValue = (record: Record<string, unknown>, key: string) => {\n try {\n return record[key];\n } catch {\n return undefined;\n }\n};\n\nconst readRecordValues = (record: Record<string, unknown>) => {\n try {\n return Object.keys(record).flatMap((key) => {\n const value = readRecordValue(record, key);\n\n return value === undefined ? [] : [value];\n });\n } catch {\n return [];\n }\n};\n\nconst toFiberTag = (fiber: FiberLike): number | undefined => {\n const tagValue = readRecordValue(fiber, 'tag');\n\n if (typeof tagValue !== 'number') {\n return undefined;\n }\n\n if (!Number.isInteger(tagValue)) {\n return undefined;\n }\n\n return tagValue;\n};\n\nconst hasTraversableFiberLinks = (fiber: FiberLike) => {\n return (\n readRecordValue(fiber, 'child') !== undefined ||\n readRecordValue(fiber, 'sibling') !== undefined ||\n readRecordValue(fiber, 'return') !== undefined ||\n readRecordValue(fiber, 'alternate') !== undefined\n );\n};\n\nconst isFiberLike = (value: unknown): value is FiberLike => {\n if (!isRecord(value)) {\n return false;\n }\n\n return toFiberTag(value) !== undefined && hasTraversableFiberLinks(value);\n};\n\nconst toRootFiberFromRecord = (\n value: Record<string, unknown>,\n seen: Set<unknown>,\n depth: number,\n): FiberLike | undefined => {\n if (depth >= MAX_ROOT_DISCOVERY_DEPTH) {\n return undefined;\n }\n\n if (isFiberLike(value)) {\n return value;\n }\n\n if (seen.has(value)) {\n return undefined;\n }\n\n seen.add(value);\n\n for (const wrapperKey of ROOT_WRAPPER_KEYS) {\n const candidate = readRecordValue(value, wrapperKey);\n const childFiber = toRootFiberFromValue(candidate, seen, depth + 1);\n\n if (childFiber !== undefined) {\n return childFiber;\n }\n }\n\n for (const childValue of readRecordValues(value)) {\n const childFiber = toRootFiberFromValue(childValue, seen, depth + 1);\n\n if (childFiber !== undefined) {\n return childFiber;\n }\n }\n\n return undefined;\n};\n\nconst isComponentFiber = (fiber: FiberLike) => {\n const tag = toFiberTag(fiber);\n\n return tag !== undefined && componentFiberTagSet.has(tag);\n};\n\nconst toRootFiberFromValue = (\n value: unknown,\n seen: Set<unknown>,\n depth: number,\n): FiberLike | undefined => {\n if (isFiberLike(value)) {\n return value;\n }\n\n if (!isRecord(value)) {\n return undefined;\n }\n\n return toRootFiberFromRecord(value, seen, depth);\n};\n\nconst toRootFiber = (rootRef: FiberRootRef): FiberLike | undefined => {\n const root = toFiber(rootRef.root);\n\n if (root === undefined) {\n return undefined;\n }\n\n return toRootFiberFromValue(root, new Set(), 0);\n};\n\nconst toSortedRoots = (roots: FiberRootRef[]) => {\n return roots\n .map((rootRef, sourceIndex) => {\n return {\n rootRef,\n sourceIndex,\n };\n })\n .sort((leftRoot, rightRoot) => {\n if (leftRoot.rootRef.rendererId !== rightRoot.rootRef.rendererId) {\n return leftRoot.rootRef.rendererId - rightRoot.rootRef.rendererId;\n }\n\n return leftRoot.sourceIndex - rightRoot.sourceIndex;\n })\n .map((entry) => entry.rootRef);\n};\n\nconst toTraversalRecordKey = (entry: TraversalStackEntry) => {\n return `fiber:${entry.rendererId}:${entry.rendererRootIndex}:${entry.path}`;\n};\n\nconst toChildFibers = (fiber: FiberLike) => {\n const children: FiberLike[] = [];\n const seenSiblingFibers = new Set<unknown>();\n let siblingCursor = toFiber(readRecordValue(fiber, 'child'));\n\n while (\n siblingCursor !== undefined &&\n !seenSiblingFibers.has(siblingCursor)\n ) {\n seenSiblingFibers.add(siblingCursor);\n children.push(siblingCursor);\n siblingCursor = toFiber(readRecordValue(siblingCursor, 'sibling'));\n }\n\n return children;\n};\n\nexport const traverseFiberRoots = (\n roots: FiberRootRef[],\n budget?: Partial<FiberTraversalBudget>,\n): FiberTraversalResult => {\n const records: FiberTraversalRecord[] = [];\n const recordsByKey = new Map<string, FiberTraversalRecord>();\n const rootRecordKeys: string[] = [];\n const seenRootRecordKeys = new Set<string>();\n const resolvedBudget = resolveTraversalBudget(budget);\n const orderedRoots = toSortedRoots(roots);\n const nextRootIndexByRenderer = new Map<number, number>();\n const visitedFibers = new Set<unknown>();\n let traversalStepCount = 0;\n let exhaustedBy: FiberTraversalExhaustedBy | null = null;\n\n for (const rootRef of orderedRoots) {\n if (exhaustedBy !== null) {\n break;\n }\n\n const rootFiber = toRootFiber(rootRef);\n\n if (rootFiber === undefined) {\n continue;\n }\n\n const rendererRootIndex =\n nextRootIndexByRenderer.get(rootRef.rendererId) ?? 0;\n\n nextRootIndexByRenderer.set(rootRef.rendererId, rendererRootIndex + 1);\n\n const stack: TraversalStackEntry[] = [\n {\n fiber: rootFiber,\n rendererId: rootRef.rendererId,\n rendererRootIndex,\n path: '0',\n parentRecordKey: null,\n },\n ];\n\n while (stack.length > 0) {\n if (traversalStepCount >= resolvedBudget.maxTraversalSteps) {\n exhaustedBy = 'step-limit';\n break;\n }\n\n if (records.length >= resolvedBudget.maxRecords) {\n exhaustedBy = 'record-limit';\n break;\n }\n\n const entry = stack.pop();\n\n traversalStepCount += 1;\n\n if (entry === undefined || visitedFibers.has(entry.fiber)) {\n continue;\n }\n\n visitedFibers.add(entry.fiber);\n\n let nextParentRecordKey = entry.parentRecordKey;\n\n if (isComponentFiber(entry.fiber)) {\n const entryTag = toFiberTag(entry.fiber);\n\n if (entryTag !== undefined) {\n const recordKey = toTraversalRecordKey(entry);\n const record: FiberTraversalRecord = {\n key: recordKey,\n rendererId: entry.rendererId,\n rendererRootIndex: entry.rendererRootIndex,\n path: entry.path,\n tag: entryTag,\n fiber: entry.fiber,\n parentKey: entry.parentRecordKey,\n childKeys: [],\n };\n\n recordsByKey.set(recordKey, record);\n records.push(record);\n nextParentRecordKey = recordKey;\n\n if (entry.parentRecordKey === null) {\n if (!seenRootRecordKeys.has(recordKey)) {\n seenRootRecordKeys.add(recordKey);\n rootRecordKeys.push(recordKey);\n }\n } else {\n const parentRecord = recordsByKey.get(entry.parentRecordKey);\n\n if (parentRecord !== undefined) {\n parentRecord.childKeys.push(recordKey);\n }\n }\n }\n }\n\n const childFibers = toChildFibers(entry.fiber);\n\n for (\n let childIndex = childFibers.length - 1;\n childIndex >= 0;\n childIndex -= 1\n ) {\n const childFiber = childFibers[childIndex];\n\n stack.push({\n fiber: childFiber,\n rendererId: entry.rendererId,\n rendererRootIndex: entry.rendererRootIndex,\n path: `${entry.path}.${childIndex}`,\n parentRecordKey: nextParentRecordKey,\n });\n }\n }\n }\n\n return {\n records,\n rootRecordKeys,\n meta: toTraversalMeta(records, traversalStepCount, resolvedBudget, exhaustedBy),\n };\n};\n\nexport const traverseDiscoveredFiberRoots = (\n discoveryResult: RootDiscoveryResult,\n budget?: Partial<FiberTraversalBudget>,\n): FiberTraversalResult => {\n const resolvedBudget = resolveTraversalBudget(budget);\n\n if (discoveryResult.status !== 'ok') {\n return createEmptyTraversalResult(resolvedBudget);\n }\n\n return traverseFiberRoots(discoveryResult.roots, resolvedBudget);\n};\n","import { createBaseReactInspectorAdapter } from '../base/baseAdapter';\nimport type { ReactInspectorAdapterContract } from '../base/types';\nimport { resolveFiberHighlightTarget } from './highlightTarget';\nimport { createFiberNodeIdentityAllocator } from './nodeIdentity';\nimport { createFiberNodeLookup } from './nodeLookup';\nimport { readFiberNodeProps } from './props';\nimport { discoverFiberRoots } from './rootDiscovery';\nimport { mapFiberTraversalToTreeSnapshot } from './treeMapping';\nimport { traverseDiscoveredFiberRoots } from './traversal';\nimport type { RootDiscoveryResult } from './types';\n\nexport type FiberAdapterSnapshotDiagnostics = Readonly<{\n discoveryResult: RootDiscoveryResult;\n}>;\n\nexport type CreateFiberReactInspectorAdapterOptions = Readonly<{\n onSnapshotDiagnostics?: (\n diagnostics: FiberAdapterSnapshotDiagnostics,\n ) => void;\n}>;\n\nconst emitSnapshotDiagnostics = (\n diagnostics: FiberAdapterSnapshotDiagnostics,\n emit: ((payload: FiberAdapterSnapshotDiagnostics) => void) | undefined,\n) => {\n if (emit === undefined) {\n return;\n }\n\n try {\n emit(diagnostics);\n } catch {\n // Diagnostics sinks must not affect adapter behavior.\n }\n};\n\nexport const createFiberReactInspectorAdapter = (\n options?: CreateFiberReactInspectorAdapterOptions,\n): ReactInspectorAdapterContract => {\n const nodeIdentityAllocator = createFiberNodeIdentityAllocator();\n const nodeLookup = createFiberNodeLookup();\n\n const refreshSnapshotState = () => {\n const discoveryResult = discoverFiberRoots();\n const traversalResult = traverseDiscoveredFiberRoots(discoveryResult);\n const nodeIdentityResult = nodeIdentityAllocator.allocateNodeIds(\n traversalResult.records,\n );\n\n const snapshot = mapFiberTraversalToTreeSnapshot({\n traversalResult,\n nodeIdByRecordKey: nodeIdentityResult.nodeIdByRecordKey,\n });\n\n nodeLookup.refreshFromSnapshot({\n traversalResult,\n nodeIdByRecordKey: nodeIdentityResult.nodeIdByRecordKey,\n snapshot,\n });\n\n emitSnapshotDiagnostics(\n {\n discoveryResult,\n },\n options?.onSnapshotDiagnostics,\n );\n\n return snapshot;\n };\n\n const resolveLookupPayload = (nodeId: string) => {\n try {\n return nodeLookup.resolveByNodeId(nodeId);\n } catch {\n return undefined;\n }\n };\n\n return createBaseReactInspectorAdapter({\n getTreeSnapshot: () => {\n return refreshSnapshotState();\n },\n getNodeProps: ({ node }) => {\n const lookupPayload = resolveLookupPayload(node.id);\n\n if (lookupPayload === undefined) {\n return undefined;\n }\n\n try {\n return readFiberNodeProps(lookupPayload);\n } catch {\n return undefined;\n }\n },\n getDomElement: ({ node }) => {\n const lookupPayload = resolveLookupPayload(node.id);\n\n if (lookupPayload === undefined) {\n return null;\n }\n\n try {\n return resolveFiberHighlightTarget(lookupPayload);\n } catch {\n return null;\n }\n },\n getReactComponentPathForElement: (element) => {\n try {\n refreshSnapshotState();\n return nodeLookup.resolveClosestComponentPathForElement(element);\n } catch {\n return undefined;\n }\n },\n });\n};\n","import type { TreeNode } from '@iteraai/inspector-protocol';\nimport { createBaseReactInspectorAdapter } from '../base/baseAdapter';\nimport { getNormalizedTreeNodeSourceFromElement } from '../base/sourceMetadata';\nimport type { ReactInspectorAdapterContract } from '../base/types';\n\nconst INSPECTOR_NODE_ID_ATTRIBUTE = 'data-inspector-node-id';\nconst INSPECTOR_DISPLAY_NAME_ATTRIBUTE = 'data-inspector-display-name';\nconst NEXT_APP_ROUTER_BOUNDARY_ATTRIBUTE = 'data-nextjs-scroll-focus-boundary';\nconst NEXT_PAGES_ROOT_ID = '__next';\nconst NEXT_PAGES_ROOT_NODE_ID = 'next-pages-root';\nconst NEXT_APP_ROUTER_ROOT_NODE_ID = 'next-app-router-root';\nconst MAX_TEXT_PREVIEW_LENGTH = 120;\nconst GENERATED_NODE_ID_PREFIX = 'next-node';\n\ntype NextTreeModel = {\n snapshot: {\n nodes: TreeNode[];\n rootIds: string[];\n };\n nodeElementById: Map<string, Element>;\n};\n\ntype NextAdapterSessionState = {\n generatedNodeIdByPath: Map<string, string>;\n nextGeneratedNodeId: number;\n};\n\ntype CreateNextReactInspectorAdapterOptions = {\n doc?: Document;\n};\n\nconst createSessionState = (): NextAdapterSessionState => {\n return {\n generatedNodeIdByPath: new Map<string, string>(),\n nextGeneratedNodeId: 1,\n };\n};\n\nconst toDisplayName = (element: Element, nodeId: string) => {\n const explicitDisplayName = element\n .getAttribute(INSPECTOR_DISPLAY_NAME_ATTRIBUTE)\n ?.trim();\n\n if (explicitDisplayName !== undefined && explicitDisplayName.length > 0) {\n return explicitDisplayName;\n }\n\n const displayNameFromNodeId = nodeId\n .split(/[\\s_-]+/)\n .filter((segment) => segment.length > 0)\n .map((segment) => segment[0].toUpperCase() + segment.slice(1))\n .join('');\n\n if (displayNameFromNodeId.length > 0) {\n return displayNameFromNodeId;\n }\n\n return element.tagName.toLowerCase();\n};\n\nconst getExplicitNodeIdFromElement = (element: Element) => {\n const nodeId = element.getAttribute(INSPECTOR_NODE_ID_ATTRIBUTE)?.trim();\n\n if (nodeId === undefined || nodeId.length === 0) {\n return undefined;\n }\n\n return nodeId;\n};\n\nconst isNextAppRouterBoundary = (element: Element) => {\n return element.hasAttribute(NEXT_APP_ROUTER_BOUNDARY_ATTRIBUTE);\n};\n\nconst toElementPath = (element: Element) => {\n const segments: string[] = [];\n let cursor: Element | null = element;\n\n while (cursor !== null) {\n const parentElement: Element | null = cursor.parentElement;\n const siblingIndex =\n parentElement === null\n ? 0\n : Array.from(parentElement.children).findIndex(\n (child) => child === cursor,\n );\n\n segments.push(`${cursor.tagName.toLowerCase()}:${siblingIndex}`);\n cursor = parentElement;\n }\n\n return segments.reverse().join('/');\n};\n\nconst toGeneratedNodeId = (\n state: NextAdapterSessionState,\n element: Element,\n reservedNodeIds: ReadonlySet<string>,\n) => {\n const path = toElementPath(element);\n const existingNodeId = state.generatedNodeIdByPath.get(path);\n\n if (existingNodeId !== undefined && !reservedNodeIds.has(existingNodeId)) {\n return existingNodeId;\n }\n\n let generatedNodeId = `${GENERATED_NODE_ID_PREFIX}-${state.nextGeneratedNodeId}`;\n\n while (reservedNodeIds.has(generatedNodeId)) {\n state.nextGeneratedNodeId += 1;\n generatedNodeId = `${GENERATED_NODE_ID_PREFIX}-${state.nextGeneratedNodeId}`;\n }\n\n state.generatedNodeIdByPath.set(path, generatedNodeId);\n state.nextGeneratedNodeId += 1;\n\n return generatedNodeId;\n};\n\nconst toTreeCandidates = (doc: Document) => {\n const explicitInspectorNodes = Array.from(\n doc.querySelectorAll(`[${INSPECTOR_NODE_ID_ATTRIBUTE}]`),\n ).filter((element) => getExplicitNodeIdFromElement(element) !== undefined);\n\n if (explicitInspectorNodes.length > 0) {\n return explicitInspectorNodes;\n }\n\n const nextPagesRoot = doc.getElementById(NEXT_PAGES_ROOT_ID);\n\n if (nextPagesRoot !== null) {\n return [nextPagesRoot];\n }\n\n const nextAppRouterBoundary = doc.querySelector(\n `[${NEXT_APP_ROUTER_BOUNDARY_ATTRIBUTE}]`,\n );\n\n if (nextAppRouterBoundary !== null) {\n return [nextAppRouterBoundary];\n }\n\n return [];\n};\n\nconst resolveNodeIdForCandidate = (\n state: NextAdapterSessionState,\n element: Element,\n reservedNodeIds: ReadonlySet<string>,\n) => {\n const explicitNodeId = getExplicitNodeIdFromElement(element);\n\n if (explicitNodeId !== undefined) {\n return explicitNodeId;\n }\n\n if ((element.getAttribute('id') ?? '').trim() === NEXT_PAGES_ROOT_ID) {\n return NEXT_PAGES_ROOT_NODE_ID;\n }\n\n if (isNextAppRouterBoundary(element)) {\n return NEXT_APP_ROUTER_ROOT_NODE_ID;\n }\n\n return toGeneratedNodeId(state, element, reservedNodeIds);\n};\n\nconst buildTreeModel = (\n doc: Document,\n state: NextAdapterSessionState,\n): NextTreeModel => {\n const nodeElementById = new Map<string, Element>();\n\n toTreeCandidates(doc).forEach((element) => {\n const reservedNodeIds = new Set(nodeElementById.keys());\n const nodeId = resolveNodeIdForCandidate(state, element, reservedNodeIds);\n\n if (nodeElementById.has(nodeId)) {\n return;\n }\n\n nodeElementById.set(nodeId, element);\n });\n\n const nodesById = new Map<string, TreeNode>();\n\n nodeElementById.forEach((element, nodeId) => {\n const source = getNormalizedTreeNodeSourceFromElement(element);\n\n nodesById.set(nodeId, {\n id: nodeId,\n displayName: toDisplayName(element, nodeId),\n parentId: null,\n childrenIds: [],\n tags: [element.tagName.toLowerCase()],\n ...(source && { source }),\n });\n });\n\n nodeElementById.forEach((element, nodeId) => {\n const node = nodesById.get(nodeId);\n\n if (node === undefined) {\n return;\n }\n\n const parentInspectorElement = element.parentElement?.closest(\n `[${INSPECTOR_NODE_ID_ATTRIBUTE}]`,\n );\n const parentNodeId =\n parentInspectorElement == null\n ? undefined\n : getExplicitNodeIdFromElement(parentInspectorElement);\n\n if (\n parentNodeId === undefined ||\n parentNodeId === nodeId ||\n !nodesById.has(parentNodeId)\n ) {\n return;\n }\n\n node.parentId = parentNodeId;\n const parentNode = nodesById.get(parentNodeId);\n\n if (parentNode === undefined) {\n return;\n }\n\n parentNode.childrenIds.push(nodeId);\n });\n\n const nodes = Array.from(nodesById.values());\n const rootIds = nodes\n .filter((node) => node.parentId === null)\n .map((node) => node.id);\n\n return {\n snapshot: {\n nodes,\n rootIds,\n },\n nodeElementById,\n };\n};\n\nconst toTextPreview = (element: Element) => {\n const rawText = element.textContent?.replace(/\\s+/g, ' ').trim();\n\n if (rawText === undefined || rawText.length === 0) {\n return undefined;\n }\n\n if (rawText.length <= MAX_TEXT_PREVIEW_LENGTH) {\n return rawText;\n }\n\n return `${rawText.slice(0, MAX_TEXT_PREVIEW_LENGTH - 3)}...`;\n};\n\nconst toNodeProps = (nodeId: string, element: Element) => {\n const props: Record<string, unknown> = {\n nodeId,\n tagName: element.tagName.toLowerCase(),\n };\n const classList = Array.from(element.classList);\n const textPreview = toTextPreview(element);\n const role = element.getAttribute('role');\n const ariaLabel = element.getAttribute('aria-label');\n\n if (element.id.length > 0) {\n props.elementId = element.id;\n }\n\n if (classList.length > 0) {\n props.classList = classList;\n }\n\n if ((element.getAttribute('id') ?? '').trim() === NEXT_PAGES_ROOT_ID) {\n props.routerMode = 'pages';\n } else if (isNextAppRouterBoundary(element)) {\n props.routerMode = 'app';\n }\n\n if (role !== null && role.length > 0) {\n props.role = role;\n }\n\n if (ariaLabel !== null && ariaLabel.length > 0) {\n props.ariaLabel = ariaLabel;\n }\n\n if (textPreview !== undefined) {\n props.textPreview = textPreview;\n }\n\n if (element instanceof HTMLIFrameElement && element.src.length > 0) {\n props.src = element.src;\n }\n\n return props;\n};\n\nexport const createNextReactInspectorAdapter = (\n options: CreateNextReactInspectorAdapterOptions = {},\n): ReactInspectorAdapterContract => {\n const doc = options.doc ?? document;\n const state = createSessionState();\n let latestTreeModel: NextTreeModel | undefined;\n\n const captureTreeModel = () => {\n latestTreeModel = buildTreeModel(doc, state);\n\n return latestTreeModel.snapshot;\n };\n\n const getLatestElementByNodeId = (nodeId: string) => {\n return latestTreeModel?.nodeElementById.get(nodeId);\n };\n\n return createBaseReactInspectorAdapter({\n getTreeSnapshot: captureTreeModel,\n getNodeProps: ({ node }) => {\n const element = getLatestElementByNodeId(node.id);\n\n if (element === undefined) {\n return undefined;\n }\n\n return toNodeProps(node.id, element);\n },\n getDomElement: ({ node }) => {\n return getLatestElementByNodeId(node.id) ?? null;\n },\n });\n};\n","import type { TreeNode } from '@iteraai/inspector-protocol';\nimport { createBaseReactInspectorAdapter } from '../base/baseAdapter';\nimport { getNormalizedTreeNodeSourceFromElement } from '../base/sourceMetadata';\nimport type { ReactInspectorAdapterContract } from '../base/types';\n\nconst INSPECTOR_NODE_ID_ATTRIBUTE = 'data-inspector-node-id';\nconst INSPECTOR_DISPLAY_NAME_ATTRIBUTE = 'data-inspector-display-name';\nconst FALLBACK_ROOT_NODE_ID = 'itera-app-root';\nconst MAX_TEXT_PREVIEW_LENGTH = 120;\nconst GENERATED_NODE_ID_PREFIX = 'vite-node';\n\ntype ViteTreeModel = {\n snapshot: {\n nodes: TreeNode[];\n rootIds: string[];\n };\n nodeElementById: Map<string, Element>;\n};\n\ntype ViteAdapterSessionState = {\n generatedNodeIdByPath: Map<string, string>;\n nextGeneratedNodeId: number;\n};\n\ntype CreateViteReactInspectorAdapterOptions = {\n doc?: Document;\n};\n\nconst createSessionState = (): ViteAdapterSessionState => {\n return {\n generatedNodeIdByPath: new Map<string, string>(),\n nextGeneratedNodeId: 1,\n };\n};\n\nconst toDisplayName = (element: Element, nodeId: string) => {\n const explicitDisplayName = element\n .getAttribute(INSPECTOR_DISPLAY_NAME_ATTRIBUTE)\n ?.trim();\n\n if (explicitDisplayName !== undefined && explicitDisplayName.length > 0) {\n return explicitDisplayName;\n }\n\n const displayNameFromNodeId = nodeId\n .split(/[\\s_-]+/)\n .filter((segment) => segment.length > 0)\n .map((segment) => segment[0].toUpperCase() + segment.slice(1))\n .join('');\n\n if (displayNameFromNodeId.length > 0) {\n return displayNameFromNodeId;\n }\n\n return element.tagName.toLowerCase();\n};\n\nconst getExplicitNodeIdFromElement = (element: Element) => {\n const nodeId = element.getAttribute(INSPECTOR_NODE_ID_ATTRIBUTE)?.trim();\n\n if (nodeId === undefined || nodeId.length === 0) {\n return undefined;\n }\n\n return nodeId;\n};\n\nconst toElementPath = (element: Element) => {\n const segments: string[] = [];\n let cursor: Element | null = element;\n\n while (cursor !== null) {\n const parentElement: Element | null = cursor.parentElement;\n const siblingIndex =\n parentElement === null\n ? 0\n : Array.from(parentElement.children).findIndex(\n (child) => child === cursor,\n );\n\n segments.push(`${cursor.tagName.toLowerCase()}:${siblingIndex}`);\n cursor = parentElement;\n }\n\n return segments.reverse().join('/');\n};\n\nconst toGeneratedNodeId = (\n state: ViteAdapterSessionState,\n element: Element,\n reservedNodeIds: ReadonlySet<string>,\n) => {\n const path = toElementPath(element);\n const existingNodeId = state.generatedNodeIdByPath.get(path);\n\n if (existingNodeId !== undefined && !reservedNodeIds.has(existingNodeId)) {\n return existingNodeId;\n }\n\n let generatedNodeId = `${GENERATED_NODE_ID_PREFIX}-${state.nextGeneratedNodeId}`;\n\n while (reservedNodeIds.has(generatedNodeId)) {\n state.nextGeneratedNodeId += 1;\n generatedNodeId = `${GENERATED_NODE_ID_PREFIX}-${state.nextGeneratedNodeId}`;\n }\n\n state.generatedNodeIdByPath.set(path, generatedNodeId);\n state.nextGeneratedNodeId += 1;\n\n return generatedNodeId;\n};\n\nconst toTreeCandidates = (doc: Document) => {\n const explicitInspectorNodes = Array.from(\n doc.querySelectorAll(`[${INSPECTOR_NODE_ID_ATTRIBUTE}]`),\n ).filter((element) => getExplicitNodeIdFromElement(element) !== undefined);\n\n if (explicitInspectorNodes.length > 0) {\n return explicitInspectorNodes;\n }\n\n const rootElement = doc.getElementById('root') ?? doc.body;\n\n return rootElement === null ? [] : [rootElement];\n};\n\nconst resolveNodeIdForCandidate = (\n state: ViteAdapterSessionState,\n element: Element,\n reservedNodeIds: ReadonlySet<string>,\n) => {\n const explicitNodeId = getExplicitNodeIdFromElement(element);\n\n if (explicitNodeId !== undefined) {\n return explicitNodeId;\n }\n\n if ((element.getAttribute('id') ?? '').trim() === 'root') {\n return FALLBACK_ROOT_NODE_ID;\n }\n\n return toGeneratedNodeId(state, element, reservedNodeIds);\n};\n\nconst buildTreeModel = (\n doc: Document,\n state: ViteAdapterSessionState,\n): ViteTreeModel => {\n const nodeElementById = new Map<string, Element>();\n\n toTreeCandidates(doc).forEach((element) => {\n const reservedNodeIds = new Set(nodeElementById.keys());\n const nodeId = resolveNodeIdForCandidate(state, element, reservedNodeIds);\n\n if (nodeElementById.has(nodeId)) {\n return;\n }\n\n nodeElementById.set(nodeId, element);\n });\n\n const nodesById = new Map<string, TreeNode>();\n\n nodeElementById.forEach((element, nodeId) => {\n const source = getNormalizedTreeNodeSourceFromElement(element);\n\n nodesById.set(nodeId, {\n id: nodeId,\n displayName: toDisplayName(element, nodeId),\n parentId: null,\n childrenIds: [],\n tags: [element.tagName.toLowerCase()],\n ...(source && { source }),\n });\n });\n\n nodeElementById.forEach((element, nodeId) => {\n const node = nodesById.get(nodeId);\n\n if (node === undefined) {\n return;\n }\n\n const parentInspectorElement = element.parentElement?.closest(\n `[${INSPECTOR_NODE_ID_ATTRIBUTE}]`,\n );\n const parentNodeId =\n parentInspectorElement == null\n ? undefined\n : getExplicitNodeIdFromElement(parentInspectorElement);\n\n if (\n parentNodeId === undefined ||\n parentNodeId === nodeId ||\n !nodesById.has(parentNodeId)\n ) {\n return;\n }\n\n node.parentId = parentNodeId;\n const parentNode = nodesById.get(parentNodeId);\n\n if (parentNode === undefined) {\n return;\n }\n\n parentNode.childrenIds.push(nodeId);\n });\n\n const nodes = Array.from(nodesById.values());\n const rootIds = nodes\n .filter((node) => node.parentId === null)\n .map((node) => node.id);\n\n return {\n snapshot: {\n nodes,\n rootIds,\n },\n nodeElementById,\n };\n};\n\nconst toTextPreview = (element: Element) => {\n const rawText = element.textContent?.replace(/\\s+/g, ' ').trim();\n\n if (rawText === undefined || rawText.length === 0) {\n return undefined;\n }\n\n if (rawText.length <= MAX_TEXT_PREVIEW_LENGTH) {\n return rawText;\n }\n\n return `${rawText.slice(0, MAX_TEXT_PREVIEW_LENGTH - 3)}...`;\n};\n\nconst toNodeProps = (nodeId: string, element: Element) => {\n const props: Record<string, unknown> = {\n nodeId,\n tagName: element.tagName.toLowerCase(),\n };\n const classList = Array.from(element.classList);\n const textPreview = toTextPreview(element);\n const role = element.getAttribute('role');\n const ariaLabel = element.getAttribute('aria-label');\n\n if (element.id.length > 0) {\n props.elementId = element.id;\n }\n\n if (classList.length > 0) {\n props.classList = classList;\n }\n\n if (role !== null && role.length > 0) {\n props.role = role;\n }\n\n if (ariaLabel !== null && ariaLabel.length > 0) {\n props.ariaLabel = ariaLabel;\n }\n\n if (textPreview !== undefined) {\n props.textPreview = textPreview;\n }\n\n if (element instanceof HTMLIFrameElement && element.src.length > 0) {\n props.src = element.src;\n }\n\n return props;\n};\n\nexport const createViteReactInspectorAdapter = (\n options: CreateViteReactInspectorAdapterOptions = {},\n): ReactInspectorAdapterContract => {\n const doc = options.doc ?? document;\n const state = createSessionState();\n let latestTreeModel: ViteTreeModel | undefined;\n\n const captureTreeModel = () => {\n latestTreeModel = buildTreeModel(doc, state);\n\n return latestTreeModel.snapshot;\n };\n\n const getLatestElementByNodeId = (nodeId: string) => {\n return latestTreeModel?.nodeElementById.get(nodeId);\n };\n\n return createBaseReactInspectorAdapter({\n getTreeSnapshot: captureTreeModel,\n getNodeProps: ({ node }) => {\n const element = getLatestElementByNodeId(node.id);\n\n if (element === undefined) {\n return undefined;\n }\n\n return toNodeProps(node.id, element);\n },\n getDomElement: ({ node }) => {\n return getLatestElementByNodeId(node.id) ?? null;\n },\n });\n};\n","import type { InspectorErrorCode } from '@iteraai/inspector-protocol';\n\nexport const EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION = 1 as const;\n\nexport const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE =\n 'itera.inspector.embedded.lifecycle_event_total';\nexport const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION =\n 'itera.inspector.embedded.rejection_total';\nexport const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK =\n 'itera.inspector.embedded.fiber_fallback_total';\n\nexport const embeddedBridgeTelemetryMetricNames = [\n EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE,\n EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION,\n EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK,\n] as const;\n\nexport type EmbeddedBridgeTelemetryMetricName =\n (typeof embeddedBridgeTelemetryMetricNames)[number];\n\nexport const embeddedBridgeLifecycleStages = [\n 'connect',\n 'ready',\n 'error',\n] as const;\n\nexport type EmbeddedBridgeLifecycleStage =\n (typeof embeddedBridgeLifecycleStages)[number];\n\nexport const embeddedBridgeRejectionReasonCodes = [\n 'origin-reject',\n 'token-reject',\n 'oversize-reject',\n 'invalid-payload-reject',\n] as const;\n\nexport type EmbeddedBridgeRejectionReasonCode =\n (typeof embeddedBridgeRejectionReasonCodes)[number];\n\nexport const embeddedBridgeFiberFallbackReasonCodes = [\n 'hook-missing',\n 'hook-malformed',\n 'renderers-malformed',\n 'fiber-roots-reader-missing',\n 'fiber-roots-malformed',\n 'renderer-empty',\n 'root-empty',\n 'fiber-roots-read-failed',\n 'probe-failed',\n 'snapshot-empty',\n 'snapshot-read-failed',\n] as const;\n\nexport type EmbeddedBridgeFiberFallbackReasonCode =\n (typeof embeddedBridgeFiberFallbackReasonCodes)[number];\n\nexport const embeddedBridgeFiberFallbackAdapterTargets = [\n 'vite',\n 'next',\n 'cra',\n 'noop',\n] as const;\n\nexport type EmbeddedBridgeFiberFallbackAdapterTarget =\n (typeof embeddedBridgeFiberFallbackAdapterTargets)[number];\n\nexport type EmbeddedBridgeLifecycleTelemetryMetric = {\n schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;\n metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE;\n stage: EmbeddedBridgeLifecycleStage;\n count: 1;\n messageType?: string;\n requestId?: string;\n sessionId?: string;\n errorCode?: InspectorErrorCode;\n};\n\nexport type EmbeddedBridgeRejectionTelemetryMetric = {\n schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;\n metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION;\n reasonCode: EmbeddedBridgeRejectionReasonCode;\n count: 1;\n messageType?: string;\n requestId?: string;\n sessionId?: string;\n errorCode?: InspectorErrorCode;\n};\n\nexport type EmbeddedBridgeFiberFallbackTelemetryMetric = {\n schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;\n metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK;\n reasonCode: EmbeddedBridgeFiberFallbackReasonCode;\n fallbackAdapterTarget: EmbeddedBridgeFiberFallbackAdapterTarget;\n count: 1;\n};\n\nexport type EmbeddedBridgeTelemetryHooks = {\n onLifecycleMetric?: (metric: EmbeddedBridgeLifecycleTelemetryMetric) => void;\n onRejectionMetric?: (metric: EmbeddedBridgeRejectionTelemetryMetric) => void;\n onFiberFallbackMetric?: (\n metric: EmbeddedBridgeFiberFallbackTelemetryMetric,\n ) => void;\n};\n\nconst safeEmit = <Metric>(\n metric: Metric,\n emit: ((resolvedMetric: Metric) => void) | undefined,\n) => {\n if (emit === undefined) {\n return;\n }\n\n try {\n emit(metric);\n } catch {\n // Telemetry failures must not affect bridge behavior.\n }\n};\n\nexport const emitEmbeddedBridgeLifecycleMetric = (\n metric: Omit<\n EmbeddedBridgeLifecycleTelemetryMetric,\n 'schemaVersion' | 'metricName' | 'count'\n >,\n hooks: EmbeddedBridgeTelemetryHooks | undefined,\n): EmbeddedBridgeLifecycleTelemetryMetric => {\n const structuredMetric: EmbeddedBridgeLifecycleTelemetryMetric = {\n schemaVersion: EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION,\n metricName: EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE,\n count: 1,\n ...metric,\n };\n\n safeEmit(structuredMetric, hooks?.onLifecycleMetric);\n\n return structuredMetric;\n};\n\nexport const emitEmbeddedBridgeRejectionMetric = (\n metric: Omit<\n EmbeddedBridgeRejectionTelemetryMetric,\n 'schemaVersion' | 'metricName' | 'count'\n >,\n hooks: EmbeddedBridgeTelemetryHooks | undefined,\n): EmbeddedBridgeRejectionTelemetryMetric => {\n const structuredMetric: EmbeddedBridgeRejectionTelemetryMetric = {\n schemaVersion: EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION,\n metricName: EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION,\n count: 1,\n ...metric,\n };\n\n safeEmit(structuredMetric, hooks?.onRejectionMetric);\n\n return structuredMetric;\n};\n\nexport const emitEmbeddedBridgeFiberFallbackMetric = (\n metric: Omit<\n EmbeddedBridgeFiberFallbackTelemetryMetric,\n 'schemaVersion' | 'metricName' | 'count'\n >,\n hooks: EmbeddedBridgeTelemetryHooks | undefined,\n): EmbeddedBridgeFiberFallbackTelemetryMetric => {\n const structuredMetric: EmbeddedBridgeFiberFallbackTelemetryMetric = {\n schemaVersion: EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION,\n metricName: EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK,\n count: 1,\n ...metric,\n };\n\n safeEmit(structuredMetric, hooks?.onFiberFallbackMetric);\n\n return structuredMetric;\n};\n","import {\n createBaseReactInspectorAdapter,\n type ReactTreeSnapshot,\n} from './baseAdapter';\nimport { resolveReactInspectorRuntimeConfig } from './runtimeConfig';\nimport type {\n ReactInspectorAdapterContract,\n ReactInspectorRuntimeConfig,\n ReactInspectorRuntimeAdapterTarget,\n} from './types';\nimport { createCraReactInspectorAdapter } from '../cra/craAdapter';\nimport {\n createFiberReactInspectorAdapter,\n type FiberAdapterSnapshotDiagnostics,\n} from '../fiber/fiberAdapter';\nimport { createNextReactInspectorAdapter } from '../next/nextAdapter';\nimport { createViteReactInspectorAdapter } from '../vite/viteAdapter';\nimport {\n emitEmbeddedBridgeFiberFallbackMetric,\n type EmbeddedBridgeFiberFallbackReasonCode,\n type EmbeddedBridgeTelemetryHooks,\n} from '../../security/bridgeTelemetry';\n\nconst emptyTreeSnapshot: ReactTreeSnapshot = {\n nodes: [],\n rootIds: [],\n};\n\nconst createNoopAdapter = () => {\n return createBaseReactInspectorAdapter({\n getTreeSnapshot: () => emptyTreeSnapshot,\n });\n};\n\ntype TagAdapterTarget = Exclude<\n ReactInspectorRuntimeAdapterTarget,\n 'auto' | 'fiber'\n>;\n\ntype FiberFallbackAdapterTarget = TagAdapterTarget | 'noop';\n\nexport type CreateReactInspectorAdapterOptions = Readonly<{\n telemetry?: EmbeddedBridgeTelemetryHooks;\n}>;\n\nconst hasNonEmptyTreeSnapshot = (snapshot: ReactTreeSnapshot) => {\n return snapshot.nodes.length > 0;\n};\n\nconst resolveLikelyTagAdapterTarget = (): TagAdapterTarget => {\n if (typeof document === 'undefined') {\n return 'vite';\n }\n\n if (\n document.getElementById('__next') !== null ||\n document.querySelector('[data-nextjs-scroll-focus-boundary]') !== null\n ) {\n return 'next';\n }\n\n if (document.querySelector('[data-reactroot]') !== null) {\n return 'cra';\n }\n\n return 'vite';\n};\n\nconst createTagAdapter = (target: TagAdapterTarget) => {\n if (target === 'vite') {\n return createViteReactInspectorAdapter();\n }\n\n if (target === 'next') {\n return createNextReactInspectorAdapter();\n }\n\n return createCraReactInspectorAdapter();\n};\n\nconst toTagFallbackTargets = (preferredTarget: TagAdapterTarget) => {\n const fallbackTargets: TagAdapterTarget[] = [];\n const orderedTargets: TagAdapterTarget[] = ['vite', 'next', 'cra'];\n\n fallbackTargets.push(preferredTarget);\n\n orderedTargets.forEach((candidateTarget) => {\n if (candidateTarget !== preferredTarget) {\n fallbackTargets.push(candidateTarget);\n }\n });\n\n return fallbackTargets;\n};\n\nconst toSafeTreeSnapshot = (adapter: ReactInspectorAdapterContract) => {\n try {\n return adapter.getTreeSnapshot();\n } catch {\n return undefined;\n }\n};\n\nconst resolveFiberFallbackAdapter = () => {\n const preferredTarget = resolveLikelyTagAdapterTarget();\n\n for (const fallbackTarget of toTagFallbackTargets(preferredTarget)) {\n let fallbackAdapter: ReactInspectorAdapterContract;\n\n try {\n fallbackAdapter = createTagAdapter(fallbackTarget);\n } catch {\n continue;\n }\n\n const fallbackSnapshot = toSafeTreeSnapshot(fallbackAdapter);\n\n if (\n fallbackSnapshot !== undefined &&\n hasNonEmptyTreeSnapshot(fallbackSnapshot)\n ) {\n return {\n adapter: fallbackAdapter,\n snapshot: fallbackSnapshot,\n target: fallbackTarget,\n };\n }\n }\n\n return {\n adapter: createNoopAdapter(),\n snapshot: emptyTreeSnapshot,\n target: 'noop' as const,\n };\n};\n\nconst toFiberFallbackReasonCode = (\n fiberSnapshot: ReactTreeSnapshot | undefined,\n diagnostics: FiberAdapterSnapshotDiagnostics | undefined,\n): EmbeddedBridgeFiberFallbackReasonCode => {\n if (fiberSnapshot === undefined) {\n return 'snapshot-read-failed';\n }\n\n if (\n diagnostics === undefined ||\n diagnostics.discoveryResult.status === 'ok'\n ) {\n return 'snapshot-empty';\n }\n\n return diagnostics.discoveryResult.reason;\n};\n\nconst createFiberAdapterWithFallback = (\n options?: CreateReactInspectorAdapterOptions,\n): ReactInspectorAdapterContract => {\n let latestFiberSnapshotDiagnostics:\n | FiberAdapterSnapshotDiagnostics\n | undefined;\n let lastFallbackMetricSignature: string | undefined;\n const fiberAdapter = createFiberReactInspectorAdapter({\n onSnapshotDiagnostics: (diagnostics) => {\n latestFiberSnapshotDiagnostics = diagnostics;\n },\n });\n let activeAdapter: ReactInspectorAdapterContract = fiberAdapter;\n let pendingSnapshot: ReactTreeSnapshot | undefined;\n\n const emitFiberFallbackMetric = (\n reasonCode: EmbeddedBridgeFiberFallbackReasonCode,\n fallbackAdapterTarget: FiberFallbackAdapterTarget,\n ) => {\n const metricSignature = `${reasonCode}:${fallbackAdapterTarget}`;\n\n if (metricSignature === lastFallbackMetricSignature) {\n return;\n }\n\n lastFallbackMetricSignature = metricSignature;\n\n emitEmbeddedBridgeFiberFallbackMetric(\n {\n reasonCode,\n fallbackAdapterTarget,\n },\n options?.telemetry,\n );\n };\n\n const resolveAdapter = () => {\n const fiberSnapshot = toSafeTreeSnapshot(fiberAdapter);\n\n if (fiberSnapshot !== undefined && hasNonEmptyTreeSnapshot(fiberSnapshot)) {\n lastFallbackMetricSignature = undefined;\n activeAdapter = fiberAdapter;\n pendingSnapshot = fiberSnapshot;\n return activeAdapter;\n }\n\n const fallbackResolution = resolveFiberFallbackAdapter();\n const fallbackReasonCode = toFiberFallbackReasonCode(\n fiberSnapshot,\n latestFiberSnapshotDiagnostics,\n );\n\n emitFiberFallbackMetric(fallbackReasonCode, fallbackResolution.target);\n\n activeAdapter = fallbackResolution.adapter;\n pendingSnapshot = fallbackResolution.snapshot;\n\n return activeAdapter;\n };\n\n return {\n getTreeSnapshot: () => {\n const activeAdapter = resolveAdapter();\n\n if (pendingSnapshot !== undefined) {\n const nextSnapshot = pendingSnapshot;\n\n pendingSnapshot = undefined;\n return nextSnapshot;\n }\n\n return activeAdapter.getTreeSnapshot();\n },\n getNodeProps: (nodeId: string) => {\n return activeAdapter.getNodeProps(nodeId);\n },\n getDomElement: (nodeId: string) => {\n return activeAdapter.getDomElement(nodeId);\n },\n getReactComponentPathForElement: (element: Element) => {\n return fiberAdapter.getReactComponentPathForElement?.(element);\n },\n };\n};\n\nexport const createReactInspectorAdapter = (\n runtimeConfig?: ReactInspectorRuntimeConfig,\n options?: CreateReactInspectorAdapterOptions,\n) => {\n const resolvedRuntimeConfig =\n resolveReactInspectorRuntimeConfig(runtimeConfig);\n\n if (resolvedRuntimeConfig.adapter === 'auto') {\n return createNoopAdapter();\n }\n\n if (resolvedRuntimeConfig.adapter === 'vite') {\n return createViteReactInspectorAdapter();\n }\n\n if (resolvedRuntimeConfig.adapter === 'next') {\n return createNextReactInspectorAdapter();\n }\n\n if (resolvedRuntimeConfig.adapter === 'cra') {\n return createCraReactInspectorAdapter();\n }\n\n if (resolvedRuntimeConfig.adapter === 'fiber') {\n return createFiberAdapterWithFallback(options);\n }\n\n return createNoopAdapter();\n};\n","const HIGHLIGHT_OVERLAY_ATTRIBUTE = 'data-itera-inspector-highlight';\n\nconst toPx = (value: number) => `${Math.max(0, value)}px`;\n\nconst createOverlay = (): HTMLDivElement => {\n const overlay = document.createElement('div');\n overlay.setAttribute(HIGHLIGHT_OVERLAY_ATTRIBUTE, 'true');\n overlay.style.position = 'fixed';\n overlay.style.pointerEvents = 'none';\n overlay.style.boxSizing = 'border-box';\n overlay.style.border = '2px solid #2563eb';\n overlay.style.background = 'rgba(37, 99, 235, 0.1)';\n overlay.style.borderRadius = '4px';\n overlay.style.zIndex = '2147483647';\n overlay.style.display = 'none';\n\n return overlay;\n};\n\nexport const createInspectorHighlighter = () => {\n let overlay: HTMLDivElement | undefined;\n\n const ensureOverlay = () => {\n if (overlay !== undefined) {\n return overlay;\n }\n\n overlay = createOverlay();\n document.body.append(overlay);\n\n return overlay;\n };\n\n const clearHighlight = () => {\n if (overlay === undefined) {\n return;\n }\n\n overlay.style.display = 'none';\n };\n\n const highlightElement = (element: Element) => {\n const targetRect = element.getBoundingClientRect();\n const activeOverlay = ensureOverlay();\n activeOverlay.style.left = toPx(targetRect.left);\n activeOverlay.style.top = toPx(targetRect.top);\n activeOverlay.style.width = toPx(targetRect.width);\n activeOverlay.style.height = toPx(targetRect.height);\n activeOverlay.style.display = 'block';\n };\n\n const destroy = () => {\n if (overlay === undefined) {\n return;\n }\n\n overlay.remove();\n overlay = undefined;\n };\n\n return {\n clearHighlight,\n highlightElement,\n destroy,\n };\n};\n\nexport const inspectorHighlightOverlaySelector =\n '[data-itera-inspector-highlight=\"true\"]';\n","import {\n INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED,\n INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION,\n type InspectorErrorCode,\n type InspectorSecurityEventName,\n type InspectorSecurityReasonCode,\n} from '@iteraai/inspector-protocol';\nimport type { InspectorSessionTokenRejectionReason } from './tokenValidation';\n\nexport {\n INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED,\n INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION,\n mapOversizeRejectionReasonToSecurityReasonCode,\n} from '@iteraai/inspector-protocol';\nexport type { InspectorSecurityEventName, InspectorSecurityReasonCode };\nexport {\n inspectorSecurityEventNames,\n inspectorSecurityReasonCodes,\n} from '@iteraai/inspector-protocol';\n\nexport type EmbeddedInspectorSecurityRejectionEvent = {\n schemaVersion: typeof INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION;\n eventName: typeof INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED;\n reasonCode: InspectorSecurityReasonCode;\n rejectedBy: 'embedded';\n messageType?: string;\n requestId?: string;\n sessionId?: string;\n errorCode: InspectorErrorCode;\n};\n\nexport type EmbeddedInspectorSecurityEventLogger = (\n event: EmbeddedInspectorSecurityRejectionEvent,\n) => void;\n\nconst defaultEmbeddedInspectorSecurityEventLogger: EmbeddedInspectorSecurityEventLogger =\n (event) => {\n console.warn('[react-inspector-bridge/security]', event);\n };\n\nconst unauthorizedReasonCodeByReason: Record<\n InspectorSessionTokenRejectionReason,\n InspectorSecurityReasonCode\n> = {\n 'missing-auth': 'unauthorized-missing-auth',\n 'invalid-token': 'unauthorized-invalid-token',\n 'expired-token': 'unauthorized-expired-token',\n};\n\nexport const mapTokenValidationRejectionToSecurityReasonCode = (\n reason: InspectorSessionTokenRejectionReason,\n): InspectorSecurityReasonCode => {\n return unauthorizedReasonCodeByReason[reason];\n};\n\nexport const emitEmbeddedInspectorSecurityRejectionEvent = (\n event: Omit<\n EmbeddedInspectorSecurityRejectionEvent,\n 'schemaVersion' | 'eventName' | 'rejectedBy'\n >,\n logger: EmbeddedInspectorSecurityEventLogger = defaultEmbeddedInspectorSecurityEventLogger,\n): EmbeddedInspectorSecurityRejectionEvent => {\n const structuredEvent: EmbeddedInspectorSecurityRejectionEvent = {\n ...event,\n schemaVersion: INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION,\n eventName: INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED,\n rejectedBy: 'embedded',\n };\n\n logger(structuredEvent);\n\n return structuredEvent;\n};\n","import type { InspectorOversizeRejectionReason } from '@iteraai/inspector-protocol';\n\nexport const EMBEDDED_MAX_INBOUND_INSPECTOR_MESSAGE_BYTES = 128 * 1024;\nexport const EMBEDDED_OVERSIZE_MESSAGE_REASON: InspectorOversizeRejectionReason =\n 'embedded-inbound-message-too-large';\n\nexport type EmbeddedInboundMessageSizePolicy = {\n maxInboundMessageBytes: number;\n reason: InspectorOversizeRejectionReason;\n};\n\nexport type EmbeddedInboundMessageSizeResult =\n | {\n ok: true;\n sizeInBytes: number;\n }\n | {\n ok: false;\n sizeInBytes?: number;\n maxInboundMessageBytes: number;\n reason: InspectorOversizeRejectionReason;\n };\n\nexport const embeddedInboundMessageSizePolicy: EmbeddedInboundMessageSizePolicy =\n {\n maxInboundMessageBytes: EMBEDDED_MAX_INBOUND_INSPECTOR_MESSAGE_BYTES,\n reason: EMBEDDED_OVERSIZE_MESSAGE_REASON,\n };\n\nconst textEncoder = new TextEncoder();\nconst MAX_INSPECTOR_MESSAGE_SIZE_TRAVERSAL_DEPTH = 64;\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n};\n\nconst measureValueSizeInBytes = (\n value: unknown,\n branchObjects: WeakSet<object>,\n depth: number,\n): number | undefined => {\n if (depth > MAX_INSPECTOR_MESSAGE_SIZE_TRAVERSAL_DEPTH) {\n return undefined;\n }\n\n if (value === null) {\n return 1;\n }\n\n if (typeof value === 'string') {\n return textEncoder.encode(value).byteLength;\n }\n\n if (typeof value === 'number') {\n return 8;\n }\n\n if (typeof value === 'boolean') {\n return 1;\n }\n\n if (value === undefined) {\n return 1;\n }\n\n if (\n typeof value === 'bigint' ||\n typeof value === 'symbol' ||\n typeof value === 'function'\n ) {\n return undefined;\n }\n\n if (typeof value !== 'object') {\n return undefined;\n }\n\n if (branchObjects.has(value)) {\n return undefined;\n }\n\n if (value instanceof ArrayBuffer) {\n return value.byteLength;\n }\n\n if (\n typeof SharedArrayBuffer !== 'undefined' &&\n value instanceof SharedArrayBuffer\n ) {\n return value.byteLength;\n }\n\n if (ArrayBuffer.isView(value)) {\n return value.byteLength;\n }\n\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n return value.size;\n }\n\n branchObjects.add(value);\n\n if (Array.isArray(value)) {\n let totalSizeInBytes = 0;\n\n for (const entry of value) {\n const entrySizeInBytes = measureValueSizeInBytes(\n entry,\n branchObjects,\n depth + 1,\n );\n\n if (entrySizeInBytes === undefined) {\n branchObjects.delete(value);\n return undefined;\n }\n\n totalSizeInBytes += entrySizeInBytes;\n }\n\n branchObjects.delete(value);\n return totalSizeInBytes;\n }\n\n if (!isPlainObject(value)) {\n branchObjects.delete(value);\n return undefined;\n }\n\n let totalSizeInBytes = 0;\n\n for (const [key, entry] of Object.entries(value)) {\n const entrySizeInBytes = measureValueSizeInBytes(\n entry,\n branchObjects,\n depth + 1,\n );\n\n if (entrySizeInBytes === undefined) {\n branchObjects.delete(value);\n return undefined;\n }\n\n totalSizeInBytes += textEncoder.encode(key).byteLength + entrySizeInBytes;\n }\n\n branchObjects.delete(value);\n return totalSizeInBytes;\n};\n\nexport const measureInspectorMessageSizeInBytes = (\n message: unknown,\n): number | undefined => {\n return measureValueSizeInBytes(message, new WeakSet(), 0);\n};\n\nexport const evaluateEmbeddedInboundMessageSize = (\n message: unknown,\n policy: EmbeddedInboundMessageSizePolicy = embeddedInboundMessageSizePolicy,\n): EmbeddedInboundMessageSizeResult => {\n const sizeInBytes = measureInspectorMessageSizeInBytes(message);\n\n if (sizeInBytes === undefined) {\n return {\n ok: false,\n maxInboundMessageBytes: policy.maxInboundMessageBytes,\n reason: policy.reason,\n };\n }\n\n if (sizeInBytes <= policy.maxInboundMessageBytes) {\n return {\n ok: true,\n sizeInBytes,\n };\n }\n\n return {\n ok: false,\n sizeInBytes,\n maxInboundMessageBytes: policy.maxInboundMessageBytes,\n reason: policy.reason,\n };\n};\n","import type { HelloAuthPayload } from '@iteraai/inspector-protocol';\n\nconst EPOCH_MILLISECONDS_THRESHOLD = 1_000_000_000_000;\n\nexport type InspectorSessionTokenRejectionReason =\n | 'missing-auth'\n | 'invalid-token'\n | 'expired-token';\n\nexport type InspectorSessionTokenValidationResult =\n | {\n ok: true;\n }\n | {\n ok: false;\n reason: InspectorSessionTokenRejectionReason;\n message: string;\n };\n\nexport type InspectorSessionTokenValidator = (\n auth: HelloAuthPayload | undefined,\n) => InspectorSessionTokenValidationResult;\n\nexport type InspectorBridgeSecurityOptions = {\n enabled: boolean;\n tokenValidator?: InspectorSessionTokenValidator;\n};\n\nconst toEpochMilliseconds = (timestamp: number) => {\n if (!Number.isFinite(timestamp)) {\n return Number.NaN;\n }\n\n if (timestamp >= EPOCH_MILLISECONDS_THRESHOLD) {\n return timestamp;\n }\n\n return timestamp * 1000;\n};\n\nexport const validateHelloSessionToken: InspectorSessionTokenValidator = (\n auth,\n) => {\n if (auth === undefined) {\n return {\n ok: false,\n reason: 'missing-auth',\n message: 'HELLO auth payload is required in secure mode.',\n };\n }\n\n if (auth.sessionToken.trim().length === 0) {\n return {\n ok: false,\n reason: 'invalid-token',\n message: 'HELLO auth session token must be a non-empty string.',\n };\n }\n\n const expiresAt = auth.metadata?.expiresAt;\n\n if (expiresAt !== undefined && toEpochMilliseconds(expiresAt) <= Date.now()) {\n return {\n ok: false,\n reason: 'expired-token',\n message: 'HELLO auth session token is expired.',\n };\n }\n\n return {\n ok: true,\n };\n};\n","const sensitiveKeyMatchers = [\n 'token',\n 'password',\n 'secret',\n 'authorization',\n] as const;\n\nconst sensitiveKeyPattern = new RegExp(sensitiveKeyMatchers.join('|'), 'i');\n\nexport const redactedValuePreview = 'Sensitive value redacted';\n\nexport const isSensitivePropKey = (key: string): boolean => {\n return sensitiveKeyPattern.test(key);\n};\n","import type {\n NodePropsMeta,\n SerializableObject,\n SerializablePlaceholder,\n SerializablePlaceholderType,\n SerializableValue,\n} from '@iteraai/inspector-protocol';\nimport {\n isSensitivePropKey,\n redactedValuePreview,\n} from './security/redactionPolicy';\n\nconst defaultMaxDepth = 5;\nconst defaultMaxKeys = 50;\n\nexport type SerializeNodePropsOptions = {\n maxDepth?: number;\n maxKeys?: number;\n};\n\nexport type SerializeNodePropsResult = {\n props: Record<string, SerializableValue>;\n meta: NodePropsMeta;\n};\n\ntype SerializeContext = {\n maxDepth: number;\n maxKeys: number;\n objectStack: WeakSet<object>;\n droppedKeys: string[];\n redactedCount: number;\n redactedPaths: string[];\n truncated: boolean;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n};\n\nconst isDomNode = (value: unknown): value is Node => {\n return typeof Node !== 'undefined' && value instanceof Node;\n};\n\nconst createPlaceholder = (\n type: SerializablePlaceholderType,\n preview?: string,\n): SerializablePlaceholder => {\n if (preview === undefined) {\n return {\n __iteraType: type,\n };\n }\n\n return {\n __iteraType: type,\n preview,\n };\n};\n\nconst appendObjectPath = (path: string, key: string): string => {\n if (path === '') {\n return key;\n }\n\n return `${path}.${key}`;\n};\n\nconst appendArrayPath = (path: string, index: number): string => {\n if (path === '') {\n return `[${index}]`;\n }\n\n return `${path}[${index}]`;\n};\n\nconst pushDroppedKey = (context: SerializeContext, path: string) => {\n context.truncated = true;\n\n if (context.droppedKeys.length >= context.maxKeys) {\n return;\n }\n\n context.droppedKeys.push(path);\n};\n\nconst pushRedactedPath = (context: SerializeContext, path: string) => {\n context.redactedCount += 1;\n\n if (context.redactedPaths.length >= context.maxKeys) {\n return;\n }\n\n context.redactedPaths.push(path);\n};\n\nconst serializeDatePreview = (value: Date): string => {\n if (Number.isNaN(value.getTime())) {\n return 'Invalid Date';\n }\n\n return value.toISOString();\n};\n\nconst serializeErrorPreview = (value: Error): string => {\n if (value.message === '') {\n return value.name;\n }\n\n return `${value.name}: ${value.message}`;\n};\n\nconst serializeDomPreview = (value: Node): string => {\n if (value instanceof Element) {\n return `<${value.tagName.toLowerCase()}>`;\n }\n\n return value.nodeName;\n};\n\nconst toUnserializableObjectPreview = (value: object): string | undefined => {\n const constructorName = value.constructor?.name;\n\n if (\n typeof constructorName === 'string' &&\n constructorName !== '' &&\n constructorName !== 'Object'\n ) {\n return constructorName;\n }\n\n return undefined;\n};\n\nconst isSpecialObject = (value: unknown): boolean => {\n return (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error ||\n isDomNode(value)\n );\n};\n\nconst captureDroppedPaths = (\n context: SerializeContext,\n droppedPaths: string[],\n fallbackPath: string,\n) => {\n const boundedDroppedPaths = droppedPaths.slice(0, context.maxKeys);\n\n for (const droppedPath of boundedDroppedPaths) {\n pushDroppedKey(context, droppedPath);\n }\n\n if (droppedPaths.length > boundedDroppedPaths.length) {\n pushDroppedKey(context, `${fallbackPath}.__remaining`);\n }\n};\n\nconst serializeObject = (\n value: Record<string, unknown>,\n depth: number,\n path: string,\n context: SerializeContext,\n): SerializableObject => {\n context.objectStack.add(value);\n\n try {\n const result: SerializableObject = {};\n const keys = Object.keys(value);\n const keysToSerialize = keys.slice(0, context.maxKeys);\n const droppedPaths = keys\n .slice(context.maxKeys)\n .map((key) => appendObjectPath(path, key));\n\n captureDroppedPaths(context, droppedPaths, path === '' ? 'root' : path);\n\n for (const key of keysToSerialize) {\n const childPath = appendObjectPath(path, key);\n\n if (isSensitivePropKey(key)) {\n pushRedactedPath(context, childPath);\n result[key] = createPlaceholder('redacted', redactedValuePreview);\n continue;\n }\n\n try {\n result[key] = serializeValue(value[key], depth + 1, childPath, context);\n } catch {\n context.truncated = true;\n result[key] = createPlaceholder(\n 'unserializable',\n 'Property access threw',\n );\n }\n }\n\n return result;\n } finally {\n context.objectStack.delete(value);\n }\n};\n\nconst serializeArray = (\n value: unknown[],\n depth: number,\n path: string,\n context: SerializeContext,\n): SerializableValue[] => {\n context.objectStack.add(value);\n\n try {\n const itemsToSerialize = value.slice(0, context.maxKeys);\n const droppedPaths = value\n .slice(context.maxKeys)\n .map((_, index) => appendArrayPath(path, context.maxKeys + index));\n\n captureDroppedPaths(context, droppedPaths, path === '' ? 'root' : path);\n\n return itemsToSerialize.map((entry, index) =>\n serializeValue(entry, depth + 1, appendArrayPath(path, index), context),\n );\n } finally {\n context.objectStack.delete(value);\n }\n};\n\nconst serializeValue = (\n value: unknown,\n depth: number,\n path: string,\n context: SerializeContext,\n): SerializableValue => {\n if (value === null) {\n return null;\n }\n\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n if (typeof value === 'undefined') {\n return createPlaceholder('undefined');\n }\n\n if (typeof value === 'function') {\n const preview = value.name === '' ? 'anonymous' : value.name;\n\n return createPlaceholder('function', preview);\n }\n\n if (typeof value === 'symbol') {\n return createPlaceholder('symbol', String(value));\n }\n\n if (typeof value === 'bigint') {\n return createPlaceholder('bigint', `${value.toString()}n`);\n }\n\n if (value instanceof Date) {\n return createPlaceholder('date', serializeDatePreview(value));\n }\n\n if (value instanceof RegExp) {\n return createPlaceholder('regexp', value.toString());\n }\n\n if (value instanceof Map) {\n return createPlaceholder('map', `Map(${value.size})`);\n }\n\n if (value instanceof Set) {\n return createPlaceholder('set', `Set(${value.size})`);\n }\n\n if (value instanceof Error) {\n return createPlaceholder('error', serializeErrorPreview(value));\n }\n\n if (isDomNode(value)) {\n return createPlaceholder('dom-node', serializeDomPreview(value));\n }\n\n if (Array.isArray(value)) {\n if (depth >= context.maxDepth) {\n context.truncated = true;\n\n return createPlaceholder('unserializable', 'Depth limit reached');\n }\n\n if (context.objectStack.has(value)) {\n context.truncated = true;\n\n return createPlaceholder('unserializable', 'Circular reference');\n }\n\n return serializeArray(value, depth, path, context);\n }\n\n if (isRecord(value)) {\n if (!isPlainObject(value)) {\n return createPlaceholder(\n 'unserializable',\n toUnserializableObjectPreview(value),\n );\n }\n\n if (depth >= context.maxDepth) {\n context.truncated = true;\n\n return createPlaceholder('unserializable', 'Depth limit reached');\n }\n\n if (context.objectStack.has(value)) {\n context.truncated = true;\n\n return createPlaceholder('unserializable', 'Circular reference');\n }\n\n return serializeObject(value, depth, path, context);\n }\n\n return createPlaceholder('unserializable');\n};\n\nconst toNodePropsMeta = (context: SerializeContext): NodePropsMeta => {\n const meta: NodePropsMeta = {};\n\n if (context.truncated) {\n meta.truncated = true;\n }\n\n if (context.droppedKeys.length > 0) {\n meta.droppedKeys = context.droppedKeys;\n }\n\n if (context.redactedCount > 0) {\n meta.redactedCount = context.redactedCount;\n }\n\n if (context.redactedPaths.length > 0) {\n meta.redactedPaths = context.redactedPaths;\n }\n\n return meta;\n};\n\nconst createSerializeContext = (\n options: SerializeNodePropsOptions,\n): SerializeContext => {\n const maxDepth = options.maxDepth ?? defaultMaxDepth;\n const maxKeys = options.maxKeys ?? defaultMaxKeys;\n\n return {\n maxDepth: Math.max(1, maxDepth),\n maxKeys: Math.max(1, maxKeys),\n objectStack: new WeakSet<object>(),\n droppedKeys: [],\n redactedCount: 0,\n redactedPaths: [],\n truncated: false,\n };\n};\n\nexport const serializeNodeProps = (\n input: unknown,\n options: SerializeNodePropsOptions = {},\n): SerializeNodePropsResult => {\n const context = createSerializeContext(options);\n\n try {\n if (isPlainObject(input) && !isSpecialObject(input)) {\n const props = serializeObject(input, 0, '', context);\n\n return {\n props,\n meta: toNodePropsMeta(context),\n };\n }\n\n return {\n props: {\n value: serializeValue(input, 0, 'value', context),\n },\n meta: toNodePropsMeta(context),\n };\n } catch {\n context.truncated = true;\n\n return {\n props: {\n value: createPlaceholder('unserializable', 'Unable to serialize props'),\n },\n meta: toNodePropsMeta(context),\n };\n }\n};\n","import {\n INSPECTOR_CHANNEL,\n buildMessage,\n createInspectorProtocolError,\n isOriginTrusted,\n parseMessage,\n type AnyInspectorMessage,\n type HostToEmbeddedMessage,\n type HostToEmbeddedMessageType,\n type InspectorErrorCode,\n type SnapshotPayload,\n} from '@iteraai/inspector-protocol';\nimport { createReactInspectorAdapter } from './adapters/base/createReactInspectorAdapter';\nimport type { ReactInspectorRuntimeConfig } from './adapters/base/types';\nimport { createInspectorHighlighter } from './highlighter';\nimport { capTreeSnapshot, type ReactTreeAdapter } from './reactTreeAdapter';\nimport {\n emitEmbeddedBridgeLifecycleMetric,\n emitEmbeddedBridgeRejectionMetric,\n type EmbeddedBridgeRejectionReasonCode,\n type EmbeddedBridgeTelemetryHooks,\n} from './security/bridgeTelemetry';\nimport {\n emitEmbeddedInspectorSecurityRejectionEvent,\n mapOversizeRejectionReasonToSecurityReasonCode,\n mapTokenValidationRejectionToSecurityReasonCode,\n} from './security/inspectorSecurityEvents';\nimport {\n evaluateEmbeddedInboundMessageSize,\n measureInspectorMessageSizeInBytes,\n} from './security/messageSizePolicy';\nimport {\n validateHelloSessionToken,\n type InspectorBridgeSecurityOptions,\n type InspectorSessionTokenValidationResult,\n} from './security/tokenValidation';\nimport { serializeNodeProps } from './serializer';\n\ntype InspectorBridgeMode = 'development' | 'iteration' | 'production';\n\nexport type InspectorBridgeRequestHandlers = {\n onHighlightNode?: (message: HostToEmbeddedMessage) => void;\n onClearHighlight?: (message: HostToEmbeddedMessage) => void;\n};\n\nexport type InitInspectorBridgeOptions = {\n hostOrigins: readonly string[];\n enabled: boolean;\n killSwitchActive?: boolean;\n mode?: InspectorBridgeMode;\n runtimeConfig?: ReactInspectorRuntimeConfig;\n capabilities?: string[];\n treeAdapter?: ReactTreeAdapter;\n adapterFactory?: (\n runtimeConfig?: ReactInspectorRuntimeConfig,\n ) => ReactTreeAdapter | undefined;\n handlers?: InspectorBridgeRequestHandlers;\n security?: InspectorBridgeSecurityOptions;\n telemetry?: EmbeddedBridgeTelemetryHooks;\n};\n\ntype ResolvedInitInspectorBridgeOptions = Omit<\n InitInspectorBridgeOptions,\n 'treeAdapter'\n> & {\n treeAdapter?: ReactTreeAdapter;\n};\n\ntype InspectorBridge = {\n destroy: () => void;\n};\n\ntype EmbeddedReactInspectorSelectionApi = {\n getReactComponentPathForElement: (\n element: Element,\n ) => ReadonlyArray<string> | undefined;\n};\n\ntype MessageTarget = {\n postMessage: (message: unknown, targetOrigin: string) => void;\n};\n\ndeclare global {\n interface Window {\n __ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__?:\n | EmbeddedReactInspectorSelectionApi\n | undefined;\n }\n}\n\ntype HostReadyConnection = {\n target: MessageEventSource | null;\n origin: string;\n sessionId?: string;\n};\n\ntype HandleHostMessageCallbacks = {\n onReady?: (connection: HostReadyConnection) => void;\n};\n\nconst PREVIEW_PATH_CHANNEL = 'itera-preview-path';\nconst PREVIEW_PATH_UPDATED_TYPE = 'PATH_UPDATED';\n\nconst TREE_NAVIGATION_REFRESH_DEBOUNCE_MS = 120;\nconst TREE_NAVIGATION_FOLLOW_UP_REFRESH_DELAY_MS = 1200;\n\nconst hostMessageTypeSet = new Set<HostToEmbeddedMessageType>([\n 'HELLO',\n 'REQUEST_TREE',\n 'REQUEST_NODE_PROPS',\n 'REQUEST_SNAPSHOT',\n 'HIGHLIGHT_NODE',\n 'CLEAR_HIGHLIGHT',\n 'PING',\n]);\n\nlet activeBridge: InspectorBridge | undefined;\n\nconst isHostToEmbeddedMessage = (\n message: AnyInspectorMessage,\n): message is HostToEmbeddedMessage => {\n return hostMessageTypeSet.has(message.type as HostToEmbeddedMessageType);\n};\n\nconst toMessageTarget = (\n source: MessageEventSource | null,\n): MessageTarget | undefined => {\n if (source === null) {\n return undefined;\n }\n\n if (typeof (source as MessageTarget).postMessage !== 'function') {\n return undefined;\n }\n\n return source as MessageTarget;\n};\n\nconst postRawToTarget = (\n target: MessageEventSource | null,\n targetOrigin: string,\n message: unknown,\n) => {\n const eventTarget = toMessageTarget(target);\n\n if (eventTarget !== undefined) {\n eventTarget.postMessage(message, targetOrigin);\n return;\n }\n\n window.parent.postMessage(message, targetOrigin);\n};\n\nconst postToTarget = (\n target: MessageEventSource | null,\n targetOrigin: string,\n message: AnyInspectorMessage,\n) => {\n postRawToTarget(target, targetOrigin, message);\n};\n\nconst postNodeNotFoundError = (\n event: MessageEvent,\n nodeId: string,\n requestId?: string,\n sessionId?: string,\n) => {\n const nodeNotFoundError = createInspectorProtocolError('ERR_NODE_NOT_FOUND');\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'ERROR',\n {\n code: nodeNotFoundError.code,\n message: nodeNotFoundError.message,\n details: {\n nodeId,\n },\n },\n {\n requestId,\n sessionId,\n },\n ),\n );\n};\n\nconst SNAPSHOT_RESPONSE_SOFT_MAX_BYTES = 112 * 1024;\nconst SNAPSHOT_CAPTURE_BLOB_MIME_TYPE = 'image/svg+xml';\n\nconst toSnapshotCaptureBlob = (): {\n blob: Blob;\n width: number;\n height: number;\n} => {\n const placeholderMarkup =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1\" height=\"1\" viewBox=\"0 0 1 1\"></svg>';\n\n return {\n blob: new Blob([placeholderMarkup], {\n type: SNAPSHOT_CAPTURE_BLOB_MIME_TYPE,\n }),\n width: 1,\n height: 1,\n };\n};\n\nconst toSnapshotHtmlPayload = (): {\n html: string;\n htmlTruncated: boolean;\n} => {\n return {\n html: document.documentElement.outerHTML,\n htmlTruncated: false,\n };\n};\n\ntype SessionTokenValidationFailure = Exclude<\n InspectorSessionTokenValidationResult,\n { ok: true }\n>;\n\nconst postUnauthorizedSessionError = (\n event: MessageEvent,\n options: InitInspectorBridgeOptions,\n validationError: SessionTokenValidationFailure,\n requestId?: string,\n sessionId?: string,\n) => {\n const unauthorizedSessionError = createInspectorProtocolError(\n 'ERR_UNAUTHORIZED_SESSION',\n validationError.message,\n );\n\n emitEmbeddedInspectorSecurityRejectionEvent({\n reasonCode: mapTokenValidationRejectionToSecurityReasonCode(\n validationError.reason,\n ),\n messageType: 'HELLO',\n requestId,\n sessionId,\n errorCode: unauthorizedSessionError.code,\n });\n emitRejectionLifecycleTelemetry(\n options,\n 'token-reject',\n {\n type: 'HELLO',\n requestId,\n sessionId,\n },\n unauthorizedSessionError.code,\n );\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'ERROR',\n {\n code: unauthorizedSessionError.code,\n message: unauthorizedSessionError.message,\n details: {\n reason: validationError.reason,\n },\n },\n {\n requestId,\n sessionId,\n },\n ),\n );\n};\n\ntype OversizeInboundMessageFailure = Exclude<\n ReturnType<typeof evaluateEmbeddedInboundMessageSize>,\n { ok: true }\n>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst toRawMessageObject = (\n rawMessage: unknown,\n): Record<string, unknown> | undefined => {\n if (typeof rawMessage === 'string') {\n try {\n const parsedMessage = JSON.parse(rawMessage) as unknown;\n\n return isRecord(parsedMessage) ? parsedMessage : undefined;\n } catch {\n return undefined;\n }\n }\n\n return isRecord(rawMessage) ? rawMessage : undefined;\n};\n\nconst readMessageContext = (\n rawMessage: unknown,\n): {\n type?: string;\n requestId?: string;\n sessionId?: string;\n} => {\n const messageObject = toRawMessageObject(rawMessage);\n\n if (messageObject === undefined) {\n return {};\n }\n\n return {\n type:\n typeof messageObject.type === 'string' ? messageObject.type : undefined,\n requestId:\n typeof messageObject.requestId === 'string'\n ? messageObject.requestId\n : undefined,\n sessionId:\n typeof messageObject.sessionId === 'string'\n ? messageObject.sessionId\n : undefined,\n };\n};\n\nconst postOversizeMessageError = (\n event: MessageEvent,\n options: InitInspectorBridgeOptions,\n failure: OversizeInboundMessageFailure,\n) => {\n const messageContext = readMessageContext(event.data);\n const responseContext = {\n requestId: messageContext.requestId,\n sessionId: messageContext.sessionId,\n };\n const actualBytes =\n failure.sizeInBytes === undefined ? 'unavailable' : failure.sizeInBytes;\n const oversizeError = createInspectorProtocolError(\n 'ERR_OVERSIZE_MESSAGE',\n `Rejected inbound host message: reason=${failure.reason}, maxBytes=${failure.maxInboundMessageBytes}, actualBytes=${actualBytes}.`,\n );\n\n emitEmbeddedInspectorSecurityRejectionEvent({\n reasonCode: mapOversizeRejectionReasonToSecurityReasonCode(failure.reason),\n messageType: messageContext.type,\n requestId: messageContext.requestId,\n sessionId: messageContext.sessionId,\n errorCode: oversizeError.code,\n });\n emitRejectionLifecycleTelemetry(\n options,\n 'oversize-reject',\n messageContext,\n oversizeError.code,\n );\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'ERROR',\n {\n code: oversizeError.code,\n message: oversizeError.message,\n details: {\n reason: failure.reason,\n maxBytes: failure.maxInboundMessageBytes,\n actualBytes,\n },\n },\n responseContext,\n ),\n );\n};\n\nconst isInspectorChannelCandidate = (rawMessage: unknown): boolean => {\n const messageObject = toRawMessageObject(rawMessage);\n\n return messageObject?.channel === INSPECTOR_CHANNEL;\n};\n\nconst emitRejectionLifecycleTelemetry = (\n options: InitInspectorBridgeOptions,\n reasonCode: EmbeddedBridgeRejectionReasonCode,\n messageContext: ReturnType<typeof readMessageContext>,\n errorCode: InspectorErrorCode,\n) => {\n emitEmbeddedBridgeRejectionMetric(\n {\n reasonCode,\n messageType: messageContext.type,\n requestId: messageContext.requestId,\n sessionId: messageContext.sessionId,\n errorCode,\n },\n options.telemetry,\n );\n emitEmbeddedBridgeLifecycleMetric(\n {\n stage: 'error',\n messageType: messageContext.type,\n requestId: messageContext.requestId,\n sessionId: messageContext.sessionId,\n errorCode,\n },\n options.telemetry,\n );\n};\n\nconst resolveTreeAdapter = (\n options: InitInspectorBridgeOptions,\n): ReactTreeAdapter | undefined => {\n if (options.treeAdapter !== undefined) {\n return options.treeAdapter;\n }\n\n if (options.adapterFactory !== undefined) {\n return options.adapterFactory(options.runtimeConfig);\n }\n\n if (options.runtimeConfig === undefined) {\n return undefined;\n }\n\n return createReactInspectorAdapter(options.runtimeConfig, {\n telemetry: options.telemetry,\n });\n};\n\nconst resolveInitOptions = (\n options: InitInspectorBridgeOptions,\n): ResolvedInitInspectorBridgeOptions => {\n return {\n ...options,\n treeAdapter: resolveTreeAdapter(options),\n };\n};\n\nconst postSnapshotResponse = (\n event: MessageEvent,\n options: InitInspectorBridgeOptions,\n responseOptions: {\n requestId?: string;\n sessionId?: string;\n },\n requestPayload: {\n includeTree?: boolean;\n includeHtml?: boolean;\n },\n) => {\n const includeTree = requestPayload.includeTree !== false;\n const includeHtml = requestPayload.includeHtml !== false;\n const snapshotCapture = toSnapshotCaptureBlob();\n const treeSnapshot = includeTree\n ? options.treeAdapter === undefined\n ? {\n nodes: [],\n rootIds: [],\n }\n : capTreeSnapshot(options.treeAdapter.getTreeSnapshot())\n : {\n nodes: [],\n rootIds: [],\n };\n const htmlSnapshotPayload = includeHtml ? toSnapshotHtmlPayload() : undefined;\n\n let snapshotPayload: SnapshotPayload = {\n capture: snapshotCapture.blob,\n captureMimeType: SNAPSHOT_CAPTURE_BLOB_MIME_TYPE,\n width: snapshotCapture.width,\n height: snapshotCapture.height,\n capturedAt: Date.now(),\n treeSnapshot: {\n nodes: treeSnapshot.nodes,\n rootIds: treeSnapshot.rootIds,\n ...(treeSnapshot.meta !== undefined && {\n meta: treeSnapshot.meta,\n }),\n },\n ...(htmlSnapshotPayload !== undefined && {\n html: htmlSnapshotPayload.html,\n htmlTruncated: htmlSnapshotPayload.htmlTruncated,\n }),\n };\n\n let snapshotMessage = buildMessage(\n 'SNAPSHOT',\n snapshotPayload,\n responseOptions,\n );\n const initialMessageSizeInBytes =\n measureInspectorMessageSizeInBytes(snapshotMessage);\n\n if (\n snapshotPayload.html !== undefined &&\n (initialMessageSizeInBytes === undefined ||\n initialMessageSizeInBytes > SNAPSHOT_RESPONSE_SOFT_MAX_BYTES)\n ) {\n snapshotPayload = {\n ...snapshotPayload,\n html: undefined,\n htmlTruncated: true,\n };\n snapshotMessage = buildMessage(\n 'SNAPSHOT',\n snapshotPayload,\n responseOptions,\n );\n }\n\n const finalMessageSizeInBytes =\n measureInspectorMessageSizeInBytes(snapshotMessage);\n\n if (\n finalMessageSizeInBytes === undefined ||\n finalMessageSizeInBytes > SNAPSHOT_RESPONSE_SOFT_MAX_BYTES\n ) {\n const oversizeError = createInspectorProtocolError(\n 'ERR_OVERSIZE_MESSAGE',\n `Snapshot response exceeded size budget: maxBytes=${SNAPSHOT_RESPONSE_SOFT_MAX_BYTES}, actualBytes=${finalMessageSizeInBytes ?? 'unavailable'}.`,\n );\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'ERROR',\n {\n code: oversizeError.code,\n message: oversizeError.message,\n details: {\n reason: 'snapshot-response-too-large',\n maxBytes: SNAPSHOT_RESPONSE_SOFT_MAX_BYTES,\n actualBytes:\n finalMessageSizeInBytes === undefined\n ? 'unavailable'\n : finalMessageSizeInBytes,\n },\n },\n responseOptions,\n ),\n );\n return;\n }\n\n postToTarget(event.source, event.origin, snapshotMessage);\n};\n\nconst handleHostMessage = (\n event: MessageEvent,\n options: InitInspectorBridgeOptions,\n highlightElement: (element: Element) => void,\n clearHighlight: () => void,\n callbacks?: HandleHostMessageCallbacks,\n) => {\n const parsed = parseMessage(event.data, {\n sourceOrigin: event.origin,\n trustedOrigins: options.hostOrigins,\n });\n\n if (!parsed.ok) {\n if (parsed.error.code === 'ERR_INVALID_PAYLOAD') {\n const messageContext = readMessageContext(event.data);\n\n emitRejectionLifecycleTelemetry(\n options,\n 'invalid-payload-reject',\n messageContext,\n parsed.error.code,\n );\n }\n\n return;\n }\n\n if (!isHostToEmbeddedMessage(parsed.message)) {\n return;\n }\n\n const responseOptions = {\n requestId: parsed.message.requestId,\n sessionId: parsed.message.sessionId,\n };\n\n if (parsed.message.type === 'HELLO') {\n if (options.security?.enabled === true) {\n const tokenValidationResult = (\n options.security.tokenValidator ?? validateHelloSessionToken\n )(parsed.message.payload.auth);\n\n if (!tokenValidationResult.ok) {\n postUnauthorizedSessionError(\n event,\n options,\n tokenValidationResult,\n responseOptions.requestId,\n responseOptions.sessionId,\n );\n return;\n }\n }\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'READY',\n {\n capabilities: options.capabilities,\n },\n responseOptions,\n ),\n );\n emitEmbeddedBridgeLifecycleMetric(\n {\n stage: 'ready',\n messageType: 'HELLO',\n requestId: responseOptions.requestId,\n sessionId: responseOptions.sessionId,\n },\n options.telemetry,\n );\n callbacks?.onReady?.({\n target: event.source,\n origin: event.origin,\n sessionId: responseOptions.sessionId,\n });\n return;\n }\n\n if (parsed.message.type === 'PING') {\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'PONG',\n {\n sentAt: parsed.message.payload?.sentAt,\n },\n responseOptions,\n ),\n );\n return;\n }\n\n if (parsed.message.type === 'REQUEST_TREE') {\n if (options.treeAdapter === undefined) {\n return;\n }\n\n const treeSnapshot = capTreeSnapshot(options.treeAdapter.getTreeSnapshot());\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'TREE_SNAPSHOT',\n {\n nodes: treeSnapshot.nodes,\n rootIds: treeSnapshot.rootIds,\n ...(treeSnapshot.meta !== undefined && {\n meta: treeSnapshot.meta,\n }),\n },\n responseOptions,\n ),\n );\n return;\n }\n\n if (parsed.message.type === 'REQUEST_NODE_PROPS') {\n const nodeId = parsed.message.payload.nodeId;\n\n if (options.treeAdapter === undefined) {\n postNodeNotFoundError(\n event,\n nodeId,\n responseOptions.requestId,\n responseOptions.sessionId,\n );\n return;\n }\n\n const rawNodeProps = options.treeAdapter.getNodeProps(nodeId);\n\n if (rawNodeProps === undefined) {\n postNodeNotFoundError(\n event,\n nodeId,\n responseOptions.requestId,\n responseOptions.sessionId,\n );\n return;\n }\n\n const serializedNodeProps = serializeNodeProps(rawNodeProps);\n\n postToTarget(\n event.source,\n event.origin,\n buildMessage(\n 'NODE_PROPS',\n {\n nodeId,\n props: serializedNodeProps.props,\n meta: serializedNodeProps.meta,\n },\n responseOptions,\n ),\n );\n\n return;\n }\n\n if (parsed.message.type === 'REQUEST_SNAPSHOT') {\n postSnapshotResponse(\n event,\n options,\n responseOptions,\n parsed.message.payload ?? {},\n );\n return;\n }\n\n if (parsed.message.type === 'HIGHLIGHT_NODE') {\n const nodeId = parsed.message.payload.nodeId;\n\n if (options.treeAdapter === undefined) {\n clearHighlight();\n postNodeNotFoundError(\n event,\n nodeId,\n responseOptions.requestId,\n responseOptions.sessionId,\n );\n return;\n }\n\n const domElement = options.treeAdapter.getDomElement(nodeId);\n\n if (domElement === null) {\n clearHighlight();\n postNodeNotFoundError(\n event,\n nodeId,\n responseOptions.requestId,\n responseOptions.sessionId,\n );\n return;\n }\n\n highlightElement(domElement);\n options.handlers?.onHighlightNode?.(parsed.message);\n return;\n }\n\n if (parsed.message.type === 'CLEAR_HIGHLIGHT') {\n clearHighlight();\n options.handlers?.onClearHighlight?.(parsed.message);\n }\n};\n\nconst shouldEnableBridge = (options: InitInspectorBridgeOptions): boolean => {\n if (options.killSwitchActive === true) {\n return false;\n }\n\n if (!options.enabled) {\n return false;\n }\n\n if (options.mode === 'production') {\n return false;\n }\n\n return options.hostOrigins.length > 0;\n};\n\nexport const initInspectorBridge = (\n options: InitInspectorBridgeOptions,\n): InspectorBridge => {\n if (activeBridge !== undefined) {\n activeBridge.destroy();\n }\n\n if (!shouldEnableBridge(options)) {\n if (options.killSwitchActive === true) {\n console.warn(\n '[react-inspector-bridge] Embedded inspector bridge disabled by kill switch.',\n );\n }\n\n activeBridge = {\n destroy: () => {\n activeBridge = undefined;\n },\n };\n return activeBridge;\n }\n\n const resolvedOptions = resolveInitOptions(options);\n const highlighter = createInspectorHighlighter();\n const selectionApi: EmbeddedReactInspectorSelectionApi = {\n getReactComponentPathForElement: (element: Element) => {\n return resolvedOptions.treeAdapter?.getReactComponentPathForElement?.(\n element,\n );\n },\n };\n let hostReadyConnection: HostReadyConnection | undefined = undefined;\n let pendingTreeRefreshTimeout:\n | number\n | ReturnType<typeof setTimeout>\n | undefined = undefined;\n let pendingTreeFollowUpRefreshTimeout:\n | number\n | ReturnType<typeof setTimeout>\n | undefined = undefined;\n\n const postPreviewPathUpdate = () => {\n if (hostReadyConnection === undefined) {\n return;\n }\n\n const pathname =\n window.location.pathname.length > 0 ? window.location.pathname : '/';\n const nextPath = `${pathname}${window.location.search}${window.location.hash}`;\n\n postRawToTarget(hostReadyConnection.target, hostReadyConnection.origin, {\n channel: PREVIEW_PATH_CHANNEL,\n type: PREVIEW_PATH_UPDATED_TYPE,\n path: nextPath,\n });\n };\n\n const clearPendingTreeRefreshTimeout = () => {\n if (pendingTreeRefreshTimeout === undefined) {\n return;\n }\n\n clearTimeout(pendingTreeRefreshTimeout);\n pendingTreeRefreshTimeout = undefined;\n };\n\n const clearPendingTreeFollowUpRefreshTimeout = () => {\n if (pendingTreeFollowUpRefreshTimeout === undefined) {\n return;\n }\n\n clearTimeout(pendingTreeFollowUpRefreshTimeout);\n pendingTreeFollowUpRefreshTimeout = undefined;\n };\n\n const postRefreshedTreeSnapshot = () => {\n if (\n resolvedOptions.treeAdapter === undefined ||\n hostReadyConnection === undefined\n ) {\n return;\n }\n\n const treeSnapshot = capTreeSnapshot(\n resolvedOptions.treeAdapter.getTreeSnapshot(),\n );\n\n postToTarget(\n hostReadyConnection.target,\n hostReadyConnection.origin,\n buildMessage(\n 'TREE_SNAPSHOT',\n {\n nodes: treeSnapshot.nodes,\n rootIds: treeSnapshot.rootIds,\n ...(treeSnapshot.meta !== undefined && {\n meta: treeSnapshot.meta,\n }),\n },\n {\n sessionId: hostReadyConnection.sessionId,\n },\n ),\n );\n };\n\n const scheduleTreeRefreshAfterNavigation = () => {\n if (\n resolvedOptions.treeAdapter === undefined ||\n hostReadyConnection === undefined\n ) {\n return;\n }\n\n clearPendingTreeRefreshTimeout();\n clearPendingTreeFollowUpRefreshTimeout();\n pendingTreeRefreshTimeout = setTimeout(() => {\n pendingTreeRefreshTimeout = undefined;\n postRefreshedTreeSnapshot();\n }, TREE_NAVIGATION_REFRESH_DEBOUNCE_MS);\n pendingTreeFollowUpRefreshTimeout = setTimeout(() => {\n pendingTreeFollowUpRefreshTimeout = undefined;\n postRefreshedTreeSnapshot();\n }, TREE_NAVIGATION_FOLLOW_UP_REFRESH_DELAY_MS);\n };\n\n const handleNavigation = () => {\n postPreviewPathUpdate();\n scheduleTreeRefreshAfterNavigation();\n };\n\n const originalPushState = window.history.pushState.bind(window.history);\n const originalReplaceState = window.history.replaceState.bind(window.history);\n\n const patchedPushState: History['pushState'] = (...args) => {\n originalPushState(...args);\n handleNavigation();\n };\n\n const patchedReplaceState: History['replaceState'] = (...args) => {\n originalReplaceState(...args);\n handleNavigation();\n };\n\n window.history.pushState = patchedPushState;\n window.history.replaceState = patchedReplaceState;\n window.addEventListener('popstate', handleNavigation);\n window.addEventListener('hashchange', handleNavigation);\n window.__ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__ = selectionApi;\n\n const onMessage = (event: MessageEvent) => {\n if (!isOriginTrusted(event.origin, resolvedOptions.hostOrigins)) {\n if (isInspectorChannelCandidate(event.data)) {\n const messageContext = readMessageContext(event.data);\n\n emitRejectionLifecycleTelemetry(\n resolvedOptions,\n 'origin-reject',\n messageContext,\n 'ERR_INVALID_ORIGIN',\n );\n }\n\n return;\n }\n\n if (!isInspectorChannelCandidate(event.data)) {\n return;\n }\n\n const inboundMessageSizeResult = evaluateEmbeddedInboundMessageSize(\n event.data,\n );\n\n if (!inboundMessageSizeResult.ok) {\n postOversizeMessageError(\n event,\n resolvedOptions,\n inboundMessageSizeResult,\n );\n return;\n }\n\n handleHostMessage(\n event,\n resolvedOptions,\n highlighter.highlightElement,\n highlighter.clearHighlight,\n {\n onReady: (connection) => {\n hostReadyConnection = connection;\n postPreviewPathUpdate();\n },\n },\n );\n };\n\n window.addEventListener('message', onMessage);\n emitEmbeddedBridgeLifecycleMetric(\n {\n stage: 'connect',\n },\n resolvedOptions.telemetry,\n );\n\n activeBridge = {\n destroy: () => {\n window.removeEventListener('message', onMessage);\n window.removeEventListener('popstate', handleNavigation);\n window.removeEventListener('hashchange', handleNavigation);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n clearPendingTreeRefreshTimeout();\n clearPendingTreeFollowUpRefreshTimeout();\n hostReadyConnection = undefined;\n highlighter.destroy();\n\n if (window.__ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__ === selectionApi) {\n delete window.__ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__;\n }\n\n if (activeBridge !== undefined) {\n activeBridge = undefined;\n }\n },\n };\n\n return activeBridge;\n};\n\nexport const destroyInspectorBridge = () => {\n if (activeBridge === undefined) {\n return;\n }\n\n activeBridge.destroy();\n};\n"],"names":["MAX_TREE_SNAPSHOT_NODE_COUNT","toUniqueNodeById","nodes","nodeById","node","toTraversalSeedNodeIds","snapshot","seedNodeIds","seenSeedNodeIds","appendSeedNodeId","nodeId","rootId","toTruncatedNodes","includedNodeIdSet","emittedNodeIds","childId","toTruncatedRootIds","truncatedNodes","includedNodeById","includedRootIds","seenRootIds","includedNode","capTreeSnapshot","maxNodeCount","totalNodeCount","traversalQueue","visitedNodeIds","includedNodeIds","queueIndex","truncatedRootIds","includedNodeCount","resolveNodeLookup","createBaseReactInspectorAdapter","options","lookup","defaultReactInspectorAdapterCapabilities","defaultReactInspectorRuntimeConfig","resolveCapabilities","capabilities","resolveReactInspectorRuntimeConfig","runtimeConfig","INSPECTOR_SOURCE_ATTRIBUTE","INSPECTOR_SOURCE_FILE_ATTRIBUTE","INSPECTOR_SOURCE_LINE_ATTRIBUTE","INSPECTOR_SOURCE_COLUMN_ATTRIBUTE","SOURCE_LOCATION_PATTERN","isRecord","value","toNormalizedFile","trimmedValue","toNormalizedPositiveInteger","parsedValue","toSourceFromLocationString","locationMatch","file","line","column","normalizeTreeNodeSource","toSourceFromSourceAttribute","sourceValue","source","normalizedColumn","getNormalizedTreeNodeSourceFromElement","element","sourceAttribute","sourceFromAttribute","sourceFile","sourceLine","sourceColumn","INSPECTOR_NODE_ID_ATTRIBUTE","INSPECTOR_DISPLAY_NAME_ATTRIBUTE","CRA_ROOT_ID","LEGACY_REACT_ROOT_ATTRIBUTE","CRA_ROOT_NODE_ID","CRA_LEGACY_ROOT_NODE_ID","MAX_TEXT_PREVIEW_LENGTH","toDisplayName","explicitDisplayName","_a","displayNameFromNodeId","segment","getExplicitNodeIdFromElement","toTreeCandidates","doc","explicitInspectorNodes","craRoot","legacyReactRoot","resolveNodeIdForCandidate","explicitNodeId","buildTreeModel","nodeElementById","nodesById","parentInspectorElement","parentNodeId","parentNode","rootIds","toTextPreview","rawText","toNodeProps","props","classList","textPreview","role","ariaLabel","hasExplicitNodeId","createCraReactInspectorAdapter","latestTreeModel","captureTreeModel","getLatestElementByNodeId","hostComponentTag","readRecordValue","record","key","toFiber","toFiberTag","fiber","tag","toElement","readHostFiberElement","readChildFiber","readSiblingFiber","findFirstHostDescendantElement","entryFiber","firstChildFiber","stack","visitedFibers","currentFiber","currentElement","siblingFiber","childFiber","resolveFiberHighlightTarget","lookupPayload","directHostElement","FNV_32_OFFSET_BASIS","FNV_32_PRIME","NODE_ID_PREFIX","COLLISION_SUFFIX_SEPARATOR","createSessionState","toFiberRef","readFiberRefValue","fiberRef","toAlternateFiberRef","toStableHash","hash","index","toFiberNodeIdentitySignature","toBaseNodeId","signature","parentHash","toUniqueNodeId","state","baseNodeId","collisionIndex","candidateNodeId","storeNodeIdMapping","alternateFiberRef","resolveNodeIdByFiberFamily","nodeIdFromFiberRef","createFiberNodeIdentityAllocator","records","nodeIdByRecordKey","allocatedNodeIdsInSnapshot","nodeIdsReservedForExistingFiberRefs","nodeIdFromFiberFamily","tryAssignNodeId","assignedNodeIdFromFiberFamily","nodeIdFromRecordKey","assignedNodeIdFromRecordKey","REACT_FIBER_POINTER_PREFIXES","toChildNodeIds","childKeys","childNodeIds","seenChildNodeIds","childKey","childNodeId","toParentNodeId","readAlternateFiber","readReturnFiber","readFiberFromManagedElement","prefix","resolveFiberFromElement","current","buildComponentPath","componentPath","currentNodeId","currentNode","createFiberNodeLookup","payloadByNodeId","nodeIdByFiberRef","nextPayloadByNodeId","nextNodeIdByFiberRef","nextNodeById","alternateFiber","readFiberNodeProps","memoizedProps","hasObjectTag","tagName","isReadonlyMap","isReadonlyArray","isReadonlySet","isPlainObject","readPlainObjectValues","readPlainObjectEntries","resolveWindowRef","windowRef","readDevtoolsHook","toRendererId","parsedRendererId","toRendererEntries","rendererIdCandidate","renderer","rendererId","toRendererRefs","renderers","rendererRefs","leftRenderer","rightRenderer","isRootSet","toRoots","discoverFiberRoots","hookValue","hookRecord","fiberRootsReader","roots","rendererRef","rootsValue","rootsFromRenderer","root","error","toDebugSource","debugSource","toBestEffortFile","toBestEffortLine","toBestEffortColumn","readFiberNodeSource","fiberValue","REACT_FORWARD_REF_TYPE","REACT_MEMO_TYPE","FIBER_NODE_TAG","toNonEmptyString","normalized","toFunctionDisplayName","functionRecord","resolveDisplayNameFromType","typeValue","seenTypeValues","functionDisplayName","fiberType","fiberTypeKind","renderDisplayName","wrappedDisplayName","resolveFiberDisplayName","displayName","toFiberKindTag","fiberTag","toFiberTags","toIncludedRecords","includedRecords","includedRecordByKey","includedNodeIdByRecordKey","seenNodeIds","toParentRecordKeyByRecordKey","parentRecordKeyByRecordKey","parentKey","toChildRecordKeysByParentKey","childRecordKeysByParentKey","appendChildRecordKey","existingChildren","toNodes","parentId","childrenIds","toRootIds","traversalResult","appendRootId","recordKey","rootRecordKey","toTraversalMeta","mapFiberTraversalToTreeSnapshot","meta","componentFiberTagSet","MAX_ROOT_DISCOVERY_DEPTH","ROOT_WRAPPER_KEYS","DEFAULT_FIBER_TRAVERSAL_BUDGET","toNonNegativeInteger","fallback","resolveTraversalBudget","budget","traversalStepCount","exhaustedBy","createEmptyTraversalResult","readRecordValues","tagValue","hasTraversableFiberLinks","isFiberLike","toRootFiberFromRecord","seen","depth","wrapperKey","candidate","toRootFiberFromValue","childValue","isComponentFiber","toRootFiber","rootRef","toSortedRoots","sourceIndex","leftRoot","rightRoot","entry","toTraversalRecordKey","toChildFibers","children","seenSiblingFibers","siblingCursor","traverseFiberRoots","recordsByKey","rootRecordKeys","seenRootRecordKeys","resolvedBudget","orderedRoots","nextRootIndexByRenderer","rootFiber","rendererRootIndex","nextParentRecordKey","entryTag","parentRecord","childFibers","childIndex","traverseDiscoveredFiberRoots","discoveryResult","emitSnapshotDiagnostics","diagnostics","emit","createFiberReactInspectorAdapter","nodeIdentityAllocator","nodeLookup","refreshSnapshotState","nodeIdentityResult","resolveLookupPayload","NEXT_APP_ROUTER_BOUNDARY_ATTRIBUTE","NEXT_PAGES_ROOT_ID","NEXT_PAGES_ROOT_NODE_ID","NEXT_APP_ROUTER_ROOT_NODE_ID","GENERATED_NODE_ID_PREFIX","isNextAppRouterBoundary","toElementPath","segments","cursor","parentElement","siblingIndex","child","toGeneratedNodeId","reservedNodeIds","path","existingNodeId","generatedNodeId","nextPagesRoot","nextAppRouterBoundary","createNextReactInspectorAdapter","FALLBACK_ROOT_NODE_ID","rootElement","createViteReactInspectorAdapter","EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION","EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE","EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION","EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK","embeddedBridgeTelemetryMetricNames","embeddedBridgeLifecycleStages","embeddedBridgeRejectionReasonCodes","embeddedBridgeFiberFallbackReasonCodes","embeddedBridgeFiberFallbackAdapterTargets","safeEmit","metric","emitEmbeddedBridgeLifecycleMetric","hooks","structuredMetric","emitEmbeddedBridgeRejectionMetric","emitEmbeddedBridgeFiberFallbackMetric","emptyTreeSnapshot","createNoopAdapter","hasNonEmptyTreeSnapshot","resolveLikelyTagAdapterTarget","createTagAdapter","target","toTagFallbackTargets","preferredTarget","fallbackTargets","orderedTargets","candidateTarget","toSafeTreeSnapshot","adapter","resolveFiberFallbackAdapter","fallbackTarget","fallbackAdapter","fallbackSnapshot","toFiberFallbackReasonCode","fiberSnapshot","createFiberAdapterWithFallback","latestFiberSnapshotDiagnostics","lastFallbackMetricSignature","fiberAdapter","activeAdapter","pendingSnapshot","emitFiberFallbackMetric","reasonCode","fallbackAdapterTarget","metricSignature","resolveAdapter","fallbackResolution","fallbackReasonCode","nextSnapshot","createReactInspectorAdapter","resolvedRuntimeConfig","HIGHLIGHT_OVERLAY_ATTRIBUTE","toPx","createOverlay","overlay","createInspectorHighlighter","ensureOverlay","targetRect","activeOverlay","defaultEmbeddedInspectorSecurityEventLogger","event","unauthorizedReasonCodeByReason","mapTokenValidationRejectionToSecurityReasonCode","reason","emitEmbeddedInspectorSecurityRejectionEvent","logger","structuredEvent","INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION","INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED","EMBEDDED_MAX_INBOUND_INSPECTOR_MESSAGE_BYTES","EMBEDDED_OVERSIZE_MESSAGE_REASON","embeddedInboundMessageSizePolicy","textEncoder","MAX_INSPECTOR_MESSAGE_SIZE_TRAVERSAL_DEPTH","prototype","measureValueSizeInBytes","branchObjects","totalSizeInBytes","entrySizeInBytes","measureInspectorMessageSizeInBytes","message","evaluateEmbeddedInboundMessageSize","policy","sizeInBytes","EPOCH_MILLISECONDS_THRESHOLD","toEpochMilliseconds","timestamp","validateHelloSessionToken","auth","expiresAt","sensitiveKeyMatchers","sensitiveKeyPattern","redactedValuePreview","isSensitivePropKey","defaultMaxDepth","defaultMaxKeys","isDomNode","createPlaceholder","type","preview","appendObjectPath","appendArrayPath","pushDroppedKey","context","pushRedactedPath","serializeDatePreview","serializeErrorPreview","serializeDomPreview","toUnserializableObjectPreview","constructorName","isSpecialObject","captureDroppedPaths","droppedPaths","fallbackPath","boundedDroppedPaths","droppedPath","serializeObject","result","keys","keysToSerialize","childPath","serializeValue","serializeArray","itemsToSerialize","_","toNodePropsMeta","createSerializeContext","maxDepth","maxKeys","serializeNodeProps","input","PREVIEW_PATH_CHANNEL","PREVIEW_PATH_UPDATED_TYPE","TREE_NAVIGATION_REFRESH_DEBOUNCE_MS","TREE_NAVIGATION_FOLLOW_UP_REFRESH_DELAY_MS","hostMessageTypeSet","activeBridge","isHostToEmbeddedMessage","toMessageTarget","postRawToTarget","targetOrigin","eventTarget","postToTarget","postNodeNotFoundError","requestId","sessionId","nodeNotFoundError","createInspectorProtocolError","buildMessage","SNAPSHOT_RESPONSE_SOFT_MAX_BYTES","SNAPSHOT_CAPTURE_BLOB_MIME_TYPE","toSnapshotCaptureBlob","placeholderMarkup","toSnapshotHtmlPayload","postUnauthorizedSessionError","validationError","unauthorizedSessionError","emitRejectionLifecycleTelemetry","toRawMessageObject","rawMessage","parsedMessage","readMessageContext","messageObject","postOversizeMessageError","failure","messageContext","responseContext","actualBytes","oversizeError","mapOversizeRejectionReasonToSecurityReasonCode","isInspectorChannelCandidate","INSPECTOR_CHANNEL","errorCode","resolveTreeAdapter","resolveInitOptions","postSnapshotResponse","responseOptions","requestPayload","includeTree","includeHtml","snapshotCapture","treeSnapshot","htmlSnapshotPayload","snapshotPayload","snapshotMessage","initialMessageSizeInBytes","finalMessageSizeInBytes","handleHostMessage","highlightElement","clearHighlight","callbacks","parsed","parseMessage","tokenValidationResult","_b","_c","rawNodeProps","serializedNodeProps","domElement","_e","_d","_g","_f","shouldEnableBridge","initInspectorBridge","resolvedOptions","highlighter","selectionApi","hostReadyConnection","pendingTreeRefreshTimeout","pendingTreeFollowUpRefreshTimeout","postPreviewPathUpdate","nextPath","clearPendingTreeRefreshTimeout","clearPendingTreeFollowUpRefreshTimeout","postRefreshedTreeSnapshot","scheduleTreeRefreshAfterNavigation","handleNavigation","originalPushState","originalReplaceState","patchedPushState","args","patchedReplaceState","onMessage","isOriginTrusted","inboundMessageSizeResult","connection","destroyInspectorBridge"],"mappings":"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"}