@spotpatch/runtime 1.15.2 → 1.15.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/data-flow-panel.ts","../src/data-flow-panel-entry.ts"],"sourcesContent":["import type { DataDependency, SpotPatchLocale } from \"@spotpatch/shared\";\n\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport type {\n DataFlowPanel,\n DataFlowPanelSnapshot,\n DataFlowViewState,\n} from \"./data-flow-panel-contract.js\";\n\ninterface Labels {\n readonly server: string;\n readonly client: string;\n readonly bindings: string;\n readonly changes: string;\n readonly componentEmpty: string;\n readonly componentTab: string;\n readonly componentTitle: string;\n readonly consumed: string;\n readonly declared: string;\n readonly diagnostics: string;\n readonly disabled: string;\n readonly error: string;\n readonly evidence: string;\n readonly loading: string;\n readonly logicalObserved: string;\n readonly noParameters: string;\n readonly observed: string;\n readonly pageEmpty: string;\n readonly pageTab: string;\n readonly pageTitle: string;\n readonly parameters: string;\n readonly refresh: string;\n readonly unknown: string;\n}\n\nconst LABELS = Object.freeze({\n \"zh-CN\": Object.freeze({\n server: \"服务端(静态证据)\",\n client: \"浏览器\",\n bindings: \"数据去向\",\n changes: \"修改说明\",\n componentEmpty: \"当前组件没有找到可证明的接口。未找到不等于没有请求。\",\n componentTab: \"数据链路\",\n componentTitle: \"组件数据链路\",\n consumed: \"读取字段\",\n declared: \"代码声明,尚未在本次页面会话中观测\",\n diagnostics: \"诊断\",\n disabled: \"数据链路能力未启用,请在插件配置中设置 dataFlow: {}。\",\n error: \"数据链路报告加载失败\",\n evidence: \"证据\",\n loading: \"正在分析源码并合并运行时证据…\",\n logicalObserved: \"本次会话已进入 tRPC 调用链\",\n noParameters: \"未提取到可证明的参数键\",\n observed: \"本次会话已实际请求\",\n pageEmpty: \"当前已选页面范围内没有静态接口或运行时网络记录。\",\n pageTab: \"页面接口\",\n pageTitle: \"页面接口\",\n parameters: \"请求参数\",\n refresh: \"刷新证据\",\n unknown: \"未知\",\n }),\n \"en-US\": Object.freeze({\n server: \"Server (static evidence)\",\n client: \"Browser\",\n bindings: \"Data destinations\",\n changes: \"Changes\",\n componentEmpty:\n \"No proven interface was found for this component. This does not prove that no request exists.\",\n componentTab: \"Data flow\",\n componentTitle: \"Component data flow\",\n consumed: \"Consumed fields\",\n declared: \"Declared in code, not observed in this page session\",\n diagnostics: \"Diagnostics\",\n disabled: \"Data flow is disabled. Set dataFlow: {} in the plugin options.\",\n error: \"Failed to load the data-flow report\",\n evidence: \"Evidence\",\n loading: \"Analyzing source and merging runtime evidence…\",\n logicalObserved: \"Dispatched through the tRPC link in this session\",\n noParameters: \"No proven parameter keys were extracted\",\n observed: \"Actually requested in this session\",\n pageEmpty:\n \"No static interface or runtime traffic is available for the selected page scope.\",\n pageTab: \"Page APIs\",\n pageTitle: \"Page interfaces\",\n parameters: \"Request parameters\",\n refresh: \"Refresh evidence\",\n unknown: \"Unknown\",\n }),\n}) satisfies Readonly<Record<SpotPatchLocale, Labels>>;\n\nfunction badge(document: Document, text: string, tone: string): HTMLElement {\n const element = createMarkedElement(document, \"span\");\n element.className = \"spotpatch-data-flow-badge\";\n element.dataset.tone = tone;\n element.textContent = text;\n return element;\n}\n\nfunction detailRow(document: Document, label: string, value: string): HTMLElement {\n const row = createMarkedElement(document, \"div\");\n row.className = \"spotpatch-data-flow-detail\";\n const key = createMarkedElement(document, \"span\");\n key.textContent = label;\n const content = createMarkedElement(document, \"code\");\n content.textContent = value;\n row.append(key, content);\n return row;\n}\n\nfunction renderDependency(\n document: Document,\n dependency: DataDependency,\n labels: Labels,\n): HTMLElement {\n const card = createMarkedElement(document, \"article\");\n card.className = \"spotpatch-data-flow-card\";\n const header = createMarkedElement(document, \"div\");\n header.className = \"spotpatch-data-flow-card-head\";\n const endpoint = createMarkedElement(document, \"div\");\n endpoint.className = \"spotpatch-data-flow-endpoint\";\n const method = createMarkedElement(document, \"strong\");\n method.textContent = dependency.method ?? labels.unknown;\n const path = createMarkedElement(document, \"code\");\n path.textContent =\n dependency.url === undefined\n ? (dependency.operation ?? labels.unknown)\n : `${dependency.url.origin ?? \"\"}${dependency.url.pathname}`;\n endpoint.append(method, path);\n const states = createMarkedElement(document, \"div\");\n states.className = \"spotpatch-data-flow-badges\";\n states.append(\n badge(\n document,\n dependency.execution === \"observed\"\n ? dependency.kind === \"rpc\"\n ? labels.logicalObserved\n : labels.observed\n : labels.declared,\n dependency.execution === \"observed\" ? \"success\" : \"neutral\",\n ),\n badge(\n document,\n dependency.proof,\n dependency.proof === \"proven\" ? \"proof\" : \"warning\",\n ),\n badge(document, dependency.association, \"neutral\"),\n );\n header.append(endpoint, states);\n if (dependency.environment !== undefined)\n states.append(badge(document, labels[dependency.environment], \"neutral\"));\n\n const parameters =\n dependency.parameters.length === 0\n ? labels.noParameters\n : dependency.parameters\n .map(\n (parameter) =>\n `${parameter.position}.${parameter.path}${parameter.type === undefined ? \"\" : `: ${parameter.type}`}${parameter.sensitive ? \" [sensitive]\" : \"\"}${parameter.condition === undefined ? \"\" : ` [when ${parameter.condition}]`}`,\n )\n .join(\"\\n\");\n const consumed =\n dependency.response.consumedFields.length === 0\n ? labels.unknown\n : dependency.response.consumedFields.join(\", \");\n const bindings =\n dependency.suppliedBindings.length === 0\n ? labels.unknown\n : dependency.suppliedBindings.join(\", \");\n const body = createMarkedElement(document, \"div\");\n body.className = \"spotpatch-data-flow-card-body\";\n const observationIds = new Set(dependency.observationIds);\n const staticEvidenceCount = dependency.evidenceIds.filter(\n (id) => !observationIds.has(id),\n ).length;\n body.append(\n detailRow(document, labels.parameters, parameters),\n detailRow(document, labels.consumed, consumed),\n detailRow(document, labels.bindings, bindings),\n detailRow(\n document,\n labels.evidence,\n `${String(staticEvidenceCount)} static · ${String(dependency.observationIds.length)} runtime`,\n ),\n );\n card.append(header, body);\n return card;\n}\n\nfunction createReportRoot(\n document: Document,\n titleText: string,\n): Readonly<{ root: HTMLElement; status: HTMLElement; list: HTMLElement }> {\n const root = createMarkedElement(document, \"section\");\n root.className = \"spotpatch-data-flow-panel\";\n const title = createMarkedElement(document, \"h3\");\n title.textContent = titleText;\n const status = createMarkedElement(document, \"p\");\n status.className = \"spotpatch-data-flow-status\";\n const list = createMarkedElement(document, \"div\");\n list.className = \"spotpatch-data-flow-list\";\n root.append(title, status, list);\n return Object.freeze({ root, status, list });\n}\n\nexport function createDataFlowPanel(\n document: Document,\n enabled: boolean,\n locale: () => SpotPatchLocale,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n onViewChange: () => void,\n): DataFlowPanel {\n let labels = LABELS[locale()];\n const component = createReportRoot(document, labels.componentTitle);\n const page = createReportRoot(document, labels.pageTitle);\n const refreshButton = createButton(document, labels.refresh);\n const styles = document.createElement(\"style\");\n styles.textContent = DATA_FLOW_PANEL_STYLES;\n refreshButton.classList.add(\"spotpatch-data-flow-refresh\");\n component.root.prepend(refreshButton);\n const root = createMarkedElement(document, \"div\");\n const tabs = createMarkedElement(document, \"nav\");\n tabs.className = \"spotpatch-view-tabs\";\n tabs.setAttribute(\"aria-label\", \"SpotPatch views\");\n tabs.setAttribute(\"role\", \"tablist\");\n const views = new Map([\n [\"changes\", changesRoot],\n [\"component-data\", component.root],\n [\"page-data\", page.root],\n [\"diagnostics\", diagnosticsRoot],\n ]);\n const tabButtons = new Map<string, HTMLButtonElement>();\n let activeView = \"changes\";\n for (const id of views.keys()) {\n const button = createButton(document, \"\");\n button.dataset.viewId = id;\n button.id = `spotpatch-view-${id}-tab`;\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", String(id === activeView));\n const view = views.get(id);\n view?.setAttribute(\"aria-labelledby\", button.id);\n view?.setAttribute(\"role\", \"tabpanel\");\n if (!enabled && (id === \"component-data\" || id === \"page-data\")) {\n button.hidden = true;\n }\n tabButtons.set(id, button);\n tabs.append(button);\n }\n root.append(tabs, ...views.values());\n\n function selectView(viewId: string): void {\n if (!views.has(viewId)) return;\n activeView = viewId;\n for (const [id, view] of views) {\n view.hidden = id !== viewId;\n const button = tabButtons.get(id);\n button?.setAttribute(\"aria-selected\", String(id === viewId));\n if (button !== undefined) button.tabIndex = id === viewId ? 0 : -1;\n }\n onViewChange();\n }\n\n function handleTabClick(event: Event): void {\n if (!(event.target instanceof HTMLButtonElement)) return;\n const viewId = event.target.dataset.viewId;\n if (viewId !== undefined) selectView(viewId);\n }\n\n tabs.addEventListener(\"click\", handleTabClick);\n selectView(activeView);\n\n function renderSnapshot(\n target: ReturnType<typeof createReportRoot>,\n snapshot: DataFlowPanelSnapshot,\n empty: string,\n ): void {\n target.list.replaceChildren();\n target.status.dataset.state = snapshot.status;\n if (!enabled || snapshot.status === \"disabled\") {\n target.status.textContent = labels.disabled;\n return;\n }\n if (snapshot.status === \"loading\") {\n target.status.textContent = labels.loading;\n return;\n }\n if (snapshot.status === \"error\") {\n target.status.textContent = snapshot.message ?? labels.error;\n return;\n }\n const report = snapshot.report;\n const diagnosticCodes =\n report === undefined\n ? \"\"\n : [...new Set(report.diagnostics.map(({ code }) => code))].join(\", \");\n const diagnosticSuffix =\n diagnosticCodes.length === 0\n ? \"\"\n : ` · ${labels.diagnostics}: ${diagnosticCodes}`;\n if (report === undefined || report.dependencies.length === 0) {\n target.status.textContent = `${empty}${diagnosticSuffix}`;\n return;\n }\n target.status.textContent = `${String(report.dependencies.length)} · ${report.completeness.complete ? \"complete\" : \"partial\"}${diagnosticSuffix}`;\n target.list.append(\n ...report.dependencies.map((dependency) =>\n renderDependency(document, dependency, labels),\n ),\n );\n }\n\n return Object.freeze({\n root,\n refreshButton,\n styles,\n dispose(): void {\n tabs.removeEventListener(\"click\", handleTabClick);\n },\n render(state: DataFlowViewState): void {\n labels = LABELS[locale()];\n const tabLabels = [\n labels.changes,\n labels.componentTab,\n labels.pageTab,\n labels.diagnostics,\n ];\n [...tabButtons.values()].forEach((button, index) => {\n button.textContent = tabLabels[index] ?? \"\";\n });\n refreshButton.textContent = `${labels.refresh} · ${String(state.observationCount)}`;\n refreshButton.disabled = !enabled || state.component.status === \"loading\";\n renderSnapshot(component, state.component, labels.componentEmpty);\n renderSnapshot(page, state.page, labels.pageEmpty);\n },\n resetView(): void {\n selectView(\"changes\");\n },\n });\n}\n\nconst DATA_FLOW_PANEL_STYLES = `\n .spotpatch-view-tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; margin-bottom: 12px; padding: 3px; border: 1px solid rgb(255 255 255 / 7%); border-radius: 9px; background: rgb(3 7 18 / 42%); }\n .spotpatch-view-tabs button { min-width: 0; border: 0; border-radius: 7px; padding: 7px 5px; color: var(--spotpatch-text-muted); background: transparent; cursor: pointer; font-size: 10.5px; }\n .spotpatch-view-tabs button[aria-selected=\"true\"] { color: #f8fafc; background: rgb(139 124 247 / 18%); }\n .spotpatch-data-flow-panel { position: relative; }\n .spotpatch-data-flow-panel > h3 { margin: 0 0 3px; color: #f3f4f6; font-size: 13px; }\n .spotpatch-data-flow-refresh { position: absolute; top: -4px; right: 0; border: 1px solid rgb(139 124 247 / 30%); border-radius: 7px; padding: 4px 8px; color: #c4baff; background: rgb(139 124 247 / 8%); cursor: pointer; font-size: 10.5px; }\n .spotpatch-data-flow-refresh:disabled { cursor: not-allowed; opacity: .45; }\n .spotpatch-data-flow-status { margin: 0 0 10px; color: var(--spotpatch-text-muted); font-size: 10.5px; line-height: 1.5; }\n .spotpatch-data-flow-list { display: grid; gap: 8px; }\n .spotpatch-data-flow-card { overflow: hidden; border: 1px solid rgb(255 255 255 / 8%); border-radius: 9px; background: rgb(255 255 255 / 2.5%); }\n .spotpatch-data-flow-card-head { display: grid; gap: 7px; padding: 10px; border-bottom: 1px solid rgb(255 255 255 / 7%); }\n .spotpatch-data-flow-endpoint { display: flex; min-width: 0; align-items: center; gap: 8px; }\n .spotpatch-data-flow-endpoint strong { color: #79d9e7; font: 700 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-data-flow-endpoint code { min-width: 0; overflow: hidden; color: #f8fafc; font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; text-overflow: ellipsis; white-space: nowrap; }\n .spotpatch-data-flow-badges { display: flex; flex-wrap: wrap; gap: 4px; }\n .spotpatch-data-flow-badge { border-radius: 999px; padding: 2px 6px; color: #9ca3af; background: rgb(255 255 255 / 5%); font-size: 9px; }\n .spotpatch-data-flow-badge[data-tone=\"success\"] { color: #6ee7b7; background: rgb(16 185 129 / 10%); }\n .spotpatch-data-flow-badge[data-tone=\"proof\"] { color: #c4b5fd; background: rgb(139 92 246 / 11%); }\n .spotpatch-data-flow-badge[data-tone=\"warning\"] { color: #fcd34d; background: rgb(245 158 11 / 10%); }\n .spotpatch-data-flow-card-body { display: grid; gap: 7px; padding: 10px; }\n .spotpatch-data-flow-detail { display: grid; grid-template-columns: 82px minmax(0, 1fr); gap: 8px; align-items: start; }\n .spotpatch-data-flow-detail > span { color: var(--spotpatch-text-muted); font-size: 10px; }\n .spotpatch-data-flow-detail > code { overflow-wrap: anywhere; color: #cbd5e1; font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }\n`;\n","export { createDataFlowPanel } from \"./ui/data-flow-panel.js\";\nexport {\n getDataFlowExtension,\n registerDataFlowExtension,\n type DataFlowExtension,\n type DataFlowPanel,\n type DataFlowPanelFactory,\n type DataFlowPanelSnapshot,\n type DataFlowPanelStatus,\n type DataFlowViewState,\n} from \"./ui/data-flow-panel-contract.js\";\n\nimport {\n getDataFlowRuntime,\n mergeComponentDataFlowReport,\n mergePageDataFlowReport,\n} from \"./data-flow-entry.js\";\nimport { createDataFlowPanel } from \"./ui/data-flow-panel.js\";\nimport { registerDataFlowExtension } from \"./ui/data-flow-panel-contract.js\";\n\nexport function installDataFlowPanelExtension(): void {\n registerDataFlowExtension(\n Object.freeze({\n createPanel: createDataFlowPanel,\n getComponentRegistration(component: object) {\n return getDataFlowRuntime()?.getComponentRegistration(component);\n },\n observations(routeKey: string) {\n const runtime = getDataFlowRuntime();\n runtime?.updateRoute(routeKey);\n return runtime?.observations() ?? Object.freeze([]);\n },\n mergeComponentReport: mergeComponentDataFlowReport,\n mergePageReport: mergePageDataFlowReport,\n }),\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/ui/data-flow-panel.ts","../src/data-flow-panel-entry.ts"],"sourcesContent":["import type { DataDependency, SpotPatchLocale } from \"@spotpatch/shared\";\n\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport type {\n DataFlowPanel,\n DataFlowPanelSnapshot,\n DataFlowViewState,\n} from \"./data-flow-panel-contract.js\";\n\ninterface Labels {\n readonly server: string;\n readonly client: string;\n readonly bindings: string;\n readonly changes: string;\n readonly componentEmpty: string;\n readonly componentTab: string;\n readonly componentTitle: string;\n readonly consumed: string;\n readonly declared: string;\n readonly diagnostics: string;\n readonly disabled: string;\n readonly error: string;\n readonly evidence: string;\n readonly loading: string;\n readonly logicalObserved: string;\n readonly noParameters: string;\n readonly observed: string;\n readonly pageEmpty: string;\n readonly pageTab: string;\n readonly pageTitle: string;\n readonly parameters: string;\n readonly refresh: string;\n readonly unknown: string;\n}\n\nconst LABELS = Object.freeze({\n \"zh-CN\": Object.freeze({\n server: \"服务端(静态证据)\",\n client: \"浏览器\",\n bindings: \"数据去向\",\n changes: \"修改说明\",\n componentEmpty: \"当前组件没有找到可证明的接口。未找到不等于没有请求。\",\n componentTab: \"数据链路\",\n componentTitle: \"组件数据链路\",\n consumed: \"读取字段\",\n declared: \"代码声明,尚未在本次页面会话中观测\",\n diagnostics: \"诊断\",\n disabled: \"数据链路能力未启用,请在插件配置中设置 dataFlow: {}。\",\n error: \"数据链路报告加载失败\",\n evidence: \"证据\",\n loading: \"正在分析源码并合并运行时证据…\",\n logicalObserved: \"本次会话已进入 tRPC 调用链\",\n noParameters: \"未提取到可证明的参数键\",\n observed: \"本次会话已实际请求\",\n pageEmpty: \"当前已选页面范围内没有静态接口或运行时网络记录。\",\n pageTab: \"页面接口\",\n pageTitle: \"页面接口\",\n parameters: \"请求参数\",\n refresh: \"刷新证据\",\n unknown: \"未知\",\n }),\n \"en-US\": Object.freeze({\n server: \"Server (static evidence)\",\n client: \"Browser\",\n bindings: \"Data destinations\",\n changes: \"Changes\",\n componentEmpty:\n \"No proven interface was found for this component. This does not prove that no request exists.\",\n componentTab: \"Data flow\",\n componentTitle: \"Component data flow\",\n consumed: \"Consumed fields\",\n declared: \"Declared in code, not observed in this page session\",\n diagnostics: \"Diagnostics\",\n disabled: \"Data flow is disabled. Set dataFlow: {} in the plugin options.\",\n error: \"Failed to load the data-flow report\",\n evidence: \"Evidence\",\n loading: \"Analyzing source and merging runtime evidence…\",\n logicalObserved: \"Dispatched through the tRPC link in this session\",\n noParameters: \"No proven parameter keys were extracted\",\n observed: \"Actually requested in this session\",\n pageEmpty:\n \"No static interface or runtime traffic is available for the selected page scope.\",\n pageTab: \"Page APIs\",\n pageTitle: \"Page interfaces\",\n parameters: \"Request parameters\",\n refresh: \"Refresh evidence\",\n unknown: \"Unknown\",\n }),\n}) satisfies Readonly<Record<SpotPatchLocale, Labels>>;\n\nfunction badge(document: Document, text: string, tone: string): HTMLElement {\n const element = createMarkedElement(document, \"span\");\n element.className = \"spotpatch-data-flow-badge\";\n element.dataset.tone = tone;\n element.textContent = text;\n return element;\n}\n\nfunction detailRow(document: Document, label: string, value: string): HTMLElement {\n const row = createMarkedElement(document, \"div\");\n row.className = \"spotpatch-data-flow-detail\";\n const key = createMarkedElement(document, \"span\");\n key.textContent = label;\n const content = createMarkedElement(document, \"code\");\n content.textContent = value;\n row.append(key, content);\n return row;\n}\n\nfunction renderDependency(\n document: Document,\n dependency: DataDependency,\n labels: Labels,\n): HTMLElement {\n const card = createMarkedElement(document, \"article\");\n card.className = \"spotpatch-data-flow-card\";\n const header = createMarkedElement(document, \"div\");\n header.className = \"spotpatch-data-flow-card-head\";\n const endpoint = createMarkedElement(document, \"div\");\n endpoint.className = \"spotpatch-data-flow-endpoint\";\n const method = createMarkedElement(document, \"strong\");\n method.textContent = dependency.method ?? labels.unknown;\n const path = createMarkedElement(document, \"code\");\n path.textContent =\n dependency.url === undefined\n ? (dependency.operation ?? labels.unknown)\n : `${dependency.url.origin ?? \"\"}${dependency.url.pathname}`;\n endpoint.append(method, path);\n const states = createMarkedElement(document, \"div\");\n states.className = \"spotpatch-data-flow-badges\";\n states.append(\n badge(\n document,\n dependency.execution === \"observed\"\n ? dependency.kind === \"rpc\"\n ? labels.logicalObserved\n : labels.observed\n : labels.declared,\n dependency.execution === \"observed\" ? \"success\" : \"neutral\",\n ),\n badge(\n document,\n dependency.proof,\n dependency.proof === \"proven\" ? \"proof\" : \"warning\",\n ),\n badge(document, dependency.association, \"neutral\"),\n );\n header.append(endpoint, states);\n if (dependency.environment !== undefined)\n states.append(badge(document, labels[dependency.environment], \"neutral\"));\n\n const parameters =\n dependency.parameters.length === 0\n ? labels.noParameters\n : dependency.parameters\n .map(\n (parameter) =>\n `${parameter.position}.${parameter.path}${parameter.type === undefined ? \"\" : `: ${parameter.type}`}${parameter.sensitive ? \" [sensitive]\" : \"\"}${parameter.condition === undefined ? \"\" : ` [when ${parameter.condition}]`}`,\n )\n .join(\"\\n\");\n const consumed =\n dependency.response.consumedFields.length === 0\n ? labels.unknown\n : dependency.response.consumedFields.join(\", \");\n const bindings =\n dependency.suppliedBindings.length === 0\n ? labels.unknown\n : dependency.suppliedBindings.join(\", \");\n const body = createMarkedElement(document, \"div\");\n body.className = \"spotpatch-data-flow-card-body\";\n const observationIds = new Set(dependency.observationIds);\n const staticEvidenceCount = dependency.evidenceIds.filter(\n (id) => !observationIds.has(id),\n ).length;\n body.append(\n detailRow(document, labels.parameters, parameters),\n detailRow(document, labels.consumed, consumed),\n detailRow(document, labels.bindings, bindings),\n detailRow(\n document,\n labels.evidence,\n `${String(staticEvidenceCount)} static · ${String(dependency.observationIds.length)} runtime`,\n ),\n );\n card.append(header, body);\n return card;\n}\n\nfunction createReportRoot(\n document: Document,\n titleText: string,\n): Readonly<{ root: HTMLElement; status: HTMLElement; list: HTMLElement }> {\n const root = createMarkedElement(document, \"section\");\n root.className = \"spotpatch-data-flow-panel\";\n const title = createMarkedElement(document, \"h3\");\n title.textContent = titleText;\n const status = createMarkedElement(document, \"p\");\n status.className = \"spotpatch-data-flow-status\";\n const list = createMarkedElement(document, \"div\");\n list.className = \"spotpatch-data-flow-list\";\n root.append(title, status, list);\n return Object.freeze({ root, status, list });\n}\n\nexport function createDataFlowPanel(\n document: Document,\n enabled: boolean,\n locale: () => SpotPatchLocale,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n onViewChange: () => void,\n): DataFlowPanel {\n let labels = LABELS[locale()];\n const component = createReportRoot(document, labels.componentTitle);\n const page = createReportRoot(document, labels.pageTitle);\n const refreshButton = createButton(document, labels.refresh);\n const styles = document.createElement(\"style\");\n styles.textContent = DATA_FLOW_PANEL_STYLES;\n refreshButton.classList.add(\"spotpatch-data-flow-refresh\");\n component.root.prepend(refreshButton);\n const root = createMarkedElement(document, \"div\");\n const tabs = createMarkedElement(document, \"nav\");\n tabs.className = \"spotpatch-view-tabs\";\n tabs.setAttribute(\"aria-label\", \"SpotPatch views\");\n tabs.setAttribute(\"role\", \"tablist\");\n const views = new Map([\n [\"changes\", changesRoot],\n [\"component-data\", component.root],\n [\"page-data\", page.root],\n [\"diagnostics\", diagnosticsRoot],\n ]);\n const tabButtons = new Map<string, HTMLButtonElement>();\n let activeView = \"changes\";\n for (const id of views.keys()) {\n const button = createButton(document, \"\");\n button.dataset.viewId = id;\n button.id = `spotpatch-view-${id}-tab`;\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", String(id === activeView));\n const view = views.get(id);\n view?.setAttribute(\"aria-labelledby\", button.id);\n view?.setAttribute(\"role\", \"tabpanel\");\n if (!enabled && (id === \"component-data\" || id === \"page-data\")) {\n button.hidden = true;\n }\n tabButtons.set(id, button);\n tabs.append(button);\n }\n root.append(tabs, ...views.values());\n\n function selectView(viewId: string): void {\n if (!views.has(viewId)) return;\n activeView = viewId;\n for (const [id, view] of views) {\n view.hidden = id !== viewId;\n const button = tabButtons.get(id);\n button?.setAttribute(\"aria-selected\", String(id === viewId));\n if (button !== undefined) button.tabIndex = id === viewId ? 0 : -1;\n }\n onViewChange();\n }\n\n function handleTabClick(event: Event): void {\n if (!(event.target instanceof HTMLButtonElement)) return;\n const viewId = event.target.dataset.viewId;\n if (viewId !== undefined) selectView(viewId);\n }\n\n tabs.addEventListener(\"click\", handleTabClick);\n selectView(activeView);\n\n function renderSnapshot(\n target: ReturnType<typeof createReportRoot>,\n snapshot: DataFlowPanelSnapshot,\n empty: string,\n ): void {\n target.list.replaceChildren();\n target.status.dataset.state = snapshot.status;\n if (!enabled || snapshot.status === \"disabled\") {\n target.status.textContent = labels.disabled;\n return;\n }\n if (snapshot.status === \"loading\") {\n target.status.textContent = labels.loading;\n return;\n }\n if (snapshot.status === \"error\") {\n target.status.textContent = snapshot.message ?? labels.error;\n return;\n }\n const report = snapshot.report;\n const diagnosticCodes =\n report === undefined\n ? \"\"\n : [...new Set(report.diagnostics.map(({ code }) => code))].join(\", \");\n const diagnosticSuffix =\n diagnosticCodes.length === 0\n ? \"\"\n : ` · ${labels.diagnostics}: ${diagnosticCodes}`;\n if (report === undefined || report.dependencies.length === 0) {\n target.status.textContent = `${empty}${diagnosticSuffix}`;\n return;\n }\n target.status.textContent = `${String(report.dependencies.length)} · ${report.completeness.complete ? \"complete\" : \"partial\"}${diagnosticSuffix}`;\n target.list.append(\n ...report.dependencies.map((dependency) =>\n renderDependency(document, dependency, labels),\n ),\n );\n }\n\n return Object.freeze({\n root,\n refreshButton,\n styles,\n dispose(): void {\n tabs.removeEventListener(\"click\", handleTabClick);\n },\n render(state: DataFlowViewState): void {\n labels = LABELS[locale()];\n const tabLabels = [\n labels.changes,\n labels.componentTab,\n labels.pageTab,\n labels.diagnostics,\n ];\n [...tabButtons.values()].forEach((button, index) => {\n button.textContent = tabLabels[index] ?? \"\";\n });\n refreshButton.textContent = `${labels.refresh} · ${String(state.observationCount)}`;\n refreshButton.disabled = !enabled || state.component.status === \"loading\";\n renderSnapshot(component, state.component, labels.componentEmpty);\n renderSnapshot(page, state.page, labels.pageEmpty);\n },\n resetView(): void {\n selectView(\"changes\");\n },\n });\n}\n\nconst DATA_FLOW_PANEL_STYLES = `\n .spotpatch-view-tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; margin-bottom: 12px; padding: 3px; border: 1px solid rgb(255 255 255 / 7%); border-radius: 9px; background: rgb(3 7 18 / 42%); }\n .spotpatch-view-tabs button { min-width: 0; border: 0; border-radius: 7px; padding: 7px 5px; color: var(--spotpatch-text-muted); background: transparent; cursor: pointer; font-size: 10.5px; }\n .spotpatch-view-tabs button[aria-selected=\"true\"] { color: #f8fafc; background: rgb(139 124 247 / 18%); }\n .spotpatch-data-flow-panel { position: relative; }\n .spotpatch-data-flow-panel > h3 { margin: 0 0 3px; color: #f3f4f6; font-size: 13px; }\n .spotpatch-data-flow-refresh { position: absolute; top: -4px; right: 0; border: 1px solid rgb(139 124 247 / 30%); border-radius: 7px; padding: 4px 8px; color: #c4baff; background: rgb(139 124 247 / 8%); cursor: pointer; font-size: 10.5px; }\n .spotpatch-data-flow-refresh:disabled { cursor: not-allowed; opacity: .45; }\n .spotpatch-data-flow-status { margin: 0 0 10px; color: var(--spotpatch-text-muted); font-size: 10.5px; line-height: 1.5; }\n .spotpatch-data-flow-list { display: grid; gap: 8px; }\n .spotpatch-data-flow-card { overflow: hidden; border: 1px solid rgb(255 255 255 / 8%); border-radius: 9px; background: rgb(255 255 255 / 2.5%); }\n .spotpatch-data-flow-card-head { display: grid; gap: 7px; padding: 10px; border-bottom: 1px solid rgb(255 255 255 / 7%); }\n .spotpatch-data-flow-endpoint { display: flex; min-width: 0; align-items: center; gap: 8px; }\n .spotpatch-data-flow-endpoint strong { color: #79d9e7; font: 700 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-data-flow-endpoint code { min-width: 0; overflow: hidden; color: #f8fafc; font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; text-overflow: ellipsis; white-space: nowrap; }\n .spotpatch-data-flow-badges { display: flex; flex-wrap: wrap; gap: 4px; }\n .spotpatch-data-flow-badge { border-radius: 999px; padding: 2px 6px; color: #9ca3af; background: rgb(255 255 255 / 5%); font-size: 9px; }\n .spotpatch-data-flow-badge[data-tone=\"success\"] { color: #6ee7b7; background: rgb(16 185 129 / 10%); }\n .spotpatch-data-flow-badge[data-tone=\"proof\"] { color: #c4b5fd; background: rgb(139 92 246 / 11%); }\n .spotpatch-data-flow-badge[data-tone=\"warning\"] { color: #fcd34d; background: rgb(245 158 11 / 10%); }\n .spotpatch-data-flow-card-body { display: grid; gap: 7px; padding: 10px; }\n .spotpatch-data-flow-detail { display: grid; grid-template-columns: 82px minmax(0, 1fr); gap: 8px; align-items: start; }\n .spotpatch-data-flow-detail > span { color: var(--spotpatch-text-muted); font-size: 10px; }\n .spotpatch-data-flow-detail > code { overflow-wrap: anywhere; color: #cbd5e1; font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }\n`;\n","export { createDataFlowPanel } from \"./ui/data-flow-panel.js\";\nexport {\n getDataFlowExtension,\n registerDataFlowExtension,\n type DataFlowExtension,\n type DataFlowPanel,\n type DataFlowPanelFactory,\n type DataFlowPanelSnapshot,\n type DataFlowPanelStatus,\n type DataFlowViewState,\n} from \"./ui/data-flow-panel-contract.js\";\n\nimport {\n getDataFlowRuntime,\n mergeComponentDataFlowReport,\n mergePageDataFlowReport,\n} from \"./data-flow-entry.js\";\nimport { createDataFlowPanel } from \"./ui/data-flow-panel.js\";\nimport { registerDataFlowExtension } from \"./ui/data-flow-panel-contract.js\";\n\nexport function installDataFlowPanelExtension(): void {\n registerDataFlowExtension(\n Object.freeze({\n createPanel: createDataFlowPanel,\n getComponentRegistration(component: object) {\n return getDataFlowRuntime()?.getComponentRegistration(component);\n },\n observations(routeKey: string) {\n const runtime = getDataFlowRuntime();\n runtime?.updateRoute(routeKey);\n return runtime?.observations() ?? Object.freeze([]);\n },\n mergeComponentReport: mergeComponentDataFlowReport,\n mergePageReport: mergePageDataFlowReport,\n }),\n );\n}\n"],"mappings":"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","names":[]}