@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.
- package/README.md +168 -0
- package/dist/adapters/base/baseAdapter.d.ts +24 -0
- package/dist/adapters/base/createReactInspectorAdapter.d.ts +6 -0
- package/dist/adapters/base/index.d.ts +4 -0
- package/dist/adapters/base/runtimeConfig.d.ts +4 -0
- package/dist/adapters/base/sourceMetadata.d.ts +3 -0
- package/dist/adapters/base/types.d.ts +23 -0
- package/dist/adapters/cra/craAdapter.d.ts +6 -0
- package/dist/adapters/cra/index.d.ts +3 -0
- package/dist/adapters/fiber/fiberAdapter.d.ts +9 -0
- package/dist/adapters/fiber/highlightTarget.d.ts +2 -0
- package/dist/adapters/fiber/index.d.ts +3 -0
- package/dist/adapters/fiber/nodeIdentity.d.ts +14 -0
- package/dist/adapters/fiber/nodeLookup.d.ts +23 -0
- package/dist/adapters/fiber/props.d.ts +2 -0
- package/dist/adapters/fiber/rootDiscovery.d.ts +2 -0
- package/dist/adapters/fiber/source.d.ts +2 -0
- package/dist/adapters/fiber/spike/devtoolsProbe.d.ts +2 -0
- package/dist/adapters/fiber/spike/displayName.d.ts +1 -0
- package/dist/adapters/fiber/spike/fallbackDecision.d.ts +26 -0
- package/dist/adapters/fiber/spike/fiberTraversal.d.ts +12 -0
- package/dist/adapters/fiber/spike/types.d.ts +35 -0
- package/dist/adapters/fiber/traversal.d.ts +31 -0
- package/dist/adapters/fiber/treeMapping.d.ts +8 -0
- package/dist/adapters/fiber/types.d.ts +35 -0
- package/dist/adapters/next/index.d.ts +3 -0
- package/dist/adapters/next/nextAdapter.d.ts +6 -0
- package/dist/adapters/vite/index.d.ts +3 -0
- package/dist/adapters/vite/viteAdapter.d.ts +6 -0
- package/dist/bridgeRuntime.d.ts +37 -0
- package/dist/bridgeRuntime.js +7 -0
- package/dist/bridgeRuntime.js.map +1 -0
- package/dist/chunks/bridgeRuntime-Da4khSK2.js +2278 -0
- package/dist/chunks/bridgeRuntime-Da4khSK2.js.map +1 -0
- package/dist/chunks/embeddedBootstrap-v-MS8cPB.js +358 -0
- package/dist/chunks/embeddedBootstrap-v-MS8cPB.js.map +1 -0
- package/dist/devtoolsInlineBackendHook.d.ts +5 -0
- package/dist/embeddedBootstrap.d.ts +24 -0
- package/dist/embeddedBootstrap.js +7 -0
- package/dist/embeddedBootstrap.js.map +1 -0
- package/dist/embeddedRuntimeTelemetry.d.ts +34 -0
- package/dist/highlighter.d.ts +6 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/iterationInspector/index.d.ts +2 -0
- package/dist/iterationInspector/runtime.d.ts +23 -0
- package/dist/iterationInspector/types.d.ts +74 -0
- package/dist/iterationInspector.js +708 -0
- package/dist/iterationInspector.js.map +1 -0
- package/dist/reactDevtoolsInlineBackend.d.ts +7 -0
- package/dist/reactTreeAdapter.d.ts +3 -0
- package/dist/security/bridgeTelemetry.d.ts +50 -0
- package/dist/security/inspectorSecurityEvents.d.ts +18 -0
- package/dist/security/messageSizePolicy.d.ts +19 -0
- package/dist/security/redactionPolicy.d.ts +2 -0
- package/dist/security/tokenValidation.d.ts +15 -0
- package/dist/serializer.d.ts +10 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterationInspector.js","sources":["../src/iterationInspector/types.ts","../src/iterationInspector/runtime.ts"],"sourcesContent":["export const ITERATION_INSPECTOR_CHANNEL = 'itera:iteration-inspector';\n\nexport type IterationElementBounds = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\n\nexport type IterationScrollOffset = {\n x: number;\n y: number;\n};\n\nexport type IterationElementLocator = {\n urlPath: string;\n cssSelector: string;\n domPath: string;\n tagName: string;\n role: string | null;\n accessibleName: string | null;\n textPreview: string | null;\n id: string | null;\n dataTestId: string | null;\n bounds: IterationElementBounds;\n scrollOffset: IterationScrollOffset;\n capturedAt: string;\n reactComponentPath?: ReadonlyArray<string>;\n};\n\nexport type IterationElementSelection = {\n displayText: string;\n element: IterationElementLocator;\n};\n\nexport type IterationInspectorInvalidationReason =\n | 'reload'\n | 'route_change'\n | 'node_detached';\n\nexport type IterationInspectorSelectionMode = 'single' | 'persistent';\n\nexport type IterationInspectorDebugDetails = Record<string, unknown>;\n\ntype IterationInspectorParentMessageDebugConfig = {\n debugEnabled?: boolean;\n debugSessionId?: string;\n};\n\nexport type IterationInspectorParentMessage =\n | ({\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'enter_select_mode';\n selectionMode?: IterationInspectorSelectionMode;\n } & IterationInspectorParentMessageDebugConfig)\n | ({\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'exit_select_mode';\n } & IterationInspectorParentMessageDebugConfig)\n | ({\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'clear_hover';\n } & IterationInspectorParentMessageDebugConfig);\n\nexport type IterationInspectorRuntimeMessage =\n | {\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'runtime_ready';\n urlPath: string;\n }\n | {\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'mode_changed';\n active: boolean;\n }\n | {\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'element_selected';\n selection: IterationElementSelection;\n }\n | {\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'selection_invalidated';\n reason: IterationInspectorInvalidationReason;\n }\n | {\n channel: typeof ITERATION_INSPECTOR_CHANNEL;\n kind: 'debug_log';\n event: string;\n sessionId?: string;\n details?: IterationInspectorDebugDetails;\n };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nexport const isIterationInspectorParentMessage = (\n value: unknown,\n): value is IterationInspectorParentMessage => {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.channel !== ITERATION_INSPECTOR_CHANNEL) {\n return false;\n }\n\n return (\n value.kind === 'enter_select_mode' ||\n value.kind === 'exit_select_mode' ||\n value.kind === 'clear_hover'\n );\n};\n\nexport const isIterationInspectorRuntimeMessage = (\n value: unknown,\n): value is IterationInspectorRuntimeMessage => {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.channel !== ITERATION_INSPECTOR_CHANNEL) {\n return false;\n }\n\n return (\n value.kind === 'runtime_ready' ||\n value.kind === 'mode_changed' ||\n value.kind === 'element_selected' ||\n value.kind === 'selection_invalidated' ||\n value.kind === 'debug_log'\n );\n};\n","import {\n ITERATION_INSPECTOR_CHANNEL,\n IterationElementBounds,\n IterationElementSelection,\n type IterationInspectorDebugDetails,\n IterationInspectorInvalidationReason,\n type IterationInspectorSelectionMode,\n IterationInspectorRuntimeMessage,\n isIterationInspectorParentMessage,\n} from './types';\n\ntype CreateIterationInspectorRuntimeArgs = {\n allowSelfMessaging?: boolean;\n win?: Window;\n doc?: Document;\n};\n\ntype OverlayElements = {\n root: HTMLDivElement;\n selectedBox: HTMLDivElement;\n selectedLabel: HTMLDivElement;\n hoverBox: HTMLDivElement;\n hoverLabel: HTMLDivElement;\n};\n\ntype PointerCoordinates = {\n clientX: number;\n clientY: number;\n};\n\ntype PendingPointerSelection = {\n pointerId: number;\n origin: PointerCoordinates;\n};\n\ntype InspectableTarget =\n | {\n kind: 'element';\n element: Element;\n }\n | {\n kind: 'text';\n element: Element;\n textNode: Text;\n };\n\ntype AccessibleNameOptions = {\n includeTextFallback?: boolean;\n};\n\ntype RuntimeLifecycleReason =\n | 'command'\n | 'selection'\n | 'route_change'\n | 'reload';\n\ntype SelectionSource = 'click' | 'pointerup';\n\nexport type IterationInspectorRuntime = {\n start: () => void;\n stop: () => void;\n isActive: () => boolean;\n};\n\ndeclare global {\n interface Window {\n __ITERA_ITERATION_INSPECTOR_RUNTIME__?: IterationInspectorRuntime;\n __ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__?: {\n getReactComponentPathForElement: (\n element: Element,\n ) => ReadonlyArray<string> | undefined;\n };\n }\n}\n\nconst OVERLAY_ROOT_ID = 'itera-iteration-inspector-overlay-root';\nconst OVERLAY_Z_INDEX = '2147483647';\nconst DEFAULT_LABEL = 'Select an element';\nconst SELECTED_OVERLAY_BORDER_COLOR = '#14b8a6';\nconst SELECTED_OVERLAY_BACKGROUND_COLOR = 'rgba(20, 184, 166, 0.08)';\nconst SELECTED_LABEL_BACKGROUND_COLOR = '#115e59';\nconst HOVER_OVERLAY_BORDER_COLOR = '#2563eb';\nconst HOVER_OVERLAY_BACKGROUND_COLOR = 'rgba(37, 99, 235, 0.08)';\nconst HOVER_LABEL_BACKGROUND_COLOR = '#1d4ed8';\nconst POINTER_TAP_MAX_DISTANCE_PX = 8;\nconst TEXT_MAX_LENGTH = 120;\nconst SEMANTIC_INSPECTABLE_ELEMENT_TAG_NAMES = new Set([\n 'button',\n 'input',\n 'textarea',\n 'select',\n]);\nconst INSPECTABLE_ELEMENT_TAG_NAMES = new Set([\n ...SEMANTIC_INSPECTABLE_ELEMENT_TAG_NAMES,\n 'div',\n 'img',\n]);\n\nconst normalizeWhitespace = (value: string | null | undefined) => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const normalized = value.replaceAll(/\\s+/g, ' ').trim();\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (normalized.length <= TEXT_MAX_LENGTH) {\n return normalized;\n }\n\n return `${normalized.slice(0, TEXT_MAX_LENGTH - 3)}...`;\n};\n\nconst escapeCssIdentifier = (value: string) =>\n value.replaceAll(/([ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n\nconst roundMeasurement = (value: number) => Math.round(value * 100) / 100;\n\nconst buildBoundsFromRect = (\n rect: Pick<DOMRectReadOnly, 'top' | 'left' | 'width' | 'height'>,\n): IterationElementBounds => ({\n top: roundMeasurement(rect.top),\n left: roundMeasurement(rect.left),\n width: roundMeasurement(rect.width),\n height: roundMeasurement(rect.height),\n});\n\nconst isPointWithinRect = (\n rect: Pick<DOMRectReadOnly, 'top' | 'left' | 'width' | 'height'>,\n coordinates: PointerCoordinates,\n) =>\n coordinates.clientX >= rect.left &&\n coordinates.clientX <= rect.left + rect.width &&\n coordinates.clientY >= rect.top &&\n coordinates.clientY <= rect.top + rect.height;\n\nconst getUrlPath = (locationLike: Location) =>\n `${locationLike.pathname}${locationLike.search}${locationLike.hash}`;\n\nconst getNodeText = (element: Element) => {\n if (\n element instanceof HTMLTextAreaElement ||\n (element instanceof HTMLInputElement &&\n !['button', 'submit', 'reset'].includes(\n element.type.toLowerCase() || 'text',\n ))\n ) {\n return null;\n }\n\n const text =\n element instanceof HTMLElement && typeof element.innerText === 'string'\n ? element.innerText\n : element.textContent;\n\n return normalizeWhitespace(text);\n};\n\nconst getDataTestId = (element: Element) =>\n normalizeWhitespace(\n element.getAttribute('data-testid') ??\n element.getAttribute('data-test-id') ??\n element.getAttribute('data-cy'),\n );\n\nconst inferRole = (element: Element): string | null => {\n const explicitRole = normalizeWhitespace(element.getAttribute('role'));\n\n if (explicitRole !== null) {\n return explicitRole;\n }\n\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === 'button') {\n return 'button';\n }\n\n if (tagName === 'a' && element.hasAttribute('href')) {\n return 'link';\n }\n\n if (tagName === 'textarea') {\n return 'textbox';\n }\n\n if (tagName === 'select') {\n return 'combobox';\n }\n\n if (tagName === 'img') {\n return 'img';\n }\n\n if (tagName === 'input') {\n const inputType = element.getAttribute('type')?.toLowerCase() ?? 'text';\n\n if (\n inputType === 'button' ||\n inputType === 'submit' ||\n inputType === 'reset'\n ) {\n return 'button';\n }\n\n if (\n inputType === 'checkbox' ||\n inputType === 'radio' ||\n inputType === 'range'\n ) {\n return inputType;\n }\n\n return 'textbox';\n }\n\n return null;\n};\n\nconst getAssociatedLabelText = (element: Element, doc: Document) => {\n if (\n !(element instanceof HTMLInputElement) &&\n !(element instanceof HTMLTextAreaElement) &&\n !(element instanceof HTMLSelectElement) &&\n !(element instanceof HTMLMeterElement) &&\n !(element instanceof HTMLProgressElement)\n ) {\n return null;\n }\n\n if (element.labels !== null && element.labels.length > 0) {\n return normalizeWhitespace(\n Array.from(element.labels)\n .map((label) => label.textContent ?? '')\n .join(' '),\n );\n }\n\n if (element.id.length === 0) {\n return null;\n }\n\n return normalizeWhitespace(\n doc.querySelector(`label[for=\"${escapeCssIdentifier(element.id)}\"]`)\n ?.textContent ?? null,\n );\n};\n\nconst getAccessibleName = (\n element: Element,\n doc: Document,\n options: AccessibleNameOptions = {},\n) => {\n const { includeTextFallback = true } = options;\n const ariaLabel = normalizeWhitespace(element.getAttribute('aria-label'));\n\n if (ariaLabel !== null) {\n return ariaLabel;\n }\n\n const labelledBy = element.getAttribute('aria-labelledby');\n\n if (labelledBy !== null) {\n const ids = labelledBy\n .split(/\\s+/)\n .map((value) => value.trim())\n .filter(Boolean);\n\n const labelText = normalizeWhitespace(\n ids.map((id) => doc.getElementById(id)?.textContent ?? '').join(' '),\n );\n\n if (labelText !== null) {\n return labelText;\n }\n }\n\n const altText = normalizeWhitespace(element.getAttribute('alt'));\n\n if (altText !== null) {\n return altText;\n }\n\n const titleText = normalizeWhitespace(element.getAttribute('title'));\n\n if (titleText !== null) {\n return titleText;\n }\n\n const placeholderText = normalizeWhitespace(\n element.getAttribute('placeholder'),\n );\n\n if (placeholderText !== null) {\n return placeholderText;\n }\n\n const associatedLabelText = getAssociatedLabelText(element, doc);\n\n if (associatedLabelText !== null) {\n return associatedLabelText;\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const valueText =\n element instanceof HTMLInputElement &&\n ['button', 'submit', 'reset'].includes(\n element.type.toLowerCase() || 'text',\n )\n ? normalizeWhitespace(element.value)\n : null;\n\n if (valueText !== null) {\n return valueText;\n }\n }\n\n if (!includeTextFallback) {\n return null;\n }\n\n return getNodeText(element);\n};\n\nconst shouldUseTextFallbackForHoverLabel = (element: Element) => {\n if (\n element instanceof HTMLButtonElement ||\n element instanceof HTMLAnchorElement ||\n element instanceof HTMLLabelElement ||\n element instanceof HTMLOptionElement\n ) {\n return true;\n }\n\n if (\n element instanceof HTMLInputElement &&\n ['button', 'submit', 'reset'].includes(element.type.toLowerCase() || 'text')\n ) {\n return true;\n }\n\n return element.children.length === 0;\n};\n\nconst getDisplayLabel = (\n element: Element,\n doc: Document,\n options: AccessibleNameOptions = {},\n) => getAccessibleName(element, doc, options);\n\nconst buildIterationElementDisplayText = (\n element: Element,\n doc: Document,\n options: AccessibleNameOptions = {},\n) => {\n const tagName = element.tagName.toLowerCase();\n const roleOrTag = inferRole(element) ?? tagName;\n const sanitizedLabel = getDisplayLabel(element, doc, options)?.replaceAll(\n '\"',\n \"'\",\n );\n\n if (sanitizedLabel === null || sanitizedLabel === undefined) {\n return `@${roleOrTag}`;\n }\n\n return `@${roleOrTag} \"${sanitizedLabel}\"`;\n};\n\nconst buildTextDisplayText = (textContent: string | null) => {\n const sanitizedLabel = textContent?.replaceAll('\"', \"'\");\n\n if (sanitizedLabel === null || sanitizedLabel === undefined) {\n return '@text';\n }\n\n return `@text \"${sanitizedLabel}\"`;\n};\n\nconst getPathSegment = (element: Element) => {\n const tagName = element.tagName.toLowerCase();\n const siblings = Array.from(element.parentElement?.children ?? []).filter(\n (sibling) => sibling.tagName === element.tagName,\n );\n const index = siblings.indexOf(element) + 1;\n\n return `${tagName}:nth-of-type(${Math.max(index, 1)})`;\n};\n\nconst buildCssSelector = (element: Element) => {\n if (element.id.length > 0) {\n return `${element.tagName.toLowerCase()}#${escapeCssIdentifier(element.id)}`;\n }\n\n const dataTestId = getDataTestId(element);\n\n if (dataTestId !== null) {\n return `${element.tagName.toLowerCase()}[data-testid=\"${dataTestId.replaceAll('\"', '\\\\\"')}\"]`;\n }\n\n const segments: string[] = [];\n let current: Element | null = element;\n\n while (current !== null && current.tagName.toLowerCase() !== 'html') {\n segments.unshift(getPathSegment(current));\n current = current.parentElement;\n }\n\n return ['html', ...segments].join(' > ');\n};\n\nconst buildDomPath = (element: Element) => {\n const segments: string[] = [];\n let current: Element | null = element;\n\n while (current !== null) {\n const currentElement: Element = current;\n const siblings =\n currentElement.parentElement === null\n ? [currentElement]\n : Array.from(currentElement.parentElement.children).filter(\n (sibling) => sibling.tagName === currentElement.tagName,\n );\n const index = siblings.indexOf(currentElement) + 1;\n segments.unshift(\n `${currentElement.tagName.toLowerCase()}[${Math.max(index, 1)}]`,\n );\n current = currentElement.parentElement;\n }\n\n return `/${segments.join('/')}`;\n};\n\nconst getBounds = (element: Element): IterationElementBounds =>\n buildBoundsFromRect(element.getBoundingClientRect());\n\nconst isNodeWithinOverlayRoot = (node: Node | null) => {\n const element =\n node instanceof Element ? node : (node?.parentElement ?? null);\n\n if (element === null) {\n return false;\n }\n\n return element.closest(`#${OVERLAY_ROOT_ID}`) !== null;\n};\n\nconst getTextNodeText = (textNode: Text) =>\n normalizeWhitespace(textNode.textContent);\n\nconst shouldPreferElementTargetOverText = (element: Element) => {\n const tagName = element.tagName.toLowerCase();\n\n if (SEMANTIC_INSPECTABLE_ELEMENT_TAG_NAMES.has(tagName)) {\n return true;\n }\n\n const role = inferRole(element);\n\n return (\n role === 'button' ||\n role === 'textbox' ||\n role === 'combobox' ||\n role === 'checkbox' ||\n role === 'radio' ||\n role === 'range'\n );\n};\n\nconst getTextTargetFromNode = (node: Node | null): InspectableTarget | null => {\n if (!(node instanceof Text)) {\n return null;\n }\n\n if (isNodeWithinOverlayRoot(node)) {\n return null;\n }\n\n const element = node.parentElement;\n const textContent = getTextNodeText(node);\n\n if (element === null || textContent === null) {\n return null;\n }\n\n return {\n kind: 'text',\n element,\n textNode: node,\n };\n};\n\nconst getNearestInspectableElement = (node: Node | null): Element | null => {\n let current = node instanceof Element ? node : (node?.parentElement ?? null);\n let fallbackElement: Element | null = null;\n\n while (current !== null) {\n if (isNodeWithinOverlayRoot(current)) {\n return null;\n }\n\n const tagName = current.tagName.toLowerCase();\n\n if (shouldPreferElementTargetOverText(current)) {\n return current;\n }\n\n if (\n fallbackElement === null &&\n INSPECTABLE_ELEMENT_TAG_NAMES.has(tagName)\n ) {\n fallbackElement = current;\n }\n\n current = current.parentElement;\n }\n\n return fallbackElement;\n};\n\nconst getCaretNodeFromPoint = (\n doc: Document,\n coordinates: PointerCoordinates,\n): Node | null => {\n const caretPositionFromPoint = (\n doc as Document & {\n caretPositionFromPoint?: (\n x: number,\n y: number,\n ) => {\n offsetNode: Node | null;\n } | null;\n }\n ).caretPositionFromPoint;\n\n if (typeof caretPositionFromPoint === 'function') {\n return (\n caretPositionFromPoint.call(doc, coordinates.clientX, coordinates.clientY)\n ?.offsetNode ?? null\n );\n }\n\n const caretRangeFromPoint = (\n doc as Document & {\n caretRangeFromPoint?: (\n x: number,\n y: number,\n ) => {\n startContainer: Node | null;\n } | null;\n }\n ).caretRangeFromPoint;\n\n if (typeof caretRangeFromPoint === 'function') {\n return (\n caretRangeFromPoint.call(doc, coordinates.clientX, coordinates.clientY)\n ?.startContainer ?? null\n );\n }\n\n return null;\n};\n\nconst getElementAtPoint = (doc: Document, coordinates: PointerCoordinates) => {\n if (typeof doc.elementFromPoint !== 'function') {\n return null;\n }\n\n return doc.elementFromPoint(coordinates.clientX, coordinates.clientY);\n};\n\nconst isTextTargetHit = (\n target: InspectableTarget,\n doc: Document,\n coordinates: PointerCoordinates,\n pointElement: Element | null,\n) => {\n if (target.kind !== 'text') {\n return false;\n }\n\n try {\n const range = doc.createRange();\n range.selectNodeContents(target.textNode);\n\n if (typeof range.getClientRects === 'function') {\n const clientRects = Array.from(range.getClientRects()).filter(\n (rect) => rect.width > 0 || rect.height > 0,\n );\n\n if (clientRects.length > 0) {\n return clientRects.some((rect) => isPointWithinRect(rect, coordinates));\n }\n }\n\n if (typeof range.getBoundingClientRect === 'function') {\n const rect = range.getBoundingClientRect();\n\n if (rect.width > 0 || rect.height > 0) {\n return isPointWithinRect(rect, coordinates);\n }\n }\n } catch {\n // Range measurement is best-effort. Fall back to DOM hit-testing below.\n }\n\n return (\n pointElement !== null &&\n (pointElement === target.element || target.element.contains(pointElement))\n );\n};\n\nconst getTextTargetAtPoint = (\n doc: Document,\n coordinates: PointerCoordinates,\n pointElement: Element | null = getElementAtPoint(doc, coordinates),\n): InspectableTarget | null => {\n const textTarget = getTextTargetFromNode(\n getCaretNodeFromPoint(doc, coordinates),\n );\n\n if (textTarget === null) {\n return null;\n }\n\n if (!isTextTargetHit(textTarget, doc, coordinates, pointElement)) {\n return null;\n }\n\n return textTarget;\n};\n\nconst getInspectableTargetFromNode = (\n node: Node | null,\n): InspectableTarget | null => {\n const textTarget = getTextTargetFromNode(node);\n const element = getNearestInspectableElement(node);\n\n if (\n textTarget !== null &&\n (element === null || !shouldPreferElementTargetOverText(element))\n ) {\n return textTarget;\n }\n\n if (element === null) {\n return null;\n }\n\n return {\n kind: 'element',\n element,\n };\n};\n\nconst getInspectableTargetRect = (\n target: InspectableTarget,\n doc: Document,\n): Pick<DOMRectReadOnly, 'top' | 'left' | 'width' | 'height'> => {\n if (target.kind !== 'text') {\n return target.element.getBoundingClientRect();\n }\n\n try {\n const range = doc.createRange();\n range.selectNodeContents(target.textNode);\n\n if (typeof range.getBoundingClientRect === 'function') {\n const rect = range.getBoundingClientRect();\n\n if (rect.width > 0 || rect.height > 0) {\n return rect;\n }\n }\n } catch {\n // Range measurement is best-effort. Fall back to the containing element.\n }\n\n return target.element.getBoundingClientRect();\n};\n\nconst getInspectableTargetBounds = (\n target: InspectableTarget,\n doc: Document,\n): IterationElementBounds =>\n buildBoundsFromRect(getInspectableTargetRect(target, doc));\n\nconst getInspectableTargetDisplayText = (\n target: InspectableTarget,\n doc: Document,\n options: AccessibleNameOptions = {},\n) => {\n if (target.kind === 'text') {\n return buildTextDisplayText(getTextNodeText(target.textNode));\n }\n\n return buildIterationElementDisplayText(target.element, doc, options);\n};\n\nconst getInspectableTargetRole = (target: InspectableTarget) => {\n if (target.kind === 'text') {\n return 'text';\n }\n\n return inferRole(target.element);\n};\n\nconst getInspectableTargetAccessibleName = (\n target: InspectableTarget,\n doc: Document,\n) => {\n if (target.kind === 'text') {\n return getTextNodeText(target.textNode);\n }\n\n return getAccessibleName(target.element, doc);\n};\n\nconst getInspectableTargetTextPreview = (target: InspectableTarget) => {\n if (target.kind === 'text') {\n return getTextNodeText(target.textNode);\n }\n\n return getNodeText(target.element);\n};\n\nconst buildInspectableTargetSelection = (\n target: InspectableTarget,\n win: Window = window,\n doc: Document = document,\n): IterationElementSelection => {\n const tagName = target.element.tagName.toLowerCase();\n const role = getInspectableTargetRole(target);\n const accessibleName = getInspectableTargetAccessibleName(target, doc);\n const textPreview = getInspectableTargetTextPreview(target);\n\n return {\n displayText: getInspectableTargetDisplayText(target, doc, {\n includeTextFallback: true,\n }),\n element: {\n urlPath: getUrlPath(win.location),\n cssSelector: buildCssSelector(target.element),\n domPath: buildDomPath(target.element),\n tagName,\n role,\n accessibleName,\n textPreview,\n id: normalizeWhitespace(target.element.id),\n dataTestId: getDataTestId(target.element),\n bounds: getInspectableTargetBounds(target, doc),\n scrollOffset: {\n x: roundMeasurement(win.scrollX),\n y: roundMeasurement(win.scrollY),\n },\n capturedAt: new Date().toISOString(),\n },\n };\n};\n\nconst resolveReactComponentPath = (element: Element, win: Window) => {\n try {\n const reactComponentPath =\n win.__ARA_EMBEDDED_REACT_INSPECTOR_SELECTION__?.getReactComponentPathForElement(\n element,\n );\n\n if (reactComponentPath === undefined) {\n return undefined;\n }\n\n const normalizedPath = reactComponentPath\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n\n return normalizedPath.length > 0 ? normalizedPath : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const buildIterationElementSelection = (\n element: Element,\n win: Window = window,\n doc: Document = document,\n): IterationElementSelection => {\n const tagName = element.tagName.toLowerCase();\n const role = inferRole(element);\n const accessibleName = getAccessibleName(element, doc);\n const textPreview = getNodeText(element);\n const reactComponentPath = resolveReactComponentPath(element, win);\n\n return {\n displayText: buildIterationElementDisplayText(element, doc, {\n includeTextFallback: true,\n }),\n element: {\n urlPath: getUrlPath(win.location),\n cssSelector: buildCssSelector(element),\n domPath: buildDomPath(element),\n tagName,\n role,\n accessibleName,\n textPreview,\n id: normalizeWhitespace(element.id),\n dataTestId: getDataTestId(element),\n bounds: getBounds(element),\n scrollOffset: {\n x: roundMeasurement(win.scrollX),\n y: roundMeasurement(win.scrollY),\n },\n capturedAt: new Date().toISOString(),\n ...(reactComponentPath !== undefined && {\n reactComponentPath,\n }),\n },\n };\n};\n\nconst createOverlay = (doc: Document): OverlayElements => {\n const root = doc.createElement('div');\n root.id = OVERLAY_ROOT_ID;\n root.setAttribute('aria-hidden', 'true');\n root.style.position = 'fixed';\n root.style.inset = '0';\n root.style.pointerEvents = 'none';\n root.style.zIndex = OVERLAY_Z_INDEX;\n\n const createOverlayBox = (borderColor: string, backgroundColor: string) => {\n const box = doc.createElement('div');\n box.style.position = 'fixed';\n box.style.border = `2px solid ${borderColor}`;\n box.style.borderRadius = '8px';\n box.style.background = backgroundColor;\n box.style.display = 'none';\n return box;\n };\n\n const createOverlayLabel = (backgroundColor: string) => {\n const label = doc.createElement('div');\n label.style.position = 'fixed';\n label.style.maxWidth = '320px';\n label.style.padding = '6px 10px';\n label.style.borderRadius = '999px';\n label.style.background = backgroundColor;\n label.style.color = '#f8fafc';\n label.style.fontFamily =\n 'ui-monospace, SFMono-Regular, SF Mono, Consolas, monospace';\n label.style.fontSize = '12px';\n label.style.lineHeight = '1';\n label.style.display = 'none';\n label.style.whiteSpace = 'nowrap';\n label.style.overflow = 'hidden';\n label.style.textOverflow = 'ellipsis';\n label.textContent = DEFAULT_LABEL;\n return label;\n };\n\n const selectedBox = createOverlayBox(\n SELECTED_OVERLAY_BORDER_COLOR,\n SELECTED_OVERLAY_BACKGROUND_COLOR,\n );\n const hoverBox = createOverlayBox(\n HOVER_OVERLAY_BORDER_COLOR,\n HOVER_OVERLAY_BACKGROUND_COLOR,\n );\n hoverBox.style.boxShadow = '0 0 0 9999px rgba(15, 23, 42, 0.12)';\n\n const selectedLabel = createOverlayLabel(SELECTED_LABEL_BACKGROUND_COLOR);\n const hoverLabel = createOverlayLabel(HOVER_LABEL_BACKGROUND_COLOR);\n\n root.append(selectedBox, hoverBox, selectedLabel, hoverLabel);\n doc.body.append(root);\n\n return { root, selectedBox, selectedLabel, hoverBox, hoverLabel };\n};\n\nconst getOverlayKindElements = (\n overlay: OverlayElements,\n kind: 'selected' | 'hover',\n) =>\n kind === 'selected'\n ? {\n box: overlay.selectedBox,\n label: overlay.selectedLabel,\n }\n : {\n box: overlay.hoverBox,\n label: overlay.hoverLabel,\n };\n\nconst updateOverlay = (\n overlay: OverlayElements,\n target: InspectableTarget,\n doc: Document,\n kind: 'selected' | 'hover',\n) => {\n const rect = getInspectableTargetRect(target, doc);\n const displayText = getInspectableTargetDisplayText(target, doc, {\n includeTextFallback:\n target.kind === 'text'\n ? true\n : shouldUseTextFallbackForHoverLabel(target.element),\n });\n const overlayElements = getOverlayKindElements(overlay, kind);\n\n overlayElements.box.style.display = 'block';\n overlayElements.box.style.left = `${roundMeasurement(rect.left)}px`;\n overlayElements.box.style.top = `${roundMeasurement(rect.top)}px`;\n overlayElements.box.style.width = `${roundMeasurement(rect.width)}px`;\n overlayElements.box.style.height = `${roundMeasurement(rect.height)}px`;\n\n overlayElements.label.style.display = 'block';\n overlayElements.label.style.left = `${Math.max(roundMeasurement(rect.left), 8)}px`;\n overlayElements.label.style.top = `${Math.max(roundMeasurement(rect.top) - 36, 8)}px`;\n overlayElements.label.textContent = displayText;\n};\n\nconst hideOverlay = (overlay: OverlayElements, kind: 'selected' | 'hover') => {\n const overlayElements = getOverlayKindElements(overlay, kind);\n\n overlayElements.box.style.display = 'none';\n overlayElements.label.style.display = 'none';\n overlayElements.label.textContent = DEFAULT_LABEL;\n};\n\nconst isNodeWithinOverlay = (\n node: Node | null,\n overlay: OverlayElements | null,\n) => {\n if (node === null || overlay === null) {\n return false;\n }\n\n return overlay.root.contains(node);\n};\n\nconst isOverlayOnlyMutationRecord = (\n record: MutationRecord,\n overlay: OverlayElements | null,\n) => {\n if (isNodeWithinOverlay(record.target, overlay)) {\n return true;\n }\n\n if (record.type !== 'childList') {\n return false;\n }\n\n const isRelevantNode = (node: Node | null) =>\n node !== null && !isNodeWithinOverlay(node, overlay);\n\n return !(\n Array.from(record.addedNodes).some(isRelevantNode) ||\n Array.from(record.removedNodes).some(isRelevantNode)\n );\n};\n\nconst getInspectableTarget = (\n doc: Document,\n eventTarget: EventTarget | null,\n coordinates?: PointerCoordinates,\n): InspectableTarget | null => {\n const pointElement =\n coordinates === undefined ? null : getElementAtPoint(doc, coordinates);\n const eventNode = eventTarget instanceof Node ? eventTarget : null;\n const shouldPreferEventNode =\n eventNode !== null &&\n pointElement !== null &&\n !pointElement.contains(eventNode) &&\n !eventNode.contains(pointElement);\n const preferredElement = getNearestInspectableElement(\n shouldPreferEventNode ? eventNode : pointElement ?? eventNode,\n );\n\n if (coordinates !== undefined) {\n const textTarget = shouldPreferEventNode\n ? null\n : getTextTargetAtPoint(doc, coordinates, pointElement);\n\n if (\n textTarget !== null &&\n (preferredElement === null ||\n !shouldPreferElementTargetOverText(preferredElement))\n ) {\n return textTarget;\n }\n }\n\n if (preferredElement !== null) {\n return {\n kind: 'element',\n element: preferredElement,\n } satisfies InspectableTarget;\n }\n\n return getInspectableTargetFromNode(eventNode ?? pointElement);\n};\n\nconst getInspectableElementAtPoint = (\n doc: Document,\n coordinates: PointerCoordinates,\n) => {\n const pointElement = getElementAtPoint(doc, coordinates);\n const preferredElement = getNearestInspectableElement(pointElement);\n const textTarget = getTextTargetAtPoint(doc, coordinates, pointElement);\n\n if (\n textTarget !== null &&\n (preferredElement === null ||\n !shouldPreferElementTargetOverText(preferredElement))\n ) {\n return textTarget;\n }\n\n if (preferredElement !== null) {\n return {\n kind: 'element',\n element: preferredElement,\n } satisfies InspectableTarget;\n }\n\n return getInspectableTargetFromNode(pointElement);\n};\n\nconst didPointerMovePastTapThreshold = (\n origin: PointerCoordinates,\n next: PointerCoordinates,\n) =>\n Math.hypot(next.clientX - origin.clientX, next.clientY - origin.clientY) >\n POINTER_TAP_MAX_DISTANCE_PX;\n\nconst targetMatchesSuppressedClick = (\n target: EventTarget | null,\n suppressedClickTarget: Element,\n) => target instanceof Node && suppressedClickTarget.contains(target);\n\nconst getDebugElementSummary = (target: InspectableTarget) => ({\n tagName: target.element.tagName.toLowerCase(),\n id: normalizeWhitespace(target.element.getAttribute('id')),\n role: getInspectableTargetRole(target),\n displayText: getInspectableTargetDisplayText(\n target,\n target.element.ownerDocument ?? document,\n {\n includeTextFallback:\n target.kind === 'text'\n ? true\n : shouldUseTextFallbackForHoverLabel(target.element),\n },\n ),\n dataTestId: getDataTestId(target.element),\n disabled:\n target.element instanceof HTMLButtonElement ||\n target.element instanceof HTMLInputElement ||\n target.element instanceof HTMLSelectElement ||\n target.element instanceof HTMLTextAreaElement\n ? target.element.disabled\n : undefined,\n});\n\nconst getDebugTargetSummary = (\n doc: Document,\n target: EventTarget | null,\n coordinates?: PointerCoordinates,\n) => {\n const inspectableTarget = getInspectableTarget(doc, target, coordinates);\n\n if (inspectableTarget === null) {\n return null;\n }\n\n return getDebugElementSummary(inspectableTarget);\n};\n\nconst preventInteraction = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nconst inspectableTargetsAreEqual = (\n left: InspectableTarget | null,\n right: InspectableTarget | null,\n) => {\n if (left === null || right === null) {\n return false;\n }\n\n if (left.kind !== right.kind || left.element !== right.element) {\n return false;\n }\n\n if (left.kind === 'text' && right.kind === 'text') {\n return left.textNode === right.textNode;\n }\n\n return true;\n};\n\nexport const createIterationInspectorRuntime = ({\n allowSelfMessaging = false,\n win = window,\n doc = document,\n}: CreateIterationInspectorRuntimeArgs = {}): IterationInspectorRuntime => {\n let active = false;\n let started = false;\n let currentHover: InspectableTarget | null = null;\n let currentSelected: InspectableTarget | null = null;\n let overlay: OverlayElements | null = null;\n let hasParentOrigin = false;\n let parentOrigin: string | null = null;\n let lastPointerPosition: PointerCoordinates | null = null;\n let pendingPointerSelection: PendingPointerSelection | null = null;\n let suppressedClickTarget: Element | null = null;\n let debugEnabled = false;\n let debugSessionId: string | null = null;\n let detachObserver: MutationObserver | null = null;\n let removePatchedHistoryListeners: (() => void) | null = null;\n let hasLoggedIgnoredOverlayMutation = false;\n let selectionMode: IterationInspectorSelectionMode = 'single';\n const canPostToParent = allowSelfMessaging || win.parent !== win;\n\n type IterationInspectorDebugLogInput =\n | IterationInspectorDebugDetails\n | (() => IterationInspectorDebugDetails);\n\n const emit = (message: IterationInspectorRuntimeMessage) => {\n if (!canPostToParent) {\n return;\n }\n\n win.parent.postMessage(message, parentOrigin ?? '*');\n };\n\n const emitDebugLog = (\n event: string,\n details: IterationInspectorDebugLogInput = {},\n ) => {\n if (!debugEnabled) {\n return;\n }\n\n const resolvedDetails = typeof details === 'function' ? details() : details;\n\n try {\n console.debug('[itera/iteration-inspector/runtime]', {\n sessionId: debugSessionId ?? undefined,\n event,\n ...resolvedDetails,\n });\n } catch {\n // Debug logging failures must not affect runtime behavior.\n }\n\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'debug_log',\n event,\n sessionId: debugSessionId ?? undefined,\n details: resolvedDetails,\n });\n };\n\n const updateDebugConfig = (message: {\n debugEnabled?: boolean;\n debugSessionId?: string;\n }) => {\n if (!message.debugEnabled) {\n return;\n }\n\n const wasDebugEnabled = debugEnabled;\n\n debugEnabled = true;\n debugSessionId =\n typeof message.debugSessionId === 'string' &&\n message.debugSessionId.length > 0\n ? message.debugSessionId\n : debugSessionId;\n\n if (!wasDebugEnabled) {\n emitDebugLog('debug_enabled', {\n urlPath: getUrlPath(win.location),\n });\n }\n };\n\n const ensureOverlay = () => {\n if (overlay !== null) {\n return overlay;\n }\n\n overlay = createOverlay(doc);\n return overlay;\n };\n\n const clearHover = () => {\n const previousHover = currentHover;\n currentHover = null;\n\n if (overlay !== null) {\n hideOverlay(overlay, 'hover');\n }\n\n if (previousHover !== null) {\n emitDebugLog('hover_cleared', () => ({\n target: getDebugElementSummary(previousHover),\n }));\n }\n };\n\n const updateHover = (target: InspectableTarget) => {\n const hoverChanged =\n currentHover?.kind !== target.kind ||\n currentHover.element !== target.element ||\n (currentHover.kind === 'text' &&\n target.kind === 'text' &&\n currentHover.textNode !== target.textNode);\n currentHover = target;\n\n const nextOverlay = ensureOverlay();\n\n if (inspectableTargetsAreEqual(currentSelected, target)) {\n hideOverlay(nextOverlay, 'hover');\n } else {\n updateOverlay(nextOverlay, target, doc, 'hover');\n }\n\n if (hoverChanged) {\n emitDebugLog('hover_target_changed', () => ({\n target: getDebugElementSummary(target),\n }));\n }\n };\n\n const updateHoverFromLastPointerPosition = () => {\n if (!active || lastPointerPosition === null) {\n return;\n }\n\n const nextHover = getInspectableElementAtPoint(doc, lastPointerPosition);\n\n if (nextHover === null) {\n clearHover();\n return;\n }\n\n updateHover(nextHover);\n };\n\n const clearSelected = () => {\n currentSelected = null;\n\n if (overlay !== null) {\n hideOverlay(overlay, 'selected');\n }\n };\n\n const updateSelected = (target: InspectableTarget) => {\n currentSelected = target;\n const nextOverlay = ensureOverlay();\n\n updateOverlay(nextOverlay, target, doc, 'selected');\n\n if (inspectableTargetsAreEqual(currentHover, target)) {\n hideOverlay(nextOverlay, 'hover');\n }\n };\n\n const clearPendingSelectionState = (\n reason: RuntimeLifecycleReason = 'command',\n ) => {\n pendingPointerSelection = null;\n\n if (reason !== 'selection') {\n suppressedClickTarget = null;\n }\n };\n\n const emitSelection = (\n target: InspectableTarget,\n event: Event,\n options: {\n suppressFollowUpClick?: boolean;\n source: SelectionSource;\n },\n ) => {\n preventInteraction(event);\n currentHover = target;\n updateSelected(target);\n const selection = buildInspectableTargetSelection(target, win, doc);\n\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'element_selected',\n selection,\n });\n\n suppressedClickTarget = options.suppressFollowUpClick\n ? target.element\n : null;\n emitDebugLog('selection_emitted', () => ({\n source: options.source,\n suppressFollowUpClick: options.suppressFollowUpClick === true,\n selectionMode,\n selectionDisplayText: selection.displayText,\n target: getDebugElementSummary(target),\n }));\n\n if (selectionMode === 'single') {\n setActive(false, 'selection');\n }\n };\n\n const clearHoverWithInvalidation = (\n reason: IterationInspectorInvalidationReason,\n ) => {\n clearHover();\n clearSelected();\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'selection_invalidated',\n reason,\n });\n };\n\n const setActive = (\n nextActive: boolean,\n reason: RuntimeLifecycleReason = 'command',\n ) => {\n if (active === nextActive) {\n if (!active) {\n clearHover();\n }\n return;\n }\n\n active = nextActive;\n clearPendingSelectionState(reason);\n hasLoggedIgnoredOverlayMutation = false;\n\n if (!active) {\n selectionMode = 'single';\n }\n\n if (active) {\n ensureOverlay();\n if (currentSelected !== null) {\n updateSelected(currentSelected);\n }\n updateHoverFromLastPointerPosition();\n emitDebugLog('mode_changed', {\n active: true,\n reason,\n });\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'mode_changed',\n active: true,\n });\n return;\n }\n\n clearHover();\n if (overlay !== null) {\n hideOverlay(overlay, 'selected');\n }\n emitDebugLog('mode_changed', {\n active: false,\n reason,\n });\n\n if (reason !== 'reload') {\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'mode_changed',\n active: false,\n });\n }\n };\n\n const handleNodeDetached = () => {\n if (!active) {\n return;\n }\n\n if (currentSelected !== null) {\n const selectedIsConnected =\n currentSelected.element.isConnected &&\n (currentSelected.kind !== 'text' || currentSelected.textNode.isConnected);\n\n if (!selectedIsConnected) {\n clearHoverWithInvalidation('node_detached');\n return;\n }\n\n if (overlay !== null) {\n updateOverlay(overlay, currentSelected, doc, 'selected');\n }\n }\n\n if (currentHover === null) {\n return;\n }\n\n const hoverIsConnected =\n currentHover.element.isConnected &&\n (currentHover.kind !== 'text' || currentHover.textNode.isConnected);\n\n if (hoverIsConnected) {\n if (overlay !== null) {\n if (!inspectableTargetsAreEqual(currentSelected, currentHover)) {\n updateOverlay(overlay, currentHover, doc, 'hover');\n }\n }\n return;\n }\n\n clearHover();\n };\n\n const handleRouteChange = () => {\n if (!active) {\n return;\n }\n\n clearHoverWithInvalidation('route_change');\n setActive(false, 'route_change');\n };\n\n const patchHistory = () => {\n const originalPushState = win.history.pushState.bind(win.history);\n const originalReplaceState = win.history.replaceState.bind(win.history);\n\n const wrapHistoryMethod =\n (\n originalMethod: History['pushState'] | History['replaceState'],\n ): History['pushState'] =>\n (...args) => {\n const previousPath = getUrlPath(win.location);\n const result = originalMethod(...args);\n\n if (getUrlPath(win.location) !== previousPath) {\n handleRouteChange();\n }\n\n return result;\n };\n\n win.history.pushState = wrapHistoryMethod(originalPushState);\n win.history.replaceState = wrapHistoryMethod(originalReplaceState);\n\n const handlePopState = () => {\n handleRouteChange();\n };\n\n const handleHashChange = () => {\n handleRouteChange();\n };\n\n win.addEventListener('popstate', handlePopState);\n win.addEventListener('hashchange', handleHashChange);\n\n return () => {\n win.history.pushState = originalPushState;\n win.history.replaceState = originalReplaceState;\n win.removeEventListener('popstate', handlePopState);\n win.removeEventListener('hashchange', handleHashChange);\n };\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (!isIterationInspectorParentMessage(event.data)) {\n return;\n }\n\n if (\n event.source !== win.parent &&\n (!allowSelfMessaging || event.source !== win)\n ) {\n return;\n }\n\n const nextParentOrigin = event.origin === 'null' ? null : event.origin;\n\n if (hasParentOrigin && nextParentOrigin !== parentOrigin) {\n return;\n }\n\n parentOrigin = nextParentOrigin;\n hasParentOrigin = true;\n updateDebugConfig(event.data);\n emitDebugLog('command_received', {\n kind: event.data.kind,\n origin: event.origin,\n urlPath: getUrlPath(win.location),\n });\n\n if (event.data.kind === 'enter_select_mode') {\n selectionMode = event.data.selectionMode ?? 'single';\n setActive(true);\n return;\n }\n\n if (event.data.kind === 'exit_select_mode') {\n setActive(false);\n return;\n }\n\n clearSelected();\n clearHover();\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n lastPointerPosition = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n\n if (\n pendingPointerSelection !== null &&\n pendingPointerSelection.pointerId === event.pointerId &&\n didPointerMovePastTapThreshold(\n pendingPointerSelection.origin,\n lastPointerPosition,\n )\n ) {\n pendingPointerSelection = null;\n }\n\n if (!active) {\n return;\n }\n\n const nextHover = getInspectableTarget(\n doc,\n event.target,\n lastPointerPosition,\n );\n\n if (nextHover === null) {\n clearHover();\n return;\n }\n\n updateHover(nextHover);\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n lastPointerPosition = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n suppressedClickTarget = null;\n\n if (!active) {\n return;\n }\n\n emitDebugLog('pointer_down_received', () => ({\n button: event.button,\n pointerId: event.pointerId,\n target: getDebugTargetSummary(doc, event.target, {\n clientX: event.clientX,\n clientY: event.clientY,\n }),\n }));\n\n if (event.button !== 0) {\n pendingPointerSelection = null;\n emitDebugLog('pointer_down_ignored', () => ({\n reason: 'non_primary_button',\n button: event.button,\n target: getDebugTargetSummary(doc, event.target, {\n clientX: event.clientX,\n clientY: event.clientY,\n }),\n }));\n return;\n }\n\n pendingPointerSelection = {\n pointerId: event.pointerId,\n origin: lastPointerPosition,\n };\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n lastPointerPosition = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n\n if (!active) {\n pendingPointerSelection = null;\n emitDebugLog('pointer_up_ignored', {\n reason: 'inactive',\n button: event.button,\n pointerId: event.pointerId,\n });\n return;\n }\n\n emitDebugLog('pointer_up_received', () => ({\n button: event.button,\n pointerId: event.pointerId,\n target: getDebugTargetSummary(doc, event.target, {\n clientX: event.clientX,\n clientY: event.clientY,\n }),\n }));\n\n const currentPendingPointerSelection = pendingPointerSelection;\n const matchesPendingPointer =\n currentPendingPointerSelection !== null &&\n currentPendingPointerSelection.pointerId === event.pointerId;\n const pointerMoved =\n matchesPendingPointer &&\n didPointerMovePastTapThreshold(\n currentPendingPointerSelection.origin,\n lastPointerPosition,\n );\n\n pendingPointerSelection = null;\n\n if (!matchesPendingPointer || pointerMoved) {\n emitDebugLog('pointer_up_ignored', {\n reason: !matchesPendingPointer\n ? 'missing_pending_selection'\n : 'pointer_moved',\n button: event.button,\n pointerId: event.pointerId,\n });\n return;\n }\n\n if (event.button !== 0) {\n emitDebugLog('pointer_up_ignored', {\n reason: 'non_primary_button',\n button: event.button,\n pointerId: event.pointerId,\n });\n return;\n }\n\n const target =\n getInspectableTarget(doc, event.target, lastPointerPosition) ??\n getInspectableElementAtPoint(doc, lastPointerPosition) ??\n currentHover;\n\n if (target === null) {\n emitDebugLog('pointer_up_ignored', {\n reason: 'no_target',\n button: event.button,\n pointerId: event.pointerId,\n });\n clearHover();\n return;\n }\n\n emitSelection(target, event, {\n suppressFollowUpClick: true,\n source: 'pointerup',\n });\n };\n\n const handlePointerCancel = () => {\n pendingPointerSelection = null;\n };\n\n const handleScrollOrResize = () => {\n if (!active) {\n return;\n }\n\n if (\n currentSelected !== null &&\n (!currentSelected.element.isConnected ||\n (currentSelected.kind === 'text' && !currentSelected.textNode.isConnected))\n ) {\n clearHoverWithInvalidation('node_detached');\n return;\n }\n\n if (\n currentHover !== null &&\n (!currentHover.element.isConnected ||\n (currentHover.kind === 'text' && !currentHover.textNode.isConnected))\n ) {\n clearHover();\n }\n\n if (lastPointerPosition !== null) {\n if (overlay !== null && currentSelected !== null) {\n updateOverlay(overlay, currentSelected, doc, 'selected');\n }\n\n updateHoverFromLastPointerPosition();\n return;\n }\n\n if (overlay === null) {\n return;\n }\n\n if (currentSelected !== null) {\n updateOverlay(overlay, currentSelected, doc, 'selected');\n }\n\n if (\n currentHover !== null &&\n !inspectableTargetsAreEqual(currentSelected, currentHover)\n ) {\n updateOverlay(overlay, currentHover, doc, 'hover');\n return;\n }\n\n hideOverlay(overlay, 'hover');\n };\n\n const handleClick = (event: MouseEvent) => {\n if (\n suppressedClickTarget !== null &&\n targetMatchesSuppressedClick(event.target, suppressedClickTarget)\n ) {\n const targetToSuppress = suppressedClickTarget;\n\n emitDebugLog('follow_up_click_suppressed', () => ({\n target: getDebugElementSummary({\n kind: 'element',\n element: targetToSuppress,\n }),\n }));\n preventInteraction(event);\n suppressedClickTarget = null;\n return;\n }\n\n suppressedClickTarget = null;\n\n if (!active) {\n return;\n }\n\n const target =\n getInspectableTarget(doc, event.target, {\n clientX: event.clientX,\n clientY: event.clientY,\n }) ?? currentHover;\n\n if (target === null) {\n emitDebugLog('click_selection_ignored', {\n reason: 'no_target',\n });\n clearHover();\n return;\n }\n\n emitSelection(target, event, {\n source: 'click',\n });\n };\n\n const handleBeforeUnload = () => {\n if (!active) {\n return;\n }\n\n clearHoverWithInvalidation('reload');\n setActive(false, 'reload');\n };\n\n return {\n start: () => {\n if (started) {\n return;\n }\n\n started = true;\n removePatchedHistoryListeners = patchHistory();\n doc.addEventListener('pointermove', handlePointerMove, true);\n doc.addEventListener('pointerdown', handlePointerDown, true);\n doc.addEventListener('pointerup', handlePointerUp, true);\n doc.addEventListener('pointercancel', handlePointerCancel, true);\n doc.addEventListener('click', handleClick, true);\n win.addEventListener('message', handleMessage);\n win.addEventListener('scroll', handleScrollOrResize, true);\n win.addEventListener('resize', handleScrollOrResize);\n win.addEventListener('pagehide', handleBeforeUnload);\n win.addEventListener('beforeunload', handleBeforeUnload);\n\n detachObserver = new MutationObserver((records) => {\n if (currentHover === null && currentSelected === null) {\n return;\n }\n\n if (\n records.every((record) =>\n isOverlayOnlyMutationRecord(record, overlay),\n )\n ) {\n if (!hasLoggedIgnoredOverlayMutation) {\n emitDebugLog('mutation_ignored', {\n reason: 'overlay_only',\n });\n hasLoggedIgnoredOverlayMutation = true;\n }\n\n return;\n }\n\n handleNodeDetached();\n });\n detachObserver.observe(doc.body, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n\n emit({\n channel: ITERATION_INSPECTOR_CHANNEL,\n kind: 'runtime_ready',\n urlPath: getUrlPath(win.location),\n });\n },\n stop: () => {\n if (!started) {\n return;\n }\n\n started = false;\n active = false;\n hasParentOrigin = false;\n parentOrigin = null;\n debugEnabled = false;\n debugSessionId = null;\n clearPendingSelectionState();\n clearHover();\n removePatchedHistoryListeners?.();\n removePatchedHistoryListeners = null;\n detachObserver?.disconnect();\n detachObserver = null;\n doc.removeEventListener('pointermove', handlePointerMove, true);\n doc.removeEventListener('pointerdown', handlePointerDown, true);\n doc.removeEventListener('pointerup', handlePointerUp, true);\n doc.removeEventListener('pointercancel', handlePointerCancel, true);\n doc.removeEventListener('click', handleClick, true);\n win.removeEventListener('message', handleMessage);\n win.removeEventListener('scroll', handleScrollOrResize, true);\n win.removeEventListener('resize', handleScrollOrResize);\n win.removeEventListener('pagehide', handleBeforeUnload);\n win.removeEventListener('beforeunload', handleBeforeUnload);\n\n if (overlay !== null) {\n overlay.root.remove();\n overlay = null;\n }\n },\n isActive: () => active,\n };\n};\n\nexport const bootIterationInspectorRuntime = (\n args: Omit<CreateIterationInspectorRuntimeArgs, 'win' | 'doc'> = {},\n) => {\n if (!args.allowSelfMessaging && window.parent === window) {\n return null;\n }\n\n if (window.__ITERA_ITERATION_INSPECTOR_RUNTIME__ !== undefined) {\n return window.__ITERA_ITERATION_INSPECTOR_RUNTIME__;\n }\n\n const runtime = createIterationInspectorRuntime(args);\n runtime.start();\n window.__ITERA_ITERATION_INSPECTOR_RUNTIME__ = runtime;\n\n return runtime;\n};\n"],"names":["ITERATION_INSPECTOR_CHANNEL","isRecord","value","isIterationInspectorParentMessage","isIterationInspectorRuntimeMessage","OVERLAY_ROOT_ID","OVERLAY_Z_INDEX","DEFAULT_LABEL","SELECTED_OVERLAY_BORDER_COLOR","SELECTED_OVERLAY_BACKGROUND_COLOR","SELECTED_LABEL_BACKGROUND_COLOR","HOVER_OVERLAY_BORDER_COLOR","HOVER_OVERLAY_BACKGROUND_COLOR","HOVER_LABEL_BACKGROUND_COLOR","SEMANTIC_INSPECTABLE_ELEMENT_TAG_NAMES","INSPECTABLE_ELEMENT_TAG_NAMES","normalizeWhitespace","normalized","escapeCssIdentifier","roundMeasurement","buildBoundsFromRect","rect","isPointWithinRect","coordinates","getUrlPath","locationLike","getNodeText","element","text","getDataTestId","inferRole","_a","explicitRole","tagName","inputType","getAssociatedLabelText","doc","label","getAccessibleName","options","includeTextFallback","ariaLabel","labelledBy","ids","labelText","id","altText","titleText","placeholderText","associatedLabelText","valueText","shouldUseTextFallbackForHoverLabel","getDisplayLabel","buildIterationElementDisplayText","roleOrTag","sanitizedLabel","buildTextDisplayText","textContent","getPathSegment","index","sibling","buildCssSelector","dataTestId","segments","current","buildDomPath","currentElement","getBounds","isNodeWithinOverlayRoot","node","getTextNodeText","textNode","shouldPreferElementTargetOverText","role","getTextTargetFromNode","getNearestInspectableElement","fallbackElement","getCaretNodeFromPoint","_b","caretPositionFromPoint","caretRangeFromPoint","getElementAtPoint","isTextTargetHit","target","pointElement","range","clientRects","getTextTargetAtPoint","textTarget","getInspectableTargetFromNode","getInspectableTargetRect","getInspectableTargetBounds","getInspectableTargetDisplayText","getInspectableTargetRole","getInspectableTargetAccessibleName","getInspectableTargetTextPreview","buildInspectableTargetSelection","win","accessibleName","textPreview","resolveReactComponentPath","reactComponentPath","normalizedPath","segment","buildIterationElementSelection","createOverlay","root","createOverlayBox","borderColor","backgroundColor","box","createOverlayLabel","selectedBox","hoverBox","selectedLabel","hoverLabel","getOverlayKindElements","overlay","kind","updateOverlay","displayText","overlayElements","hideOverlay","isNodeWithinOverlay","isOverlayOnlyMutationRecord","record","isRelevantNode","getInspectableTarget","eventTarget","eventNode","shouldPreferEventNode","preferredElement","getInspectableElementAtPoint","didPointerMovePastTapThreshold","origin","next","targetMatchesSuppressedClick","suppressedClickTarget","getDebugElementSummary","getDebugTargetSummary","inspectableTarget","preventInteraction","event","inspectableTargetsAreEqual","left","right","createIterationInspectorRuntime","allowSelfMessaging","active","started","currentHover","currentSelected","hasParentOrigin","parentOrigin","lastPointerPosition","pendingPointerSelection","debugEnabled","debugSessionId","detachObserver","removePatchedHistoryListeners","hasLoggedIgnoredOverlayMutation","selectionMode","canPostToParent","emit","message","emitDebugLog","details","resolvedDetails","updateDebugConfig","wasDebugEnabled","ensureOverlay","clearHover","previousHover","updateHover","hoverChanged","nextOverlay","updateHoverFromLastPointerPosition","nextHover","clearSelected","updateSelected","clearPendingSelectionState","reason","emitSelection","selection","setActive","clearHoverWithInvalidation","nextActive","handleNodeDetached","handleRouteChange","patchHistory","originalPushState","originalReplaceState","wrapHistoryMethod","originalMethod","args","previousPath","result","handlePopState","handleHashChange","handleMessage","nextParentOrigin","handlePointerMove","handlePointerDown","handlePointerUp","currentPendingPointerSelection","matchesPendingPointer","pointerMoved","handlePointerCancel","handleScrollOrResize","handleClick","targetToSuppress","handleBeforeUnload","records","bootIterationInspectorRuntime","runtime"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ReactInspectorAdapterContract } from './adapters/base/types';
|
|
2
|
+
export type ReactTreeAdapter = ReactInspectorAdapterContract;
|
|
3
|
+
export { MAX_TREE_SNAPSHOT_NODE_COUNT, capTreeSnapshot, createBaseReactInspectorAdapter, type BaseAdapterNodeLookup, type CappedReactTreeSnapshot, type CreateBaseReactInspectorAdapterOptions, type ReactTreeSnapshot, } from './adapters/base/baseAdapter';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { InspectorErrorCode } from '../../../inspector-protocol/src/index.ts';
|
|
2
|
+
export declare const EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION: 1;
|
|
3
|
+
export declare const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE = "itera.inspector.embedded.lifecycle_event_total";
|
|
4
|
+
export declare const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION = "itera.inspector.embedded.rejection_total";
|
|
5
|
+
export declare const EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK = "itera.inspector.embedded.fiber_fallback_total";
|
|
6
|
+
export declare const embeddedBridgeTelemetryMetricNames: readonly ["itera.inspector.embedded.lifecycle_event_total", "itera.inspector.embedded.rejection_total", "itera.inspector.embedded.fiber_fallback_total"];
|
|
7
|
+
export type EmbeddedBridgeTelemetryMetricName = (typeof embeddedBridgeTelemetryMetricNames)[number];
|
|
8
|
+
export declare const embeddedBridgeLifecycleStages: readonly ["connect", "ready", "error"];
|
|
9
|
+
export type EmbeddedBridgeLifecycleStage = (typeof embeddedBridgeLifecycleStages)[number];
|
|
10
|
+
export declare const embeddedBridgeRejectionReasonCodes: readonly ["origin-reject", "token-reject", "oversize-reject", "invalid-payload-reject"];
|
|
11
|
+
export type EmbeddedBridgeRejectionReasonCode = (typeof embeddedBridgeRejectionReasonCodes)[number];
|
|
12
|
+
export declare const embeddedBridgeFiberFallbackReasonCodes: readonly ["hook-missing", "hook-malformed", "renderers-malformed", "fiber-roots-reader-missing", "fiber-roots-malformed", "renderer-empty", "root-empty", "fiber-roots-read-failed", "probe-failed", "snapshot-empty", "snapshot-read-failed"];
|
|
13
|
+
export type EmbeddedBridgeFiberFallbackReasonCode = (typeof embeddedBridgeFiberFallbackReasonCodes)[number];
|
|
14
|
+
export declare const embeddedBridgeFiberFallbackAdapterTargets: readonly ["vite", "next", "cra", "noop"];
|
|
15
|
+
export type EmbeddedBridgeFiberFallbackAdapterTarget = (typeof embeddedBridgeFiberFallbackAdapterTargets)[number];
|
|
16
|
+
export type EmbeddedBridgeLifecycleTelemetryMetric = {
|
|
17
|
+
schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;
|
|
18
|
+
metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_LIFECYCLE;
|
|
19
|
+
stage: EmbeddedBridgeLifecycleStage;
|
|
20
|
+
count: 1;
|
|
21
|
+
messageType?: string;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
errorCode?: InspectorErrorCode;
|
|
25
|
+
};
|
|
26
|
+
export type EmbeddedBridgeRejectionTelemetryMetric = {
|
|
27
|
+
schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;
|
|
28
|
+
metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_REJECTION;
|
|
29
|
+
reasonCode: EmbeddedBridgeRejectionReasonCode;
|
|
30
|
+
count: 1;
|
|
31
|
+
messageType?: string;
|
|
32
|
+
requestId?: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
errorCode?: InspectorErrorCode;
|
|
35
|
+
};
|
|
36
|
+
export type EmbeddedBridgeFiberFallbackTelemetryMetric = {
|
|
37
|
+
schemaVersion: typeof EMBEDDED_BRIDGE_TELEMETRY_SCHEMA_VERSION;
|
|
38
|
+
metricName: typeof EMBEDDED_BRIDGE_TELEMETRY_METRIC_NAME_FIBER_FALLBACK;
|
|
39
|
+
reasonCode: EmbeddedBridgeFiberFallbackReasonCode;
|
|
40
|
+
fallbackAdapterTarget: EmbeddedBridgeFiberFallbackAdapterTarget;
|
|
41
|
+
count: 1;
|
|
42
|
+
};
|
|
43
|
+
export type EmbeddedBridgeTelemetryHooks = {
|
|
44
|
+
onLifecycleMetric?: (metric: EmbeddedBridgeLifecycleTelemetryMetric) => void;
|
|
45
|
+
onRejectionMetric?: (metric: EmbeddedBridgeRejectionTelemetryMetric) => void;
|
|
46
|
+
onFiberFallbackMetric?: (metric: EmbeddedBridgeFiberFallbackTelemetryMetric) => void;
|
|
47
|
+
};
|
|
48
|
+
export declare const emitEmbeddedBridgeLifecycleMetric: (metric: Omit<EmbeddedBridgeLifecycleTelemetryMetric, "schemaVersion" | "metricName" | "count">, hooks: EmbeddedBridgeTelemetryHooks | undefined) => EmbeddedBridgeLifecycleTelemetryMetric;
|
|
49
|
+
export declare const emitEmbeddedBridgeRejectionMetric: (metric: Omit<EmbeddedBridgeRejectionTelemetryMetric, "schemaVersion" | "metricName" | "count">, hooks: EmbeddedBridgeTelemetryHooks | undefined) => EmbeddedBridgeRejectionTelemetryMetric;
|
|
50
|
+
export declare const emitEmbeddedBridgeFiberFallbackMetric: (metric: Omit<EmbeddedBridgeFiberFallbackTelemetryMetric, "schemaVersion" | "metricName" | "count">, hooks: EmbeddedBridgeTelemetryHooks | undefined) => EmbeddedBridgeFiberFallbackTelemetryMetric;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED, INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION, InspectorErrorCode, InspectorSecurityEventName, InspectorSecurityReasonCode } from '../../../inspector-protocol/src/index.ts';
|
|
2
|
+
import { InspectorSessionTokenRejectionReason } from './tokenValidation';
|
|
3
|
+
export { INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED, INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION, mapOversizeRejectionReasonToSecurityReasonCode, } from '../../../inspector-protocol/src/index.ts';
|
|
4
|
+
export type { InspectorSecurityEventName, InspectorSecurityReasonCode };
|
|
5
|
+
export { inspectorSecurityEventNames, inspectorSecurityReasonCodes, } from '../../../inspector-protocol/src/index.ts';
|
|
6
|
+
export type EmbeddedInspectorSecurityRejectionEvent = {
|
|
7
|
+
schemaVersion: typeof INSPECTOR_SECURITY_EVENT_SCHEMA_VERSION;
|
|
8
|
+
eventName: typeof INSPECTOR_SECURITY_EVENT_NAME_MESSAGE_REJECTED;
|
|
9
|
+
reasonCode: InspectorSecurityReasonCode;
|
|
10
|
+
rejectedBy: 'embedded';
|
|
11
|
+
messageType?: string;
|
|
12
|
+
requestId?: string;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
errorCode: InspectorErrorCode;
|
|
15
|
+
};
|
|
16
|
+
export type EmbeddedInspectorSecurityEventLogger = (event: EmbeddedInspectorSecurityRejectionEvent) => void;
|
|
17
|
+
export declare const mapTokenValidationRejectionToSecurityReasonCode: (reason: InspectorSessionTokenRejectionReason) => InspectorSecurityReasonCode;
|
|
18
|
+
export declare const emitEmbeddedInspectorSecurityRejectionEvent: (event: Omit<EmbeddedInspectorSecurityRejectionEvent, "schemaVersion" | "eventName" | "rejectedBy">, logger?: EmbeddedInspectorSecurityEventLogger) => EmbeddedInspectorSecurityRejectionEvent;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { InspectorOversizeRejectionReason } from '../../../inspector-protocol/src/index.ts';
|
|
2
|
+
export declare const EMBEDDED_MAX_INBOUND_INSPECTOR_MESSAGE_BYTES: number;
|
|
3
|
+
export declare const EMBEDDED_OVERSIZE_MESSAGE_REASON: InspectorOversizeRejectionReason;
|
|
4
|
+
export type EmbeddedInboundMessageSizePolicy = {
|
|
5
|
+
maxInboundMessageBytes: number;
|
|
6
|
+
reason: InspectorOversizeRejectionReason;
|
|
7
|
+
};
|
|
8
|
+
export type EmbeddedInboundMessageSizeResult = {
|
|
9
|
+
ok: true;
|
|
10
|
+
sizeInBytes: number;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
sizeInBytes?: number;
|
|
14
|
+
maxInboundMessageBytes: number;
|
|
15
|
+
reason: InspectorOversizeRejectionReason;
|
|
16
|
+
};
|
|
17
|
+
export declare const embeddedInboundMessageSizePolicy: EmbeddedInboundMessageSizePolicy;
|
|
18
|
+
export declare const measureInspectorMessageSizeInBytes: (message: unknown) => number | undefined;
|
|
19
|
+
export declare const evaluateEmbeddedInboundMessageSize: (message: unknown, policy?: EmbeddedInboundMessageSizePolicy) => EmbeddedInboundMessageSizeResult;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { HelloAuthPayload } from '../../../inspector-protocol/src/index.ts';
|
|
2
|
+
export type InspectorSessionTokenRejectionReason = 'missing-auth' | 'invalid-token' | 'expired-token';
|
|
3
|
+
export type InspectorSessionTokenValidationResult = {
|
|
4
|
+
ok: true;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: InspectorSessionTokenRejectionReason;
|
|
8
|
+
message: string;
|
|
9
|
+
};
|
|
10
|
+
export type InspectorSessionTokenValidator = (auth: HelloAuthPayload | undefined) => InspectorSessionTokenValidationResult;
|
|
11
|
+
export type InspectorBridgeSecurityOptions = {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
tokenValidator?: InspectorSessionTokenValidator;
|
|
14
|
+
};
|
|
15
|
+
export declare const validateHelloSessionToken: InspectorSessionTokenValidator;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NodePropsMeta, SerializableValue } from '../../inspector-protocol/src/index.ts';
|
|
2
|
+
export type SerializeNodePropsOptions = {
|
|
3
|
+
maxDepth?: number;
|
|
4
|
+
maxKeys?: number;
|
|
5
|
+
};
|
|
6
|
+
export type SerializeNodePropsResult = {
|
|
7
|
+
props: Record<string, SerializableValue>;
|
|
8
|
+
meta: NodePropsMeta;
|
|
9
|
+
};
|
|
10
|
+
export declare const serializeNodeProps: (input: unknown, options?: SerializeNodePropsOptions) => SerializeNodePropsResult;
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@iteraai/react-component-inspector",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Browser bridge and iteration runtime for the Itera React component inspector SDK.",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./embeddedBootstrap": {
|
|
21
|
+
"types": "./dist/embeddedBootstrap.d.ts",
|
|
22
|
+
"import": "./dist/embeddedBootstrap.js"
|
|
23
|
+
},
|
|
24
|
+
"./bridgeRuntime": {
|
|
25
|
+
"types": "./dist/bridgeRuntime.d.ts",
|
|
26
|
+
"import": "./dist/bridgeRuntime.js"
|
|
27
|
+
},
|
|
28
|
+
"./iterationInspector": {
|
|
29
|
+
"types": "./dist/iterationInspector/index.d.ts",
|
|
30
|
+
"import": "./dist/iterationInspector.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/iteraai/component-inspector.git",
|
|
36
|
+
"directory": "packages/react-component-inspector"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/iteraai/component-inspector/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/iteraai/component-inspector/tree/main/packages/react-component-inspector#readme",
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "vite build",
|
|
47
|
+
"prepack": "npm run build",
|
|
48
|
+
"type-check": "tsc --noEmit",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:watch": "vitest watch",
|
|
51
|
+
"lint": "eslint . --fix",
|
|
52
|
+
"lint:ci": "eslint . --max-warnings=0"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@iteraai/inspector-protocol": "0.1.0",
|
|
56
|
+
"react-devtools-inline": "^6.1.5"
|
|
57
|
+
},
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"react": "^18.3.0 || ^19.0.0",
|
|
60
|
+
"react-dom": "^18.3.0 || ^19.0.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@eslint/js": "^9.19.0",
|
|
64
|
+
"@stylistic/eslint-plugin-ts": "^4.2.0",
|
|
65
|
+
"@types/node": "^22.13.1",
|
|
66
|
+
"eslint": "^9.20.1",
|
|
67
|
+
"eslint-config-prettier": "^10.0.1",
|
|
68
|
+
"eslint-plugin-unicorn": "^58.0.0",
|
|
69
|
+
"globals": "^15.14.0",
|
|
70
|
+
"jsdom": "^26.0.0",
|
|
71
|
+
"typescript": "~5.6.2",
|
|
72
|
+
"typescript-eslint": "^8.23.0",
|
|
73
|
+
"vite": "^6.0.5",
|
|
74
|
+
"vite-plugin-dts": "^4.5.4",
|
|
75
|
+
"vitest": "^3.0.8"
|
|
76
|
+
}
|
|
77
|
+
}
|