Skip to content

Commit 3614539

Browse files
committed
feat(devtools): add devtools DOM filter and integrate it into SEO components
1 parent 6d9b016 commit 3614539

6 files changed

Lines changed: 24 additions & 13 deletions

File tree

examples/react/seo/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<meta property="og:url" content="https://example.com/seo" />
2222
<meta
2323
property="og:image"
24-
content="https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=1200"
24+
content="https://images.unsplash.com/photo-1507525428034-b723cf961d3e?w=800"
2525
/>
2626
<meta name="twitter:card" content="summary_large_image" />
2727
<meta name="twitter:title" content="SEO Devtools Example" />

examples/react/seo/src/index.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import { StrictMode } from 'react'
21
import { createRoot } from 'react-dom/client'
32
import { seoDevtoolsPlugin } from '@tanstack/devtools-seo/react'
43
import { TanStackDevtools } from '@tanstack/react-devtools'
54

65
import App from './App'
76

87
createRoot(document.getElementById('root')!).render(
9-
<StrictMode>
8+
<>
109
<App />
1110
<TanStackDevtools plugins={[seoDevtoolsPlugin()]} />
12-
</StrictMode>,
11+
</>,
1312
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const DEVTOOLS_ROOT_SELECTORS = [
2+
'#tanstack_devtools',
3+
'[data-testid="tanstack_devtools"]',
4+
'[data-devtools-root]',
5+
'[id^="plugin-container-"]',
6+
'[id^="plugin-title-container-"]',
7+
] as const
8+
9+
export function isInsideDevtools(node: Element | null): boolean {
10+
if (!node) {
11+
return false
12+
}
13+
14+
return DEVTOOLS_ROOT_SELECTORS.some((selector) => !!node.closest(selector))
15+
}

packages/devtools-seo/src/heading-structure-preview.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { For, Show, createMemo, createSignal } from 'solid-js'
22
import { Section, SectionDescription } from '@tanstack/devtools-ui'
33
import { useSeoStyles } from './use-seo-styles'
44
import { pickSeverityClass } from './seo-severity'
5+
import { isInsideDevtools } from './devtools-dom-filter'
56
import { useLocationChanges } from './hooks/use-location-changes'
67
import type { SeoSeverity } from './seo-severity'
78
import type { SeoSectionSummary } from './seo-section-summary'
@@ -21,7 +22,7 @@ type HeadingIssue = {
2122
function extractHeadings(): Array<HeadingItem> {
2223
const nodes = Array.from(
2324
document.body.querySelectorAll<HTMLHeadingElement>('h1,h2,h3,h4,h5,h6'),
24-
)
25+
).filter((node) => !isInsideDevtools(node))
2526

2627
return nodes.map((node, index) => {
2728
const tag = node.tagName.toLowerCase() as HeadingItem['tag']

packages/devtools-seo/src/json-ld-preview.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { For, Show } from 'solid-js'
22
import { Section, SectionDescription } from '@tanstack/devtools-ui'
3+
import { isInsideDevtools } from './devtools-dom-filter'
34
import { useSeoStyles } from './use-seo-styles'
45
import { pickSeverityClass, seoHealthTier } from './seo-severity'
56
import type { SeoSeverity } from './seo-severity'
@@ -327,7 +328,7 @@ function analyzeJsonLdScripts(): Array<JsonLdEntry> {
327328
document.querySelectorAll<HTMLScriptElement>(
328329
'script[type="application/ld+json"]',
329330
),
330-
)
331+
).filter((script) => !isInsideDevtools(script))
331332

332333
return scripts.map((script, index) => {
333334
const raw = script.textContent.trim() || ''

packages/devtools-seo/src/links-preview.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
22
import { Section, SectionDescription } from '@tanstack/devtools-ui'
3+
import { isInsideDevtools } from './devtools-dom-filter'
34
import { useSeoStyles } from './use-seo-styles'
45
import { countBySeverity } from './seo-section-summary'
56
import { pickSeverityClass } from './seo-severity'
@@ -106,13 +107,7 @@ function analyzeLinks(): Array<LinkRow> {
106107
const anchors = Array.from(
107108
document.body.querySelectorAll<HTMLAnchorElement>('a[href]'),
108109
)
109-
return anchors
110-
.filter(
111-
(anchor) =>
112-
!anchor.closest('[data-testid="tanstack_devtools"]') &&
113-
!anchor.closest('[data-devtools-root]'),
114-
)
115-
.map(classifyLink)
110+
return anchors.filter((anchor) => !isInsideDevtools(anchor)).map(classifyLink)
116111
}
117112

118113
/** Display order in the links report: internal, external, non-web, then invalid. */

0 commit comments

Comments
 (0)