From ade4f3b328120b59b64b6e808ba0b6b6d6933056 Mon Sep 17 00:00:00 2001 From: Kiro Agent <244629292+kiro-agent@users.noreply.github.com> Date: Sat, 26 Sep 2026 08:20:51 +0000 Subject: [PATCH 1/8] docs: engine and runtime audit (Sep 2026) --- docs/AUDIT-2026-09.md | 307 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 docs/AUDIT-2026-09.md diff --git a/docs/AUDIT-2026-09.md b/docs/AUDIT-2026-09.md new file mode 100644 index 0000000..8a6bb84 --- /dev/null +++ b/docs/AUDIT-2026-09.md @@ -0,0 +1,307 @@ +# WhatStack engine and runtime audit (September 2026, v1.7.2) + +**Scope:** the detection algorithm (`shared/detect.js`, `shared/signatures.js`, matcher and classifier), the MV3 runtime (service worker, orchestrator, content script, popup), exports and the report link, the tests and tooling. + +**Method:** +- A full code read. +- Reproductions: the real `detect()` and the real MAIN-world probe (run in `node:vm`), fed crafted inputs. +- A live benchmark: the unpacked extension loaded into Chromium on **48 real sites**, reading the light badge, then the deep popup result and its evidence. + +Every **Confirmed** finding below was reproduced. The rest come from the code read and are marked **(code)**. + +--- + +## 1. Summary + +The architecture is sound. There is a pure engine, and evidence comes only from asset URLs, runtime globals and probed DOM flags, never page prose. The popup renders safely (`textContent` everywhere). The report link keeps the "Local only" promise. Real deep scans are fast: **median 46 ms, max 208 ms**. + +The main weaknesses are **trust in page-controlled values** and **pattern breadth**. The same few flaws produce most of the bad results: + +| Area | Result on 48 real sites | +|---|---| +| Badge ≠ popup count | **27 / 48 (56%)**: the badge comes from a pass that can't see JS runtime state | +| Tailwind reported MEDIUM from class names alone | **17 / 48**, including **getbootstrap.com** (a Bootstrap site) | +| Wrong framework version shown | linear.app "Next.js **v1.0.0-beta.9**", angular.dev "v22.2.0**+sha**" | +| Plainly wrong hit | clerk.com **Bootstrap HIGH**, from Clerk's own `…/bootstrap.js` loader | +| Nothing detected | youtube.com (Polymer), amazon.in, zomato.com, plus astro.build detected only as Tailwind | + +In the crafted reproductions (§3), a single `
+
Bootstrap your career
+
Axios
+
ng
+
+
+
+ + + diff --git a/tests/browser/fixtures/prose-island.html b/tests/browser/fixtures/prose-island.html new file mode 100644 index 0000000..09750a1 --- /dev/null +++ b/tests/browser/fixtures/prose-island.html @@ -0,0 +1,18 @@ + + + + +Fixture — prose in data islands + + + + + +
+

Migrating to single-spa and module federation

+

An article about micro-frontends. Words on the page are not an install.

+
+ + + + diff --git a/tests/browser/fixtures/real-tailwind.html b/tests/browser/fixtures/real-tailwind.html new file mode 100644 index 0000000..b7303ee --- /dev/null +++ b/tests/browser/fixtures/real-tailwind.html @@ -0,0 +1,19 @@ + + + + +Fixture — real Tailwind CSS + + + + +
+

Tailwind fixture

+
x
+
y
+

z

+ +
+ + + diff --git a/tests/browser/fixtures/runtime-react.html b/tests/browser/fixtures/runtime-react.html new file mode 100644 index 0000000..18e0ffe --- /dev/null +++ b/tests/browser/fixtures/runtime-react.html @@ -0,0 +1,20 @@ + + + + +Fixture — React visible only at runtime + + + +

Bundled React app

No data-reactroot, no React global, hashed chunks.

+ + + + diff --git a/tests/browser/run.mjs b/tests/browser/run.mjs index 60ffd6b..be142ad 100644 --- a/tests/browser/run.mjs +++ b/tests/browser/run.mjs @@ -1,16 +1,18 @@ /** - * End-to-end test: loads the REAL unpacked extension into REAL Chrome, + * End-to-end test: loads the REAL unpacked extension into REAL Chromium, * navigates to local fixture pages, and reads back what the extension - * actually did — the badge it set, and the signals its content script - * genuinely collected from a real DOM. + * actually did — the badge it set, and the result of a real deep scan + * (content script + MAIN-world probe + engine, through the service worker). * * No stubs. The content script's querySelector calls run against real - * parsed HTML, which is the path the node test suite cannot exercise. + * parsed HTML, and the probe runs against the page's real JS heap. + * + * npm run test:browser # headed (needs a display) + * HEADLESS=1 npm run test:browser # new headless Chromium (CI) */ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); const { chromium } = require('playwright'); -import { detect } from '../../shared/detect.js'; import { shapeForPopup } from '../../shared/result-shape.js'; import path from 'node:path'; import fs from 'node:fs'; @@ -19,17 +21,31 @@ import http from 'node:http'; import { fileURLToPath } from 'node:url'; const EXT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); -const ORIGIN = 'http://127.0.0.1:8899'; +const MANIFEST = JSON.parse(fs.readFileSync(path.join(EXT, 'manifest.json'), 'utf8')); +const HEADLESS = process.env.HEADLESS === '1' || process.env.CI === 'true'; -// fixture -> { expect: [ids that MUST be found], forbid: [ids that must NOT be] } +// fixture -> { expect: [ids that MUST be found], forbid: [ids that must NOT be], forbidSolid: [ids that may only be low] } const CASES = { - 'real-next.html': { expect: ['nextjs'], forbid: [] }, - 'docs-next.html': { expect: [], forbid: ['nextjs', 'react', 'hotjar', 'zendesk'] }, + 'real-next.html': { expect: ['nextjs', 'react'], forbid: [] }, + 'docs-next.html': { expect: [], forbid: ['nextjs', 'react', 'hotjar', 'zendesk'] }, 'real-angular.html': { expect: ['angular'], forbid: [] }, 'docs-angular.html': { expect: [], forbid: ['angular'] }, - 'real-styled.html': { expect: ['styled-components'], forbid: [] }, - 'docs-styled.html': { expect: [], forbid: ['styled-components', 'emotion'] }, - 'plain.html': { expect: [], forbid: ['react', 'vue', 'angular', 'nextjs', 'jquery'] }, + 'real-styled.html': { expect: ['styled-components'], forbid: [] }, + 'docs-styled.html': { expect: [], forbid: ['styled-components', 'emotion'] }, + 'plain.html': { expect: [], forbid: ['react', 'vue', 'angular', 'nextjs', 'jquery'] }, + // 1.8.0 — adversarial pages from the Sep 2026 audit + 'clobber.html': { + expect: [], + forbid: ['nextjs', 'react', 'bootstrap', 'axios', 'angular', 'stripe', 'sentry', 'logrocket', 'module-federation'], + }, + 'prose-island.html': { + expect: [], + forbid: ['single-spa', 'module-federation', 'qiankun', 'microfrontend', 'logrocket', 'zendesk', 'parcel', 'turbopack'], + }, + 'bootstrap-classes.html': { expect: [], forbid: [], forbidSolid: ['tailwind'] }, + 'real-tailwind.html': { expect: ['tailwind'], forbid: ['bootstrap'], solid: ['tailwind'] }, + // Runtime-only proof: the badge must count it too (background deep pass) + 'runtime-react.html': { expect: ['react'], forbid: [], solid: ['react'] }, }; // Serve fixtures from inside this process — content_scripts only match @@ -44,7 +60,7 @@ const MIME = { const server = http.createServer((req, res) => { // Fixtures reference framework-shaped URLs (/_next/static/chunks/x.js) because // the path itself is evidence the engine reads. Only the basename is on disk. - const name = path.basename(new URL(req.url, ORIGIN).pathname); + const name = path.basename(new URL(req.url, 'http://x').pathname); if (name === 'favicon.ico') { res.writeHead(204).end(); return; @@ -54,31 +70,26 @@ const server = http.createServer((req, res) => { res.writeHead(404).end('not found'); return; } - // Serve the correct MIME per extension. A script or stylesheet sent as - // text/html is refused by Chrome and surfaces as a page console error, - // which this suite counts as a failure. res.writeHead(200, { 'content-type': MIME[path.extname(name)] || 'text/plain; charset=utf-8' }); res.end(fs.readFileSync(file)); }); -await new Promise((r) => server.listen(8899, '127.0.0.1', r)); -console.log(`fixture server: ${ORIGIN}\n`); +// Port 0: parallel runs never collide. +await new Promise((r) => server.listen(0, '127.0.0.1', r)); +const ORIGIN = `http://127.0.0.1:${server.address().port}`; +console.log(`fixture server: ${ORIGIN} headless: ${HEADLESS}\n`); const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wsprofile-')); // Default to Playwright's bundled Chromium, NOT the installed `chrome` channel. -// Branded Chrome stable/beta disabled --load-extension around M137, so on any -// current stable Chrome the browser launches, loads no extension at all, and the -// only symptom is a service-worker timeout that reads like an extension bug. -// Chrome for Testing / Chromium builds still honour the switch. -// Set CHROME_PATH to point at your own Chromium-family binary. +// Branded Chrome stable/beta disabled --load-extension around M137. +// Headless extension support needs the new headless mode (channel 'chromium'). const context = await chromium.launchPersistentContext(userDataDir, { executablePath: process.env.CHROME_PATH || undefined, - headless: false, + channel: !process.env.CHROME_PATH && HEADLESS ? 'chromium' : undefined, + headless: HEADLESS, args: [ `--disable-extensions-except=${EXT}`, `--load-extension=${EXT}`, // Chrome ~137+ ignores --load-extension unless this feature is disabled. - // Without it the browser starts fine, loads nothing, and the only symptom - // is a service-worker timeout that looks like a bug in the extension. '--disable-features=DisableLoadExtensionCommandLineSwitch', '--no-sandbox', '--no-first-run', @@ -89,18 +100,54 @@ const context = await chromium.launchPersistentContext(userDataDir, { const extErrors = []; context.on('weberror', (e) => extErrors.push('weberror: ' + e.error().message)); -// Wait for the MV3 service worker to register. let [sw] = context.serviceWorkers(); if (!sw) sw = await context.waitForEvent('serviceworker', { timeout: 15000 }); const extId = new URL(sw.url()).host; -console.log(`extension loaded: id=${extId}`); -console.log(`service worker: ${sw.url()}\n`); - +console.log(`extension loaded: id=${extId} version=${MANIFEST.version}\n`); sw.on('console', (m) => { if (m.type() === 'error') extErrors.push('sw console: ' + m.text()); }); +// An extension page to talk to the service worker exactly like the popup does. +const ext = await context.newPage(); +await ext.goto(`chrome-extension://${extId}/popup/popup.html`, { waitUntil: 'load' }); + +/** Poll instead of sleeping a fixed time. */ +async function until(fn, { timeout = 6000, every = 100 } = {}) { + const end = Date.now() + timeout; + let last; + while (Date.now() < end) { + last = await fn(); + if (last) return last; + await new Promise((r) => setTimeout(r, every)); + } + return last; +} + +async function tabFor(page) { + const url = page.url(); + return until(() => + sw.evaluate(async (u) => { + const t = (await chrome.tabs.query({})).find((x) => x.url === u); + return t ? { id: t.id, url: t.url } : null; + }, url), + ); +} +const badgeOf = (tabId) => sw.evaluate((id) => chrome.action.getBadgeText({ tabId: id }), tabId); +const titleOf = (tabId) => sw.evaluate((id) => chrome.action.getTitle({ tabId: id }), tabId); + +async function deepScan(tab) { + return ext.evaluate( + (t) => chrome.runtime.sendMessage({ type: 'GET_RESULT', tabId: t.id, url: t.url, forceDeep: true }), + tab, + ); +} + let failures = 0; +const fail = (msg) => { + failures++; + console.log(` ✗ ${msg}`); +}; for (const [fixture, rule] of Object.entries(CASES)) { const page = await context.newPage(); @@ -108,82 +155,84 @@ for (const [fixture, rule] of Object.entries(CASES)) { page.on('pageerror', (e) => pageErrors.push(e.message)); page.on('console', (m) => { const t = m.text(); - // favicon.ico 404s are fixture noise, not extension behaviour if (m.type() === 'error' && !/favicon/i.test(t)) pageErrors.push('console: ' + t); }); await page.goto(`${ORIGIN}/${fixture}`, { waitUntil: 'load' }); - // content script runs at document_idle and re-posts at 1.5s - await page.waitForTimeout(2200); - - // Ask the REAL content script, in the REAL page, for the signals it collected. - const collected = await sw.evaluate(async (origin) => { - const tabs = await chrome.tabs.query({ url: origin + '/*' }); - const tab = tabs.find((t) => t.active) || tabs[tabs.length - 1]; - const signals = await chrome.tabs.sendMessage(tab.id, { type: 'COLLECT_SIGNALS' }); - const badge = await chrome.action.getBadgeText({ tabId: tab.id }); - const title = await chrome.action.getTitle({ tabId: tab.id }); - return { signals: signals && signals.signals, badge, title, url: tab.url }; - }, ORIGIN); - - const signals = collected.signals; - const result = detect({ ...signals, pass: 'deep' }); - const ids = new Set(result.hits.map((h) => h.id)); - - const missing = rule.expect.filter((id) => !ids.has(id)); - const leaked = rule.forbid.filter((id) => ids.has(id)); - const ok = !missing.length && !leaked.length && !pageErrors.length; - if (!ok) failures++; - - console.log(`${ok ? 'PASS' : 'FAIL'} ${fixture}`); - console.log(` domFlags from real DOM: [${(signals.domFlags || []).join(', ')}]`); - console.log(` detected: ${result.hits.map((h) => `${h.id}(${h.confidence})`).join(', ') || '(nothing)'}`); - console.log(` headline: ${shapeForPopup(result).headline || '(empty)'}`); - console.log(` badge: "${collected.badge}" title: ${collected.title}`); - if (missing.length) console.log(` MISSING: ${missing.join(', ')}`); - if (leaked.length) console.log(` LEAKED: ${leaked.join(', ')}`); - if (pageErrors.length) console.log(` PAGE ERRORS: ${pageErrors.join(' | ')}`); - console.log(); - + const tab = await tabFor(page); + + // What the user sees BEFORE opening the popup: the light pass, then the + // background deep pass (content script posts at idle and again at +1.5s). + // Wait for the badge to settle, then compare it to the popup's own count. + const loadedAt = Date.now(); + let prev = null; + const preBadge = await until(async () => { + const b = await badgeOf(tab.id); + const settled = Date.now() - loadedAt > 2300 && b === prev; + prev = b; + return settled ? { b } : null; + }, { timeout: 6000, every: 400 }); + const response = await deepScan(tab); + const result = response && response.result; + const shaped = shapeForPopup(result); + const ids = new Set((result?.hits || []).map((h) => h.id)); + const conf = Object.fromEntries((result?.hits || []).map((h) => [h.id, h.confidence])); + const expectedBadge = shaped.highMediumCount ? String(Math.min(shaped.highMediumCount, 99)) : ''; + const badge = await until(async () => { + const b = await badgeOf(tab.id); + return b === expectedBadge ? { b } : null; + }, { timeout: 4000 }); + const title = await titleOf(tab.id); + + const before = failures; + console.log(`${fixture}`); + console.log(` detected: ${result?.hits.map((h) => `${h.id}(${h.confidence})`).join(', ') || '(nothing)'}`); + console.log(` headline: ${shaped.headline || '(empty)'} badge: "${badge ? badge.b : await badgeOf(tab.id)}" title: ${title}`); + if (!response || !response.ok) fail(`deep scan failed: ${JSON.stringify(response)}`); + for (const id of rule.expect) if (!ids.has(id)) fail(`MISSING ${id}`); + for (const id of rule.forbid) if (ids.has(id)) fail(`LEAKED ${id} (${conf[id]})`); + for (const id of rule.forbidSolid || []) if (conf[id] && conf[id] !== 'low') fail(`${id} should be low at most, got ${conf[id]}`); + for (const id of rule.solid || []) if (conf[id] === 'low') fail(`${id} should be high/medium, got low`); + if (!badge) fail(`badge "${await badgeOf(tab.id)}" != popup count "${expectedBadge}"`); + if (!preBadge || preBadge.b !== expectedBadge) { + fail(`badge before opening the popup "${preBadge && preBadge.b}" != popup count "${expectedBadge}"`); + } + if (/\b1 technologies\b|stack signals/.test(title)) fail(`tooltip wording: ${title}`); + if (pageErrors.length) fail(`PAGE ERRORS: ${pageErrors.join(' | ')}`); + console.log(`${failures === before ? 'PASS' : 'FAIL'} ${fixture}\n`); await page.close(); } -// ── Behaviours changed in 1.7.2 — verify each in the real browser ────── - console.log('--- targeted checks ---\n'); -// 1. MAIN-world probe. The deep scan depends on -// chrome.scripting.executeScript({ world: 'MAIN' }). This also functionally -// validates the minimum_chrome_version floor. +// 1. MAIN-world probe reads page globals (validates minimum_chrome_version floor too). { const page = await context.newPage(); await page.goto(`${ORIGIN}/plain.html`, { waitUntil: 'load' }); await page.evaluate(() => { window.__probeTarget = { version: '9.9.9' }; }); - const probe = await sw.evaluate(async (origin) => { - const [tab] = await chrome.tabs.query({ url: origin + '/*', active: true }); + const tab = await tabFor(page); + const probe = await sw.evaluate(async (id) => { const [{ result }] = await chrome.scripting.executeScript({ - target: { tabId: tab.id }, + target: { tabId: id }, world: 'MAIN', func: () => (window.__probeTarget ? window.__probeTarget.version : null), }); return result; - }, ORIGIN); + }, tab.id); const ok = probe === '9.9.9'; if (!ok) failures++; console.log(`${ok ? 'PASS' : 'FAIL'} MAIN-world probe reads page globals (got ${probe})`); await page.close(); } -// 2. SPA navigation. 1.7.2 removed the history.pushState patch (it lived in the -// isolated world and never saw page-initiated navigations). The replacement -// assumption is that chrome.tabs.onUpdated reports the new URL. Verify it. +// 2. SPA navigation: onUpdated reports it AND the badge is rebuilt for the new route. { const page = await context.newPage(); await page.goto(`${ORIGIN}/real-next.html`, { waitUntil: 'load' }); - await page.waitForTimeout(1500); - + const tab = await tabFor(page); + await until(async () => (await badgeOf(tab.id)) !== ''); await sw.evaluate(() => { globalThis.__spaSeen = []; globalThis.__spaListener = (tabId, changeInfo) => { @@ -191,74 +240,62 @@ console.log('--- targeted checks ---\n'); }; chrome.tabs.onUpdated.addListener(globalThis.__spaListener); }); - - // A page-initiated SPA route change, exactly as a framework router would do. await page.evaluate(() => history.pushState({}, '', '/spa-route-a')); - await page.waitForTimeout(900); - - const seen = await sw.evaluate(() => { - chrome.tabs.onUpdated.removeListener(globalThis.__spaListener); - return globalThis.__spaSeen; - }); - const ok = seen.some((u) => u.includes('/spa-route-a')); + const seen = await until(() => + sw.evaluate(() => (globalThis.__spaSeen.some((u) => u.includes('/spa-route-a')) ? globalThis.__spaSeen : null)), + ); + await sw.evaluate(() => chrome.tabs.onUpdated.removeListener(globalThis.__spaListener)); + const rebuilt = await until(async () => ((await badgeOf(tab.id)) !== '' ? true : null), { timeout: 5000 }); + const ok = !!seen && !!rebuilt; if (!ok) failures++; - console.log(`${ok ? 'PASS' : 'FAIL'} tabs.onUpdated reports SPA pushState navigation`); - console.log(` urls seen by service worker: ${JSON.stringify(seen)}`); + console.log(`${ok ? 'PASS' : 'FAIL'} SPA pushState: onUpdated fires and the badge is rebuilt for the new route`); + console.log(` urls seen by service worker: ${JSON.stringify(seen)} badge rebuilt: ${!!rebuilt}`); await page.close(); } -// 3. Double-injection guard. The manifest declares the content script AND the -// orchestrator re-injects on sendMessage failure; without a guard that -// registers two COLLECT_SIGNALS responders. +// 3. Injection guard: extra injections never register a second responder. { const page = await context.newPage(); await page.goto(`${ORIGIN}/real-angular.html`, { waitUntil: 'load' }); - await page.waitForTimeout(1500); - - const res = await sw.evaluate(async (origin) => { - const [tab] = await chrome.tabs.query({ url: origin + '/*', active: true }); - // force-inject twice more on top of the declared instance - await chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ['content/content-script.js'] }); - await chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ['content/content-script.js'] }); - // Read the guard in the ISOLATED world (executeScript's default) — that is - // where content scripts run. Reading it from MAIN would always see false. + const tab = await tabFor(page); + const res = await sw.evaluate(async (id) => { + await chrome.scripting.executeScript({ target: { tabId: id }, files: ['content/content-script.js'] }); + await chrome.scripting.executeScript({ target: { tabId: id }, files: ['content/content-script.js'] }); + // Read the guard in the ISOLATED world (executeScript's default) — where content scripts run. const [{ result: guard }] = await chrome.scripting.executeScript({ - target: { tabId: tab.id }, - func: () => !!window.__whatstackContentScriptLoaded, + target: { tabId: id }, + func: () => !!(window.__whatstackContentScript && window.__whatstackContentScript.alive()), }); - const reply = await chrome.tabs.sendMessage(tab.id, { type: 'COLLECT_SIGNALS' }); + const reply = await chrome.tabs.sendMessage(id, { type: 'COLLECT_SIGNALS' }); return { guard, ok: !!(reply && reply.ok) }; - }, ORIGIN); - + }, tab.id); const ok = res.ok && res.guard === true; if (!ok) failures++; - console.log(`${ok ? 'PASS' : 'FAIL'} content script survives triple injection, still answers once`); - console.log(` init guard set: ${res.guard}`); + console.log(`${ok ? 'PASS' : 'FAIL'} content script survives triple injection, still answers once (guard: ${res.guard})`); await page.close(); } -// Console errors from the extension itself are store-review blockers, so they -// fail the run rather than just printing. -if (extErrors.length) failures++; -// 4. Popup wiring, in the extension's own runtime. The popup reads the ACTIVE -// tab, which is itself when opened as a tab, so this asserts the parts that -// don't depend on a scan: that the report control is present, that brand -// marks survive a REAL DOMParser (node has none, so no unit test can prove -// this), and that the shipped report URL leaks no path or query. +// 4. Restricted page: an honest error, not an empty "nothing found". +{ + const res = await ext.evaluate(() => + chrome.runtime.sendMessage({ type: 'GET_RESULT', tabId: -1, url: 'https://chromewebstore.google.com/detail/x', forceDeep: true }), + ); + const ok = res && res.ok && res.result && res.result.error === 'restricted'; + if (!ok) failures++; + console.log(`${ok ? 'PASS' : 'FAIL'} Web Store page reports "restricted" (${JSON.stringify(res && res.result && res.result.error)})`); +} + +// 5. Popup wiring in the extension's own runtime: report control, brand marks +// through a REAL DOMParser, and a report URL that leaks no path or query. { const page = await context.newPage(); const popupErrors = []; page.on('pageerror', (e) => popupErrors.push(e.message)); await page.goto(`chrome-extension://${extId}/popup/popup.html`, { waitUntil: 'load' }); - await page.waitForTimeout(600); - const res = await page.evaluate(async () => { + const res = await page.evaluate(async (version) => { const icons = await import('/shared/brand-icons.js'); const shape = await import('/shared/result-shape.js'); - - // The bug this guards: an parsed without a namespace has tagName - // 'svg' but is not an SVGElement, so it never paints — the row shows only - // its background colour. const SVG_NS = 'http://www.w3.org/2000/svg'; const broken = []; for (const id of Object.keys(icons.BRAND_ICONS)) { @@ -266,7 +303,6 @@ if (extErrors.length) failures++; const el = doc.documentElement; if (el.namespaceURI !== SVG_NS || !(el instanceof SVGElement)) broken.push(id); } - const shaped = shape.shapeForPopup({ url: 'https://x.com/someone/status/123?s=46&token=secret', pass: 'deep', @@ -277,39 +313,40 @@ if (extErrors.length) failures++; name: 'React', category: 'framework', confidence: 'high', - evidence: [{ type: 'global', snippet: 'window.__reactFiber', weight: 5 }], + evidence: [{ type: 'script', snippet: 'https://x.com/app.js?session=abc', weight: 5 }], }, ], }); - const reportUrl = shape.buildReportUrl(shaped, { version: '1.7.2' }); - + const reportUrl = shape.buildReportUrl(shaped, { version }); return { hasReportButton: !!document.getElementById('report'), iconCount: Object.keys(icons.BRAND_ICONS).length, brokenIcons: broken, reportUrl, }; - }); + }, MANIFEST.version); - const leaks = /token=secret|status\/123|s=46/.test(decodeURIComponent(res.reportUrl)); + const decoded = decodeURIComponent(res.reportUrl); + const leaks = /token=secret|status\/123|s=46|session=abc/.test(decoded); const ok = res.hasReportButton && res.brokenIcons.length === 0 && res.reportUrl.startsWith('https://github.com/') && - decodeURIComponent(res.reportUrl).includes('https://x.com') && + decoded.includes('https://x.com') && !leaks && !popupErrors.length; if (!ok) failures++; - console.log(`${ok ? 'PASS' : 'FAIL'} popup wiring: report button, icon namespace, no URL leak`); - console.log(` report button present: ${res.hasReportButton}`); - console.log(` brand marks in SVG namespace: ${res.iconCount - res.brokenIcons.length}/${res.iconCount}`); + console.log(`${ok ? 'PASS' : 'FAIL'} popup wiring: report button, ${res.iconCount - res.brokenIcons.length}/${res.iconCount} brand marks render, no URL leak (${leaks ? 'LEAK' : 'clean'})`); if (res.brokenIcons.length) console.log(` NOT RENDERABLE: ${res.brokenIcons.join(', ')}`); - console.log(` report url leaks path/query: ${leaks}`); if (popupErrors.length) console.log(` POPUP ERRORS: ${popupErrors.join(' | ')}`); await page.close(); } +// Console errors from the extension itself are store-review blockers — checked +// last so errors raised during any check above fail the run. console.log('\nextension-level errors:', extErrors.length ? extErrors : 'none'); +if (extErrors.length) failures++; + await context.close(); server.close(); fs.rmSync(userDataDir, { recursive: true, force: true }); diff --git a/tests/main-probe.test.js b/tests/main-probe.test.js new file mode 100644 index 0000000..a01a27b --- /dev/null +++ b/tests/main-probe.test.js @@ -0,0 +1,189 @@ +/** + * Runs the REAL MAIN-world probe (shared/detect.js mainWorldProbeSource) in a + * node:vm realm with a minimal fake window + DOM. Until 1.8.0 the probe was + * never executed by any test: fixtures hand-wrote the globals it was assumed to + * return. These tests pin what it actually returns — including on hostile pages. + */ +import { describe, it } from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import { mainWorldProbeSource, detect, mergeDeepSignals } from '../shared/detect.js'; + +const SOURCE = `(${mainWorldProbeSource().toString()})()`; + +/** + * @param {(ctx: any) => Record} setup page globals, given the realm's Node/HTMLElement + * @param {{ elements?: Record, body?: object, documentKeys?: Record }} [dom] + */ +function probe(setup, dom = {}) { + const ctx = vm.createContext({}); + vm.runInContext( + ` + class Node {} + class Element extends Node { constructor(attrs = {}) { super(); this._attrs = attrs; } getAttribute(n) { return this._attrs[n] ?? null; } } + class HTMLCollection {} + class NodeList {} + globalThis.Node = Node; globalThis.Element = Element; globalThis.HTMLCollection = HTMLCollection; globalThis.NodeList = NodeList; + `, + ctx, + ); + const elements = dom.elements || {}; + const body = dom.body || vm.runInContext('new Element()', ctx); + if (!body.children) body.children = []; + const document = vm.runInContext('new Node()', ctx); + Object.assign(document, dom.documentKeys || {}); + document.body = body; + document.querySelector = (sel) => elements[sel] || null; + ctx.document = document; + ctx.window = ctx; + Object.assign(ctx, setup(ctx)); + // Round-trip through JSON: the real probe result is structured-cloned, and + // this also makes cross-realm objects comparable with deepEqual. + return JSON.parse(JSON.stringify(vm.runInContext(SOURCE, ctx))); +} +const el = (ctx, props = {}, attrs = {}) => Object.assign(vm.runInContext(`new Element(${JSON.stringify(attrs)})`, ctx), props); + +describe('MAIN-world probe (executed)', () => { + it('returns an empty object on a plain page', () => { + assert.deepEqual(probe(() => ({})), {}); + }); + + it('ignores DOM-clobbered globals (
,
…)', () => { + const out = probe((ctx) => ({ + next: el(ctx), + bootstrap: el(ctx), + axios: el(ctx), + ng: el(ctx), + Stripe: el(ctx), + Sentry: el(ctx), + LogRocket: el(ctx), + __FEDERATION__: el(ctx), + __NEXT_DATA__: el(ctx), + Clerk: el(ctx), + })); + assert.deepEqual(out, {}); + }); + + it('one throwing getter costs that detector only', () => { + const out = probe(() => { + const jq = function () {}; + Object.defineProperty(jq, 'fn', { get() { throw new Error('boom'); } }); + return { + Vue: new Proxy({}, { get() { throw new Error('trap'); } }), + jQuery: jq, + __NEXT_DATA__: { props: {} }, + __next_f: [], + Stripe: function Stripe() {}, + }; + }); + assert.ok(out.__NEXT_DATA__); + assert.ok(out.__next_f); + assert.ok(out.Stripe); + assert.equal(out.Vue, undefined); + assert.equal(out.jQuery, undefined); + }); + + it('never calls page toString and clips page strings', () => { + let called = false; + const out = probe(() => ({ + next: { version: { toString() { called = true; return '14.0.0'; } } }, + React: { version: 'x'.repeat(10_000), createElement() {} }, + })); + assert.equal(called, false); + assert.equal(out.next.version, undefined); + assert.equal(out.React.version.length, 64); + }); + + it('reads window.next only as a hint; detect() does not call it Next.js', () => { + const globals = probe(() => ({ next: { version: '1.0.0-beta.9', appDir: true } })); + assert.equal(globals.next.version, '1.0.0-beta.9'); + const r = detect(mergeDeepSignals({ url: 'https://linear.test/', scripts: [], domFlags: [] }, globals)); + assert.equal(r.hits.find((h) => h.id === 'nextjs'), undefined); + }); + + it('prefers the react-dom renderer version over third-party reconcilers', () => { + const renderers = new Map([ + [1, { version: '4.3.0', rendererPackageName: 'react-pdf' }], + [2, { version: '19.1.0', rendererPackageName: 'react-dom' }], + ]); + const out = probe(() => ({ __REACT_DEVTOOLS_GLOBAL_HOOK__: { renderers } })); + assert.equal(out.__reactRenderer.version, '19.1.0'); + assert.equal(out.__reactRenderer.count, 2); + }); + + it('a bare DevTools hook with no renderer is not React', () => { + assert.deepEqual(probe(() => ({ __REACT_DEVTOOLS_GLOBAL_HOOK__: { renderers: new Map() } })), {}); + }); + + it('finds React from _reactListening on document (bundled apps, no DevTools)', () => { + const out = probe(() => ({}), { documentKeys: { _reactListeningobuqzpntaja: true } }); + assert.ok(out.__reactListening); + }); + + it('finds a React container expando on #root', () => { + const out = probe(() => ({}), { + elements: { '#root': { '__reactContainer$abc': { current: {} } } }, + }); + assert.ok(out.__reactContainer); + }); + + it('reads Vue 3 and Vue 2 mount points', () => { + assert.equal(probe(() => ({}), { elements: { '#app': { __vue_app__: { version: '3.5.42' } } } }).__vue_app__.version, '3.5.42'); + assert.ok(probe(() => ({}), { elements: { '#app': { __vue__: { _isVue: true } } } }).__vue2__); + }); + + it('uses the real global names: TURBOPACK, __sveltekit_, __svelte.v, webpackJsonp', () => { + const out = probe(() => ({ + TURBOPACK: [], + __sveltekit_1tdg792: {}, + __svelte: { v: new Set(['5']) }, + webpackJsonp: [], + })); + assert.ok(out.__turbopack); + assert.ok(out.__sveltekit); + assert.equal(out.__svelte.version, '5'); + assert.ok(out.webpackChunk); + }); + + it('requires library shape, not just a truthy global', () => { + const out = probe(() => ({ + axios: Object.assign(function axios() {}, { get() {}, create() {}, VERSION: '1.7.2' }), + bootstrap: { Modal: function () {}, Tooltip: function () {} }, + gtag: function () {}, + mixpanel: { track() {} }, + DD_RUM: { init() {} }, + LogRocket: { init() {} }, + })); + for (const k of ['axios', 'bootstrap', 'gtag', 'mixpanel', 'DD_RUM', 'LogRocket']) assert.ok(out[k], k); + assert.equal(out.axios.version, '1.7.2'); + + const shapeless = probe(() => ({ axios: {}, bootstrap: {}, gtag: {}, mixpanel: {}, DD_RUM: {}, LogRocket: {} })); + assert.deepEqual(shapeless, {}); + }); + + it('detects the 1.8.0 frameworks and platforms from their runtime objects', () => { + const out = probe(() => ({ + litElementVersions: ['4.1.0'], + Polymer: Object.assign(function Polymer() {}, { version: '3.5.0' }), + Ember: { VERSION: '5.8.0' }, + Alpine: { start() {}, version: '3.14.9' }, + htmx: { ajax() {}, process() {}, version: '2.0.3' }, + ___loader: {}, + preact: { h() {}, render() {} }, + Shopify: { shop: 'demo.myshopify.com' }, + posthog: { capture() {} }, + plausible: function () {}, + fathom: { trackPageview() {} }, + amplitude: { track() {} }, + })); + for (const k of ['litVersions', 'Polymer', 'Ember', 'Alpine', 'htmx', '___gatsby', 'preact', 'Shopify', 'posthog', 'plausible', 'fathom', 'amplitude']) { + assert.ok(out[k], k); + } + assert.equal(out.litVersions.version, '4.1.0'); + }); + + it('empty Redux DevTools and empty NREUM are not detections', () => { + const out = probe(() => ({ __REDUX_DEVTOOLS_EXTENSION__: function () {}, NREUM: {} })); + assert.deepEqual(out, {}); + }); +}); diff --git a/tests/scan-orchestrator.test.js b/tests/scan-orchestrator.test.js index c89190f..b74fef8 100644 --- a/tests/scan-orchestrator.test.js +++ b/tests/scan-orchestrator.test.js @@ -1,51 +1,270 @@ import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; -import { ScanOrchestrator, isRestrictedUrl } from '../shared/scan-orchestrator.js'; +import { ScanOrchestrator, isRestrictedUrl, technologiesLabel } from '../shared/scan-orchestrator.js'; +import { sameDocument } from '../shared/url-policy.js'; -describe('ScanOrchestrator & Restricted URL evaluation', () => { +const NEXT_SIGNALS = (url = 'https://example.com/') => ({ + url, + pass: 'light', + scripts: ['https://example.com/_next/static/chunks/main.js'], + stylesheets: [], + cookies: [], + metas: [], + inlineSamples: [], + domFlags: [], + globals: {}, +}); + +/** + * Fake chrome.* with call recording. `probe` is what the MAIN-world probe returns + * (or a function / 'throw' / 'hang'); `collect` likewise for COLLECT_SIGNALS. + */ +function fakeChrome({ probe = {}, collect = NEXT_SIGNALS(), tabUrl = 'https://example.com/', injectOk = true } = {}) { + const calls = { badge: [], title: [], executeFiles: 0, probes: 0, collects: 0 }; + const settle = (spec, fallback) => { + if (spec === 'throw') return Promise.reject(new Error('Cannot access contents of the page')); + if (spec === 'hang') return new Promise(() => {}); + return Promise.resolve(typeof spec === 'function' ? spec() : spec ?? fallback); + }; + const api = { + calls, + action: { + setBadgeText: async ({ tabId, text }) => calls.badge.push([tabId, text]), + setBadgeBackgroundColor: async () => {}, + setTitle: async ({ title }) => calls.title.push(title), + }, + tabs: { + get: async (id) => ({ id, url: tabUrl }), + sendMessage: (tabId, msg) => { + calls.collects++; + if (msg.type !== 'COLLECT_SIGNALS') return Promise.resolve(null); + return settle(collect, null).then((s) => (s && s.url ? { ok: true, signals: s } : s)); + }, + }, + scripting: { + executeScript: (opts) => { + if (opts.files) { + calls.executeFiles++; + return injectOk ? Promise.resolve([{}]) : Promise.reject(new Error('blocked')); + } + calls.probes++; + return settle(probe, {}).then((r) => [{ result: r }]); + }, + }, + }; + return api; +} +const fast = { backgroundDelayMs: 5, spaDelayMs: 5, probeTimeoutMs: 60, collectTimeoutMs: 60 }; +const wait = (ms) => new Promise((r) => setTimeout(r, ms)); + +describe('URL policy', () => { it('identifies restricted browser URLs', () => { - assert.equal(isRestrictedUrl('chrome://extensions'), true); - assert.equal(isRestrictedUrl('chrome-extension://xyz/popup.html'), true); - assert.equal(isRestrictedUrl('about:blank'), true); + for (const u of [ + 'chrome://extensions', + 'chrome-extension://xyz/popup.html', + 'about:blank', + 'view-source:https://example.com', + 'file:///Users/me/a.html', + 'data:text/html,hi', + 'blob:https://example.com/abc', + 'https://chromewebstore.google.com/detail/whatstack/abc', + 'https://chrome.google.com/webstore/detail/abc', + '', + ]) { + assert.equal(isRestrictedUrl(u), true, u); + } assert.equal(isRestrictedUrl('https://example.com'), false); assert.equal(isRestrictedUrl('http://localhost:3000'), false); + assert.equal(isRestrictedUrl('https://google.com/webstore'), false); }); - it('manages tab cache lifecycle and invalidation correctly', async () => { - const mockChrome = { - action: { - setBadgeText: async () => {}, - setBadgeBackgroundColor: async () => {}, - setTitle: async () => {}, - }, - tabs: { - sendMessage: async () => ({ ok: true, signals: { url: 'https://example.com', pass: 'light', scripts: [], domFlags: [] } }), - }, - scripting: { - executeScript: async () => [{ result: {} }], + it('sameDocument ignores the fragment only', () => { + assert.equal(sameDocument('https://a.test/x#1', 'https://a.test/x#2'), true); + assert.equal(sameDocument('https://a.test/x', 'https://a.test/y'), false); + }); + + it('tooltip wording is pluralised', () => { + assert.equal(technologiesLabel(1), '1 technology'); + assert.equal(technologiesLabel(5), '5 technologies'); + }); +}); + +describe('ScanOrchestrator', () => { + it('manages tab cache lifecycle and invalidation', async () => { + const o = new ScanOrchestrator(fakeChrome(), fast); + const r = await o.deepScan(1, 'https://example.com/'); + assert.equal(r.pass, 'deep'); + assert.equal(o.tabCache.size, 1); + const cached = await o.getResult({ tabId: 1, url: 'https://example.com/' }); + assert.equal(cached, r, 'fresh deep result is reused without forceDeep'); + o.invalidateTab(1, 'https://example.com/#section'); + assert.equal(o.tabCache.has(1), true, 'hash change is the same document'); + o.invalidateTab(1, 'https://example.com/new-path'); + assert.equal(o.tabCache.has(1), false); + await o.deepScan(1, 'https://example.com/'); + o.invalidateTab(1); + assert.equal(o.tabCache.has(1), false, 'tab close drops the entry'); + }); + + it('restricted URLs short-circuit', async () => { + const r = await new ScanOrchestrator(null).deepScan(2, 'chrome://settings'); + assert.equal(r.error, 'restricted'); + }); + + it('evicts oldest past the cap and re-inserts on update (LRU)', async () => { + const o = new ScanOrchestrator(fakeChrome(), fast); + o.maxCachedTabs = 3; + for (const id of [1, 2, 3]) await o.deepScan(id, 'https://example.com/'); + await o.deepScan(1, 'https://example.com/'); // 1 is now most recent + await o.deepScan(4, 'https://example.com/'); + assert.deepEqual([...o.tabCache.keys()], [3, 1, 4]); + }); + + it('badge: count, 99 cap, pluralised title, empty when nothing solid', async () => { + const chromeApi = fakeChrome(); + const o = new ScanOrchestrator(chromeApi, fast); + const hits = Array.from({ length: 120 }, (_, i) => ({ id: 'x' + i, name: 'X', category: 'ui', confidence: 'high', evidence: [] })); + await o.applyBadge(7, { pass: 'deep', hits, primary: null }); + assert.deepEqual(chromeApi.calls.badge.at(-1), [7, '99']); + assert.equal(chromeApi.calls.title.at(-1), 'WhatStack: 120 technologies'); + await o.applyBadge(7, { pass: 'deep', hits: hits.slice(0, 1), primary: { id: 'x0', name: 'X' } }); + assert.equal(chromeApi.calls.title.at(-1), 'WhatStack: X · 1 technology'); + await o.applyBadge(7, { pass: 'deep', hits: [], primary: null }); + assert.deepEqual(chromeApi.calls.badge.at(-1), [7, '']); + }); + + it('deep scan always re-collects (Rescan sees late scripts)', async () => { + let n = 0; + const chromeApi = fakeChrome({ + collect: () => { + n++; + const s = NEXT_SIGNALS(); + if (n > 1) s.scripts.push('https://js.stripe.com/v3/'); + return s; }, + }); + const o = new ScanOrchestrator(chromeApi, fast); + const first = await o.getResult({ tabId: 1, url: 'https://example.com/', forceDeep: true }); + assert.equal(first.hits.find((h) => h.id === 'stripe'), undefined); + const second = await o.getResult({ tabId: 1, url: 'https://example.com/', forceDeep: true }); + assert.ok(second.hits.find((h) => h.id === 'stripe'), 'Rescan picked up the late Stripe script'); + }); + + it('re-injects the content script when nothing answers, then retries', async () => { + let answered = false; + const chromeApi = fakeChrome({ collect: () => (answered ? NEXT_SIGNALS() : Promise.reject(new Error('no receiver'))) }); + const orig = chromeApi.scripting.executeScript; + chromeApi.scripting.executeScript = (opts) => { + if (opts.files) answered = true; + return orig(opts); }; + const o = new ScanOrchestrator(chromeApi, fast); + const r = await o.deepScan(1, 'https://example.com/'); + assert.equal(chromeApi.calls.executeFiles, 1); + assert.ok(r.hits.find((h) => h.id === 'nextjs')); + }); + + it('reports "unreachable" when neither the content script nor the probe can run', async () => { + const o = new ScanOrchestrator(fakeChrome({ collect: 'throw', probe: 'throw', injectOk: false }), fast); + const r = await o.deepScan(1, 'https://example.com/'); + assert.equal(r.error, 'unreachable'); + assert.equal(o.tabCache.has(1), false); + }); + + it('a hung page times out instead of hanging the popup', async () => { + const o = new ScanOrchestrator(fakeChrome({ collect: 'hang', probe: 'hang' }), fast); + const started = Date.now(); + const r = await o.deepScan(1, 'https://example.com/'); + assert.ok(Date.now() - started < 1000); + assert.equal(r.error, 'unreachable'); + }); + + it('a probe failure keeps the light evidence', async () => { + const o = new ScanOrchestrator(fakeChrome({ probe: 'throw' }), fast); + const r = await o.deepScan(1, 'https://example.com/'); + assert.ok(r.hits.find((h) => h.id === 'nextjs')); + assert.equal(r.error, undefined); + }); + + it('labels the result with the document that answered (navigation mid-scan)', async () => { + const o = new ScanOrchestrator(fakeChrome({ collect: NEXT_SIGNALS('https://example.com/new') }), fast); + const r = await o.deepScan(1, 'https://example.com/old'); + assert.equal(r.url, 'https://example.com/new'); + assert.equal(o.tabCache.get(1).url, 'https://example.com/new'); + }); + + it('light scan schedules a background deep pass so the badge counts runtime proof', async () => { + const chromeApi = fakeChrome({ probe: { __reactRenderer: { present: true, version: '18.3.1' }, Stripe: { present: true } } }); + const o = new ScanOrchestrator(chromeApi, fast); + const light = await o.lightScan(1, NEXT_SIGNALS()); + assert.equal(light.pass, 'light'); + await wait(40); + const entry = o.tabCache.get(1); + assert.equal(entry.result.pass, 'deep'); + assert.ok(entry.result.hits.find((h) => h.id === 'stripe')); + assert.equal(chromeApi.calls.probes, 1); + }); + + it('coalesces the load-time and +1.5s light posts into one probe', async () => { + const chromeApi = fakeChrome(); + const o = new ScanOrchestrator(chromeApi, { ...fast, backgroundDelayMs: 20 }); + await o.lightScan(1, NEXT_SIGNALS()); + await o.lightScan(1, NEXT_SIGNALS()); + await wait(60); + assert.equal(chromeApi.calls.probes, 1); + }); - const orchestrator = new ScanOrchestrator(mockChrome); - assert.equal(orchestrator.tabCache.size, 0); + it('a later light post never knocks a deep result back down (monotonic)', async () => { + const chromeApi = fakeChrome({ probe: { Stripe: { present: true } } }); + const o = new ScanOrchestrator(chromeApi, { ...fast, backgroundDelayMs: 10_000 }); + await o.deepScan(1, 'https://example.com/'); + const before = o.tabCache.get(1).result.hits.length; + const after = await o.lightScan(1, NEXT_SIGNALS()); + assert.equal(after.pass, 'deep'); + assert.equal(after.hits.length, before); + assert.ok(after.hits.find((h) => h.id === 'stripe'), 'runtime-only hit kept'); + o.cancelScheduled(1); + }); - const result1 = await orchestrator.deepScan(1, 'https://example.com'); - assert.equal(result1.pass, 'deep'); - assert.equal(orchestrator.tabCache.size, 1); + it('skips the background pass if the tab navigated away', async () => { + const chromeApi = fakeChrome({ tabUrl: 'https://elsewhere.test/' }); + const o = new ScanOrchestrator(chromeApi, fast); + await o.lightScan(1, NEXT_SIGNALS()); + await wait(40); + assert.equal(chromeApi.calls.probes, 0); + }); - // Retrieve cached result - const cached = await orchestrator.getResult({ tabId: 1, url: 'https://example.com' }); - assert.equal(cached.pass, 'deep'); + it('restricted light posts are ignored', async () => { + const o = new ScanOrchestrator(fakeChrome(), fast); + assert.equal(await o.lightScan(1, { url: 'chrome://newtab' }), null); + }); + + it('SPA route change: onTabComplete clears the badge and rescans once', async () => { + const chromeApi = fakeChrome({ collect: NEXT_SIGNALS('https://example.com/route-b'), tabUrl: 'https://example.com/route-b' }); + const o = new ScanOrchestrator(chromeApi, fast); + await o.deepScan(1, 'https://example.com/route-a'); + o.invalidateTab(1); // what onUpdated(status:'loading') does + o.onTabComplete(1, 'https://example.com/route-b'); + o.onTabComplete(1, 'https://example.com/route-b'); // duplicate event + assert.deepEqual(chromeApi.calls.badge.at(-1), [1, '']); + await wait(40); + assert.equal(o.tabCache.get(1).url, 'https://example.com/route-b'); + assert.equal(chromeApi.calls.probes, 2, 'one scan for route-a, one for route-b'); + }); - // Invalidate tab on navigation - orchestrator.invalidateTab(1, 'https://example.com/new-path'); - assert.equal(orchestrator.tabCache.has(1), false); + it('onTabComplete does nothing when the cache already describes the page', async () => { + const chromeApi = fakeChrome(); + const o = new ScanOrchestrator(chromeApi, fast); + await o.deepScan(1, 'https://example.com/'); + o.onTabComplete(1, 'https://example.com/'); + await wait(30); + assert.equal(chromeApi.calls.probes, 1); }); - it('handles restricted URL scan requests gracefully', async () => { - const orchestrator = new ScanOrchestrator(null); - const result = await orchestrator.deepScan(2, 'chrome://settings'); - assert.equal(result.error, 'restricted'); - assert.equal(result.pass, 'deep'); + it('capture() returns raw light signals and probe globals for tooling', async () => { + const o = new ScanOrchestrator(fakeChrome({ probe: { __NEXT_DATA__: { present: true } } }), fast); + const { light, globals } = await o.capture(1); + assert.equal(light.url, 'https://example.com/'); + assert.ok(globals.__NEXT_DATA__); }); }); From e1331b4d96df105da026401cdf3efd51fa284c65 Mon Sep 17 00:00:00 2001 From: Kiro Agent <244629292+kiro-agent@users.noreply.github.com> Date: Sat, 26 Sep 2026 08:49:26 +0000 Subject: [PATCH 5/8] test: per-signature coverage gate (positive + prose case for all 82 rules) The gate found three more prose false positives, fixed here: - webpack: any path containing 'webpack-' (an image named webpack-logo.png) - tanstack-start: any URL containing 'tanstack-start' - turbopack: case-insensitive inline match on the word 'Turbopack' Identifier-based inline rules are now case-sensitive. --- shared/signatures.js | 16 +-- tests/signature-coverage.test.js | 165 +++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 tests/signature-coverage.test.js diff --git a/shared/signatures.js b/shared/signatures.js index a586a04..2a34499 100644 --- a/shared/signatures.js +++ b/shared/signatures.js @@ -51,7 +51,7 @@ export const SIGNATURES = [ { type: 'dom', pattern: 'next-route-announcer', weight: 4, strong: true, runtime: true }, { type: 'dom', pattern: '[data-nextjs-scroll-focus-boundary]', weight: 4, strong: true, runtime: true }, { type: 'dom', pattern: '#__next', weight: 2 }, - { type: 'inline', pattern: /\bself\.__next_f\b|\b__NEXT_DATA__\b|\bwebpackChunk_N_E\b/i, weight: 5, strong: true, runtime: true }, + { type: 'inline', pattern: /\bself\.__next_f\b|\b__NEXT_DATA__\b|\bwebpackChunk_N_E\b/, weight: 5, strong: true, runtime: true }, { type: 'meta', pattern: /^generator=.*\bnext\.?js\b/i, weight: 3, strong: true, runtime: true }, ], }, @@ -194,7 +194,7 @@ export const SIGNATURES = [ { type: 'script', pattern: /@remix-run\/(?:react|node|cloudflare|deno|serve)(?:@|\/|$)/i, weight: 5, strong: true, runtime: true }, { type: 'script', pattern: /(?:unpkg\.com|jsdelivr\.net|esm\.sh)\/.*@remix-run\//i, weight: 5, strong: true, runtime: true }, { type: 'script', pattern: /\/build\/(?:entry\.client|root|routes)/i, weight: 2 }, - { type: 'inline', pattern: /\b__remixContext\b|\b__remixManifest\b|@remix-run\//i, weight: 5, strong: true, runtime: true }, + { type: 'inline', pattern: /\b__remixContext\b|\b__remixManifest\b|@remix-run\//, weight: 5, strong: true, runtime: true }, { type: 'meta', pattern: /^generator=.*\bremix\b/i, weight: 3, strong: true, runtime: true }, ], }, @@ -346,7 +346,7 @@ export const SIGNATURES = [ { type: 'script', pattern: /@tanstack\/(?:react-)?start(?:@|\/|\/plugin|\/server)/i, weight: 5, strong: true, runtime: true }, { type: 'script', pattern: /(?:unpkg\.com|jsdelivr\.net|esm\.sh)\/.*@tanstack\/(?:react-)?start/i, weight: 5, strong: true, runtime: true }, // Vite plugin / build fingerprints sometimes appear in chunk URLs - { type: 'script', pattern: /tanstack[_-]start/i, weight: 3, strong: true }, + { type: 'script', pattern: /(? ({ + url: 'https://site.example/', + pass: 'deep', + scripts: [], + stylesheets: [], + cookies: [], + metas: [], + inlineSamples: [], + domFlags: [], + globals: {}, + ...over, +}); +const g = (...names) => ({ globals: Object.fromEntries(names.map((n) => [n, { present: true }])) }); + +/** + * Realistic first-party evidence per rule — asset URLs as real sites ship them, + * or the runtime object the probe reports. + * @type {Record>} + */ +const POSITIVE = { + nextjs: { scripts: ['https://site.example/_next/static/chunks/main-app-1f2a3b.js'] }, + react: g('__reactContainer'), + vue: g('__vue_app__'), + nuxt: { scripts: ['https://site.example/_nuxt/entry.abc123.js'] }, + angular: { domFlags: ['[ng-version]'] }, + svelte: g('__svelte'), + sveltekit: { scripts: ['https://site.example/_app/immutable/entry/start.abc.js'] }, + solid: { scripts: ['https://cdn.jsdelivr.net/npm/solid-js@1.8.17/dist/solid.js'] }, + jquery: { scripts: ['https://code.jquery.com/jquery-3.7.1.min.js'] }, + remix: g('__remixContext'), + 'react-router': g('__reactRouterDataRouter'), + redux: g('__reduxStore'), + zustand: { scripts: ['https://esm.sh/zustand@4.5.2'] }, + pinia: g('__PINIA__'), + mobx: g('__MOBX__'), + vuex: { scripts: ['https://unpkg.com/vuex@4.1.0/dist/vuex.global.js'] }, + 'tanstack-query': { scripts: ['https://esm.sh/@tanstack/react-query@5.56.2'] }, + 'tanstack-router': { scripts: ['https://esm.sh/@tanstack/react-router@1.58.0'] }, + 'tanstack-table': { scripts: ['https://esm.sh/@tanstack/react-table@8.20.5'] }, + 'tanstack-form': { scripts: ['https://esm.sh/@tanstack/react-form@0.33.0'] }, + 'tanstack-virtual': { scripts: ['https://esm.sh/@tanstack/react-virtual@3.10.8'] }, + 'tanstack-start': g('__TANSTACK_START__'), + tanstack: { scripts: ['https://esm.sh/@tanstack/query-core@5.56.2'] }, + swr: { scripts: ['https://esm.sh/swr@2.2.5'] }, + apollo: g('__APOLLO_CLIENT__'), + urql: { scripts: ['https://esm.sh/urql@4.1.0'] }, + graphql: { scripts: ['https://esm.sh/graphql@16.9.0'] }, + axios: g('axios'), + tailwind: { domFlags: ['tailwind-vars'] }, + bootstrap: { stylesheets: ['https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css'] }, + mui: { domFlags: ['[class*="MuiButton-"]'] }, + chakra: { scripts: ['https://esm.sh/@chakra-ui/react@2.8.2'] }, + 'google-analytics': { scripts: ['https://www.googletagmanager.com/gtag/js?id=G-XXXX'] }, + segment: { scripts: ['https://cdn.segment.com/analytics.js/v1/abc/analytics.min.js'] }, + mixpanel: { scripts: ['https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'] }, + hotjar: { scripts: ['https://static.hotjar.com/c/hotjar-123.js'] }, + vercel: { scripts: ['https://site.example/_vercel/insights/script.js'] }, + netlify: { domFlags: ['[data-netlify]'] }, + cloudflare: { scripts: ['https://static.cloudflareinsights.com/beacon.min.js'] }, + 'module-federation': { scripts: ['https://mfe.site.example/cart/remoteEntry.js'] }, + 'single-spa': g('singleSpa'), + qiankun: g('__POWERED_BY_QIANKUN__'), + systemjs: { domFlags: ['script[type="systemjs-importmap"]'] }, + 'import-map': { domFlags: ['script[type="importmap"]'] }, + microfrontend: g('__MICRO_FRONTEND__'), + webpack: g('__webpack_require__'), + vite: { scripts: ['https://site.example/@vite/client'] }, + parcel: g('parcelRequire'), + turbopack: g('__turbopack'), + emotion: { domFlags: ['[data-emotion]'] }, + 'styled-components': { domFlags: ['[data-styled]'] }, + auth0: { scripts: ['https://cdn.auth0.com/js/auth0-spa-js/2.1/auth0-spa-js.production.js'] }, + clerk: g('Clerk'), + firebase: { scripts: ['https://www.gstatic.com/firebasejs/10.12.0/firebase-app.js'] }, + nextauth: { cookies: ['next-auth.session-token'] }, + stripe: { scripts: ['https://js.stripe.com/v3/'] }, + razorpay: { scripts: ['https://checkout.razorpay.com/v1/checkout.js'] }, + sentry: { scripts: ['https://browser.sentry-cdn.com/8.30.0/bundle.min.js'] }, + datadog: { scripts: ['https://www.datadoghq-browser-agent.com/us1/v5/datadog-rum.js'] }, + newrelic: { scripts: ['https://js-agent.newrelic.com/nr-spa-1.260.1.min.js'] }, + logrocket: { scripts: ['https://cdn.logrocket.io/LogRocket.min.js'] }, + launchdarkly: { scripts: ['https://clientstream.launchdarkly.com/eval/abc'] }, + intercom: { scripts: ['https://widget.intercom.io/widget/abc123'] }, + zendesk: { scripts: ['https://static.zdassets.com/ekr/snippet.js?key=abc'] }, + angularjs: g('angularjs'), + astro: { domFlags: ['astro-island'] }, + gatsby: { domFlags: ['#___gatsby'] }, + qwik: { domFlags: ['[q:container]'] }, + preact: { scripts: ['https://esm.sh/preact@10.24.0'] }, + lit: { scripts: ['https://esm.sh/lit@3.2.0'] }, + polymer: g('Polymer'), + ember: g('Ember'), + alpine: { scripts: ['https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js'] }, + htmx: { scripts: ['https://unpkg.com/htmx.org@2.0.3'] }, + wordpress: { metas: ['generator=WordPress 6.6.2'] }, + shopify: { scripts: ['https://cdn.shopify.com/s/files/1/0/t/1/assets/theme.js'] }, + webflow: { domFlags: ['html[data-wf-site]'] }, + framer: { metas: ['generator=Framer 400ebe4'] }, + posthog: { scripts: ['https://us-assets.i.posthog.com/static/array.js'] }, + plausible: { scripts: ['https://plausible.io/js/script.js'] }, + fathom: { scripts: ['https://cdn.usefathom.com/script.js'] }, + amplitude: { scripts: ['https://cdn.amplitude.com/libs/analytics-browser-2.11.1-min.js.gz'] }, +}; + +/** Rules whose confidence is capped by design. */ +const EXPECTED_LOW = new Set(['import-map']); + +/** A hostile page: the technology is only TALKED about. */ +function proseCase(rule) { + const words = [rule.name, rule.id].join(' '); + const slug = rule.id.replace(/[^a-z0-9]+/gi, '-'); + return base({ + url: `https://blog.example/posts/why-we-chose-${slug}?ref=${slug}`, + metas: [`description=A guide to ${words}`, `og:title=${rule.name} vs everything`, `keywords=${words}`], + inlineSamples: [ + `{"title":"Migrating to ${rule.name}","tags":["${rule.id}","${rule.name}"],"body":"We use ${words} in production."}`, + `document.title = "${rule.name} — a ${rule.id} tutorial";`, + ], + scripts: [ + `https://blog.example/images/${slug}-logo.png`, + `https://blog.example/images/posts/${slug}-vs-others.jpg`, + `https://blog.example/api/search?q=${encodeURIComponent(words)}`, + `https://blog.example/assets/app.js?utm_campaign=${slug}`, + ], + }); +} + +describe('signature coverage gate', () => { + it('every signature has a positive case', () => { + const missing = SIGNATURES.map((r) => r.id).filter((id) => !POSITIVE[id]); + assert.deepEqual(missing, [], `add POSITIVE cases for: ${missing.join(', ')}`); + }); + + it('no stale positive cases', () => { + const known = new Set(SIGNATURES.map((r) => r.id)); + assert.deepEqual(Object.keys(POSITIVE).filter((id) => !known.has(id)), []); + }); + + for (const rule of SIGNATURES) { + it(`${rule.id}: fires on real evidence`, () => { + const r = detect(base(POSITIVE[rule.id] || {})); + const h = r.hits.find((x) => x.id === rule.id); + assert.ok(h, `${rule.id} did not fire: ${JSON.stringify(POSITIVE[rule.id])}`); + if (!EXPECTED_LOW.has(rule.id)) assert.notEqual(h.confidence, 'low', `${rule.id} only reached low`); + }); + + it(`${rule.id}: never fires on prose, file names or search queries`, () => { + const r = detect(proseCase(rule)); + const h = r.hits.find((x) => x.id === rule.id); + assert.equal(h, undefined, h && `${rule.id} fired from prose: ${JSON.stringify(h.evidence)}`); + }); + } +}); From a4e5a8e3bfecbd416b921b0ecf8b85b59e522d2a Mon Sep 17 00:00:00 2001 From: Kiro Agent <244629292+kiro-agent@users.noreply.github.com> Date: Sat, 26 Sep 2026 09:02:22 +0000 Subject: [PATCH 6/8] =?UTF-8?q?test:=20golden=20corpus=20=E2=80=94=2046=20?= =?UTF-8?q?real=20sites=20captured=20and=20replayed=20offline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/capture-corpus.mjs loads the real extension, captures the content script's light signals and the MAIN-world probe globals (via a new extension-page-only CAPTURE_SIGNALS message), scrubs query strings and non-evidence inline text, and writes tests/corpus/.json. tests/corpus.test.js replays them through merge + detect() with hand-reviewed must/mustNot/mustNotSolid/noVersion expectations and a full snapshot (UPDATE_CORPUS=1 to accept reviewed changes). --- background/service-worker.js | 7 +- package.json | 7 +- scripts/capture-corpus.mjs | 135 ++++++ tests/corpus.test.js | 66 +++ tests/corpus/angular.dev.json | 101 +++++ tests/corpus/astro.build.json | 66 +++ tests/corpus/auth0.com.json | 390 ++++++++++++++++ tests/corpus/chakra-ui.com.json | 429 ++++++++++++++++++ tests/corpus/clerk.com.json | 275 ++++++++++++ tests/corpus/dev.to.json | 87 ++++ tests/corpus/discord.com.json | 173 ++++++++ tests/corpus/en.wikipedia.org.json | 52 +++ tests/corpus/getbootstrap.com.json | 74 ++++ tests/corpus/github.com.json | 230 ++++++++++ tests/corpus/gitlab.com.json | 439 ++++++++++++++++++ tests/corpus/jquery.com.json | 59 +++ tests/corpus/linear.app.json | 491 +++++++++++++++++++++ tests/corpus/medium.com.json | 41 ++ tests/corpus/mui.com.json | 203 +++++++++ tests/corpus/newrelic.com.json | 153 +++++++ tests/corpus/nextjs.org.json | 230 ++++++++++ tests/corpus/nuxt.com.json | 472 ++++++++++++++++++++ tests/corpus/razorpay.com.json | 285 ++++++++++++ tests/corpus/react.dev.json | 172 ++++++++ tests/corpus/remix.run.json | 248 +++++++++++ tests/corpus/segment.com.json | 217 +++++++++ tests/corpus/sentry.io.json | 120 +++++ tests/corpus/sites.json | 48 ++ tests/corpus/stackoverflow.com.json | 133 ++++++ tests/corpus/stripe.com.json | 183 ++++++++ tests/corpus/supabase.com.json | 293 ++++++++++++ tests/corpus/svelte.dev.json | 129 ++++++ tests/corpus/tailwindcss.com.json | 226 ++++++++++ tests/corpus/vercel.com.json | 275 ++++++++++++ tests/corpus/vuejs.org.json | 129 ++++++ tests/corpus/wordpress.org.json | 108 +++++ tests/corpus/www.airbnb.com.json | 246 +++++++++++ tests/corpus/www.atlassian.com.json | 347 +++++++++++++++ tests/corpus/www.canva.com.json | 32 ++ tests/corpus/www.datadoghq.com.json | 250 +++++++++++ tests/corpus/www.figma.com.json | 213 +++++++++ tests/corpus/www.flipkart.com.json | 158 +++++++ tests/corpus/www.hotjar.com.json | 329 ++++++++++++++ tests/corpus/www.intercom.com.json | 226 ++++++++++ tests/corpus/www.netflix.com.json | 95 ++++ tests/corpus/www.notion.com.json | 375 ++++++++++++++++ tests/corpus/www.onlyfrontendjobs.com.json | 198 +++++++++ tests/corpus/www.reddit.com.json | 29 ++ tests/corpus/www.shopify.com.json | 149 +++++++ tests/corpus/www.spotify.com.json | 228 ++++++++++ tests/corpus/www.youtube.com.json | 181 ++++++++ 51 files changed, 9799 insertions(+), 3 deletions(-) create mode 100644 scripts/capture-corpus.mjs create mode 100644 tests/corpus.test.js create mode 100644 tests/corpus/angular.dev.json create mode 100644 tests/corpus/astro.build.json create mode 100644 tests/corpus/auth0.com.json create mode 100644 tests/corpus/chakra-ui.com.json create mode 100644 tests/corpus/clerk.com.json create mode 100644 tests/corpus/dev.to.json create mode 100644 tests/corpus/discord.com.json create mode 100644 tests/corpus/en.wikipedia.org.json create mode 100644 tests/corpus/getbootstrap.com.json create mode 100644 tests/corpus/github.com.json create mode 100644 tests/corpus/gitlab.com.json create mode 100644 tests/corpus/jquery.com.json create mode 100644 tests/corpus/linear.app.json create mode 100644 tests/corpus/medium.com.json create mode 100644 tests/corpus/mui.com.json create mode 100644 tests/corpus/newrelic.com.json create mode 100644 tests/corpus/nextjs.org.json create mode 100644 tests/corpus/nuxt.com.json create mode 100644 tests/corpus/razorpay.com.json create mode 100644 tests/corpus/react.dev.json create mode 100644 tests/corpus/remix.run.json create mode 100644 tests/corpus/segment.com.json create mode 100644 tests/corpus/sentry.io.json create mode 100644 tests/corpus/sites.json create mode 100644 tests/corpus/stackoverflow.com.json create mode 100644 tests/corpus/stripe.com.json create mode 100644 tests/corpus/supabase.com.json create mode 100644 tests/corpus/svelte.dev.json create mode 100644 tests/corpus/tailwindcss.com.json create mode 100644 tests/corpus/vercel.com.json create mode 100644 tests/corpus/vuejs.org.json create mode 100644 tests/corpus/wordpress.org.json create mode 100644 tests/corpus/www.airbnb.com.json create mode 100644 tests/corpus/www.atlassian.com.json create mode 100644 tests/corpus/www.canva.com.json create mode 100644 tests/corpus/www.datadoghq.com.json create mode 100644 tests/corpus/www.figma.com.json create mode 100644 tests/corpus/www.flipkart.com.json create mode 100644 tests/corpus/www.hotjar.com.json create mode 100644 tests/corpus/www.intercom.com.json create mode 100644 tests/corpus/www.netflix.com.json create mode 100644 tests/corpus/www.notion.com.json create mode 100644 tests/corpus/www.onlyfrontendjobs.com.json create mode 100644 tests/corpus/www.reddit.com.json create mode 100644 tests/corpus/www.shopify.com.json create mode 100644 tests/corpus/www.spotify.com.json create mode 100644 tests/corpus/www.youtube.com.json diff --git a/background/service-worker.js b/background/service-worker.js index 7844e4c..5f94833 100644 --- a/background/service-worker.js +++ b/background/service-worker.js @@ -38,7 +38,12 @@ async function handle(msg, sender) { // Tooling only (corpus capture, browser suite): raw signals + probe output. // Extension pages only — never a content script. if (msg.type === 'CAPTURE_SIGNALS') { - if (sender.tab || sender.id !== chrome.runtime.id) return { ok: false, error: 'forbidden' }; + // Content scripts report the page's URL as sender.url; extension pages + // report a chrome-extension:/// URL. + const own = chrome.runtime.getURL(''); + if (sender.id !== chrome.runtime.id || !String(sender.url || '').startsWith(own)) { + return { ok: false, error: 'forbidden' }; + } return { ok: true, ...(await orchestrator.capture(msg.tabId)) }; } diff --git a/package.json b/package.json index 93720db..6ec4105 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "whatstack", "version": "1.7.2", "private": true, - "description": "WhatStack — local Chrome extension that reports a site's frontend tech stack", + "description": "WhatStack \u2014 local Chrome extension that reports a site's frontend tech stack", "type": "module", "scripts": { "test": "node --test tests/*.test.js", @@ -10,7 +10,10 @@ "audit:local": "node scripts/local-only-audit.js", "pack": "node scripts/package-extension.js", "assets": "node scripts/make-store-assets.mjs", - "test:browser": "node tests/browser/run.mjs" + "test:browser": "node tests/browser/run.mjs", + "test:coverage": "node --test --experimental-test-coverage --test-coverage-include=shared/**/*.js --test-coverage-include=background/**/*.js --test-coverage-lines=80 tests/*.test.js", + "corpus:capture": "node scripts/capture-corpus.mjs", + "corpus:update": "UPDATE_CORPUS=1 node --test tests/corpus.test.js" }, "devDependencies": { "playwright": "^1.56.0" diff --git a/scripts/capture-corpus.mjs b/scripts/capture-corpus.mjs new file mode 100644 index 0000000..e7914fb --- /dev/null +++ b/scripts/capture-corpus.mjs @@ -0,0 +1,135 @@ +/** + * Golden corpus capture. Loads the REAL unpacked extension, visits each site in + * tests/corpus/sites.json, and stores exactly what detect() consumes in + * production — the content script's light signals and the MAIN-world probe's + * globals — so tests/corpus.test.js can replay real pages offline. + * + * npm run corpus:capture # all sites (network required) + * npm run corpus:capture -- stripe.com # one site + * + * Captures are scrubbed: query strings are dropped (except Vercel's dpl=, which + * a rule reads), and only the inline-script excerpts that a signature matches + * are kept, so no page content beyond the evidence is stored. + */ +import { createRequire } from 'node:module'; +import path from 'node:path'; +import fs from 'node:fs'; +import os from 'node:os'; +import { fileURLToPath } from 'node:url'; +import { SIGNATURES } from '../shared/signatures.js'; +import { detect, mergeDeepSignals } from '../shared/detect.js'; + +const require = createRequire(import.meta.url); +const { chromium } = require('playwright'); + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const DIR = path.join(ROOT, 'tests/corpus'); +const MANIFEST = JSON.parse(fs.readFileSync(path.join(ROOT, 'manifest.json'), 'utf8')); +const SITES = JSON.parse(fs.readFileSync(path.join(DIR, 'sites.json'), 'utf8')); +const only = process.argv.slice(2); + +const INLINE_PATTERNS = [ + ...SIGNATURES.flatMap((r) => r.checks.filter((c) => c.type === 'inline').map((c) => c.pattern)), + /\bReact\.version\s*=/, +]; + +function scrubUrl(u) { + const s = String(u); + if (s.startsWith('inline:#')) return s; + const q = s.search(/[?#]/); + if (q === -1) return s; + const dpl = s.match(/[?&](dpl=dpl_[\w-]+)/); + return s.slice(0, q) + (dpl ? `?${dpl[1]}` : ''); +} + +/** Keep only the evidence-bearing excerpt of each inline script. */ +function scrubInline(samples) { + const out = []; + for (const text of samples || []) { + for (const re of INLINE_PATTERNS) { + const flags = re.flags.replace('g', ''); + const m = new RegExp(re.source, flags).exec(text); + if (m) { + out.push(text.slice(Math.max(0, m.index - 120), m.index + m[0].length + 120)); + break; + } + } + } + return out; +} + +export function scrubSignals(light) { + return { + url: scrubUrl(light.url), + scripts: [...new Set((light.scripts || []).map(scrubUrl))], + stylesheets: [...new Set((light.stylesheets || []).map(scrubUrl))], + cookies: light.cookies || [], + metas: (light.metas || []).filter((m) => /^(?:generator|next-head-count|framework)=/i.test(m)), + inlineSamples: scrubInline(light.inlineSamples), + domFlags: light.domFlags || [], + globals: {}, + pass: 'light', + }; +} + +export function snapshot(result) { + return result.hits.map((h) => `${h.id}:${h.confidence}${h.version ? '@' + h.version : ''}`).sort(); +} + +const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wscorpus-')); +const context = await chromium.launchPersistentContext(userDataDir, { + channel: 'chromium', + headless: true, + viewport: { width: 1366, height: 850 }, + args: [ + `--disable-extensions-except=${ROOT}`, + `--load-extension=${ROOT}`, + '--disable-features=DisableLoadExtensionCommandLineSwitch', + '--no-sandbox', + '--no-first-run', + ], +}); +const sw = context.serviceWorkers()[0] || (await context.waitForEvent('serviceworker', { timeout: 20000 })); +const extId = new URL(sw.url()).host; +const ext = await context.newPage(); +await ext.goto(`chrome-extension://${extId}/popup/popup.html`); +const browserVersion = context.browser()?.version() || (await ext.evaluate(() => navigator.userAgent.match(/Chrom(?:e|ium)\/([\d.]+)/)?.[1])); + +let written = 0; +for (const site of SITES) { + if (only.length && !only.includes(site.host)) continue; + const page = await context.newPage(); + try { + await page.goto(`https://${site.host}/`, { waitUntil: 'domcontentloaded', timeout: 45000 }); + await page.waitForTimeout(7000); + const url = page.url(); + const cap = await ext.evaluate(async (u) => { + const tab = (await chrome.tabs.query({})).find((t) => t.url === u); + return chrome.runtime.sendMessage({ type: 'CAPTURE_SIGNALS', tabId: tab.id }); + }, url); + if (!cap || !cap.ok || !cap.light) throw new Error('capture failed'); + const signals = scrubSignals(cap.light); + const globals = cap.globals || {}; + const result = detect(mergeDeepSignals(signals, globals)); + const file = path.join(DIR, `${site.host}.json`); + const record = { + host: site.host, + capturedAt: new Date().toISOString().slice(0, 10), + whatstack: MANIFEST.version, + chromium: browserVersion, + expect: site.expect || {}, + snapshot: snapshot(result), + signals, + globals, + }; + fs.writeFileSync(file, JSON.stringify(record, null, 1) + '\n'); + written++; + console.log(`${site.host.padEnd(26)} ${record.snapshot.join(' ')}`); + } catch (e) { + console.log(`${site.host.padEnd(26)} SKIPPED (${String(e.message || e).slice(0, 80)})`); + } + await page.close(); +} +await context.close(); +fs.rmSync(userDataDir, { recursive: true, force: true }); +console.log(`\n${written} capture(s) written to tests/corpus/`); diff --git a/tests/corpus.test.js b/tests/corpus.test.js new file mode 100644 index 0000000..07ba749 --- /dev/null +++ b/tests/corpus.test.js @@ -0,0 +1,66 @@ +/** + * Golden corpus replay: real signals captured from real sites by + * scripts/capture-corpus.mjs (content-script light signals + MAIN-world probe + * globals), run through the same merge + detect() path as a production deep + * scan. Runs offline in `npm test`. + * + * Two layers: + * - expectations (hand-reviewed, in sites.json): must / mustNot / mustNotSolid / + * noVersion — a failure here is a real regression. + * - snapshot: the full sorted id:confidence@version list. Any change fails + * until reviewed; accept intentional changes with + * UPDATE_CORPUS=1 npm test + * and commit the diff. + */ +import { describe, it } from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { detect, mergeDeepSignals } from '../shared/detect.js'; + +const DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), 'corpus'); +const UPDATE = process.env.UPDATE_CORPUS === '1'; +const files = fs.readdirSync(DIR).filter((f) => f.endsWith('.json') && f !== 'sites.json').sort(); +const sites = JSON.parse(fs.readFileSync(path.join(DIR, 'sites.json'), 'utf8')); +const expectFor = Object.fromEntries(sites.map((s) => [s.host, s.expect || {}])); + +const snap = (result) => result.hits.map((h) => `${h.id}:${h.confidence}${h.version ? '@' + h.version : ''}`).sort(); + +describe('golden corpus (real captured sites)', () => { + it('has a meaningful number of captures', () => { + assert.ok(files.length >= 30, `only ${files.length} captures`); + }); + + for (const file of files) { + const record = JSON.parse(fs.readFileSync(path.join(DIR, file), 'utf8')); + const expect = expectFor[record.host] || record.expect || {}; + + it(`${record.host}`, () => { + const result = detect(mergeDeepSignals(record.signals, record.globals)); + const byId = Object.fromEntries(result.hits.map((h) => [h.id, h])); + + for (const id of expect.must || []) { + assert.ok(byId[id], `${record.host}: expected ${id}`); + assert.notEqual(byId[id].confidence, 'low', `${record.host}: ${id} dropped to low`); + } + for (const id of expect.mustNot || []) { + assert.equal(byId[id], undefined, `${record.host}: ${id} must not be reported (${JSON.stringify(byId[id]?.evidence)})`); + } + for (const id of expect.mustNotSolid || []) { + assert.ok(!byId[id] || byId[id].confidence === 'low', `${record.host}: ${id} must be low at most, got ${byId[id]?.confidence}`); + } + for (const id of expect.noVersion || []) { + assert.equal(byId[id]?.version, undefined, `${record.host}: ${id} must not show a version`); + } + + const now = snap(result); + if (UPDATE) { + record.snapshot = now; + fs.writeFileSync(path.join(DIR, file), JSON.stringify(record, null, 1) + '\n'); + return; + } + assert.deepEqual(now, record.snapshot, `${record.host}: detection changed — review, then UPDATE_CORPUS=1 npm test`); + }); + } +}); diff --git a/tests/corpus/angular.dev.json b/tests/corpus/angular.dev.json new file mode 100644 index 0000000..b1ea799 --- /dev/null +++ b/tests/corpus/angular.dev.json @@ -0,0 +1,101 @@ +{ + "host": "angular.dev", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "angular" + ] + }, + "snapshot": [ + "angular:high@22.2.0", + "google-analytics:high" + ], + "signals": { + "url": "https://angular.dev/", + "scripts": [ + "https://www.googletagmanager.com/gtag/js", + "main-CIUPUTY5.js", + "chunk-DG4IofJ1.js", + "chunk-DiscwNkY.js", + "chunk-4qFaCXLu.js", + "chunk-B8DkfwEd.js", + "chunk-BmIpPeTJ.js", + "chunk-Byc26Hc_.js", + "chunk-DeQmF7Iu.js", + "chunk-1woBMFvL.js", + "chunk-BisTnaeL.js", + "chunk-D4i4P6oi.js", + "inline:#gtag-script", + "inline:#ng-event-dispatch-contract", + "inline:#ng-state", + "https://fonts.googleapis.com/css2", + "https://angular.dev/chunk-DG4IofJ1.js", + "https://angular.dev/chunk-DiscwNkY.js", + "https://angular.dev/chunk-4qFaCXLu.js", + "https://angular.dev/chunk-B8DkfwEd.js", + "https://angular.dev/chunk-BmIpPeTJ.js", + "https://angular.dev/chunk-Byc26Hc_.js", + "https://angular.dev/chunk-DeQmF7Iu.js", + "https://angular.dev/chunk-1woBMFvL.js", + "https://angular.dev/chunk-BisTnaeL.js", + "https://angular.dev/chunk-D4i4P6oi.js", + "https://angular.dev/main-CIUPUTY5.js", + "https://angular.dev/styles-V46FXCBJ.css", + "https://angular.dev/assets/icons/site.webmanifest", + "https://angular.dev/media/editor-light-IWWA7SEJ.png", + "https://angular.dev/media/angular-logo-light-A36B7RRE.svg", + "https://angular.dev/chunk-CmRFN2Lw.js", + "https://angular.dev/chunk-BLjnejr3.js", + "https://angular.dev/chunk-DWSDm00S.js", + "https://angular.dev/chunk-P1aeJ_n_.js", + "https://angular.dev/chunk-DcFjTPmj.js", + "https://angular.dev/chunk-BrBp6tOx.js", + "https://angular.dev/chunk-CH-TvtGQ.js", + "https://angular.dev/chunk-BomaQ4l3.js", + "https://angular.dev/chunk-UDeI7juy.js", + "https://angular.dev/chunk-D_cnI7aO.js", + "https://angular.dev/chunk-BJ0bB2d7.js", + "https://angular.dev/chunk-Dy8iGyLf.js", + "https://angular.dev/chunk-DpV8IDP5.js", + "https://angular.dev/chunk-BQgwKfs5.js", + "https://angular.dev/assets/others/versions.json", + "https://angular.dev/chunk-zkLfDOfX.js", + "https://angular.dev/assets/images/angie/greeting.svg", + "https://angular.dev/chunk-vgkYz8tD.js", + "https://angular.dev/chunk-yaDFekiu.js", + "https://angular.dev/assets/icons/favicon.ico", + "https://angular.dev/chunk-C76Gtw6S.js", + "https://angular.dev/chunk-cLhcnb7m.js", + "https://angular.dev/chunk-DY8aYXyj.js", + "https://angular.dev/chunk-CsADmXFc.js", + "https://angular.dev/chunk-BGPBcj8R.js", + "https://angular.dev/chunk-jE6Y_6eY.js", + "https://www.google-analytics.com/g/collect" + ], + "stylesheets": [ + "https://fonts.googleapis.com/css2", + "styles-V46FXCBJ.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "[ng-version]", + "ng-version:22.2.0+sha-14793bf", + "[_ngcontent-]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__ng_version_attr": { + "present": true, + "version": "22.2.0+sha-14793bf" + }, + "gtag": { + "present": true + } + } +} diff --git a/tests/corpus/astro.build.json b/tests/corpus/astro.build.json new file mode 100644 index 0000000..b8e6fd3 --- /dev/null +++ b/tests/corpus/astro.build.json @@ -0,0 +1,66 @@ +{ + "host": "astro.build", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "astro" + ] + }, + "snapshot": [ + "astro:high", + "fathom:high", + "tailwind:high" + ], + "signals": { + "url": "https://astro.build/", + "scripts": [ + "https://cdn.usefathom.com/script.js", + "/_astro/page.4AM5fX2K.js", + "/_astro/HeaderNav.astro_astro_type_script_index_0_lang.yswXo7wO.js", + "/_astro/Header.astro_astro_type_script_index_0_lang.DzqrMxS3.js", + "/_astro/CodeBlock.astro_astro_type_script_index_0_lang.Cunj9zFc.js", + "/_astro/ec.0vx5m.js", + "/fonts/Obviously.woff2", + "/fonts/Inter.woff2", + "https://astro.build/fonts/Obviously.woff2", + "https://astro.build/fonts/Inter.woff2", + "https://astro.build/_astro/tailwind.QfH26gv7.css", + "https://astro.build/_astro/page.4AM5fX2K.js", + "https://astro.build/_astro/HeaderNav.astro_astro_type_script_index_0_lang.yswXo7wO.js", + "https://astro.build/_astro/Header.astro_astro_type_script_index_0_lang.DzqrMxS3.js", + "https://astro.build/_astro/CodeBlock.astro_astro_type_script_index_0_lang.Cunj9zFc.js", + "https://astro.build/_astro/HeroBackground.B0iWl89K_1XcMNn.webp", + "https://astro.build/_astro/ec.uumq6.css", + "https://astro.build/_astro/ec.0vx5m.js", + "https://astro.build/_astro/signals-core.module.I2YRmzXw.js", + "https://astro.build/_astro/dom.CNxIm9IU.js", + "https://cdn.usefathom.com/", + "https://astro.build/fonts/MDIO.woff2", + "https://astro.build/favicon.svg" + ], + "stylesheets": [ + "/_astro/tailwind.QfH26gv7.css", + "/_astro/ec.uumq6.css" + ], + "cookies": [], + "metas": [ + "generator=Astro v7.3.3" + ], + "inlineSamples": [], + "domFlags": [ + "[data-astro-]", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "fathom": { + "present": true + } + } +} diff --git a/tests/corpus/auth0.com.json b/tests/corpus/auth0.com.json new file mode 100644 index 0000000..1251a0b --- /dev/null +++ b/tests/corpus/auth0.com.json @@ -0,0 +1,390 @@ +{ + "host": "auth0.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "auth0" + ] + }, + "snapshot": [ + "auth0:high", + "google-analytics:high", + "nextjs:high@14.2.35", + "react:high", + "sentry:high", + "styled-components:high", + "vercel:high", + "webpack:high" + ], + "signals": { + "url": "https://auth0.com/", + "scripts": [ + "https://collector-54183.us.tvsquared.com/tv2track.js", + "https://j.6sc.co/6si.min.js", + "https://www.googletagmanager.com/gtag/destination", + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://cdn.bizible.com/xdc.js", + "//j.6sc.co/6si.min.js", + "https://s.adroll.com/j/GE64BLR4AFGJBFXJMEGNRA/roundtrip.js", + "https://trk.techtarget.com/tracking.js", + "https://connect.facebook.net/signals/config/538524104666236", + "https://connect.facebook.net/signals/config/1703904396493835", + "https://connect.facebook.net/signals/config/292592621735462", + "https://connect.facebook.net/signals/config/417778941754366", + "https://connect.facebook.net/en_US/fbevents.js", + "https://cdn.heapanalytics.com/js/heap-1279799279.js", + "https://static.ads-twitter.com/uwt.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://a.quora.com/qevents.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://www.googletagmanager.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/launch-af624fe9e34f.min.js", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/polyfills-42372ed130431b0a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/webpack-6b9bcfde271ff896.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/framework-4077bb59ae2dbeb8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/main-9ad4dd5f22a60cef.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/pages/_app-4ca3238a50471a2a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/9236dd9e-1d7bf9b65dbd9bec.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/661ab7c2-3371e2a770ea02e0.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/7e9d2725-54c81a2840e1f19b.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/0fd704ba-74490cf078ac6d4a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/89927-12e85e047d3ef0b6.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/74635-76e13522b12a9331.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/26369-dbb47901c20226cc.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/41664-6ef2f60547157478.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/46066-62e01c63a1163f92.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/83824-dc249dd4e18e94fb.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/48764-8517477c5b02ccb2.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/17379-66d340100ae611a8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/89755-a5fe727e8ebbac50.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/54076-36ef2b7b95fef04a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/24069-4def7f53f697c8c1.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/10159-cb24f4910f6cd4bb.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/27356-6e92f52547b4c7c5.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/79217-2844a8cec2fb5854.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/10063-977e6c80f08bb3b7.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/77158-148425252889ea44.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/89419-485488640e582c95.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/53960-37384ebbe12f5929.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/47874-015aadc379e115ba.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/59236-fb03114168860c00.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/35325-42921f492f6d8329.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/53810-084fece216f628e2.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/86721-ea4e820649369357.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/18566-079bf31962e4a070.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/84397-339cf4f1b89c58a8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/69863-855d97c20acdd8ca.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/56506-f5bb1025d70c87e5.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/6619-3e99a5ea7cba3d24.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/49105-33f5311d61e14652.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/92213-e51b3e5107c09bb3.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/88603-7707be35cc311026.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/45693-a2757c9a39c72259.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/26667-8a47fa0cbdf5f8ff.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/85879-66dbbd9812a87369.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/36758-b75883466d414978.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/chunks/pages/index-8b65ebd6989e6824.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/e9P9a9KRvvEVBK7y1gDRB/_buildManifest.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "/b2b-enterprise-identity-management/vercel/_next/static/e9P9a9KRvvEVBK7y1gDRB/_ssgManifest.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RCe3f606b693bb4c1f99f0849431b96ff1-source.min.js", + "/_vercel/speed-insights/script.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RC78b394b8be4640d2aa7a8700e03ca735-source.min.js", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/otBannerSdk.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RCccd2c0df87af4b619762c5a30681859f-source.min.js", + "https://tracking.g2crowd.com/attribution_tracking/conversions/3322.js", + "//munchkin.marketo.net/munchkin.js", + "https://j.6sc.co/j/50c2f83c-c1e0-442d-b142-e90481164ff5.js", + "https://lift-ai-js.marketlinc.com/auth0.com/deployment.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RCb30f94e615d148debc8f20be5357fdce-source.min.js", + "https://t.contentsquare.net/uxa/6f82ac62c91cf.js", + "https://d.adroll.com/consent/check/GE64BLR4AFGJBFXJMEGNRA", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/741399969/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/699394885/", + "https://js.qualified.com/qualified.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RC152ed3d4299046939b1f6256164fa432-source.min.js", + "https://lex.33across.com/ps/v1/pubtoken/", + "https://cdn.cr-proxy.com/v1/site/3f096104-a694-4a6e-8a87-40c00fbbca6d/signals.js", + "https://assets.adobedtm.com/6bb3f7663515/7006851c9849/710b11382c88/RC7fdae6afc5e34e8f8a9473ad7c1331b3-source.min.js", + "//s.adroll.com/j/sendrolling.js", + "https://cdn.optimizely.com/js/17870831401.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "//platform.twitter.com/oct.js", + "//m.servedby-buysellads.com/monetization.it.js", + "https://js.adsrvr.org/up_loader.1.1.0.js", + "https://d2i34c80a0ftze.cloudfront.net/fullcircle.js", + "https://cdn.bizible.com/scripts/bizible.js", + "inline:#webpage-schema", + "inline:#6senseWebTag", + "inline:#ml_snippet_script_id", + "inline:#__NEXT_DATA__", + "inline:#consent-script", + "inline:#OptanonWrapper", + "https://cdn.auth0.com/website/styleguide/core-custom/1.0.3/core.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/webpack-6b9bcfde271ff896.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/framework-4077bb59ae2dbeb8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/pages/_app-4ca3238a50471a2a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/main-9ad4dd5f22a60cef.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/9236dd9e-1d7bf9b65dbd9bec.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/661ab7c2-3371e2a770ea02e0.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/0fd704ba-74490cf078ac6d4a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/89927-12e85e047d3ef0b6.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/41664-6ef2f60547157478.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/7e9d2725-54c81a2840e1f19b.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/26369-dbb47901c20226cc.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/74635-76e13522b12a9331.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/46066-62e01c63a1163f92.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/83824-dc249dd4e18e94fb.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/48764-8517477c5b02ccb2.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/17379-66d340100ae611a8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/10159-cb24f4910f6cd4bb.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/89755-a5fe727e8ebbac50.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/24069-4def7f53f697c8c1.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/54076-36ef2b7b95fef04a.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/79217-2844a8cec2fb5854.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/77158-148425252889ea44.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/10063-977e6c80f08bb3b7.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/27356-6e92f52547b4c7c5.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/59236-fb03114168860c00.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/47874-015aadc379e115ba.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/89419-485488640e582c95.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/53960-37384ebbe12f5929.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/35325-42921f492f6d8329.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/53810-084fece216f628e2.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/86721-ea4e820649369357.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/18566-079bf31962e4a070.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/84397-339cf4f1b89c58a8.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/6619-3e99a5ea7cba3d24.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/92213-e51b3e5107c09bb3.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/49105-33f5311d61e14652.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/69863-855d97c20acdd8ca.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/56506-f5bb1025d70c87e5.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/88603-7707be35cc311026.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/85879-66dbbd9812a87369.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/26667-8a47fa0cbdf5f8ff.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/45693-a2757c9a39c72259.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/36758-b75883466d414978.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/e9P9a9KRvvEVBK7y1gDRB/_ssgManifest.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/chunks/pages/index-8b65ebd6989e6824.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/e9P9a9KRvvEVBK7y1gDRB/_buildManifest.js?dpl=dpl_FNijGfaaoyheWhvqVrqMsUhqVYBE", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/react.fc0387fd.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/nextjs.96ac44aa.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/vue.b645b0be.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/react-native.f69cfe0c.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/angular.26e2a9aa.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/swift.864d5dd8.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/webauthn.8573a203.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/jwt.a6f0ac2d.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/saml.5323dd95.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/oidc.523cf6d9.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/passkey.f356236c.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/auth0-status.6249ed03.png", + "https://auth0.com/b2b-enterprise-identity-management/vercel/_next/static/media/auth0-deploy.bdaab92b.png", + "https://cdn.auth0.com/website/homepage/hero/gradients/Desktop.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2B-Evaluation.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2C-SignUp.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2C-Login.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2C-Checkout.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2B-Expansion.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2B-Onboarding.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2C-AIAgent.png", + "https://cdn.auth0.com/website/homepage/user-journey/B2B-AgenticReadiness.png", + "https://cdn.auth0.com/website/oktave/tablist/logo-jersey-mikes.png", + "https://cdn.auth0.com/website/oktave/tablist/image_5148.png", + "https://cdn.auth0.com/website/oktave/tablist/image_5149.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-moniflo.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-octus.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-moneyfarm.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-vialtopartners.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-jamf.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-xometry.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-siemens.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-claas.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-signify.png", + "https://cdn.auth0.com/website/homepage/customers-bento/mclaren.png", + "https://cdn.auth0.com/website/homepage/customers-bento/siemens.png", + "https://cdn.auth0.com/website/homepage/customers-bento/browse-ai.png", + "https://cdn.auth0.com/website/homepage/customers-bento/jersey-mikes.png", + "https://cdn.auth0.com/website/homepage/customers-bento/claas.png", + "https://images.ctfassets.net/2ntc334xpx65/4HwhZN8PI9aTKt5CNepGUA/53544a63b50c92ca890173f339ae5f43/Auth0_Template-NoImage_01__1_.png", + "https://cdn.auth0.com/website/homepage/customers-bento/recidiviz.png", + "https://images.ctfassets.net/2ntc334xpx65/5YLxbm0MeninRBBbMAtC5T/3a84aedf0e59931789515be9481718cb/Auth0_Template-NoImage_01__2_.png", + "https://images.ctfassets.net/2ntc334xpx65/7pkuJuOa1YU9VmNniQfkg0/921d63ad046d86f0f8417226966cd049/Auth0_Template-NoImage_02__1_.png", + "https://cdn.auth0.com/website/footer/ccpa.svg", + "https://images.ctfassets.net/2ntc334xpx65/R2eHaQjqo6R3nbZyqTTEb/7525a50d1a99fd424843f4632b04cfbf/Auth0_Template-NoImage_02__3_.png", + "https://cdn.auth0.com/website/homepage/hero/gradients/HeroGradient_1920x1080_DesktopXL.webm", + "https://cdn.auth0.com/website/oktave/tabber/HomepageTabber01_AIAgents.webm", + "https://cdn.auth0.com/website/oktave/tabber/HomepageTabber02_B2C.webm", + "https://cdn.auth0.com/website/oktave/tabber/HomepageTabber03_B2B.webm", + "https://cdn.auth0.com/website/oktave/tabber/HomepageTabber04_Machines.webm", + "https://cdn.auth0.com/website/nav/featured-bg.png", + "https://cdn.auth0.com/website/homepage/banner-gradient-lg.png", + "https://cdn.auth0.com/website/homepage/user-journey/bg-desktop.png", + "https://cdn.auth0.com/website/homepage/tabber/gradients/Desktop.png", + "https://cdn.auth0.com/website/homepage/code-block-gradient-lg.png", + "https://cdn.auth0.com/website/homepage/customers/mclaren-bg.png", + "https://cdn.auth0.com/website/homepage/customers/class-bg.png", + "https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Regular.woff2", + "https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Medium.woff2", + "https://cdn.auth0.com/website/okta-fonts/AeonikMono-Medium.ttf", + "https://cdn.auth0.com/website/okta-fonts/AeonikMono-Regular.woff2", + "https://cdn.auth0.com/website/ai-identity/commerce/resources/6f53c9d2a4895b8146f18983686c27a9aeac99cd.png", + "https://cdn.auth0.com/website/nav/from-prototype-to-production.png", + "https://cdn.auth0.com/website/nav/auth0-launchpad.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-mclaren.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-pga.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-zapier.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-cribl.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-jerseymikes-2.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-zinnia.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-ita.png", + "https://cdn.auth0.com/website/homepage/customers/logos/customer-bluetooth-logo.png", + "https://cdn.auth0.com/website/homepage/customers/logos/logo-arduino.png", + "https://auth0.com/_/log", + "https://auth0.com/_vercel/speed-insights/script.js", + "https://cdn.cookielaw.org/consent/96e22fd8-d619-4cdd-a3c6-d51529d21faf/96e22fd8-d619-4cdd-a3c6-d51529d21faf.json", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://cdn.cookielaw.org/consent/96e22fd8-d619-4cdd-a3c6-d51529d21faf/019dfd4c-0d7f-710c-a347-9de44546f70a/en.json", + "https://cdn.auth0.com/website/website/favicons/auth0-favicon-48.png", + "https://cdn.auth0.com/website/website/favicons/auth0-favicon.svg", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/otFlat.json", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/v2/otPcCenter.json", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/otCommonStyles.css", + "https://platform.twitter.com/oct.js", + "https://m.servedby-buysellads.com/monetization.it.js", + "https://munchkin.marketo.net/munchkin.js", + "https://q.quora.com/_/ad/269b103bb33744f0acdaf3e2d8fed25e/pixel", + "https://s.ml-attr.com/getuid", + "https://pubads.g.doubleclick.net/activity;xsp=4719053;ord=8438092551726.659", + "https://pubads.g.doubleclick.net/activity;xsp=5126515;ord=5725301560941296", + "https://cdn.cookielaw.org/logos/static/ot_close.svg", + "https://cdn.cookielaw.org/logos/static/ot_guard_logo.svg", + "https://cdn.cookielaw.org/logos/static/ot_company_logo.png", + "https://cdn.cookielaw.org/logos/static/powered_by_logo.svg", + "https://t.co/i/adsct", + "https://analytics.twitter.com/i/adsct", + "https://analytics.twitter.com/1/i/adsct", + "https://t.co/1/i/adsct", + "https://insight.adsrvr.org/track/cei", + "https://pixel-config.reddit.com/pixels/t2_w84hlpn2/config", + "https://alb.reddit.com/rp", + "https://a17870831401.cdn.optimizely.com/client_storage/a17870831401.html", + "https://cdn.bizible.com/ipv", + "https://cdn.bizibly.com/u", + "https://tracking-api.g2.com/attribution_tracking/conversions/assign", + "https://ibc-flow.techtarget.com/a/gif.gif", + "https://munchkin.marketo.net/165/munchkin.js", + "https://c.6sc.co/", + "https://ipv6.6sc.co/", + "https://b.6sc.co/v1/beacon/img.gif", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://ad.doubleclick.net/activity;src=17557222;type=001;cat=okta-0;rcb=10;ord=4660760584146;npa=0;auiddc=1100907026.1790413258;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;user_data_mode=a;_tu=KFA;gtm=45fe69n1v9259520318z871686334za20gzb71686334zd71686334xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=3;tag_exp=115616985~115938465~115938468~118131808~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;em=tv.1;dc_random=1790413257_ErHR-BCza1qV-zjpcTPTnlPPYbJA83CbxA;~oref=https%3A%2F%2Fauth0.com%2F", + "https://17557222.fls.doubleclick.net/activityi;src=17557222;type=001;cat=okta-0;rcb=10;ord=4660760584146;npa=0;auiddc=1100907026.1790413258;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;user_data_mode=a;_tu=KFA;gtm=45fe69n1v9259520318z871686334za20gzb71686334zd71686334xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=2;tag_exp=115616985~115938465~115938468~118131808~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;em=tv.1;dc_random=1790413257_ErHR-BCza1qV-zjpcTPTnlPPYbJA83CbxA;_dc_test=1;~oref=https%3A%2F%2Fauth0.com%2F", + "https://www.google.com/rmkt/collect/741399969/", + "https://www.google.com/rmkt/collect/699394885/", + "https://855-qah-699.mktoresp.com/webevents/visitWebPage", + "https://c.contentsquare.net/pageview", + "https://k-aus1.contentsquare.net/v2/recording", + "https://epsilon.6sense.com/v3/company/details", + "https://heapanalytics.com/h", + "https://px.ads.linkedin.com/collect", + "https://cdn.bizible.com/muc", + "https://d.adroll.com/pex/GE64BLR4AFGJBFXJMEGNRA/AJP4U5F3S5F2LG2U6QABT3", + "https://www.google.com/pagead/1p-user-list/741399969/", + "https://www.google.com/pagead/1p-user-list/699394885/", + "https://10910059.fls.doubleclick.net/activityi;src=10910059;type=cm_auth0;cat=cm_au0;rcb=12;ord=1;num=8063880389159;npa=0;auiddc=1100907026.1790413258;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KJA;gtm=45fe69n1v9188087466z871686334za20gzb71686334zd71686334xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=2;tag_exp=115616985~115938465~115938469~118131808~118897920~118897930~120213116~120385422~120469145~120469153~121246026~121246034;epver=2;dc_random=1790413258_6a0Ae8snOV1J6TwdrsgxJXqW0cS0gjj2PA;_dc_test=1;~oref=https%3A%2F%2Fauth0.com%2F", + "https://10910059.fls.doubleclick.net/activityi;src=10910059;type=cm_auth0;cat=cm_au00;rcb=12;ord=3320628085003;npa=0;auiddc=1100907026.1790413258;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KFA;gtm=45fe69n1v9188087466z871686334za20gzb71686334zd71686334xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=2;tag_exp=115616985~115938465~115938469~118131808~118897920~118897930~120213116~120385422~120469145~120469153~121246026~121246034;epver=2;dc_random=1790413258_ixixJo7H-499rOWwG8jKHH_mNXer9g5TBg;_dc_test=1;~oref=https%3A%2F%2Fauth0.com%2F", + "https://app.qualified.com/w/1/iyHkkDRaz9jhxBqX/visitor_events" + ], + "stylesheets": [ + "https://cdn.auth0.com/website/styleguide/core-custom/1.0.3/core.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css" + ], + "cookies": [ + "__cb_company", + "_okta_attribution", + "_okta_session_attribution", + "_okta_original_attribution", + "OptanonConsent", + "_twpid", + "_twsid", + "optimizelyEndUserId", + "_rdt_uuid", + "optimizelyEndUserId", + "_hp2_id.1279799279", + "_gd_visitor", + "_gd_session", + "_ga", + "_gd_svisitor", + "_gcl_au", + "_fbp", + "_mkto_trk", + "_cs_c", + "_cs_id", + "_cs_s", + "_biz_uid", + "_hp2_ses_props.1279799279", + "__adroll_fpc", + "_ga_QKMSDV5369", + "__q_state_iyHkkDRaz9jhxBqX", + "signals-sdk-user-id", + "signals-sdk-session-id", + "kndctr_ADD71D3E633F65A90A495CE5_AdobeOrg_consent", + "kndctr_ADD71D3E633F65A90A495CE5_AdobeOrg_identity", + "kndctr_ADD71D3E633F65A90A495CE5_AdobeOrg_cluster", + "s_gpv_pn", + "_biz_nA", + "_biz_flagsA", + "_biz_pendingA", + "__ar_v4", + "_tq_id.TV-4554811863-1.658a" + ], + "metas": [ + "next-head-count=37" + ], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer", + "[data-styled]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__NEXT_DATA__": { + "present": true + }, + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "14.2.35" + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/chakra-ui.com.json b/tests/corpus/chakra-ui.com.json new file mode 100644 index 0000000..549006a --- /dev/null +++ b/tests/corpus/chakra-ui.com.json @@ -0,0 +1,429 @@ +{ + "host": "chakra-ui.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "emotion" + ] + }, + "snapshot": [ + "emotion:high", + "nextjs:high@15.5.19", + "plausible:high", + "react:high", + "webpack:high" + ], + "signals": { + "url": "https://chakra-ui.com/", + "scripts": [ + "/_next/static/chunks/98ed3cb1-eebc4b8c439692ba.js", + "/_next/static/chunks/298-18a2c896b9a6e22a.js", + "/_next/static/chunks/main-app-719a69a069a371cf.js", + "/_next/static/chunks/943c495c-2bea28305cae6bbf.js", + "/_next/static/chunks/4405-c9f93ab139df731e.js", + "/_next/static/chunks/8601-0d91fb238460d0ad.js", + "/_next/static/chunks/6938-5a614118c6a2a63f.js", + "/_next/static/chunks/769-33fc32454c20391b.js", + "/_next/static/chunks/8753-566ee0b208b01ad9.js", + "/_next/static/chunks/9257-3c308b7b32b95597.js", + "/_next/static/chunks/app/layout-3b9e85cd1056aa38.js", + "/_next/static/chunks/1048a4d1-9ef40ef54e53c12e.js", + "/_next/static/chunks/d98a53c7-a57a32c15ab034bb.js", + "/_next/static/chunks/2be40c54-ec74d3200a5de48e.js", + "/_next/static/chunks/db833d1b-02a3c3a5a9f4872d.js", + "/_next/static/chunks/af600ab5-08157d73eb0de85d.js", + "/_next/static/chunks/beb7c6f8-cd4942029e3ac830.js", + "/_next/static/chunks/2c5acf57-88ddff852d281692.js", + "/_next/static/chunks/a575a85e-ecf6a6465ca334af.js", + "/_next/static/chunks/6c17f616-d0d95ca86f1a8d1c.js", + "/_next/static/chunks/a7e161de-7d31c1b240a1dd5a.js", + "/_next/static/chunks/f33958b9-7c9d630dc9318bb8.js", + "/_next/static/chunks/05c91ade-80abc8f91f0ce6f5.js", + "/_next/static/chunks/a8a5ce16-2c5fe10bbee7dd74.js", + "/_next/static/chunks/32ea8e17-13f5ffb48780a109.js", + "/_next/static/chunks/448-e7a8a1184a6a33d3.js", + "/_next/static/chunks/6141-0d2d22710a8bbbbd.js", + "/_next/static/chunks/4780-564c03371e0f8e71.js", + "/_next/static/chunks/6790-78f8d351a741cfc0.js", + "/_next/static/chunks/8569-e2c75f8cf392ca92.js", + "/_next/static/chunks/8563-e90f4b356da7860d.js", + "/_next/static/chunks/9972-497932cd44f5c33a.js", + "/_next/static/chunks/app/page-a98f72dd14b8e75d.js", + "/_next/static/chunks/8248-03c590f873a26368.js", + "/_next/static/chunks/2106-b9e7473150567d35.js", + "/_next/static/chunks/app/not-found-741df0c4f5bc59dd.js", + "/_next/static/chunks/polyfills-42372ed130431b0a.js", + "/_next/static/chunks/webpack-4db19280aedc8689.js", + "https://plausible.io/js/plausible.js", + "/_next/static/media/1e41be92c43b3255-s.p.woff2", + "/_next/static/media/4473ecc91f70f139-s.p.woff", + "/_next/static/media/463dafcda517f24f-s.p.woff", + "/_next/static/media/7b0b24f36b1a6d0b-s.p.woff2", + "/_next/static/media/c2a494ffdd24d21e-s.p.woff2", + "/_next/static/media/de42cfb9a3b980ae-s.p.woff2", + "/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "/chakra-ui-ad.png", + "https://images.opencollective.com/veepn-vpn/5e3715a/logo.png", + "https://images.opencollective.com/buy-youtube-views-views4you/de7d37c/logo.png", + "https://images.opencollective.com/buy-instagram-followers-twicsy/b4c5d7f/logo.png", + "https://images.opencollective.com/buzzoid-buy-instagram-followers/56a09fe/logo.png", + "https://images.opencollective.com/lyssna/e72d17d/logo.png", + "https://images.opencollective.com/goread_io/eb6337d/logo.png", + "https://images.opencollective.com/famoid/b8421b3/logo.png", + "https://images.opencollective.com/martin-camacho/f84b36b/avatar.png", + "https://images.opencollective.com/new-casino-bonuses-uk/60bce46/logo.png", + "https://images.opencollective.com/casino-corner/b6fa85d/avatar.png", + "https://images.opencollective.com/aeriusventilations-org/1a55d71/avatar.png", + "https://images.opencollective.com/buy-tiktok-likes-c60e3e34/8bbfac1/avatar.png", + "https://images.opencollective.com/slotsjudge-plcom/3fb2036/avatar.png", + "https://images.opencollective.com/buy-tiktok-followers-co/82431fe/logo.png", + "https://images.opencollective.com/buying-facebook-followers/a8d8adf/logo.png", + "https://images.opencollective.com/snapfollowers/a9754db/logo.png", + "https://images.opencollective.com/materializeinc/cfe7e41/logo.png", + "https://images.opencollective.com/youtube-views-socialwick/c86bcd6/logo.png", + "https://images.opencollective.com/mixx/a07dcb8/logo.png", + "https://images.opencollective.com/writing-metier/762e081/logo.png", + "https://images.opencollective.com/c19-casinos-chile/8509e96/avatar.png", + "https://images.opencollective.com/mysocialfollowing/d10d88d/logo.png", + "https://images.opencollective.com/get-youtube-views/c92b6ff/logo.png", + "https://images.opencollective.com/prestigewatches/5654727/logo.png", + "https://images.opencollective.com/bestpayidpokies/07fc9d6/logo.png", + "https://images.opencollective.com/helpdirect/b48676d/avatar.png", + "https://images.opencollective.com/user-53231496/a1aac80/avatar.png", + "https://images.opencollective.com/instant_famous/3f380d3/logo.png", + "https://images.opencollective.com/fun88-official/bf2843c/logo.png", + "https://images.opencollective.com/time-calculator/be24111/logo.png", + "https://images.opencollective.com/fun88-thailand/81e1909/avatar.png", + "https://images.opencollective.com/fun88-vietnam/192b9db/avatar.png", + "https://images.opencollective.com/fun88-thailand-en/cacc530/avatar.png", + "https://images.opencollective.com/fun88-vietnam-en/2541290/avatar.png", + "https://images.opencollective.com/socialdawn/963a6d4/logo.png", + "https://images.opencollective.com/poli-pay-online-casinos/39bdd37/logo.png", + "https://images.opencollective.com/topkasynoonline-pl/714b70a/logo.png", + "https://images.opencollective.com/buyfans/8122fa8/logo.png", + "https://images.opencollective.com/wnb-online-casino/5300186/logo.png", + "https://images.opencollective.com/bestsitesbuyinstagramfollowers/d6844ba/logo.png", + "https://images.opencollective.com/ta-kalytera-kazino-online/136b84e/logo.png", + "https://images.opencollective.com/streamerplus-c8d5c21b/18da790/logo.png", + "https://images.opencollective.com/buy-twitch-followers/027c56f/avatar.png", + "https://images.opencollective.com/jbo-vietnam/5e66f3a/avatar.png", + "https://images.opencollective.com/girandieres-meilleurs-casinos/6532884/logo.png", + "https://images.opencollective.com/jbo-thailand/d17e84f/avatar.png", + "https://images.opencollective.com/buy-instagram-followers-from-billingsgazette-rated-best-by-latimes/91af1a1/avatar.png", + "https://images.opencollective.com/buy-youtube-views-from-billingsgazette-where-we-rate-the-best-sites-to-buy-views/76da760/avatar.png", + "https://images.opencollective.com/buy-tiktok-followers-best-sites-rated-by-omaha/da84fbb/avatar.png", + "https://images.opencollective.com/media-mister/84eab7b/logo.png", + "https://images.opencollective.com/buy-tiktok-followers-tucson/e606770/logo.png", + "https://images.opencollective.com/view-tiktok-stories/574567d/logo.png", + "https://images.opencollective.com/viewsnapstories/49b4577/avatar.png", + "https://images.opencollective.com/buy-soundcloud-plays/f9fd755/avatar.png", + "https://images.opencollective.com/chadski/9185b28/avatar.png", + "https://images.opencollective.com/buy-instagram-followers-and-likes-32653996/8a24927/avatar.png", + "https://images.opencollective.com/buy-tiktok-views-and-likes/15ca5c6/avatar.png", + "https://images.opencollective.com/buy-youtube-subscribers-views-and-likes/4fc3743/avatar.png", + "https://images.opencollective.com/super-clone-prestige/e681745/logo.png", + "https://images.opencollective.com/super-clone-watches-com/logo.png", + "https://images.opencollective.com/chakra-ui-pro/61bd1dd/logo.png", + "https://images.opencollective.com/github-sponsors/dc0ae97/logo.png", + "https://images.opencollective.com/frank-faubert/bdecef6/avatar.png", + "https://images.opencollective.com/handsontable-javascript-data-grid/84dc03e/logo.png", + "https://images.opencollective.com/touchless/273bc74/logo.png", + "https://images.opencollective.com/shogun/8bf3116/logo.png", + "https://images.opencollective.com/correct-casinos-australia/c2c57d3/logo.png", + "https://images.opencollective.com/latticehq/96ee703/logo.png", + "https://images.opencollective.com/redwoodjs/02a788a/logo.png", + "https://images.opencollective.com/chris-cordle/f844f13/avatar.png", + "https://images.opencollective.com/fundoss/7fe4cec/logo.png", + "https://images.opencollective.com/frontendmasters/0b9cda4/logo.png", + "https://images.opencollective.com/christian-nwamba/2c02698/avatar.png", + "https://images.opencollective.com/bearstudio/be8b415/logo.png", + "https://images.opencollective.com/algosecure/7a26890/logo.png", + "https://images.opencollective.com/guest-d7a0b3d0/avatar.png", + "https://images.opencollective.com/daniel-worsnup/avatar.png", + "https://images.opencollective.com/con-terra-gmbh/avatar.png", + "https://images.opencollective.com/max-goodhart/4285edc/avatar.png", + "https://images.opencollective.com/appbrew/10bc080/logo.png", + "https://images.opencollective.com/robert-cheetham/3c33947/avatar.png", + "https://images.opencollective.com/eastvillafc/4b38432/logo.png", + "https://images.opencollective.com/julien2/3122581/avatar.png", + "https://images.opencollective.com/jamdesk-contact/7a9fe56/avatar.png", + "https://images.opencollective.com/datastory/bfb1a3e/logo.png", + "https://images.opencollective.com/infinum/9a719cb/avatar.png", + "https://images.opencollective.com/clouddevs/b342f76/logo.png", + "https://images.opencollective.com/tuteria/48756d3/logo.png", + "https://images.opencollective.com/stanislas-laurent/avatar.png", + "https://images.opencollective.com/otto-von-wachter/4431523/avatar.png", + "https://images.opencollective.com/koolamusic/c39dcc6/avatar.png", + "https://images.opencollective.com/austin-akers/3548ebd/avatar.png", + "https://images.opencollective.com/corey-mcgeachie/9a8c4bc/avatar.png", + "https://images.opencollective.com/adrian-aleixandre/620b8e5/avatar.png", + "https://images.opencollective.com/thomas-reuter/4177bc3/avatar.png", + "https://images.opencollective.com/ada-school/c2965c3/logo.png", + "https://images.opencollective.com/guest-8ad3483c/avatar.png", + "https://images.opencollective.com/ruth-ikegah/1e35504/avatar.png", + "https://images.opencollective.com/guest-2cb55b5a/avatar.png", + "https://images.opencollective.com/vince-fulco/avatar.png", + "https://images.opencollective.com/thinkmill/28910ec/logo.png", + "https://images.opencollective.com/janelle-tiulentino/avatar.png", + "https://images.opencollective.com/boostly-inc/b42407b/logo.png", + "https://images.opencollective.com/mbifulco/3b16ee2/avatar.png", + "https://images.opencollective.com/leerob/1f518bc/avatar.png", + "https://images.opencollective.com/send/a7f08a1/logo.png", + "https://images.opencollective.com/ndeye-fatou-diop1/avatar.png", + "https://images.opencollective.com/chief/a51d96d/avatar.png", + "https://images.opencollective.com/guest-e9c28c11/avatar.png", + "https://images.opencollective.com/esther-agbaje/avatar.png", + "https://images.opencollective.com/sukhpal-saini/avatar.png", + "https://images.opencollective.com/mkan0141/ae2d92e/avatar.png", + "https://images.opencollective.com/eric-vicenti/avatar.png", + "https://images.opencollective.com/ajitsonlion/46e1570/avatar.png", + "https://images.opencollective.com/youngchan/avatar.png", + "https://images.opencollective.com/thorben/723bf3c/avatar.png", + "https://images.opencollective.com/peter-kloss/avatar.png", + "https://images.opencollective.com/raku/ffd883f/avatar.png", + "https://images.opencollective.com/yoannfleurydev/0dddf95/avatar.png", + "https://images.opencollective.com/guest-d8e74402/avatar.png", + "https://images.opencollective.com/domitrius-clark/avatar.png", + "https://images.opencollective.com/haja-andriamaro/avatar.png", + "https://images.opencollective.com/takeshi-tsukamoto/cb79f76/avatar.png", + "https://images.opencollective.com/lemuel-okoli/b2877be/avatar.png", + "https://images.opencollective.com/mandava/avatar.png", + "https://images.opencollective.com/david-johnson1/6534570/avatar.png", + "https://images.opencollective.com/clayton-collie/avatar.png", + "https://images.opencollective.com/simontaisne/87c4de1/avatar.png", + "https://images.opencollective.com/guest-63493994/avatar.png", + "https://images.opencollective.com/guest-af63eaa8/avatar.png", + "https://images.opencollective.com/guest-70997d7f/avatar.png", + "https://images.opencollective.com/jordan-lee1/b8189a0/avatar.png", + "https://images.opencollective.com/bashir-a-aziz/avatar.png", + "https://images.opencollective.com/guest-b53c6999/avatar.png", + "https://images.opencollective.com/ayrshare/56a9cb5/logo.png", + "https://images.opencollective.com/fabian-frank/avatar.png", + "https://images.opencollective.com/luiz-cieslak/8a27434/avatar.png", + "https://images.opencollective.com/guest-f4c5b975/avatar.png", + "https://images.opencollective.com/guest-034d13bd/avatar.png", + "https://images.opencollective.com/john-obrien1/avatar.png", + "https://images.opencollective.com/guest-b3db5fe5/avatar.png", + "https://images.opencollective.com/brennan-d-baraban/ddb0611/avatar.png", + "https://images.opencollective.com/charly_mrtn/4e64453/avatar.png", + "https://images.opencollective.com/christopher-kapic/be959bb/avatar.png", + "https://images.opencollective.com/volgersboostsocial/1d333e7/logo.png", + "https://images.opencollective.com/medyamagazacomtr/5a62e7f/logo.png", + "https://images.opencollective.com/capajj/dbf7831/avatar.png", + "https://images.opencollective.com/guest-a47b5399/avatar.png", + "https://images.opencollective.com/socialcore/2198b15/logo.png", + "https://images.opencollective.com/jannik-wempe/d3881f5/avatar.png", + "https://images.opencollective.com/matthew-chana/avatar.png", + "https://images.opencollective.com/babajide-owosakin/3104ef8/avatar.png", + "https://images.opencollective.com/pawel-philipczyk/3f56e09/avatar.png", + "https://images.opencollective.com/zet1/avatar.png", + "https://images.opencollective.com/guest-7f284c69/avatar.png", + "https://images.opencollective.com/guest-125aad89/avatar.png", + "https://images.opencollective.com/nadia-medkouri/avatar.png", + "https://images.opencollective.com/guest-92164c89/avatar.png", + "https://images.opencollective.com/alexandru/avatar.png", + "https://images.opencollective.com/guest-cfc31dc5/avatar.png", + "https://images.opencollective.com/guest-0ed92da0/avatar.png", + "https://images.opencollective.com/willianrod/avatar.png", + "https://images.opencollective.com/guest-27732d06/avatar.png", + "https://images.opencollective.com/guest-d436a6e0/avatar.png", + "https://images.opencollective.com/guest-a577545a/avatar.png", + "https://images.opencollective.com/guest-293af195/avatar.png", + "https://images.opencollective.com/tom2drum/avatar.png", + "https://images.opencollective.com/gama-casino/a085f51/logo.png", + "https://images.opencollective.com/otakuweebster/a164c77/avatar.png", + "https://images.opencollective.com/guest-3ffb13d1/avatar.png", + "https://images.opencollective.com/hyesungoh/avatar.png", + "https://images.opencollective.com/user-c629d27f/avatar.png", + "https://images.opencollective.com/silverprize/avatar.png", + "https://images.opencollective.com/sairus2k/c52e342/avatar.png", + "https://images.opencollective.com/twtservices/12f0fe8/logo.png", + "https://images.opencollective.com/targetedwebtraffic/a5fbc47/logo.png", + "https://images.opencollective.com/milwaukee-seo-company/1270873/logo.png", + "https://images.opencollective.com/spyke/f01e4ea/avatar.png", + "https://images.opencollective.com/horoskopi/02f7c79/logo.png", + "https://images.opencollective.com/hendrik-niemann/avatar.png", + "https://images.opencollective.com/michael-james1/avatar.png", + "https://images.opencollective.com/raathi/fe9faf1/avatar.png", + "https://images.opencollective.com/juraj-krivda/ae322ca/avatar.png", + "https://images.opencollective.com/james-lee/avatar.png", + "https://images.opencollective.com/martian-lee/2ce60d2/avatar.png", + "https://images.opencollective.com/timi-tejumola/1580793/avatar.png", + "https://images.opencollective.com/jonathan-wilke/0f3b172/avatar.png", + "https://images.opencollective.com/olivermicke/8eb0ed8/avatar.png", + "https://images.opencollective.com/ccxvee/e7e2aa3/avatar.png", + "https://images.opencollective.com/sudhamsh-bachu/avatar.png", + "https://images.opencollective.com/brady-dukart/f8f21b2/avatar.png", + "https://images.opencollective.com/nathan-simpson/4007f9e/avatar.png", + "https://images.opencollective.com/dimitri-harding/17334b7/avatar.png", + "https://images.opencollective.com/jgrancher/bf29d42/avatar.png", + "https://images.opencollective.com/guest-7ad0a0b1/avatar.png", + "https://images.opencollective.com/guest-2bbc16ac/avatar.png", + "https://images.opencollective.com/guest-900de4ff/avatar.png", + "https://images.opencollective.com/randyloop/1e11db1/avatar.png", + "https://images.opencollective.com/kevin-woodfield/2e63abe/avatar.png", + "https://images.opencollective.com/r17x/feaf22c/avatar.png", + "https://images.opencollective.com/guest-3002d7ca/avatar.png", + "https://images.opencollective.com/user-72b0b300/f06448a/avatar.png", + "https://images.opencollective.com/guest-1232d035/avatar.png", + "https://images.opencollective.com/guest-c8869e90/avatar.png", + "https://images.opencollective.com/plutorepo-networks/036b060/logo.png", + "https://images.opencollective.com/thepadding/7a530c4/logo.png", + "https://images.opencollective.com/guest-874057c9/avatar.png", + "https://images.opencollective.com/guest-0fc2997d/avatar.png", + "https://images.opencollective.com/guest-0fb8845d/avatar.png", + "https://images.opencollective.com/guest-cb45dc28/avatar.png", + "https://images.opencollective.com/guest-28561823/avatar.png", + "https://images.opencollective.com/jy-jy/avatar.png", + "https://images.opencollective.com/tkc310/avatar.png", + "https://images.opencollective.com/nelson-lin/avatar.png", + "https://images.opencollective.com/davide-orsi/avatar.png", + "https://images.opencollective.com/lucas-alves-costa/a9df77f/avatar.png", + "https://images.opencollective.com/guest-efa109f3/avatar.png", + "https://images.opencollective.com/pandaboyamacomtr/1dc73f8/avatar.png", + "https://images.opencollective.com/masalabi/e95d725/avatar.png", + "https://images.opencollective.com/sekilli-nick/2a810cb/avatar.png", + "https://images.opencollective.com/user-457e9c11/avatar.png", + "https://images.opencollective.com/guest-690dbd10/avatar.png", + "https://images.opencollective.com/ig-downloader/038268e/logo.png", + "https://images.opencollective.com/guest-c03d5d38/avatar.png", + "https://images.opencollective.com/guest-67fa289c/avatar.png", + "https://images.opencollective.com/fameviso-home/edc95ea/logo.png", + "https://images.opencollective.com/medyamagaza/d5b6f37/avatar.png", + "https://images.opencollective.com/wisconsin-website-design/8407b29/logo.png", + "https://images.opencollective.com/kinder/cd0b9b4/avatar.png", + "https://images.opencollective.com/haklee/660c1ad/avatar.png", + "https://images.opencollective.com/guest-d34e31a7/avatar.png", + "https://images.opencollective.com/targetedvisitors/6530e9b/logo.png", + "https://images.opencollective.com/bileta-avioni/6ff12cb/logo.png", + "https://images.opencollective.com/moti-ne-tirane/e4a606f/logo.png", + "https://images.opencollective.com/milwaukee-web-design/49c7ba0/logo.png", + "inline:#_R_", + "https://chakra-ui.com/_next/static/media/1e41be92c43b3255-s.p.woff2", + "https://chakra-ui.com/_next/static/media/4473ecc91f70f139-s.p.woff", + "https://chakra-ui.com/_next/static/media/463dafcda517f24f-s.p.woff", + "https://chakra-ui.com/_next/static/media/7b0b24f36b1a6d0b-s.p.woff2", + "https://chakra-ui.com/_next/static/media/de42cfb9a3b980ae-s.p.woff2", + "https://chakra-ui.com/_next/static/media/c2a494ffdd24d21e-s.p.woff2", + "https://chakra-ui.com/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "https://chakra-ui.com/_next/static/css/d27df275678b3507.css", + "https://chakra-ui.com/_next/static/chunks/webpack-4db19280aedc8689.js", + "https://chakra-ui.com/_next/static/chunks/98ed3cb1-eebc4b8c439692ba.js", + "https://chakra-ui.com/_next/static/chunks/298-18a2c896b9a6e22a.js", + "https://chakra-ui.com/_next/static/chunks/main-app-719a69a069a371cf.js", + "https://chakra-ui.com/_next/static/chunks/4405-c9f93ab139df731e.js", + "https://chakra-ui.com/_next/static/chunks/943c495c-2bea28305cae6bbf.js", + "https://chakra-ui.com/_next/static/chunks/6938-5a614118c6a2a63f.js", + "https://chakra-ui.com/_next/static/chunks/8601-0d91fb238460d0ad.js", + "https://chakra-ui.com/_next/static/chunks/769-33fc32454c20391b.js", + "https://chakra-ui.com/_next/static/chunks/2be40c54-ec74d3200a5de48e.js", + "https://chakra-ui.com/_next/static/chunks/db833d1b-02a3c3a5a9f4872d.js", + "https://chakra-ui.com/_next/static/chunks/8753-566ee0b208b01ad9.js", + "https://chakra-ui.com/_next/static/chunks/app/layout-3b9e85cd1056aa38.js", + "https://chakra-ui.com/_next/static/chunks/d98a53c7-a57a32c15ab034bb.js", + "https://chakra-ui.com/_next/static/chunks/1048a4d1-9ef40ef54e53c12e.js", + "https://chakra-ui.com/_next/static/chunks/9257-3c308b7b32b95597.js", + "https://chakra-ui.com/_next/static/chunks/2c5acf57-88ddff852d281692.js", + "https://chakra-ui.com/_next/static/chunks/af600ab5-08157d73eb0de85d.js", + "https://chakra-ui.com/_next/static/chunks/beb7c6f8-cd4942029e3ac830.js", + "https://chakra-ui.com/_next/static/chunks/a575a85e-ecf6a6465ca334af.js", + "https://chakra-ui.com/_next/static/chunks/6c17f616-d0d95ca86f1a8d1c.js", + "https://chakra-ui.com/_next/static/chunks/a7e161de-7d31c1b240a1dd5a.js", + "https://chakra-ui.com/_next/static/chunks/f33958b9-7c9d630dc9318bb8.js", + "https://chakra-ui.com/_next/static/chunks/a8a5ce16-2c5fe10bbee7dd74.js", + "https://chakra-ui.com/_next/static/chunks/05c91ade-80abc8f91f0ce6f5.js", + "https://chakra-ui.com/_next/static/chunks/6141-0d2d22710a8bbbbd.js", + "https://chakra-ui.com/_next/static/chunks/448-e7a8a1184a6a33d3.js", + "https://chakra-ui.com/_next/static/chunks/32ea8e17-13f5ffb48780a109.js", + "https://chakra-ui.com/_next/static/chunks/8569-e2c75f8cf392ca92.js", + "https://chakra-ui.com/_next/static/chunks/4780-564c03371e0f8e71.js", + "https://chakra-ui.com/_next/static/chunks/8563-e90f4b356da7860d.js", + "https://chakra-ui.com/_next/static/chunks/6790-78f8d351a741cfc0.js", + "https://chakra-ui.com/_next/static/chunks/9972-497932cd44f5c33a.js", + "https://chakra-ui.com/_next/static/chunks/app/page-a98f72dd14b8e75d.js", + "https://chakra-ui.com/_next/static/chunks/8248-03c590f873a26368.js", + "https://chakra-ui.com/_next/static/chunks/app/not-found-741df0c4f5bc59dd.js", + "https://chakra-ui.com/_next/static/chunks/2106-b9e7473150567d35.js" + ], + "stylesheets": [ + "/_next/static/css/d27df275678b3507.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[54429,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"4405\\\",\\\"static/c", + "self.__next_f.push([1,\"7:I[18916,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"8:I[2106,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54e", + "self.__next_f.push([1,\"9:I[73537,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"a:I[73856,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"b:I[21009,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"c:I[96771,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"d:I[10396,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"e:I[25825,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"f:I[55732,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"10:I[50630,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"11:I[68160,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"12:I[29401,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"13:I[53482,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"22:I[19279,[],\\\"\\\"]\\n:HL[\\\"/_next/static/media/1e41be92c43b3255-s.p.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"t", + "self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"-7-7C0bw1mViTbbJvLIko\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"childr", + "self.__next_f.push([1,\"23:I[44633,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"24:I[6543,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"25:I[6543,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"26:I[6543,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef54", + "self.__next_f.push([1,\"27:I[83037,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"28:I[67219,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"29:I[67219,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"2a:I[67219,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"2b:I[67219,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"2c:I[67219,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"30:I[37402,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"31:I[42129,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"32:I[12363,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"34:I[65129,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"35:I[77276,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"3c:I[97305,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"3d:I[61837,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"3e:I[97305,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"3f:I[80448,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"40:I[16893,[\\\"5227\\\",\\\"static/chunks/943c495c-2bea28305cae6bbf.js\\\",\\\"3178\\\",\\\"static/chunks/1048a4d1-9ef40ef5", + "self.__next_f.push([1,\"41:I[41968,[],\\\"OutletBoundary\\\"]\\n43:I[62697,[],\\\"AsyncMetadataOutlet\\\"]\\n45:I[41968,[],\\\"ViewportBoundary\\\"]", + "self.__next_f.push([1,\"18:[\\\"$\\\",\\\"$L24\\\",null,{\\\"variant\\\":\\\"plain\\\",\\\"align\\\":\\\"start\\\",\\\"gap\\\":\\\"6\\\",\\\"mt\\\":\\\"4\\\",\\\"children\\\":[[\\" + ], + "domFlags": [ + "next-route-announcer", + "[data-emotion]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "15.5.19" + }, + "plausible": { + "present": true + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/clerk.com.json b/tests/corpus/clerk.com.json new file mode 100644 index 0000000..f910b19 --- /dev/null +++ b/tests/corpus/clerk.com.json @@ -0,0 +1,275 @@ +{ + "host": "clerk.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "clerk" + ], + "mustNot": [ + "bootstrap" + ] + }, + "snapshot": [ + "clerk:high", + "google-analytics:high", + "nextjs:high@16.3.6", + "posthog:high", + "react:high", + "tailwind:high", + "turbopack:high" + ], + "signals": { + "url": "https://clerk.com/", + "scripts": [ + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://static.ads-twitter.com/uwt.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "/_next/static/immutable/chunks/1pxdae-x5q7zk.js", + "/_next/static/immutable/chunks/2s-0ov5w5umxi.js", + "/_next/static/immutable/chunks/26i62-9f_9urb.js", + "/_next/static/immutable/chunks/2223pijdy9gvt.js", + "/_next/static/immutable/chunks/turbopack-21bhrvxzjgw97.js", + "/_next/static/immutable/chunks/32tlpfju4klky.js", + "/_next/static/immutable/chunks/42q1c0eo7ava-.js", + "/_next/static/immutable/chunks/1dox858mfkhjb.js", + "/_next/static/immutable/chunks/3-cxkdg85agqr.js", + "/_next/static/immutable/chunks/1h0nztz8llza4.js", + "/_next/static/immutable/chunks/2fb8chl1odje7.js", + "/_next/static/immutable/chunks/3kr4_gxkxe2bd.js", + "/_next/static/immutable/chunks/1hay8p1apyqrb.js", + "/_next/static/immutable/chunks/3g8c3v6zteg_1.js", + "/_next/static/immutable/chunks/1sxv06xjm7mlf.js", + "/_next/static/immutable/chunks/0qs5p_g8fdmr9.js", + "/_next/static/immutable/chunks/139awul8dpdp1.js", + "/_next/static/immutable/chunks/2f_gapp7x_ylg.js", + "/_next/static/immutable/chunks/0-glk9ie20d0q.js", + "/_next/static/immutable/chunks/1m3seg9hzzubf.js", + "/_next/static/immutable/chunks/2cbl2pzqqepyd.js", + "/_next/static/immutable/chunks/37f0-8utq2vk2.js", + "/_next/static/immutable/chunks/0p81ard-8-fs8.js", + "/_next/static/immutable/chunks/1hvi0ounrpmqw.js", + "/_next/static/immutable/chunks/11jzb72s-pyc3.js", + "/_next/static/immutable/chunks/0x59c_aawi-km.js", + "/_next/static/immutable/chunks/0trf996h_vcs4.js", + "/_next/static/immutable/chunks/0mm6ixdsy345a.js", + "/_next/static/immutable/chunks/3b24ts7ad8nkt.js", + "/_next/static/immutable/chunks/0gn38pudkc1rz.js", + "/_next/static/immutable/chunks/0-djzliduqeg5.js", + "/_next/static/immutable/chunks/34hf6me06gsue.js", + "/_next/static/immutable/chunks/2xj398ddrr76i.js", + "https://clerk.clerk.com/npm/@clerk/clerk-js@6/dist/clerk.browser.js", + "/_next/static/immutable/chunks/0c0hxoamwjsbw.js", + "/_proxy/dub/script.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/11313383806/", + "/_next/static/immutable/chunks/2n5tpsigi-65e.js", + "/_next/static/immutable/chunks/05xwvypow5gwm.js", + "/_next/static/immutable/chunks/0-lfgadmdmmig.js", + "https://cdn.protect.clerk.com/ins_1lyWDZiobr600AKUeQDoSlrEmoM/c/1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea/bootstrap.js", + "/_next/static/immutable/chunks/2swngb-47ir9_.js", + "/_next/static/immutable/chunks/11rupfdd4qqh1.js", + "/_next/static/immutable/chunks/2v80s7wgwa-b6.js", + "/_vercel/speed-insights/script.js", + "/relay-G4fq/static/dead-clicks-autocapture.js", + "/relay-G4fq/static/surveys.js", + "/relay-G4fq/static/posthog-recorder.js", + "/relay-G4fq/array/phc_q5TPT5kitT5x2OFKOo7yB3bLWm1ChE24asf8wJGM8cq/config.js", + "/_next/static/immutable/chunks/1wpdu48xp8b3o.js", + "https://www.googletagmanager.com/gtag/js", + "/_next/static/immutable/media/GeistVariableVF_numbers.p.3we0i3od0iush.woff2", + "/_next/static/immutable/media/SuisseIntl_Bold-s.p.3apq79xsdhsa_.woff2", + "/_next/static/immutable/media/SuisseIntl_BoldItalic-s.p.26zpp78ejlsbh.woff2", + "/_next/static/immutable/media/SuisseIntl_Book-s.p.1tp558au52mp8.woff2", + "/_next/static/immutable/media/SuisseIntl_BookItalic-s.p.1qky57xzagphu.woff2", + "/_next/static/immutable/media/SuisseIntl_Medium-s.p.3034-r-4niicv.woff2", + "/_next/static/immutable/media/SuisseIntl_MediumItalic-s.p.3grtn8jczn3z6.woff2", + "/_next/static/immutable/media/SuisseIntl_Regular-s.p.0z_z2ccbdvksh.woff2", + "/_next/static/immutable/media/SuisseIntl_RegularItalic-s.p.3rfru8unvf3x7.woff2", + "/_next/static/immutable/media/SuisseIntl_SemiBold-s.p.3lstdh700wb75.woff2", + "/_next/static/immutable/media/SuisseIntl_SemiBoldItalic-s.p.3pdf515_t0wa_.woff2", + "/_next/static/immutable/media/circuit-lines@2xl.2ip7jpoupl_wt.webp", + "/_next/static/immutable/media/circuit-components@2xl.20_i4au-7bjdf.webp", + "https://clerk.clerk.com/npm/@clerk/ui@1/dist/ui.browser.js", + "inline:#signed-in-class", + "inline:#_R_", + "inline:#linkedin-insight", + "inline:#google-ads-gtag", + "inline:#google-ads-config", + "inline:#twitter-ads-pixel", + "inline:#reddit-pixel", + "https://clerk.com/_next/static/immutable/media/GeistVariableVF_numbers.p.3we0i3od0iush.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_Bold-s.p.3apq79xsdhsa_.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_BoldItalic-s.p.26zpp78ejlsbh.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_Book-s.p.1tp558au52mp8.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_Medium-s.p.3034-r-4niicv.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_BookItalic-s.p.1qky57xzagphu.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_MediumItalic-s.p.3grtn8jczn3z6.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_Regular-s.p.0z_z2ccbdvksh.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_RegularItalic-s.p.3rfru8unvf3x7.woff2", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_SemiBold-s.p.3lstdh700wb75.woff2", + "https://clerk.com/_next/static/immutable/chunks/3k2q7wnk7yab-.css", + "https://clerk.com/_next/static/immutable/media/SuisseIntl_SemiBoldItalic-s.p.3pdf515_t0wa_.woff2", + "https://clerk.com/_next/image", + "https://clerk.com/_next/static/immutable/chunks/2h7m2m1r6xan8.css", + "https://clerk.com/_next/static/immutable/chunks/30612oajislsm.css", + "https://clerk.com/_next/static/immutable/chunks/1wpdu48xp8b3o.js", + "https://clerk.com/_next/static/immutable/chunks/1pxdae-x5q7zk.js", + "https://clerk.com/_next/static/immutable/chunks/turbopack-21bhrvxzjgw97.js", + "https://clerk.com/_next/static/immutable/chunks/2223pijdy9gvt.js", + "https://clerk.com/_next/static/immutable/chunks/26i62-9f_9urb.js", + "https://clerk.com/_next/static/immutable/chunks/2s-0ov5w5umxi.js", + "https://clerk.com/_next/static/immutable/chunks/42q1c0eo7ava-.js", + "https://clerk.com/_next/static/immutable/chunks/1dox858mfkhjb.js", + "https://clerk.com/_next/static/immutable/chunks/32tlpfju4klky.js", + "https://clerk.com/_next/static/immutable/chunks/3-cxkdg85agqr.js", + "https://clerk.com/_next/static/immutable/chunks/2fb8chl1odje7.js", + "https://clerk.com/_next/static/immutable/chunks/1h0nztz8llza4.js", + "https://clerk.com/_next/static/immutable/chunks/3kr4_gxkxe2bd.js", + "https://clerk.com/_next/static/immutable/chunks/3g8c3v6zteg_1.js", + "https://clerk.com/_next/static/immutable/chunks/1sxv06xjm7mlf.js", + "https://clerk.com/_next/static/immutable/chunks/1hay8p1apyqrb.js", + "https://clerk.com/_next/static/immutable/chunks/0qs5p_g8fdmr9.js", + "https://clerk.com/_next/static/immutable/chunks/2f_gapp7x_ylg.js", + "https://clerk.com/_next/static/immutable/chunks/139awul8dpdp1.js", + "https://clerk.com/_next/static/immutable/chunks/0-glk9ie20d0q.js", + "https://clerk.com/_next/static/immutable/chunks/1m3seg9hzzubf.js", + "https://clerk.com/_next/static/immutable/chunks/2cbl2pzqqepyd.js", + "https://clerk.com/_next/static/immutable/chunks/0p81ard-8-fs8.js", + "https://clerk.com/_next/static/immutable/chunks/37f0-8utq2vk2.js", + "https://clerk.com/_next/static/immutable/chunks/1hvi0ounrpmqw.js", + "https://clerk.com/_next/static/immutable/chunks/0x59c_aawi-km.js", + "https://clerk.com/_next/static/immutable/chunks/0trf996h_vcs4.js", + "https://clerk.com/_next/static/immutable/chunks/11jzb72s-pyc3.js", + "https://clerk.com/_next/static/immutable/chunks/0mm6ixdsy345a.js", + "https://clerk.com/_next/static/immutable/chunks/0-djzliduqeg5.js", + "https://clerk.com/_next/static/immutable/chunks/0gn38pudkc1rz.js", + "https://clerk.com/_next/static/immutable/chunks/3b24ts7ad8nkt.js", + "https://clerk.com/_next/static/immutable/chunks/34hf6me06gsue.js", + "https://clerk.com/_next/static/immutable/chunks/2xj398ddrr76i.js", + "https://clerk.com/_next/static/immutable/media/circuit-lines@2xl.2ip7jpoupl_wt.webp", + "https://clerk.com/_next/static/immutable/media/circuit-components@2xl.20_i4au-7bjdf.webp", + "https://clerk.com/_next/static/immutable/media/soehne_mono_buch.044eo65kpyfgg.woff2", + "https://clerk.com/_next/static/immutable/media/soehne_mono_kraftig.0clpkt_cr3388.woff2", + "https://clerk.com/_next/static/immutable/media/browserbase.0_-f9ucuvzbqe.svg", + "https://clerk.com/_next/static/immutable/media/inngest.1n8fo1qbf4du4.svg", + "https://clerk.com/_next/static/immutable/media/braintrust.0n3uack0mbyxx.svg", + "https://clerk.com/_next/static/immutable/media/durable.37nux_gcm99y7.svg", + "https://clerk.com/_next/static/immutable/media/higgsfield.2fe2c4qm_65ub.svg", + "https://clerk.com/_next/static/immutable/media/consensus.320f8sv-s1is8.svg", + "https://clerk.com/_next/static/immutable/media/upstash.126s1cotmlzor.svg", + "https://clerk.com/_next/static/immutable/media/cartesia.07la3_14qzmuu.svg", + "https://clerk.com/_next/static/immutable/media/circuit-bento@2xq95.450fd6vagzoi3.webp", + "https://clerk.com/_next/static/immutable/media/glow-bento@q30r.2q4ub5g282n1u.avif", + "https://clerk.com/_next/static/immutable/media/83afe278b6a6bb3c-s.45535valc9rzk.woff2", + "https://clerk.com/v2/favicon.ico", + "https://clerk.clerk.com/v1/environment", + "https://clerk.clerk.com/v1/client", + "https://clerk.com/_proxy/dub/script.js", + "https://clerk.com/relay-G4fq/array/phc_q5TPT5kitT5x2OFKOo7yB3bLWm1ChE24asf8wJGM8cq/config.js", + "https://clerk.com/", + "https://clerk.com/pricing", + "https://clerk.com/blog/series-c", + "https://clerk.com/relay-G4fq/static/posthog-recorder.js", + "https://clerk.com/relay-G4fq/static/surveys.js", + "https://clerk.com/relay-G4fq/static/dead-clicks-autocapture.js", + "https://clerk.clerk.com/npm/@clerk/clerk-js@6.34.1/dist/321_clerk.browser_c4cc57_6.34.1.js", + "https://clerk.clerk.com/npm/@clerk/ui@1.36.0/dist/framework_ui_58d0c7_1.36.0.js", + "https://clerk.clerk.com/npm/@clerk/ui@1.36.0/dist/ui-common_ui_58d0c7_1.36.0.js", + "https://www.google.com/rmkt/collect/11313383806/", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://clerk.com/_next/static/immutable/chunks/2n5tpsigi-65e.js", + "https://clerk.com/_next/static/immutable/chunks/05xwvypow5gwm.js", + "https://clerk.com/_next/static/immutable/chunks/0-lfgadmdmmig.js", + "https://clerk.com/_next/static/immutable/chunks/2swngb-47ir9_.js", + "https://clerk.com/_next/static/immutable/chunks/11rupfdd4qqh1.js", + "https://clerk.com/_next/static/immutable/chunks/2v80s7wgwa-b6.js", + "https://clerk.com/_vercel/speed-insights/script.js", + "https://clerk.clerk.com/npm/@clerk/ui@1.36.0/dist/vendors_ui_58d0c7_1.36.0.js", + "https://clerk.clerk.com/npm/@clerk/ui@1.36.0/dist/subscriptionDetails_ui_58d0c7_1.36.0.js", + "https://pixel-config.reddit.com/pixels/t2_fnpn559s/config", + "https://alb.reddit.com/rp", + "https://t.co/1/i/adsct", + "https://analytics.twitter.com/1/i/adsct", + "https://www.google.com/pagead/1p-user-list/11313383806/", + "https://px.ads.linkedin.com/collect", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-l.client.protect.clerk.com/ins_1lyWDZiobr600AKUeQDoSlrEmoM/loader.js", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com/ins_1lyWDZiobr600AKUeQDoSlrEmoM/probe", + "https://px.ads.linkedin.com/wa/", + "https://clerk-telemetry.com/v1/logs", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com:8443/ins_1lyWDZiobr600AKUeQDoSlrEmoM/probe", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com:18443/ins_1lyWDZiobr600AKUeQDoSlrEmoM/probe", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com:2082/ins_1lyWDZiobr600AKUeQDoSlrEmoM/probe", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com:992/ins_1lyWDZiobr600AKUeQDoSlrEmoM/probe", + "https://1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea-p.client.protect.clerk.com/ins_1lyWDZiobr600AKUeQDoSlrEmoM/c/1-m5ntzdayr2ium22jjjsu33vkim-gbye46rid6gb7alna4vzte6wea/probe", + "https://clerk.com/_next/static/immutable/media/david-ai.31l1lyd6j3iqg.svg", + "https://clerk.com/_next/static/immutable/media/open-router.2pgv3onxrgmsf.svg", + "https://clerk.com/_next/static/immutable/media/samaya.11qhqt1xqayr8.svg" + ], + "stylesheets": [ + "/_next/static/immutable/chunks/3k2q7wnk7yab-.css", + "/_next/static/immutable/chunks/2h7m2m1r6xan8.css", + "/_next/static/immutable/chunks/30612oajislsm.css" + ], + "cookies": [ + "visitor-id", + "__signed_in", + "consent-required", + "__client_uat", + "__client_uat_DvIHvy3E", + "_gcl_au", + "ph_phc_q5TPT5kitT5x2OFKOo7yB3bLWm1ChE24asf8wJGM8cq_posthog", + "_rdt_uuid", + "_twsid", + "_twpid" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\nb:I[563491,[\\\"/_next/static/immutable/chunks/32tlpfju4klky.js\\\",\\\"/_next/static/immuta", + "self.__next_f.push([1,\"f:[\\\"$\\\",\\\"$L46\\\",null,{\\\"appearance\\\":{\\\"elements\\\":{\\\"formFieldInput\\\":\\\"outline-none\\\",\\\"socialButtonsIconB", + "self.__next_f.push([1,\"unks/42q1c0eo7ava-.js\\\",\\\"/_next/static/immutable/chunks/1dox858mfkhjb.js\\\",\\\"/_next/static/immutable/chunks/3", + "self.__next_f.push([1,\"31:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"", + "self.__next_f.push([1,\"a6:I[145937,[\\\"/_next/static/immutable/chunks/32tlpfju4klky.js\\\",\\\"/_next/static/immutable/chunks/42q1c0eo7ava" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "Clerk": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "gtag": { + "present": true + }, + "next": { + "present": true, + "version": "16.3.6" + }, + "posthog": { + "present": true + } + } +} diff --git a/tests/corpus/dev.to.json b/tests/corpus/dev.to.json new file mode 100644 index 0000000..2d1c59a --- /dev/null +++ b/tests/corpus/dev.to.json @@ -0,0 +1,87 @@ +{ + "host": "dev.to", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": {}, + "snapshot": [ + "google-analytics:high", + "tailwind:low" + ], + "signals": { + "url": "https://dev.to/", + "scripts": [ + "https://assets.dev.to/assets/base-2e294c52c5fe6b771fda1a5f38d2f10756d0b4d8359c6f9825fe47df0f54e6ae.js", + "https://assets.dev.to/assets/application-9ee88e198a0d2b64238c8557b5225d20e2c18ff5b877f1159ee5a31f6e3174f9.js", + "https://assets.dev.to/assets/baseInitializers-624554190e72cf52de9498fd225c2e71ab334dfc4919535dcc5a26a3a0ae2359.js", + "https://assets.dev.to/assets/baseTracking-cb478131fb1b41bc25e80ebcee996318777e081c9aa87367fabc1c118461a2d3.js", + "https://assets.dev.to/assets/followButtons-e3595664847e9f43945a9b8a0445b32cda9a149f1f169f78b8fcc7714ccab45a.js", + "https://assets.dev.to/assets/eventSignupButtons-a2b5da712a1b8eeb0eda4d63fafc54973138a70b88503a2163806c27fc1e4c39.js", + "//www.googletagmanager.com/gtag/js", + "https://assets.dev.to/assets/homePage-c957c993f1b736b2077377b9285899ccda1bccc41af5c7fe3ea9ba210181a80e.js", + "https://assets.dev.to/assets/billboard-1b75959755e3f87ef58c28efef9eab9853df3b84cf27a937749b2c3449fd450d.js", + "https://assets.dev.to/assets/homePageFeedShortcuts-f7364bc2d6cb139c03e7fe80e32782ba5af34857d2b308e3caa8d902e579a3af.js", + "https://assets.dev.to/assets/feedPreviewCards-8d16b0b656456a28c0a290f756cf6e21e19833111c4796f48c631bfea8323d51.js", + "https://assets.dev.to/assets/storiesList-b9c50cbd898a3a64258a3a49db1c531651b0a4a11937be35ed4651111802b5b5.js", + "https://assets.dev.to/assets/heroBannerClose-08daef9d8f6109d73b3876fb088e26e5a46a047f93d787c38871fdbfbfc56e95.js", + "https://assets.dev.to/assets/localizeArticleDates-ddf0f7415ce8497325dd1b64bc1e022762d4d14aec7f538e6988744eeaa9a501.js", + "https://assets.dev.to/assets/feedEvents-d39d56b2a9cd948da5eab41780a494c61da2d5674fd5d8115179eda001632f45.js", + "https://assets.dev.to/assets/signupModalShortcuts-0b25469b985100a01e94cbd7fccaf7f0a4d776e129aac65c766aa32cb28ab29a.js", + "https://assets.dev.to/assets/minimal-3a438d8d138f95f478f01cbe53363cacf36bc6c47172aeb2e6c9172eebe29aa6.css", + "https://assets.dev.to/assets/views-af61a7298c887e410bbc06ac7f28a5c9bcda7f85c0fa6a21ccac246c45aa2540.css", + "https://assets.dev.to/assets/crayons-11de7dc631b0aee5df5d618a8dff12f00c997e4f4e3e4ad66a1efb1041affb47.css", + "https://media2.dev.to/dynamic/image/quality=100/https://dev-to-uploads.s3.amazonaws.com/uploads/logos/resized_logo_UQww2soKuUsjaOGNB38o.png", + "https://assets.dev.to/assets/community-leader-icon-b72c9e74eff54916e5c46c962f47ba40c9f611a71f8b157511f9613f69c0001b.svg", + "https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg", + "https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg", + "https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg", + "https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png", + "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzt86aenv4fee8rngprcq.jpeg", + "https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg", + "https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg", + "https://www.youtube.com/embed/JaHALyGXO3s", + "https://media2.dev.to/dynamic/image/width=775%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ok7bv74tv9wnzs8xc6k.png", + "https://media2.dev.to/dynamic/image/width=775%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg", + "https://media2.dev.to/dynamic/image/width=775%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1875101%2Ffed41ffa-3228-4a95-8381-2562d87d01ba.jpg", + "https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1467610%2F3e4ce925-fffd-4643-9aae-8ee77cf01828.png", + "https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png", + "https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png", + "https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126369%2Fe2b7c44b-92cf-47ae-a628-32599bd06777.webp", + "https://media2.dev.to/dynamic/image/width=880%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ok7bv74tv9wnzs8xc6k.png", + "https://media2.dev.to/dynamic/image/width=880%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F667dhbdyczv0n9ta90ml.png", + "https://dev.to/async_info/base_data", + "https://dev.to/bmar11/sidebar_left", + "https://dev.to/bmar11/sidebar_left_2", + "https://forem.com/auth_pass/iframe", + "https://dev.to/ahoy/visits", + "https://www.googletagmanager.com/gtag/js", + "https://media2.dev.to/dynamic/image/width=350%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgwfh7hesdncf0pv57j1.png", + "https://www.google-analytics.com/g/collect", + "https://dev.to/bb_tabulations", + "https://media2.dev.to/dynamic/image/width=32,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" + ], + "stylesheets": [ + "https://assets.dev.to/assets/minimal-3a438d8d138f95f478f01cbe53363cacf36bc6c47172aeb2e6c9172eebe29aa6.css", + "https://assets.dev.to/assets/views-af61a7298c887e410bbc06ac7f28a5c9bcda7f85c0fa6a21ccac246c45aa2540.css", + "https://assets.dev.to/assets/crayons-11de7dc631b0aee5df5d618a8dff12f00c997e4f4e3e4ad66a1efb1041affb47.css" + ], + "cookies": [ + "ahoy_visit", + "ahoy_visitor", + "_ga_TYEM8Y3JN3", + "_ga" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "tailwind-utilities" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "gtag": { + "present": true + } + } +} diff --git a/tests/corpus/discord.com.json b/tests/corpus/discord.com.json new file mode 100644 index 0000000..ce20c48 --- /dev/null +++ b/tests/corpus/discord.com.json @@ -0,0 +1,173 @@ +{ + "host": "discord.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "webflow" + ] + }, + "snapshot": [ + "google-analytics:high", + "jquery:high@3.5.1", + "react:high", + "webflow:high", + "webpack:high" + ], + "signals": { + "url": "https://discord.com/", + "scripts": [ + "https://www.youtube.com/s/player/7460dd14/www-widgetapi.vflset/www-widgetapi.js", + "https://www.googletagmanager.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js", + "https://cdn.localizeapi.com/localize.js", + "https://discord.com/webflow-scripts/newLocalization.js", + "https://discord.com/webflow-scripts/head.js", + "/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/styles.js", + "//discord.com/assets/oneTrust/v8/scripttemplates/202501.2.0/otBannerSdk.js", + "https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/js/discord-2022.schunk.36b8fb49256177c8.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/js/discord-2022.schunk.c42549641b7d4501.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/js/discord-2022.schunk.c5f2c9df08bc6885.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/js/discord-2022.schunk.1480913c3571b049.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/js/discord-2022.5de51ee7.da976689e4a0307a.js", + "https://discord.com/webflow-scripts/bodyEnd092026.js", + "/w/assets/latest/loginOrDownload.js", + "//discord.com/assets/oneTrust/v8/scripttemplates/otSDKStub.js", + "/assets/oneTrust/v8/consent/04da1d72-0626-4fff-b3c6-150c719cc115/OtAutoBlock.js", + "/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/index-consolidated.js", + "https://discord.com/webflow-scripts/homepageRefreshLatest.js", + "https://hubspotonwebflow.com/assets/js/form-124.js", + "https://www.youtube.com/iframe_api", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/673df7fbe95a8e90a7571751_D-bg.png", + "inline:#www-widgetapi-script", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/css/discord-2022.shared.a4cb4371b.min.css", + "https://discord.com/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/styles.js", + "https://discord.com/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/styles.css", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6a1fdab6dacb93b00f5ec24d_Discord_Objects_Newspaper.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678a4dee303240abdd278abf_Egg.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678a4e92695af76b1f7487a3_Set%201%2015.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678a4b31695af76b1f713594_Discord_Nelly_Pose2_Flying%201.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678a4c12dbf6be5d792aa920_Clyde%20Cube.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678a4aae3ee9f2e87506de82_Clyde%20(1).webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/683dd52d4c9254eada79dd11_Discord%20Boy.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/683e0f99bf66ed8e1d55ff2c_Leaning%20Girl%2003.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/662630272724e61320fb7ee2_WUMPUS.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6841ca4c5468891aedebb224_homepage-hero-mobile-858x803.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6641da60031c61b5df8ff50b_Clyde-Shadow.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66263062e1fb458b0803dbe6_WUMPUS-pl.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6641da5484ffb72b9ad73f01_Clyde.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6630bc0fe938efc69a900a3a_Art.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6620d9036aad92a48a009ddb_art-product-featured%20(1).svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/675005dc03927e9683fcaaee_Footer-p-1600.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6729dc6215aff5ed59997842_Wumpus%C2%A0%E2%80%94%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F-p-500.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664754815450cb39bca27b05_Smoke.gif", + "https://discord.com/w/assets/latest/loginOrDownload.js", + "https://discord.com/assets/oneTrust/v8/scripttemplates/otSDKStub.js", + "https://discord.com/assets/oneTrust/v8/consent/04da1d72-0626-4fff-b3c6-150c719cc115/OtAutoBlock.js", + "https://discord.com/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/index-consolidated.js", + "data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBiUAAAC8AAAAYGNtYXDpP+a4AAABHAAAAFxnYXNwAAAAEAAAAXgAAAAIZ2x5ZmhS2XEAAAGAAAADHGhlYWQTFw3HAAAEnAAAADZoaGVhCXYFgQAABNQAAAAkaG10eCe4A1oAAAT4AAAAMGxvY2EDtALGAAAFKAAAABptYXhwABAAPgAABUQAAAAgbmFtZSoCsMsAAAVkAAABznBvc3QAAwAAAAAHNAAAACAAAwP4AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAQAAAAAwACAACAAQAAQAg5gPpA//9//8AAAAAACDmAOkA//3//wAB/+MaBBcIAAMAAQAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEBIAAAAyADgAAFAAAJAQcJARcDIP5AQAGA/oBAAcABwED+gP6AQAABAOAAAALgA4AABQAAEwEXCQEH4AHAQP6AAYBAAcABwED+gP6AQAAAAwDAAOADQALAAA8AHwAvAAABISIGHQEUFjMhMjY9ATQmByEiBh0BFBYzITI2PQE0JgchIgYdARQWMyEyNj0BNCYDIP3ADRMTDQJADRMTDf3ADRMTDQJADRMTDf3ADRMTDQJADRMTAsATDSANExMNIA0TwBMNIA0TEw0gDRPAEw0gDRMTDSANEwAAAAABAJ0AtAOBApUABQAACQIHCQEDJP7r/upcAXEBcgKU/usBFVz+fAGEAAAAAAL//f+9BAMDwwAEAAkAABcBJwEXAwE3AQdpA5ps/GZsbAOabPxmbEMDmmz8ZmwDmvxmbAOabAAAAgAA/8AEAAPAAB0AOwAABSInLgEnJjU0Nz4BNzYzMTIXHgEXFhUUBw4BBwYjNTI3PgE3NjU0Jy4BJyYjMSIHDgEHBhUUFx4BFxYzAgBqXV6LKCgoKIteXWpqXV6LKCgoKIteXWpVSktvICEhIG9LSlVVSktvICEhIG9LSlVAKCiLXl1qal1eiygoKCiLXl1qal1eiygoZiEgb0tKVVVKS28gISEgb0tKVVVKS28gIQABAAABwAIAA8AAEgAAEzQ3PgE3NjMxFSIHDgEHBhUxIwAoKIteXWpVSktvICFmAcBqXV6LKChmISBvS0pVAAAAAgAA/8AFtgPAADIAOgAAARYXHgEXFhUUBw4BBwYHIxUhIicuAScmNTQ3PgE3NjMxOAExNDc+ATc2MzIXHgEXFhcVATMJATMVMzUEjD83NlAXFxYXTjU1PQL8kz01Nk8XFxcXTzY1PSIjd1BQWlJJSXInJw3+mdv+2/7c25MCUQYcHFg5OUA/ODlXHBwIAhcXTzY1PTw1Nk8XF1tQUHcjIhwcYUNDTgL+3QFt/pOTkwABAAAAAQAAmM7nP18PPPUACwQAAAAAANciZKUAAAAA1yJkpf/9/70FtgPDAAAACAACAAAAAAAAAAEAAAPA/8AAAAW3//3//QW2AAEAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAgAAAAQAASAEAADgBAAAwAQAAJ0EAP/9BAAAAAQAAAAFtwAAAAAAAAAKABQAHgAyAEYAjACiAL4BFgE2AY4AAAABAAAADAA8AAMAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADQAAAAEAAAAAAAIABwCWAAEAAAAAAAMADQBIAAEAAAAAAAQADQCrAAEAAAAAAAUACwAnAAEAAAAAAAYADQBvAAEAAAA", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664c33e0f20d14f69f999b5b_Texture%20Headline.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67289e5f46184d64b999a971_Set%201%2010.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6728a56d43ac167d70bfb953_Set%201%2014.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/68407334ccf9aeca71903bab_home-new.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212b9e15d13d199dd448_Texture%202.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6787ce4640564a6c2690d6de_F-bg.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6787b62a9742f59453ba8919_Discord_Websote_Refresh_Emojis2_EN-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212db01d13abd533fda6_Texture%203.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678e5155e052593581824839_Featur-card.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763b611120b46189e164b4a_Discord_Website_Refresh_EN-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212b3ca3cdd172c0e940_Texture%204.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678e52a02c68a8a27df94206_F-card-3.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F683a317f73a44ea577535c09_Homepage_Hop-In_EN-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6729ca637f6587d3dc83f73e_line%20(1).png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212d639f390c3db3284a_Texture%205.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678e53404279def12d4ab266_FEAT-C.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F683a3195524ad05044d126c9_Homepage_AroundToChill_EN-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212d639f390c3db32888_Texture%206.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678e50260740f165406854fb_Feature-card.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763b9f56c9bf69e5e914cd5_Discord_Refresh_Activities_EN-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664f212db4cf28be9d091295_Texture%207.webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/678e4e17419ade42a75e98d9_F-c.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763ba683086419cf7bfb7fb_Discord_Refresh_Platforms-poster-00001.jpg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67b85eb3e1054bdc41ce787e_icon%20(1).svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/69baa11f2f5f9839ba1ced1c_Footer-image.png", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67110a452ee74d65f90c1dc0_ABCGintoDiscord-Medium.woff2", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67110b10efb84547ce5e8ef7_ABCGintoDiscordNord-Bold.woff2", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67110a451d677abf8340c6da_ABCGintoDiscord-Regular.woff2", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/652736292cbf8363b43d077a_ggsans-Normal.woff2", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/65e5baf6b5e4414d366b9dd7_ABCGintoNormalVariable.ttf", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66e90ab9506850e8a5dd48e3_Discrod_MainLogo.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67ed8194f41d7d8eade32c90_Logo.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67ece93be2524af5cf14dc1c_Logo-black-bg.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66349b3378e1057faaf58ac5_Property%201%3Dstar_m.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67d00cf7266d2c75571aebde_Example.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66349b219b15d5875c1e47bf_Property%201%3Dstar_lg.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66349c8a486afee7b4b834b6_Property%201%3Dstar_sm.svg", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6620ec7544fa3849c3cb27fc_party_wumpus.gif", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/6729d372eed9e3f4c2da82dc_Egg%20(1).webp", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6787b62a9742f59453ba8919_Discord_Websote_Refresh_Emojis2_EN-transcode.mp4", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763b611120b46189e164b4a_Discord_Website_Refresh_EN-transcode.mp4", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F683a317f73a44ea577535c09_Homepage_Hop-In_EN-transcode.mp4", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F683a3195524ad05044d126c9_Homepage_AroundToChill_EN-transcode.mp4", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763b9f56c9bf69e5e914cd5_Discord_Refresh_Activities_EN-transcode.mp4", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2%2F6763ba683086419cf7bfb7fb_Discord_Refresh_Platforms-transcode.mp4", + "https://cdn.discordapp.com/assets/homepage/1.m4a", + "https://cdn.discordapp.com/assets/homepage/2.m4a", + "https://cdn.discordapp.com/assets/homepage/3.m4a", + "https://cdn.discordapp.com/assets/homepage/4.m4a", + "https://cdn.discordapp.com/assets/homepage/5.m4a", + "https://cdn.discordapp.com/assets/homepage/6.m4a", + "https://discord.com/assets/oneTrust/v8/consent/04da1d72-0626-4fff-b3c6-150c719cc115/04da1d72-0626-4fff-b3c6-150c719cc115.json", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://discord.com/api/v9/experiments", + "https://discord.com/api/v9/auth/location-metadata", + "https://discord.com/api/v9/users/@me", + "https://discord.com/w/assets/latest/544.js", + "https://discord.com/w/assets/latest/52.js", + "https://discord.com/assets/oneTrust/v8/scripttemplates/202501.2.0/otBannerSdk.js", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/664caa806ebb0ab60e40021e_eyes.lottie", + "https://discord.com/api/v9/science", + "https://discord.com/api/v9/track/ott", + "https://discord.com/api/v9/apex/experiments", + "https://discord.com/assets/oneTrust/v8/consent/04da1d72-0626-4fff-b3c6-150c719cc115/019f1ec5-08ff-77c5-9107-108772038ecc/en.json", + "https://discord.com/assets/oneTrust/v8/scripttemplates/202501.2.0/assets/otCommonStyles.css", + "https://hubspotonwebflow.com/assets/js/blockedDomains.json", + "https://www.google.com/ccm/collect", + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/62fddf0fde45a8baedcc7ee5_847541504914fd33810e70a0ea73177e%20(2)-1.png", + "https://www.google-analytics.com/g/collect" + ], + "stylesheets": [ + "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/css/discord-2022.shared.a4cb4371b.min.css", + "/w/assets/3ae7a3b831a56041cc902e92f73907e4e121f31d/styles.css" + ], + "cookies": [ + "locale", + "_gcl_au", + "OptanonConsent", + "_ga_Q149DFWHT7", + "_ga" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "html[data-wf-site]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__reactListening": { + "present": true + }, + "jQuery": { + "present": true, + "version": "3.5.1" + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/en.wikipedia.org.json b/tests/corpus/en.wikipedia.org.json new file mode 100644 index 0000000..abffef0 --- /dev/null +++ b/tests/corpus/en.wikipedia.org.json @@ -0,0 +1,52 @@ +{ + "host": "en.wikipedia.org", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "jquery" + ] + }, + "snapshot": [ + "jquery:high@3.7.1" + ], + "signals": { + "url": "https://en.wikipedia.org/wiki/Main_Page", + "scripts": [ + "/w/load.php", + "https://en.wikipedia.org/w/load.php", + "https://en.wikipedia.org/static/images/mobile/copyright/wikipedia-wordmark-en-25.svg", + "https://en.wikipedia.org/static/images/icons/enwiki-25.svg", + "https://en.wikipedia.org/static/images/mobile/copyright/wikipedia-tagline-en-25.svg", + "https://thumb.wikimedia.org/wikipedia/commons/thumb/0/07/Uyen_Ninh%2C_2023_%28cropped%29.jpg/250px-Uyen_Ninh%2C_2023_%28cropped%29.jpg", + "https://thumb.wikimedia.org/wikipedia/commons/thumb/b/bb/Leopardus_tilcayo_%285x3_cropped%29.jpg/250px-Leopardus_tilcayo_%285x3_cropped%29.jpg", + "https://thumb.wikimedia.org/wikipedia/commons/thumb/2/2b/Yves_Rossi_mg_4616.jpg/250px-Yves_Rossi_mg_4616.jpg", + "https://thumb.wikimedia.org/wikipedia/commons/thumb/c/ce/FRE-OCE-10-French_Oceania-50_centimes_%281943%29.jpg/500px-FRE-OCE-10-French_Oceania-50_centimes_%281943%29.jpg", + "https://en.wikipedia.org/ins-502b/v2/events", + "https://en.wikipedia.org/wiki/Special:CentralAutoLogin/start", + "https://en.wikipedia.org/static/favicon/wikipedia.ico" + ], + "stylesheets": [ + "/w/load.php" + ], + "cookies": [ + "GeoIP", + "NetworkProbeLimit", + "enwikimwuser-sessionId" + ], + "metas": [ + "generator=MediaWiki 1.47.0-wmf.21" + ], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "jQuery": { + "present": true, + "version": "3.7.1" + } + } +} diff --git a/tests/corpus/getbootstrap.com.json b/tests/corpus/getbootstrap.com.json new file mode 100644 index 0000000..dea9eea --- /dev/null +++ b/tests/corpus/getbootstrap.com.json @@ -0,0 +1,74 @@ +{ + "host": "getbootstrap.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "bootstrap", + "astro" + ], + "mustNotSolid": [ + "tailwind" + ] + }, + "snapshot": [ + "astro:high", + "bootstrap:high", + "fathom:high", + "tailwind:low" + ], + "signals": { + "url": "https://getbootstrap.com/", + "scripts": [ + "/docs/5.3/assets/js/color-modes.js", + "https://cdn.usefathom.com/script.js", + "/docs/5.3/assets/Code.astro_astro_type_script_index_0_lang.jwvOqc1M.js", + "https://cdn.carbonads.com/carbon.js", + "/docs/5.3/dist/js/bootstrap.bundle.min.js", + "/docs/5.3/assets/Scripts.astro_astro_type_script_index_0_lang.B072HICR.js", + "inline:#_carbonads_js", + "https://getbootstrap.com/docs/5.3/assets/js/color-modes.js", + "https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css", + "https://getbootstrap.com/docs/5.3/assets/_slug_.CJzlHdSW.css", + "https://getbootstrap.com/docs/5.3/assets/brand/bootstrap-logo-shadow.png", + "https://getbootstrap.com/docs/5.3/assets/Code.astro_astro_type_script_index_0_lang.jwvOqc1M.js", + "https://getbootstrap.com/docs/5.3/dist/js/bootstrap.bundle.min.js", + "https://getbootstrap.com/docs/5.3/assets/Scripts.astro_astro_type_script_index_0_lang.B072HICR.js", + "https://getbootstrap.com/docs/5.3/assets/img/favicons/manifest.json", + "https://getbootstrap.com/docs/5.3/assets/img/webpack.svg", + "https://getbootstrap.com/docs/5.3/assets/img/vite.svg", + "https://getbootstrap.com/docs/5.3/assets/img/parcel.png", + "https://cdn.usefathom.com/", + "https://getbootstrap.com/docs/5.3/assets/img/favicons/favicon.ico", + "https://getbootstrap.com/docs/5.3/assets/img/favicons/android-chrome-192x192.png", + "https://srv.carbonads.net/ads/CKYIKKJL.json", + "https://srv.carbonads.net/static/30242/400c8e2093e72466a93a26b1de86feabbcd1a9e3", + "https://srv.carbonads.net/static/30242/a719f75f8b6a44161528117f997a5d75d3ea8145", + "https://ad.doubleclick.net/ddm/trackimp/N5295.3091281BUYSELLADS/B34721851.453481133;dc_trk_aid=650200766;dc_trk_cid=246706990;ord=179041306;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;gdpr=$;gdpr_consent=$;ltd=;dc_tdv=1" + ], + "stylesheets": [ + "/docs/5.3/dist/css/bootstrap.min.css", + "/docs/5.3/assets/_slug_.CJzlHdSW.css" + ], + "cookies": [], + "metas": [ + "generator=Astro v5.13.2" + ], + "inlineSamples": [], + "domFlags": [ + ".btn-primary", + "tailwind-utilities" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "bootstrap": { + "present": true + }, + "fathom": { + "present": true + } + } +} diff --git a/tests/corpus/github.com.json b/tests/corpus/github.com.json new file mode 100644 index 0000000..9428819 --- /dev/null +++ b/tests/corpus/github.com.json @@ -0,0 +1,230 @@ +{ + "host": "github.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react-router" + ] + }, + "snapshot": [ + "import-map:low", + "lit:high@1.1.2", + "react-router:high@8.3.0", + "react:high" + ], + "signals": { + "url": "https://github.com/", + "scripts": [ + "https://github.githubassets.com/assets/high-contrast-cookie-e3d808ee18eb9784.js", + "https://github.githubassets.com/assets/environment-a3b33b022e640cb5.js", + "https://github.githubassets.com/assets/github-elements-f3d3090f1f0c97b2.js", + "https://github.githubassets.com/assets/element-registry-8f51d0f3df67da74.js", + "https://github.githubassets.com/assets/behaviors-e4d23ae3a97e8e17.js", + "https://github.githubassets.com/assets/marketing-essentials-f23a4f4191adebf5.js", + "https://github.githubassets.com/assets/landing-pages-0bd097c017a32604.js", + "https://github.githubassets.com/assets/global-banner-disable-5554a5e94272b68a.js", + "https://github.githubassets.com/assets/react-e27d1b3e03961e68.js", + "https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js", + "https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js", + "https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js", + "https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js", + "https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js", + "https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js", + "https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js", + "https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-7a868ff47c93bd97.woff2", + "https://github.githubassets.com/assets/wp-runtime-e1f5bc7239a5e9d7.js", + "https://github.githubassets.com/assets/app-foundation-74e9766bd696d26a.js", + "https://github.githubassets.com/assets/app-runtime-4be01a352ea0cb93.js", + "https://github.githubassets.com/assets/fetch-utilities-9a5c31efd5313aa8.js", + "https://github.githubassets.com/assets/ser-cd1b421ad0ad7ed5.js", + "https://github.githubassets.com/assets/catalyst-86a8f5de995615f8.js", + "https://github.githubassets.com/assets/selector-observer-e88088f989b27670.js", + "https://github.githubassets.com/assets/relative-time-element-7cdf4e0db98b997c.js", + "https://github.githubassets.com/assets/by-6b3c07383371bf58.js", + "https://github.githubassets.com/assets/ja9-36f036c13c2e3a4c.js", + "https://github.githubassets.com/assets/kw-866fd9513ae95106.js", + "https://github.githubassets.com/assets/r1-b075aab3204f32f9.js", + "https://github.githubassets.com/assets/jz5-7c5d1669717041f8.js", + "https://github.githubassets.com/assets/hj-5126390ff433704d.js", + "https://github.githubassets.com/assets/j05-1b324859b9512e2d.js", + "https://github.githubassets.com/assets/runtime-helpers-2b437fe146e9028f.js", + "https://github.githubassets.com/assets/aria-live-76b18916d0c8ec4d.js", + "https://github.githubassets.com/assets/hotkey-5109c77d7ac61078.js", + "https://github.githubassets.com/assets/react-core-edd2738d37eff336.js", + "https://github.githubassets.com/assets/04-b4570e9cc17d8b62.js", + "https://github.githubassets.com/assets/ur-024971cb63acad59.js", + "https://github.githubassets.com/assets/4t-364e19c63d726e9a.js", + "https://github.githubassets.com/assets/6ny-c969fbae697a356f.js", + "https://github.githubassets.com/assets/yhq-3a209035a30b1a09.js", + "https://github.githubassets.com/assets/z1v-da5b33b877bfa358.js", + "https://github.githubassets.com/assets/wo-f3e3b96584d99034.js", + "https://github.githubassets.com/assets/9y-450e92679e273d9f.js", + "https://github.githubassets.com/assets/j0-41a4cf04cbd99503.js", + "https://github.githubassets.com/assets/0p-81491ed0d9d666e2.js", + "https://github.githubassets.com/assets/pc-7642f2ff507e6130.js", + "https://github.githubassets.com/assets/primer-react-3ca70c6e707ba409.js", + "https://github.githubassets.com/assets/ncx-9a860680a5f230b9.js", + "https://github.githubassets.com/assets/t7l-bf6f21d7e7a43c35.js", + "https://github.githubassets.com/assets/4u-27f74cfc703e1977.js", + "https://github.githubassets.com/assets/0n-ecadb2ffe6b01ba2.js", + "https://github.githubassets.com/assets/ns-65bc1e8fea42ae55.js", + "https://github.githubassets.com/assets/sa-6185d140ab8590ab.js", + "https://github.githubassets.com/assets/2l-4955592c2215078b.js", + "https://github.githubassets.com/assets/i2-e878ead70a26ebb7.js", + "https://github.githubassets.com/assets/fz5-23f28c0f388769c9.js", + "https://github.githubassets.com/assets/vy-087f34169ed42405.js", + "https://github.githubassets.com/assets/a3-8832097e3f5df400.js", + "https://github.githubassets.com/assets/t1r9-c414832b72b4ceee.js", + "https://github.githubassets.com/assets/hlz-6eb5c11f1ed82fad.js", + "https://github.githubassets.com/assets/d8-b4dcfc4e3fec2aab.js", + "https://github.githubassets.com/assets/b3-19b312e45d4aff36.js", + "https://github.githubassets.com/assets/ks-6a93a7c5885287ef.js", + "https://github.githubassets.com/assets/rx-e0752c62d87c4b17.js", + "https://github.githubassets.com/assets/a8a-53dd72f8b57ded1a.js", + "https://github.githubassets.com/assets/gzu-a1c918f049c6302d.js", + "https://github.githubassets.com/assets/dgq-dd5294e5dfa63e98.js", + "https://github.githubassets.com/assets/js0-1b530647d576646a.js", + "https://github.githubassets.com/assets/3d-82c347d20a13fb90.js", + "https://github.githubassets.com/assets/jc-b367d1d4457b33fc.js", + "https://github.githubassets.com/assets/amz-d96e3e9a7e07a745.js", + "https://github.githubassets.com/assets/xda-8b0da11c885d8d42.js", + "https://github.githubassets.com/assets/64w-40b37c0aa800a9e1.js", + "https://github.githubassets.com/assets/l7j-2ddd8b435dadae28.js", + "https://github.githubassets.com/assets/bi0-a78ba744687848c2.js", + "https://github.githubassets.com/assets/keyboard-shortcuts-dialog-4c0a40c25d058e31.js", + "https://github.githubassets.com/assets/con-f11d003300c0c058.js", + "https://github.githubassets.com/assets/marketing-global-banner-aa7da550c1dba320.js", + "https://github.githubassets.com/assets/pw-4f91498888595802.js", + "https://github.githubassets.com/assets/app-install-banner-partial-798f1f64bc753f4c.js", + "https://github.githubassets.com/assets/lht-dedd9949bed91081.js", + "https://github.githubassets.com/assets/p1-76a75a6081059b19.js", + "https://github.githubassets.com/assets/tua-18c20c09a9dc80b9.js", + "https://github.githubassets.com/assets/t1-1b7e0da923b8dbe5.js", + "https://github.githubassets.com/assets/marketing-header-2b951d9eb49940c2.js", + "https://github.githubassets.com/assets/5t-412e47c3aaafa647.js", + "https://github.githubassets.com/assets/marketing-footer-857b39b91719807a.js", + "inline:#client-env", + "https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css", + "https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css", + "https://github.githubassets.com/assets/dark-79ad2ace604703b3.css", + "https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css", + "https://github.githubassets.com/assets/primer-primitives-ed9ca172356fd545.css", + "https://github.githubassets.com/assets/global-54ba76e934a49d7c.css", + "https://github.githubassets.com/assets/primer-1d2c7f7b52a6068b.css", + "https://github.githubassets.com/assets/github-456bd5deb85c7ecd.css", + "https://github.githubassets.com/assets/marketing-c6c574a5b2679474.css", + "https://github.githubassets.com/assets/home-4589777a4968936a.css", + "https://github.githubassets.com/assets/app-runtime.19d34abf60f22685.module.css", + "https://github.githubassets.com/assets/react-core.83cecac4ceaa4904.module.css", + "https://github.githubassets.com/assets/landing-pages.cb79c6c7ee35b215.module.css", + "https://github.githubassets.com/assets/primer-react-css.76a197f9dce25e3c.module.css", + "https://github.githubassets.com/assets/primer-react-brand-css.6a01c236ff527e7e.module.css", + "https://github.githubassets.com/assets/keyboard-shortcuts-dialog.595c7e0164e20af0.module.css", + "https://github.githubassets.com/assets/marketing-global-banner.872f58d99e8047b4.module.css", + "https://github.githubassets.com/assets/app-install-banner-partial.00824cdfe766bf6a.module.css", + "https://github.githubassets.com/assets/t1.2c9e83c78bbeb6bd.module.css", + "https://github.githubassets.com/assets/marketing-footer.6545177e5ef8524d.module.css", + "https://github.com/manifest.json", + "https://github.githubassets.com/assets/MonaSansMonoVF-wght-da74d51ce1316829.woff2", + "https://github.githubassets.com/assets/xg-6382ef33ae456242.js", + "https://github.githubassets.com/assets/chunk-3m-7b6147c07cf4e097.js", + "https://github.githubassets.com/assets/chunk-lazy-element-select-panel-c1e7af998a1d00c5.js", + "https://github.githubassets.com/assets/chunk-lazy-element-toggle-switch-0b0e875a5b4f4f2e.js", + "https://github.githubassets.com/assets/chunk-lazy-element-cookie-consent-link-0b3046383a14e4ce.js", + "https://github.githubassets.com/assets/chunk-dg-c9fddb85345164af.js", + "https://github.githubassets.com/assets/chunk-lazy-element-fullstory-capture-626a17a5d400d971.js", + "https://github.githubassets.com/assets/chunk-lazy-element-ghcc-consent-dbdc93d9ffc7498e.js", + "https://github.githubassets.com/assets/chunk-lazy-element-webauthn-get-477300bea3112dfc.js", + "https://github.githubassets.com/assets/kq9.0c8f30d85eb9f017.module.css", + "https://github.githubassets.com/assets/chunk-lazy-react-partial-app-install-banner-partial-fd51bbc553eb32c3.js", + "https://github.githubassets.com/assets/u2l.ff0ae8126cef2c8d.module.css", + "https://github.githubassets.com/assets/chunk-lazy-react-partial-keyboard-shortcuts-dialog-3503df2397aa9315.js", + "https://github.githubassets.com/assets/7gn.b61eafa663cee06b.module.css", + "https://github.githubassets.com/assets/chunk-lazy-react-partial-marketing-footer-946d26a3a33ef18c.js", + "https://github.githubassets.com/assets/xy.53bd0160bcb9a6b4.module.css", + "https://github.githubassets.com/assets/chunk-lazy-react-partial-marketing-global-banner-b220f7a50c30c4d7.js", + "https://github.githubassets.com/assets/chunk-lazy-react-partial-marketing-header-8be15e43176c6ca0.js", + "https://collector.github.com/github/collect", + "https://github.githubassets.com/favicons/favicon.svg", + "https://github.githubassets.com/assets/apple-touch-icon-144x144-b882e354c005.png", + "https://github.githubassets.com/favicons/favicon.png", + "https://github.githubassets.com/assets/cat-53c4522f687c1719.glb", + "https://github.githubassets.com/assets/duck-b3412913788eaa25.glb", + "https://github.githubassets.com/assets/copilot-2addefe0e666acf2.glb", + "https://github.githubassets.com/assets/shield-99c76cd962f04df2.glb", + "https://github.githubassets.com/assets/chunk-t9-8f448bff964cab81.js", + "https://github.githubassets.com/assets/chunk-y79-1a1a479ec90a5fed.js", + "https://github.githubassets.com/assets/chunk-qq-2e86f4dc43915965.js", + "https://github.githubassets.com/assets/mascot-7c495cf9822e0d5c.jpg", + "https://github.githubassets.com/assets/cat_eye-75fdf7af6c5dc157.jpg", + "https://github.githubassets.com/assets/star-9663b0f4de9d12b1.jpg", + "https://github.githubassets.com/assets/head_sss-29270cf59da664ea.jpg", + "https://github.githubassets.com/assets/eye_sss-8e43fcedfb9ddaf9.jpg", + "https://github.githubassets.com/assets/eye_color-bb27e609004c77cc.jpg", + "https://github.githubassets.com/assets/body_sss-ecb11ff73d84fd3b.jpg", + "https://github.githubassets.com/assets/shield_sss-b8d96cf3572b780d.jpg", + "https://github.githubassets.com/assets/head_sss-b7e053d8d541a414.jpg", + "https://github.githubassets.com/assets/shield_diffuse-41b84e036ea43614.jpg", + "https://github.githubassets.com/assets/shield_blur-bd197c0b02963d75.jpg", + "https://github.githubassets.com/assets/code-1_desktop-6d44c7cb53b4aebb.mp4", + "https://api.github.com/_private/browser/stats", + "https://github.githubassets.com/assets/fg.2616179aabbabe22.module.css", + "https://github.githubassets.com/assets/chunk-fg-9cd11d60024b1b63.js" + ], + "stylesheets": [ + "https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css", + "https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css", + "https://github.githubassets.com/assets/dark-79ad2ace604703b3.css", + "https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css", + "https://github.githubassets.com/assets/primer-primitives-ed9ca172356fd545.css", + "https://github.githubassets.com/assets/primer-1d2c7f7b52a6068b.css", + "https://github.githubassets.com/assets/global-54ba76e934a49d7c.css", + "https://github.githubassets.com/assets/github-456bd5deb85c7ecd.css", + "https://github.githubassets.com/assets/marketing-c6c574a5b2679474.css", + "https://github.githubassets.com/assets/home-4589777a4968936a.css", + "https://github.githubassets.com/assets/app-runtime.19d34abf60f22685.module.css", + "https://github.githubassets.com/assets/react-core.83cecac4ceaa4904.module.css", + "https://github.githubassets.com/assets/primer-react-css.76a197f9dce25e3c.module.css", + "https://github.githubassets.com/assets/primer-react-brand-css.6a01c236ff527e7e.module.css", + "https://github.githubassets.com/assets/landing-pages.cb79c6c7ee35b215.module.css", + "https://github.githubassets.com/assets/kq9.0c8f30d85eb9f017.module.css", + "https://github.githubassets.com/assets/u2l.ff0ae8126cef2c8d.module.css", + "https://github.githubassets.com/assets/7gn.b61eafa663cee06b.module.css", + "https://github.githubassets.com/assets/xy.53bd0160bcb9a6b4.module.css", + "https://github.githubassets.com/assets/fg.2616179aabbabe22.module.css", + "https://github.githubassets.com/assets/keyboard-shortcuts-dialog.595c7e0164e20af0.module.css", + "https://github.githubassets.com/assets/marketing-global-banner.872f58d99e8047b4.module.css", + "https://github.githubassets.com/assets/app-install-banner-partial.00824cdfe766bf6a.module.css", + "https://github.githubassets.com/assets/t1.2c9e83c78bbeb6bd.module.css", + "https://github.githubassets.com/assets/marketing-footer.6545177e5ef8524d.module.css" + ], + "cookies": [ + "_octo", + "cpu_bucket", + "preferred_color_mode", + "tz" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "script[type=\"importmap\"]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__reactListening": { + "present": true + }, + "__reactRouterVersion": { + "present": true, + "version": "8.3.0" + }, + "litVersions": { + "present": true, + "version": "1.1.2" + } + } +} diff --git a/tests/corpus/gitlab.com.json b/tests/corpus/gitlab.com.json new file mode 100644 index 0000000..b823a5a --- /dev/null +++ b/tests/corpus/gitlab.com.json @@ -0,0 +1,439 @@ +{ + "host": "gitlab.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nuxt", + "vue" + ] + }, + "snapshot": [ + "google-analytics:high", + "hotjar:high", + "nuxt:high", + "sentry:high", + "vue:high@3.5.29" + ], + "signals": { + "url": "https://about.gitlab.com/", + "scripts": [ + "https://www.googletagmanager.com/gtag/destination", + "https://j.6sc.co/6si.min.js", + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://gitlab.com/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js", + "https://app.cdn.lookbookhq.com/production/jukebox/current/jukebox.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://dx.mountain.com/spx", + "https://t.contentsquare.net/uxa/12ea71a10da34.js", + "https://www.googletagmanager.com/gtag/js", + "https://cdn.bizible.com/xdc.js", + "https://cdn.cookielaw.org/consent/7f944245-c5cd-4eed-a90e-dd955adfdd08/OtAutoBlock.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location/geofeed", + "/_nuxt/BlINY_TJ.js", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/otBannerSdk.js", + "https://client-registry.mutinycdn.com/personalize/client/c18972324098ea25.js", + "https://cdn.optimizely.com/js/5113954737848320.js", + "https://cdn.bizible.com/scripts/bizible.js", + "https://munchkin.marketo.net/munchkin.js", + "https://www.googletagmanager.com/gtm.js", + "https://cdn.cr-relay.com/v1/site/041efcb3-215c-4d99-baeb-ce9edf30d27a/signals.js", + "https://static.hj.contentsquare.net/c/hotjar-6533133.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/923339191/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/10973987381/", + "https://extend.vimeocdn.com/ga/115027220.js", + "https://j.6sc.co/j/e9e55340-3e99-4dcb-8496-fe1e95de35e5.js", + "https://js.qualified.com/qualified.js", + "https://px.mountain.com/st", + "https://gs.mountain.com/gs", + "/_payload.json", + "/fonts/gitlab-sans/GitLabSans.woff2", + "/fonts/gitlab-mono/GitLabMono.woff2", + "/_nuxt/DvQFpjbg.js", + "/_nuxt/CC-_7V0j.js", + "/_nuxt/C8MFTEU9.js", + "/_nuxt/D3CcGQPG.js", + "/_nuxt/DP33dSpM.js", + "/_nuxt/B0VHbU3h.js", + "/_nuxt/Cbe7Jul6.js", + "/_nuxt/BMyR6M34.js", + "/_nuxt/BqFFb_eK.js", + "/_nuxt/eVYzypzA.js", + "/_nuxt/DYbVR7JC.js", + "/_nuxt/XGlb7PSy.js", + "/_nuxt/CBOuVVw_.js", + "/_nuxt/e3PC43bh.js", + "/_nuxt/C6v-jGHK.js", + "/_nuxt/DufFK1no.js", + "/_nuxt/DcQAzSVI.js", + "/_nuxt/CRA9HQhj.js", + "/_nuxt/d3LO55hk.js", + "/_nuxt/CFqVtbCB.js", + "/_nuxt/Q5rubXC4.js", + "/_nuxt/C7B1hZ1w.js", + "/_nuxt/Dt_U_nib.js", + "/_nuxt/DVHIZA4n.js", + "/_nuxt/Y0FTVmEZ.js", + "/_nuxt/CJ-hnJZl.js", + "/_nuxt/QECahX31.js", + "/_nuxt/wZ7V8CuX.js", + "/_nuxt/Df5A5Q2V.js", + "/_nuxt/-SOgpbLp.js", + "/_nuxt/CQk8e7gi.js", + "/_nuxt/JuvO3Rwh.js", + "/_nuxt/KWGu01Bv.js", + "/_nuxt/pHjadiuc.js", + "/_nuxt/CK2Oirq6.js", + "/_nuxt/B9aM_76i.js", + "/_nuxt/Cn9BNhUD.js", + "/_nuxt/JO_5xmb8.js", + "/_nuxt/C8qLqCZA.js", + "/_nuxt/B5f7QnlC.js", + "/_nuxt/GZ22KrHL.js", + "/_nuxt/C1FxGnjR.js", + "/_nuxt/BucXgjgo.js", + "/_nuxt/CfCuAs2T.js", + "/_nuxt/E8i_hk1w.js", + "/_nuxt/DO53n1i0.js", + "/_nuxt/BoNnBbOn.js", + "/_nuxt/CJFfST3U.js", + "/_nuxt/jKMg_p-a.js", + "/_nuxt/DeGfrnDV.js", + "/_nuxt/CpPMUhky.js", + "/_nuxt/D6T0yx86.js", + "/_nuxt/D7OlC-Wo.js", + "/_nuxt/G7kMuctF.js", + "/_nuxt/B_b5fQsC.js", + "/_nuxt/GdMMTmU_.js", + "/_nuxt/Da8w7bTs.js", + "/_nuxt/CqkleIqs.js", + "/_nuxt/BSziQLOz.js", + "/_nuxt/B2hyRJh4.js", + "/_nuxt/BTZQ6wNN.js", + "/_nuxt/XFMJpz-6.js", + "/_nuxt/IbYg8xkf.js", + "/_nuxt/Cz9ArMSH.js", + "/_nuxt/dRPIghoS.js", + "/_nuxt/zsvcPfMe.js", + "/_nuxt/lWcAkB7r.js", + "/_nuxt/CMKPQ4rA.js", + "/_nuxt/CnBj-Non.js", + "/_nuxt/COZNhftq.js", + "/_nuxt/D62r80Cd.js", + "/_nuxt/Czc5KOY5.js", + "/_nuxt/DSIcYeXs.js", + "/_nuxt/BKul2vYP.js", + "/_nuxt/Cq7h8MQW.js", + "/_nuxt/DY6jtauk.js", + "/_nuxt/jrGvHjED.js", + "/_nuxt/Bha0Y0Rc.js", + "/_nuxt/BczUElk9.js", + "/_nuxt/BoMhTbhE.js", + "/_nuxt/Drf19fay.js", + "/_nuxt/CemVrMxE.js", + "/_nuxt/BuIJ9JYP.js", + "/_nuxt/PMIylofA.js", + "/_nuxt/CqngY-iS.js", + "/_nuxt/D53LTy5G.js", + "/_nuxt/BPKN4sjG.js", + "/_nuxt/qhFWyp4t.js", + "/_nuxt/qOkUFSWc.js", + "/_nuxt/Dxc7EpBl.js", + "/_nuxt/C2IjFjaC.js", + "https://about.gitlab.com/_nuxt/DvZsx-BJ.js", + "https://about.gitlab.com/_nuxt/CpMFK3Dl.js", + "https://about.gitlab.com/_nuxt/CPHnmA5m.js", + "https://about.gitlab.com/_nuxt/CgrcRLxx.js", + "inline:#oneTrustAutoBlocking", + "inline:#oneTrustSDK", + "inline:#oneTrustGeolocation", + "inline:#mutiny", + "inline:#onetrust-initialization", + "inline:#unhead:payload", + "inline:#__NUXT_DATA__", + "inline:#6senseWebTag", + "https://cdn.cookielaw.org/consent/7f944245-c5cd-4eed-a90e-dd955adfdd08/7f944245-c5cd-4eed-a90e-dd955adfdd08.json", + "https://about.gitlab.com/_nuxt/entry.f4Qs01D3.css", + "https://about.gitlab.com/_nuxt/Banner.BMJkmWbA.css", + "https://about.gitlab.com/_payload.json", + "https://about.gitlab.com/_nuxt/BlINY_TJ.js", + "https://about.gitlab.com/fonts/gitlab-mono/GitLabMono.woff2", + "https://about.gitlab.com/fonts/gitlab-sans/GitLabSans.woff2", + "https://about.gitlab.com/_nuxt/DvQFpjbg.js", + "https://about.gitlab.com/_nuxt/CC-_7V0j.js", + "https://about.gitlab.com/_nuxt/D3CcGQPG.js", + "https://about.gitlab.com/_nuxt/DP33dSpM.js", + "https://about.gitlab.com/_nuxt/C8MFTEU9.js", + "https://about.gitlab.com/_nuxt/B0VHbU3h.js", + "https://about.gitlab.com/_nuxt/Cbe7Jul6.js", + "https://about.gitlab.com/_nuxt/BMyR6M34.js", + "https://about.gitlab.com/_nuxt/BqFFb_eK.js", + "https://about.gitlab.com/_nuxt/eVYzypzA.js", + "https://about.gitlab.com/_nuxt/DYbVR7JC.js", + "https://about.gitlab.com/_nuxt/XGlb7PSy.js", + "https://about.gitlab.com/_nuxt/CBOuVVw_.js", + "https://about.gitlab.com/_nuxt/e3PC43bh.js", + "https://about.gitlab.com/_nuxt/C6v-jGHK.js", + "https://about.gitlab.com/_nuxt/DufFK1no.js", + "https://about.gitlab.com/_nuxt/DcQAzSVI.js", + "https://about.gitlab.com/_nuxt/CRA9HQhj.js", + "https://about.gitlab.com/_nuxt/CFqVtbCB.js", + "https://about.gitlab.com/_nuxt/d3LO55hk.js", + "https://about.gitlab.com/_nuxt/C7B1hZ1w.js", + "https://about.gitlab.com/_nuxt/Q5rubXC4.js", + "https://about.gitlab.com/_nuxt/Dt_U_nib.js", + "https://about.gitlab.com/_nuxt/DVHIZA4n.js", + "https://about.gitlab.com/_nuxt/Y0FTVmEZ.js", + "https://about.gitlab.com/_nuxt/QECahX31.js", + "https://about.gitlab.com/_nuxt/CJ-hnJZl.js", + "https://about.gitlab.com/_nuxt/wZ7V8CuX.js", + "https://about.gitlab.com/_nuxt/Df5A5Q2V.js", + "https://about.gitlab.com/_nuxt/-SOgpbLp.js", + "https://about.gitlab.com/_nuxt/CQk8e7gi.js", + "https://about.gitlab.com/_nuxt/KWGu01Bv.js", + "https://about.gitlab.com/_nuxt/JuvO3Rwh.js", + "https://about.gitlab.com/_nuxt/pHjadiuc.js", + "https://about.gitlab.com/_nuxt/CK2Oirq6.js", + "https://about.gitlab.com/_nuxt/B9aM_76i.js", + "https://about.gitlab.com/_nuxt/Cn9BNhUD.js", + "https://about.gitlab.com/_nuxt/JO_5xmb8.js", + "https://about.gitlab.com/_nuxt/B5f7QnlC.js", + "https://about.gitlab.com/_nuxt/C8qLqCZA.js", + "https://about.gitlab.com/_nuxt/GZ22KrHL.js", + "https://about.gitlab.com/_nuxt/C1FxGnjR.js", + "https://about.gitlab.com/_nuxt/BucXgjgo.js", + "https://about.gitlab.com/_nuxt/CfCuAs2T.js", + "https://about.gitlab.com/_nuxt/E8i_hk1w.js", + "https://about.gitlab.com/_nuxt/DO53n1i0.js", + "https://about.gitlab.com/_nuxt/BoNnBbOn.js", + "https://about.gitlab.com/_nuxt/DeGfrnDV.js", + "https://about.gitlab.com/_nuxt/jKMg_p-a.js", + "https://about.gitlab.com/_nuxt/CJFfST3U.js", + "https://about.gitlab.com/_nuxt/CpPMUhky.js", + "https://about.gitlab.com/_nuxt/G7kMuctF.js", + "https://about.gitlab.com/_nuxt/D7OlC-Wo.js", + "https://about.gitlab.com/_nuxt/D6T0yx86.js", + "https://about.gitlab.com/_nuxt/B_b5fQsC.js", + "https://about.gitlab.com/_nuxt/GdMMTmU_.js", + "https://about.gitlab.com/_nuxt/Da8w7bTs.js", + "https://about.gitlab.com/_nuxt/BSziQLOz.js", + "https://about.gitlab.com/_nuxt/CqkleIqs.js", + "https://about.gitlab.com/_nuxt/B2hyRJh4.js", + "https://about.gitlab.com/_nuxt/BTZQ6wNN.js", + "https://about.gitlab.com/_nuxt/IbYg8xkf.js", + "https://about.gitlab.com/_nuxt/XFMJpz-6.js", + "https://about.gitlab.com/_nuxt/dRPIghoS.js", + "https://about.gitlab.com/_nuxt/Cz9ArMSH.js", + "https://about.gitlab.com/_nuxt/zsvcPfMe.js", + "https://about.gitlab.com/_nuxt/lWcAkB7r.js", + "https://about.gitlab.com/_nuxt/CMKPQ4rA.js", + "https://about.gitlab.com/_nuxt/CnBj-Non.js", + "https://about.gitlab.com/_nuxt/COZNhftq.js", + "https://about.gitlab.com/_nuxt/D62r80Cd.js", + "https://about.gitlab.com/_nuxt/DSIcYeXs.js", + "https://about.gitlab.com/_nuxt/Czc5KOY5.js", + "https://about.gitlab.com/_nuxt/Cq7h8MQW.js", + "https://about.gitlab.com/_nuxt/BKul2vYP.js", + "https://about.gitlab.com/_nuxt/DY6jtauk.js", + "https://about.gitlab.com/_nuxt/jrGvHjED.js", + "https://about.gitlab.com/_nuxt/Bha0Y0Rc.js", + "https://about.gitlab.com/_nuxt/BoMhTbhE.js", + "https://about.gitlab.com/_nuxt/BczUElk9.js", + "https://about.gitlab.com/_nuxt/Drf19fay.js", + "https://about.gitlab.com/_nuxt/CemVrMxE.js", + "https://about.gitlab.com/_nuxt/BuIJ9JYP.js", + "https://about.gitlab.com/_nuxt/PMIylofA.js", + "https://about.gitlab.com/_nuxt/D53LTy5G.js", + "https://about.gitlab.com/_nuxt/CqngY-iS.js", + "https://about.gitlab.com/_nuxt/BPKN4sjG.js", + "https://about.gitlab.com/_nuxt/qhFWyp4t.js", + "https://about.gitlab.com/_nuxt/C2IjFjaC.js", + "https://about.gitlab.com/_nuxt/qOkUFSWc.js", + "https://about.gitlab.com/_nuxt/Dxc7EpBl.js", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://res.cloudinary.com/about-gitlab-com/image/upload/f_avif,q_80,w_400/v1755887573/fvbnyei3tq26pbaz3hj8.svg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1755887558/hh2plbiwcbsvnanbb5nl.svg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1770244587/rfeci25ob3bnscqc9bc0.svg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1768588998/ijo2yrrgsohimh0bjprn.png", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1767819837/kl5adlwq2fg5qieqkkg7.png", + "https://res.cloudinary.com/about-gitlab-com/image/upload/f_avif,q_80,w_400/v1755887509/ul3vtwvvkozw9ppfstka.svg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1751317461/nspwul0onqtt84is8lfl.svg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png", + "https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto/v1787067438/sdybvdl8fcg12lltqlqh.jpg", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1769011778/wptltgnfxjwuljdy07fs.png", + "https://res.cloudinary.com/about-gitlab-com/image/upload/v1769195293/qsofzzb8rawp0tmjhqiq.png", + "https://about.gitlab.com/_nuxt/_...DvB2Xm2x.css", + "https://cdn.cookielaw.org/consent/7f944245-c5cd-4eed-a90e-dd955adfdd08/019bbab7-2864-7d24-bd72-36611ac33d56/en.json", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/otFlat.json", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/v2/otPcTab.json", + "https://cdn.cookielaw.org/scripttemplates/202606.2.0/assets/otCommonStyles.css", + "https://about.gitlab.com/images/ico/favicon.ico", + "https://about.gitlab.com/_i18n/ktTQtNlB/en-us/messages.json", + "https://cdn.cookielaw.org/logos/static/ot_guard_logo.svg", + "https://cdn.cookielaw.org/logos/aa14a5c8-79e3-442a-8177-464ad850b19d/e46c1d0d-1f66-481f-bc06-5427671431da/253e6fee-c4c0-4b60-bc35-79cdae5dda32/gitlab-logo-100.png", + "https://cdn.cookielaw.org/logos/static/powered_by_logo.svg", + "https://about.gitlab.com/_nuxt/Breadcrumbs.C5UPt88Z.css", + "https://about.gitlab.com/_nuxt/ErrorBoundary.Cb4eiKXZ.css", + "https://a5113954737848320.cdn.optimizely.com/client_storage/a5113954737848320.html", + "https://about.gitlab.com/_nuxt/SearchSuggestions.DFARaKhL.css", + "https://about.gitlab.com/_nuxt/SearchContent.42YkgKld.css", + "https://about.gitlab.com/_nuxt/Search.DDGgBE9C.css", + "https://about.gitlab.com/_nuxt/NavigationDesktopDropdownCards.Bhwrezpo.css", + "https://about.gitlab.com/_nuxt/NavigationDesktopDropdownLists.MBhYkLtx.css", + "https://about.gitlab.com/_nuxt/NavigationFeatureSection.a49oZgJW.css", + "https://about.gitlab.com/_nuxt/NavigationMobilePanel.DIEVphLL.css", + "https://about.gitlab.com/_nuxt/Navigation.COkqzHii.css", + "https://about.gitlab.com/_nuxt/SocialMediaLinks.blaWUTQH.css", + "https://about.gitlab.com/_nuxt/Footer.Cp_0b0Y6.css", + "https://about.gitlab.com/_nuxt/Modal.DaqBNYqs.css", + "https://about.gitlab.com/_nuxt/default.CVqphWK5.css", + "https://cdn.bizible.com/ipv", + "https://cdn.bizibly.com/u", + "https://about.gitlab.com/_nuxt/ProseCode.CUZfcZkg.css", + "https://about.gitlab.com/_nuxt/ProseImg.DK-1X768.css", + "https://about.gitlab.com/_nuxt/MermaidRenderer.CaUo9o2o.css", + "https://about.gitlab.com/_nuxt/ProsePre.DndBIpBv.css", + "https://about.gitlab.com/_nuxt/EmailRedirect.CoamltFg.css", + "https://about.gitlab.com/_nuxt/Video.BI4N0tus.css", + "https://about.gitlab.com/_nuxt/InlineVideoPlayer.DjKjzlPI.css", + "https://about.gitlab.com/_nuxt/CustomerLogosMarquee.Dhg2KKqy.css", + "https://about.gitlab.com/_nuxt/Promptling.DNInLS_t.css", + "https://about.gitlab.com/_nuxt/AsyncIcon.BTHM4TfZ.css", + "https://about.gitlab.com/_nuxt/VideoModal.COODZybs.css", + "https://about.gitlab.com/_nuxt/Hero.CIqrtxJ_.css", + "https://about.gitlab.com/_nuxt/HorizontalRule.GickFZw6.css", + "https://about.gitlab.com/_nuxt/Copy.Mx9ho4OC.css", + "https://about.gitlab.com/_nuxt/StackingCards.IOd1Vcu2.css", + "https://about.gitlab.com/_nuxt/IndustrySection.DHpJfELr.css", + "https://about.gitlab.com/_nuxt/SimpleQuoteCarousel.BP0Fn9N7.css", + "https://about.gitlab.com/_nuxt/CardCarousel.ZTpao5zL.css", + "https://about.gitlab.com/_nuxt/NextSteps.Dp9LTN2F.css", + "https://about.gitlab.com/_nuxt/DXY8IERi.js", + "https://about.gitlab.com/_nuxt/bNaE6FFb.js", + "https://analytics.gitlab.com/data", + "https://beacon.lynx.cognitivlabs.com/pixel/capture", + "https://api.cr-relay.com/v1/site/041efcb3-215c-4d99-baeb-ce9edf30d27a/batch", + "https://c.az.contentsquare.net/pageview", + "https://snowplowprd.trx.gitlab.net/com.snowplowanalytics.snowplow/tp2", + "https://app.qualified.com/w/1/q2kjzSUxjtgnCEEB/visitor_events", + "https://px.ads.linkedin.com/collect", + "https://52.22.50.55/is", + "https://jukebox.pathfactory.com/api/public/v1/init", + "https://px.ads.linkedin.com/wa/", + "https://logx.optimizely.com/v1/events", + "https://secure.adnxs.com/getuidj", + "https://c.6sc.co/", + "https://ipv6.6sc.co/", + "https://epsilon.6sense.com/v3/company/details", + "https://b.6sc.co/v1/beacon/img.gif", + "https://c.az.contentsquare.net/dvar", + "https://www.google.com/rmkt/collect/923339191/", + "https://www.google.com/rmkt/collect/10973987381/", + "https://analytics.gitlab.com/g/collect", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://www.google.com/pagead/1p-user-list/923339191/", + "https://www.google.com/pagead/1p-user-list/10973987381/", + "https://analytics.google.com/g/s/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://www.googleadservices.com/pagead/conversion/10973987381/" + ], + "stylesheets": [ + "/_nuxt/entry.f4Qs01D3.css", + "/_nuxt/Banner.BMJkmWbA.css", + "https://about.gitlab.com/_nuxt/_...DvB2Xm2x.css", + "https://about.gitlab.com/_nuxt/Breadcrumbs.C5UPt88Z.css", + "https://about.gitlab.com/_nuxt/ErrorBoundary.Cb4eiKXZ.css", + "https://about.gitlab.com/_nuxt/SearchSuggestions.DFARaKhL.css", + "https://about.gitlab.com/_nuxt/SearchContent.42YkgKld.css", + "https://about.gitlab.com/_nuxt/Search.DDGgBE9C.css", + "https://about.gitlab.com/_nuxt/NavigationDesktopDropdownCards.Bhwrezpo.css", + "https://about.gitlab.com/_nuxt/NavigationDesktopDropdownLists.MBhYkLtx.css", + "https://about.gitlab.com/_nuxt/NavigationFeatureSection.a49oZgJW.css", + "https://about.gitlab.com/_nuxt/NavigationMobilePanel.DIEVphLL.css", + "https://about.gitlab.com/_nuxt/Navigation.COkqzHii.css", + "https://about.gitlab.com/_nuxt/SocialMediaLinks.blaWUTQH.css", + "https://about.gitlab.com/_nuxt/Footer.Cp_0b0Y6.css", + "https://about.gitlab.com/_nuxt/Modal.DaqBNYqs.css", + "https://about.gitlab.com/_nuxt/default.CVqphWK5.css", + "https://about.gitlab.com/_nuxt/ProseCode.CUZfcZkg.css", + "https://about.gitlab.com/_nuxt/ProseImg.DK-1X768.css", + "https://about.gitlab.com/_nuxt/MermaidRenderer.CaUo9o2o.css", + "https://about.gitlab.com/_nuxt/ProsePre.DndBIpBv.css", + "https://about.gitlab.com/_nuxt/EmailRedirect.CoamltFg.css", + "https://about.gitlab.com/_nuxt/Video.BI4N0tus.css", + "https://about.gitlab.com/_nuxt/InlineVideoPlayer.DjKjzlPI.css", + "https://about.gitlab.com/_nuxt/CustomerLogosMarquee.Dhg2KKqy.css", + "https://about.gitlab.com/_nuxt/Promptling.DNInLS_t.css", + "https://about.gitlab.com/_nuxt/AsyncIcon.BTHM4TfZ.css", + "https://about.gitlab.com/_nuxt/VideoModal.COODZybs.css", + "https://about.gitlab.com/_nuxt/Hero.CIqrtxJ_.css", + "https://about.gitlab.com/_nuxt/HorizontalRule.GickFZw6.css", + "https://about.gitlab.com/_nuxt/Copy.Mx9ho4OC.css", + "https://about.gitlab.com/_nuxt/StackingCards.IOd1Vcu2.css", + "https://about.gitlab.com/_nuxt/IndustrySection.DHpJfELr.css", + "https://about.gitlab.com/_nuxt/SimpleQuoteCarousel.BP0Fn9N7.css", + "https://about.gitlab.com/_nuxt/CardCarousel.ZTpao5zL.css", + "https://about.gitlab.com/_nuxt/NextSteps.Dp9LTN2F.css" + ], + "cookies": [ + "OptanonConsent", + "optimizelyEndUserId", + "optimizelySession", + "_biz_uid", + "_biz_nA", + "_biz_pendingA", + "_biz_flagsA", + "signals-sdk-user-id", + "signals-sdk-session-id", + "sa-userid", + "_cs_c", + "_cs_id", + "_sp_ses.6b85", + "_sp_id.6b85", + "_fbp", + "__q_state_q2kjzSUxjtgnCEEB", + "_cs_s", + "_dcid", + "FPAU", + "_gd_svisitor", + "_an_uid", + "_gd_visitor", + "_gd_session", + "_gcl_au", + "_ga", + "_ga_EVTFNG2S5Z", + "_ga_ENFH3X7M5Y", + "FPGSID", + "_mpxl_guid" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "#__nuxt", + "[data-v-]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__VUE__": { + "present": true + }, + "__vue_app__": { + "present": true, + "version": "3.5.29" + }, + "gtag": { + "present": true + }, + "hj": { + "present": true + } + } +} diff --git a/tests/corpus/jquery.com.json b/tests/corpus/jquery.com.json new file mode 100644 index 0000000..86f5195 --- /dev/null +++ b/tests/corpus/jquery.com.json @@ -0,0 +1,59 @@ +{ + "host": "jquery.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "jquery", + "wordpress" + ] + }, + "snapshot": [ + "jquery:high@4.0.0", + "wordpress:high" + ], + "signals": { + "url": "https://jquery.com/", + "scripts": [ + "https://code.jquery.com/jquery-4.0.0.min.js", + "https://jquery.com/wp-content/themes/jquery/js/main.js", + "https://jquery.com/wp-content/themes/jquery/lib/typesense-minibar/typesense-minibar.js", + "https://jquery.com/wp-content/themes/jquery/lib/typesense-minibar/typesense-minibar.css", + "https://jquery.com/wp-content/themes/jquery/css/base.css", + "https://jquery.com/wp-content/themes/jquery.com/style.css", + "https://jquery.com/wp-content/themes/jquery/images/jq-nav-icons.png", + "https://jquery.com/wp-content/themes/jquery/images/logo-jquery.png", + "https://jquery.com/wp-content/themes/jquery/images/dark-grey-tile.png", + "https://jquery.com/wp-content/themes/jquery.com/i/download.png", + "https://jquery.com/wp-content/themes/jquery.com/i/feature-sprites.png", + "https://jquery.com/wp-content/themes/jquery/images/logo-digitalocean.svg", + "https://jquery.com/wp-content/themes/jquery/images/logo-wordpress.svg", + "https://jquery.com/wp-content/themes/jquery/lib/Cairo/Cairo-Bold.woff2", + "https://jquery.com/wp-content/themes/jquery/lib/FontAwesome/fontawesome-webfont.woff2", + "https://jquery.com/wp-content/themes/jquery/content/books/learning-jquery-4th-ed.jpg", + "https://jquery.com/wp-content/themes/jquery/content/books/jquery-in-action.jpg", + "https://jquery.com/wp-content/themes/jquery/content/books/jquery-succinctly.jpg", + "https://jquery.com/wp-content/themes/jquery.com/i/favicon.ico" + ], + "stylesheets": [ + "https://jquery.com/wp-content/themes/jquery/lib/typesense-minibar/typesense-minibar.css", + "https://jquery.com/wp-content/themes/jquery/css/base.css", + "https://jquery.com/wp-content/themes/jquery.com/style.css" + ], + "cookies": [], + "metas": [ + "generator=WordPress 7.1" + ], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "jQuery": { + "present": true, + "version": "4.0.0" + } + } +} diff --git a/tests/corpus/linear.app.json b/tests/corpus/linear.app.json new file mode 100644 index 0000000..7ec14d2 --- /dev/null +++ b/tests/corpus/linear.app.json @@ -0,0 +1,491 @@ +{ + "host": "linear.app", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "styled-components", + "sentry" + ], + "noVersion": [ + "nextjs" + ] + }, + "snapshot": [ + "nextjs:high", + "posthog:high", + "react:high", + "sentry:high", + "styled-components:high" + ], + "signals": { + "url": "https://linear.app/", + "scripts": [ + "https://static.linear.app/web/_next/static/chunks/C_JJxWoe.js", + "https://static.linear.app/web/_next/static/chunks/CbVyySae.js", + "https://e.linear.app/array/phc_PaCjzqaetuAlYgXjb0uftDOw8QzOmXfWIbD7nkaYrjr/config.js", + "https://static.linear.app/web/_next/static/chunks/index-B7CesddG.js", + "https://webassets.linear.app/images/ornj730p/production/f79251b06e9edeeacbf2875384defe629e000b3c-352x352.png", + "https://linear.app/cdn-cgi/imagedelivery/fO02fVwohEs9s9UHFwon6A/4552f8d7-6f37-4319-68b4-12654bef4e00/f=auto,fit=scale-down,metadata=none,width=64", + "https://linear.app/cdn-cgi/imagedelivery/fO02fVwohEs9s9UHFwon6A/d0a00c69-e4c9-4e2f-cff9-ec1178dd7700/f=auto,fit=scale-down,metadata=none,width=64", + "https://static.linear.app/web/_next/static/chunks/DPni1UWI.js", + "https://static.linear.app/web/_next/static/chunks/ChyxXR8K.js", + "https://static.linear.app/web/_next/static/chunks/CD8P7n-S.js", + "https://static.linear.app/web/_next/static/chunks/B4DDIM9R.js", + "https://static.linear.app/web/_next/static/chunks/BduJtM39.js", + "https://static.linear.app/web/_next/static/chunks/GoPVwBEh.js", + "https://static.linear.app/web/_next/static/chunks/96e5G8k7.js", + "https://static.linear.app/web/_next/static/chunks/Bekxe7jN.js", + "https://static.linear.app/web/_next/static/chunks/CGcnkalb.js", + "https://static.linear.app/web/_next/static/chunks/Dohs_Jv_.js", + "https://static.linear.app/web/_next/static/chunks/C2IMloCD.js", + "https://static.linear.app/web/_next/static/chunks/DUS-nzxL.js", + "https://static.linear.app/web/_next/static/chunks/CCWHnVE1.js", + "https://static.linear.app/web/_next/static/chunks/BvFsNBrI.js", + "https://static.linear.app/web/_next/static/chunks/BKqbJeWN.js", + "https://static.linear.app/web/_next/static/chunks/CpAMRFQB.js", + "https://static.linear.app/web/_next/static/chunks/IMCzCJ79.js", + "https://static.linear.app/web/_next/static/chunks/8uKcx5oO.js", + "https://static.linear.app/web/_next/static/chunks/D8nyb_3v.js", + "https://static.linear.app/web/_next/static/chunks/Ltq_crrU.js", + "https://static.linear.app/web/_next/static/chunks/DS3M7tb7.js", + "https://static.linear.app/web/_next/static/chunks/BUbAvwSe2.js", + "https://static.linear.app/web/_next/static/chunks/CLkvkfWq2.js", + "https://static.linear.app/web/_next/static/chunks/ByhL91nx2.js", + "https://static.linear.app/web/_next/static/chunks/STcI6Ldv2.js", + "https://static.linear.app/web/_next/static/chunks/BS9CVKc_2.js", + "https://static.linear.app/web/_next/static/chunks/WnOndYt32.js", + "https://static.linear.app/web/_next/static/chunks/Dx_e0Y4I.js", + "https://static.linear.app/web/_next/static/chunks/DiSG0_ve.js", + "https://static.linear.app/web/_next/static/chunks/DfBXUJDq.js", + "https://static.linear.app/web/_next/static/chunks/BX8_OCwr.js", + "https://static.linear.app/web/_next/static/chunks/PPnH9BIT2.js", + "https://static.linear.app/web/_next/static/chunks/BtqiM8p_2.js", + "https://static.linear.app/web/_next/static/chunks/C2QPG9wk.js", + "https://static.linear.app/web/_next/static/chunks/DkCG08zi2.js", + "https://static.linear.app/web/_next/static/chunks/Dj7aev86.js", + "https://static.linear.app/web/_next/static/chunks/CxgRWATR.js", + "https://static.linear.app/web/_next/static/chunks/CXSqfIYs2.js", + "https://static.linear.app/web/_next/static/chunks/Cj07Iz4m2.js", + "https://static.linear.app/web/_next/static/chunks/rs3JSSy62.js", + "https://static.linear.app/web/_next/static/chunks/oxgKlqT-2.js", + "https://static.linear.app/web/_next/static/chunks/CPE0gGq7.js", + "https://static.linear.app/web/_next/static/chunks/MwiRiVJe.js", + "https://static.linear.app/web/_next/static/chunks/DwwutbwA.js", + "https://static.linear.app/web/_next/static/chunks/cIpCkneT.js", + "https://static.linear.app/web/_next/static/chunks/CTnRs2wE2.js", + "https://static.linear.app/web/_next/static/chunks/BmnKFgNC2.js", + "https://static.linear.app/web/_next/static/chunks/CtaSXwow2.js", + "https://static.linear.app/web/_next/static/chunks/D0FLkd-T.js", + "https://static.linear.app/web/_next/static/chunks/BULDRvKr.js", + "https://static.linear.app/web/_next/static/chunks/CTKZP8i2.js", + "https://static.linear.app/web/_next/static/chunks/B5f_w3VH.js", + "https://static.linear.app/web/_next/static/chunks/DngQ6VE3.js", + "https://static.linear.app/web/_next/static/chunks/BMR_3iyC.js", + "https://static.linear.app/web/_next/static/chunks/B6CodnuL.js", + "https://static.linear.app/web/_next/static/chunks/BqM-80bS.js", + "https://static.linear.app/web/_next/static/chunks/Da2t3Lmr.js", + "https://static.linear.app/web/_next/static/chunks/qrvueeoX.js", + "https://static.linear.app/web/_next/static/chunks/D2HuUOaB.js", + "https://static.linear.app/web/_next/static/chunks/TLGMlWeS.js", + "https://static.linear.app/web/_next/static/chunks/uRsWIJMC.js", + "https://static.linear.app/web/_next/static/chunks/BRCw-Ack.js", + "https://static.linear.app/web/_next/static/chunks/BBCm2otT.js", + "https://static.linear.app/web/_next/static/chunks/BqzsQA8P.js", + "https://static.linear.app/web/_next/static/chunks/qTjhhIlX.js", + "https://static.linear.app/web/_next/static/chunks/DROALiLZ.js", + "https://static.linear.app/web/_next/static/chunks/6QU5E6t1.js", + "https://static.linear.app/web/_next/static/chunks/n7Ml__KD.js", + "https://static.linear.app/web/_next/static/chunks/DLpVwArW.js", + "https://static.linear.app/web/_next/static/chunks/4D9W3P5E.js", + "https://static.linear.app/web/_next/static/chunks/C4bpjgin.js", + "https://static.linear.app/web/_next/static/chunks/-AiuB5a1.js", + "https://static.linear.app/web/_next/static/chunks/B56YZJ16.js", + "https://static.linear.app/web/_next/static/chunks/Crd14Qvj.js", + "https://static.linear.app/web/_next/static/chunks/BhyDCI4f.js", + "https://static.linear.app/web/_next/static/chunks/DWw4StCg.js", + "https://static.linear.app/web/_next/static/chunks/B5Pf2BdT.js", + "https://static.linear.app/web/_next/static/chunks/DLfjWgGv.js", + "https://static.linear.app/web/_next/static/chunks/anWpyAOP.js", + "https://static.linear.app/web/_next/static/chunks/DpJsJxiY.js", + "https://static.linear.app/web/_next/static/chunks/CXQFl2qB.js", + "https://static.linear.app/web/_next/static/chunks/BiRRAypP.js", + "https://static.linear.app/web/_next/static/chunks/BKGxGU6g.js", + "https://static.linear.app/web/_next/static/chunks/BTWEL7KT.js", + "https://static.linear.app/web/_next/static/chunks/BzP_I-r6.js", + "https://static.linear.app/web/_next/static/chunks/BwTQP0rh.js", + "https://static.linear.app/web/_next/static/chunks/DnADsFXf.js", + "https://static.linear.app/web/_next/static/chunks/GqLZAgl4.js", + "https://static.linear.app/web/_next/static/chunks/uA-krldj.js", + "https://static.linear.app/web/_next/static/chunks/ZeqhPvCT.js", + "https://static.linear.app/web/_next/static/chunks/fdHAajlY.js", + "https://static.linear.app/web/_next/static/chunks/BVBDnvmv.js", + "https://static.linear.app/web/_next/static/chunks/DkqlIijl2.js", + "https://static.linear.app/web/_next/static/chunks/BngeIuBa2.js", + "https://static.linear.app/web/_next/static/chunks/2aPWHXZb2.js", + "https://static.linear.app/web/_next/static/chunks/CM1czZSC2.js", + "https://static.linear.app/web/_next/static/chunks/D6APSEOU2.js", + "https://static.linear.app/web/_next/static/chunks/C1wQiu072.js", + "https://static.linear.app/web/_next/static/chunks/Tx_opni12.js", + "https://static.linear.app/web/_next/static/chunks/3yib5xq22.js", + "https://static.linear.app/web/_next/static/chunks/DbfmBpzo2.js", + "https://static.linear.app/web/_next/static/chunks/CHk3yPLI2.js", + "https://static.linear.app/web/_next/static/chunks/ir4SinA92.js", + "https://static.linear.app/web/_next/static/chunks/_yi3viL72.js", + "https://static.linear.app/web/_next/static/chunks/DztIcfdz2.js", + "https://static.linear.app/web/_next/static/chunks/BWxK-HcI2.js", + "https://static.linear.app/web/_next/static/chunks/LqIASMXj2.js", + "https://static.linear.app/web/_next/static/chunks/CY6a5kjk2.js", + "https://static.linear.app/web/_next/static/chunks/Ba9d0oGm2.js", + "https://static.linear.app/web/_next/static/chunks/vlIDmv5W2.js", + "https://static.linear.app/web/_next/static/chunks/CsR0FbfG.js", + "https://static.linear.app/web/_next/static/chunks/D2006-Rq2.js", + "https://static.linear.app/web/_next/static/chunks/CIUgkzVz2.js", + "https://static.linear.app/web/_next/static/chunks/OIOGh60L2.js", + "https://static.linear.app/web/_next/static/chunks/DhVedEBa2.js", + "https://static.linear.app/web/_next/static/chunks/DmipTUNM2.js", + "https://static.linear.app/web/_next/static/chunks/Csb6CUso.js", + "https://static.linear.app/web/_next/static/chunks/uphb7xOl.js", + "https://static.linear.app/web/_next/static/chunks/DA99YIyF.js", + "https://static.linear.app/web/_next/static/chunks/D6PguOvA.js", + "https://static.linear.app/web/_next/static/chunks/DhDlnHKN.js", + "https://static.linear.app/web/_next/static/chunks/DpfbsCYq.js", + "https://static.linear.app/web/_next/static/chunks/Bv6JjDsv2.js", + "https://static.linear.app/web/_next/static/chunks/DdIaZFx02.js", + "https://static.linear.app/web/_next/static/chunks/B4drb1yq2.js", + "https://static.linear.app/web/_next/static/chunks/C8hwfSSF2.js", + "https://static.linear.app/web/_next/static/chunks/sz0KyrB3.js", + "https://static.linear.app/web/_next/static/chunks/CcTwwzpE.js", + "https://static.linear.app/web/_next/static/chunks/D3h6ES7Z2.js", + "https://static.linear.app/web/_next/static/chunks/8dxEyUO32.js", + "https://static.linear.app/web/_next/static/chunks/C5si3G-H.js", + "https://static.linear.app/web/_next/static/chunks/CmODRdg0.js", + "https://static.linear.app/web/_next/static/chunks/zuVPm44V.js", + "https://static.linear.app/web/_next/static/chunks/CBrwmuvf.js", + "https://static.linear.app/web/_next/static/chunks/D9JmxvAA2.js", + "https://static.linear.app/web/_next/static/chunks/CXeHq0xf.js", + "https://static.linear.app/web/_next/static/chunks/CF4GSTbx.js", + "https://static.linear.app/web/_next/static/chunks/Doqu0BJN.js", + "https://static.linear.app/web/_next/static/chunks/DL5NET8K.js", + "https://static.linear.app/web/_next/static/chunks/arNEe90D2.js", + "https://static.linear.app/web/_next/static/chunks/Cg-DT5cM2.js", + "https://static.linear.app/web/_next/static/chunks/Bq3Tejwr2.js", + "https://static.linear.app/web/_next/static/chunks/yWqKK-2L.js", + "https://static.linear.app/web/_next/static/chunks/CboMlESS.js", + "https://static.linear.app/web/_next/static/chunks/DtNVtVAR.js", + "https://static.linear.app/web/_next/static/chunks/dEya3Bez.js", + "https://static.linear.app/web/_next/static/chunks/o38LlbkS.js", + "https://static.linear.app/web/_next/static/chunks/C5Wz-yOy.js", + "https://static.linear.app/web/_next/static/chunks/LR6agepB.js", + "https://static.linear.app/web/_next/static/chunks/C0ebVZYE.js", + "https://static.linear.app/web/_next/static/chunks/DJw_FX3A.js", + "https://static.linear.app/web/_next/static/chunks/BjC8owdg2.js", + "https://static.linear.app/web/_next/static/chunks/CA8WreTE2.js", + "https://static.linear.app/web/_next/static/chunks/BFAjvj2e.js", + "https://static.linear.app/web/_next/static/chunks/DjTTwxSs2.js", + "https://static.linear.app/web/_next/static/chunks/DlNsyS1g2.js", + "https://static.linear.app/web/_next/static/chunks/ClaqEuwM.js", + "https://static.linear.app/web/_next/static/chunks/_7ddk3Yi.js", + "https://static.linear.app/web/_next/static/chunks/BpOu0len.js", + "https://static.linear.app/web/_next/static/chunks/W3VAx75C.js", + "https://static.linear.app/web/_next/static/chunks/CVg1C2j82.js", + "https://static.linear.app/web/_next/static/chunks/BOzSHsGV2.js", + "https://static.linear.app/web/_next/static/chunks/BsiR51gv2.js", + "https://static.linear.app/web/_next/static/chunks/BoX4aQ5J.js", + "https://static.linear.app/web/_next/static/chunks/9n9ULBrJ.js", + "https://static.linear.app/web/_next/static/chunks/DpXfw6fO2.js", + "https://static.linear.app/web/_next/static/chunks/lsyFRXju.js", + "https://static.linear.app/web/_next/static/chunks/B8D7IOKq.js", + "https://static.linear.app/web/_next/static/chunks/BR3C6sC-.js", + "https://static.linear.app/web/_next/static/chunks/BwIs16Sk.js", + "https://static.linear.app/web/_next/static/chunks/4ejENDZ9.js", + "https://static.linear.app/web/_next/static/chunks/ChOIBX4a2.js", + "https://static.linear.app/web/_next/static/chunks/DeR3iXAy2.js", + "https://static.linear.app/web/_next/static/chunks/C2F6fqak2.js", + "https://static.linear.app/web/_next/static/chunks/BmzoSq-u.js", + "https://static.linear.app/web/_next/static/chunks/R-3PM7Yv.js", + "https://static.linear.app/web/_next/static/chunks/FbYEyiYL.js", + "https://static.linear.app/web/_next/static/chunks/BZXQfkky2.js", + "https://static.linear.app/web/_next/static/chunks/B-HqtcIp.js", + "https://static.linear.app/web/_next/static/chunks/BPj0kMbR.js", + "https://static.linear.app/web/_next/static/chunks/DYiWIxCm.js", + "https://static.linear.app/web/_next/static/chunks/DHEB_R_Y.js", + "https://static.linear.app/web/_next/static/chunks/BBY2Y0O5.js", + "https://static.linear.app/web/_next/static/chunks/lfyVo4Sf.js", + "https://static.linear.app/web/_next/static/chunks/DxJdTjgw2.js", + "https://static.linear.app/web/_next/static/chunks/DgajkDUN.js", + "https://static.linear.app/web/_next/static/chunks/DfFcCvJx.js", + "https://static.linear.app/web/_next/static/chunks/5Ovckiic2.js", + "https://static.linear.app/web/_next/static/chunks/D6gJTVgf.js", + "https://static.linear.app/web/_next/static/chunks/HuswX9tb2.js", + "https://static.linear.app/web/_next/static/chunks/jbf8hXgM2.js", + "https://static.linear.app/web/_next/static/chunks/DlkD8p9y2.js", + "https://static.linear.app/web/_next/static/chunks/CTfHt8uq.js", + "https://static.linear.app/web/_next/static/chunks/B6jwJ4692.js", + "https://static.linear.app/web/_next/static/chunks/DEr-_el92.js", + "https://static.linear.app/web/_next/static/chunks/Dzxt2sfb2.js", + "https://static.linear.app/web/_next/static/chunks/BdlzO2Cy2.js", + "https://static.linear.app/web/_next/static/chunks/DDNRLH2g2.js", + "https://static.linear.app/web/_next/static/chunks/CcoHUQN82.js", + "https://static.linear.app/web/_next/static/chunks/Dg3V1rUc.js", + "https://static.linear.app/web/_next/static/chunks/B7OcVrGI2.js", + "https://static.linear.app/web/_next/static/chunks/DEQ9Nzi-.js", + "https://static.linear.app/web/_next/static/chunks/CCaIJ4uY.js", + "https://static.linear.app/web/_next/static/chunks/C0utuN0j.js", + "https://static.linear.app/web/_next/static/chunks/B-hQRC3_.js", + "https://static.linear.app/web/_next/static/chunks/DbH02UWn2.js", + "https://static.linear.app/web/_next/static/chunks/BHVNjumg2.js", + "https://static.linear.app/web/_next/static/chunks/CdbcYH4n2.js", + "https://static.linear.app/web/_next/static/chunks/CSpX0BRP2.js", + "https://static.linear.app/web/_next/static/chunks/BKUJ7JRK2.js", + "https://static.linear.app/web/_next/static/chunks/DbTMjvT-2.js", + "https://static.linear.app/web/_next/static/chunks/C4vPkqKf2.js", + "https://static.linear.app/web/_next/static/chunks/DN2VRVLT2.js", + "https://static.linear.app/web/_next/static/chunks/c7kuaPEw.js", + "https://static.linear.app/web/_next/static/chunks/mVi0ldXZ2.js", + "https://static.linear.app/web/_next/static/chunks/C8bRvvAt.js", + "https://static.linear.app/web/_next/static/chunks/BqTHhy4R2.js", + "https://static.linear.app/web/_next/static/chunks/U-CPbA4O2.js", + "https://static.linear.app/web/_next/static/chunks/BynqVz0M2.js", + "https://static.linear.app/web/_next/static/chunks/BrwllWK72.js", + "https://static.linear.app/web/_next/static/chunks/DNL0i3Ft.js", + "https://static.linear.app/web/_next/static/chunks/DnsY1NwX.js", + "https://static.linear.app/web/_next/static/chunks/E3_GvdEf2.js", + "https://static.linear.app/web/_next/static/chunks/BMZ7Ad2J.js", + "https://static.linear.app/web/_next/static/chunks/BM8oWU8g.js", + "https://static.linear.app/web/_next/static/chunks/C4NcN_k32.js", + "https://static.linear.app/web/_next/static/chunks/CqY_Dn_P2.js", + "https://static.linear.app/web/_next/static/chunks/nt3wIENI.js", + "https://static.linear.app/web/_next/static/chunks/D4W6CIL_2.js", + "https://static.linear.app/web/_next/static/chunks/C6zyhSBX2.js", + "https://static.linear.app/web/_next/static/chunks/CBnE8kZN.js", + "https://static.linear.app/web/_next/static/chunks/ClrtnbQF.js", + "https://static.linear.app/web/_next/static/chunks/3sC8EPrK.js", + "https://static.linear.app/web/_next/static/chunks/DlVmLGcI2.js", + "https://static.linear.app/web/_next/static/chunks/DIdNQWmO.js", + "https://static.linear.app/web/_next/static/chunks/D46x9sXu.js", + "https://static.linear.app/web/_next/static/chunks/C50Nbay7.js", + "https://static.linear.app/web/_next/static/chunks/-qFpWyMA.js", + "https://static.linear.app/web/_next/static/chunks/vwHKNPm0.js", + "https://static.linear.app/web/_next/static/chunks/De-L--Eb2.js", + "https://static.linear.app/web/_next/static/chunks/CGUV73422.js", + "https://static.linear.app/web/_next/static/chunks/C86tUaCg2.js", + "https://static.linear.app/web/_next/static/chunks/CFtpHu6a.js", + "https://static.linear.app/web/_next/static/chunks/DyUn3wEt.js", + "https://static.linear.app/web/_next/static/chunks/B6yBGnGS.js", + "https://static.linear.app/fonts/InterVariable.woff2", + "https://static.linear.app/web/_next/static/chunks/CyhZwSBc.js", + "https://static.linear.app/web/_next/static/chunks/ByFblN3X.js", + "https://static.linear.app/web/_next/static/css/page.BDqMG6gX.css", + "https://static.linear.app/web/_next/static/css/ContactLayout.B100jDP7.css", + "https://static.linear.app/web/_next/static/chunks/Bw6SBFB72.js", + "https://static.linear.app/web/_next/static/chunks/Bn04RFjD2.js", + "https://static.linear.app/web/_next/static/chunks/iuShxSg52.js", + "https://static.linear.app/web/_next/static/chunks/BxDa-Pl2.js", + "https://static.linear.app/web/_next/static/chunks/A1yVYhMD.js", + "https://static.linear.app/web/_next/static/chunks/BzRl0pDT2.js", + "https://static.linear.app/web/_next/static/chunks/Bm5aEPNY.js", + "https://static.linear.app/web/_next/static/chunks/CJ0NJFYW2.js", + "https://static.linear.app/web/_next/static/css/page.RHTSRvU8.css", + "https://static.linear.app/web/_next/static/css/Prose.DBLOnC2O.css", + "https://static.linear.app/web/_next/static/css/Separator.RnTSqYU1.css", + "https://static.linear.app/web/_next/static/css/Breadcrumbs.O5D4jzbE.css", + "https://static.linear.app/web/_next/static/css/BlogRenderer.BY9UWHDh.css", + "https://static.linear.app/web/_next/static/css/DefaultRenderer.tdbxckB2.css", + "https://static.linear.app/web/_next/static/css/Card.BO__v7RW.css", + "https://static.linear.app/web/_next/static/css/CardsGrid.BLwuA93h.css", + "https://static.linear.app/web/_next/static/chunks/Ks-eAQVi2.js", + "https://static.linear.app/web/_next/static/chunks/CBRflpnm.js", + "https://static.linear.app/web/_next/static/chunks/o4uNO_de2.js", + "https://static.linear.app/web/_next/static/chunks/u0icw4B02.js", + "https://static.linear.app/web/_next/static/chunks/CAlBdzi5.js", + "https://static.linear.app/web/_next/static/chunks/Bci3ZsGP2.js", + "https://static.linear.app/web/_next/static/chunks/DQLLdkRl2.js", + "https://static.linear.app/web/_next/static/chunks/uSGxNlMw2.js", + "https://static.linear.app/web/_next/static/chunks/BPWPniRV2.js", + "https://static.linear.app/web/_next/static/chunks/Fm7VNxCU2.js", + "https://static.linear.app/web/_next/static/chunks/DTRIAgNS2.js", + "https://static.linear.app/web/_next/static/chunks/K1MA0yom2.js", + "https://static.linear.app/web/_next/static/chunks/CkGsDNFy2.js", + "https://static.linear.app/web/_next/static/chunks/BFxrK6Db.js", + "https://static.linear.app/web/_next/static/chunks/C0VQOY0B.js", + "https://static.linear.app/web/_next/static/chunks/Y_VqPZtB.js", + "https://static.linear.app/web/_next/static/chunks/BVPD8iWI.js", + "https://static.linear.app/web/_next/static/chunks/UouGCiTM.js", + "https://static.linear.app/web/_next/static/chunks/DDfRNjkC.js", + "https://static.linear.app/web/_next/static/chunks/TfNbPhup.js", + "https://static.linear.app/web/_next/static/chunks/D0oPECXG.js", + "https://static.linear.app/web/_next/static/chunks/DUcHpMFK.js", + "https://static.linear.app/web/_next/static/chunks/CB0mjgYp.js", + "https://static.linear.app/web/_next/static/chunks/2Df9YRD4.js", + "https://static.linear.app/web/_next/static/chunks/BOUPrvwZ.js", + "https://static.linear.app/web/_next/static/chunks/BdJoGmT6.js", + "https://static.linear.app/web/_next/static/chunks/BCb1KfNA.js", + "https://static.linear.app/web/_next/static/chunks/5HRYgnQ8.js", + "https://static.linear.app/web/_next/static/chunks/CWhbjaJf.js", + "https://static.linear.app/web/_next/static/chunks/-PEFlkMR2.js", + "https://static.linear.app/web/_next/static/chunks/BvfFUJcU.js", + "https://static.linear.app/web/_next/static/chunks/CJvZhLkD2.js", + "https://static.linear.app/web/_next/static/chunks/CAvuUxKk2.js", + "https://static.linear.app/web/_next/static/chunks/C-AGodIX.js", + "https://static.linear.app/web/_next/static/chunks/BglcLN6-.js", + "https://static.linear.app/web/_next/static/chunks/DcgCT5kv.js", + "https://static.linear.app/web/_next/static/chunks/TewGIy9F.js", + "https://static.linear.app/web/_next/static/chunks/CfdD97vu.js", + "https://static.linear.app/web/_next/static/chunks/CNJH9SIZ.js", + "https://static.linear.app/web/_next/static/chunks/DPDJhPon.js", + "https://static.linear.app/web/_next/static/css/CustomersIndexPage.DxPrAB1C.css", + "https://static.linear.app/web/_next/static/chunks/CX6wS_Ke.js", + "https://static.linear.app/web/_next/static/chunks/DwtGjQzm2.js", + "inline:#_R_", + "https://static.linear.app/web/_next/static/css/pcGZUK31.css", + "https://static.linear.app/web/_next/static/css/Tpxbzi3N.css", + "https://static.linear.app/web/_next/static/css/BNNY1qpD.css", + "https://static.linear.app/web/_next/static/css/mYgpGelO.css", + "https://static.linear.app/web/_next/static/css/BYDaMjMd.css", + "https://static.linear.app/web/_next/static/css/BxKAvHxV.css", + "https://static.linear.app/web/_next/static/css/BEZjGLsi.css", + "https://static.linear.app/web/_next/static/css/Bl8l9ltc.css", + "https://static.linear.app/web/_next/static/css/DCkYdNzn.css", + "https://static.linear.app/web/_next/static/css/C-dCEHFh.css", + "https://static.linear.app/web/_next/static/css/3p32EmO1.css", + "https://static.linear.app/web/_next/static/css/dcAi4KbO.css", + "https://static.linear.app/web/_next/static/css/mgHd0F-S.css", + "https://static.linear.app/web/_next/static/css/ByHmXOx_.css", + "https://static.linear.app/web/_next/static/css/Blq4ZW3W.css", + "https://static.linear.app/web/_next/static/css/B3f9yiOq.css", + "https://static.linear.app/web/_next/static/css/Cidbg-cz.css", + "https://static.linear.app/web/_next/static/css/B6ktxgTN.css", + "https://static.linear.app/web/_next/static/css/BUY_OmUN.css", + "https://static.linear.app/web/_next/static/css/BluMS353.css", + "https://static.linear.app/web/_next/static/css/krMPHN5w.css", + "https://static.linear.app/web/_next/static/css/Spacer.mYgpGelO.css", + "https://static.linear.app/web/_next/static/css/BNdf6sgA.css", + "https://static.linear.app/web/_next/static/css/layout.B05Dfi6O.css", + "https://static.linear.app/web/_next/static/css/utils.BNNY1qpD.css", + "https://static.linear.app/web/_next/static/css/Icon.B18TDZc7.css", + "https://static.linear.app/web/_next/static/css/Layout.tvkMFESE.css", + "https://static.linear.app/web/_next/static/css/LayoutContent.D8YYVbao.css", + "https://static.linear.app/web/_next/static/css/Header.DIdsLwAm.css", + "https://static.linear.app/web/_next/static/css/Grid.Cds8fjKR.css", + "https://static.linear.app/web/_next/static/css/CTA.CDNJI-Em.css", + "https://static.linear.app/web/_next/static/css/HomepageSeparator.DAb6YYB9.css", + "https://static.linear.app/web/_next/static/css/Bleed.CbcodEv9.css", + "https://static.linear.app/web/_next/static/css/GlobalSidePanel.CYoFyd2X.css", + "https://static.linear.app/web/_next/static/css/Grain.D_EBlr94.css", + "https://static.linear.app/web/_next/static/css/HomepageLink.CN02O61q.css", + "https://static.linear.app/web/_next/static/css/Changelog.C40xlRzV.css", + "https://static.linear.app/web/_next/static/css/CKPQrUOL.css", + "https://static.linear.app/web/_next/static/css/Bb-JNkHr.css", + "https://static.linear.app/web/_next/static/css/Dop5ZgCE.css", + "https://static.linear.app/web/_next/static/css/Cds8fjKR.css", + "https://static.linear.app/web/_next/static/css/jAwP2tSl.css", + "https://static.linear.app/web/_next/static/css/Q6nTXUvX.css", + "https://static.linear.app/web/_next/static/css/CbcodEv9.css", + "https://static.linear.app/web/_next/static/css/bL-CLJt9.css", + "https://static.linear.app/web/_next/static/css/B1AV-EHC.css", + "https://static.linear.app/web/_next/static/css/BnZAjcL1.css", + "https://static.linear.app/web/_next/static/css/CkcrxymE.css", + "https://static.linear.app/web/_next/static/css/DgPIODoE.css", + "https://linear.app/static/pwa.webmanifest" + ], + "stylesheets": [ + "https://static.linear.app/web/_next/static/css/pcGZUK31.css", + "https://static.linear.app/web/_next/static/css/Tpxbzi3N.css", + "https://static.linear.app/web/_next/static/css/BNNY1qpD.css", + "https://static.linear.app/web/_next/static/css/mYgpGelO.css", + "https://static.linear.app/web/_next/static/css/BYDaMjMd.css", + "https://static.linear.app/web/_next/static/css/BxKAvHxV.css", + "https://static.linear.app/web/_next/static/css/BEZjGLsi.css", + "https://static.linear.app/web/_next/static/css/Bl8l9ltc.css", + "https://static.linear.app/web/_next/static/css/C-dCEHFh.css", + "https://static.linear.app/web/_next/static/css/DCkYdNzn.css", + "https://static.linear.app/web/_next/static/css/3p32EmO1.css", + "https://static.linear.app/web/_next/static/css/dcAi4KbO.css", + "https://static.linear.app/web/_next/static/css/mgHd0F-S.css", + "https://static.linear.app/web/_next/static/css/ByHmXOx_.css", + "https://static.linear.app/web/_next/static/css/Blq4ZW3W.css", + "https://static.linear.app/web/_next/static/css/Cidbg-cz.css", + "https://static.linear.app/web/_next/static/css/B3f9yiOq.css", + "https://static.linear.app/web/_next/static/css/BluMS353.css", + "https://static.linear.app/web/_next/static/css/B6ktxgTN.css", + "https://static.linear.app/web/_next/static/css/BUY_OmUN.css", + "https://static.linear.app/web/_next/static/css/krMPHN5w.css", + "https://static.linear.app/web/_next/static/css/BNdf6sgA.css", + "https://static.linear.app/web/_next/static/css/CKPQrUOL.css", + "https://static.linear.app/web/_next/static/css/Bb-JNkHr.css", + "https://static.linear.app/web/_next/static/css/Dop5ZgCE.css", + "https://static.linear.app/web/_next/static/css/Q6nTXUvX.css", + "https://static.linear.app/web/_next/static/css/bL-CLJt9.css", + "https://static.linear.app/web/_next/static/css/CbcodEv9.css", + "https://static.linear.app/web/_next/static/css/jAwP2tSl.css", + "https://static.linear.app/web/_next/static/css/B1AV-EHC.css", + "https://static.linear.app/web/_next/static/css/Cds8fjKR.css", + "https://static.linear.app/web/_next/static/css/CkcrxymE.css", + "https://static.linear.app/web/_next/static/css/DgPIODoE.css", + "https://static.linear.app/web/_next/static/css/BnZAjcL1.css", + "https://static.linear.app/web/_next/static/css/layout.B05Dfi6O.css", + "https://static.linear.app/web/_next/static/css/Spacer.mYgpGelO.css", + "https://static.linear.app/web/_next/static/css/utils.BNNY1qpD.css", + "https://static.linear.app/web/_next/static/css/Layout.tvkMFESE.css", + "https://static.linear.app/web/_next/static/css/Header.DIdsLwAm.css", + "https://static.linear.app/web/_next/static/css/Icon.B18TDZc7.css", + "https://static.linear.app/web/_next/static/css/LayoutContent.D8YYVbao.css", + "https://static.linear.app/web/_next/static/css/CTA.CDNJI-Em.css", + "https://static.linear.app/web/_next/static/css/Grid.Cds8fjKR.css", + "https://static.linear.app/web/_next/static/css/HomepageSeparator.DAb6YYB9.css", + "https://static.linear.app/web/_next/static/css/Bleed.CbcodEv9.css", + "https://static.linear.app/web/_next/static/css/GlobalSidePanel.CYoFyd2X.css", + "https://static.linear.app/web/_next/static/css/Grain.D_EBlr94.css", + "https://static.linear.app/web/_next/static/css/HomepageLink.CN02O61q.css", + "https://static.linear.app/web/_next/static/css/Changelog.C40xlRzV.css", + "https://static.linear.app/web/_next/static/css/BDqMG6gX.css", + "https://static.linear.app/web/_next/static/css/M9dz1lBx.css", + "https://static.linear.app/web/_next/static/css/7uHL1lAG.css", + "https://static.linear.app/web/_next/static/css/BfZYz5nq.css", + "https://static.linear.app/web/_next/static/css/BRfelXq9.css", + "https://static.linear.app/web/_next/static/css/Be8aVq9e.css", + "https://static.linear.app/web/_next/static/css/4CaDvCAO.css", + "https://static.linear.app/web/_next/static/css/RnTSqYU1.css", + "https://static.linear.app/web/_next/static/css/maEbQHhU.css", + "https://static.linear.app/web/_next/static/css/waNookeF.css", + "https://static.linear.app/web/_next/static/css/7xLibNEm.css", + "https://static.linear.app/web/_next/static/css/EfvVDhK6.css", + "https://static.linear.app/web/_next/static/css/Bj20LHop.css", + "https://static.linear.app/web/_next/static/css/BO__v7RW.css", + "https://static.linear.app/web/_next/static/css/DD-Ivz5v.css", + "https://static.linear.app/web/_next/static/css/q2FgrJcT.css", + "https://static.linear.app/web/_next/static/css/PR-WOC0k.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "[data-styled]", + "[sc-]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "1.0.0-beta.9" + }, + "posthog": { + "present": true + } + } +} diff --git a/tests/corpus/medium.com.json b/tests/corpus/medium.com.json new file mode 100644 index 0000000..fd34dde --- /dev/null +++ b/tests/corpus/medium.com.json @@ -0,0 +1,41 @@ +{ + "host": "medium.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "mustNotSolid": [ + "tailwind" + ] + }, + "snapshot": [ + "cloudflare:high", + "tailwind:medium" + ], + "signals": { + "url": "https://medium.com/", + "scripts": [ + "/cdn-cgi/challenge-platform/scripts/precursor/main.js", + "https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495", + "https://medium.com/cdn-cgi/styles/cf.errors.css", + "https://medium.com/cdn-cgi/challenge-platform/scripts/precursor/main.js", + "https://medium.com/cdn-cgi/images/browser-bar.png", + "https://medium.com/cdn-cgi/images/cf-no-screenshot-error.png", + "https://medium.com/cdn-cgi/challenge-platform/h/b/precursor/d76008a69eab/0.7182440836012771:1790409786:uv-jagL0f8Eh1xleDq_jUmMgjpfYzTz4YXTcODmmAsA/a411116e7edf0143", + "https://medium.com/cdn-cgi/rum", + "https://medium.com/favicon.ico" + ], + "stylesheets": [ + "/cdn-cgi/styles/cf.errors.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "tailwind-syntax" + ], + "globals": {}, + "pass": "light" + }, + "globals": {} +} diff --git a/tests/corpus/mui.com.json b/tests/corpus/mui.com.json new file mode 100644 index 0000000..31b1d7e --- /dev/null +++ b/tests/corpus/mui.com.json @@ -0,0 +1,203 @@ +{ + "host": "mui.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "mui", + "emotion" + ] + }, + "snapshot": [ + "emotion:high", + "google-analytics:high", + "mui:high", + "nextjs:high@16.3.1", + "react:high", + "tailwind:high", + "webpack:high" + ], + "signals": { + "url": "https://mui.com/", + "scripts": [ + "/_next/static/chunks/polyfills-42372ed130431b0a.js", + "/_next/static/chunks/79063.1bb642908df4567a.js", + "/_next/static/chunks/webpack-6bfd4c0255298238.js", + "/_next/static/chunks/framework-8fb8fbc01eded9ef.js", + "/_next/static/chunks/main-8beb610aebe58db0.js", + "/_next/static/chunks/pages/_app-dd046d96e973c941.js", + "/_next/static/chunks/21032-152a2524cc3e68fc.js", + "/_next/static/chunks/78618-e97f8ecaaf1d36bb.js", + "/_next/static/chunks/84467-9eed0e6c17a93373.js", + "/_next/static/chunks/87456-2b14294c9a7f3436.js", + "/_next/static/chunks/93051-531e40fe97c7eb0a.js", + "/_next/static/chunks/pages/index-8e55883991343793.js", + "/_next/static/AMRydBsto2kaHHqHy9mdJ/_buildManifest.js", + "/_next/static/AMRydBsto2kaHHqHy9mdJ/_ssgManifest.js", + "https://www.googletagmanager.com/gtag/js", + "/_next/static/chunks/5129-bc0ab9e584dba867.js", + "/_next/static/chunks/77240-47893f4e40bfd7ee.js", + "/_next/static/chunks/92076-cb7321d250525f0a.js", + "/_next/static/chunks/26132-6e695b04f00cb86d.js", + "/_next/static/chunks/99013-dfc5d289394d084f.js", + "/_next/static/chunks/82890-ccb80e55fa46eac0.js", + "/_next/static/chunks/pages/blog/introducing-mui-v9-4c97e505dc1d4934.js", + "/_next/static/chunks/pages/about-2c6c71814bb547fc.js", + "/_next/static/chunks/55125-0280ed080d37e1d8.js", + "/_next/static/chunks/pages/blog-0d5dd3481f66088e.js", + "/_next/static/chunks/33231-aac7d69533d4d362.js", + "/_next/static/chunks/68046-89dca76b2ee1d2ec.js", + "/_next/static/chunks/23263-9afffb7dd911b63f.js", + "/_next/static/chunks/pages/pricing-25eb2ba447930c93.js", + "/_next/static/chunks/pages/core-b8df530d2dde30cf.js", + "/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "/_next/static/media/02743a8d10a3d186-s.p.woff2", + "/_next/static/media/1e41be92c43b3255-s.p.woff2", + "/_next/static/media/eb38d80f1efefe0e-s.p.woff2", + "/_next/static/media/c769b9ad37242ab7-s.p.woff2", + "/_next/static/media/bd2e31d9f13a7622-s.p.woff2", + "/_next/static/media/ae798fbcd31d4786-s.p.woff2", + "/_next/static/media/fddff1087a1c2d83-s.p.woff2", + "/_next/static/media/33f126fad8818e42-s.p.woff2", + "/_next/static/media/9778847c4cc439b5-s.p.woff2", + "/_next/static/media/8ee909cc868b5d3d-s.p.woff2", + "/_next/static/css/79492683c712f05d.css", + "/static/branding/companies/nasa.svg", + "/static/branding/companies/netflix.svg", + "inline:#__NEXT_DATA__", + "https://mui.com/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "https://mui.com/_next/static/media/02743a8d10a3d186-s.p.woff2", + "https://mui.com/_next/static/media/1e41be92c43b3255-s.p.woff2", + "https://mui.com/_next/static/media/eb38d80f1efefe0e-s.p.woff2", + "https://mui.com/_next/static/media/c769b9ad37242ab7-s.p.woff2", + "https://mui.com/_next/static/media/bd2e31d9f13a7622-s.p.woff2", + "https://mui.com/_next/static/media/ae798fbcd31d4786-s.p.woff2", + "https://mui.com/_next/static/media/33f126fad8818e42-s.p.woff2", + "https://mui.com/_next/static/media/fddff1087a1c2d83-s.p.woff2", + "https://mui.com/_next/static/media/9778847c4cc439b5-s.p.woff2", + "https://mui.com/_next/static/media/8ee909cc868b5d3d-s.p.woff2", + "https://mui.com/_next/static/css/79492683c712f05d.css", + "https://mui.com/_next/static/chunks/79063.1bb642908df4567a.js", + "https://mui.com/_next/static/chunks/webpack-6bfd4c0255298238.js", + "https://mui.com/_next/static/chunks/main-8beb610aebe58db0.js", + "https://mui.com/_next/static/chunks/framework-8fb8fbc01eded9ef.js", + "https://mui.com/_next/static/chunks/21032-152a2524cc3e68fc.js", + "https://mui.com/_next/static/chunks/78618-e97f8ecaaf1d36bb.js", + "https://mui.com/_next/static/chunks/pages/_app-dd046d96e973c941.js", + "https://mui.com/_next/static/chunks/93051-531e40fe97c7eb0a.js", + "https://mui.com/_next/static/chunks/87456-2b14294c9a7f3436.js", + "https://mui.com/_next/static/chunks/84467-9eed0e6c17a93373.js", + "https://mui.com/_next/static/chunks/pages/index-8e55883991343793.js", + "https://mui.com/_next/static/AMRydBsto2kaHHqHy9mdJ/_buildManifest.js", + "https://mui.com/_next/static/AMRydBsto2kaHHqHy9mdJ/_ssgManifest.js", + "https://mui.com/static/branding/companies/nasa.svg", + "https://mui.com/static/branding/companies/netflix.svg", + "https://mui.com/static/manifest.json", + "https://mui.com/static/branding/companies/spotify-light.svg", + "https://mui.com/static/branding/companies/amazon-light.svg", + "https://mui.com/static/branding/companies/unity-light.svg", + "https://mui.com/static/branding/companies/shutterstock-light.svg", + "https://avatars.githubusercontent.com/u/21114044", + "https://avatars.githubusercontent.com/u/197016", + "https://avatars.githubusercontent.com/u/28296253", + "https://avatars.githubusercontent.com/u/732422", + "https://mui.com/static/styles/prism-okaidia.css", + "https://fonts.googleapis.com/icon", + "https://raw.githubusercontent.com/mui/material-ui/master/docs/versions.json", + "https://mui.com/_next/static/chunks/5abaa050.4385698b3ea45cb6.js", + "https://mui.com/_next/static/chunks/79987.ecde03e449b1cd42.js", + "https://mui.com/_next/static/chunks/21609-08eefdc48cc8bf81.js", + "https://mui.com/_next/static/chunks/31424.aca058364ec23aae.js", + "https://mui.com/_next/static/chunks/28102.a25dd6bb64f2a5cf.js", + "https://mui.com/_next/static/chunks/52311-a070c596c4f75774.js", + "https://mui.com/_next/static/chunks/77854-3f00606a4ffabf4d.js", + "https://mui.com/_next/static/chunks/6317-f5571fc807981681.js", + "https://mui.com/_next/static/chunks/38393.bc3b7b947d6ee90f.js", + "https://mui.com/_next/static/chunks/18962.1f80de94f9342646.js", + "https://mui.com/_next/static/chunks/23263-9afffb7dd911b63f.js", + "https://mui.com/_next/static/chunks/72270.ff176e6d94cb109e.js", + "https://mui.com/_next/static/chunks/2505-6ff7b6cd07a72899.js", + "https://mui.com/_next/static/chunks/84229.06d10f94b520e750.js", + "https://mui.com/_next/static/chunks/60144.0c838bfc7ef72465.js", + "https://mui.com/_next/static/chunks/92546-204ce5bcdf6b0a0f.js", + "https://mui.com/_next/static/chunks/84419.c6cf58f6d8ce07e2.js", + "https://mui.com/_next/static/chunks/68046-89dca76b2ee1d2ec.js", + "https://mui.com/_next/static/chunks/28852.32f73e47efc94bc4.js", + "https://mui.com/_next/static/chunks/45228.c915b3175a0f3262.js", + "https://mui.com/_next/static/chunks/9327-b3691357bbcac439.js", + "https://mui.com/_next/static/chunks/60491.5f953acdf18474a8.js", + "https://mui.com/static/branding/product-advanced-light.svg", + "https://mui.com/static/branding/product-templates-light.svg", + "https://mui.com/static/branding/product-designkits-light.svg", + "https://mui.com/static/images/avatar/3.jpg", + "https://mui.com/_next/static/chunks/5129-bc0ab9e584dba867.js", + "https://mui.com/_next/static/chunks/77240-47893f4e40bfd7ee.js", + "https://mui.com/_next/static/chunks/92076-cb7321d250525f0a.js", + "https://mui.com/_next/static/chunks/26132-6e695b04f00cb86d.js", + "https://mui.com/_next/static/chunks/82890-ccb80e55fa46eac0.js", + "https://mui.com/_next/static/chunks/99013-dfc5d289394d084f.js", + "https://mui.com/_next/static/chunks/pages/blog/introducing-mui-v9-4c97e505dc1d4934.js", + "https://mui.com/_next/static/chunks/33231-aac7d69533d4d362.js", + "https://mui.com/_next/static/chunks/pages/pricing-25eb2ba447930c93.js", + "https://mui.com/_next/static/chunks/pages/about-2c6c71814bb547fc.js", + "https://mui.com/_next/data/AMRydBsto2kaHHqHy9mdJ/blog.json", + "https://mui.com/_next/static/chunks/55125-0280ed080d37e1d8.js", + "https://mui.com/_next/static/chunks/pages/blog-0d5dd3481f66088e.js", + "https://mui.com/_next/static/chunks/pages/core-b8df530d2dde30cf.js", + "https://mui.com/static/images/cards/contemplative-reptile.jpg", + "https://cdn.jsdelivr.net/npm/@docsearch/css@4.7.0/dist/style.min.css", + "https://mui.com/static/images/avatar/2.jpg", + "https://www.google-analytics.com/g/collect", + "https://mui.com/static/favicon.svg", + "https://mui.com/static/icons/192x192.png" + ], + "stylesheets": [ + "/_next/static/css/79492683c712f05d.css", + "https://fonts.googleapis.com/icon", + "/static/styles/prism-okaidia.css" + ], + "cookies": [ + "codeVariant", + "codeStyling" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer", + "[class*=\"MuiButton-\"]", + "[data-emotion]", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__NEXT_DATA__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "gtag": { + "present": true + }, + "next": { + "present": true, + "version": "16.3.1" + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/newrelic.com.json b/tests/corpus/newrelic.com.json new file mode 100644 index 0000000..868b144 --- /dev/null +++ b/tests/corpus/newrelic.com.json @@ -0,0 +1,153 @@ +{ + "host": "newrelic.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "newrelic" + ] + }, + "snapshot": [ + "bootstrap:low", + "jquery:high@4.0.0", + "lit:high@2.8.0", + "newrelic:high", + "tailwind:high", + "webpack:high" + ], + "signals": { + "url": "https://newrelic.com/", + "scripts": [ + "https://cmp.osano.com/AzZVWOTJtg1WY32RK/cd381ba3-ebca-488c-a528-376a86764609/osano.js", + "https://cdn.intellimize.co/snippet/117712186.js", + "/sites/default/files/js/js_lKZifxj7qOFRgwgJb3jZJr_nw_oRk-cazq3ZFL54gvs.js", + "/libraries/erno/js/nr-utilities.js", + "/modules/custom/nr_personalization/js/nr_personalization.personalization.js", + "/sites/default/files/js/js__jaw7JiK1klR2oALBY5IJLl8d5NTFqeLpdGiWKWcqLo.js", + "/libraries/erno/templates/components/header/header/header.js", + "/libraries/erno/js/nr-utm-cookie.js", + "/libraries/erno/js/analytics.js", + "/libraries/erno/js/nr-analytics.js", + "/sites/default/files/js/js_lCKRYH4WzQB9PB5-mFEnKpMoR1mXvefuM80-hUFK02g.js", + "/core/assets/vendor/jquery/jquery.min.js", + "/sites/default/files/js/js_C1yHZnOSQSWjXUpzUVbaWp8JbV-qY9xA3TCW6QmQAuA.js", + "/modules/contrib/ckeditor_accordion/js/accordion.frontend.min.js", + "/sites/default/files/js/js_3JydwblcgzSm35Y7Ph90hgjGPHw8-TI1zYCe4TQhYeM.js", + "https://cdn.jsdelivr.net/npm/js-cookie@3.0.5/dist/js.cookie.min.js", + "/sites/default/files/js/js_vd0D1ZW1k8q0s-l32xIignbH0-AHMQD9XVs2ty4EVb0.js", + "/themes/custom/erno/assets/fonts/mona-sans/MonaSansVF[wdth,wght,opsz].woff2", + "/themes/custom/erno/assets/fonts/inter/Inter-Variable.woff2", + "/themes/custom/erno/assets/fonts/geist-mono/geist-mono-400.woff2", + "https://newrelic.com/themes/custom/erno/assets/fonts/mona-sans/MonaSansVF[wdth,wght,opsz].woff2", + "https://newrelic.com/themes/custom/erno/assets/fonts/inter/Inter-Variable.woff2", + "https://newrelic.com/themes/custom/erno/assets/fonts/geist-mono/geist-mono-400.woff2", + "https://newrelic.com/sites/default/files/css/css_pjrE0zpK-JYbE_tjaUziLWgnGOvv184C1iOyPFuxJ4M.css", + "https://newrelic.com/sites/default/files/js/js_lKZifxj7qOFRgwgJb3jZJr_nw_oRk-cazq3ZFL54gvs.js", + "https://newrelic.com/sites/default/files/css/css_FaVoq6vZqmyXEWmbjdqp0p9LuBsQn1H1A937LoJFw_U.css", + "https://newrelic.com/libraries/erno/js/nr-utilities.js", + "https://newrelic.com/modules/custom/nr_personalization/js/nr_personalization.personalization.js", + "https://newrelic.com/sites/default/files/js/js__jaw7JiK1klR2oALBY5IJLl8d5NTFqeLpdGiWKWcqLo.js", + "https://newrelic.com/libraries/erno/templates/components/header/header/header.js", + "https://newrelic.com/libraries/erno/js/nr-utm-cookie.js", + "https://newrelic.com/libraries/erno/js/analytics.js", + "https://newrelic.com/libraries/erno/js/nr-analytics.js", + "https://newrelic.com/sites/default/files/js/js_lCKRYH4WzQB9PB5-mFEnKpMoR1mXvefuM80-hUFK02g.js", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-02/platform.jpg", + "https://newrelic.com/sites/default/files/2026-02/logo_dominos.svg", + "https://newrelic.com/sites/default/files/2026-02/logo_shutterstock%20%282%29.svg", + "https://newrelic.com/sites/default/files/2025-03/bangkokbank.svg", + "https://newrelic.com/sites/default/files/2026-02/logo_atlassian%20%281%29.svg", + "https://newrelic.com/sites/default/files/2022-05/logo_verizon.svg", + "https://newrelic.com/sites/default/files/2023-02/toyota2.svg", + "https://newrelic.com/sites/default/files/2026-02/Button_0.svg", + "https://newrelic.com/sites/default/files/2026-02/Button.svg", + "https://newrelic.com/sites/default/files/styles/1920w/public/2026-03/IO%20A.webp", + "https://newrelic.com/sites/default/files/styles/1920w/public/2026-03/IO%20B.webp", + "https://newrelic.com/sites/default/files/2026-02/Button_1.svg", + "https://newrelic.com/sites/default/files/2026-02/Frame_2.svg", + "https://newrelic.com/sites/default/files/2026-02/Frame_0.svg", + "https://newrelic.com/sites/default/files/2026-02/Frame_1.svg", + "https://newrelic.com/sites/default/files/2026-02/Frame_5.svg", + "https://newrelic.com/core/assets/vendor/jquery/jquery.min.js", + "https://newrelic.com/sites/default/files/js/js_C1yHZnOSQSWjXUpzUVbaWp8JbV-qY9xA3TCW6QmQAuA.js", + "https://newrelic.com/sites/default/files/2026-02/Frame_3.svg", + "https://newrelic.com/themes/custom/erno/assets/images/icons/misc/ccpa.svg", + "https://newrelic.com/sites/default/files/2026-02/Frame_4.svg", + "https://newrelic.com/modules/contrib/ckeditor_accordion/js/accordion.frontend.min.js", + "https://newrelic.com/sites/default/files/js/js_3JydwblcgzSm35Y7Ph90hgjGPHw8-TI1zYCe4TQhYeM.js", + "https://newrelic.com/sites/default/files/js/js_vd0D1ZW1k8q0s-l32xIignbH0-AHMQD9XVs2ty4EVb0.js", + "https://newrelic.com/themes/custom/erno/assets/fonts/geist-mono/geist-mono-500.woff2", + "https://fonts.googleapis.com/css2", + "https://newrelic.com/themes/custom/erno/manifest.json", + "https://newrelic.com/themes/custom/erno/assets/images/icons/misc/quad-symbol.svg", + "https://newrelic.com/themes/custom/erno/assets/images/icons/divider/green.svg", + "https://newrelic.com/themes/custom/erno/assets/images/icons/divider/blue.svg", + "https://newrelic.com/themes/custom/erno/assets/images/layout/section/bg-graph-paper-dark-full-optimized.webp", + "https://newrelic.com/sites/default/files/2026-02/background-bottom.png", + "https://newrelic.com/sites/default/files/2026-02/platform-menu.png", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-03/SRE%20Agent.png", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-03/Session%20Replay.png", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-03/Cloud%20Costs.png", + "https://newrelic.com/sites/default/files/2026-02/solutions-menu.png", + "https://newrelic.com/sites/default/files/2026-02/customers-menu.png", + "https://newrelic.com/sites/default/files/2026-02/Resources-menu.png", + "https://newrelic.com/themes/custom/erno/assets/images/icons/interaction/user-icon.svg", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-02/pricing-menu.png", + "https://cmp.osano.com/", + "https://consent.api.osano.com/record", + "https://api.intellimize.co/prediction/117712186", + "https://js-agent.newrelic.com/nr-full-1.322.0.min.js", + "https://log.intellimize.co/logger", + "https://newrelic.com/themes/custom/erno/assets/images/metadata/favicon.ico", + "https://bam.nr-data.net/1/NRBR-044cd27ea2168d4c185", + "https://bam.nr-data.net/events/1/NRBR-044cd27ea2168d4c185", + "https://bam.nr-data.net/jserrors/1/NRBR-044cd27ea2168d4c185", + "https://log.intellimize.co/clientlogger", + "https://newrelic.com/sites/default/files/styles/800w/public/2026-03/AI%20Agent%20Monitor.png", + "https://api.intellimize.co/context-v2/117712186" + ], + "stylesheets": [ + "/sites/default/files/css/css_pjrE0zpK-JYbE_tjaUziLWgnGOvv184C1iOyPFuxJ4M.css", + "/sites/default/files/css/css_FaVoq6vZqmyXEWmbjdqp0p9LuBsQn1H1A937LoJFw_U.css", + "https://fonts.googleapis.com/css2" + ], + "cookies": [ + "nr_lang", + "osano_consentmanager_uuid", + "osano_consentmanager", + "nr_pn_visited" + ], + "metas": [ + "Generator=Drupal 11 (https://www.drupal.org)" + ], + "inlineSamples": [ + "(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:[\"bam.nr-data.net\"]}};(window.NREUM||(NREUM={})).load", + "window.NREUM||(NREUM={});NREUM.info={\"beacon\":\"bam.nr-data.net\",\"licenseKey\":\"NRBR-044cd27ea2168d4c185\",\"applicationID\":\"707464402\"," + ], + "domFlags": [ + ".btn-primary", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "NREUM": { + "present": true + }, + "jQuery": { + "present": true, + "version": "4.0.0" + }, + "litVersions": { + "present": true, + "version": "2.8.0" + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/nextjs.org.json b/tests/corpus/nextjs.org.json new file mode 100644 index 0000000..b86e35b --- /dev/null +++ b/tests/corpus/nextjs.org.json @@ -0,0 +1,230 @@ +{ + "host": "nextjs.org", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "turbopack", + "vercel" + ] + }, + "snapshot": [ + "nextjs:high@16.4.0-canary.38", + "react:high", + "tailwind:high", + "turbopack:high", + "vercel:high" + ], + "signals": { + "url": "https://nextjs.org/", + "scripts": [ + "/_next/static/immutable/chunks/1rm-wvc_n028a.js", + "/_next/static/immutable/chunks/07kwstrqobzdq.js", + "/_next/static/immutable/chunks/0hmtujug_wj7h.js", + "/_next/static/immutable/chunks/0054wtysq8fzb.js", + "/_next/static/immutable/chunks/turbopack-28ai2_jllfh8-.js", + "/_next/static/immutable/chunks/0i859yszrkgyj.js", + "/_next/static/immutable/chunks/1wgetbk593r3u.js", + "/_next/static/immutable/chunks/0xr20htdse750.js", + "/_next/static/immutable/chunks/2q6evjwm-565v.js", + "/_next/static/immutable/chunks/03tlktyezhjzn.js", + "/_next/static/immutable/chunks/3tjkbjubln401.js", + "/_next/static/immutable/chunks/31-nbgnf9-at-.js", + "/_next/static/immutable/chunks/01x3qp7ump0t2.js", + "/_next/static/immutable/chunks/0baxh_uvy08y0.js", + "/_next/static/immutable/chunks/265jqrnj_sahp.js", + "/_next/static/immutable/chunks/34yy1icmq77bf.js", + "/_next/static/immutable/chunks/28thuwzrr0-4e.js", + "/_next/static/immutable/chunks/129c-v7qioy0x.js", + "/_next/static/immutable/chunks/1npjnlmpgau1-.js", + "/_next/static/immutable/chunks/054mg88l8nsxz.js", + "/_next/static/immutable/chunks/08-2z2q327yoe.js", + "/_next/static/immutable/chunks/3ghbo23xfqxln.js", + "/_next/static/immutable/chunks/27t1k9gbdv-kl.js", + "/_next/static/immutable/chunks/10ltvkst6bqkj.js", + "/_next/static/immutable/chunks/3sv-0c283snkq.js", + "/_next/static/immutable/chunks/1vrqt3khylf8n.js", + "/_next/static/immutable/chunks/3x_9aixggxwuh.js", + "/_next/static/immutable/chunks/0tu3xo_rw3wrn.js", + "/_next/static/immutable/chunks/0mc3h9z2nl6zr.js", + "/_next/static/immutable/chunks/0tt598e1ge-sr.js", + "/_next/static/immutable/chunks/2jq633l1z15m9.js", + "/_next/static/immutable/chunks/0c0hxoamwjsbw.js", + "/_next/static/immutable/chunks/2g70aufap1-f8.js", + "/_next/static/immutable/chunks/1nsghbhhauaho.js", + "/e25c61660ad7a6b3/script.js", + "/71950797d2e37b8a/script.js", + "/_next/static/immutable/chunks/1tdje48s1kajw.js", + "/_next/static/immutable/chunks/2-xqimcgwub_v.js", + "/_next/static/immutable/chunks/1ntdvmqs8p-t_.js", + "/_next/static/immutable/chunks/3iu54z1nc8mj4.js", + "/_next/static/immutable/chunks/1nuffzjrsduma.js", + "/_next/static/immutable/chunks/2i5lms-5revhe.js", + "/_next/static/immutable/chunks/22qqnjfzopqka.js", + "/_next/static/immutable/chunks/2tjzl8o6ktahp.js", + "/_next/static/immutable/chunks/0jg2x6xshjnu7.js", + "/_next/static/immutable/chunks/1jbdzdv8l5f95.js", + "/_next/static/immutable/chunks/21b6wp3lwcjwc.js", + "/_next/static/immutable/chunks/2sxbblug_fed8.js", + "/_next/static/immutable/chunks/1zdgtgn8eistt.js", + "https://cdn.cr-relay.com/v1/site/f6dd8ada-7a97-4d9d-8ec4-9c2bff6cd234/signals.js", + "/_next/static/immutable/media/vercel-light.3_gxxexgi1nmy.svg", + "/_next/static/immutable/media/vercel-dark.1f3cgy23m5_jy.svg", + "/_next/static/immutable/media/vercel-logotype-light.0k7echqflwha4.svg", + "/_next/static/immutable/media/vercel-logotype-dark.3m9ycmsc1ql8m.svg", + "/_next/static/immutable/media/logo-twitter-x-light.0dvkch_c5dvys.svg", + "/_next/static/immutable/media/logo-twitter-x-dark.1-i769nzu94hl.svg", + "/_next/static/immutable/media/logo-bluesky-light.2may7hm2y7g6v.svg", + "/_next/static/immutable/media/logo-bluesky-dark.39tbulfg2p-1z.svg", + "/_next/static/immutable/media/797e433ab948586e.p.1v5bejj26fx9h.woff2", + "/_next/static/immutable/media/Geist_Variable-s.p.2v-cf9syxr5ni.woff2", + "inline:#next-site-theme-storage-migration", + "inline:#theme-script", + "inline:#next-site-2026-redesign", + "inline:#_R_", + "inline:#prefetch-zones-links", + "inline:#script-common-room-analytics", + "https://nextjs.org/_next/static/immutable/media/797e433ab948586e.p.1v5bejj26fx9h.woff2", + "https://nextjs.org/_next/static/immutable/media/Geist_Variable-s.p.2v-cf9syxr5ni.woff2", + "https://nextjs.org/_next/static/immutable/media/nextjs-logotype-light.00-_80jv8_dct.svg", + "https://nextjs.org/_next/static/immutable/media/nextjs-logotype-dark.3h4a2z2v_dkod.svg", + "https://nextjs.org/_next/static/immutable/media/eve-light.1e3bxs4ejw62x.svg", + "https://nextjs.org/_next/static/immutable/media/eve-dark.2l_s1mlvozam3.svg", + "https://nextjs.org/_next/static/immutable/media/logo-github-dark.1k-70sin_m3qn.svg", + "https://nextjs.org/_next/static/immutable/media/logo-github-light.3dl3lqjq1azpp.svg", + "https://nextjs.org/_next/static/immutable/media/vercel-dark.1f3cgy23m5_jy.svg", + "https://nextjs.org/_next/static/immutable/media/vercel-light.3_gxxexgi1nmy.svg", + "https://nextjs.org/_next/static/immutable/media/vercel-logotype-light.0k7echqflwha4.svg", + "https://nextjs.org/_next/static/immutable/media/vercel-logotype-dark.3m9ycmsc1ql8m.svg", + "https://nextjs.org/_next/static/immutable/media/logo-twitter-x-dark.1-i769nzu94hl.svg", + "https://nextjs.org/_next/static/immutable/media/logo-bluesky-dark.39tbulfg2p-1z.svg", + "https://nextjs.org/_next/static/immutable/media/logo-twitter-x-light.0dvkch_c5dvys.svg", + "https://nextjs.org/_next/static/immutable/media/logo-bluesky-light.2may7hm2y7g6v.svg", + "https://nextjs.org/_next/static/immutable/chunks/1qmnr-4e2b1cz.css", + "https://nextjs.org/_next/static/immutable/chunks/2lra4q96-7lip.css", + "https://nextjs.org/_next/static/immutable/chunks/1ebr478erxmtw.css", + "https://nextjs.org/_next/static/immutable/chunks/3spci--kp_o0c.css", + "https://nextjs.org/_next/static/immutable/chunks/2feic8vb1xod6.css", + "https://nextjs.org/_next/static/immutable/chunks/0hmtujug_wj7h.js", + "https://nextjs.org/_next/static/immutable/chunks/0054wtysq8fzb.js", + "https://nextjs.org/_next/static/immutable/chunks/1zdgtgn8eistt.js", + "https://nextjs.org/_next/static/immutable/chunks/07kwstrqobzdq.js", + "https://nextjs.org/_next/static/immutable/chunks/1rm-wvc_n028a.js", + "https://nextjs.org/_next/static/immutable/chunks/0i859yszrkgyj.js", + "https://nextjs.org/_next/static/immutable/chunks/turbopack-28ai2_jllfh8-.js", + "https://nextjs.org/_next/static/immutable/chunks/1wgetbk593r3u.js", + "https://nextjs.org/_next/static/immutable/chunks/0xr20htdse750.js", + "https://nextjs.org/_next/static/immutable/chunks/2q6evjwm-565v.js", + "https://nextjs.org/_next/static/immutable/chunks/03tlktyezhjzn.js", + "https://nextjs.org/_next/static/immutable/chunks/3tjkbjubln401.js", + "https://nextjs.org/_next/static/immutable/chunks/01x3qp7ump0t2.js", + "https://nextjs.org/_next/static/immutable/chunks/31-nbgnf9-at-.js", + "https://nextjs.org/_next/static/immutable/chunks/0baxh_uvy08y0.js", + "https://nextjs.org/_next/static/immutable/chunks/265jqrnj_sahp.js", + "https://nextjs.org/_next/static/immutable/chunks/34yy1icmq77bf.js", + "https://nextjs.org/_next/static/immutable/chunks/129c-v7qioy0x.js", + "https://nextjs.org/_next/static/immutable/chunks/28thuwzrr0-4e.js", + "https://nextjs.org/_next/static/immutable/chunks/1npjnlmpgau1-.js", + "https://nextjs.org/_next/static/immutable/chunks/08-2z2q327yoe.js", + "https://nextjs.org/_next/static/immutable/chunks/054mg88l8nsxz.js", + "https://nextjs.org/_next/static/immutable/chunks/3ghbo23xfqxln.js", + "https://nextjs.org/_next/static/immutable/chunks/10ltvkst6bqkj.js", + "https://nextjs.org/_next/static/immutable/chunks/3sv-0c283snkq.js", + "https://nextjs.org/_next/static/immutable/chunks/27t1k9gbdv-kl.js", + "https://nextjs.org/_next/static/immutable/chunks/1vrqt3khylf8n.js", + "https://nextjs.org/_next/static/immutable/chunks/3x_9aixggxwuh.js", + "https://nextjs.org/_next/static/immutable/chunks/0tt598e1ge-sr.js", + "https://nextjs.org/_next/static/immutable/chunks/0mc3h9z2nl6zr.js", + "https://nextjs.org/_next/static/immutable/chunks/2jq633l1z15m9.js", + "https://nextjs.org/_next/static/immutable/chunks/0tu3xo_rw3wrn.js", + "https://nextjs.org/_next/image", + "https://nextjs.org/icons/swc.svg?dpl=dpl_4eTAGcnhBNHN7GCKiTq8XwCGgEDX", + "https://nextjs.org/favicon.ico", + "https://nextjs.org/_next/static/immutable/chunks/2g70aufap1-f8.js", + "https://nextjs.org/_next/static/immutable/chunks/1nsghbhhauaho.js", + "https://nextjs.org/api/get-session", + "https://nextjs.org/api/show-consent-banner", + "https://nextjs.org/e25c61660ad7a6b3/script.js", + "https://nextjs.org/71950797d2e37b8a/script.js", + "https://nextjs.org/showcase", + "https://nextjs.org/docs", + "https://nextjs.org/blog", + "https://nextjs.org/learn", + "https://nextjs.org/api/stream/internal", + "https://nextjs.org/docs/app/getting-started/server-and-client-components", + "https://nextjs.org/docs/app/getting-started/images", + "https://nextjs.org/docs/app/getting-started/fetching-data", + "https://api.cr-relay.com/v1/site/f6dd8ada-7a97-4d9d-8ec4-9c2bff6cd234/batch", + "https://nextjs.org/_next/static/immutable/chunks/1tdje48s1kajw.js", + "https://nextjs.org/_next/static/immutable/chunks/2-xqimcgwub_v.js", + "https://nextjs.org/_next/static/immutable/chunks/1ntdvmqs8p-t_.js", + "https://nextjs.org/_next/static/immutable/chunks/3iu54z1nc8mj4.js", + "https://nextjs.org/_next/static/immutable/chunks/1nuffzjrsduma.js", + "https://nextjs.org/_next/static/immutable/chunks/2i5lms-5revhe.js", + "https://nextjs.org/_next/static/immutable/chunks/22qqnjfzopqka.js", + "https://nextjs.org/_next/static/immutable/chunks/2tjzl8o6ktahp.js", + "https://nextjs.org/_next/static/immutable/chunks/0jg2x6xshjnu7.js", + "https://nextjs.org/_next/static/immutable/chunks/1jbdzdv8l5f95.js", + "https://nextjs.org/_next/static/immutable/chunks/21b6wp3lwcjwc.js", + "https://nextjs.org/_next/static/immutable/chunks/2sxbblug_fed8.js" + ], + "stylesheets": [ + "/_next/static/immutable/chunks/1qmnr-4e2b1cz.css", + "/_next/static/immutable/chunks/1ebr478erxmtw.css", + "/_next/static/immutable/chunks/2lra4q96-7lip.css", + "/_next/static/immutable/chunks/3spci--kp_o0c.css", + "/_next/static/immutable/chunks/2feic8vb1xod6.css" + ], + "cookies": [ + "signals-sdk-user-id", + "signals-sdk-session-id" + ], + "metas": [], + "inlineSamples": [ + "(globalThis[\"TURBOPACK\"] || (globalThis[\"TURBOPACK\"] = [])).push({\"otherChunks\":[\"static/immutable/chunks/1zdgtgn8eistt.js\",\"static/immutable/", + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:\\\"/_next/static/immutable/chunks/0i859yszrkgyj.js\\\"\\n3:\\\"static/immutable/chunks/0ju", + "self.__next_f.push([1,\"off2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/3spci--k", + "self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"home\\\",\\\"none\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"t\\\":{\\\"t\\\":{\\\"s\\\":\\\"\\\",\\\"h\\\":16402,\\\"d\\\"", + "self.__next_f.push([1,\"4c:I[765656,[[\\\"$2\\\",[\\\"$3\\\",\\\"$4\\\"],[14528,8145]],\\\"$5\\\",[\\\"$6\\\",[\\\"$7\\\",\\\"$8\\\"],[12719,8316]],\\\"$9\\\",\\\"$a\\\",", + "self.__next_f.push([1,\"35298,[[\\\"$2\\\",[\\\"$3\\\",\\\"$4\\\"],[14528,8145]],\\\"$5\\\",[\\\"$6\\\",[\\\"$7\\\",\\\"$8\\\"],[12719,8316]],\\\"$9\\\",\\\"$a\\\",[\\\"$b\\", + "self.__next_f.push([1,\"\\\"$b\\\",[\\\"$c\\\",\\\"$d\\\"],[12604,13329]],\\\"$e\\\",\\\"$f\\\",[\\\"$10\\\",[\\\"$11\\\",\\\"$12\\\"],[11899,28223]],\\\"$13\\\",\\\"$14\\\",", + "self.__next_f.push([1,\"35:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"mr-4 flex flex-row items-center justify-end gap-2\\\",\\\"children\\\":[[\\\"$", + "self.__next_f.push([1,\"36:[\\\"$\\\",\\\"$L52\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefi", + "self.__next_f.push([1,\"39:[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/", + "self.__next_f.push([1,\"3c:[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L52\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":", + "self.__next_f.push([1,\"77:\\\"ExternalFooterLink\\\"\\n78:I[797252,[[\\\"$2\\\",[\\\"$3\\\",\\\"$4\\\"],[14528,8145]],\\\"$5\\\",[\\\"$6\\\",[\\\"$7\\\",\\\"$8\\\"],[", + "self.__next_f.push([1,\"67:[\\\"$\\\",\\\"footer\\\",null,{\\\"className\\\":\\\"rV1DKq_footer\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"", + "self.__next_f.push([1,\"68:[\\\"$\\\",\\\"div\\\",null,{\\\"data-next-site-shell\\\":\\\"2026\\\",\\\"children\\\":[\\\"$\\\",\\\"footer\\\",null,{\\\"className\\\":\\" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "next": { + "present": true, + "version": "16.4.0-canary.38" + } + } +} diff --git a/tests/corpus/nuxt.com.json b/tests/corpus/nuxt.com.json new file mode 100644 index 0000000..777dfee --- /dev/null +++ b/tests/corpus/nuxt.com.json @@ -0,0 +1,472 @@ +{ + "host": "nuxt.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nuxt", + "vue" + ] + }, + "snapshot": [ + "import-map:low", + "nuxt:high", + "tailwind:high", + "vue:high@3.5.42" + ], + "signals": { + "url": "https://nuxt.com/", + "scripts": [ + "/_nuxt/DwRhOILB.js", + "/f771ed1f69e3eb32/script.js", + "/9149e8baebe0316c/script.js", + "/_payload.json", + "/_nuxt/d3-9UE9l.js", + "/_nuxt/CrzdsfCC.js", + "/_nuxt/DAsAa_tn.js", + "/_nuxt/cBkslAlP.js", + "/_nuxt/C0FnF6B9.js", + "/_nuxt/Dq_nRP9S.js", + "/_nuxt/0cZM9QsX.js", + "/_nuxt/BW3xJdEx.js", + "/_nuxt/Cxsvdx_1.js", + "/_nuxt/CpVwzX98.js", + "/_nuxt/CQlx9PXd.js", + "/_nuxt/BnDTbt6S.js", + "/_nuxt/CKTlehgz.js", + "/_nuxt/D_i6hQvW.js", + "/_nuxt/CQsrG9ph.js", + "/_nuxt/Dmgxhsqi.js", + "/_nuxt/BtWapnZP.js", + "/_nuxt/D9EZMbcz.js", + "/_nuxt/nCSBlLZY.js", + "/_nuxt/BMhNs0AD.js", + "/_nuxt/HclGiUj8.js", + "/_nuxt/B_cM9Hbj.js", + "/_nuxt/CqJxMmej.js", + "/_nuxt/C6ryUSPL.js", + "/_nuxt/BnldFFi-.js", + "/_nuxt/CVRxOMx3.js", + "/_nuxt/BpmBLlyC.js", + "/_nuxt/BIdGceZj.js", + "/_nuxt/DAjHJdlh.js", + "/_nuxt/CXhImJbP.js", + "/_nuxt/Cix4gbzw.js", + "/_nuxt/CFYkO_XE.js", + "/_nuxt/CnPVAVlT.js", + "/_nuxt/DWEoD8ZB.js", + "/_nuxt/DHihWhf5.js", + "/_nuxt/AOjdaKbT.js", + "/_nuxt/DvqH2sPM.js", + "/_nuxt/CIN62KNi.js", + "/_nuxt/Bng2rRDf.js", + "/_nuxt/CEyf8VOC.js", + "/_nuxt/CZ3QQ8tD.js", + "/_nuxt/Ci92mFch.js", + "/_nuxt/B64_52gN.js", + "/_nuxt/mGQkIvlc.js", + "/_nuxt/wa5duaa8.js", + "/_nuxt/DE3yNu3Y.js", + "/_nuxt/a-HwboiM.js", + "/_nuxt/BzkteQ9V.js", + "/_nuxt/DQOwoDDP.js", + "/_nuxt/XB261X7e.js", + "/_nuxt/XcIg1OkW.js", + "/_nuxt/mSsFiBln.js", + "/_nuxt/DfEhFBNt.js", + "/_nuxt/CtuRuvk5.js", + "/_nuxt/BbowbLEj.js", + "/_nuxt/gkrk6J0-.js", + "/_nuxt/Ce9at0nG.js", + "/_nuxt/nQ2AS6CX.js", + "/_nuxt/DF-xic5P.js", + "/_nuxt/CBpOLbLE.js", + "/_nuxt/DwuEGuwN.js", + "/_nuxt/DCiYDsnA.js", + "/_nuxt/BJ7Q09fV.js", + "/_nuxt/KaDbVvJt.js", + "/_nuxt/BecSszmX.js", + "/_nuxt/D5oBmhl4.js", + "/_nuxt/Ba9CAp9p.js", + "/_nuxt/DRLboRIe.js", + "/_nuxt/B6X9qTJo.js", + "/_nuxt/enxizZqn.js", + "/_nuxt/sRB7BIq0.js", + "/_nuxt/CmfMHotj.js", + "/_nuxt/BfU6u6Ws.js", + "/_nuxt/B8XplnJ2.js", + "/_nuxt/LczgkNfS.js", + "/_nuxt/COSteh3o.js", + "/_nuxt/BNDglzQR.js", + "/_nuxt/BPMAKiq9.js", + "/_nuxt/3CN7-0Fx.js", + "/_nuxt/DN9E4A0U.js", + "/_nuxt/C-CjdlPX.js", + "/_nuxt/CSiJqca5.js", + "/_nuxt/2lngBEtA.js", + "/_nuxt/YqBQ3Xhs.js", + "/_nuxt/DR-nxSLa.js", + "/_nuxt/Dgpu0fCp.js", + "/_nuxt/CXlW_eiZ.js", + "/_nuxt/BgtS1rly.js", + "/_nuxt/MhW4rcIA.js", + "/_nuxt/DVJLo81D.js", + "/_nuxt/CAwtU1zm.js", + "/_nuxt/DjWRKHPk.js", + "/_nuxt/d1T09V18.js", + "/_nuxt/MG7db_7I.js", + "/_nuxt/CryDTdge.js", + "/_nuxt/BYnqmj2-.js", + "/_nuxt/BDNMzG2s.js", + "/_nuxt/DRNjKdT2.js", + "/_nuxt/BxUkchCz.js", + "/_nuxt/DCE1hn0x.js", + "/_nuxt/6XOzcWUu.js", + "/_nuxt/Clp0rZ4K.js", + "/_nuxt/C3HrmkC5.js", + "/_nuxt/BDTilmGV.js", + "/_nuxt/Fro400Dn.js", + "/_nuxt/BIj2I_Em.js", + "/_nuxt/B7D9HwuG.js", + "/_nuxt/CQwOICUY.js", + "/_nuxt/C24PyzOh.js", + "/_nuxt/C8NlM8I4.js", + "/_nuxt/KHmiGbx8.js", + "/_nuxt/B_tAr1Bb.js", + "/_nuxt/Dckw3OD4.js", + "/_nuxt/Bi5PNb5C.js", + "/_nuxt/DeBT_AGb.js", + "/_nuxt/DM5QL65m.js", + "/_nuxt/BhE_VjgF.js", + "/_nuxt/tWe4N527.js", + "/_nuxt/BXiGtD66.js", + "/_nuxt/YLh3U462.js", + "/_nuxt/NyMsFSki.js", + "/_nuxt/-UGu5WZd.js", + "/_nuxt/C1q15KBv.js", + "/_nuxt/TbSyWuTy.js", + "/_nuxt/0K6Znzx6.js", + "/_nuxt/CNs_Ozdc.js", + "/_nuxt/XM4XsOWq.js", + "/_nuxt/CORypR9W.js", + "/_nuxt/D8JhfsYS.js", + "/_nuxt/DXKN8kcK.js", + "/_nuxt/CG5Q1i4G.js", + "/_nuxt/CK2EpBj_.js", + "/_nuxt/h5f1cf4h.js", + "/_nuxt/BQEJOith.js", + "/_nuxt/B6Nb5Is0.js", + "/_nuxt/D6l74e18.js", + "/_nuxt/Buun87wE.js", + "/_nuxt/BkgP412j.js", + "/_nuxt/BU0u0zvh.js", + "/_nuxt/BwIY4sUQ.js", + "/_nuxt/BjFuZ09V.js", + "/_nuxt/D7mKGUrx.js", + "/_nuxt/LKkvGUvQ.js", + "/_nuxt/DrkmP6pN.js", + "/_nuxt/CgfmwuPm.js", + "/_nuxt/pLXNu4p-.js", + "/_nuxt/DA-tXOMT.js", + "/_nuxt/B4derpbu.js", + "/_nuxt/CSZv6E40.js", + "/_nuxt/B6MJ1oql.js", + "/_nuxt/iYmmyxKa.js", + "/_nuxt/BDi7JdoA.js", + "/_nuxt/C0cB3vY7.js", + "/_nuxt/DEygX9Ar.js", + "/_nuxt/DUed5Hwp.js", + "/_nuxt/DZZXXw5P.js", + "/_nuxt/Dz1w3n8c.js", + "/_nuxt/nGavkzOl.js", + "/_nuxt/DJnAxVm5.js", + "/_nuxt/CGHUGu5B.js", + "/_nuxt/Dcw9cw86.js", + "/_nuxt/BNbygDLP.js", + "/_nuxt/BhaOuLEJ.js", + "/_nuxt/3G0Dyo3r.js", + "/_nuxt/Df4uY-Wg.js", + "/_nuxt/Cbs7Rtz8.js", + "/_nuxt/DF_rUYwk.js", + "/_nuxt/BJyrPTX7.js", + "/_nuxt/DpsuXstF.js", + "/_nuxt/DL_lcFBV.js", + "/_nuxt/D--L6aw_.js", + "/_nuxt/B_RuZhrf.js", + "/_nuxt/CybEeZuZ.js", + "/_nuxt/CcCHFEzL.js", + "/_nuxt/DxTD9ER4.js", + "/_nuxt/CY4utgz_.js", + "/_nuxt/CX9N6gVP.js", + "/_nuxt/BgcOMmsF.js", + "https://nuxt.com/_nuxt/BDY2h6PI.js", + "https://nuxt.com/_nuxt/DJgnUu0q.js", + "https://nuxt.com/_nuxt/YlPhriwu.js", + "https://nuxt.com/_nuxt/C2nbKgTo.js", + "https://nuxt.com/_nuxt/CnUG_nvn.js", + "https://nuxt.com/_nuxt/C6eUm9M4.js", + "https://nuxt.com/_nuxt/B1RrQYHj.js", + "https://nuxt.com/_nuxt/C8xpNMEL.js", + "https://nuxt.com/_nuxt/DjJ9loBa.js", + "https://nuxt.com/_nuxt/DLJk2raQ.js", + "https://nuxt.com/_nuxt/CNSk_vuJ.js", + "https://nuxt.com/_nuxt/EtFumRDe.js", + "inline:#__NUXT_DATA__", + "https://nuxt.com/_nuxt/entry.9Fea5q0j.css", + "https://nuxt.com/_nuxt/AgentNuxiIcon.CWc0ZLtP.css", + "https://nuxt.com/_nuxt/ModuleItem.DQ69ijok.css", + "https://nuxt.com/_payload.json", + "https://nuxt.com/_nuxt/d3-9UE9l.js", + "https://nuxt.com/_nuxt/DwRhOILB.js", + "https://nuxt.com/_nuxt/DAsAa_tn.js", + "https://nuxt.com/_nuxt/CrzdsfCC.js", + "https://nuxt.com/_nuxt/cBkslAlP.js", + "https://nuxt.com/_nuxt/Dq_nRP9S.js", + "https://nuxt.com/_nuxt/C0FnF6B9.js", + "https://nuxt.com/_nuxt/0cZM9QsX.js", + "https://nuxt.com/_nuxt/BW3xJdEx.js", + "https://nuxt.com/_nuxt/Cxsvdx_1.js", + "https://nuxt.com/_nuxt/CpVwzX98.js", + "https://nuxt.com/_nuxt/CQlx9PXd.js", + "https://nuxt.com/_nuxt/BnDTbt6S.js", + "https://nuxt.com/_nuxt/CKTlehgz.js", + "https://nuxt.com/_nuxt/CQsrG9ph.js", + "https://nuxt.com/_nuxt/D_i6hQvW.js", + "https://nuxt.com/_nuxt/Dmgxhsqi.js", + "https://nuxt.com/_nuxt/BtWapnZP.js", + "https://nuxt.com/_nuxt/D9EZMbcz.js", + "https://nuxt.com/_nuxt/BMhNs0AD.js", + "https://nuxt.com/_nuxt/nCSBlLZY.js", + "https://nuxt.com/_nuxt/HclGiUj8.js", + "https://nuxt.com/_nuxt/B_cM9Hbj.js", + "https://nuxt.com/_nuxt/C6ryUSPL.js", + "https://nuxt.com/_nuxt/CqJxMmej.js", + "https://nuxt.com/_nuxt/BnldFFi-.js", + "https://nuxt.com/_nuxt/BpmBLlyC.js", + "https://nuxt.com/_nuxt/CVRxOMx3.js", + "https://nuxt.com/_nuxt/BIdGceZj.js", + "https://nuxt.com/_nuxt/DAjHJdlh.js", + "https://nuxt.com/_nuxt/CXhImJbP.js", + "https://nuxt.com/_nuxt/Cix4gbzw.js", + "https://nuxt.com/_nuxt/CFYkO_XE.js", + "https://nuxt.com/_nuxt/DWEoD8ZB.js", + "https://nuxt.com/_nuxt/CnPVAVlT.js", + "https://nuxt.com/_nuxt/DHihWhf5.js", + "https://nuxt.com/_nuxt/AOjdaKbT.js", + "https://nuxt.com/_nuxt/DvqH2sPM.js", + "https://nuxt.com/_nuxt/Bng2rRDf.js", + "https://nuxt.com/_nuxt/CIN62KNi.js", + "https://nuxt.com/_nuxt/CEyf8VOC.js", + "https://nuxt.com/_nuxt/CZ3QQ8tD.js", + "https://nuxt.com/_nuxt/mGQkIvlc.js", + "https://nuxt.com/_nuxt/B64_52gN.js", + "https://nuxt.com/_nuxt/Ci92mFch.js", + "https://nuxt.com/_nuxt/wa5duaa8.js", + "https://nuxt.com/_nuxt/DQOwoDDP.js", + "https://nuxt.com/_nuxt/BzkteQ9V.js", + "https://nuxt.com/_nuxt/DE3yNu3Y.js", + "https://nuxt.com/_nuxt/a-HwboiM.js", + "https://nuxt.com/_nuxt/XcIg1OkW.js", + "https://nuxt.com/_nuxt/XB261X7e.js", + "https://nuxt.com/_nuxt/DfEhFBNt.js", + "https://nuxt.com/_nuxt/mSsFiBln.js", + "https://nuxt.com/_nuxt/CtuRuvk5.js", + "https://nuxt.com/_nuxt/BbowbLEj.js", + "https://nuxt.com/_nuxt/gkrk6J0-.js", + "https://nuxt.com/_nuxt/DF-xic5P.js", + "https://nuxt.com/_nuxt/nQ2AS6CX.js", + "https://nuxt.com/_nuxt/Ce9at0nG.js", + "https://nuxt.com/_nuxt/CBpOLbLE.js", + "https://nuxt.com/_nuxt/DwuEGuwN.js", + "https://nuxt.com/_nuxt/DCiYDsnA.js", + "https://nuxt.com/_nuxt/BJ7Q09fV.js", + "https://nuxt.com/_nuxt/KaDbVvJt.js", + "https://nuxt.com/_nuxt/D5oBmhl4.js", + "https://nuxt.com/_nuxt/BecSszmX.js", + "https://nuxt.com/_nuxt/Ba9CAp9p.js", + "https://nuxt.com/_nuxt/DRLboRIe.js", + "https://nuxt.com/_nuxt/B6X9qTJo.js", + "https://nuxt.com/_nuxt/CmfMHotj.js", + "https://nuxt.com/_nuxt/enxizZqn.js", + "https://nuxt.com/_nuxt/sRB7BIq0.js", + "https://nuxt.com/_nuxt/BfU6u6Ws.js", + "https://nuxt.com/_nuxt/BNDglzQR.js", + "https://nuxt.com/_nuxt/LczgkNfS.js", + "https://nuxt.com/_nuxt/B8XplnJ2.js", + "https://nuxt.com/_nuxt/COSteh3o.js", + "https://nuxt.com/_nuxt/3CN7-0Fx.js", + "https://nuxt.com/_nuxt/BPMAKiq9.js", + "https://nuxt.com/_nuxt/DN9E4A0U.js", + "https://nuxt.com/_nuxt/C-CjdlPX.js", + "https://nuxt.com/_nuxt/CSiJqca5.js", + "https://nuxt.com/_nuxt/2lngBEtA.js", + "https://nuxt.com/_nuxt/YqBQ3Xhs.js", + "https://nuxt.com/_nuxt/BgtS1rly.js", + "https://nuxt.com/_nuxt/Dgpu0fCp.js", + "https://nuxt.com/_nuxt/CXlW_eiZ.js", + "https://nuxt.com/_nuxt/DR-nxSLa.js", + "https://nuxt.com/_nuxt/MhW4rcIA.js", + "https://nuxt.com/_nuxt/DVJLo81D.js", + "https://nuxt.com/_nuxt/CAwtU1zm.js", + "https://nuxt.com/_nuxt/DjWRKHPk.js", + "https://nuxt.com/_nuxt/d1T09V18.js", + "https://nuxt.com/_nuxt/MG7db_7I.js", + "https://nuxt.com/_nuxt/CryDTdge.js", + "https://nuxt.com/_nuxt/BDNMzG2s.js", + "https://nuxt.com/_nuxt/DRNjKdT2.js", + "https://nuxt.com/_nuxt/BxUkchCz.js", + "https://nuxt.com/_nuxt/BYnqmj2-.js", + "https://nuxt.com/_nuxt/DCE1hn0x.js", + "https://nuxt.com/_nuxt/6XOzcWUu.js", + "https://nuxt.com/_nuxt/C3HrmkC5.js", + "https://nuxt.com/_nuxt/Clp0rZ4K.js", + "https://nuxt.com/_nuxt/BDTilmGV.js", + "https://nuxt.com/_nuxt/Fro400Dn.js", + "https://nuxt.com/_nuxt/CQwOICUY.js", + "https://nuxt.com/_nuxt/B7D9HwuG.js", + "https://nuxt.com/_nuxt/BIj2I_Em.js", + "https://nuxt.com/_nuxt/C24PyzOh.js", + "https://nuxt.com/_nuxt/C8NlM8I4.js", + "https://nuxt.com/_nuxt/KHmiGbx8.js", + "https://nuxt.com/_nuxt/B_tAr1Bb.js", + "https://nuxt.com/_nuxt/Dckw3OD4.js", + "https://nuxt.com/_nuxt/Bi5PNb5C.js", + "https://nuxt.com/_nuxt/DeBT_AGb.js", + "https://nuxt.com/_nuxt/DM5QL65m.js", + "https://nuxt.com/_nuxt/BhE_VjgF.js", + "https://nuxt.com/_nuxt/tWe4N527.js", + "https://nuxt.com/_nuxt/BXiGtD66.js", + "https://nuxt.com/_nuxt/YLh3U462.js", + "https://nuxt.com/_nuxt/NyMsFSki.js", + "https://nuxt.com/_nuxt/C1q15KBv.js", + "https://nuxt.com/_nuxt/-UGu5WZd.js", + "https://nuxt.com/_nuxt/TbSyWuTy.js", + "https://nuxt.com/_nuxt/0K6Znzx6.js", + "https://nuxt.com/_nuxt/CNs_Ozdc.js", + "https://nuxt.com/_nuxt/XM4XsOWq.js", + "https://nuxt.com/_nuxt/CORypR9W.js", + "https://nuxt.com/_nuxt/DXKN8kcK.js", + "https://nuxt.com/_nuxt/D8JhfsYS.js", + "https://nuxt.com/_nuxt/CG5Q1i4G.js", + "https://nuxt.com/_nuxt/CK2EpBj_.js", + "https://nuxt.com/_nuxt/BQEJOith.js", + "https://nuxt.com/_nuxt/h5f1cf4h.js", + "https://nuxt.com/_nuxt/D6l74e18.js", + "https://nuxt.com/_nuxt/B6Nb5Is0.js", + "https://nuxt.com/_nuxt/Buun87wE.js", + "https://nuxt.com/_nuxt/BkgP412j.js", + "https://nuxt.com/_nuxt/BU0u0zvh.js", + "https://nuxt.com/_nuxt/BwIY4sUQ.js", + "https://nuxt.com/_nuxt/D7mKGUrx.js", + "https://nuxt.com/_nuxt/BjFuZ09V.js", + "https://raw.githubusercontent.com/nuxt/modules/main/icons/nuxt.svg", + "https://nuxt.com/_nuxt/LKkvGUvQ.js", + "https://nuxt.com/_nuxt/CgfmwuPm.js", + "https://nuxt.com/_nuxt/DrkmP6pN.js", + "https://nuxt.com/_nuxt/pLXNu4p-.js", + "https://nuxt.com/_nuxt/B4derpbu.js", + "https://nuxt.com/_nuxt/CSZv6E40.js", + "https://nuxt.com/_nuxt/DA-tXOMT.js", + "https://nuxt.com/_nuxt/B6MJ1oql.js", + "https://nuxt.com/_nuxt/iYmmyxKa.js", + "https://nuxt.com/_nuxt/DEygX9Ar.js", + "https://nuxt.com/_nuxt/DUed5Hwp.js", + "https://nuxt.com/_nuxt/C0cB3vY7.js", + "https://nuxt.com/_nuxt/BDi7JdoA.js", + "https://nuxt.com/_nuxt/DZZXXw5P.js", + "https://nuxt.com/_nuxt/Dz1w3n8c.js", + "https://nuxt.com/_nuxt/nGavkzOl.js", + "https://nuxt.com/_nuxt/CGHUGu5B.js", + "https://nuxt.com/_nuxt/DJnAxVm5.js", + "https://nuxt.com/_nuxt/Dcw9cw86.js", + "https://nuxt.com/_nuxt/BhaOuLEJ.js", + "https://nuxt.com/_nuxt/BNbygDLP.js", + "https://nuxt.com/_nuxt/DF_rUYwk.js", + "https://nuxt.com/_nuxt/3G0Dyo3r.js", + "https://nuxt.com/_nuxt/Df4uY-Wg.js", + "https://nuxt.com/_nuxt/Cbs7Rtz8.js", + "https://nuxt.com/_nuxt/DpsuXstF.js", + "https://nuxt.com/_nuxt/BJyrPTX7.js", + "https://nuxt.com/_nuxt/CybEeZuZ.js", + "https://nuxt.com/_nuxt/B_RuZhrf.js", + "https://nuxt.com/_nuxt/DL_lcFBV.js", + "https://nuxt.com/_nuxt/D--L6aw_.js", + "https://nuxt.com/_nuxt/CcCHFEzL.js", + "https://nuxt.com/_nuxt/DxTD9ER4.js", + "https://nuxt.com/_nuxt/CY4utgz_.js", + "https://nuxt.com/_nuxt/BgcOMmsF.js", + "https://nuxt.com/_nuxt/CX9N6gVP.js", + "https://nuxt.com/_fonts/GsKUclqeNLJ96g5AU593ug6yanivOiwjW_7zESNPChw-jHA4tBeM1bjF7LATGUpfBuSTyomIFrWBTzjF7txVYfg.woff2", + "https://ipx.nuxt.com/s_152x16/assets/brands/dark/louis-vuitton.svg", + "https://ipx.nuxt.com/s_93x28/assets/brands/dark/dassault-systemes.svg", + "https://ipx.nuxt.com/s_55x28/assets/brands/dark/blizzard.svg", + "https://ipx.nuxt.com/s_136x28/assets/brands/dark/caudalie.svg", + "https://ipx.nuxt.com/s_144x26/assets/brands/dark/paul-smith.svg", + "https://ipx.nuxt.com/s_161x18/assets/brands/dark/backmarket.svg", + "https://ipx.nuxt.com/s_51x40/assets/brands/dark/deutsche-bahn.svg", + "https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/yyx990803", + "https://ipx.nuxt.com/s_67x23/assets/brands/dark/vans.svg", + "https://nuxt.com/_nuxt/pages.yfjhJEBK.css", + "https://nuxt.com/f771ed1f69e3eb32/script.js", + "https://nuxt.com/api/agent/usage", + "https://nuxt.com/icon.png", + "https://nuxt.com/api/v1/modules/health", + "https://nuxt.com/_nuxt/CWekWdDr.js", + "https://nuxt.com/_nuxt/BLHRTFth.js", + "https://nuxt.com/api/contributors", + "https://nuxt.com/api/_auth/session", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/benjamincanac", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/danielroe", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/pi0", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/harlan-zw", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/rchl", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/BobbieGoede", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/farnabaz", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/TheAlexLichter", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/clarkdo", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/HugoRCD", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/huang-julien", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/onmax", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/larbish", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/ricardogobbosouza", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/antfu", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/maximepvrt", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/smarroufin", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/clemcode", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/kazupon", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/Baroshem", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/pimlie", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/Tahul", + "https://ipx.nuxt.com/f_auto&s_80x80/gh_avatar/debs-obrien" + ], + "stylesheets": [ + "/_nuxt/entry.9Fea5q0j.css", + "/_nuxt/AgentNuxiIcon.CWc0ZLtP.css", + "/_nuxt/ModuleItem.DQ69ijok.css", + "https://nuxt.com/_nuxt/pages.yfjhJEBK.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "#__nuxt", + "script[type=\"importmap\"]", + "[data-v-]", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__VUE__": { + "present": true + }, + "__vue_app__": { + "present": true, + "version": "3.5.42" + } + } +} diff --git a/tests/corpus/razorpay.com.json b/tests/corpus/razorpay.com.json new file mode 100644 index 0000000..c539b12 --- /dev/null +++ b/tests/corpus/razorpay.com.json @@ -0,0 +1,285 @@ +{ + "host": "razorpay.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "framer", + "razorpay" + ] + }, + "snapshot": [ + "framer:high", + "google-analytics:high", + "react:high", + "segment:high", + "sentry:high@10.32.1", + "styled-components:high", + "webpack:high" + ], + "signals": { + "url": "https://razorpay.com/", + "scripts": [ + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://scripts.clarity.ms/0.8.72-beta/clarity.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://connect.facebook.net/signals/config/697927486977350", + "https://connect.facebook.net/en_US/fbevents.js", + "https://www.clarity.ms/tag/rypows4c4t", + "https://cdn.segment.com/next-integrations/integrations/vendor/commons.59560acdd69ed701c941.js.gz", + "https://cdn.segment.com/next-integrations/integrations/linkedin-insight-tag/1.0.1/linkedin-insight-tag.dynamic.js.gz", + "https://cdn.segment.com/next-integrations/integrations/facebook-pixel/2.11.5/facebook-pixel.dynamic.js.gz", + "https://cdn.segment.com/analytics.js/v1/YNK2Ge3yl0IaYj8PLndL5V6vfPZPQxZo/analytics.min.js", + "https://browser.sentry-cdn.com/10.32.1/bundle.tracing.min.js", + "https://www.googletagmanager.com/gtag/js", + "https://razorpay.com/build/analytics-sdk/analytics-sdk-min.js", + "https://razorpay.com/build/razor-analytics/razorAnalytics-1.min.js", + "https://razorpay.com/build/razor-analytics-plugins/razorAnalyticsPlugins-1.min.js", + "https://razorpay.com/build/razor-analytics/razorAnalyticsCore-1.min.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/928471290/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/349725439/", + "https://events.framer.com/script", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/script_main.enT80gJb.mjs", + "https://razorpay.com/build/razorAnalyticsFramer.js", + "https://accounts.razorpay.com/registersw.min.js", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/rolldown-runtime.Dh6celcD.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/react.Cv1PgA_G.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/framer.Z8zMISg-.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/motion.B1myRRUJ.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/zST-iqa32DzFkLoIlNsZHnU8VtPqSSCZsIRP_7JdJAk.cDCK9kSt.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/shared-lib.DysL0KsI.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/wsEpAt6tx.B2y6hvdX.mjs", + "https://framerusercontent.com/sites/4ejO0XSNntUWAG6MAFfjPp/zvtB7pP0cZOQQqkjBLcFVMJlpYRFtl0WNzgaw-7lnAk.ClAiWtkp.mjs", + "inline:#analytics-sdk-script", + "inline:#razorAnalyticsCore", + "inline:#__framer__appearAnimationsContent", + "inline:#__framer__breakpoints", + "https://framerusercontent.com/images/PgsePDHRiCD1q0DVjDWxvFhkQZ0.png", + "https://framerusercontent.com/images/2G9eJ6Jm2vAoH14bNQ0SLl8uow.webp", + "https://framerusercontent.com/images/nKNFP0ohnaUiL7ukr0zuBsnoU.png", + "https://framerusercontent.com/images/DLAzb4nnb07TfXrwvOc0UtME8.png", + "https://framerusercontent.com/images/YP8jogvJToMEAzQelSO7hKWo8.png", + "https://framerusercontent.com/images/deoBetaoEdkVH4ZWYRHVp64NPU.png", + "https://framerusercontent.com/images/RP8hGzmRZtwyGuEsAfA4S6ew.svg", + "https://framerusercontent.com/images/96R7VlBEnZsuWetDYK835OeP44.png", + "https://framerusercontent.com/images/COBl8AoJHIT0OeKMgtEUONygjGQ.png", + "https://framerusercontent.com/images/ZZtYh4STltZIZi3gfzHuQ1OhdQ.svg", + "https://framerusercontent.com/images/Tt7FnMoNeHIdTtey7SV87BVvWs.png", + "https://framerusercontent.com/images/FLUaQgn3Ij3g7iu7EIC3PGvhMtM.png", + "https://framerusercontent.com/images/kkOygtHRHYPv76o5PniXD7eNI.png", + "https://framerusercontent.com/images/yVmFSd5a1QZazkP2d9ZWXgGq6dQ.png", + "https://framerusercontent.com/images/DmPDF9LNyZX7WUc90CoCMxzzRq0.png", + "https://framerusercontent.com/images/QxwqIUwqDR01t1NZSflp78TR0M.png", + "https://framerusercontent.com/images/jZN3Op6rpMb9xc279dbIJ0k6RA.png", + "https://framerusercontent.com/images/0u2P7K4ba3Ynqv5HppyPCPqAvCc.png", + "https://framerusercontent.com/images/wbiGlgM3MnvENjxeAwDiWdOGWRA.png", + "https://framerusercontent.com/images/W6yZehljrdhvo2qamzJmm4Xco4.png", + "https://framerusercontent.com/images/11KSGbIZoRSg4pjdnUoif6MKHI.svg", + "https://framerusercontent.com/images/6tTbkXggWgQCAJ4DO2QEdXXmgM.svg", + "https://framerusercontent.com/images/NPDnVbSECnUgVeYr13xCEIcV1AY.png", + "https://framerusercontent.com/images/j4rDc87SgR0WwkSaXChAPH9E7WA.png", + "https://framerusercontent.com/images/l7yGjo1ft20Fs4a5z8zku19tiFs.png", + "https://framerusercontent.com/images/1wk1iydfklGTrezvr8pPUEo3FrI.png", + "https://framerusercontent.com/images/i9oyVaJCEJ0ROHc6jZ65w1t8w.png", + "https://framerusercontent.com/images/NFfRWUw84TZmKh6MoFdnwiECto.png", + "https://framerusercontent.com/images/Ezrg9qguT8eglECWyVqJNCsFAs.png", + "https://framerusercontent.com/images/LbC4A79oOdF0JoyajxluEfU6k.png", + "https://framerusercontent.com/images/QOgTerS9F9OFxOwAk7rdeO0pJqo.png", + "https://framerusercontent.com/images/zaPW2FCvnkD7Bor4GTcDpnoDWo.png", + "https://framerusercontent.com/images/GBCga1ptJ33O57Nl4hTAYUhkHU.png", + "https://framerusercontent.com/images/DaICki1qSQnwmkpLsl3KuKS7eg.png", + "https://framerusercontent.com/images/6W6KhhWMjx7iQqEGHFtzygwUf4.png", + "https://framerusercontent.com/images/Dfr5Wr5YRB4FzixGK904R3W0.png", + "https://framerusercontent.com/images/5vGTP14SNXAVOX2BlVQeQEQUbdQ.png", + "https://framerusercontent.com/images/vObQP9CoD4bZz7StLm9YcIqua4.png", + "https://framerusercontent.com/images/y0znmv7MccSmj9ud1PJlkTTkKBE.png", + "https://framerusercontent.com/images/Ilr3bxmQOETtoVodcxWBbTmfg.png", + "https://framerusercontent.com/images/55iR8oFabrdTQwSl50gQp89VR4s.png", + "https://framerusercontent.com/images/x2Zm6zi427C3aYm224pjFo5WA.png", + "https://framerusercontent.com/images/eRbK7nvzBDsqlgRNkf5r6Di74Jg.png", + "https://framerusercontent.com/images/qUCrOOO7SBU0kECZhKyz7sB7QW0.png", + "https://framerusercontent.com/images/ZgKCtHL42gXBtiKNkLwwfwuX86A.png", + "https://framerusercontent.com/images/Kpaei7xvI0Gsrl7QWvqr88dc7OE.png", + "https://framerusercontent.com/images/egC86fbaQscrcIrpuvuGJnEMJ8.png", + "https://framerusercontent.com/images/aFO8PmSrDButYhI8cb5WRNGitQ.png", + "https://framerusercontent.com/images/PzYQcqcos30Qy4f3PfwbxMw1c.webp", + "https://framerusercontent.com/images/WYoR9VIihk6GZ9yEWNgoXNHs.png", + "https://framerusercontent.com/images/44VRINrftjdawAz1x3MyW68RE7A.webp", + "https://framerusercontent.com/images/L8S7kzordShoTOQJLkFSCmGQdo.webp", + "https://framerusercontent.com/images/px2Ivi9AoSqishbe7cmcCohdyI.webp", + "https://framerusercontent.com/images/i6Rk3Tj2IBrWidVJdLRyL9GrbI.webp", + "https://framerusercontent.com/images/viB9thn4rAyZ9RGMXGy1lbvlWs.webp", + "https://framerusercontent.com/images/unQ58F9NWFHmeilZIvzkMhckA.webp", + "https://framerusercontent.com/images/H2K1Y0HXAs47zDQN1rIGTwRBfc0.webp", + "https://framerusercontent.com/images/JmFSeum96SLzvMFy0l45hm4J44M.webp", + "https://framerusercontent.com/assets/vQyevYAyHtARFwPqUzQGpnDs.woff2", + "https://framerusercontent.com/assets/W37bix7pCgc8hhC8tEyBk7RE.woff2", + "https://framerusercontent.com/assets/acCFRdEBz2aU6MYwDyiR0JNFNhk.woff2", + "https://app.framerstatic.com/Inter-SemiBold.latin-RDYY2AG2.woff2", + "https://framerusercontent.com/assets/d3tHnaQIAeqiE5hGcRw4mmgWYU.woff2", + "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVH4Cwpu-9g.woff2", + "https://framerusercontent.com/images/WvNwRAOOViBqZirtBHVBpckzBI.png", + "https://framerusercontent.com/images/Stuh1mhVR5ABsZEwJ3P51Wvj18.png", + "https://framerusercontent.com/images/jVbRihcBbLavZtJFP0JMQCEL9ic.webp", + "https://framerusercontent.com/images/qd98lZuLi52FscBpgZHR4wpo7o.png", + "https://framerusercontent.com/images/pbRh2b074Hl9VgZaU2DbJBPUvd8.png", + "https://framerusercontent.com/images/036jzVWfvZhwl9nVV1KRUONybE4.webp", + "https://framerusercontent.com/images/N6oNhwZ6wU8U0ZM7Y6yLYST2nMk.webp", + "https://framerusercontent.com/images/gF6dRqSGv3tALC2Ho0BPML4hgw.webp", + "https://framerusercontent.com/images/PO3jvnd7SsSrVTmlNhcBgaCbic.webp", + "https://framerusercontent.com/images/kBkn3kow2IEQLe8kETylFOwTY.webp", + "https://framerusercontent.com/images/fZzv5kzp6j1r6W6yYgbQ530SebA.webp", + "https://framerusercontent.com/images/pCtAHA6JYLh1WfQThvuzeqGmBu8.webp", + "https://framerusercontent.com/images/HVN5Z9E2UeeRhbtKNJWd7zbvY8g.png", + "https://fonts.gstatic.com/s/intertight/v9/NGSwv5HMAFg6IuGlBNMjxLsH8ag.woff2", + "https://framerusercontent.com/assets/DXD0Q7LSl7HEvDzucnyLnGBHM.woff2", + "https://framerusercontent.com/images/21lqn2bUVk3xwk14e3sAVQg6Dg.webp", + "https://framerusercontent.com/images/jLoaoKTt8qAyf3RYfz8FIg6VABI.webp", + "https://framerusercontent.com/images/li2btiNlQAMXTzmBcRilOxDZG2w.png", + "https://framerusercontent.com/images/nguCyTsXzRn1oiYfbPsDLuiPE.webp", + "https://framerusercontent.com/images/zxsmRt9QTBRl5eVJWxZEyboyqGs.png", + "https://framerusercontent.com/images/Fgp0tRiRuTiHJlFrn4MTk6pQIwE.webp", + "https://framerusercontent.com/images/F0S8NcWEDATsfQdfEGZIwuefDWc.png", + "https://framerusercontent.com/images/Khq9eyZHNJGfRPljQX651gCLX0M.png", + "https://framerusercontent.com/images/s6EsT93Ir5wn4URyWxCECgfjLY.webp", + "https://framerusercontent.com/images/Lb5NQWahsidlrtFSUyjN2NzoxZY.webp", + "https://framerusercontent.com/images/0fCXpOZ67Q4FUcGc7NAJ5EciA.webp", + "https://framerusercontent.com/images/CoS8IS9ytnA10aXHUL7lnDgTrQ.webp", + "https://framerusercontent.com/images/IlwTEKVwjhjqdI976686lueB4.webp", + "https://framerusercontent.com/images/tkprSYPLLUeDeSv1VWh0uGHPI.webp", + "https://framerusercontent.com/images/2HVesyQMPC8hgNwGd3m4wwx1Rn4.png", + "https://framerusercontent.com/images/2THjohsPEGL0S0f6WE6pRMdzp3o.png", + "https://framerusercontent.com/images/DpZqprixtgm7NrcMMQa5dIxgdw0.png", + "https://framerusercontent.com/images/lCVkCew0vf78hUPk6ShZiopzfk.png", + "https://framerusercontent.com/images/kysqFYZar2auXuCuRNXifiHezBI.png", + "https://framerusercontent.com/images/5tencj0jQwuaqh7lqMfxXDL3KZc.png", + "https://framerusercontent.com/images/k5UdVvwCfB0xBQ9CvoCFo8B8Nx4.png", + "https://framerusercontent.com/images/0TEFuXH3g6z7mdznP6jJWQlQ7A.webp", + "https://framerusercontent.com/images/NLUTOlvMNLQrms90Dn203naq8.png", + "https://framerusercontent.com/images/ABxYsk1G1X5AyrhvqCHqenybOk.png", + "https://framerusercontent.com/images/YsvuSiklWagcyzwUFy5DAVZkjY.png", + "https://framerusercontent.com/images/Fruv7rlzUZ8mwRpS2aq18WEfRA.png", + "https://framerusercontent.com/images/loQFVf8midy8jXbZfBVgQJaH27o.png", + "https://framerusercontent.com/images/1IZK6zUVKBDJLPd7IgGgmskl5E.png", + "https://framerusercontent.com/images/FSD4I9QCUFBd7yKA5QSDxDtjw.png", + "https://framerusercontent.com/images/2Nsci6pVfeXpbwRMfUEeRJG4EQ.png", + "https://framerusercontent.com/images/VNn03qoZKBYjVC9fPt20JcfdDM.png", + "https://framerusercontent.com/images/Y3KN7wnOGUtFAq9aQWmPIKxJk.png", + "https://framerusercontent.com/images/RuiEKimhGUZd5WvVQNAspBSM4.png", + "https://framerusercontent.com/images/GxEjqBJwBqszrAT7J3yxzd8JNvY.png", + "https://framerusercontent.com/images/vgVWeyOp1deaRNVPzRTDrSwk.png", + "https://framerusercontent.com/images/Nyoio6siJvZKRimHfRtcyIC8RIY.png", + "https://framerusercontent.com/images/aB5hKkfhzDSFczA8MlVs6quF7WU.png", + "https://framerusercontent.com/images/n7aJilfgjxol6FVmnyOqIRt8.png", + "https://framerusercontent.com/images/qq4i3PIf2S12XtOzsPHiNsQqjqc.png", + "https://framerusercontent.com/images/zaWGS87FRieZGZilq623e0FA.png", + "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh6UVSwiPGQ.woff2", + "https://fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHjx4wXg.woff2", + "https://framerusercontent.com/images/XXtHXYImkH8c2gURHS9KaHpcRE.png", + "https://framerusercontent.com/images/b8RImAmJQtiuIVcQKO9iL5mNlkQ.png", + "https://framerusercontent.com/images/aomPDH1SlEb4126eedzyGTmcQ.png", + "https://framerusercontent.com/images/7QJs26uCC7h3fkEHvtMtXFfSFLI.png", + "https://framerusercontent.com/images/M8FSuF5VgWSLWjv6KWAFHEkKeFU.png", + "https://framerusercontent.com/images/6va1MDYTX5gLR0dVJJLmojiJGnI.png", + "https://framerusercontent.com/images/BZsl8AsorPqWdRhXjy0jVBAIhQ.png", + "https://framerusercontent.com/images/sym9T1dHagXxkl4BqNIlFYJUxGE.png", + "https://framerusercontent.com/images/UrSNYwLfIXGxYMz28fjhYx3c.png", + "https://framerusercontent.com/images/BFa4BpSMTtV62RfYefCwfM5mL0w.png", + "https://framerusercontent.com/images/YRXitHymasSlS8X9ZIiR2tX2TUw.svg", + "https://framerusercontent.com/images/5nwAOxv4z9wxjzIuH4TQLtktCd0.svg", + "https://framerusercontent.com/images/1AYiAVBow7U4XunO5REhAEmcY.png", + "https://framerusercontent.com/images/TP5kqhLBes902Uao1H8nfJOtGE.svg", + "https://framerusercontent.com/images/Btfp3nySlkWunZieqoNHMYnkX8.svg", + "https://framerusercontent.com/assets/M7jrzPRuvpfMkx6YitOJlREB8k.woff2", + "https://lumberjack.razorpay.com/v1/track", + "https://accounts.razorpay.com/register-sw/", + "https://framer.com/edit/beta/init.mjs", + "https://app.framerstatic.com/chunk-BAHUFDKX.mjs", + "https://o515678.ingest.sentry.io/api/5848561/envelope/", + "https://www.google.com/measurement/conversion", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://www.google.com/rmkt/collect/928471290/", + "https://www.google.com/rmkt/collect/349725439/", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://cdn.segment.com/v1/projects/YNK2Ge3yl0IaYj8PLndL5V6vfPZPQxZo/settings", + "https://cdn.segment.com/analytics-next/bundles/ajs-destination.bundle.40628baed746e9904edc.js", + "https://framerusercontent.com/assets/8X4YfeFTa4dHaAn9mPBITL0A.json", + "https://www.google.com/pagead/1p-user-list/349725439/", + "https://www.google.com/pagead/1p-user-list/928471290/", + "https://cdn.segment.com/analytics-next/bundles/schemaFilter.bundle.a6a77355d52c20e3a83d.js", + "https://events.framer.com/anonymous", + "https://api.segment.io/v1/p", + "https://api.segment.io/v1/t", + "https://px.ads.linkedin.com/collect", + "https://c.clarity.ms/c.gif", + "https://px.ads.linkedin.com/wa/", + "https://h.clarity.ms/collect", + "https://framerusercontent.com/images/CU1m0xFonUl76ZeaW0IdkQ0M.png", + "https://framer.com/edit/beta", + "https://smart-assist.razorpay.com/" + ], + "stylesheets": [], + "cookies": [ + "ab_user_id", + "additional-cache-params", + "visit_time_stamp", + "cloudfront_viewer_country", + "cloudfront_viewer_country_region", + "cloudfront_viewer_country_region_name", + "ra_utm_default", + "sessionReferrer", + "clientId", + "sessionId", + "lastActivityTimeStamp", + "ra_f_utm_default", + "ra_clientId", + "ra_s_utm_default", + "ra_s_r_default", + "ra_s_id_default", + "_gcl_au", + "_ga_F42RZ69DW8", + "_ga", + "ajs_anonymous_id", + "_fbp", + "_clck", + "_clsk", + "ra_la_default" + ], + "metas": [ + "generator=Framer 400ebe4" + ], + "inlineSamples": [], + "domFlags": [ + "[data-styled]", + "[data-framer-name]", + "[sc-]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "Sentry": { + "present": true, + "version": "10.32.1" + }, + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "gtag": { + "present": true + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/react.dev.json b/tests/corpus/react.dev.json new file mode 100644 index 0000000..fe6e0fa --- /dev/null +++ b/tests/corpus/react.dev.json @@ -0,0 +1,172 @@ +{ + "host": "react.dev", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "webpack" + ] + }, + "snapshot": [ + "google-analytics:high", + "nextjs:high@15.1.12", + "react:high", + "tailwind:high", + "webpack:high" + ], + "signals": { + "url": "https://react.dev/", + "scripts": [ + "https://www.googletagmanager.com/gtag/js", + "/_next/static/chunks/polyfills-42372ed130431b0a.js", + "/_next/static/chunks/webpack-95fc1f1713249e81.js", + "/_next/static/chunks/framework-76ad44d61c11f057.js", + "/_next/static/chunks/main-8bc660a98b463b2d.js", + "/_next/static/chunks/pages/_app-6d7b64b3b21a9551.js", + "/_next/static/chunks/668-9be9de6fa7660277.js", + "/_next/static/chunks/928-132eeb57d328ee63.js", + "/_next/static/chunks/pages/%5B%5B...markdownPath%5D%5D-5093e36719d692c5.js", + "/_next/static/RPs1WuauQUuNobGQiyttk/_buildManifest.js", + "/_next/static/RPs1WuauQUuNobGQiyttk/_ssgManifest.js", + "https://react.dev/fonts/Source-Code-Pro-Regular.woff2", + "https://react.dev/fonts/Source-Code-Pro-Bold.woff2", + "https://react.dev/fonts/Optimistic_Display_W_Md.woff2", + "https://react.dev/fonts/Optimistic_Display_W_SBd.woff2", + "https://react.dev/fonts/Optimistic_Display_W_Bd.woff2", + "https://react.dev/fonts/Optimistic_Text_W_Md.woff2", + "https://react.dev/fonts/Optimistic_Text_W_Bd.woff2", + "https://react.dev/fonts/Optimistic_Text_W_Rg.woff2", + "https://react.dev/fonts/Optimistic_Text_W_It.woff2", + "/_next/static/css/f647474d5749a6d8.css", + "/images/uwu.png", + "/images/home/conf2021/cover.svg", + "/images/home/conf2021/andrew.jpg", + "/images/home/conf2021/lauren.jpg", + "/images/home/conf2021/juan.jpg", + "/images/home/conf2021/rick.jpg", + "/images/home/conf2021/shruti.jpg", + "/images/home/conf2021/shaundai.jpg", + "/images/home/conf2021/aakansha.jpg", + "/images/home/conf2021/brian.jpg", + "/images/home/conf2021/xuan.jpg", + "/images/home/conf2021/rachel.jpg", + "/images/home/conf2021/debbie.jpg", + "/images/home/conf2021/sarah.jpg", + "/images/home/conf2021/linton.jpg", + "/images/home/conf2021/delba.jpg", + "/images/home/conf2021/robert.jpg", + "/images/home/conf2021/eric.jpg", + "/images/home/conf2021/steven.jpg", + "/images/home/conf2021/roman.jpg", + "/images/home/conf2021/daishi.jpg", + "/images/home/conf2021/diego.jpg", + "/images/home/conf2021/tafu.jpg", + "/images/home/conf2021/lyle.jpg", + "/images/home/conf2021/helen.jpg", + "/images/home/conf2019/cover.svg", + "inline:#__NEXT_DATA__", + "https://react.dev/_next/static/css/f647474d5749a6d8.css", + "https://react.dev/_next/image", + "https://react.dev/_next/static/chunks/webpack-95fc1f1713249e81.js", + "https://react.dev/_next/static/chunks/framework-76ad44d61c11f057.js", + "https://react.dev/_next/static/chunks/main-8bc660a98b463b2d.js", + "https://react.dev/_next/static/chunks/pages/_app-6d7b64b3b21a9551.js", + "https://react.dev/_next/static/chunks/668-9be9de6fa7660277.js", + "https://react.dev/_next/static/chunks/928-132eeb57d328ee63.js", + "https://react.dev/_next/static/RPs1WuauQUuNobGQiyttk/_ssgManifest.js", + "https://react.dev/_next/static/RPs1WuauQUuNobGQiyttk/_buildManifest.js", + "https://react.dev/_next/static/chunks/pages/%5B%5B...markdownPath%5D%5D-5093e36719d692c5.js", + "https://react.dev/images/uwu.png", + "https://react.dev/images/home/conf2021/cover.svg", + "https://react.dev/images/home/conf2021/andrew.jpg", + "https://react.dev/images/home/conf2021/lauren.jpg", + "https://react.dev/images/home/conf2021/juan.jpg", + "https://react.dev/images/home/conf2021/rick.jpg", + "https://react.dev/images/home/conf2021/shaundai.jpg", + "https://react.dev/images/home/conf2021/shruti.jpg", + "https://react.dev/images/home/conf2021/aakansha.jpg", + "https://react.dev/images/home/conf2021/brian.jpg", + "https://react.dev/images/home/conf2021/xuan.jpg", + "https://react.dev/images/home/conf2021/rachel.jpg", + "https://react.dev/images/home/conf2021/debbie.jpg", + "https://react.dev/images/home/conf2021/sarah.jpg", + "https://react.dev/images/home/conf2021/delba.jpg", + "https://react.dev/images/home/conf2021/eric.jpg", + "https://react.dev/images/home/conf2021/robert.jpg", + "https://react.dev/images/home/conf2021/linton.jpg", + "https://react.dev/images/home/conf2021/steven.jpg", + "https://react.dev/images/home/conf2021/roman.jpg", + "https://react.dev/images/home/conf2021/daishi.jpg", + "https://react.dev/images/home/conf2021/lyle.jpg", + "https://react.dev/images/home/conf2021/helen.jpg", + "https://react.dev/images/home/conf2021/tafu.jpg", + "https://react.dev/images/home/conf2021/diego.jpg", + "https://react.dev/images/home/conf2019/cover.svg", + "https://react.dev/site.webmanifest", + "https://react.dev/images/meta-gradient.png", + "https://react.dev/_next/static/chunks/4ad82c5e.aa059996e264f809.js", + "https://react.dev/_next/static/chunks/811.b2e5ca620a3f883e.js", + "https://react.dev/_next/static/chunks/972.d10c430071e5a41c.js", + "https://react.dev/images/home/videos/documentary.webp", + "https://react.dev/images/home/videos/rn.jpg", + "https://react.dev/images/home/videos/rethinking.jpg", + "https://react.dev/images/home/videos/hooks.jpg", + "https://react.dev/images/home/videos/rsc.jpg", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/index.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/versions.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/learn.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/reference/react.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/community.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/blog.json", + "https://react.dev/_next/data/RPs1WuauQUuNobGQiyttk/community/translations.json", + "https://www.google-analytics.com/g/collect", + "https://react.dev/favicon-32x32.png" + ], + "stylesheets": [ + "/_next/static/css/f647474d5749a6d8.css" + ], + "cookies": [ + "_ga_B1E83PJ3RT", + "_ga" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__NEXT_DATA__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "gtag": { + "present": true + }, + "next": { + "present": true, + "version": "15.1.12" + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/remix.run.json b/tests/corpus/remix.run.json new file mode 100644 index 0000000..ffb4020 --- /dev/null +++ b/tests/corpus/remix.run.json @@ -0,0 +1,248 @@ +{ + "host": "remix.run", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": {}, + "snapshot": [ + "fathom:high", + "import-map:low" + ], + "signals": { + "url": "https://remix.run/", + "scripts": [ + "https://cdn.usefathom.com/script.js", + "/assets/app/actions/public/entry.@-sARdP.ts", + "/landing/remix-runner.avif", + "/assets/app/styles/public/font/inter-roman-latin-var.@G1hza8.woff2", + "/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/multiple-import-maps-polyfill.@rHuDiO.js", + "/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/ui.@rG7qLU.js", + "/assets/app/actions/public/document-redirect.@qw-qRq.ts", + "/assets/app/actions/public/fathom.@apt6hu.ts", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/index.@kfwr6b.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/index.@DT50XY.js", + "/assets/npm/.pnpm/fathom-client%403.7.2/node_modules/fathom-client/dist/fathom-client.esm.@txc6lU.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/polyfill.@OcqOJT.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/run.@mo0uQY.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/vdom.@peL9vB.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/client-entries.@fcPmpr.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/component.@wAT5nL.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/spa-response.@LQQXa0.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/create-element.@_LiE07.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/unsafe-html.@N1vyTz.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/mixin.@c2dt_m.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/typed-event-target.@HHE5hP.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/on-mixin.@L-8vjX.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/link-mixin.@LTa2mA.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/ref-mixin.@B9J0mu.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/attrs-mixin.@2TpBpA.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/css-mixin.@xrifDv.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/navigation.@J9ZBaa.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/features.@fZe7MY.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/native-resolve.@i0SKVD.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/frame.@lAsnux.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/index.@83nQbL.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/error-event.@1g_XgR.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/invariant.@37Pp5R.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/scheduler.@RtpMLY.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/reconcile.@YlDpZb.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/to-vnode.@tkVWMV.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/vnode.@lN51Wx.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/diff-props.@NSb_E4.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/refresh.@fkn_t7.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/jsx.@Bi6bAA.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/children.@yLkAL4.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/mix.@6IseuW.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/form-navigation.@Zj57-A.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/document-reload.@6CG38G.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/env.@n0wNEM.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/trusted-types.@7wNeoB.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/resolve.@NoiiOU.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/diff-dom.@kBWkl3.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/stream-protocol.@jHPc2z.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/module-preloader.@EAc72Z.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/frame-resolution.@yJpeh8.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/client-entry-boundary.@VsmQI1.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/import-map-manager.@bVKmlq.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/stylesheet.@27higg.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/style.@_a8vEt.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/document-state.@X6hT0k.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/props.@TsGs2q.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/vnode.@si3UOY.js", + "/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/self.@893yhP.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/layers.@_xzmKp.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/attributes.@nSFwan.js", + "/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/svg-attributes.@1xXdCq.js", + "inline:#fathom-script", + "https://remix.run/landing/remix-runner.avif", + "https://remix.run/assets/app/styles/public/global.@lQ7lA2.css", + "https://remix.run/assets/app/styles/public/font/inter-roman-latin-var.@G1hza8.woff2", + "https://remix.run/assets/app/styles/public/home.@zdcOQJ.css", + "https://remix.run/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/multiple-import-maps-polyfill.@rHuDiO.js", + "https://remix.run/assets/app/actions/public/entry.@-sARdP.ts", + "https://remix.run/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/ui.@rG7qLU.js", + "https://remix.run/assets/app/actions/public/document-redirect.@qw-qRq.ts", + "https://remix.run/assets/app/actions/public/fathom.@apt6hu.ts", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/index.@kfwr6b.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/index.@DT50XY.js", + "https://remix.run/assets/npm/.pnpm/fathom-client%403.7.2/node_modules/fathom-client/dist/fathom-client.esm.@txc6lU.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/polyfill.@OcqOJT.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/run.@mo0uQY.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/vdom.@peL9vB.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/client-entries.@fcPmpr.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/component.@wAT5nL.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/spa-response.@LQQXa0.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/create-element.@_LiE07.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/unsafe-html.@N1vyTz.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/mixin.@c2dt_m.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/typed-event-target.@HHE5hP.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/on-mixin.@L-8vjX.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/link-mixin.@LTa2mA.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/ref-mixin.@B9J0mu.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/mixins/attrs-mixin.@2TpBpA.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/navigation.@J9ZBaa.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/css-mixin.@xrifDv.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/features.@fZe7MY.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/native-resolve.@i0SKVD.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/frame.@lAsnux.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/index.@83nQbL.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/error-event.@1g_XgR.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/invariant.@37Pp5R.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/scheduler.@RtpMLY.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/reconcile.@YlDpZb.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/to-vnode.@tkVWMV.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/vnode.@lN51Wx.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/diff-props.@NSb_E4.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/refresh.@fkn_t7.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/jsx.@Bi6bAA.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/mix.@6IseuW.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/children.@yLkAL4.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/form-navigation.@Zj57-A.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/document-reload.@6CG38G.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/env.@n0wNEM.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/trusted-types.@7wNeoB.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/resolve.@NoiiOU.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/stream-protocol.@jHPc2z.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/diff-dom.@kBWkl3.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/module-preloader.@EAc72Z.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/import-map-manager.@bVKmlq.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/frame-resolution.@yJpeh8.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/client-entry-boundary.@VsmQI1.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/stylesheet.@27higg.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/style.@_a8vEt.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/document-state.@X6hT0k.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/vnode.@si3UOY.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/props.@TsGs2q.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bmultiple-import-maps-polyfill%400.1.0/node_modules/%40remix-run/multiple-import-maps-polyfill/dist/lib/self.@893yhP.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/style/layers.@_xzmKp.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/core/attributes.@nSFwan.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/runtime/svg-attributes.@1xXdCq.js", + "https://remix.run/assets/app/actions/public/remix-landing/components/feature-section.@tizSO1.tsx", + "https://remix.run/assets/app/ui/public/newsletter-subscribe.@xRxaMi.tsx", + "https://remix.run/assets/app/ui/public/theme.@OIQLKy.ts", + "https://remix.run/assets/app/ui/public/css-mixins.@hUZndr.ts", + "https://remix.run/assets/app/routes.@OyjyzQ.ts", + "https://remix.run/assets/app/actions/public/remix-landing/styles/tokens.@zNljCQ.ts", + "https://remix.run/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/ui/jsx-runtime.@MejhSu.js", + "https://remix.run/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/fetch-router/routes.@yEiv3o.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/jsx-runtime.@uf4hXn.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/routes.@GCiR-h.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/route-map.@ZmAJiC.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/request-methods.@Ro6PJ0.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/route-helpers/form.@ntQRC9.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/route-helpers/resource.@-mCpt0.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/route-helpers/resources.@QJ5ltL.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bfetch-router%400.22.1/node_modules/%40remix-run/fetch-router/dist/lib/route-helpers/method.@BMuKAG.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/route-pattern.@Lyx_IP.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/href.@VnvFCF.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/join.@6ZlNV2.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/route-pattern.@J7zFsL.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/route-pattern/parse.@GBI83I.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/href.@ZzzhZX.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/route-pattern/serialize.@isplPN.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/join.@UPe7Qy.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/unreachable.@E0r0VO.js", + "https://remix.run/assets/app/ui/public/document-sync.@rihPMF.tsx", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Broute-pattern%400.24.1/node_modules/%40remix-run/route-pattern/dist/lib/route-pattern/split.@wSHi6E.js", + "https://remix.run/assets/app/ui/public/document-head-sync.@SEyy0E.ts", + "https://remix.run/assets/app/ui/public/document-head.@1QZWal.ts", + "https://remix.run/assets/app/actions/public/remix-landing/landing-enhancements.@XWFhjv.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/preset-glow.@mRkwBx.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/landing-nav.@Q8wBNy.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/label-overlay.@Z42B-1.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/loading-screen.@9rOTBl.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/scroll-logo.@r125px.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/section-nav.@cb9_kI.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/components/package-logos.@k1p68K.tsx", + "https://remix.run/assets/app/ui/public/keyboard.@AX4dWN.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/model-loader.@m9rOeI.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/presets.@x5U-AG.ts", + "https://remix.run/assets/app/actions/public/remix-landing/utils/math.@RcwuCl.ts", + "https://remix.run/assets/app/actions/public/remix-landing/utils/reduced-motion.@FvBs8P.ts", + "https://remix.run/assets/npm/.pnpm/remix%403.0.0-rc.3_%40emnapi%2Bcore%401.11.2_%40emnapi%2Bruntime%401.11.2_playwright%401.60.0/node_modules/remix/dist/ui/popover.@mfmGXb.js", + "https://remix.run/assets/app/ui/public/icon.@uxoi7v.tsx", + "https://remix.run/assets/app/actions/public/remix-landing/runner-media.@9mz6WG.ts", + "https://remix.run/assets/app/ui/public/brand-context-menu.@IPytBg.ts", + "https://remix.run/assets/app/ui/public/wordmark.@fiwwyg.tsx", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/anchor/index.@5hjegs.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/popover/index.@zjeu0G.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/popover/scroll-lock.@FCPRy2.js", + "https://remix.run/assets/npm/.pnpm/%40remix-run%2Bui%400.10.0/node_modules/%40remix-run/ui/dist/popover/outside-click.@eftqbL.js", + "https://remix.run/assets/app/styles/public/md.@_reW6D.css", + "https://remix.run/assets/app/styles/public/font/jet-brains-mono.@9yA31S.woff2", + "https://remix.run/landing/models/racecar.pts", + "https://remix.run/landing/models/model-kit-runner.pts", + "https://remix.run/assets/app/actions/public/remix-landing/components/particle-canvas.@BVYgu2.tsx", + "https://remix.run/landing/remix-package-auth.svg", + "https://remix.run/landing/remix-package-routing.svg", + "https://remix.run/landing/remix-package-data.svg", + "https://remix.run/landing/remix-package-component.svg", + "https://remix.run/landing/remix-package-session.svg", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/build/three.module.@zpyYrL.js", + "https://remix.run/assets/app/actions/public/remix-landing/engine/controls.@kfzYiL.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/camera-transition.@mUm2Uo.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/engine.@f9szkG.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/mouse-sim.@ulILGv.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/particles.@pZ43Qs.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/label-projection.@Pl1mJK.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/frame-governor.@jZzSEL.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/model-texture.@5Y2sFF.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/rest-baker.@UY7U3i.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/types.@nJxfRu.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/morph.@z2sTuH.ts", + "https://remix.run/assets/app/actions/public/remix-landing/engine/preset-glsl.@vtZ0Qi.ts", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/EffectComposer.@nea9ha.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/UnrealBloomPass.@9x8kOL.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/RenderPass.@jRuSPA.js", + "https://remix.run/assets/app/actions/public/remix-landing/engine/background-pass.@v-mC9B.ts", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/AfterimagePass.@x6R8bx.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/build/three.core.@AntV_D.js", + "https://cdn.usefathom.com/", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/shaders/CopyShader.@wmJsga.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/ShaderPass.@H1cp5u.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/MaskPass.@IdjSa0.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/postprocessing/Pass.@omDNSV.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/shaders/AfterimageShader.@gfb4Ft.js", + "https://remix.run/assets/npm/.pnpm/three%400.184.0/node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.@SYxGDV.js", + "https://remix.run/favicon.svg" + ], + "stylesheets": [ + "/assets/app/styles/public/global.@lQ7lA2.css", + "/assets/app/styles/public/home.@zdcOQJ.css", + "/assets/app/styles/public/md.@_reW6D.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "script[type=\"importmap\"]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "fathom": { + "present": true + } + } +} diff --git a/tests/corpus/segment.com.json b/tests/corpus/segment.com.json new file mode 100644 index 0000000..cdaca60 --- /dev/null +++ b/tests/corpus/segment.com.json @@ -0,0 +1,217 @@ +{ + "host": "segment.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "segment" + ] + }, + "snapshot": [ + "google-analytics:high", + "jquery:high@1.12.4-aem", + "segment:high", + "sentry:high", + "webpack:high" + ], + "signals": { + "url": "https://www.twilio.com/en-us/segment", + "scripts": [ + "https://bat.bing.com/p/conversions/s/0.8.70", + "https://bat.bing.com/p/conversions/t/30006288", + "https://bat.bing.com/bat.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://snap.licdn.com/li.lms-analytics/insight.beta.min.js", + "https://j.6sc.co/6si.min.js", + "https://cdn.segment.com/analytics.js/v1/NBBzVMlQO9GFFqU6upGyk4gqf6zV28TH/analytics.min.js", + "https://scout-cdn.salesloft.com/sl.js", + "https://tags.srv.stackadapt.com/events.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://connect.facebook.net/signals/config/1040773425961662", + "https://connect.facebook.net/en_US/fbevents.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://www.googletagmanager.com/gtag/js", + "https://cdn.jsdelivr.net/npm/search-insights@2.14.0", + "https://www.googletagmanager.com/gtm.js", + "https://rum.hlx.page/.rum/@adobe/helix-rum-js@%5E2/dist/micro.js", + "https://consent.trustarc.com/notice", + "https://assets.adobedtm.com/a62564f453ce/b1b9d7ec982b/launch-29605e749a31.min.js", + "https://consent.trustarc.com/get", + "https://j.6sc.co/j/e1a76594-779b-4529-b852-0284e5fe92ab.js", + "//munchkin.marketo.net/munchkin.js", + "https://obseu.powerrobotflower.com/ct", + "https://assets.adobedtm.com/a62564f453ce/b1b9d7ec982b/f75a8ca8d1a6/RCae46cffa7edc45669f4ae4ee9bab92ea-source.min.js", + "https://bat.bing.com/p/action/30006288.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/751085158/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/923471531/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/923239173/", + "https://consent.trustarc.com/asset/notice.js/v/2872571", + "/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.js", + "/aem-static/etc.clientlibs/clientlibs/granite/jquery.lc-7842899024219bcbdb5e72c946870b79-lc.min.js", + "/aem-static/etc.clientlibs/clientlibs/granite/utils.lc-e7bf340a353e643d198b25d0c8ccce47-lc.min.js", + "/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site.lc-376d8b087c53eec1e3f703969f1f1e3d-lc.min.js", + "/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.js", + "/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-site.lc-f4974ac7e2c55f6705e7cfad27ac3236-lc.min.js", + "https://euob.powerrobotflower.com/sxp/i/40532d5df9f288cf593998bcff0654c9.js", + "https://jscloud.net/x/13724/inlinks.js", + "https://js.qualified.com/qualified.js", + "https://analytics.silktide.com/300433ab0ed34c0bb2bb1cd50cb4f829.js", + "https://s.yimg.jp/images/listing/tool/cv/ytag.js", + "inline:#truste_0.1160416040003942", + "inline:#vwoCode", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.css", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.css", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site.lc-52c541476e58807cf0871850d41f810b-lc.min.css", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.js", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-site.lc-c9542afd1b458d7e5241dfeb7dd87612-lc.min.css", + "https://www.twilio.com/aem-static/etc.clientlibs/clientlibs/granite/jquery.lc-7842899024219bcbdb5e72c946870b79-lc.min.js", + "https://www.twilio.com/aem-static/etc.clientlibs/clientlibs/granite/utils.lc-e7bf340a353e643d198b25d0c8ccce47-lc.min.js", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.js", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site.lc-376d8b087c53eec1e3f703969f1f1e3d-lc.min.js", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-site.lc-f4974ac7e2c55f6705e7cfad27ac3236-lc.min.js", + "https://dev.visualwebsiteoptimizer.com/j.php", + "https://www.twilio.com/aem-static/content/dam/twilio-com/core-assets/social/site.webmanifest", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site/resources/e408c138892b0f08a23d.woff2", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site/resources/a20a647d19af27011c7c.woff2", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site/resources/ee7a891efcbc6ef61942.woff2", + "https://www.twilio.com/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site/resources/220e5b59f8588716f4d8.woff2", + "https://www.twilio.com/aem-static/content/dam/twilio-com/global/en/products/segment/rebrand/Segment_hero_twilio.png/_jcr_content/renditions/compressed-original.webp", + "https://www.twilio.com/aem-static/content/dam/twilio-com/global/en/products/segment/rebrand/Segment_customer-pipeline_twilio.png/_jcr_content/renditions/compressed-original.webp", + "https://www.twilio.com/aem-static/content/dam/twilio-com/global/en/products/segment/rebrand/Segment_cdp_twilio.png/_jcr_content/renditions/compressed-original.webp", + "https://dev.visualwebsiteoptimizer.com/cdn/edrv/worker-f8ccb076901db84320bc9a001c342c1f.br.js", + "https://dev.visualwebsiteoptimizer.com/cdn/edrv/va-a5b1b762d18396645df5f83f94f55fef.br.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/5874.c1d494a1c6eb384691be.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/2506.a86dc1892da07a9c4323.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/5494.1508c86eaea27698e226.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/8330.c0a1bf6c381e1c716482.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/3755.e697bd5e479500e60754.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/7519.414161aa80aa727aa96f.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/4596.1318e8fe271c36db24a7.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/8203.24c7144e1100ab5e1610.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/3427.f9effb43a9bab079835f.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/9008.733706dd2fda9a8696ac.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/1427.38f09e90e9ee2ecb1616.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/9869.4df035ae9e86852e93f8.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/1613.60ca8bd70e99ce942827.js", + "https://www.twilio.com/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dynamic-modules/resources/3803.1befa0e76bc3b49e75d8.js", + "https://twilio.tt.omtrdc.net/rest/v1/delivery", + "https://dpm.demdex.net/id", + "https://twilio.demdex.net/dest5.html", + "https://cm.everesttech.net/cm/dd", + "https://munchkin.marketo.net/munchkin.js", + "https://consent.trustarc.com/asset/twilio2.png", + "https://jscloud.net/x/13724/httpswwwtwiliocomenussegment.json", + "https://app.qualified.com/w/1/zCnvhQFqeieM7u15/visitor_events", + "https://tags.srv.stackadapt.com/sa.css", + "https://tags.srv.stackadapt.com/sa.jpeg", + "https://pixel-config.reddit.com/pixels/t2_i1au5p4/config", + "https://alb.reddit.com/rp", + "https://tags.srv.stackadapt.com/saq_pxl", + "https://munchkin.marketo.net/165/munchkin.js", + "https://scout.salesloft.com/r", + "https://scout.salesloft.com/i", + "https://cdn.segment.com/v1/projects/NBBzVMlQO9GFFqU6upGyk4gqf6zV28TH/settings", + "https://secure.adnxs.com/getuidj", + "https://c.6sc.co/", + "https://ipv6.6sc.co/", + "https://cdn.segment.com/analytics-next/bundles/tsub-middleware.bundle.89bf07058b3d3b126984.js", + "https://epsilon.6sense.com/v3/company/details", + "https://px.ads.linkedin.com/wa/", + "https://px.ads.linkedin.com/collect", + "https://b.6sc.co/v1/beacon/img.gif", + "https://294-tkb-300.mktoresp.com/webevents/visitWebPage", + "https://obseu.powerrobotflower.com/tracker/tc_imp.gif", + "https://cdn.segment.com/analytics-next/bundles/ajs-destination.bundle.40628baed746e9904edc.js", + "https://cdn.segment.com/analytics-next/bundles/legacyVideos.bundle.c8148be87c48a2b6537a.js", + "https://cdn.segment.com/analytics-next/bundles/407.bundle.61efa1acb302134c434b.js", + "https://cdn.segment.com/analytics-next/bundles/schemaFilter.bundle.a6a77355d52c20e3a83d.js", + "https://api.segment.io/v1/p", + "https://api.segment.io/v1/i", + "https://api.segment.io/v1/t", + "https://bat.bing.net/actionp/0", + "https://bat.bing.com/actionp/0", + "https://bat.bing.com/action/0", + "https://bat.bing.com/p/conversions/c/j", + "https://www.google.com/rmkt/collect/751085158/", + "https://www.google.com/rmkt/collect/923471531/", + "https://ad.doubleclick.net/activity;src=11875831;type=invmedia;cat=twili0;rcb=6;ord=5599602123385;u=%2Fen-us%2Fsegment;npa=0;auiddc=940414596.1790413296;gdid=dNTIxZG;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KFA;gtm=45fe69n1v9187185578z8892881315za20gzb892881315zd892881315xeaxf1;gcs=G111;gcd=13t3t3t3t5l1;dma=0;dc_fmt=3;tag_exp=115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413295_wLJOKKcsukAS5t2JqWhih4qpbPcVlcSKig;~oref=https%3A%2F%2Fwww.twilio.com%2Fen-us%2Fsegment", + "https://11875831.fls.doubleclick.net/activityi;src=11875831;type=invmedia;cat=twili0;rcb=6;ord=5599602123385;u=%2Fen-us%2Fsegment;npa=0;auiddc=940414596.1790413296;gdid=dNTIxZG;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KFA;gtm=45fe69n1v9187185578z8892881315za20gzb892881315zd892881315xeaxf1;gcs=G111;gcd=13t3t3t3t5l1;dma=0;dc_fmt=2;tag_exp=115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413295_wLJOKKcsukAS5t2JqWhih4qpbPcVlcSKig;_dc_test=1;~oref=https%3A%2F%2Fwww.twilio.com%2Fen-us%2Fsegment", + "https://www.google.com/rmkt/collect/923239173/", + "https://www.googleadservices.com/pagead/conversion/923239173/", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://www.googleadservices.com/ccm/conversion/923239173/", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://obseu.powerrobotflower.com/mon", + "https://www.google.com/pagead/1p-user-list/751085158/", + "https://www.google.com/pagead/1p-user-list/923471531/", + "https://www.google.com/pagead/1p-user-list/923239173/", + "https://apm.yahoo.co.jp/rt/", + "https://www.twilio.com/aem-static/content/dam/twilio-com/core-assets/social/favicon-32x32.png" + ], + "stylesheets": [ + "/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.css", + "/aem-static/etc.clientlibs/twilio-foundation/clientlibs/clientlib-site.lc-52c541476e58807cf0871850d41f810b-lc.min.css", + "/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.css", + "/aem-static/etc.clientlibs/twilio-com/clientlibs/clientlib-site.lc-c9542afd1b458d7e5241dfeb7dd87612-lc.min.css", + "https://tags.srv.stackadapt.com/sa.css" + ], + "cookies": [ + "_vwo_consent", + "TAsessionID", + "notice_behavior", + "at_check", + "AMCVS_32523BB96217F7B60A495CB6%40AdobeOrg", + "AMCV_32523BB96217F7B60A495CB6%40AdobeOrg", + "__q_state_zCnvhQFqeieM7u15", + "_ALGOLIA", + "_cq_duid", + "_cq_suid", + "_cq_session", + "sa-user-id", + "sa-user-id-v2", + "sa-user-id-v3", + "sa-user-id-v4", + "_rdt_uuid", + "slireg", + "sliguid", + "slirequested", + "_gd_svisitor", + "_an_uid", + "_gd_visitor", + "_gd_session", + "_mkto_trk", + "_fbp", + "_cq_s", + "ajs_anonymous_id", + "_uetvid", + "_uetsid", + "_gcl_au", + "_ga", + "_ga_RRP8K4M4F3", + "mbox" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "gtag": { + "present": true + }, + "jQuery": { + "present": true, + "version": "1.12.4-aem" + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/sentry.io.json b/tests/corpus/sentry.io.json new file mode 100644 index 0000000..a1f64c0 --- /dev/null +++ b/tests/corpus/sentry.io.json @@ -0,0 +1,120 @@ +{ + "host": "sentry.io", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "astro", + "sentry" + ] + }, + "snapshot": [ + "astro:high", + "plausible:high", + "react:high", + "sentry:high", + "tailwind:high", + "vercel:high" + ], + "signals": { + "url": "https://sentry.io/welcome/", + "scripts": [ + "https://www.gstatic.com/recaptcha/releases/kemdRjWFxNjgsGdhRslyEPwU/recaptcha__en.js", + "https://plausible.io/js/script.tagged-events.js", + "/_astro/page.C91DIyjj.js", + "https://www.google.com/recaptcha/api.js", + "/_astro/Link.astro_astro_type_script_index_0_lang.BUAMEBj4.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "/_astro/FeatureCarousel.astro_astro_type_script_index_0_lang.D1H6rhCJ.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "/_astro/GettingStarted.astro_astro_type_script_index_0_lang.DZ9W8lq7.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "/_astro/Welcome.astro_astro_type_script_index_0_lang.BlbjrynX.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "/astro-assets/fonts/rubik-latin-regular.woff", + "/astro-assets/fonts/rubik-latin-italic.woff2", + "/astro-assets/fonts/dammitsansv0.3-bold.otf", + "/_astro/welcome-bg.BcYKCM6C.webp", + "/_astro/middle-bg-texture.Bj4JNsdD.webp", + "inline:#reload-setup", + "inline:#reload-page-view", + "inline:#reload-identify-sentry-user", + "https://sentry.io/astro-assets/fonts/rubik-latin-regular.woff", + "https://sentry.io/astro-assets/fonts/rubik-latin-italic.woff2", + "https://sentry.io/astro-assets/fonts/dammitsansv0.3-bold.otf", + "https://sentry.io/_astro/Layout.CKBeCQbz.css", + "https://sentry.io/_astro/welcome-bg.BcYKCM6C.webp", + "https://sentry.io/_astro/middle-bg-texture.Bj4JNsdD.webp", + "https://sentry.io/_astro/AnimatedLogoGrid.Drn3FiRC.css", + "https://sentry.io/astro-assets/nav-icons/slack.png", + "https://sentry.io/_astro/Link.astro_astro_type_script_index_0_lang.BUAMEBj4.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/MarketoForm.BX_9vJpz.css", + "https://sentry.io/_astro/page.C91DIyjj.js", + "https://sentry.io/astro-assets/nav-icons/github.png", + "https://reload.getsentry.net/page/", + "https://sentry.io/astro-assets/nav-icons/cookbook-social.jpg", + "https://sentry.io/_astro/hero-animation-poster.lNyp05dq.webp", + "https://sentry.io/_astro/ufo-abduction-image.CCCweOzA.webp", + "https://sentry.io/_astro/quotemark.CdOBjrOr.png", + "https://sentry.io/_astro/FeatureCarousel.astro_astro_type_script_index_0_lang.D1H6rhCJ.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/getting-started-img-left.CRIbD4_5.webp", + "https://sentry.io/_astro/getting-started-img-right.uCQ8m_KR.webp", + "https://sentry.io/_astro/GettingStarted.astro_astro_type_script_index_0_lang.DZ9W8lq7.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/link-decorator.DUJ4ak6e.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/astro-assets/fonts/rubik-latin-regular.woff2", + "https://sentry.io/astro-assets/fonts/rubik-latin-500.woff2", + "https://sentry.io/astro-assets/fonts/rubik-latin-500italic.woff2", + "https://sentry.io/_vercel/image?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/Welcome.astro_astro_type_script_index_0_lang.BlbjrynX.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/astro-assets/nav-icons/x-twitter.png", + "https://sentry.io/astro-assets/nav-icons/linkedin.png", + "https://sentry.io/astro-assets/nav-icons/discord.png", + "https://sentry.io/_astro/exports.BE7nIWsU.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/copyCodeBlock.CUjWxged.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/rolldown-runtime.BYOr5BcO.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/MarketoForm.mNOu_RPB.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/client.BjHavy55.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/preload-helper.s2nGiQsl.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/defineProperty.p9wbrGYp.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/carouselA11y.CtdGxrAy.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/languageDisplayNames.DkmC-ohU.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/plausible.ClfsXH98.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/MarketoForm.DVxC5BRy.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/react.C73pFP8I.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/react-dom.DP3ypbiN.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://o1.ingest.us.sentry.io/api/4511259601338368/envelope/", + "https://sentry.io/_astro/jsx-runtime.B0lIxA9f.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/plausible.XaaQQoTt.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://sentry.io/_astro/rive.CYKeoJe2.js?dpl=dpl_HLd8frkKAgUFPkmQFWc3cGRuC9GN", + "https://unpkg.com/@rive-app/canvas@2.38.5/rive.wasm", + "https://www.google.com/recaptcha/api2/anchor", + "https://sentry.io/astro-assets/rive-files/home-hero-scanner-animation.riv", + "https://sentry.io/favicon.ico" + ], + "stylesheets": [ + "/_astro/Layout.CKBeCQbz.css", + "/_astro/AnimatedLogoGrid.Drn3FiRC.css", + "/_astro/MarketoForm.BX_9vJpz.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "astro-island", + "[data-astro-]", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__reactListening": { + "present": true + }, + "plausible": { + "present": true + } + } +} diff --git a/tests/corpus/sites.json b/tests/corpus/sites.json new file mode 100644 index 0000000..44a5fc5 --- /dev/null +++ b/tests/corpus/sites.json @@ -0,0 +1,48 @@ +[ + {"host": "nextjs.org", "expect": {"must": ["nextjs", "react", "turbopack", "vercel"]}}, + {"host": "vercel.com", "expect": {"must": ["nextjs", "react"]}}, + {"host": "stripe.com", "expect": {"must": ["nextjs", "react", "webpack", "sentry"]}}, + {"host": "linear.app", "expect": {"must": ["nextjs", "react", "styled-components", "sentry"], "noVersion": ["nextjs"]}}, + {"host": "react.dev", "expect": {"must": ["nextjs", "react", "webpack"]}}, + {"host": "www.notion.com", "expect": {"must": ["nextjs", "react", "sentry"]}}, + {"host": "vuejs.org", "expect": {"must": ["vue"]}}, + {"host": "nuxt.com", "expect": {"must": ["nuxt", "vue"]}}, + {"host": "angular.dev", "expect": {"must": ["angular"]}}, + {"host": "svelte.dev", "expect": {"must": ["svelte", "sveltekit"]}}, + {"host": "remix.run", "expect": {}}, + {"host": "astro.build", "expect": {"must": ["astro"]}}, + {"host": "tailwindcss.com", "expect": {"must": ["nextjs", "react", "tailwind"]}}, + {"host": "getbootstrap.com", "expect": {"must": ["bootstrap", "astro"], "mustNotSolid": ["tailwind"]}}, + {"host": "mui.com", "expect": {"must": ["nextjs", "react", "mui", "emotion"]}}, + {"host": "chakra-ui.com", "expect": {"must": ["nextjs", "react", "emotion"]}}, + {"host": "jquery.com", "expect": {"must": ["jquery", "wordpress"]}}, + {"host": "github.com", "expect": {"must": ["react-router"]}}, + {"host": "gitlab.com", "expect": {"must": ["nuxt", "vue"]}}, + {"host": "stackoverflow.com", "expect": {"must": ["jquery", "svelte"], "mustNotSolid": ["tailwind"]}}, + {"host": "www.reddit.com", "expect": {}}, + {"host": "medium.com", "expect": {}}, + {"host": "dev.to", "expect": {}}, + {"host": "www.airbnb.com", "expect": {"must": ["react", "react-router"]}}, + {"host": "www.netflix.com", "expect": {"must": ["react", "webpack", "emotion"]}}, + {"host": "www.spotify.com", "expect": {"must": ["react", "styled-components"]}}, + {"host": "discord.com", "expect": {"must": ["webflow"]}}, + {"host": "www.figma.com", "expect": {"must": ["nextjs", "react", "emotion"]}}, + {"host": "www.shopify.com", "expect": {"must": ["react", "shopify"]}}, + {"host": "wordpress.org", "expect": {"must": ["wordpress"]}}, + {"host": "en.wikipedia.org", "expect": {"must": ["jquery"]}}, + {"host": "www.youtube.com", "expect": {"must": ["polymer"]}}, + {"host": "www.flipkart.com", "expect": {"must": ["react", "newrelic"]}}, + {"host": "razorpay.com", "expect": {"must": ["react", "framer"]}}, + {"host": "www.onlyfrontendjobs.com", "expect": {"must": ["nextjs", "react", "tailwind", "sentry"]}}, + {"host": "www.canva.com", "expect": {}}, + {"host": "www.atlassian.com", "expect": {"must": ["react", "emotion", "sentry"]}}, + {"host": "supabase.com", "expect": {"must": ["nextjs", "react", "sentry"]}}, + {"host": "clerk.com", "expect": {"must": ["nextjs", "react", "clerk"], "mustNot": ["bootstrap"]}}, + {"host": "auth0.com", "expect": {"must": ["nextjs", "react", "auth0"]}}, + {"host": "sentry.io", "expect": {"must": ["astro", "sentry"]}}, + {"host": "www.datadoghq.com", "expect": {"must": ["datadog"]}}, + {"host": "newrelic.com", "expect": {"must": ["newrelic"]}}, + {"host": "www.hotjar.com", "expect": {"must": ["nextjs", "react", "hotjar", "module-federation"], "mustNotSolid": ["parcel"]}}, + {"host": "segment.com", "expect": {"must": ["segment"]}}, + {"host": "www.intercom.com", "expect": {"must": ["nextjs", "react", "intercom"]}} +] diff --git a/tests/corpus/stackoverflow.com.json b/tests/corpus/stackoverflow.com.json new file mode 100644 index 0000000..ed7fd72 --- /dev/null +++ b/tests/corpus/stackoverflow.com.json @@ -0,0 +1,133 @@ +{ + "host": "stackoverflow.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "jquery", + "svelte" + ], + "mustNotSolid": [ + "tailwind" + ] + }, + "snapshot": [ + "cloudflare:high", + "google-analytics:high", + "jquery:high@3.7.1", + "svelte:high@5", + "webpack:high" + ], + "signals": { + "url": "https://stackoverflow.com/questions", + "scripts": [ + "https://cdn.cookielaw.org/scripttemplates/gpp.stub.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "https://stackoverflow.com/Content/Js/google-analytics.en.js", + "https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js", + "https://stackoverflow.com/Content/Js/third-party/npm/@stackoverflow/stacks/dist/js/stacks.min.js", + "https://stackoverflow.com/Content/Js/stub.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/5102.en.js", + "https://stackoverflow.com/Content/Js/questions/list.en.js", + "https://stackoverflow.com/Content/Js/sprinkles/cookie-consent.en.js", + "/px.js", + "/cdn-cgi/challenge-platform/scripts/precursor/main.js", + "https://cdn.cookielaw.org/scripttemplates/202604.2.0/otBannerSdk.js", + "https://accounts.google.com/gsi/client", + "https://stackoverflow.com/Content/Js/full-anon.en.js", + "https://cdn.cookielaw.org/scripttemplates/202604.2.0/otGPP.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/svelte.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/svelte-floating-ui.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/stacks-svelte.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/9366.en.js", + "https://stackoverflow.com/Content/Js/islands/signup-modal.en.js", + "https://stackoverflow.com/Content/Js/islands/one-tap.en.js", + "https://stackoverflow.com/Content/Js/sprinkles/left-nav-events.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/stacks-svelte-labs.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/8339.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/7663.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/3696.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/2458.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/620.en.js", + "https://stackoverflow.com/Content/Js/webpack-chunks/7612.en.js", + "https://stackoverflow.com/Content/Js/islands/homepage-wizard.en.js", + "https://stackoverflow.com/Content/Js/questions/userQuestionList.en.js", + "https://stackoverflow.com/Content/Js/sidebar/stackoverflow-for-agents-sidebar-promo.en.js", + "https://www.googletagmanager.com/gtag/js", + "inline:#webpack-public-path", + "https://stackoverflow.com/Content/Shared/stacks.css", + "https://stackoverflow.com/Content/Sites/stackoverflow/primary.css", + "https://stackoverflow.com/Content/Shared/Channels/channels.css", + "https://stackoverflow.com/px.js", + "https://www.gravatar.com/avatar/c9a85968522ba6401b944122f9943e2c", + "https://i.sstatic.net/6jafZ.jpg", + "https://www.gravatar.com/avatar/2d213b3e850bf555be1a6c723a18ae98", + "https://lh3.googleusercontent.com/a-/AAuE7mAvb64APmP2K_dnKcc7axyud-jPGeQHQFrwBb27sg=k-s32", + "https://www.gravatar.com/avatar/1b092e83bef3286023a1d8a0f827aeb4", + "https://lh4.googleusercontent.com/-ieRUhkTxGQ0/AAAAAAAAAAI/AAAAAAAAB9s/SUMgVP9skpc/s32-rj/photo.jpg", + "https://i.sstatic.net/fcMqH.jpg", + "https://www.gravatar.com/avatar/eead3a6ab011b880ca6ec354ca00f0b3", + "https://www.gravatar.com/avatar/47c7b3daffb64a7d706d3d317cea6996", + "https://www.gravatar.com/avatar/329c57d1826a98139d26746d26dba7cf", + "https://www.gravatar.com/avatar/b25379d9ed76c06b46f7d9a1868914c9", + "https://i.sstatic.net/tGDEi.jpg", + "https://www.gravatar.com/avatar/515956a4f6087a06b7686cdbf759cc0c", + "https://www.gravatar.com/avatar/3bde328a25b7c2fa1d0dce09b6e60bf8", + "https://www.gravatar.com/avatar/af1820bf71a9ea4a8529fd765eaa726d", + "https://cdn.cookielaw.org/consent/c3d9f1e3-55f3-4eba-b268-46cee4c6789c/c3d9f1e3-55f3-4eba-b268-46cee4c6789c.json", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://stackoverflow.com/cdn-cgi/challenge-platform/scripts/precursor/main.js", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/subcommunities/aws.svg", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/subcommunities/mobile-dev.svg", + "https://stackoverflow.com/Content/Img/favicons-sprite16.png", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/subcommunities/azure.svg", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/subcommunities/ci-cd.svg", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/subcommunities/openai.svg", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/icon-48.png", + "https://stackoverflow.com/cdn-cgi/challenge-platform/h/b/precursor/d76008a69eab/0.7182440836012771:1790409786:uv-jagL0f8Eh1xleDq_jUmMgjpfYzTz4YXTcODmmAsA/a411111cdd5ff6c0", + "https://cdn.cookielaw.org/consent/c3d9f1e3-55f3-4eba-b268-46cee4c6789c/019f1e88-de48-7993-9d44-02a6149fe258/en.json", + "https://www.google-analytics.com/g/collect", + "https://www.googletagmanager.com/a", + "https://cdn.cookielaw.org/scripttemplates/202604.2.0/assets/otFloatingRoundedCorner.json", + "https://cdn.cookielaw.org/scripttemplates/202604.2.0/assets/otCommonStyles.css", + "https://accounts.google.com/gsi/style", + "https://stackoverflow.com/Content/Sites/stackoverflow/Img/favicon.svg", + "https://cdn.cookielaw.org/logos/static/ot_close.svg" + ], + "stylesheets": [ + "https://stackoverflow.com/Content/Shared/stacks.css", + "https://stackoverflow.com/Content/Sites/stackoverflow/primary.css", + "https://stackoverflow.com/Content/Shared/Channels/channels.css", + "https://accounts.google.com/gsi/style" + ], + "cookies": [ + "OTGPPConsent", + "g_state", + "OptanonConsent" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + ".svelte-" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__svelte": { + "present": true, + "version": "5" + }, + "gtag": { + "present": true + }, + "jQuery": { + "present": true, + "version": "3.7.1" + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/stripe.com.json b/tests/corpus/stripe.com.json new file mode 100644 index 0000000..d7655b9 --- /dev/null +++ b/tests/corpus/stripe.com.json @@ -0,0 +1,183 @@ +{ + "host": "stripe.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "webpack", + "sentry" + ] + }, + "snapshot": [ + "google-analytics:medium", + "nextjs:high@14.2.32", + "react:high", + "sentry:high", + "webpack:high" + ], + "signals": { + "url": "https://stripe.com/", + "scripts": [ + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/polyfills-42372ed130431b0a.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/22074.bd02a94640605868.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/49450.ba8bdeacb2ae3f4e.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/99791.a7f741b779b23047.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/60864.f462ab64ab99a6d2.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/41056.391e5aa5bf17b4e4.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/33429.ebf4f50cc61d4859.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/7205.b1fa6a14487cf1a1.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/29658.230298d5fcee0081.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/51092.558bf86d4d6d35cc.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/72252.cdfab8a8c6c7e3e4.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/55556.c120acaca1226a50.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/8653.b1423805849013a7.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/66084.2df5c58fcbb72480.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/27355.903cdaadb9326fc2.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/54252.b109314146e3cf30.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/93051.1cc9f5f6e52dff0a.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/70191.75cd9e3319850053.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/98762.cbc5581c9806ac88.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/92661.79b136b3bed60df6.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/65142.01bbe82aafd86a0d.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/92255.dd3bd24a9bb2e3ab.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/17383.e316d8044c50c73d.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/87381.4df6f4eaab05993c.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/11744.123cee29712c3808.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/77966.390e7bdff0da09d9.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/91774.2c27c7c1e7babb15.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/42850.e2d829a9dc4349d0.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/71378.e90398e8f260e180.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/34507.6c1a77fb757fbdcc.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/58519.e65e69443cb8c16b.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/28129.12e84712f6d5fccf.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/67680.9cf78fa8c0374f08.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/44936.21d9b59e8d7bdccb.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/52787.b7b3c2967693c51d.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/96236.ce2e477d1a10900b.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/17250.f68ff3bb5be98918.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/52564.388449dd0b7cccb0.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/99498.012a085d63fca20f.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/10613.33284403173d5b91.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/39452.4e5b9a526cff20a7.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/42322.4ab8445c63ef4103.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/10269.d3a19280ab0502eb.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/webpack-f85e96e588c53278.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/framework-bfbcaa5a2903bc7d.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/main-64c21da41e256517.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/pages/_app-290c624855ed8887.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/3dfade9e-4ca93d92ac876e62.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/c67c952e-5362035f70172687.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/55369f66-92e84f6aba0a73a8.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/99336-0abc93bde9d0d0c5.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/12267-692ae55ed1c1ab04.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/96834-82a933ea266ee7fa.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/68067-3e3eb3988bc7ce5f.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/66968-98e361718b3406c9.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/77313-5e75a7f657f904e9.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/65355-6cf6a168299c7d96.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/97990-a1dcc9be8ef14915.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/71072-3c8d72488796c7fd.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/30365-78f863b9f8f98678.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/12142-a5c1e2ae95f0a4e8.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/1107-fd8421e8dc3ea178.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/61060-b388c6469ee70008.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/63009-bcbc64478132a3e7.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/36813-0173b495df2670c3.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/88866-8ac0b8721444ee25.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/14480-a1975ff402c15b41.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/7654-f43590ca6653f95a.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/47923-21c9929c3318d6b3.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/35098-243fc0a07848d090.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/89735-639c225e70f38b39.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/68654-87f869e363ee7738.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/38639-daa7928f0481123e.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/64353-12f385c311452872.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/97642-ae5caa1c5fb462f6.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/pages/index-0ec84d9a8f311874.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/XlqzWn%2BbwX%2Bk1%2Brv0mOAn9MnYBF%2BjLwQ/89H39d/nmg%3D/_buildManifest.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/XlqzWn%2BbwX%2Bk1%2Brv0mOAn9MnYBF%2BjLwQ/89H39d/nmg%3D/_ssgManifest.js", + "/source-attribution/imt.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/Sohne.cb178166.woff2", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/SourceCodePro-Medium.f5ba3e6a.woff2", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/wave-fallback-desktop-2x.f0521908.webp", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/wave-fallback-tablet-2x.96d6cae7.webp", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/wave-fallback-mobile-2x.3638535c.webp", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/palette-light.3c0e6604.webp", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/5f8c822d1f0f2d3e.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/bb75c7a58537bcfc.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/e5be0f41b7fa7f3f.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/986b2e4562aa9061.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/c3ca6e08b62a6ac3.css", + "inline:#__NEXT_DATA__", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/wave-fallback-desktop-1x.fba6fa88.webp", + "https://images.stripeassets.com/fzn2n1nzq965/vYmk6v8n7oDAwbDpwhjV6/846f9b3e214549b8f14e2b8c8cfe9343/payment-bento-background.jpg", + "https://b.stripecdn.com/stripethirdparty-srv/assets/v33.1/PrivacyCompliance.html", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/98932.192b84a46be184c5.js", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/map-dots.0f396e3d.png", + "https://stripe.com/cookie-settings/enforcement-mode", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/36322.1afe8adb9afbca38.js", + "https://stripe.com/notifications", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/chunks/40414.d4517af1bd2d7917.js", + "https://stripe.com/_workers/_next/static/chunks/dotGeneration.worker.bf20e833.js", + "https://stripe.com/_workers/_next/static/chunks/waveGeometry.worker.07101200.js", + "https://r.stripe.com/0", + "https://q.stripe.com/", + "https://ext.stripe.com/universal-chat/agent-availability", + "https://images.stripeassets.com/fzn2n1nzq965/6BTjJGdjfGVA8brPwj7p3M/fcf084ff85142366e118fe85ee78b632/payments-electric-kettle.jpg", + "https://images.stripeassets.com/fzn2n1nzq965/1Vf8oT9Fm6dEwpnEx5PgK1/055956f38d7fd8b0cc7419692ef29778/bento-terminal.png", + "https://b.stripecdn.com/stripethirdparty-srv/assets/v33.1/GoogleTagManager.html", + "https://assets.stripeassets.com/fzn2n1nzq965/nu0iR4KqmkdJ52fgRts09/c3a10df318e7ffb1f516073daadea625/favicon.ico", + "https://stripe.com/source-attribution/imt.js" + ], + "stylesheets": [ + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/5f8c822d1f0f2d3e.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/bb75c7a58537bcfc.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/e5be0f41b7fa7f3f.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/986b2e4562aa9061.css", + "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/css/c3ca6e08b62a6ac3.css" + ], + "cookies": [ + "cid", + "__Secure-sid", + "_ga" + ], + "metas": [ + "next-head-count=132" + ], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__NEXT_DATA__": { + "present": true + }, + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "14.2.32" + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/supabase.com.json b/tests/corpus/supabase.com.json new file mode 100644 index 0000000..86574cc --- /dev/null +++ b/tests/corpus/supabase.com.json @@ -0,0 +1,293 @@ +{ + "host": "supabase.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "sentry" + ] + }, + "snapshot": [ + "google-analytics:medium", + "nextjs:high@15.5.25", + "posthog:high", + "react:high", + "sentry:high", + "tailwind:high", + "vercel:high", + "webpack:high" + ], + "signals": { + "url": "https://supabase.com/", + "scripts": [ + "https://ss.supabase.com/4icgbaujh/7wnp", + "https://ss.supabase.com/4icgbaujh.js", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/1ffe8106-02c69f01b6e08b47.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3154-5ea5608bef9268f4.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/main-app-2d1469b89ff26b48.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/b17a74fd-3f4a169c66119024.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/1870-b0bd7c259e53faa6.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2317-1d8cd01ee0c1c701.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2097-48d6df6b9600df34.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/707-b35705507bd38e99.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3814-ad6cc00695885450.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2288-17774c07e1723af2.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7886-bbb6b7510c43963c.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3649-04a4ac274cf014b4.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7211-d2b7c5c0c84b5567.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5835-9d986f15c170d277.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4149-9418f2da60a4ba96.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/layout-6393a7c230900a20.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3016-07c95660f61cca18.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/6453-66362a5a98e63b2d.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2409-faee7aa3692f207a.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5722-b0c9ad6fdeb99c9a.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7106-feedeea3c609d36a.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2444-91a2419aaec8fedd.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2481-965716d53a4f2efb.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2218-aeb5426aca46cee4.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5084-9ae14e26b8b35525.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/not-found-51c5c5b7c3766a10.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2384-67aa9acd06613076.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/559-e92094766708d030.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2241-e5d3802b6647f094.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7829-bb0896b38e91b736.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(home)/layout-f11b75a8c2424f21.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/global-error-8d07384ed7bed1a5.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3893-f821df18b4752535.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(home)/page-b9c1868b54c133b8.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/polyfills-42372ed130431b0a.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://ph.supabase.com/static/1.428.3/surveys.js", + "https://ph.supabase.com/array/phc_q2wUqNSr9AsKvH56PBbg9RX5dGKypQZi1gxk3cuSXJ5/config.js", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/webpack-ea52aec2f9cf44af.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/media/443896d591e4f761-s.p.woff2", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/media/4c9affa5bc8f420e-s.p.woff2", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "/images/logos/frameworks/stripe.svg", + "/images/logos/frameworks/nextjs.svg", + "/images/logos/frameworks/openai.svg", + "/images/logos/frameworks/langchain.svg", + "/images/logos/frameworks/flutter.svg", + "/images/logos/frameworks/expo.svg", + "/images/index/products/auth.svg", + "/images/index/products/auth-light.svg", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/186.a23950ce5678464f.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4527.30d2f00f96c574b3.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3002.fcd2d6a63e13659e.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/60.a04c89586bd07fe0.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2876.33908419bd78be05.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/1108.ba12b897d71dd24c.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3275.922514a2035ad3c8.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "/images/index/products/edge-functions-dark.svg", + "/images/index/products/edge-functions-light.svg", + "/images/customers/logos/lovable-homepage-icon.svg", + "/images/blog/avatars/bryan-byrne-lovable.jpeg", + "/images/customers/logos/exprealty-homepage-icon.svg", + "/images/customers/logos/phoenix-energy-homepage-icon.svg", + "/images/customers/logos/chatbase-homepage-icon.svg", + "/images/customers/logos/rally-icon.svg", + "/images/blog/avatars/seth-siegler.jpg", + "/images/blog/avatars/kris-woods-phoenix-energy.jpg", + "/images/blog/avatars/yasser-elsaid-chatbase.jpeg", + "/images/blog/avatars/thiago-peres-rally.jpeg", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/media/4c9affa5bc8f420e-s.p.woff2", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/06406eb603c6a6e7.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/ca5a1d5da97560b5.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/f986e8312f4177a1.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/0c172029f3e1a068.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/c61bfa50fa822b60.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/docs/36371de15127/_next/static/css/0e330e914c31823f.css?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "inline:#_R_", + "inline:#consent", + "https://supabase.com/images/logos/frameworks/stripe.svg", + "https://supabase.com/images/logos/frameworks/openai.svg", + "https://supabase.com/images/logos/frameworks/expo.svg", + "https://supabase.com/images/logos/frameworks/langchain.svg", + "https://supabase.com/images/logos/frameworks/nextjs.svg", + "https://supabase.com/images/logos/frameworks/flutter.svg", + "https://supabase.com/_next/image", + "https://supabase.com/images/index/products/auth-light.svg", + "https://supabase.com/images/index/products/auth.svg", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/440c143c26a742d1.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/62b75d2160101239.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/d8ef6354a210e47f.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/003d20c392d64eb8.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://supabase.com/images/index/products/edge-functions-dark.svg", + "https://supabase.com/images/customers/logos/lovable-homepage-icon.svg", + "https://supabase.com/images/index/products/edge-functions-light.svg", + "https://supabase.com/images/customers/logos/phoenix-energy-homepage-icon.svg", + "https://supabase.com/images/customers/logos/exprealty-homepage-icon.svg", + "https://supabase.com/images/blog/avatars/bryan-byrne-lovable.jpeg", + "https://supabase.com/images/customers/logos/rally-icon.svg", + "https://supabase.com/images/blog/avatars/yasser-elsaid-chatbase.jpeg", + "https://supabase.com/images/customers/logos/chatbase-homepage-icon.svg", + "https://supabase.com/images/blog/avatars/kris-woods-phoenix-energy.jpg", + "https://supabase.com/images/blog/avatars/seth-siegler.jpg", + "https://supabase.com/images/blog/avatars/thiago-peres-rally.jpeg", + "https://supabase.com/images/index/products/auth-active-light.svg", + "https://supabase.com/images/index/products/vector-light.svg", + "https://supabase.com/images/index/products/realtime-light.svg", + "https://supabase.com/images/index/products/data-apis-light.svg", + "https://supabase.com/images/index/products/data-apis-lines-light.svg", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/54b60c1a.01dc14ea75af06db.js", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2096.9760eebe65ed7987.js", + "https://o398706.ingest.us.sentry.io/api/4509834639245312/envelope/", + "https://api.usercentrics.eu/ruleSet/Ot6xUzyQgU2yCM.json", + "https://supabase.com/favicon/favicon.ico", + "https://api.usercentrics.eu/settings/650dpbAjfyAypn/latest/languages.json", + "https://supabase.com/favicon/favicon-32x32.png", + "https://supabase.com/dashboard/sign-up", + "https://supabase.com/contact/sales", + "https://supabase.com/database", + "https://supabase.com/auth", + "https://supabase.com/edge-functions", + "https://supabase.com/storage", + "https://supabase.com/realtime", + "https://api.usercentrics.eu/settings/650dpbAjfyAypn/latest/en.json", + "https://configcat.supabase.com/configuration-files/configcat-proxy/frontend-v2/config_v6.json", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/layout-309943b1c6684388.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/6551-fa69dc3a23ad8b80.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/auth/page-843744e8a5c45dba.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://supabase.com/modules/vector", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/database/page-0298168f814ff046.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://supabase.com/docs/guides/api", + "https://api.supabase.com/platform/telemetry/feature-flags", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/storage/page-59eed807d4c88161.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://supabase.com/pricing", + "https://supabase.com/docs", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/realtime/page-15691ce32c9b440d.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://supabase.com/blog", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/(products)/edge-functions/page-7d316ee2780b82ed.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4117-204be8752e87da4e.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5865-736f0391a99d9b55.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/pricing/page-7f44f46f7f61db0a.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/998e86a0-05d2e70c576a9b94.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/9147-7f7b28e6d3d5fcf5.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2035-3bb77c91de8cd122.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/84-2281516e3279535a.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/8413-17e3464d83dc91d1.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2679-29780fb47c74834c.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4974-b2f0747b909f4c2e.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/8179-9ea3f2dff8414aab.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7899-a765a254b0f7c42f.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/8097-237755e597f65ac5.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/9871-5e814dda6ab4d7de.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5565-c18bd000c59efe69.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/9369-5280e529f49efef3.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/8424-c416c6e759cb951d.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/3834-165f6db1b08a4164.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/7392-22ac02cb4941c804.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4274-25f167a49ec87359.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/guides/api/%5B%5B...slug%5D%5D/page-1914aea54eebc0b3.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/4015-6e7feaad654df128.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/5397-0147c30769ef45e2.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/2537-8afcc2bb8728e01f.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/guides/api/layout-94d15c22aee97272.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/app/error-359bba50fb66af2c.js?dpl=dpl_4EoG7Mx3fs9safUydx72b8kC2mFP", + "https://app.usercentrics.eu/session/1px.png", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/6055.5f9bdad3379140a8.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://api.usercentrics.eu/translations/translations-en.json", + "https://aggregator.service.usercentrics.eu/aggregate/en", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/chunks/6673.be67ee8d48b281d5.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://consent-api.service.consent.usercentrics.eu/consent/uw/3", + "https://ph.supabase.com/api/surveys/", + "https://ph.supabase.com/flags/", + "https://analytics.google.com/g/collect", + "https://ss.supabase.com/4icgbaujh" + ], + "stylesheets": [ + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/440c143c26a742d1.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/62b75d2160101239.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/d8ef6354a210e47f.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R", + "https://frontend-assets.supabase.com/www/36371de15127/_next/static/css/003d20c392d64eb8.css?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R" + ], + "cookies": [ + "ph_phc_q2wUqNSr9AsKvH56PBbg9RX5dGKypQZi1gxk3cuSXJ5_posthog", + "_ga_XW18KGKGNR", + "_ga", + "FPAU" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n\"])", + "self.__next_f.push([1,\"2:I[19472,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587", + "self.__next_f.push([1,\"3:I[30391,[],\\\"\\\"]\\n4:I[24331,[],\\\"\\\"]\\n\"])", + "self.__next_f.push([1,\"5:I[98278,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587", + "self.__next_f.push([1,\"6:I[62006,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587", + "self.__next_f.push([1,\"7:I[1004,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587\\", + "self.__next_f.push([1,\"8:I[26410,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587", + "self.__next_f.push([1,\"9:I[22307,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"9587", + "self.__next_f.push([1,\"f:I[38569,[\\\"4219\\\",\\\"static/chunks/app/global-error-8d07384ed7bed1a5.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\", + "self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"2xMsaPrDOWpEwtS7e4Jig\\\",\\\"p\\\":\\\"https://frontend-assets.supabase.com/www/36371de15127\\\",", + "self.__next_f.push([1,\"11:I[22139,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"958", + "self.__next_f.push([1,\"13:I[18494,[],\\\"OutletBoundary\\\"]\\n15:I[90291,[],\\\"AsyncMetadataOutlet\\\"]\\n17:I[18494,[],\\\"ViewportBoundary\\\"]", + "self.__next_f.push([1,\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Service\\\",\\\"name\\\":\\\"Supabase\\\",\\\"description\\\":\\\"Build produ", + "self.__next_f.push([1,\"b:[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"$10\\\"}}]\\", + "self.__next_f.push([1,\"18:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"", + "self.__next_f.push([1,\"1c:I[61629,[\\\"2613\\\",\\\"static/chunks/953f2711-63f00c6fd5f4d8ec.js?dpl=dpl_Fq9tMQK6nACB2xAKrrfWUsH3d26R\\\",\\\"958", + "self.__next_f.push([1,\"1d:T1430,\"])", + "self.__next_f.push([1,\"M45.74 23.6983C45.2739 23.5379 44.7909 23.3861 44.2937 23.2426C44.3754 22.909 44.4504 22.5798 44.5171 22.2561C", + "self.__next_f.push([1,\"1e:Tc1d,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-dark\\\" style=\\\"background-color:#00000000;color:#ffffff\\\" tabindex=\\\"0\\\"\\u003", + "self.__next_f.push([1,\"1f:Teb7,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-light\\\" style=\\\"background-color:#00000000;color:#525252\\\" tabindex=\\\"0\\\"\\u00", + "self.__next_f.push([1,\"20:Ta22,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-dark\\\" style=\\\"background-color:#00000000;color:#ffffff\\\" tabindex=\\\"0\\\"\\u003", + "self.__next_f.push([1,\"21:Tc0d,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-light\\\" style=\\\"background-color:#00000000;color:#525252\\\" tabindex=\\\"0\\\"\\u00", + "self.__next_f.push([1,\"22:T963,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-dark\\\" style=\\\"background-color:#00000000;color:#ffffff\\\" tabindex=\\\"0\\\"\\u003", + "self.__next_f.push([1,\"23:Ta9f,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-light\\\" style=\\\"background-color:#00000000;color:#525252\\\" tabindex=\\\"0\\\"\\u00", + "self.__next_f.push([1,\"24:T8e8,\"])", + "self.__next_f.push([1,\"M29.9094 11.2292C35.956 7.37668 44.3187 9.17299 48.553 15.2334H48.5532C50.5831 18.0746 51.3826 21.614 50.771 2", + "self.__next_f.push([1,\"25:Ta8c,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-dark\\\" style=\\\"background-color:#00000000;color:#ffffff\\\" tabindex=\\\"0\\\"\\u003", + "self.__next_f.push([1,\"26:Tb19,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-light\\\" style=\\\"background-color:#00000000;color:#525252\\\" tabindex=\\\"0\\\"\\u00", + "self.__next_f.push([1,\"27:Tced,\"])", + "self.__next_f.push([1,\"\\u003cpre class=\\\"shiki supabase-dark\\\" style=\\\"background-color:#00000000;color:#ffffff\\\" tabindex=\\\"0\\\"\\u003" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "15.5.25" + }, + "posthog": { + "present": true + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/svelte.dev.json b/tests/corpus/svelte.dev.json new file mode 100644 index 0000000..d3530b8 --- /dev/null +++ b/tests/corpus/svelte.dev.json @@ -0,0 +1,129 @@ +{ + "host": "svelte.dev", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "svelte", + "sveltekit" + ] + }, + "snapshot": [ + "svelte:high@5", + "sveltekit:high", + "vercel:high" + ], + "signals": { + "url": "https://svelte.dev/", + "scripts": [ + "/51a6d87104faba1d/script.js", + "/_vercel/insights/script.js", + "./_app/immutable/assets/eb-garamond-latin-400-normal.DSJrtJSV.woff2", + "./_app/immutable/assets/dm-serif-display-latin-400-normal.C5_t9oOD.woff2", + "./_app/immutable/assets/fira-sans-latin-400-normal.a0AnQzuD.woff2", + "./_app/immutable/entry/start.kU3ZOo6P.js", + "./_app/immutable/chunks/kNaey6uv.js", + "./_app/immutable/entry/payload.DSmR2FwN.js", + "./_app/immutable/chunks/CM-d7kh4.js", + "./_app/immutable/chunks/B3VH3IKy.js", + "./_app/immutable/chunks/BZtWyCfz.js", + "./_app/immutable/chunks/9UEQW3Ry.js", + "./_app/immutable/chunks/DYrviY11.js", + "./_app/immutable/chunks/ADgAMhAY.js", + "./_app/immutable/entry/app.Dvrlma3a.js", + "./_app/immutable/chunks/C6WuQBXR.js", + "./_app/immutable/nodes/0.DG3tp3_o.js", + "./_app/immutable/chunks/tTSrAR-7.js", + "./_app/immutable/chunks/mf4J78rW.js", + "./_app/immutable/chunks/Cyuzqnbw.js", + "./_app/immutable/chunks/CT1pIz1V.js", + "./_app/immutable/chunks/BH-e7qfU.js", + "./_app/immutable/chunks/G6Q6idGW.js", + "./_app/immutable/chunks/DCcLtfKt.js", + "./_app/immutable/chunks/DrRLr3pK.js", + "./_app/immutable/chunks/BvYsTj2T.js", + "./_app/immutable/chunks/CBCSvp1g.js", + "./_app/immutable/nodes/5.DRn6DC0e.js", + "./_app/immutable/chunks/DINvc68v.js", + "https://svelte.dev/_app/immutable/nodes/1.GUNuwZYC.js", + "https://svelte.dev/_app/immutable/assets/eb-garamond-latin-400-normal.DSJrtJSV.woff2", + "https://svelte.dev/_app/immutable/assets/dm-serif-display-latin-400-normal.C5_t9oOD.woff2", + "https://svelte.dev/_app/immutable/assets/fira-sans-latin-400-normal.a0AnQzuD.woff2", + "https://svelte.dev/_app/immutable/entry/start.kU3ZOo6P.js", + "https://svelte.dev/_app/immutable/chunks/kNaey6uv.js", + "https://svelte.dev/_app/immutable/chunks/CM-d7kh4.js", + "https://svelte.dev/_app/immutable/entry/payload.DSmR2FwN.js", + "https://svelte.dev/_app/immutable/chunks/B3VH3IKy.js", + "https://svelte.dev/_app/immutable/entry/app.Dvrlma3a.js", + "https://svelte.dev/_app/immutable/chunks/9UEQW3Ry.js", + "https://svelte.dev/_app/immutable/chunks/ADgAMhAY.js", + "https://svelte.dev/_app/immutable/chunks/DYrviY11.js", + "https://svelte.dev/_app/immutable/chunks/BZtWyCfz.js", + "https://svelte.dev/_app/immutable/nodes/0.DG3tp3_o.js", + "https://svelte.dev/_app/immutable/chunks/C6WuQBXR.js", + "https://svelte.dev/_app/immutable/chunks/BH-e7qfU.js", + "https://svelte.dev/_app/immutable/chunks/mf4J78rW.js", + "https://svelte.dev/_app/immutable/chunks/tTSrAR-7.js", + "https://svelte.dev/_app/immutable/chunks/Cyuzqnbw.js", + "https://svelte.dev/_app/immutable/chunks/CT1pIz1V.js", + "https://svelte.dev/_app/immutable/chunks/G6Q6idGW.js", + "https://svelte.dev/_app/immutable/chunks/DCcLtfKt.js", + "https://svelte.dev/_app/immutable/chunks/DrRLr3pK.js", + "https://svelte.dev/_app/immutable/chunks/BvYsTj2T.js", + "https://svelte.dev/_app/immutable/nodes/5.DRn6DC0e.js", + "https://svelte.dev/_app/immutable/chunks/CBCSvp1g.js", + "https://svelte.dev/_app/immutable/chunks/DINvc68v.js", + "https://svelte.dev/_app/immutable/assets/search.Bf59X-yG.css", + "https://svelte.dev/_app/immutable/assets/0.qrmhJS98.css", + "https://svelte.dev/_app/immutable/assets/components.JI3lHpuz.css", + "https://svelte.dev/_app/immutable/assets/Text.Bgvayb8P.css", + "https://svelte.dev/_app/immutable/assets/5.OTlLV2Pl.css", + "https://svelte.dev/_app/immutable/assets/svelte-pronunciation.DFRMnECz.svg", + "https://svelte.dev/_app/immutable/assets/stack-overflow.BVR0Cdju.avif", + "https://svelte.dev/_app/immutable/assets/svelte-machine-desktop.C2uKxdp4.avif", + "https://svelte.dev/_app/immutable/assets/state-of-js-chart.Dr89S1l7.avif", + "https://svelte.dev/_app/immutable/assets/mullvad.BoCDoRBI.svg", + "https://svelte.dev/_app/immutable/assets/nyt.WSBgWcyP.svg", + "https://svelte.dev/_app/immutable/assets/decathlon.CsAZfh9C.svg", + "https://svelte.dev/_app/immutable/assets/yelp.BCIQykSN.svg", + "https://svelte.dev/_app/immutable/assets/1password.EAEOcf-b.svg", + "https://svelte.dev/_app/immutable/assets/summit.Bd2uC0Nw.avif", + "https://svelte.dev/manifest.json", + "https://svelte.dev/_app/immutable/assets/contributors.jTr4NgjX.webp", + "https://svelte.dev/_app/immutable/assets/donors.8chz04LF.webp", + "https://svelte.dev/_app/immutable/assets/1.CciMtt34.css", + "https://svelte.dev/favicon.png", + "https://svelte.dev/images/svelte-android-chrome-192.png", + "https://svelte.dev/51a6d87104faba1d/script.js", + "https://svelte.dev/_vercel/insights/script.js", + "https://svelte.dev/assets/search-worker-BnNnmuoz.js" + ], + "stylesheets": [ + "./_app/immutable/assets/stores.DoLKfBGK.css", + "./_app/immutable/assets/search.Bf59X-yG.css", + "./_app/immutable/assets/Text.Bgvayb8P.css", + "./_app/immutable/assets/components.JI3lHpuz.css", + "./_app/immutable/assets/0.qrmhJS98.css", + "./_app/immutable/assets/5.OTlLV2Pl.css", + "https://svelte.dev/_app/immutable/assets/1.CciMtt34.css" + ], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [ + ".svelte-" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__svelte": { + "present": true, + "version": "5" + }, + "__sveltekit": { + "present": true + } + } +} diff --git a/tests/corpus/tailwindcss.com.json b/tests/corpus/tailwindcss.com.json new file mode 100644 index 0000000..5faf842 --- /dev/null +++ b/tests/corpus/tailwindcss.com.json @@ -0,0 +1,226 @@ +{ + "host": "tailwindcss.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "tailwind" + ] + }, + "snapshot": [ + "google-analytics:high", + "nextjs:high@16.2.6", + "react:high", + "tailwind:high", + "turbopack:high" + ], + "signals": { + "url": "https://tailwindcss.com/", + "scripts": [ + "/_next/static/chunks/0srs2cqqpk188.js", + "/_next/static/chunks/0aqjr575~-kiw.js", + "/_next/static/chunks/0z_50l.zjgt03.js", + "/_next/static/chunks/turbopack-00669_q1z8o3u.js", + "/_next/static/chunks/0y97be86sc~2s.js", + "/_next/static/chunks/17o076c4jq00a.js", + "/_next/static/chunks/0wixf9kntow24.js", + "/_next/static/chunks/14npz~h5j0o4o.js", + "/_next/static/chunks/07~aodfidibfj.js", + "/_next/static/chunks/0ctxx.71d48c7.js", + "/_next/static/chunks/0-w~_j13fbofx.js", + "/_next/static/chunks/0eift~.g6ajk7.js", + "/_next/static/chunks/122cqq07nrvzt.js", + "/_next/static/chunks/03~yq9q893hmn.js", + "/_next/static/chunks/03qg92y~mksg7.js", + "/_next/static/chunks/0qdme1q3zt0a3.js", + "/_next/static/chunks/17fs~.nc16hx8.js", + "/_next/static/chunks/0mfmiooc.6xfj.js", + "/_next/static/chunks/0we_bdh_cr6pu.js", + "/_next/static/chunks/07m4i.3jmkizx.js", + "/_next/static/chunks/08gyl.us_fmj7.js", + "data:text/javascript;base64,CiAgaWYgKCEoJ191cGRhdGVUaGVtZScgaW4gd2luZG93KSkgewogICAgd2luZG93Ll91cGRhdGVUaGVtZSA9IGZ1bmN0aW9uIHVwZGF0ZVRoZW1lKHRoZW1lKSB7CiAgICAgIGxldCBjbGFzc0xpc3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0OwoKICAgICAgY2xhc3NMaXN0LnJlbW92ZSgibGlnaHQiLCAiZGFyayIsICJzeXN0ZW0iKTsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbWV0YVtuYW1lPSJ0aGVtZS1jb2xvciJdJykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSkKICAgICAgaWYgKHRoZW1lID09PSAnZGFyaycpIHsKICAgICAgICBjbGFzc0xpc3QuYWRkKCdkYXJrJykKCiAgICAgICAgbGV0IG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJykKICAgICAgICBtZXRhLm5hbWUgPSAndGhlbWUtY29sb3InCiAgICAgICAgbWV0YS5jb250ZW50ID0gJ29rbGNoKC4xMyAuMDI4IDI2MS42OTIpJwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YSkKICAgICAgfSBlbHNlIGlmICh0aGVtZSA9PT0gJ2xpZ2h0JykgewogICAgICAgIGNsYXNzTGlzdC5hZGQoJ2xpZ2h0JykKCiAgICAgICAgbGV0IG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJykKICAgICAgICBtZXRhLm5hbWUgPSAndGhlbWUtY29sb3InCiAgICAgICAgbWV0YS5jb250ZW50ID0gJ3doaXRlJwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YSkKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGFzc0xpc3QuYWRkKCdzeXN0ZW0nKQoKICAgICAgICBsZXQgbWV0YTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJykKICAgICAgICBtZXRhMS5uYW1lID0gJ3RoZW1lLWNvbG9yJwogICAgICAgIG1ldGExLmNvbnRlbnQgPSAnb2tsY2goLjEzIC4wMjggMjYxLjY5MiknCiAgICAgICAgbWV0YTEubWVkaWEgPSAnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG1ldGExKQoKICAgICAgICBsZXQgbWV0YTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJykKICAgICAgICBtZXRhMi5uYW1lID0gJ3RoZW1lLWNvbG9yJwogICAgICAgIG1ldGEyLmNvbnRlbnQgPSAnd2hpdGUnCiAgICAgICAgbWV0YTIubWVkaWEgPSAnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCknCiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChtZXRhMikKICAgICAgfQogICAgfQoKICAgIHRyeSB7CiAgICAgIF91cGRhdGVUaGVtZShsb2NhbFN0b3JhZ2UuY3VycmVudFRoZW1lKQogICAgfSBjYXRjaCAoXykge30KCiAgICB0cnkgewogICAgICBpZiAoLyhNYWN8aVBob25lfGlQb2R8aVBhZCkvaS50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpIHsKICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3MtbWFjb3MnKQogICAgICB9CiAgICB9IGNhdGNoIChfKSB7fQogIH0K", + "https://www.googletagmanager.com/gtag/js", + "/_next/static/media/IBMPlexMono_Italic-s.p.15oe4fv9c-bbx.woff2", + "/_next/static/media/IBMPlexMono_Medium-s.p.1415hm2grr_xe.woff2", + "/_next/static/media/IBMPlexMono_MediumItalic-s.p.0i6~4uf_-vfrr.woff2", + "/_next/static/media/IBMPlexMono_Regular-s.p.182ynbf68e-7x.woff2", + "/_next/static/media/IBMPlexMono_SemiBold-s.p.0ruh16q_m63mu.woff2", + "/_next/static/media/IBMPlexMono_SemiBoldItalic-s.p.0.skgl0kdzuzk.woff2", + "/_next/static/media/InterVariable-s.p.0r27kd5h06n72.woff2", + "/_next/static/media/InterVariable_Italic-s.p.0lyls.rsx6v21.woff2", + "/_next/static/media/SourceSansPro_Regular_ttf-s.p.0~_u57fu-gtq..woff2", + "/_next/static/media/Ubuntu_Mono_bold-s.p.0_c25cd9jck4l.woff2", + "/_next/static/media/cover.0g8-x6e87bh6a.png", + "/_next/static/media/responsive-1.10chodfonif1e.png", + "/_next/static/media/responsive-2.0cdenvbjn04n3.png", + "/_next/static/media/3d-transforms.02bsrv~jiqeb9.jpeg", + "/_next/static/media/responsive-3.00654hu_8u-c4.png", + "/_next/static/media/responsive-4.0tgrujz.2n-61.png", + "/_next/static/media/responsive-5.0o6kz.kakewtv.png", + "/_next/static/media/filters.17z4w2mm8xht2.png", + "/_next/static/media/dark-mode.light.0tx34lu8jwt_1.png", + "/_next/static/media/dark-mode.dark.11szx9d7s4zjz.png", + "/_next/static/media/css-grid-1.0c8bc8q87-upx.png", + "/_next/static/media/css-grid-1.mobile.0oommaznlmjjx.png", + "/_next/static/media/css-grid-2.15b-x2ty8.g~z.png", + "/_next/static/media/css-grid-3.08b3dk7gkiatg.png", + "/_next/static/media/css-grid-4.0iikpmqc8shsg.png", + "/_next/static/media/avatar-4.147155nkju-ki.png", + "/_next/static/media/avatar-5.0hg2xy51~_xab.png", + "/_next/static/media/avatar-6.03.hh~61qqypr.png", + "/_next/static/media/avatar-7.0og44ub0nz8ek.png", + "/_next/static/media/avatar-1.15~cxxh-ptz0r.png", + "/_next/static/media/avatar-2.12imlx8.m5il..png", + "/_next/static/media/avatar-3.0co4yvnojd00m.png", + "inline:#_R_", + "inline:#_next-ga-init", + "inline:#_next-ga", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_Italic-s.p.15oe4fv9c-bbx.woff2", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_Medium-s.p.1415hm2grr_xe.woff2", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_MediumItalic-s.p.0i6~4uf_-vfrr.woff2", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_Regular-s.p.182ynbf68e-7x.woff2", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_SemiBold-s.p.0ruh16q_m63mu.woff2", + "https://tailwindcss.com/_next/static/media/InterVariable-s.p.0r27kd5h06n72.woff2", + "https://tailwindcss.com/_next/static/media/IBMPlexMono_SemiBoldItalic-s.p.0.skgl0kdzuzk.woff2", + "https://tailwindcss.com/_next/static/media/InterVariable_Italic-s.p.0lyls.rsx6v21.woff2", + "https://tailwindcss.com/_next/static/media/SourceSansPro_Regular_ttf-s.p.0~_u57fu-gtq..woff2", + "https://tailwindcss.com/_next/static/media/Ubuntu_Mono_bold-s.p.0_c25cd9jck4l.woff2", + "https://tailwindcss.com/_next/static/media/cover.0g8-x6e87bh6a.png", + "https://tailwindcss.com/_next/static/media/responsive-1.10chodfonif1e.png", + "https://tailwindcss.com/_next/static/media/responsive-3.00654hu_8u-c4.png", + "https://tailwindcss.com/_next/static/media/responsive-2.0cdenvbjn04n3.png", + "https://tailwindcss.com/_next/static/media/3d-transforms.02bsrv~jiqeb9.jpeg", + "https://tailwindcss.com/_next/static/media/responsive-4.0tgrujz.2n-61.png", + "https://tailwindcss.com/_next/static/media/responsive-5.0o6kz.kakewtv.png", + "https://tailwindcss.com/_next/static/media/filters.17z4w2mm8xht2.png", + "https://tailwindcss.com/_next/static/media/dark-mode.dark.11szx9d7s4zjz.png", + "https://tailwindcss.com/_next/static/media/dark-mode.light.0tx34lu8jwt_1.png", + "https://tailwindcss.com/_next/static/chunks/0n9_1tq74i09x.css", + "https://tailwindcss.com/_next/static/chunks/017r-ibrf-le-.css", + "https://tailwindcss.com/_next/static/chunks/0srs2cqqpk188.js", + "https://tailwindcss.com/_next/static/chunks/08gyl.us_fmj7.js", + "https://tailwindcss.com/_next/static/chunks/0aqjr575~-kiw.js", + "https://tailwindcss.com/_next/static/chunks/0z_50l.zjgt03.js", + "https://tailwindcss.com/_next/static/chunks/0y97be86sc~2s.js", + "https://tailwindcss.com/_next/static/chunks/17o076c4jq00a.js", + "https://tailwindcss.com/_next/static/chunks/turbopack-00669_q1z8o3u.js", + "https://tailwindcss.com/_next/static/chunks/0wixf9kntow24.js", + "https://tailwindcss.com/_next/static/chunks/14npz~h5j0o4o.js", + "https://tailwindcss.com/_next/static/chunks/07~aodfidibfj.js", + "https://tailwindcss.com/_next/static/chunks/0ctxx.71d48c7.js", + "https://tailwindcss.com/_next/static/chunks/0eift~.g6ajk7.js", + "https://tailwindcss.com/_next/static/chunks/122cqq07nrvzt.js", + "https://tailwindcss.com/_next/static/chunks/0-w~_j13fbofx.js", + "https://tailwindcss.com/_next/static/media/css-grid-1.0c8bc8q87-upx.png", + "https://tailwindcss.com/_next/static/media/css-grid-1.mobile.0oommaznlmjjx.png", + "https://tailwindcss.com/_next/static/media/css-grid-3.08b3dk7gkiatg.png", + "https://tailwindcss.com/_next/static/media/css-grid-2.15b-x2ty8.g~z.png", + "https://tailwindcss.com/_next/static/media/css-grid-4.0iikpmqc8shsg.png", + "https://tailwindcss.com/_next/static/media/avatar-4.147155nkju-ki.png", + "https://tailwindcss.com/_next/static/media/avatar-5.0hg2xy51~_xab.png", + "https://tailwindcss.com/_next/static/media/avatar-6.03.hh~61qqypr.png", + "https://tailwindcss.com/_next/static/media/avatar-7.0og44ub0nz8ek.png", + "https://tailwindcss.com/_next/static/media/avatar-1.15~cxxh-ptz0r.png", + "https://tailwindcss.com/_next/static/media/avatar-3.0co4yvnojd00m.png", + "https://tailwindcss.com/_next/static/media/avatar-2.12imlx8.m5il..png", + "https://tailwindcss.com/favicons/site.webmanifest", + "https://tailwindcss.com/favicons/favicon.ico", + "https://tailwindcss.com/docs/installation", + "https://tailwindcss.com/partners", + "https://tailwindcss.com/blog", + "https://tailwindcss.com/showcase", + "https://www.google-analytics.com/g/collect", + "https://tailwindcss.com/docs", + "https://tailwindcss.com/docs/installation/using-vite", + "https://tailwindcss.com/_next/static/chunks/03qg92y~mksg7.js", + "https://tailwindcss.com/_next/static/chunks/0qdme1q3zt0a3.js", + "https://tailwindcss.com/_next/static/chunks/17fs~.nc16hx8.js", + "https://tailwindcss.com/_next/static/chunks/0mfmiooc.6xfj.js", + "https://tailwindcss.com/_next/static/chunks/0we_bdh_cr6pu.js", + "https://tailwindcss.com/", + "https://tailwindcss.com/_next/static/chunks/07m4i.3jmkizx.js" + ], + "stylesheets": [ + "/_next/static/chunks/017r-ibrf-le-.css", + "/_next/static/chunks/0n9_1tq74i09x.css" + ], + "cookies": [ + "_ga_TMR96VNVMT", + "_ga" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n4:I[196078,[\\\"/_next/static/chunks/0y97be86sc~2s.js\\\",\\\"/_next/static/chunks/17o076c4j", + "self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"index\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]},\\\"$", + "self.__next_f.push([1,\"d:I[591993,[\\\"/_next/static/chunks/0y97be86sc~2s.js\\\",\\\"/_next/static/chunks/17o076c4jq00a.js\\\",\\\"/_next/stati", + "self.__next_f.push([1,\"\\n if (!('_updateTheme' in window)) {\\n window._updateTheme = function updateTheme(theme) {\\n let cla", + "self.__next_f.push([1,\"e:T7e8,\"])", + "self.__next_f.push([1,\"data:text/javascript;base64,CiAgaWYgKCEoJ191cGRhdGVUaGVtZScgaW4gd2luZG93KSkgewogICAgd2luZG93Ll91cGRhdGVUaGVtZS", + "self.__next_f.push([1,\"2:[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"inter_6a166f28-module__775SPq__variable plexmono_ffb31", + "self.__next_f.push([1,\"3:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"max-w-screen overflow-x-hidden\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"c", + "self.__next_f.push([1,\"1b:I[104100,[\\\"/_next/static/chunks/0y97be86sc~2s.js\\\",\\\"/_next/static/chunks/17o076c4jq00a.js\\\",\\\"/_next/stat", + "self.__next_f.push([1,\"f:[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"$L1b\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L1c\\\",null,{\\\"children\\\":[\\", + "self.__next_f.push([1,\"12:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"px-2 max-sm:px-4\\\",\\\"children\\\":[\\\"$\\\",\\\"$L20\\\",null,{\\\"href\\\":\\\"/part", + "self.__next_f.push([1,\"M88.759 23.382c-2.762.733-4.628 2.756-5.421 5.85-.25.953-.265 2.214-.265 18.842v17.815l.338 1.173c1.131 3.886 ", + "self.__next_f.push([1,\"13:[\\\"$\\\",\\\"section\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"relative isolate mt-16\\\",\\\"child", + "self.__next_f.push([1,\"14:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"relative max-w-full\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"aria-hidden", + "self.__next_f.push([1,\"15:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"relative max-w-full\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"aria-hidden", + "self.__next_f.push([1,\"16:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"relative max-w-full\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"aria-hidden", + "self.__next_f.push([1,\"17:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"row-span-full row-start-1 hidden border-x border-x-(--pattern-fg) bg-[", + "self.__next_f.push([1,\"18:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"col-start-1 row-start-3 md:col-start-2 relative before:absolute before", + "self.__next_f.push([1,\"19:[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"col-start-1 row-start-5 grid md:col-start-2\\\",\\\"children\\\":[\\\"$\\\",\\\"di", + "self.__next_f.push([1,\"9f:I[290227,[\\\"/_next/static/chunks/0y97be86sc~2s.js\\\",\\\"/_next/static/chunks/17o076c4jq00a.js\\\",\\\"/_next/stat", + "self.__next_f.push([1,\" 1.862-2.938 4.604-3.32 8.475-.426 4.472.323 9.179 1.925 11.877.69 1.173 2.336 2.742 3.394 3.255 1.16.557 2.38", + "self.__next_f.push([1,\"M137.491 56.34c0 9.253-5.003 14.905-12.062 14.905-3.558 0-6.782-1.496-8.839-4.322v3.768h-6.225V30.463h6.67v14.", + "self.__next_f.push([1,\"24:[\\\"$\\\",\\\"li\\\",\\\"1\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M140.53 47.78c1.756-.061 3.305-.446 4.647-1.155 1.343-.71 2.371-1.695 3.084-2.958.713-1.263 1.041-2.703.985-4.", + "self.__next_f.push([1,\"25:[\\\"$\\\",\\\"li\\\",\\\"2\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M235.735 63.286V43.539H230.5v-6.236h5.235v-3.378c0-3.083.933-5.508 2.799-7.275 1.865-1.766 4.232-2.65 7.1-2.65", + "self.__next_f.push([1,\"26:[\\\"$\\\",\\\"li\\\",\\\"3\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"73:T7b3,\"])", + "self.__next_f.push([1,\"M117.236 39.269c8.585 0 14.832 5.914 14.389 16.663h-20.907c.781 2.987 2.867 5.554 7.042 5.554 2.338 0 4.474-.6", + "self.__next_f.push([1,\"27:[\\\"$\\\",\\\"li\\\",\\\"4\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M97.75 53.131c.269 2.528 2.549 6.862 9.165 6.862 5.767 0 8.54-3.702 8.54-7.313 0-3.25-2.191-5.914-6.528-6.817l", + "self.__next_f.push([1,\"28:[\\\"$\\\",\\\"li\\\",\\\"5\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M139.122 38.9833C143.649 38.9833 148.414 40.7826 151.366 44.264C151.386 44.2869 151.383 44.3211 151.36 44.3407", + "self.__next_f.push([1,\"29:[\\\"$\\\",\\\"li\\\",\\\"6\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M93.016 23.16c.286 0 .563.116.766.317l12.223 12.19c.521.52 1.398.016 1.206-.694l-2.808-10.456a1.079 1.079 0 0 ", + "self.__next_f.push([1,\"2a:[\\\"$\\\",\\\"li\\\",\\\"7\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin", + "self.__next_f.push([1,\"M31.196 54.947v-11.6c0-1.705.82-3.307 2.202-4.303l14.958-10.778a5.645 5.645 0 0 1 3.3-1.066h.047c1.23 0 2.42.3", + "self.__next_f.push([1,\"2b:[\\\"$\\\",\\\"li\\\",\\\"8\\\",{\\\"className\\\":\\\"max-lg:nth-[2n+1]:line-y lg:max-xl:nth-[3n+1]:line-y xl:nth-[4n+1]:lin" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "gtag": { + "present": true + }, + "next": { + "present": true, + "version": "16.2.6" + } + } +} diff --git a/tests/corpus/vercel.com.json b/tests/corpus/vercel.com.json new file mode 100644 index 0000000..5afed47 --- /dev/null +++ b/tests/corpus/vercel.com.json @@ -0,0 +1,275 @@ +{ + "host": "vercel.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react" + ] + }, + "snapshot": [ + "nextjs:high@16.4.0-canary.38", + "react:high", + "sentry:high", + "tailwind:high", + "turbopack:high" + ], + "signals": { + "url": "https://vercel.com/", + "scripts": [ + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0bs4n2_edlqne.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0owug_ddyv1vg.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2vs1fy64ihqqg.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3gow2hkf89_jp.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/10-slxy3-ti0h.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ay3h2crvho5y.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/turbopack-0-hvg4p2ijuk_.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1hw5n44or--4j.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/147ujjk77aqa7.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1oez-owmp2dp2.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/34ziow-u_zazj.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/428gv74qq_i37.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0oprc9s5_r4h8.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1p2eo97ustm8y.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3itlu2byylxeh.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3nxc8u74fya35.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0wt_1iuzcs8e6.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2r0ccl7n5nt4g.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ccccji0vqb5n.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/029-p4avzrolk.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/32s--x5r9f3b_.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/078yuwgn12ezs.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/403t_jeyjlrom.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3a6ar-jwn2iq6.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/14og54uk-xov6.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/32j33577pcdnu.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1fsral2pnonf3.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0p-xrixq6u61_.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1c7k32fmc0o06.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2hhyo851_u03r.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2ha9o9-4jy7jy.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2wk26a4g5ahw9.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1-af3kex0p3ty.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2-1p0ptojyqas.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3bn-bs78cw90d.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0c_4d4xzryvz1.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1cr30751f2zn-.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3-g58oiav9nyy.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2s6vi1i240qwg.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1xyytlzi16z3d.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/08smotd5kh43_.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/40-55sqylhc9u.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0c0hxoamwjsbw.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0-4obw4-9_rlf.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0yf294x9v-il4.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3utc-iijqkoiu.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/26ny4uv4hpx9n.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/23ohqtcmjwrtw.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/10k8h7rb6zg4a.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ajjxruqy81cx.js", + "/3628f7ea4ecd82e3/script.js", + "/e62b3a9e28ed8bca/script.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1k0hduehtsgu-.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2cz76a3scrz5m.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0j1oddfmy-m4x.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1vegwuzpyho1y.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0m0kwuvo8jbdc.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3mr8ctdznyvbt.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3odxyta04ibcu.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2o9clswbylydy.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3w0x8f5fpp86t.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0y5h34jpppo5o.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1dbjpgrgn3v0n.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0amh-njelfa9z.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3tpuin96wyfqw.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1zmta2vaj42ws.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/126r9m8zogpwd.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1jqjyoruf7pyg.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2cx-pp9-4xpfn.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/34riqpyjurd8w.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1m4klzumr-je0.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0rw7gja-cvri8.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0gmnglxayesjd.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3necpthhvrsn9.js", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/21eqdcbfv91jc.js", + "/vc-ap-vercel-marketing/_next/static/immutable/media/797e433ab948586e.p.1v5bejj26fx9h.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/Geist_Variable-s.p.2v-cf9syxr5ni.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/vercel-light.3_gxxexgi1nmy.svg", + "/vc-ap-vercel-marketing/_next/static/immutable/media/vercel-dark.1f3cgy23m5_jy.svg", + "/vc-ap-vercel-marketing/_next/static/immutable/media/eve-light.1e3bxs4ejw62x.svg", + "/vc-ap-vercel-marketing/_next/static/immutable/media/eve-dark.2l_s1mlvozam3.svg", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/4416df5k5txri.css", + "/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Circle.p.2p5mi6n8co77s.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Grid.p.0c5uz3kz61pux.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Line.p.3lxddzyuwzx1_.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Square.p.3ig4wtfmw09gh.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Triangle.p.0s2yyo-clipe_.woff2", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/0lpe19hbxgq3u.css", + "inline:#theme-script", + "inline:#vercel-organization-json-ld", + "inline:#vercel-homepage-service-json-ld", + "inline:#vercel-homepage-software-application-json-ld", + "inline:#_R_", + "inline:#browser-check", + "inline:#script-sift", + "inline:#prefetch-zones-links", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/797e433ab948586e.p.1v5bejj26fx9h.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/vercel-light.3_gxxexgi1nmy.svg", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/Geist_Variable-s.p.2v-cf9syxr5ni.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/eve-light.1e3bxs4ejw62x.svg", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/vercel-dark.1f3cgy23m5_jy.svg", + "https://vercel.com/vc-ap-vercel-marketing/_next/image", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/eve-dark.2l_s1mlvozam3.svg", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1dztsftrfvd81.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2_ldsldljxf4t.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3u82rwmj_1n8p.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1kg_xnxz_g_35.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0bs4n2_edlqne.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/21eqdcbfv91jc.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0owug_ddyv1vg.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2vs1fy64ihqqg.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/10-slxy3-ti0h.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ay3h2crvho5y.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/turbopack-0-hvg4p2ijuk_.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3gow2hkf89_jp.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1hw5n44or--4j.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1oez-owmp2dp2.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/428gv74qq_i37.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/147ujjk77aqa7.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/34ziow-u_zazj.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3itlu2byylxeh.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0oprc9s5_r4h8.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2r0ccl7n5nt4g.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3nxc8u74fya35.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1p2eo97ustm8y.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0wt_1iuzcs8e6.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ccccji0vqb5n.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/029-p4avzrolk.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/078yuwgn12ezs.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/32s--x5r9f3b_.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1fsral2pnonf3.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/14og54uk-xov6.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/32j33577pcdnu.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/403t_jeyjlrom.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3a6ar-jwn2iq6.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1-af3kex0p3ty.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0c_4d4xzryvz1.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2ha9o9-4jy7jy.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2wk26a4g5ahw9.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3bn-bs78cw90d.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2hhyo851_u03r.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2-1p0ptojyqas.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1c7k32fmc0o06.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0p-xrixq6u61_.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1cr30751f2zn-.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3-g58oiav9nyy.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/4416df5k5txri.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/08smotd5kh43_.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2s6vi1i240qwg.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/40-55sqylhc9u.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1xyytlzi16z3d.js", + "https://vercel.com/manifest.webmanifest", + "https://lishhsx6kmthaacj.public.blob.vercel-storage.com/notion-desktop-light.webp", + "https://lishhsx6kmthaacj.public.blob.vercel-storage.com/zapier-desktop-light.webp", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0-4obw4-9_rlf.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0yf294x9v-il4.js", + "https://assets.vercel.com/image/upload/q_auto/front/favicon/vercel/favicon.ico", + "https://py8fhxnkzwtsqdo9.public.blob.vercel-storage.com/front/favicon/vercel/android-chrome-192x192.png", + "https://vercel.com/.well-known/vercel/microfrontends/client-config", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3utc-iijqkoiu.js", + "https://vercel.com/home", + "https://vercel.com/enterprise", + "https://vercel.com/pricing", + "https://vercel.com/contact/sales", + "https://vercel.com/api/client-only-flags/show-platform-status-indicator", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Grid.p.0c5uz3kz61pux.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Circle.p.2p5mi6n8co77s.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Line.p.3lxddzyuwzx1_.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Square.p.3ig4wtfmw09gh.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/media/GeistPixel_Triangle.p.0s2yyo-clipe_.woff2", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0lpe19hbxgq3u.css", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/turbopack-worker-1tv8tw60o5c2r.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/26ny4uv4hpx9n.js", + "https://vercel.com/api/stream/internal", + "https://vercel.com/api/jwt", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/23ohqtcmjwrtw.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/10k8h7rb6zg4a.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0ajjxruqy81cx.js", + "https://o205439.ingest.us.sentry.io/api/4507726617772032/envelope/", + "https://vercel.com/3628f7ea4ecd82e3/script.js", + "https://vercel.com/e62b3a9e28ed8bca/script.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1k0hduehtsgu-.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2cz76a3scrz5m.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0j1oddfmy-m4x.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1vegwuzpyho1y.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0m0kwuvo8jbdc.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3odxyta04ibcu.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3mr8ctdznyvbt.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2o9clswbylydy.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3w0x8f5fpp86t.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0y5h34jpppo5o.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1dbjpgrgn3v0n.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0amh-njelfa9z.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3tpuin96wyfqw.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1zmta2vaj42ws.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/126r9m8zogpwd.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1jqjyoruf7pyg.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/2cx-pp9-4xpfn.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/34riqpyjurd8w.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/1m4klzumr-je0.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0rw7gja-cvri8.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/0gmnglxayesjd.js", + "https://vercel.com/vc-ap-vercel-marketing/_next/static/immutable/chunks/3necpthhvrsn9.js" + ], + "stylesheets": [ + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1kg_xnxz_g_35.css", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/2_ldsldljxf4t.css", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/1dztsftrfvd81.css", + "/vc-ap-vercel-marketing/_next/static/immutable/chunks/3u82rwmj_1n8p.css" + ], + "cookies": [ + "_v-consent", + "_v-visitor-id", + "_v-visitor-id-renewed", + "vercel_session_id" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:\\\"/vc-ap-vercel-marketing/_next/static/immutable/chunks/1hw5n44or--4j.js\\\"\\n3:I[6513", + "self.__next_f.push([1,\"a0:[\\\"$\\\",\\\"li\\\",\\\"/ai-gateway\\\",{\\\"children\\\":[\\\"$\\\",\\\"$L9f\\\",null,{\\\"href\\\":\\\"/ai-gateway\\\",\\\"className\\\":\\\"", + "self.__next_f.push([1,\"ex items-center gap-1.5 w-fit p-0.5 -ml-0.5\\\",\\\"type\\\":\\\"secondary\\\",\\\"data-cdp-track\\\":\\\"{\\\\\\\"event\\\\\\\":\\\\\\\"f", + "self.__next_f.push([1,\"106:[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"h2\\\",null,{\\\"className\\\":\\\"text-gray-1000 text-label-14 font-m", + "self.__next_f.push([1,\"123:[\\\"$\\\",\\\"section\\\",null,{\\\"className\\\":\\\"relative flex min-h-[min(calc(100svh-var(--header-height)),1100px", + "self.__next_f.push([1,\"15a:I[420783,[\\\"$a\\\",[\\\"$b\\\",[\\\"$c\\\",\\\"$d\\\"],[17329,13899]],\\\"$e\\\",\\\"$f\\\",\\\"$10\\\",\\\"$11\\\",\\\"$12\\\",\\\"$13\\\",\\\"$1" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "16.4.0-canary.38" + } + } +} diff --git a/tests/corpus/vuejs.org.json b/tests/corpus/vuejs.org.json new file mode 100644 index 0000000..5ae8159 --- /dev/null +++ b/tests/corpus/vuejs.org.json @@ -0,0 +1,129 @@ +{ + "host": "vuejs.org", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "vue" + ] + }, + "snapshot": [ + "fathom:high", + "vue:high@3.5.42" + ], + "signals": { + "url": "https://vuejs.org/", + "scripts": [ + "/assets/app.B91ytTIH.js", + "https://cdn.usefathom.com/script.js", + "https://media.bitterbrains.com/main.js", + "/assets/style.BMnqHME7.css", + "/vp-icons.css", + "/assets/inter-roman-latin.Cy4MYw_J.woff2", + "/assets/chunks/plugin-vue_export-helper.CHIaqsk5.js", + "/assets/chunks/preload-helper.DPeZQNDl.js", + "/assets/chunks/client.Di6ffgQ0.js", + "/assets/chunks/PreferenceSwitch.Xjf1us8F.js", + "/assets/chunks/SponsorsGroup.DCKN6C6f.js", + "/assets/chunks/src.BvVF4JYV.js", + "/assets/chunks/runtime-core.esm-bundler.D9dvqvXF.js", + "/assets/chunks/runtime-dom.esm-bundler.CWLNKmOD.js", + "/assets/index.md.DGgGtkgQ.lean.js", + "/assets/guide_quick-start.md.B1k9QN6u.js", + "/assets/guide_introduction.md.gc56Jx_-.js", + "/assets/tutorial_index.md.DAkQf-Ux.js", + "/assets/examples_index.md.BosncS-L.js", + "/assets/api_index.md.C3D3OUgv.js", + "/assets/glossary_index.md.CwErPStu.js", + "/assets/error-reference_index.md._PgetNiz.js", + "/assets/ecosystem_themes.md.Cr2s_KrP.js", + "/assets/guide_scaling-up_tooling.md.CNmmMp3K.js", + "/assets/ecosystem_newsletters.md.CVuypRbj.js", + "/assets/about_faq.md.DHc_el53.js", + "/assets/about_team.md.Bju45K56.js", + "/assets/about_releases.md.DetwGGkT.js", + "/assets/about_community-guide.md.BwmxDKSS.js", + "/assets/about_coc.md.v_lGDmAB.js", + "/assets/about_privacy.md.DEPHtMz3.js", + "/assets/sponsor_index.md.t80tqlQI.js", + "/assets/partners_index.md.BqX16792.js", + "inline:#check-dark-mode", + "inline:#check-mac-os", + "https://vuejs.org/assets/style.BMnqHME7.css", + "https://vuejs.org/vp-icons.css", + "https://vuejs.org/assets/app.B91ytTIH.js", + "https://vuejs.org/assets/chunks/plugin-vue_export-helper.CHIaqsk5.js", + "https://vuejs.org/assets/inter-roman-latin.Cy4MYw_J.woff2", + "https://vuejs.org/assets/chunks/preload-helper.DPeZQNDl.js", + "https://vuejs.org/assets/chunks/client.Di6ffgQ0.js", + "https://vuejs.org/assets/chunks/PreferenceSwitch.Xjf1us8F.js", + "https://vuejs.org/assets/chunks/SponsorsGroup.DCKN6C6f.js", + "https://vuejs.org/assets/chunks/src.BvVF4JYV.js", + "https://vuejs.org/assets/chunks/runtime-dom.esm-bundler.CWLNKmOD.js", + "https://vuejs.org/assets/chunks/runtime-core.esm-bundler.D9dvqvXF.js", + "https://vuejs.org/assets/index.md.DGgGtkgQ.lean.js", + "https://fonts.googleapis.com/css2", + "https://vuejs.org/assets/chunks/config.CLhnupWp.js", + "https://vuejs.org/assets/inter-roman-cyrillic.CD0kT8R4.woff2", + "https://vuejs.org/assets/inter-roman-latin-ext.Dl_ayf4-.woff2", + "https://cdn.usefathom.com/", + "https://automation.vuejs.org/data.json", + "https://media.bitterbrains.com/banners", + "https://vuejs.org/assets/guide_quick-start.md.B1k9QN6u.js", + "https://vuejs.org/assets/tutorial_index.md.DAkQf-Ux.js", + "https://vuejs.org/assets/guide_introduction.md.gc56Jx_-.js", + "https://vuejs.org/assets/examples_index.md.BosncS-L.js", + "https://vuejs.org/assets/api_index.md.C3D3OUgv.js", + "https://vuejs.org/assets/glossary_index.md.CwErPStu.js", + "https://vuejs.org/assets/ecosystem_themes.md.Cr2s_KrP.js", + "https://vuejs.org/assets/error-reference_index.md._PgetNiz.js", + "https://vuejs.org/assets/guide_scaling-up_tooling.md.CNmmMp3K.js", + "https://vuejs.org/assets/ecosystem_newsletters.md.CVuypRbj.js", + "https://vuejs.org/assets/about_faq.md.DHc_el53.js", + "https://vuejs.org/assets/about_team.md.Bju45K56.js", + "https://vuejs.org/assets/about_releases.md.DetwGGkT.js", + "https://vuejs.org/assets/about_community-guide.md.BwmxDKSS.js", + "https://vuejs.org/assets/about_coc.md.v_lGDmAB.js", + "https://vuejs.org/assets/about_privacy.md.DEPHtMz3.js", + "https://vuejs.org/assets/sponsor_index.md.t80tqlQI.js", + "https://vuejs.org/assets/partners_index.md.BqX16792.js", + "https://automation.vuejs.org/images/vuemastery.avif", + "https://automation.vuejs.org/images/vehikl.avif", + "https://automation.vuejs.org/images/chrome_frameworks_fund.avif", + "https://automation.vuejs.org/images/storyblok.avif", + "https://automation.vuejs.org/images/vue_js_amsterdam.avif", + "https://automation.vuejs.org/images/imagekit_io.svg", + "https://automation.vuejs.org/images/coderabbit_.avif", + "https://automation.vuejs.org/images/javascript_certification.png", + "https://automation.vuejs.org/images/greptile.avif", + "https://automation.vuejs.org/images/serpapi.avif", + "https://vuejs.org/logo.svg", + "https://media.bitterbrains.com/banners/01a023e8-5bee-713c-8ac3-820c6e0e9302/serve", + "https://media.bitterbrains.com/embed/banners/01a023e8-5bee-713c-8ac3-820c6e0e9302" + ], + "stylesheets": [], + "cookies": [], + "metas": [ + "generator=VitePress v2.0.0-alpha.17" + ], + "inlineSamples": [], + "domFlags": [ + "[data-v-]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__VUE__": { + "present": true + }, + "__vue_app__": { + "present": true, + "version": "3.5.42" + }, + "fathom": { + "present": true + } + } +} diff --git a/tests/corpus/wordpress.org.json b/tests/corpus/wordpress.org.json new file mode 100644 index 0000000..f6f347d --- /dev/null +++ b/tests/corpus/wordpress.org.json @@ -0,0 +1,108 @@ +{ + "host": "wordpress.org", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "wordpress" + ] + }, + "snapshot": [ + "google-analytics:high", + "import-map:low", + "wordpress:high" + ], + "signals": { + "url": "https://wordpress.org/", + "scripts": [ + "https://www.googletagmanager.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/language-suggest/build/front.js", + "https://wordpress.org/wp-content/plugins/gutenberg/build/modules/block-library/navigation/view.min.js", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/time/build/view.js", + "https://stats.wp.com/e-202639.js", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/global-header-footer/js/view.js", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/Inter/Inter-latin.woff2", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/EB-Garamond/EBGaramond-latin.woff2", + "https://wordpress.org/wp-content/plugins/gutenberg/build/modules/interactivity/index.min.js", + "inline:#wporg-language-suggest-view-script-js-before", + "inline:#wporg-language-suggest-view-script-js", + "inline:#wp-importmap", + "inline:#jetpack-search-theme-token-sampler", + "inline:#@wordpress/block-library/navigation/view-js-module", + "inline:#wp-script-module-data-@wordpress/interactivity", + "inline:#wporg-time-view-script-js", + "inline:#lang-guess-js-after", + "inline:#jetpack-stats-js-before", + "inline:#jetpack-stats-js", + "inline:#wporg-global-header-script-js-extra", + "inline:#wporg-global-header-script-js", + "inline:#wp-emoji-settings", + "https://wordpress.org/wp-content/plugins/gutenberg/build/styles/block-library/navigation/style.min.css", + "https://wordpress.org/wp-content/plugins/gutenberg/build/styles/block-library/social-links/style.min.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/style.css", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/block-styles.css", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/style.css", + "https://wordpress.org/wp-includes/css/dashicons.min.css", + "https://wordpress.org/wp-content/themes/wporg-main-2022/build/style/style-index.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/global-header-footer/build/style.css", + "https://i0.wp.com/wordpress.org/files/2026/06/WCUS-2026.png", + "https://i0.wp.com/wordpress.org/files/2024/04/brush.png", + "https://i0.wp.com/wordpress.org/files/2025/12/wporg-69-design.png", + "https://i0.wp.com/wordpress.org/files/2025/12/wporg-69-build.png", + "https://i0.wp.com/wordpress.org/files/2026/08/Whats-new-visual-7.1.webp", + "https://i0.wp.com/wordpress.org/files/2025/12/wporg-69-publish.png", + "https://wordpress.org/files/2022/08/Time-Magazine.png", + "https://wordpress.org/files/2023/10/NASA-1.png", + "https://wordpress.org/files/2023/10/tech-crunch.png", + "https://i0.wp.com/wordpress.org/files/2023/12/rolling-stone.png", + "https://i0.wp.com/wordpress.org/files/2023/10/Microsoft.png", + "https://i0.wp.com/wordpress.org/files/2023/10/Harvard.png", + "https://i0.wp.com/wordpress.org/files/2023/10/showcase-top-row-full.png", + "https://i0.wp.com/wordpress.org/files/2023/10/showcase-middle-row.png", + "https://i0.wp.com/wordpress.org/files/2023/10/showcase-bottom-row.png", + "https://i0.wp.com/wordpress.org/files/2024/04/photo-community-1.png", + "https://s.w.org/style/images/code-is-poetry-for-dark-bg.svg", + "https://i0.wp.com/wordpress.org/files/2026/08/merch-items-03.png", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/print.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/NotoSerif/NotoSerifJP/style.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/NotoSerif/NotoSerifKR/style.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/NotoSerif/NotoSerifSC/style.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/global-header-footer/images/search-for-light-bg.svg", + "https://wordpress.org/files/2026/06/wcus_map.png", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/images/dots-banner.svg", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/Inter/Inter-arrows.woff2", + "https://pixel.wp.com/g.gif", + "https://wordpress.org/lang-guess/lang-guess-ajax.php", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://s.w.org/favicon.ico" + ], + "stylesheets": [ + "https://wordpress.org/wp-content/plugins/gutenberg/build/styles/block-library/navigation/style.min.css", + "https://wordpress.org/wp-content/plugins/gutenberg/build/styles/block-library/social-links/style.min.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/global-fonts/style.css", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/block-styles.css", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/style.css", + "https://wordpress.org/wp-includes/css/dashicons.min.css", + "https://wordpress.org/wp-content/themes/wporg-main-2022/build/style/style-index.css", + "https://wordpress.org/wp-content/themes/wporg-parent-2021/build/print.css", + "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/global-header-footer/build/style.css" + ], + "cookies": [ + "_ga", + "_ga_CG6GJ50G8J" + ], + "metas": [ + "generator=WordPress 7.2-alpha-63914" + ], + "inlineSamples": [], + "domFlags": [ + "script[type=\"importmap\"]" + ], + "globals": {}, + "pass": "light" + }, + "globals": {} +} diff --git a/tests/corpus/www.airbnb.com.json b/tests/corpus/www.airbnb.com.json new file mode 100644 index 0000000..ad213af --- /dev/null +++ b/tests/corpus/www.airbnb.com.json @@ -0,0 +1,246 @@ +{ + "host": "www.airbnb.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "react-router" + ] + }, + "snapshot": [ + "google-analytics:medium", + "react-router:high@6", + "react:high" + ], + "signals": { + "url": "https://www.airbnb.com/", + "scripts": [ + "https://d34r8q7sht0t9k.cloudfront.net/tag.js", + "https://js.adsrvr.org/conversionEvents-v1.min.js", + "/gtg/gtm-46mk/k1-RPHeiJcOxrWHta7FxZUE6n9H5Lj7crr3d8V-0BxTMQzEt", + "https://www.googletagmanager.com/gtm.js", + "https://www.airbnb.com/gtg/gtm-46mk/gtm.js", + "https://d0a7e.airbnb.com/tags.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/hyperloop-browser/metroRequire.14a7112f02.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/hyperloop-browser/shims_post_modules.630d876eaf.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/airmetro/browser/asyncRequire.144ca6a5fa.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/hyperloop-browser/coreV2.e7aade1bcc.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/6704.22864c1cce.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/9788.af07351ab3.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/routing/routeHandler/genericRouteHandler.e6bc4b12c9.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/0899.9aa7544304.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/308c.a399d1631a.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/52a0.0063c75385.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/2df7.a91211d7c6.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/331d.fdcf4b0784.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/da5c.8a0624918a.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/core-guest-spa/entrypoints/initializer.9c6c800d22.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/0752.88e9ce3e06.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/f0db.ef0c80cf78.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/2879.b298cb3ad9.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/6f95.3911cfb9b1.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/a87f.319cc01296.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/homepage/routes/TabbedVerticalHomepageRoute/TabbedVerticalHomepageRoute.6450f8ff63.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/7c53.770ad78e72.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/6169.f2290fb6d9.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/66fa.107bee8a23.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/d739.59a122dbcc.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/664f.085d59e261.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/b729.012839697d.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/8093.660ae7268b.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/e177.eefb931f69.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/cf0a.efc70d2c96.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/79b8.79601249de.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/0b1e.a93189d7c1.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/5b2a.4c7ed4b810.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/7945.9a6ec508da.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/b571.9e605aa258.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/0199.2d17a41c35.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/b4ab.030b5db2cc.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/29ba.77394122ef.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/core-guest-spa/entrypoints/client.6adf148e47.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/niobe/client/NiobeClient.058756395d.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/guest-header/query/HeaderQuery.prepare.e7a0b87de0.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/homepage/routes/TabbedVerticalHomepageRoute/TabbedVerticalHomepageRoute.prepare.b8dd002e1f.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/save-to-list/containers/SaveToListModalContainer.09f7357127.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/4ced.df58b6e551.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/e65e.5ad5c1060e.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/82ca.457dc10ddd.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/user-consent/components/CookiesBannerContainer.069204e055.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/9ea2.116ac90a25.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/3b5c.7190a8cc06.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/search-header/variants/base/SearchHeaderHomepageWide.bee3a5d497.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/2178.2ff4d2fe37.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/487c.fe9b317149.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/5ed3.7445756272.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/66da.e6a7696137.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/e67a.55594e0634.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/c9e5.e9ac5d1413.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/b2dd.542cf0114f.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/5f56.fa4d9929e7.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/ee1a.d647885a0e.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/5b7a.1224d74609.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/bf60.5bd7f1f7be.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/fc35.ab5be147cb.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/0795.2626bd3898.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/stays-search/routes/StaysSearchRoute/StaysSearchRoute.prepare.a5ddc35857.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/3a39.593df4eebe.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/search-header/variants/base/SearchHeaderP2sWide.f6d6a28bc8.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/search-header/variants/unified/UnifiedSearchHeaderP2Wide.a31d795351.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/fc24.d3c9fc3f48.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/search-filter-bar/sections/client/SearchFilterBarWideCenterLayout/SearchFilterBarWideCenterLayout.96685a3221.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/3186.f98ca292f6.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/1af1.ca79d66dd6.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/cf32.6188ec87d5.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/c32a.3117598bd2.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/search-filter-bar/sections/client/UnifiedSearchFilterBar/UnifiedSearchFilterBar.0c27bb4807.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/search-location-sections/sections/StaysMap/StaysMap.fd31008d3d.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/5d87.c3eddaabe4.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/2dd6.9b0eb94ae1.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/a7f9.52a840fda7.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/ef95.12c261fa6f.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/9719.435b7104a2.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/59cc.f09d98b05a.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/17e9.476610ef58.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/9a95.6663ccc193.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/6596.500f762770.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/2da9.40f467a172.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/e425.00b5ad3cac.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/325e.b4cb2d45b5.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/4405.774d62042b.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/ede8.1bfaf051ef.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/2e3e.464bbbd619.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/stays-search/sections/client/StaysListingsGrid/StaysListingsGrid.7528307c8d.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/f49a.baae678219.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/stays-search/sections/client/StaysPageFooter/StaysPageFooter.2409bf0f44.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/stays-search/routes/StaysSearchRoute/StaysSearchRoute.87370b8956.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/164a.f9b0565c7b.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/1df6.a0e9329fdf.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/95b5.d2a3731cba.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/31dd.3d64aab07d.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/signup-and-login/utils/modalRenderer.a3df7f2276.js", + "https://a0.muscache.com/airbnb/static/packages/web/common/fbb7.a156b09a82.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/9ff9.3b13743053.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/locale-settings/containers/LocaleSelectorModalContainer.a69e3e7ab2.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/368c.154a2fe7a9.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/bb0c.74b99443ae.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/3add.1954605e8f.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/homepage/sections/client/SeoLinkGrid/SeoLinkSection.c764dc81dd.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/frontend/simple-footer/variants/base/FooterWithBottomSpacing.bd3a67a269.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/242e.fbc273b1d9.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/7a72.9db7335925.js", + "https://a0.muscache.com/airbnb/static/packages/web/en/62a9.19fbdaf5b4.js", + "inline:#podscribe-capture", + "inline:#data-flagger_cdn_experiments", + "inline:#aphrodite-classes", + "inline:#data-linaria-css", + "inline:#data-initializer-bootstrap", + "inline:#data-injector-instances", + "inline:#data-is-async-scripts", + "inline:#data-deferred-state-0", + "https://a0.muscache.com/airbnb/static/airbnb-dls-web/build/fonts/cereal-variable/AirbnbCerealVF_W_Wght.8816d9e5c3b6a860636193e36b6ac4e4.woff2", + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/core-guest-spa/entrypoints/client.5a0e9fca2a.css", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/a32adab1-f9df-47e1-a411-bdff91b579c3.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/e47ab655-027b-4679-b2e6-df1c99a5c33d.png", + "https://a0.muscache.com/im/pictures/AirbnbPlatformAssets/AirbnbPlatformAssets-search-bar-icons/original/a811de29-114f-43a0-b8c5-698d4564bd04.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/3d67e9a9-520a-49ee-b439-7b3a75ea814d.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/4aae4ed7-5939-4e76-b100-e69440ebeae4.png", + "https://a0.muscache.com/im/pictures/AirbnbPlatformAssets/AirbnbPlatformAssets-search-bar-icons/original/f50ce552-509c-4f54-af4c-605c5220d906.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/2bf5d36d-e731-4465-a8ef-91abbf2ae8ce.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-search-bar-icons/original/1e24b1c9-b070-48d9-8a70-91aae3151830.png", + "https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-UserProfile/original/5347d650-16de-4f5a-a38e-79edc988befa.png", + "https://www.airbnb.com/manifest.json", + "https://www.airbnb.com/tracking/jitney/logging/messages", + "https://d0a7e.airbnb.com/js/", + "https://www.airbnb.com/api/v2/get-data-layer-variables", + "https://www.airbnb.com/api/v3/NaviServerAnnouncementsQuery/060ac9ab481520a361f3efb91bb92d04e43b30d27f81e3a4eabb1e088c08e0f5", + "https://www.airbnb.com/api/v3/PromotionsByPlacementsQuery/dc003b55765e5bbee859cd3b605bdf4facd442195c950f07e01dfc56ae5ae8d8", + "https://www.airbnb.com/api/v3/Header/90c152b4bd4dd2f734e037b69bfede138be70dd2b3ab83602c7c291aebd75d55", + "https://www.airbnb.com/api/v2/client_configs", + "https://www.airbnb.com/api/v3/GetConsentForUserQuery/b465fb69355a1f021a9f0364b3db6ed23b4ed8dee6ca0eb423474b4f83b77cea", + "https://www.google.com/ccm/geo", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://www.airbnb.com/api/v3/AutoSuggestionsQuery/c66e170eec32395cd446668121c26fdfa56bd925a90fc1d407489b0205f9be58", + "https://www.airbnb.com/api/v2/user_markets", + "https://www.airbnb.com/api/v2/marketing_event_tracking", + "https://www.airbnb.com/gtg/gtm-46mk/k1-RPHeiJcOxrWHta7FxZUE6n9H5Lj7crr3d8V-0BxTMQzEt", + "https://tr.snapchat.com/p", + "https://ct.pinterest.com/v3/", + "https://www.facebook.com/tr", + "https://a0.muscache.com/im/pictures/AirbnbPlatformAssets/AirbnbPlatformAssets-Favicons/original/d1fcc0b3-865f-485a-b28b-43ca0bf7c891.png", + "https://insight.adsrvr.org/track/cei", + "https://ipv4.pdscrb.com/", + "https://verifi.pdscrb.com/tag", + "https://www.airbnb.com/sgtm/g/collect", + "https://www.airbnb.com/gtg/gtm-46mk/td", + "https://www.google.com/measurement/conversion/", + "https://www.googleadservices.com/pagead/conversion/788919195/", + "https://www.google.com/rmkt/collect/788919195/", + "https://www.google.com/rmkt/collect/1023009977/", + "https://www.googleadservices.com/pagead/conversion/1023009977/", + "https://www.airbnb.com/sgtm/_/set_cookie", + "https://stats.g.doubleclick.net/g/collect", + "https://analytics.google.com/g/s/collect", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/788919195/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/1023009977/", + "https://ad.doubleclick.net/activity;src=4620401;type=gen;cat=airbn0;ord=1;num=1688316642;gtm=45g91e69m1v874143154z8551874z9894587894za20kzb551874zd551874xf4;dc_pre=1;u21=visitor;rcb=2;dma=0;npa=0;gcs=G111;gcd=13n3n3n3n5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1618655617.1790413135;em=tv.1;tag_exp=115938466~115938469~117549813~118897920~118897930~120213116~120385422~120469145~120469153;_tu=DA;gap.sstd=1;gap.gtb=2;s3p=1;_is_sw=f15s0t1;~oref=https%3A%2F%2Fwww.airbnb.com%2F", + "https://ad.doubleclick.net/activity;src=4620401;type=conve0;cat=airbn01i;ord=1;num=165606555;gtm=45g91e69m1v874143154z8551874z9894587894za20kzb551874zd551874xf4;dc_pre=1;rcb=2;dma=0;npa=0;gcs=G111;gcd=13n3n3n3n5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1618655617.1790413135;em=tv.1;tag_exp=115938466~115938469~117549813~118897920~118897930~120213116~120385422~120469145~120469153;_tu=DA;gap.sstd=1;gap.gtb=2;s3p=1;_is_sw=f15s0t1;~oref=https%3A%2F%2Fwww.airbnb.com%2F", + "https://www.airbnb.com/tracking/airdog", + "https://insight.adsrvr.org/track/realtimeconversion" + ], + "stylesheets": [ + "https://a0.muscache.com/airbnb/static/packages/web/common/frontend/core-guest-spa/entrypoints/client.5a0e9fca2a.css" + ], + "cookies": [ + "_user_attributes", + "bev", + "everest_cookie", + "country", + "previousTab", + "jitney_client_session_id", + "jitney_client_session_created_at", + "jitney_client_session_updated_at", + "cfrmfctr", + "frmfctr", + "_gcl_au", + "_cci", + "_ccv", + "__ps_r", + "__ps_sr", + "__ps_lu", + "__ps_slu", + "__ps_did", + "__ps_fva", + "_ga", + "_ga_2P6Q8PGG16", + "FPAU", + "FPGSID", + "FPLC", + "_scid", + "_uetsid", + "_uetvid", + "__obref", + "datadome" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__reactRouterVersion": { + "present": true, + "version": "6" + } + } +} diff --git a/tests/corpus/www.atlassian.com.json b/tests/corpus/www.atlassian.com.json new file mode 100644 index 0000000..1ae26b3 --- /dev/null +++ b/tests/corpus/www.atlassian.com.json @@ -0,0 +1,347 @@ +{ + "host": "www.atlassian.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "emotion", + "sentry" + ] + }, + "snapshot": [ + "emotion:high", + "google-analytics:high", + "intercom:high", + "react:high", + "sentry:high" + ], + "signals": { + "url": "https://www.atlassian.com/", + "scripts": [ + "https://www.googletagmanager.com/gtag/destination", + "https://www.googletagmanager.com/gtag/js", + "//player.vimeo.com/api/player.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://j.6sc.co/6si.min.js", + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://trk.techtarget.com/tracking.js", + "https://connect.facebook.net/signals/config/221213238088884", + "https://connect.facebook.net/en_US/fbevents.js", + "https://static.ads-twitter.com/uwt.js", + "https://s3.amazonaws.com/beehiiv-adnetwork-production/pixel-v2.js", + "https://bzrcdn.openai.com/sdk/oaiq.min.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://bat.bing.com/bat.js", + "https://www.google-analytics.com/analytics.js", + "https://www.googletagmanager.com/gtm.js", + "https://widget.intercom.io/widget/", + "https://www.gstatic.com/recaptcha/releases/kemdRjWFxNjgsGdhRslyEPwU/recaptcha__en.js", + "https://atl-onetrust-wrapper.atlassian.com/assets/atl-onetrust-wrapper.min.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/404.87713453.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/404.runtime.a9849b83.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/view.4c1fbd43.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/view.runtime.0053772b.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/language-selector.139729d8.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/language-selector.e225792f.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/dropdown-import.1282cd9b.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/animation-illustration.a9145d1a.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-switcher.07649b19.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-switcher.runtime.461ddece.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/404.4a0af653.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/direct-buy-site-setup-container.76d25a90.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/confirmation-page.4030607d.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/confirmation-page.37bea2e8.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/esm.d6ed52a5.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/status.8d5bd879.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/confluence-template-details-page.644d25a6.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/chat-widget-omni-channel-ui.7d78c6c6.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/datasourceTableView.304c0848.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-software-page-anchor-lp-jsw-team-design.499fee13.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/index.f6d4bfce.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/index.runtime.982521c6.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-software-page.92821286.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-software-page.d76be7cf.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/esm.3776753d.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/jira-landing-page.f14edc06.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/uniform-entry-page.runtime.3db9f29e.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/uniform-entry-page.4357390d.js", + "https://www.recaptcha.net/recaptcha/enterprise.js", + "https://cdn.cookielaw.org/consent/1ef16389-2e72-4349-ad86-ea904db9373b/otSDKStub.js", + "https://cdn.cookielaw.org/scripttemplates/202605.1.0/otBannerSdk.js", + "//munchkin.marketo.net/munchkin.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/955533044/", + "https://bat.bing.com/p/action/4063247.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/975152762/", + "https://ob.roundprincethere.com/i/88960c46fb6a1edfa732bb4a9d7c4739.js", + "https://j.6sc.co/j/0b5a2b58-f3fc-4751-a9b3-3afe8794644c.js", + "https://cdnssl.clicktale.net/www33/ptc/ef81b94c-8498-4f12-b358-eb76a000a247.js", + "https://js.adsrvr.org/up_loader.3.0.0.js", + "https://ds-cdn.prod-east.frontend.public.atl-paas.net/assets/fonts/atlassian-sans/v4/AtlassianSans-latin.woff2", + "inline:#contentsquare-injection", + "inline:#onetrust", + "inline:#google-recaptcha-v3", + "inline:#6senseWebTag", + "https://ds-cdn.prod-east.frontend.public.atl-paas.net/assets/font-rules/v6/atlassian-fonts.css", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_light.css", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_typography.css", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_spacing.css", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FKT", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FC6", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FH6", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FE8", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FIA", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12FKV", + "https://dam-cdn.atl.orangelogic.com/AssetLink/857qv237n203wnkea8wgamk2a2us4uy2.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/xcosenf3w13o8pq585o705fxys5q03x2.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/vvs64iqhos5vy1u702ok4u50s42m10ii.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4RZ.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZG.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZH.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZF.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/4t8837ogw4s4t31c7x0hgfb523o7s4v1.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N54W.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZE.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/6k3dp10ut224t4oa4ih2ns74gx2r07yh.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/pjx7hy131bqolmfog4go5ej85dxwm7k7.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZC.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/301nl85gds5kr47oo2125d47333e6c73.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/jc0417320bg81b53h4sgs70q6l464500.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4S2.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4ZD.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/ppop74d2k67771avyr8hs635pkasin70.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/6ql83bjjch2xkvh7643ki04g3k2vkj1p.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/u33nvnm154b801i82t4075s0j0f2q727.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/yk6fc6h475wmi67s827prloh073l01g1.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/s6xb2173woj4m00n36b754t44126al0l.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/1di7856lu37ve153ja4m4wcg17b8y26j.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/0qdhoxv5o6b3mleiuc6ej43re1gsn8b0.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/65wycilre16o225ia50e84d3a22ch140.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/2v746wlx1l1r41a6s5p63e7y102ko2l4.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/klkr50gx181r0p8chweefx38e7hf48s1.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/ua8r3l3j055g4k8t3vcw5x0qd3b3b3wa.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/uo0v4gsxcfjo34e3evp630ba0653j558.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/nj3c8i7014gw1sba21en752f0q4pq0sx.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/3gjch6tk0wbw3801u4656e82213h5xvm.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4S7.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/5o2o2enoi03yotn523u7t1505kw351en.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/qmtxbl7050fm60rs86110t4h8553436v.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/fwhk18bh22311008ugi5s2i62s5iv632.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N54R.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/72jyk7b1r48ul3cb6qusr6b1yu61td3t.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/x6fti424cg1dyn52m750hns8386vyw2o.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MT.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N539.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MY.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MV.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4S0.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4FX.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4FS.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4FT.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MZ.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4G1.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MN9C.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4G0.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4FZ.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MN9D.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4Z2.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5Q6.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4Z3.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4Z4.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4YZ.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4Z0.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MNA0.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N4Z1.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MU.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/2gf42uyw6x35g346v1337b15dx434t0a.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/n77suu8uq6g15lwd755l77a3833ai6b3.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/426lxf8r1u73b7e5768ts0dd2w26n11l.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/b4d1tn2sdy0s36i56c857db6w1k1u2b4.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/32agfh01wn5t07ah5781p287ap8sxoh4.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N50K.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N50N.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MW.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N520.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N5MX.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N51Z.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N50M.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N51X.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/67p4f030jo35j028ayr2hw4tioa5i200.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N50L.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N521.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/ptn36e828x7k02745o673wfoe4mpofj2.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MNA5.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N50J.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N522.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/x6bd18r1i1qx1k7xt61pbnnskyf76y4r.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/7862q04hkv188isqi7vuls055j6f64fq.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12N51Y.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/82b230b227f1f2nass7sp15dt05ib3ni.jpg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/58tq64t0d72pjl8y7cgijgl8ag5a23tf.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/ycp11j6s2wt83bh3wy7713h1r85mv8ex.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/i8rco43kk1s7kmr72f303wo4esw3s57j.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12EWOC.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/q2408086s36q3g576cw1b2042ni4t57c.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MURB.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR8.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR5.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR2.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR6.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR3.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUQZ.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/jq5e3siiy0tl1e4080b0tq53k2w500xb.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MUR0.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G8X.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G4J.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G4B.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT1598C.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/c44h04v3luv5n2jouwwch2ej2p74lrw1.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/7oyv8bgat230qo140s71wjy2d50ml775.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G74.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/843h8p1qn622i88xuc46t5lg25h14032.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G42.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14GBT.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/3s7jqgdw8r6mp02a638a8c4k1717wf50.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14GB9.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14G9K.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14GAE.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT25E5.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/qp6270nyaio680847ty27a0v6hd6wmaa.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT215FV.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/m8711wx512354pc811l4438bets67yns.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT123XEV.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT14GBY.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/6s0e657g7n16tlls55wh30501652e3in.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/s25wfa6nhiv228w4w58386v64o78m1af.png", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT16J3K.svg", + "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12MQJU.svg", + "https://dam-cdn.atl.orangelogic.com/AssetLink/p83q4s0c3v2xgtcm62d48an1v71y6h10.png", + "https://dam-cdn.atl.orangelogic.com/AssetLink/78a4s425y71c270nj8eq6155lcqr4i16.webm", + "https://dam-cdn.atl.orangelogic.com/AssetLink/elqg4r36c8cgw17o0yh87a6ghe6s5e75.webm", + "https://dam-cdn.atl.orangelogic.com/AssetLink/30e047lljh5y7j5n433ls66055u8t018.webm", + "https://dam-cdn.atl.orangelogic.com/AssetLink/ny32egn16elq2656p0mpl83368pr3wlx.webm", + "https://dam-cdn.atl.orangelogic.com/AssetLink/jl7534n20m4g3xtquu6wn3i5i13113q5.webm", + "https://api.atlassian.com/flags/api/v2/configurations", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/castle.6e837f0a.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/create-payload.2cfc5590.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/create-payload.90824b57.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/create-post-interaction-log-payload.85396216.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/create-interaction-extra-metrics-payload.8a33e52c.js", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/create-terminal-error-payload.9a312b8a.js", + "https://xp.atlassian.com/v1/rgstr", + "https://www.atlassian.com/gateway/api/ais/available-products", + "https://o55978.ingest.us.sentry.io/api/4505919063457792/envelope/", + "https://www.atlassian.com/endpoint/location", + "https://www.atlassian.com/gateway/api/me", + "https://www.atlassian.com/gateway/api/graphql", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/language-selector.f61dc470.js", + "https://www.atlassian.com/gateway/api/gasv3/api/v1/metadata", + "https://cdn.cookielaw.org/consent/1ef16389-2e72-4349-ad86-ea904db9373b/1ef16389-2e72-4349-ad86-ea904db9373b.json", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://www.recaptcha.net/recaptcha/enterprise/anchor", + "https://as.atlassian.com/api/v1/batch", + "https://cdn.cookielaw.org/consent/1ef16389-2e72-4349-ad86-ea904db9373b/019e74ba-0d4f-722f-b532-0d1bbb4d6e06/en.json", + "https://cdn.cookielaw.org/scripttemplates/202605.1.0/assets/otFlat.json", + "https://cdn.cookielaw.org/scripttemplates/202605.1.0/assets/v2/otPcCenter.json", + "https://cdn.cookielaw.org/scripttemplates/202605.1.0/assets/otCommonStyles.css", + "https://cdn.cookielaw.org/logos/static/ot_close.svg", + "https://cdn.cookielaw.org/logos/static/ot_guard_logo.svg", + "https://cdn.cookielaw.org/logos/static/powered_by_logo.svg", + "https://cdn.cookielaw.org/logos/42dec10d-7eac-4f9f-af3b-e0072302f8ff/a4d45a1e-71e4-4de8-99fa-0032fea7e7c9/bc3ba617-f74e-4fcd-9c52-c2af2bbc0b74/Atlassian-horizontal-blue-rgb-540x67-4ecbd8e.png", + "https://www.atlassian.com/favicon.ico", + "https://munchkin.marketo.net/munchkin.js", + "https://analytics.o11.tech/1/e/tcs.dhj", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://pixel.pointmediatracker.com/kpi", + "https://www.google-analytics.com/j/collect", + "https://t.co/1/i/adsct", + "https://analytics.twitter.com/1/i/adsct", + "https://bzrcdn.openai.com/pixel-config/v1/6qtZnjkuE1a526T4HhofL4.json", + "https://munchkin.marketo.net/165/munchkin.js", + "https://ibc-flow.techtarget.com/a/gif.gif", + "https://pixel-config.reddit.com/pixels/t2_34h6vrmf/config", + "https://alb.reddit.com/rp", + "https://player.vimeo.com/api/player.js", + "https://insight.adsrvr.org/track/cei", + "https://analytics.o11.tech/a/ts_.htm" + ], + "stylesheets": [ + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_light.css", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_spacing.css", + "https://wac-web.prod-east.frontend.public.atl-paas.net/assets/atlaskit-tokens_typography.css" + ], + "cookies": [ + "atlCohort", + "ajs_anonymous_id", + "bxp_gateway_anchor", + "X-Experiments-Key", + "X-Experiments-Trace-Id", + "atl_xid.xc", + "atl_xid.ts", + "atl_xid.current", + "__cuid", + "__cuid", + "_otPreferencesSynced", + "OptanonConsent", + "sn_id", + "_gcl_au", + "BP_GTM_FPC", + "_ga", + "_gid", + "_gat_UA-6032469-23", + "_twpid", + "_twsid", + "__obref", + "_bhp", + "_rdt_uuid", + "_cq_duid", + "_cq_suid", + "_cq_session", + "_cs_c", + "_cs_id", + "_fbp", + "_mkto_trk", + "_cq_s", + "_cs_s", + "_ga_EKLW76PEWW", + "_uetsid", + "_uetvid", + "_an_uid", + "_gd_visitor", + "_gd_session", + "_gd_svisitor", + "atl_session", + "atlUserHash" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "[data-emotion]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "Intercom": { + "present": true + }, + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "gtag": { + "present": true + }, + "intercomSettings": { + "present": true + } + } +} diff --git a/tests/corpus/www.canva.com.json b/tests/corpus/www.canva.com.json new file mode 100644 index 0000000..a750562 --- /dev/null +++ b/tests/corpus/www.canva.com.json @@ -0,0 +1,32 @@ +{ + "host": "www.canva.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": {}, + "snapshot": [ + "cloudflare:high" + ], + "signals": { + "url": "https://www.canva.com/", + "scripts": [ + "/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page/v1", + "https://challenges.cloudflare.com/turnstile/v0/b/d76008a69eab/api.js", + "https://www.canva.com/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page/v1", + "https://status.canva.com/images/block/light-background.jpg", + "https://status.canva.com/images/block/light-clouds.jpg", + "https://status.canva.com/images/block/light-foreground.png", + "https://www.canva.com/cdn-cgi/challenge-platform/h/b/fo/1505596625:1790409777:fiamSjisZwQ3qsrMhPno8JrnGznII46foJMFzLbcTGM/a411140249c7e647/0YFUKCLFtgRkrKbCUf8YXLuZr3D_yugrpQHTUSBJx0s-1790413225-1.2.1.1-VFZRoxJDYH8IMWWdLeiVpS.IGjIyT0BJ4innCIlcQpqs9.I7SsGlJc1_UZ7pgLjW", + "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/turnstile/f/av0/rch/pz62o/0x4AAAAAAADnPIDROrmt1Wwj/light/fbE/new/normal", + "https://www.canva.com/favicon.ico" + ], + "stylesheets": [], + "cookies": [], + "metas": [], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": {} +} diff --git a/tests/corpus/www.datadoghq.com.json b/tests/corpus/www.datadoghq.com.json new file mode 100644 index 0000000..b2f72ae --- /dev/null +++ b/tests/corpus/www.datadoghq.com.json @@ -0,0 +1,250 @@ +{ + "host": "www.datadoghq.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "datadog" + ] + }, + "snapshot": [ + "alpine:high@3.14.9", + "bootstrap:low", + "datadog:high", + "google-analytics:high", + "tailwind:high", + "webpack:high" + ], + "signals": { + "url": "https://www.datadoghq.com/", + "scripts": [ + "https://scripts.clarity.ms/0.8.72-beta/clarity.js", + "https://www.clarity.ms/tag/uet/4061438", + "https://nexus.ensighten.com/choozle/17899/code/e6c979db0633b70f453eade0abb0f8e3.js", + "https://nexus.ensighten.com/choozle/17899/code/d3d14424fac71699bdbff068d9b1184b.js", + "https://cdn.vector.co/pixel.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://nexus.ensighten.com/choozle/17899/serverComponent.php", + "https://static.ads-twitter.com/uwt.js", + "https://www.google-analytics.com/analytics.js", + "https://tlzqr.datadoghq.com/load", + "https://tag.demandbase.com/705a93ad66faead7.min.js", + "https://ml314.com/tag.aspx", + "//bat.bing.com/bat.js", + "https://connect.facebook.net/signals/config/2233705693599817", + "https://connect.facebook.net/en_US/fbevents.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://s.yimg.jp/images/listing/tool/cv/ytag.js", + "https://transcend-cdn.com/cm/dc241cd4-6477-4f2b-86c0-6bcb51869e28/airgap.js", + "https://a.quora.com/qevents.js", + "https://www.googletagmanager.com/gtag/js", + "https://cdn.calibermind.com/a.js", + "//www.googletagmanager.com/gtm.js", + "https://www.datadoghq.com/assets/lang-redirects.min.c1ad237f9d953469286cce919fd714d9edf7ad193e6a60798192d8a8c69156a6.js", + "https://www.datadoghq.com/static/dd-libs.cfc0fc7c8131c38b026e93f283148dccf754cd8d3e5ad027ef77c1b84c04d0a7265d7ca94b7475b930ba0e7e179b0ec3e1a73d10d09d79ca3cc6ed6971c09b95.js", + "https://www.datadoghq.com/assets/dd-browser-logs-rum.min.195d5a17ebfb74b20cf9ed8661f88cf81a81e73c41e0e42f13456074e411c66e.js", + "https://www.datadoghq.com/assets/utm-handler.min.94d79fa3fc8f8c1ba1b075710e46a95a04a7849e179d21575f548515d9a976b5.js", + "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js", + "https://client.prod.mplat-ppcprotect.com/43r8LH0Y1w5RdsKbkaSMcLLfhbaukSPuUEhlaInM.js", + "https://cdn.cr-relay.com/v1/site/a5d49f07-b6b8-4458-bfc0-d11e773eae89/signals.js", + "//munchkin.marketo.net/munchkin.js", + "https://bat.bing.com/p/action/4061438.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/827913433/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18052398118/", + "https://s.adroll.com/j/roundtrip.js", + "https://s.adroll.com/j/pre/AWPYDAH5JJH2JGSUWJVDKM/BPNOSTJTQFA3HBFU5WDRCM/fpconsent.js", + "https://s.adroll.com/j/pre/AWPYDAH5JJH2JGSUWJVDKM/BPNOSTJTQFA3HBFU5WDRCM/index.js", + "https://d.adroll.com/consent/check/AWPYDAH5JJH2JGSUWJVDKM", + "https://lex.33across.com/ps/v1/pubtoken/", + "https://d.adroll.com/pixel/AWPYDAH5JJH2JGSUWJVDKM/BPNOSTJTQFA3HBFU5WDRCM", + "//s.adroll.com/j/sendrolling.js", + "https://www.datadoghq.com/assets/search-bar.min.25baf6028d92fa1ecf1a9f2cefe9d766d616f347748da385671645c33762cc3b.js", + "//lp.datadoghq.com/js/forms2/js/forms2.min.js", + "https://www.datadoghq.com/assets/signup-modal-demo.min.8b8fd9550de9c89d01455cfbbaf2a873fc99bdd702583545576e7614ea7d2429.js", + "https://www.datadoghq.com/assets/ane-popup-banner.js", + "https://www.datadoghq.com/assets/alpine.min.9fb7fca9511674131f4a90d5aa06dbaf0fd1b7fdf5abc81053327ef29d736a0e.js", + "https://www.datadoghq.com/assets/home.min.8ed46f5bfc0171fb838d126e621d02e5763f3dbd47a66163c10b14608ea9123b.js", + "https://www.influ2.com/tracker", + "//nexus.ensighten.com/choozle/17899/Bootstrap.js", + "https://sdk.userledclient.io", + "https://a.usbrowserspeed.com/cs", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-Light.woff2", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-Semibold.woff2", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-Bold.woff2", + "https://corp.dd-static.net/img/home-animation-mobile.png", + "https://corp.dd-static.net/img/dd_logo_n_70x75.png", + "https://corp.dd-static.net/img/datadog_rbg_n_2x.png", + "https://corp.dd-static.net/img/dd-homepage.jpg", + "https://corp.dd-static.net/img/bg_gradient_956.png", + "inline:#demandbase_js_lib", + "inline:#gtm-vimeo-tracking", + "inline:#userled-sdk-snippet", + "inline:#userled-sdk", + "https://www.datadoghq.com/styles/tw-iconfont.min.9faef8d795a8904d49a6e689317b2970de73b9fa4fa2b73068ae3a83f78264cf.css", + "https://www.datadoghq.com/styles/datadog-home.min.bd692da35fb140c643d7cafbc4cbc84f34206d3e6180c17b74b715cd3912c890.css", + "https://www.datadoghq.com/css/styles.min.c074f65a32efb03be3826b0260c04f99a19be6a05b1b77194c05571a92398c9b.css", + "https://corp.dd-static.net/img/dd-logo-n-200.png", + "https://corp.dd-static.net/img/home-hostmap-static.png", + "https://corp.dd-static.net/img/clickthrough-logs.png", + "https://corp.dd-static.net/img/home-apm-static.png", + "https://corp.dd-static.net/img/products/bits-ai-sre/bits-ai-sre_investigations.png", + "https://corp.dd-static.net/img/homepage/prioritize_high-risk_vulnerabilities_1_desktop.png", + "https://corp.dd-static.net/img/Browsertest_03.png", + "https://corp.dd-static.net/img/products/rum/rum-video.png", + "https://corp.dd-static.net/img/network/network-map-poster.png", + "https://corp.dd-static.net/img/dd_logos/png_logos/horizontal/dd_logo_h_white.png", + "https://corp.dd-static.net/img/home/datadog-platform-video-tour.png", + "https://corp.dd-static.net/img/serverless/serverless-1-all-your-functions-poster.png", + "https://lp.datadoghq.com/js/forms2/js/forms2.min.js", + "https://www.googletagmanager.com/gtm.js", + "https://www.datadoghq.com/static/chunks/recorder-547cbcab4593c499778c-datadog-rum.js", + "https://preview.ff-cdn.datadoghq.com/precompute-assignments", + "https://www.datadoghq.com/locate", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-Book.woff2", + "https://corp.dd-static.net/img/homepage/reinvent_high_res_banner_desktop.png", + "https://www.datadoghq.com/fonts/web-fonts/RobotoMono-Regular.woff", + "https://www.datadoghq.com/fonts/iconfont.woff2", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-BookItalic.woff2", + "https://www.datadoghq.com/fonts/web-fonts/NationalWeb-RegularItalic.woff2", + "https://corp.dd-static.net/img/home/post_dash_module_desktop_image.jpg", + "https://corp.dd-static.net/img/home/dash-gradient-2.png", + "https://lp.datadoghq.com/index.php/form/getForm", + "https://e.calibermind.com/v1/p", + "https://lp.datadoghq.com/js/forms2/css/forms2.css", + "https://lp.datadoghq.com/js/forms2/css/forms2-theme-shadow.css", + "https://corp.dd-static.net/img/homepage/banner/cloud-migration-azure-ebook-rotating-slide-2800x614-desktop-240806.png", + "https://lp.datadoghq.com/index.php/form/XDFrame", + "https://bat.bing.com/bat.js", + "https://nexus.ensighten.com/choozle/17899/Bootstrap.js", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://q.quora.com/_/ad/d45c4d6ee1c840da8f6a3212618f3e29/pixel", + "https://munchkin.marketo.net/munchkin.js", + "https://corp.dd-static.net/img/icons/privacyoptions.svg", + "https://8b61d74c.datadoghq.com/api/v2/replay", + "https://t.influ2.com/p/vt/", + "https://t.influ2.com/u/", + "https://s.company-target.com/s/sync", + "https://id.rlcdn.com/464526.gif", + "https://api.company-target.com/api/v3/ip.json", + "https://ml314.com/utsync.ashx", + "https://in.ml314.com/ud.ashx", + "https://transcend-cdn.com/cm/dc241cd4-6477-4f2b-86c0-6bcb51869e28/ui.js", + "https://tag-logger.demandbase.com/bg9s", + "https://click.prod.mplat-ppcprotect.com/v2/recv", + "https://munchkin.marketo.net/165/munchkin.js", + "https://api.cr-relay.com/v1/site/a5d49f07-b6b8-4458-bfc0-d11e773eae89/batch", + "https://www.google-analytics.com/j/collect", + "https://transcend-cdn.com/cm/dc241cd4-6477-4f2b-86c0-6bcb51869e28/cm.css", + "https://transcend-cdn.com/cm/dc241cd4-6477-4f2b-86c0-6bcb51869e28/translations/en.json", + "https://t.co/1/i/adsct", + "https://analytics.twitter.com/1/i/adsct", + "https://www.google.com/rmkt/collect/827913433/", + "https://webops-gtm.datadoghq.com/g/collect", + "https://www.google.com/rmkt/collect/18052398118/", + "https://analytics.google.com/g/s/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://8b61d74c.datadoghq.com/api/v2/rum", + "https://px.ads.linkedin.com/collect", + "https://pixel-config.reddit.com/pixels/t2_naasd/config", + "https://alb.reddit.com/rp", + "https://bat.bing.com/actionp/0", + "https://bat.bing.com/action/0", + "https://875-uvy-685.mktoresp.com/webevents/visitWebPage", + "https://api.vector.co/pixel/ip-info", + "https://www.google.com/pagead/1p-user-list/827913433/", + "https://www.google.com/pagead/1p-user-list/18052398118/", + "https://px.ads.linkedin.com/wa/", + "https://corp.dd-static.net//video/home/homepage-animation-1080.mp4", + "https://corp.dd-static.net/img/favicons/dd-favicon.png", + "https://n.clarity.ms/collect", + "https://api.vector.co/pixel/phoenix/sync-container", + "https://insight.adsrvr.org/tags/m5efvfi/m4f44i8/iframe", + "https://d.adroll.com/pex/AWPYDAH5JJH2JGSUWJVDKM/BPNOSTJTQFA3HBFU5WDRCM", + "https://api.vector.co/pixel/phoenix/rp/j", + "https://s.adroll.com/j/sendrolling.js", + "https://d.adroll.com/cm/b/out", + "https://d.adroll.com/cm/bombora/out", + "https://d.adroll.com/cm/b_s/out", + "https://d.adroll.com/cm/equativ/out", + "https://d.adroll.com/cm/eyeota/out", + "https://d.adroll.com/cm/experian/out", + "https://d.adroll.com/cm/g/out", + "https://d.adroll.com/cm/index/out", + "https://d.adroll.com/cm/l/out", + "https://d.adroll.com/cm/o/out", + "https://d.adroll.com/cm/n/out", + "https://d.adroll.com/cm/pubmatic/out", + "https://d.adroll.com/cm/outbrain/out", + "https://d.adroll.com/cm/taboola/out", + "https://d.adroll.com/cm/triplelift/out", + "https://d.adroll.com/cm/x/out" + ], + "stylesheets": [ + "https://www.datadoghq.com/styles/datadog-home.min.bd692da35fb140c643d7cafbc4cbc84f34206d3e6180c17b74b715cd3912c890.css", + "https://www.datadoghq.com/styles/tw-iconfont.min.9faef8d795a8904d49a6e689317b2970de73b9fa4fa2b73068ae3a83f78264cf.css", + "https://www.datadoghq.com/css/styles.min.c074f65a32efb03be3826b0260c04f99a19be6a05b1b77194c05571a92398c9b.css", + "https://lp.datadoghq.com/js/forms2/css/forms2.css", + "https://lp.datadoghq.com/js/forms2/css/forms2-theme-shadow.css" + ], + "cookies": [ + "_dd_device_id", + "_dd_s", + "ajs_anonymous_id", + "_gcl_au", + "signals-sdk-user-id", + "signals-sdk-session-id", + "_gid", + "_gat_corpProd", + "_twsid", + "_twpid", + "_ga", + "_ga_KN80RDFSQK", + "FPLC", + "FPGSID", + "_fbp", + "_rdt_uuid", + "_uetsid", + "_uetvid", + "_mkto_trk", + "_li_dcdm_c", + "_lc2_fpi", + "_lc2_fpi_js", + "_yjsu_yjad", + "_clck", + "_clsk", + "__adroll_fpc", + "__ar_v4" + ], + "metas": [ + "generator=Hugo 0.142.0" + ], + "inlineSamples": [], + "domFlags": [ + ".btn-primary", + "[x-data]", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "Alpine": { + "present": true, + "version": "3.14.9" + }, + "DD_LOGS": { + "present": true + }, + "DD_RUM": { + "present": true + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/www.figma.com.json b/tests/corpus/www.figma.com.json new file mode 100644 index 0000000..8bd3f73 --- /dev/null +++ b/tests/corpus/www.figma.com.json @@ -0,0 +1,213 @@ +{ + "host": "www.figma.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "emotion" + ] + }, + "snapshot": [ + "emotion:high", + "netlify:medium", + "nextjs:high@15.5.24", + "react:high", + "sentry:high", + "webpack:high" + ], + "signals": { + "url": "https://www.figma.com/", + "scripts": [ + "/_netlify/_next/static/chunks/4bd1b696-3e23558216c76056.js", + "/_netlify/_next/static/chunks/3914-8273697e55aba824.js", + "/_netlify/_next/static/chunks/main-app-a637b1aae61d951d.js", + "/_netlify/_next/static/chunks/bf76e631-047ac0aae52ca139.js", + "/_netlify/_next/static/chunks/9104-5a18d21ea507af9e.js", + "/_netlify/_next/static/chunks/1293-be688e8386de44e3.js", + "/_netlify/_next/static/chunks/829-dbbbfe9d89a509ef.js", + "/_netlify/_next/static/chunks/5640-16f37ed96d007393.js", + "/_netlify/_next/static/chunks/5897-b639b305bb8e90de.js", + "/_netlify/_next/static/chunks/6416-5438a2f1b22175e5.js", + "/_netlify/_next/static/chunks/5880-25451cc195d20b88.js", + "/_netlify/_next/static/chunks/8146-b69daef121606429.js", + "/_netlify/_next/static/chunks/4782-0b030f8fe372d602.js", + "/_netlify/_next/static/chunks/3990-66dfee18ed33b7e2.js", + "/_netlify/_next/static/chunks/6693-54e4a316af663d02.js", + "/_netlify/_next/static/chunks/2367-52b315432d836a27.js", + "/_netlify/_next/static/chunks/8256-efe8705e4f98a16a.js", + "/_netlify/_next/static/chunks/app/%5Blang%5D/%5B...slug%5D/page-f104d8052cbd5c36.js", + "/_netlify/_next/static/chunks/2302-565a22b75be94c74.js", + "/_netlify/_next/static/chunks/app/%5Blang%5D/(bespoke)/page-e0262f838cbe56a1.js", + "/_netlify/_next/static/chunks/app/%5Blang%5D/error-a6502a68df4ea2fe.js", + "/_netlify/_next/static/chunks/app/%5Blang%5D/not-found-40ac9d1aef9f57ee.js", + "/_netlify/_next/static/chunks/polyfills-42372ed130431b0a.js", + "/_netlify/_next/static/chunks/webpack-9b677d1f09aa4591.js", + "/_netlify/_next/static/media/7c42ed55a7834032-s.p.woff2", + "https://cdn.sanity.io/images/599r6htc/regionalized/717af6633a6896341b7c95807c05f449597ef769-98x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/855afc6ef4bb9d8394d6e431355190296391803d-155x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/b294234a9bfdd4a158e20e92fbac3c629f6e9170-124x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/04c81a93b530b57e29b1fabbb263cd398637e0c3-107x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/9e4f6f88c28e657c5b56355f210f3b0ca4f6f93c-87x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/6a3dc606d7d09fc8e5c6750e614571151be3700d-380x56.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/6b1738a69bdca9a6b7eb575a5e9aad7851edfab6-120x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/176848b4508f88d6e99cbebe953a99544383503f-84x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/86f3e1fdd939b2b55742aeb050901033ac11df68-130x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/f810691e526e4f771f2ebf33ddcd0f566117da1f-97x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/291a41dd8ae8cd7f9bde48427197b549a75109a7-66x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/41d8568f985d041ccbcb64865c56c5d04dacbe77-180x32.svg", + "https://cdn.sanity.io/images/599r6htc/regionalized/9152f45c8c5c17a2071ee4d2f04507c89240eafe-86x32.svg", + "/api/user", + "/_netlify/_next/static/media/rive.ac4ff0e0.wasm", + "inline:#appRedirect", + "inline:#_R_", + "inline:#strict-meta-csp", + "https://www.figma.com/_netlify/_next/static/media/7c42ed55a7834032-s.p.woff2", + "https://cdn.sanity.io/images/599r6htc/regionalized/4b9ade839f38291c91b76608d22e7c7a9ad525fd-542x305.png", + "https://cdn.sanity.io/images/599r6htc/regionalized/7e39b983c6ad865e0a7a5243d914020e69a23f70-542x305.png", + "https://cdn.sanity.io/images/599r6htc/regionalized/1883a9ebc4ce697b718301ad247c0fff45c572c1-540x304.png", + "https://www.figma.com/_netlify/_next/static/css/617e0bc399c83bea.css", + "https://www.figma.com/_netlify/_next/static/chunks/webpack-9b677d1f09aa4591.js", + "https://www.figma.com/_netlify/_next/static/chunks/4bd1b696-3e23558216c76056.js", + "https://www.figma.com/_netlify/_next/static/chunks/main-app-a637b1aae61d951d.js", + "https://www.figma.com/_netlify/_next/static/chunks/9104-5a18d21ea507af9e.js", + "https://www.figma.com/_netlify/_next/static/chunks/bf76e631-047ac0aae52ca139.js", + "https://www.figma.com/_netlify/_next/static/chunks/3914-8273697e55aba824.js", + "https://www.figma.com/_netlify/_next/static/chunks/1293-be688e8386de44e3.js", + "https://www.figma.com/_netlify/_next/static/chunks/829-dbbbfe9d89a509ef.js", + "https://www.figma.com/_netlify/_next/static/chunks/5897-b639b305bb8e90de.js", + "https://www.figma.com/_netlify/_next/static/chunks/5880-25451cc195d20b88.js", + "https://www.figma.com/_netlify/_next/static/chunks/6416-5438a2f1b22175e5.js", + "https://www.figma.com/_netlify/_next/static/chunks/8146-b69daef121606429.js", + "https://www.figma.com/_netlify/_next/static/chunks/4782-0b030f8fe372d602.js", + "https://www.figma.com/_netlify/_next/static/chunks/5640-16f37ed96d007393.js", + "https://www.figma.com/_netlify/_next/static/chunks/6120-0fcd2d1a988bb0a7.js", + "https://www.figma.com/_netlify/_next/static/chunks/3990-66dfee18ed33b7e2.js", + "https://www.figma.com/_netlify/_next/static/chunks/6693-54e4a316af663d02.js", + "https://www.figma.com/_netlify/_next/static/chunks/5280-8ffcebe2c6cdeebf.js", + "https://www.figma.com/_netlify/_next/static/chunks/7140-e5d517d595f27161.js", + "https://www.figma.com/_netlify/_next/static/chunks/8256-efe8705e4f98a16a.js", + "https://www.figma.com/_netlify/_next/static/chunks/2367-52b315432d836a27.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/error-a6502a68df4ea2fe.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/(bespoke)/page-e0262f838cbe56a1.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/%5B...slug%5D/page-f104d8052cbd5c36.js", + "https://www.figma.com/_netlify/_next/static/chunks/2302-565a22b75be94c74.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/not-found-40ac9d1aef9f57ee.js", + "https://cdn.sanity.io/images/599r6htc/regionalized/0d876c21c66527fa11544614dae3e6f69f3b6919-984x984.png", + "https://www.figma.com/api/user", + "https://www.figma.com/manifest.json", + "https://cdn.sanity.io/images/599r6htc/regionalized/2b9cde1ef61edbe24913804173039282db976113-894x1080.jpg", + "https://www.figma.com/_netlify/_next/static/media/rive.ac4ff0e0.wasm", + "https://static.figma.com/app/icon/2/favicon.ico", + "https://static.figma.com/app/icon/2/favicon.svg", + "https://static.figma.com/app/icon/2/favicon.png", + "https://www.figma.com/api/geoip", + "https://www.figma.com/api/figment-proxy/page", + "https://www.figma.com/_netlify/_next/static/chunks/8094.3e1214e94237d925.js", + "https://www.figma.com/_netlify/_next/static/chunks/5942.653e3b4b898b367b.js", + "https://featureassets.org/v1/initialize", + "https://www.figma.com/pricing/", + "https://www.figma.com/contact/", + "https://www.figma.com/_netlify/_next/static/chunks/2332-7312b5e6c5a191c4.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/(bespoke)/contact/page-1f8050961fed3ab6.js", + "https://www.figma.com/_netlify/_next/static/chunks/8660-eaa8b586519fb0de.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/(bespoke)/pricing/page-893307cacde0dec0.js", + "https://player.vimeo.com/video/1202887330", + "https://player.vimeo.com/video/1202195955", + "https://player.vimeo.com/video/1202195324", + "https://player.vimeo.com/video/1202189219", + "https://player.vimeo.com/video/1202189216", + "https://player.vimeo.com/video/1202189217", + "https://player.vimeo.com/video/1202189218", + "https://player.vimeo.com/video/1202194414", + "https://player.vimeo.com/video/1203604825", + "https://player.vimeo.com/video/1204234347", + "https://prodregistryv2.org/v1/rgstr", + "https://www.figma.com/privacy/", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/legal/(non-reader-mode)/layout-b975d5a8c27e6c03.js", + "https://www.figma.com/_netlify/_next/static/chunks/9888-f3587531a18dea4c.js", + "https://www.figma.com/_netlify/_next/static/chunks/app/%5Blang%5D/legal/(non-reader-mode)/%5B...slug%5D/page-760330bfe867bddf.js" + ], + "stylesheets": [ + "/_netlify/_next/static/css/617e0bc399c83bea.css" + ], + "cookies": [ + "ajs_anonymous_id", + "product_locale" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[9766,[],\\\"\\\"]\\n3:I[98924,[],\\\"\\\"]\\n6:I[24431,[],\\\"OutletBoundary\\\"]\\n8:I[15278,[],", + "self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"PqQel5V4sF1fNDr1lI9pk\\\",\\\"p\\\":\\\"/_netlify\\\",\\\"c\\\":[\\\"\\\",\\\"\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",", + "self.__next_f.push([1,\"b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"w", + "self.__next_f.push([1,\"9:{\\\"metadata\\\":[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"Figma: The collaborative canvas for design, code, and ", + "self.__next_f.push([1,\"e:\\\"$9:metadata\\\"\\n\"])", + "self.__next_f.push([1,\"26:I[80622,[],\\\"IconMark\\\"]\\n\"])", + "self.__next_f.push([1,\"27:I[55280,[\\\"4685\\\",\\\"static/chunks/bf76e631-047ac0aae52ca139.js\\\",\\\"9104\\\",\\\"static/chunks/9104-5a18d21ea507", + "self.__next_f.push([1,\"28:I[99326,[\\\"4685\\\",\\\"static/chunks/bf76e631-047ac0aae52ca139.js\\\",\\\"9104\\\",\\\"static/chunks/9104-5a18d21ea507", + "self.__next_f.push([1,\"29:I[48922,[\\\"4685\\\",\\\"static/chunks/bf76e631-047ac0aae52ca139.js\\\",\\\"9104\\\",\\\"static/chunks/9104-5a18d21ea507", + "self.__next_f.push([1,\"10:[\\\"$\\\",\\\"meta\\\",\\\"43\\\",{\\\"property\\\":\\\"og:image:width\\\",\\\"content\\\":\\\"1200\\\"}]\\n11:[\\\"$\\\",\\\"meta\\\",\\\"44\\\",{", + "self.__next_f.push([1,\"om/app/icon/2/touch-152.png\\\",\\\"sizes\\\":\\\"152x152\\\"}]\\n23:[\\\"$\\\",\\\"link\\\",\\\"62\\\",{\\\"rel\\\":\\\"apple-touch-icon\\\"", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFWElEQVR4nGWP", + "self.__next_f.push([1,\"2b:T842,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0UlEQVR4nDWS", + "self.__next_f.push([1,\"2c:T5c6,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD9UlEQVR4nGNg", + "self.__next_f.push([1,\"2d:T7c2,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFcklEQVR4nD2U", + "self.__next_f.push([1,\"2e:T6e6,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEzUlEQVR4nH2T", + "self.__next_f.push([1,\"2f:T8ca,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAABYlAAAWJQFJUiTwAAAGOUlEQVR4nFXU", + "self.__next_f.push([1,\"30:T86e,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF80lEQVR4nE2U", + "self.__next_f.push([1,\"31:T6ea,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR4nAHE", + "self.__next_f.push([1,\"32:T986,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGxElEQVR4nG2T", + "self.__next_f.push([1,\"33:T6ea,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR4nAHE", + "self.__next_f.push([1,\"34:T496,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADEElEQVR4nEXS", + "self.__next_f.push([1,\"35:T4ae,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJElEQVR4nAEZ", + "self.__next_f.push([1,\"36:T6ea,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR4nAHE", + "self.__next_f.push([1,\"37:T9e6,\"])", + "self.__next_f.push([1,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAHDklEQVR4nE2S" + ], + "domFlags": [ + "next-route-announcer", + "[data-emotion]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "next": { + "present": true, + "version": "15.5.24" + }, + "webpackChunk": { + "present": true + }, + "webpackChunk_N_E": { + "present": true + } + } +} diff --git a/tests/corpus/www.flipkart.com.json b/tests/corpus/www.flipkart.com.json new file mode 100644 index 0000000..f192668 --- /dev/null +++ b/tests/corpus/www.flipkart.com.json @@ -0,0 +1,158 @@ +{ + "host": "www.flipkart.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "newrelic" + ] + }, + "snapshot": [ + "newrelic:high", + "react-router:high@7.9.5", + "react:high", + "webpack:high" + ], + "signals": { + "url": "https://www.flipkart.com/", + "scripts": [ + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/fkvendor.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/CrossCommon.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/app.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/OVHomePageTS.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/DesktopComponents.js", + "inline:#__LOADABLE_REQUIRED_CHUNKS__", + "inline:#__LOADABLE_REQUIRED_CHUNKS___ext", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/DesktopComponents.css", + "https://rukminim2.flixcart.com/fk-p-flap/1600/2420/image/6691b0270f775d08.png", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/fonts/Inter-SemiBold.woff2", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/fonts/Inter-Regular.woff2", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/fonts/Inter-Bold.woff2", + "https://rukminim2.flixcart.com/fk-p-flap/26/22/image/d2ecfddf891a3922.png", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/images/profile-6bae67.svg", + "https://rukminim2.flixcart.com/fk-p-flap/29/22/image/7ab4040af860941d.png", + "https://rukminim2.flixcart.com/fk-p-flap/36/18/image/5a9ff48eef96b876.png", + "https://rukminim2.flixcart.com/fk-p-flap/46/18/image/31f7e3af490c225f.png", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/images/header_cart_v4-6ac9a8.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/all.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/electronics.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/fashion.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/mobiles.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/beauty.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/tv.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/home-final.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/toy.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/food.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/auto-acc.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/sport.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/auto-new.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/furniture.svg", + "https://static-assets-web.flixcart.com/apex-static/images/svgs/L1Nav/books.svg", + "https://rukminim2.flixcart.com/fk-p-flap/1600/780/image/2b6985299e5f96e8.jpg", + "https://rukminim2.flixcart.com/fk-p-flap/1600/780/image/56c6f127c81d67c3.png", + "https://rukminim2.flixcart.com/fk-p-flap/920/448/image/1909a1a59154ede1.jpg", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/4cd435476ada2048.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/44589f2c5d3ef94b.png", + "https://rukminim2.flixcart.com/www/1600/530/promos/18/09/2026/2cf1918f-ed90-42ba-8bb8-5a318ad55d2c.jpg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/gas-stove/r/f/k/2-lpg-4-2-ebony-greenchef-10-5-manual-original-imahgkj9gyhtbcq5.jpeg", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/0cdd1a70a2411f3a.png", + "https://rukminim2.flixcart.com/image/140/187/xif0q/bottle/p/0/u/910-eiffel-1000-insulated-hot-or-cold-flask-1-ec-thf-ftv-0018-enriched-transparent-original-imahgxnr8dkkgjez.png", + "https://rukminim2.flixcart.com/image/140/187/xif0q/solar-light-set/q/6/m/1-08-300-18-nihiti-original-imahh3p4h2ucghyh.jpeg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/faucet/6/j/f/wall-concealed-installation-type-premium-360-flexible-spark-sink-original-imah8jehfmgf4wyf.jpeg", + "https://rukminim2.flixcart.com/www/1600/530/promos/20/09/2026/c2363faa-c8e6-4863-8b1f-adb58fc8993c.jpg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/sandal/t/a/x/8-205089-8-crocs-slate-grey-lime-punch-original-imah8afv5czzbeq9.jpeg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/pressure-cooker/0/k/x/-original-imagsjvkh4cgkcar.jpeg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/ethnic-set/1/g/l/xl-400268ih-libas-original-imahewdekhkbryqt.jpeg", + "https://rukminim2.flixcart.com/image/140/187/xif0q/jean/9/b/7/32-99-winkelstreet-original-imagut2mhtbkxry7.jpeg", + "https://rukminim2.flixcart.com/fk-p-flap/1570/350/image/4fb342112a2118be.jpg", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/480x640-bengdq-1790170761236.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/480x640-bengdq-1789717422271.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/480x640-bengdq-1790340588959.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/480x640-bengdq-1790320398920.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/480x640-bengdq-1790323804253.png", + "https://rukminim2.flixcart.com/fk-p-flap/800/1070/image/38f8b250d13d9c7a.png", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/MultiWidgetpage.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/CrossPlatformModules.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/en-js.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/commonLazyLoadChunk.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/commonLazyLoadChunk.js", + "https://sonic.fdp.api.flipkart.com/4/data/collector/business", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/lazyLoadChunk.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/lazyLoadChunk.js", + "https://static-assets-web.flixcart.com/www/linchpin/batman-returns/codes.json", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/StorePageTS.js", + "https://1.rome.api.flipkart.com/4/user/state", + "https://js-agent.newrelic.com/nr-spa-1.317.0.min.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/images/logo_lite-cbb357.png", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/video.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/BaseActionNonCritical.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/LoginBSRenderer.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/LoginBSRenderer.js", + "https://rukminim2.flixcart.com/fk-p-flap/480/720/image/6691b0270f775d08.png", + "https://rukminim2.flixcart.com/fk-p-flap/1600/780/image/1312x640-19f82h-1790276801789.png", + "https://bam.nr-data.net/1/NRJS-dd5f16cdf95712c6cba", + "https://1.rome.api.flipkart.com/4/page/fetch", + "https://bam.nr-data.net/events/1/NRJS-dd5f16cdf95712c6cba", + "https://bam.nr-data.net/jserrors/1/NRJS-dd5f16cdf95712c6cba", + "https://bam.nr-data.net/ins/1/NRJS-dd5f16cdf95712c6cba", + "https://trinity-fk.akamaized.net/videos/57b88b707759ab76/master.m3u8", + "https://trinity-fk.akamaized.net/videos/57b88b707759ab76/1312x640/playlist.m3u8", + "https://trinity-fk.akamaized.net/videos/57b88b707759ab76/1312x640/00.ts", + "https://rukminim2.flixcart.com/fk-p-flap/460/224/image/1909a1a59154ede1.jpg", + "https://1.sonic.fdp.api.flipkart.com/4/data/collector/business", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/OmnitureLazyChunk.js", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/MapiActionNonCriticalActions.js", + "https://rukminim2.flixcart.com/fk-p-flap/1600/780/image/408b66ccf94dcc63.png", + "https://rukminim2.flixcart.com/fk-p-flap/1600/780/image/1312x640-19f82h-1790160250231.png" + ], + "stylesheets": [ + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/DesktopComponents.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/commonLazyLoadChunk.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/lazyLoadChunk.css", + "https://static-assets-web.flixcart.com/batman-returns/batman-returns/p/58433938812fd22978a2b699a711ba59/LoginBSRenderer.css" + ], + "cookies": [ + "T", + "vh", + "vw", + "dpr", + "fonts-loaded", + "Network-Type", + "isH2EnabledBandwidth", + "h2NetworkBandwidth" + ], + "metas": [], + "inlineSamples": [ + "window.NREUM||(NREUM={}),NREUM.init={browser_consent_mode:{enabled:!1},privacy:{cookies_enabled:!0},distributed_tracing:{enabled:!0}" + ], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "NREUM": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__reactRouterVersion": { + "present": true, + "version": "7.9.5" + }, + "__staticRouterHydrationData": { + "present": true + }, + "newrelic": { + "present": true + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/www.hotjar.com.json b/tests/corpus/www.hotjar.com.json new file mode 100644 index 0000000..8697f8d --- /dev/null +++ b/tests/corpus/www.hotjar.com.json @@ -0,0 +1,329 @@ +{ + "host": "www.hotjar.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "hotjar", + "module-federation" + ], + "mustNotSolid": [ + "parcel" + ] + }, + "snapshot": [ + "google-analytics:high", + "hotjar:high", + "microfrontend:high", + "module-federation:high", + "nextjs:high@14.2.35", + "parcel:low", + "react:high", + "tailwind:high", + "webpack:high" + ], + "signals": { + "url": "https://contentsquare.com/hotjar/", + "scripts": [ + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://tags.srv.stackadapt.com/events.js", + "https://bzrcdn.openai.com/sdk/oaiq.min.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://connect.facebook.net/signals/config/570058912571652", + "https://connect.facebook.net/en_US/fbevents.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://bat.bing.com/bat.js", + "https://x.clearbitjs.com/v2/pk_0ff2488f59791c47711ae8173845dff6/tracking.min.js", + "https://x.clearbitjs.com/v1/pk_0ff2488f59791c47711ae8173845dff6/forms.js", + "https://x.clearbitjs.com/v2/pk_0ff2488f59791c47711ae8173845dff6/destinations.min.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://cdn.us.heap-api.com/v5/heapjs-static/5.3.16/core/heap.js", + "https://cdn-app.pathfactory.com/production/jukebox/current/jukebox.js", + "https://static.oktopost.com/oktrk.js", + "https://cdn.us.heap-api.com/config/236035469/heap_config.js", + "https://www.googletagmanager.com/gtag/js", + "https://invite.contentsquare.com/pr/js", + "https://t.contentsquare.net/experiment/355d5ac78f8a5.js", + "https://reveal.clearbit.com/v1/companies/reveal", + "https://cdn.cookielaw.org/consent/0bfcfb81-1ab4-4de1-baaa-a22e4094b15d/OtAutoBlock.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "/_next/static/chunks/polyfills-42372ed130431b0a.js", + "/_next/static/chunks/701.c9b2e3d5a4f26cee.js", + "/_next/static/chunks/webpack-cf58d83c319ca629.js", + "/_next/static/chunks/main-1906ab9a4ad28521.js", + "/_next/static/chunks/pages/_app-7721f5eb04829472.js", + "/_next/static/chunks/996-8b46c3287171d4e7.js", + "/_next/static/chunks/pages/%5B%5B...slug%5D%5D-f4c338e9e703e2bf.js", + "/_next/static/W9P33ycoHuCt1wztYIIMj/_buildManifest.js", + "/_next/static/W9P33ycoHuCt1wztYIIMj/_ssgManifest.js", + "https://cdn.cookielaw.org/scripttemplates/202501.2.0/otBannerSdk.js", + "/ee53130faf366ae4/script.js", + "/e27f02888427668e/script.js", + "https://cdn.jsdelivr.net/npm/hockeystack@latest/hockeystack.min.js", + "https://tracking.g2crowd.com/attribution_tracking/conversions/1007991.js", + "//munchkin.marketo.net/munchkin.js", + "https://static.hotjar.com/c/hotjar-3279672.js", + "https://analytics.ahrefs.com/analytics.js", + "https://assets.apollo.io/micro/website-tracker/tracker.iife.js", + "//t.contentsquare.net/uxa/355d5ac78f8a5.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/875542137/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/860889509/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/11181674455/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/711849444/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/860889431/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/728949689/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/11117300980/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/16743947420/", + "https://static.hj.contentsquare.net/c/hotjar-5204814.js", + "https://bat.bing.com/p/action/211069492.js", + "https://www.googletagmanager.com/gtm.js", + "/_next/static/chunks/pages/pricing-2f7c73e1baeca58a.js", + "https://tag.clearbitscripts.com/v1/pk_0ff2488f59791c47711ae8173845dff6/tags.js", + "/_next/static/media/7f2e0a5c49f316cf-s.p.woff2", + "/_next/static/media/45be93e32af366cc-s.p.woff2", + "/_next/static/media/c4b700dcb2187787-s.p.woff2", + "/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "inline:#clearbit-reveal", + "inline:#cdn-cookie-consent", + "inline:#cdn-cookie-template", + "inline:#optanon-wrapper", + "inline:#wphs", + "inline:#__NEXT_DATA__", + "inline:#_next-gtm-init", + "inline:#_next-gtm", + "https://contentsquare.com/_next/static/media/45be93e32af366cc-s.p.woff2", + "https://contentsquare.com/_next/static/media/7f2e0a5c49f316cf-s.p.woff2", + "https://contentsquare.com/_next/static/media/e4af272ccee01ff0-s.p.woff2", + "https://contentsquare.com/_next/static/media/c4b700dcb2187787-s.p.woff2", + "https://contentsquare.com/_next/static/chunks/701.c9b2e3d5a4f26cee.js", + "https://contentsquare.com/_next/static/chunks/webpack-cf58d83c319ca629.js", + "https://contentsquare.com/_next/static/chunks/main-1906ab9a4ad28521.js", + "https://contentsquare.com/_next/static/chunks/996-8b46c3287171d4e7.js", + "https://contentsquare.com/_next/static/W9P33ycoHuCt1wztYIIMj/_buildManifest.js", + "https://contentsquare.com/_next/static/chunks/pages/%5B%5B...slug%5D%5D-f4c338e9e703e2bf.js", + "https://contentsquare.com/_next/static/chunks/pages/_app-7721f5eb04829472.js", + "https://contentsquare.com/_next/static/W9P33ycoHuCt1wztYIIMj/_ssgManifest.js", + "https://contentsquare.com/favicons/site.webmanifest", + "https://cdn.cookielaw.org/consent/0bfcfb81-1ab4-4de1-baaa-a22e4094b15d/0bfcfb81-1ab4-4de1-baaa-a22e4094b15d.json", + "https://contentsquare.com/_next/static/css/97bcc08b937f3013.css", + "https://contentsquare.com/_next/static/css/4607fd028f2808fb.css", + "https://images.ctfassets.net/gwbpo1m641r7/61jJ8diPBkSCTekr9Bko5d/05b07a576032f9eed48fa564e98929ca/sparkles.svg", + "https://images.ctfassets.net/gwbpo1m641r7/4hh0HPa4XOLWoz9GJcdPVH/2e9ec7d96f6f3c54c5345eb5fa4b9b8e/plug-zap.svg", + "https://images.ctfassets.net/gwbpo1m641r7/77MK1817esbvGY4iWTU5VP/d1837df8a68f19216ea9a3bfa494d41d/message-circle-code.svg", + "https://images.ctfassets.net/gwbpo1m641r7/1zNQ5Gd3LGGKaEN0Iqh8Uk/24fa9153263087ee32cc4256e6b6aeb1/experience-analytics_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/4YUBF2yJs3o6U1T6xy4Yl7/2f2fa56cc720433ea57f07b92e34f7f6/product-analytics.svg", + "https://images.ctfassets.net/gwbpo1m641r7/22lwAJgOqPiwQ6QXqGf8UQ/388b3f1978b62114aaf6d55812fee2c3/experience-monitoring.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5mTjvKCNm6NzGsszOzgjGl/634860682d77b8d395e54c3e91496841/VOC_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/7bX0tCQkpfOsX7rUPdsJsv/6c0ca8717d628c7168e540fd1b1bcea6/Experience_Monitoring_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/nCI0BAucJJyAEr41YWyUy/bb803f6cdd3e95eb6f6173e65747cdf7/Session_Replay_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/1DxfZwGaWOx0bzP72oqmUW/7056b2ca6cfb613bb65bcdc21afb9f7e/Heatmaps_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/2fgTpATNONFvjWbHqCBQVT/aeaa5b5a042b3704981cf6aaf88d493d/Web_Analytics_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/4fUaI1HYOXYt33AhNP0QyJ/afeace35980d614f3827663655b0c3e2/Journeys_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/2bxEPEPyHz0CzQXq51woc5/41f07db2eb24fb7529102b4f5cb5a2c8/Errors_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/3wX97gLgH40XmSABESC9zR/7dd84b40d581a644dcc98dce99a7638a/User_Feedback_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/3CzhuFZP4shpEXp8JEpI25/4d2e8f8a234104bf6ef4c4e0e0f611fe/Optimise_Journeys_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5FAt4vEn3sUzddwc2T5aPI/ac892ab54632e57d537142929dd894fd/Improve_Conversion_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/mgBFXwWsaiiIDXXHtPexB/efc008ff8cfd311d3c660c39efa3b093/Boost_A_B_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/jQf7kY82XwvcUhvrzWGAt/c382e41206c0a8c69fb2e6016dd84a12/Increase_Lifetime_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5t1Dly1OwsTRUCmH8hIGHQ/9f3923dcacafa6fa2953a21dfbda8c9e/Digital_Marketing_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5RhbkqNTlr1oXS1fHgg8Kp/96fe5b1207d026212e741eef00f816e5/Product_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/4tAs2bqLywqyrTspTmerMH/c213072aed52120bd53067c985f9a056/Design_UX_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5GKw5XwKzLISIMoUfBBxzf/b3ff49a117b05b431201ba4c34bf23b0/Ecommerce_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/6ASTVgiv7JazqFP5GPLttl/ad5085f12e0dc49d51c4ba37a09f8a2a/BFSI_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/27ayXju92YK1eAVrDz7KS/4121cd8fe8fe3269aef306c52d4203af/Ecommerce_Travel_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/1HIDkaNX5suLgYKBXgffF4/04387001a686ef35345fa1d55be0c2ad/Travel_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/cl97CnWwAtG4I597SkQ4c/c2f490931c6b24ffb871f9455a0ad476/B2B_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/5icjHvgMtFOl1VEplPE28O/9382da0e3841792c42fc25329bf14d8e/resources_header_1.jpg", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://images.ctfassets.net/gwbpo1m641r7/KSJbG3H19iaX09R6AA4Cy/c5aa2d2d3a26fb865f823ef9c0e8f898/CX-Circle_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/1gXuEwwRItHgVyxfH69Uq6/f3c48d7e76fd8b7ba3d8d4ff3bd62c09/partner-stories.svg", + "https://images.ctfassets.net/gwbpo1m641r7/6rYoqnBkkbaR7OpPfiVg14/a782bfb1afeb215490d28667eabbba5b/Community_Icon.svg", + "https://images.ctfassets.net/gwbpo1m641r7/3gpIAG2PlzaksFFyA69Qys/177cc7c693d062d4057126113d834209/thumbnail.png", + "https://contentsquare.com/_next/static/chunks/framework.e900e5e3369b3d25.js", + "https://contentsquare.com/_next/static/chunks/513.07cc44320238f3ac.js", + "https://contentsquare.com/_next/static/chunks/368.441b376821e9c3ec.js", + "https://contentsquare.com/_next/static/chunks/255.404d41f08c8e7736.js", + "https://contentsquare.com/_next/static/chunks/635.1f1c72eb3cd61c12.js", + "https://contentsquare.com/_next/static/chunks/715.a50b9ac915196586.js", + "https://contentsquare.com/_next/static/chunks/725.1d5c42aa8396b7af.js", + "https://contentsquare.com/_next/static/chunks/965.69b2b433aface232.js", + "https://contentsquare.com/_next/static/chunks/953.523ee8316709857d.js", + "https://contentsquare.com/_next/static/chunks/165.80ff3fa56bdaf695.js", + "https://invite.contentsquare.com/pr/grc/pk_HDCuSpqCvRchgZRqaqZIpVPfPv3cAKMj", + "https://partnerlinks.io/pr/grc/pk_HDCuSpqCvRchgZRqaqZIpVPfPv3cAKMj", + "https://grsm.io/pr/grc/pk_HDCuSpqCvRchgZRqaqZIpVPfPv3cAKMj", + "https://contentsquare.com/ee53130faf366ae4/script.js", + "https://fast.wistia.net/embed/iframe/0pqvjxo3jz", + "https://images.ctfassets.net/gwbpo1m641r7/1AscpmLjJsWvox4ea1qeFw/b8a53827f9f3900266070ace32d66c42/Bose_logo_1.svg", + "https://images.ctfassets.net/gwbpo1m641r7/4dl3dW8ny8c4gTh5NteIgh/e1351d0dcab39cf97a0aacb4fb308791/Canyon.png", + "https://images.ctfassets.net/gwbpo1m641r7/5029IZhnlq2LZP8iq3TPwE/d528bcbb38575e73fb5a78f25a8c9e85/Uber_logo_2018.png", + "https://images.ctfassets.net/gwbpo1m641r7/3tmzECYfiO17n9dcm5K1J5/58067be2f715597db0f23e943e232a39/1200px-Harrods.svg-1.png", + "https://images.ctfassets.net/gwbpo1m641r7/hWG4IJrUa3x2hLX7grwEh/a27883ebdcb9f36330c72a7218277a22/remarkable.svg", + "https://images.ctfassets.net/gwbpo1m641r7/oeehB2WNHtFtai02xIS7q/721abb1c2d2de32546c9c4218238ae2d/Pinecone-Full-Logo-Black.svg.webp", + "https://images.ctfassets.net/gwbpo1m641r7/d7krybCwRIwtJls1dSnJs/aff42b7aaf2437a0cc3aee31b71d75a2/alo_logo_black.avif", + "https://contentsquare.com/_next/data/W9P33ycoHuCt1wztYIIMj/en.json", + "https://contentsquare.com/_next/data/W9P33ycoHuCt1wztYIIMj/en/hotjar.json", + "https://contentsquare.com/_next/data/W9P33ycoHuCt1wztYIIMj/en/customers.json", + "https://contentsquare.com/_next/data/W9P33ycoHuCt1wztYIIMj/en/pricing.json", + "https://contentsquare.com/_next/data/W9P33ycoHuCt1wztYIIMj/en/request-a-demo.json", + "https://contentsquare.com/e27f02888427668e/script.js", + "https://cdn.cookielaw.org/consent/0bfcfb81-1ab4-4de1-baaa-a22e4094b15d/01943cc6-1d77-7206-a7d7-f75cf1578e93/en.json", + "https://contentsquare.com/_next/static/chunks/pages/pricing-2f7c73e1baeca58a.js", + "https://cdn.cookielaw.org/scripttemplates/202501.2.0/assets/otFloatingRoundedCorner.json", + "https://cdn.cookielaw.org/scripttemplates/202501.2.0/assets/v2/otPcTab.json", + "https://cdn.cookielaw.org/scripttemplates/202501.2.0/assets/otCommonStyles.css", + "https://cdn.cookielaw.org/logos/static/ot_close.svg", + "https://cdn.cookielaw.org/logos/static/ot_guard_logo.svg", + "https://cdn.cookielaw.org/logos/static/powered_by_logo.svg", + "https://cdn.cookielaw.org/logos/8294609a-8bec-4934-ab0a-922b8c68f891/01944cc9-cccc-7590-a2db-ed05e31d4c1b/6cd4b9d7-1b54-4c1b-86ad-f8ab3b24e513/CS_Wordmark_Midnight.png", + "https://www.hj.contentsquare.com/_next/static/chunks/remoteEntry.js", + "https://munchkin.marketo.net/munchkin.js", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://t.contentsquare.net/uxa/355d5ac78f8a5.js", + "https://fpjscdn.net/v3/68ZdmgKasmCi7k1tmd5A", + "https://tracking-api.g2.com/attribution_tracking/conversions/assign", + "https://okt.to/ping", + "https://munchkin.marketo.net/165/munchkin.js", + "https://aplo-evnt.com/api/v1/intent_pixel/can_track_visitor", + "https://www.google.com/rmkt/collect/875542137/", + "https://www.google.com/rmkt/collect/860889509/", + "https://www.google.com/rmkt/collect/11181674455/", + "https://www.google.com/rmkt/collect/711849444/", + "https://www.google.com/rmkt/collect/860889431/", + "https://www.google.com/rmkt/collect/728949689/", + "https://www.google.com/rmkt/collect/11117300980/", + "https://www.google.com/rmkt/collect/16743947420/", + "https://www.googleadservices.com/pagead/conversion/860889509/", + "https://www.googleadservices.com/ccm/conversion/860889509/", + "https://www.hj.contentsquare.com/_next/static/css/83465d57d795afb9.css", + "https://www.hj.contentsquare.com/_next/static/chunks/c78d26b1-f23f81ca8a2508b9.js", + "https://www.hj.contentsquare.com/_next/static/chunks/8847-6a9d34edb742e6b5.js", + "https://www.hj.contentsquare.com/_next/static/chunks/2665-d206e42ae94c9ee0.js", + "https://www.hj.contentsquare.com/_next/static/chunks/1278-7684c647ed111794.js", + "https://www.hj.contentsquare.com/_next/static/chunks/4248-d1a490e36324bbff.js", + "https://www.hj.contentsquare.com/_next/static/chunks/2779.53478be2293efd41.js", + "https://www.hj.contentsquare.com/_next/static/chunks/6376-a685b6ae0774407d.js", + "https://www.hj.contentsquare.com/_next/static/chunks/4813-11774f7c76799b23.js", + "https://www.hj.contentsquare.com/_next/static/chunks/326-f91031f230e1b41a.js", + "https://www.hj.contentsquare.com/_next/static/chunks/__federation_expose_page.84f81df8928e2c54.js", + "https://www.hj.contentsquare.com/_next/static/chunks/framework.5566999d9841ed98.js", + "https://eu.api.fpjs.io/DwmA/JNZ1Dz7/7", + "https://621-gdx-025.mktoresp.com/webevents/visitWebPage", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://jukebox.pathfactory.com/api/public/v1/init", + "https://aplo-evnt.com/api/v1/intent_pixel/track_request", + "https://c.contentsquare.net/pageview", + "https://k-aeu1.contentsquare.net/v2/recording", + "https://c.contentsquare.net/dvar", + "https://eu.api.fpjs.io/", + "https://www.google.com/pagead/1p-user-list/875542137/", + "https://www.google.com/pagead/1p-user-list/11181674455/", + "https://www.google.com/pagead/1p-user-list/711849444/", + "https://www.google.com/pagead/1p-user-list/860889431/", + "https://www.google.com/pagead/1p-user-list/11117300980/", + "https://www.google.com/pagead/1p-user-list/728949689/", + "https://app.clearbit.com/v1/p", + "https://contentsquare.com/favicons/favicon.ico", + "https://tags.srv.stackadapt.com/sa.css", + "https://tags.srv.stackadapt.com/sa.jpeg", + "https://pixel-config.reddit.com/pixels/a2_fvo9jaw3lsqm/config", + "https://alb.reddit.com/rp", + "https://tags.srv.stackadapt.com/saq_pxl", + "https://srm.ba.contentsquare.net/exist", + "https://bzrcdn.openai.com/pixel-config/v1/2HEoaoQXoydkkPuRSEMsxS.json", + "https://bat.bing.com/action/0", + "https://px.ads.linkedin.com/wa/", + "https://px.ads.linkedin.com/collect", + "https://bzr.openai.com/v1/sdk/events", + "https://c.us.heap-api.com/api/capture/v2/add_user_properties", + "https://c.us.heap-api.com/api/capture/v2/track", + "https://heapanalytics.com/api/telemetry" + ], + "stylesheets": [ + "/_next/static/css/97bcc08b937f3013.css", + "https://www.hj.contentsquare.com/_next/static/chunks/../../static/css/83465d57d795afb9.css", + "https://tags.srv.stackadapt.com/sa.css" + ], + "cookies": [ + "pscd", + "OptanonConsent", + "_gcl_au", + "_mkto_trk", + "_ga_TYEHV2JXFT", + "_ga", + "_cs_c", + "_cs_cvars", + "_cs_id", + "_cs_s_ctx", + "_cs_s", + "_ga_EWEKEX2PFL", + "cb_user_id", + "cb_group_id", + "cb_anonymous_id", + "_hjHasCachedUserAttributes", + "sa-user-id", + "sa-user-id-v2", + "sa-user-id-v3", + "sa-user-id-v4", + "_rdt_uuid", + "__obref", + "_vid_t", + "_uetsid", + "_uetvid", + "_fbp", + "_hp5_let.236035469", + "_hp5_meta.236035469", + "_hp5_event_props.236035469", + "_rdt_pn" + ], + "metas": [ + "next-head-count=31" + ], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__FEDERATION__": { + "present": true + }, + "__NEXT_DATA__": { + "present": true + }, + "__VMOK__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "hj": { + "present": true + }, + "next": { + "present": true, + "version": "14.2.35" + }, + "parcelRequire": { + "present": true + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/www.intercom.com.json b/tests/corpus/www.intercom.com.json new file mode 100644 index 0000000..c9e4e52 --- /dev/null +++ b/tests/corpus/www.intercom.com.json @@ -0,0 +1,226 @@ +{ + "host": "www.intercom.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "intercom" + ] + }, + "snapshot": [ + "datadog:high", + "google-analytics:high", + "intercom:high", + "nextjs:high@16.3.2", + "react:high", + "sentry:high", + "tailwind:high", + "turbopack:high", + "vercel:high" + ], + "signals": { + "url": "https://www.intercom.com/", + "scripts": [ + "https://cdn.claydar.com/releases/latest/radar.min.js", + "https://www.redditstatic.com/ads/pixel.js", + "https://j.6sc.co/6si.min.js", + "//munchkin.marketo.net/165/munchkin.js", + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://tags.srv.stackadapt.com/events.js", + "https://connect.facebook.net/signals/config/938193196235407", + "https://connect.facebook.net/en_US/fbevents.js", + "https://www.googletagmanager.com/gtag/destination", + "https://bat.bing.com/bat.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://widget.intercom.io/widget/tx2p130c", + "https://vercel.intercom.com/_next/static/immutable/chunks/1r_tn8fkwyazo.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/1f1z4shu_wdgf.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/2u61pmwdv7-19.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/turbopack-3y4a8evu0qupq.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/3nen2hit3grjw.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0kgt0apvf6b1t.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/3zg090_b6cyj4.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/23z911ieel9ec.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/2jmykuk8e_3rf.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/1ybp7lm2te0tc.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/30h649pfan1go.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0td92t63y_0pg.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0njvl7aj8t1m8.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/3ktaqtwuemdxx.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/2c1_i52pol1bd.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/22v9wlrmteisq.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/1ehnx_2krpoma.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0hblm73lrkow3.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/14mi8wa69ipj2.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/2-c188aarg35v.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/1j309zjr9xeyt.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0uisfbfcm_w0g.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/2rm_v2prwakg9.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0cytnl2p0o4tv.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/3o1s70f9rvxhm.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/1n6cow7n1qa3b.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/20vutta8fyy9f.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/382c6k2cpcl49.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/29lhe2nffqkbs.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/3xomqnl2b6omh.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0gbqdz69tcut-.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/38guf1hivg7-h.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/10bh4vxcc4czm.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/0c0hxoamwjsbw.js", + "https://vercel.intercom.com/_next/static/immutable/chunks/00bse-var04ag.js", + "/_vercel/speed-insights/script.js", + "https://cdn.cookielaw.org/scripttemplates/202608.1.0/otBannerSdk.js", + "//munchkin.marketo.net/munchkin.js", + "https://bat.bing.com/p/action/25016221.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/10781331234/", + "https://vercel.intercom.com/_next/static/immutable/chunks/1ywwjn4qv15y3.js", + "https://380ce6d4f3e0.edge.sdk.awswaf.com/380ce6d4f3e0/393fd269fd99/challenge.js", + "https://www.googletagmanager.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "https://j.6sc.co/j/e6fcd9ea-d88b-4083-8001-4428cddb3c49.js", + "https://js.adsrvr.org/up_loader.1.1.0.js", + "https://www.influ2.com/tracker", + "https://static.claydar.com/init.v1.js", + "https://a.usbrowserspeed.com/cs", + "inline:#__radar__", + "inline:#_intercom_npm_loader", + "inline:#homepage-2026-schema", + "inline:#_R_", + "inline:#_next-ga-init", + "inline:#_next-ga", + "inline:#_next-gtm-init", + "inline:#_next-gtm", + "inline:#6senseWebTag", + "https://www.intercom.com/ims-image?dpl=dpl_2JULDAFxYqLLo7mJWv7G2JLzpLao", + "https://www.intercom.com/_next/static/immutable/media/Serrif_Light_subset-s.0xcw-beyjla6z.woff2", + "https://www.intercom.com/_next/static/immutable/media/Saans_Regular-s.0y32wrc-1quhd.woff2", + "https://www.intercom.com/_next/static/immutable/media/SaansMono_Regular-s.2_pi34rl7_j33.woff2", + "https://www.intercom.com/ims-image", + "https://www.intercom.com/intercom-marketing-site/favicons/favicon.ico", + "https://www.intercom.com/pricing", + "https://www.intercom.com/contact-sales", + "https://www.intercom.com/view-demos", + "https://www.intercom.com/", + "https://api-visitor-analytics.intercom.com/visitor_analytics/geo_location", + "https://380ce6d4f3e0.edge.sdk.awswaf.com/380ce6d4f3e0/393fd269fd99/mp_verify", + "https://www.intercom.com/_vercel/speed-insights/script.js", + "https://api-visitor-analytics.intercom.com/visitor_analytics/metrics", + "https://api-visitor-analytics.intercom.com/visitor_analytics/pageviews", + "https://browser-intake-datadoghq.com/api/v2/rum", + "https://cdn.cookielaw.org/consent/55010888-6c79-4079-aff1-5290d8958d6a/55010888-6c79-4079-aff1-5290d8958d6a.json", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://cdn.cookielaw.org/consent/55010888-6c79-4079-aff1-5290d8958d6a/019dd4c9-d3e8-7796-91ef-b553c68aacd4/en.json", + "https://munchkin.marketo.net/munchkin.js", + "https://analytics.o11.tech/1/e/tcs.dhj", + "https://cdn.cookielaw.org/scripttemplates/202608.1.0/assets/otFloatingRounded.json", + "https://cdn.cookielaw.org/scripttemplates/202608.1.0/assets/otCommonStyles.css", + "https://cdn.cookielaw.org/logos/static/ot_close.svg", + "https://insight.adsrvr.org/track/cei", + "https://t.influ2.com/p/vt/", + "https://t.influ2.com/u/", + "https://tags.srv.stackadapt.com/sa.css", + "https://tags.srv.stackadapt.com/sa.jpeg", + "https://380ce6d4f3e0.edge.sdk.awswaf.com/380ce6d4f3e0/393fd269fd99/telemetry", + "https://api-visitor-analytics.intercom.com/visitor_analytics/events", + "https://munchkin.marketo.net/165/munchkin.js", + "https://tags.srv.stackadapt.com/saq_pxl", + "https://analytics.o11.tech/a/ts_.htm", + "https://px.ads.linkedin.com/collect", + "https://ad.doubleclick.net/activity;src=15045323;type=lpvsc0;cat=monks0;rcb=0;ord=4726896513130;npa=0;auiddc=971706747.1790413303;u1=https%3A%2F%2Fwww.intercom.com%2F;u2=%2F;u3=undefined;u4=;u5=undefined;u6=undefined;u7=undefined;u8=undefined;u9=undefined;u10=undefined;gdid=dYWJhMj;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KFA;gtm=45fe69n1v9200561601z879446940za20gzb79446940zd79446940xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=3;tag_exp=115616986~115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413302_2IjdY01XJqSjwU6AbJ1GkihcUP9xNrQSgQ;~oref=https%3A%2F%2Fwww.intercom.com%2F", + "https://15045323.fls.doubleclick.net/activityi;src=15045323;type=lpvsc0;cat=monks0;rcb=0;ord=4726896513130;npa=0;auiddc=971706747.1790413303;u1=https%3A%2F%2Fwww.intercom.com%2F;u2=%2F;u3=undefined;u4=;u5=undefined;u6=undefined;u7=undefined;u8=undefined;u9=undefined;u10=undefined;gdid=dYWJhMj;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KFA;gtm=45fe69n1v9200561601z879446940za20gzb79446940zd79446940xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=2;tag_exp=115616986~115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413302_2IjdY01XJqSjwU6AbJ1GkihcUP9xNrQSgQ;_dc_test=1;~oref=https%3A%2F%2Fwww.intercom.com%2F", + "https://ad.doubleclick.net/activity;src=15045323;type=lpvsc0;cat=monks006;rcb=0;ord=1;num=5725379927965;npa=0;auiddc=971706747.1790413303;u1=https%3A%2F%2Fwww.intercom.com%2F;u2=%2F;u3=undefined;u5=undefined;u6=undefined;u7=undefined;u8=undefined;u9=undefined;u10=undefined;gdid=dYWJhMj;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KJA;gtm=45fe69n1v9200561601z879446940za20gzb79446940zd79446940xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=3;tag_exp=115616986~115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413302_1DRuqS5Bl39-9sH76QpJXWRbJTSaOuYbmw;~oref=https%3A%2F%2Fwww.intercom.com%2F", + "https://15045323.fls.doubleclick.net/activityi;src=15045323;type=lpvsc0;cat=monks006;rcb=0;ord=1;num=5725379927965;npa=0;auiddc=971706747.1790413303;u1=https%3A%2F%2Fwww.intercom.com%2F;u2=%2F;u3=undefined;u5=undefined;u6=undefined;u7=undefined;u8=undefined;u9=undefined;u10=undefined;gdid=dYWJhMj;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;frm=0;_tu=KJA;gtm=45fe69n1v9200561601z879446940za20gzb79446940zd79446940xeaxf1;gcd=13l3l3l3l1l1;dma=0;dc_fmt=2;tag_exp=115616986~115938465~115938469~118897920~118897930~120213116~120385422~120469145~120469153;epver=2;dc_random=1790413302_1DRuqS5Bl39-9sH76QpJXWRbJTSaOuYbmw;_dc_test=1;~oref=https%3A%2F%2Fwww.intercom.com%2F", + "https://www.google.com/rmkt/collect/10781331234/", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://px.ads.linkedin.com/wa/", + "https://bat.bing.com/action/0", + "https://258-clw-344.mktoresp.com/webevents/visitWebPage", + "https://c.6sc.co/", + "https://ipv6.6sc.co/", + "https://b.6sc.co/v1/beacon/img.gif", + "https://pixel-config.reddit.com/pixels/a2_g6fhx5zc3oju/config", + "https://alb.reddit.com/rp", + "https://www.google.com/pagead/1p-user-list/10781331234/", + "https://api.claydar.com/tracker/event", + "https://api.claydar.com/bp/c5KlU8PpRP/settings", + "https://epsilon.6sense.com/v3/company/details", + "https://api-visitor-analytics.intercom.com/visitor_analytics/6sense_data", + "https://insight.adsrvr.org/track/realtimeconversion" + ], + "stylesheets": [ + "https://tags.srv.stackadapt.com/sa.css" + ], + "cookies": [ + "gtm_id", + "experiment_assignments", + "_dd_s", + "pageview_id", + "OptanonConsent", + "sa-user-id", + "sa-user-id-v2", + "sa-user-id-v3", + "sa-user-id-v4", + "_gcl_au", + "_fbp", + "_uetsid", + "_uetvid", + "_mkto_trk", + "_gd_visitor", + "_gd_session", + "_rdt_uuid", + "_gd_svisitor", + "aws-waf-token" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[642497,[\\\"https://vercel.intercom.com/_next/static/immutable/chunks/3nen2hit3grjw." + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "DD_RUM": { + "present": true + }, + "Intercom": { + "present": true + }, + "__SENTRY__": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "gtag": { + "present": true + }, + "intercomSettings": { + "present": true + }, + "next": { + "present": true, + "version": "16.3.2" + } + } +} diff --git a/tests/corpus/www.netflix.com.json b/tests/corpus/www.netflix.com.json new file mode 100644 index 0000000..1fba1b9 --- /dev/null +++ b/tests/corpus/www.netflix.com.json @@ -0,0 +1,95 @@ +{ + "host": "www.netflix.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "webpack", + "emotion" + ] + }, + "snapshot": [ + "emotion:high", + "react:high", + "webpack:high" + ], + "signals": { + "url": "https://www.netflix.com/", + "scripts": [ + "https://www.gstatic.com/recaptcha/releases/kemdRjWFxNjgsGdhRslyEPwU/recaptcha__en.js", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/scripttemplates/otSDKStub.js", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/scripttemplates/202607.1.0/otBannerSdk.js", + "https://assets.nflxext.com/web/ffe/wp/ui/landingPages/nmhp/nmhpFrameworkClient.9a014d292430d2a34266.js", + "https://www.google.com/recaptcha/enterprise.js", + "https://occ.a.nflxso.net/genc/hawkins/5.29.0/font/netflix-sans-core-variable-full.woff2", + "https://occ.a.nflxso.net/genc/hawkins/5.29.0/font/netflix-sans-mono-variable-full.woff2", + "https://assets.nflxext.com/web/ffe/wp/@nf-web-ui/ui-shared/dist/less/signup/nmhp/nmhp.1afe2e52bff213979e1d.css", + "https://occ.a.nflxso.net/dnmt/api/v6/iL4oJVDYZ8KLSrJ6eG2OwtghbfQ/AAAAAdEhm1UzVexHjKqFOP9W6E2UVtkWFvL-vdxIEbTU81rsqNuPmDDy_dQvmQ85ath49JBruVV4aGQA3gY2Dl5SiqFf-AEwPAZBTNkW8FMxGXpDN2mHrf8KlRRiddj1P422ZW1eZkZNWLTd.svg", + "https://assets.nflxext.com/ffe/siteui/vlv3/4263c437-c678-4724-ad80-e3ba0dc8761e/web/US-en-20260921-TRIFECTA-perspective_3ba19b37-271f-4bc1-9c2b-1d21fd8ad26d_large.jpg", + "https://logs.netflix.com/log/wwwhead/cl/2", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/consent/87b6a5c0-0104-4e96-a291-092c11350111/87b6a5c0-0104-4e96-a291-092c11350111.json", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABURvOfNePjiok1oZ0-kndO-uYIxMODGFtfZXKD7lnEPS1vYx6Od7OA6XOlYGxT6Ndqo3Vsv2RRzTvyvPChMi-T91zLI20phGDbrKcTQDx0Bulqd_P06xrTjrdlBeHK5Jy3-7.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABW_6b8-mD7aaxTVLDSlAtOXQ6fB5kEFUudLmiGXscmfLahPb9EEx10da3TShTspUOj5bIeuOU_4ef1i7x9odmzZQDUPD1YmrUxTGDkbpzv71moN5hH09E0yIx28wMQmFvkec.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABSbzJ6NnBf6p7bSm2F_WIJsR94io_SwDrox_Ebc56UAvSfkRmuK5T50HJ9BIc2cZbUaZGpyrXQ4RIt4TzwQnpXePRG0hkFD_yRAiB_6nTcPqJrTPa2NJnLUTPXfMklER9Y-l.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABe1MiwM3CO7Cvo-N_h406Lh3WkH1-9Xj-ou6TDCVbpHAlwVGw6zngVYK1NhKDyI5mg--XrFyitRA1go3TkhFe7UVPT3QI7QIhBzCE3HXj67k7QddpwTCgwnLr3JpxPX8Uxy1.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABWxje2zWQBskeyW9xUIVCcuijGGuLx0mmrzCm2HCSYuE94WjkwT0EPx5fsj-sFk5pIkJMiszgAx9wqRea7UBopDQQl8-1ls4N7OZbNwmorICk_nTWQcj3Sas7RqsqE3lEHem.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABXh2b42NIWP9eEZRow3y3SgJTTItNbQg-Z46PMfzrj19MObGoqsr7VOJ2SiRM9e0IYQ97UYBoGAdES-vlikUKvSFQI6qUWdKU6w.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABQxjdY3-o2_HMGPNScx63Fh6MJUriV48oMXIV1HbP5EFuoPzSzj24paH4cP9mVN3YHh71oRS_5GfDV5I5Exl-Tv_DlRWSmE4JiofsQDkIrlT6b53N_vJD8lI7qjEUCsJCTRP.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABbaLoMsjJgbfjdTr3SNGPpzylvVWo3PjRy307_uRizBADiF2aJCiqQlExOSf1fx9nCMo6SeH843e-u6PKSDzWjmWX_q296iMZhJDw0vIt60GwgkRyvwirvZP7hDcheyI5WC4.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABQaZz6w4WN-xljuaOiyyPIV2iwoXVJyvgdJu-AvWezdhexhlDUNxIZmg8fk2m7ValjyQ563IfsRtuKYh5UhD6ovWtfNAVdNfkcc_2mKttwIg1F3H_6YFxWpRd6lS_F7mOorK.webp", + "https://occ-0-2433-2705.1.nflxso.net/dnm/api/v6/mAcAr9TxZIVbINe88xb3Teg5_OA/AAAABU1g7VUmR7qjRsB7sLXVN7mvzbdSN4XHcrRXxiVCdrGiZaybz4bKZ4r-Ky0cyL-enJL8a7bB4vvOj_fv7RqwjTeBLPy2y3AAXyfWQif2Bp0cwGUM8bpkxwBW9DnKwegJoOmm.webp", + "https://assets.nflxext.com/ffe/siteui/fonts/netflix-sans/v3/NetflixSans_W_Rg.woff2", + "https://assets.nflxext.com/ffe/siteui/fonts/netflix-sans/v3/NetflixSans_W_Md.woff2", + "https://assets.nflxext.com/ffe/siteui/fonts/netflix-sans/v3/NetflixSans_W_Bd.woff2", + "https://occ.a.nflxso.net/dnmt/api/v6/jXBzyCe8ipOg2XQkxoKMq9wr74g/AAAAAS5NZfs3pCk4oWdvbb1fwwdoCguB9kLbPUnvV47I4LuPif03URbj6Rp6G9DGhy1E4Kq9wzMi9OICr7bV-IGQyghcLsGIn0Z_L1f8LF4oFYG6gGHk2BgP0AuuQCdN9uYeIwYm4BSJjjxx00I6EIjzKsJr0xZjlFU.svg", + "https://occ.a.nflxso.net/dnmt/api/v6/jXBzyCe8ipOg2XQkxoKMq9wr74g/AAAAAQ3ruAVPmOuNfp9nFhU28YPY_V5TpbC8Njrd9c6Z1QBr_vqKMJSZ3SyXEl7jhi5EV1vTdVdQE_viqqS3uJ9-cCyI9K6IRtvX9Ef3YML84IfU-0JW4fJo5ce9C0F9e_O7o9xVnSNnHrM1OnkexBi9_N9DJ6CKpsm6.svg", + "https://occ.a.nflxso.net/dnmt/api/v6/jXBzyCe8ipOg2XQkxoKMq9wr74g/AAAAAbYBShwcZCgHAdRTyBC59odq9eDsEHwzLX8-j_cCWCWBfjnExjnm72SEWYd7j2lZMsGzDvPnbJZSoutoV5aPiurvSYCfHKuiQR8jIXYbiJdSt7GXwdR5WBbWnk8wz329nNGd2CQXyLTh4tmWRNW27Kzk.svg", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://logs.netflix.com/log/www/cl/2", + "https://www.netflix.com/log/www/1", + "https://www.netflix.com/graphql", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/consent/87b6a5c0-0104-4e96-a291-092c11350111/019ae4b5-d8fb-7693-90ba-7a61d24a8837/en.json", + "https://cookies-data.onetrust.io/cfw/cmp/v1/session", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/scripttemplates/202607.1.0/assets/otFlat.json", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/scripttemplates/202607.1.0/assets/v2/otPcTab.json", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/scripttemplates/202607.1.0/assets/otCommonStyles.css", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/consent/87b6a5c0-0104-4e96-a291-092c11350111/019ae4b5-d8fb-7693-90ba-7a61d24a8837/logos/static/ot_guard_logo.svg", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/consent/87b6a5c0-0104-4e96-a291-092c11350111/019ae4b5-d8fb-7693-90ba-7a61d24a8837/logos/dd6b162f-1a32-456a-9cfe-897231c7763c/4345ea78-053c-46d2-b11e-09adaef973dc/Netflix_Logo_PMS.png", + "https://help.nflxext.com/helpcenter/OneTrust/oneTrust_production_2026-08-21/consent/87b6a5c0-0104-4e96-a291-092c11350111/019ae4b5-d8fb-7693-90ba-7a61d24a8837/logos/static/powered_by_logo.svg", + "https://www.google.com/recaptcha/enterprise/anchor", + "https://ae.nflximg.net/monet/scripts/adtech_iframe_target_05.html", + "https://assets.nflxext.com/us/ffe/siteui/common/icons/nficon2023.ico" + ], + "stylesheets": [ + "https://assets.nflxext.com/web/ffe/wp/@nf-web-ui/ui-shared/dist/less/signup/nmhp/nmhp.1afe2e52bff213979e1d.css" + ], + "cookies": [ + "flwssn", + "nfvdid", + "netflix-sans-normal-3-loaded", + "netflix-sans-bold-3-loaded", + "OptanonConsent", + "_OT_sm" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "[data-emotion]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "webpackChunk": { + "present": true + } + } +} diff --git a/tests/corpus/www.notion.com.json b/tests/corpus/www.notion.com.json new file mode 100644 index 0000000..2d1e9b3 --- /dev/null +++ b/tests/corpus/www.notion.com.json @@ -0,0 +1,375 @@ +{ + "host": "www.notion.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "sentry" + ] + }, + "snapshot": [ + "google-analytics:high", + "nextjs:high@16.3.2", + "react:high", + "sentry:high", + "tailwind:low", + "turbopack:high" + ], + "signals": { + "url": "https://www.notion.com/", + "scripts": [ + "//munchkin.marketo.net/165/munchkin.js", + "https://snap.licdn.com/li.lms-analytics/insight.beta.min.js", + "https://connect.facebook.net/signals/config/499229960464487", + "https://connect.facebook.net/en_US/fbevents.js", + "https://d34r8q7sht0t9k.cloudfront.net/tag.js", + "https://static.ads-twitter.com/uwt.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://www.googletagmanager.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "/_next/static/chunks/0cz1d0mv5g_q7.js", + "/_next/static/chunks/1sv45seisbbno.js", + "/_next/static/chunks/1b3nfiocfmo6p.js", + "/_next/static/chunks/12uwx7p-q8e7k.js", + "/_next/static/chunks/26bket-bns1ig.js", + "/_next/static/chunks/44qzkz3a8d352.js", + "/_next/static/chunks/3imdvga9z6_xr.js", + "/_next/static/chunks/1hi_07q7ml945.js", + "/_next/static/chunks/1npuk78zeb-_y.js", + "/_next/static/chunks/0x_txra6w2gxu.js", + "/_next/static/chunks/1op4_w15r8zd6.js", + "/_next/static/chunks/00hm5g6xpowbb.js", + "/_next/static/chunks/2sqdl0wfrvf32.js", + "/_next/static/chunks/0kj0bt-22q08a.js", + "/_next/static/chunks/1d9ls4i7q8584.js", + "/_next/static/chunks/395ja9zuf4_rx.js", + "/_next/static/chunks/0yqu9fui977pb.js", + "/_next/static/chunks/1i7el3lamigdg.js", + "/_next/static/chunks/3msrlo2dn0w2r.js", + "/_next/static/chunks/1mvg86lnsjx-r.js", + "/_next/static/chunks/3v196uepotmmz.js", + "/_next/static/chunks/10x8di9xapcd5.js", + "/_next/static/chunks/3e8kea8rm16ss.js", + "/_next/static/chunks/0phcqls68_xfg.js", + "/_next/static/chunks/0-ypi90mzgn2p.js", + "/_next/static/chunks/3kqe7q7vtd4c0.js", + "/_next/static/chunks/0s-wks6kjyjbd.js", + "/_next/static/chunks/turbopack-32kmpvmjllz0r.js", + "/_next/static/chunks/2rsufwak101nf.js", + "/_next/static/chunks/2jayxj9huuzyu.js", + "/_next/static/chunks/3umahe417pe13.js", + "/_next/static/chunks/1lhig6yy7ib4w.js", + "/_next/static/chunks/1ncls3ggty__m.js", + "/_next/static/chunks/21369c8a24z_v.js", + "/_next/static/chunks/1q4v32_jma945.js", + "/_next/static/chunks/17r5r72h-4w1f.js", + "/_next/static/chunks/0s7wpvn1yvkv_.js", + "/_next/static/chunks/0urue1561j7ne.js", + "/_next/static/chunks/3eskx5ns41xvi.js", + "/_next/static/chunks/3wl-_005s-z47.js", + "/_next/static/chunks/3i74ai5ianrgq.js", + "/_next/static/chunks/39y37lhubfsha.js", + "/_next/static/chunks/2_0_8-d-62-hn.js", + "/_next/static/chunks/0p06z_9dr0g1f.js", + "/_next/static/chunks/1dwon01kjrc21.js", + "/_next/static/chunks/0pm3c7xtoz7qi.js", + "/_next/static/chunks/2167rp_lo3xs-.js", + "/_next/static/chunks/19cvvukgedpfj.js", + "/_next/static/chunks/1a-dfjkgh25-c.js", + "/_next/static/chunks/turbopack-04y3v3fpkc8m9.js", + "/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_buildManifest.js", + "/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_ssgManifest.js", + "/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_clientMiddlewareManifest.js", + "/_next/static/chunks/06-i4cyvsrspt.js", + "/_next/static/chunks/1uj1ts-fm20mj.js", + "/_next/static/chunks/1r85wdqlzcoip.js", + "/_next/static/chunks/17y83n3x1rc4z.js", + "/_next/static/chunks/0m34qy7ybbz60.js", + "/_vercel/speed-insights/script.js", + "/_next/static/chunks/2-8yass6f93_v.js", + "/_next/static/chunks/1o88pxkmh9bvf.js", + "/_next/static/chunks/0sx9lbc-bkxc7.js", + "/_next/static/chunks/18rk6nli-hcd9.js", + "/_next/static/chunks/2sc500r22glmp.js", + "/_next/static/chunks/0exl89qqr0-on.js", + "/_next/static/chunks/0holmz3ku0wiw.js", + "/_next/static/chunks/turbopack-2-bf7-7c96hor.js", + "https://www.notion.com/front-static/scripts/gtm/metadata-io-site-script.js", + "https://cdn.metadata.io/site-insights.js", + "https://munchkin.marketo.net/munchkin.js", + "https://ssl.pstatic.net/melona/libs/gfp-nac-module/synchronizer.js", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/10930095205/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695511889/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18195368920/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18009663456/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/16621958730/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18304253150/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18388395671/", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/18395639838/", + "/_next/static/chunks/3mukchbgnsyk6.js", + "https://transcend-cdn.com/cm/a36a42ad-3a71-444f-9e8a-b19950129dc6/airgap.js", + "https://accounts.google.com/gsi/client", + "https://app.tailorhq.ai/script/hEJ9QrOcTqmEEU2X2W8Ycw.js", + "//wcs.naver.net/wcslog.js", + "/front-static/fonts/NotionInter-Regular.woff2", + "/front-static/fonts/NotionInter-Medium.woff2", + "/front-static/fonts/NotionInter-Bold.woff2", + "/_next/static/chunks/2h40kuyvz4i5r.css", + "/_next/static/chunks/25ytp5cuoqnet.css", + "/_next/static/chunks/385pt_z9of3-d.css", + "/_next/static/chunks/3suwd3stara0h.css", + "/_next/static/chunks/2yq3svosqcca7.css", + "/_next/static/chunks/1dvkjbpbi165u.css", + "/_next/static/chunks/2ydmx5jsxqwaf.css", + "/_next/static/chunks/1fbcxq_e5iifm.css", + "/_next/static/chunks/0-mvk-66noz91.css", + "/_next/static/chunks/0yde6_xz4cb2_.css", + "/_next/static/chunks/1-4hsxfvte0ja.css", + "/_next/static/chunks/1cu0w3hhwctei.css", + "/_next/static/chunks/1pxisrj3v4216.css", + "/_next/static/chunks/0gukrbfew1whv.css", + "/_next/static/chunks/0mhaw-jsyk8xo.css", + "/_next/static/chunks/3inl3-vmttoxj.css", + "/_next/static/chunks/2tjicaenixfnu.css", + "https://images.ctfassets.net/spoqsaf9291f/6gu2Rybt4VdhS2GEEA99PO/ac0fedd553b2f541fde79cdda05271cc/OpenAI.svg", + "https://images.ctfassets.net/spoqsaf9291f/6T4QxYfpIzIbZgWUSa5Rb1/8c6cb40bbf2304f8486222d777314b83/Figma_Wordmark__Black_.svg", + "https://images.ctfassets.net/spoqsaf9291f/4KBpzIRuWO9Bkoho07RwHW/7e608b80b697431b92ffb144e545cf3c/Ramp.svg", + "https://images.ctfassets.net/spoqsaf9291f/5zvQQUAMUwmWaGbC9qhXpK/633c8d40bbbb2b42faec7ea3339788ff/cursor-logo-mono.svg", + "https://images.ctfassets.net/spoqsaf9291f/6NEhbP27yAbhvWdLKPHTFV/6978b1603c567d69f5fe7b4895b1d30f/Vercel.svg", + "https://images.ctfassets.net/spoqsaf9291f/27zUO0UMDpEBMwPKUUilFH/daba398de4e970fcda7a138ff09d480a/Nvidia.svg", + "https://images.ctfassets.net/spoqsaf9291f/1TZBxOqNgDNBTJUEkD9Rn2/95219318a8bc7198d69e3fe0190ea94c/Volvo_Spread_Word_Mark_2025_bl.svg", + "https://images.ctfassets.net/spoqsaf9291f/nyxHXSMqMnFKE3RD3tteN/fa4e6ab45c999ace2a528a45c5bfb812/Loreal-k.svg", + "https://images.ctfassets.net/spoqsaf9291f/7hER3ka9QgDiTjLh5Fh3ZZ/acda79bc2449edf5d964a3fc89e19623/Discord-Logo-Black.svg", + "https://images.ctfassets.net/spoqsaf9291f/5noP5n1Gp9wULYfUEzujKv/49d56f55c09d72488606d57671e7d8c4/full-logo--black.svg", + "https://images.ctfassets.net/spoqsaf9291f/kelAN094ZCNSM1hzESs2C/71fdfc39756f757c95f984aa78fc1e82/1Password.svg", + "https://images.ctfassets.net/spoqsaf9291f/5GBjp1Q9QJDo8IJv0NqtNf/ba91a62e9525bccae6bffdb98bc3141b/Affirm.svg", + "https://images.ctfassets.net/spoqsaf9291f/3MimvlyRuaPCxQmBHpWRsr/b6808c6dca15c255e96ce2f85e2a6bc7/RiotGames.svg", + "https://images.ctfassets.net/spoqsaf9291f/4ljglPuQFOp4jC8kIacMa1/73c44685b85c73a717baac0329633d59/clay-mono-black.svg", + "https://images.ctfassets.net/spoqsaf9291f/14SNuPmXDPWdGE0I8TMeNL/6070db21d1b9f0e95c91e9ceb8b225e1/Remote-black.svg", + "https://images.ctfassets.net/spoqsaf9291f/2lvHXS3UJ5sJscJTW8GTpc/c22ac415979069ab3be881b2749e0d77/Faire_logo_-_black.svg", + "https://images.ctfassets.net/spoqsaf9291f/75O9653Z83boVzSMBMSY2D/4b36e928296e00612213aff4bdd369f2/toyota-black.svg", + "inline:#airgap-stub", + "inline:#tcf-stub", + "inline:#__NEXT_DATA__", + "inline:#google-tag-manager-script", + "inline:#google-tag-manager-script-init", + "https://www.notion.com/front-static/fonts/NotionInter-Regular.woff2", + "https://www.notion.com/front-static/fonts/NotionInter-Medium.woff2", + "https://www.notion.com/front-static/fonts/NotionInter-Bold.woff2", + "https://www.notion.com/_next/static/chunks/385pt_z9of3-d.css", + "https://www.notion.com/_next/static/chunks/3suwd3stara0h.css", + "https://www.notion.com/_next/static/chunks/25ytp5cuoqnet.css", + "https://www.notion.com/_next/static/chunks/2h40kuyvz4i5r.css", + "https://www.notion.com/_next/static/chunks/2yq3svosqcca7.css", + "https://www.notion.com/_next/static/chunks/1dvkjbpbi165u.css", + "https://www.notion.com/_next/static/chunks/1fbcxq_e5iifm.css", + "https://www.notion.com/_next/static/chunks/2ydmx5jsxqwaf.css", + "https://www.notion.com/_next/static/chunks/0-mvk-66noz91.css", + "https://www.notion.com/_next/static/chunks/0yde6_xz4cb2_.css", + "https://www.notion.com/_next/static/chunks/1pxisrj3v4216.css", + "https://www.notion.com/_next/static/chunks/1-4hsxfvte0ja.css", + "https://www.notion.com/_next/static/chunks/1cu0w3hhwctei.css", + "https://www.notion.com/_next/static/chunks/0gukrbfew1whv.css", + "https://www.notion.com/_next/static/chunks/3inl3-vmttoxj.css", + "https://www.notion.com/_next/static/chunks/0mhaw-jsyk8xo.css", + "https://www.notion.com/_next/static/chunks/2tjicaenixfnu.css", + "https://www.notion.com/_next/static/chunks/1sv45seisbbno.js", + "https://www.notion.com/_next/static/chunks/12uwx7p-q8e7k.js", + "https://www.notion.com/_next/static/chunks/1b3nfiocfmo6p.js", + "https://www.notion.com/_next/static/chunks/1npuk78zeb-_y.js", + "https://www.notion.com/_next/static/chunks/44qzkz3a8d352.js", + "https://www.notion.com/_next/static/chunks/26bket-bns1ig.js", + "https://www.notion.com/_next/static/chunks/3imdvga9z6_xr.js", + "https://www.notion.com/_next/static/chunks/1hi_07q7ml945.js", + "https://www.notion.com/_next/static/chunks/0x_txra6w2gxu.js", + "https://www.notion.com/_next/static/chunks/1op4_w15r8zd6.js", + "https://www.notion.com/_next/static/chunks/00hm5g6xpowbb.js", + "https://www.notion.com/_next/static/chunks/2sqdl0wfrvf32.js", + "https://www.notion.com/_next/static/chunks/0kj0bt-22q08a.js", + "https://www.notion.com/_next/static/chunks/395ja9zuf4_rx.js", + "https://www.notion.com/_next/static/chunks/1d9ls4i7q8584.js", + "https://www.notion.com/_next/static/chunks/0yqu9fui977pb.js", + "https://www.notion.com/_next/static/chunks/3msrlo2dn0w2r.js", + "https://www.notion.com/_next/static/chunks/1mvg86lnsjx-r.js", + "https://www.notion.com/_next/static/chunks/1i7el3lamigdg.js", + "https://www.notion.com/_next/static/chunks/3v196uepotmmz.js", + "https://www.notion.com/_next/static/chunks/10x8di9xapcd5.js", + "https://www.notion.com/_next/static/chunks/3e8kea8rm16ss.js", + "https://www.notion.com/_next/static/chunks/2rsufwak101nf.js", + "https://www.notion.com/_next/static/chunks/0-ypi90mzgn2p.js", + "https://www.notion.com/_next/static/chunks/turbopack-32kmpvmjllz0r.js", + "https://www.notion.com/_next/static/chunks/0s-wks6kjyjbd.js", + "https://www.notion.com/_next/static/chunks/0phcqls68_xfg.js", + "https://www.notion.com/_next/static/chunks/3kqe7q7vtd4c0.js", + "https://www.notion.com/_next/static/chunks/3umahe417pe13.js", + "https://www.notion.com/_next/static/chunks/1lhig6yy7ib4w.js", + "https://www.notion.com/_next/static/chunks/2jayxj9huuzyu.js", + "https://www.notion.com/_next/static/chunks/17r5r72h-4w1f.js", + "https://www.notion.com/_next/static/chunks/0s7wpvn1yvkv_.js", + "https://www.notion.com/_next/static/chunks/1ncls3ggty__m.js", + "https://www.notion.com/_next/static/chunks/21369c8a24z_v.js", + "https://www.notion.com/_next/static/chunks/1q4v32_jma945.js", + "https://www.notion.com/_next/static/chunks/0urue1561j7ne.js", + "https://www.notion.com/_next/static/chunks/2_0_8-d-62-hn.js", + "https://www.notion.com/_next/static/chunks/3wl-_005s-z47.js", + "https://www.notion.com/_next/static/chunks/3eskx5ns41xvi.js", + "https://www.notion.com/_next/static/chunks/3i74ai5ianrgq.js", + "https://www.notion.com/_next/static/chunks/39y37lhubfsha.js", + "https://www.notion.com/_next/static/chunks/0pm3c7xtoz7qi.js", + "https://www.notion.com/_next/static/chunks/0p06z_9dr0g1f.js", + "https://www.notion.com/_next/static/chunks/1dwon01kjrc21.js", + "https://www.notion.com/_next/static/chunks/2167rp_lo3xs-.js", + "https://www.notion.com/_next/static/chunks/1a-dfjkgh25-c.js", + "https://www.notion.com/_next/static/chunks/turbopack-04y3v3fpkc8m9.js", + "https://www.notion.com/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_buildManifest.js", + "https://www.notion.com/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_ssgManifest.js", + "https://www.notion.com/_next/static/chunks/19cvvukgedpfj.js", + "https://www.notion.com/_next/image", + "https://www.notion.com/_next/static/7f205aa9ab756c84effd15f798808c7a8fbf20e0/_clientMiddlewareManifest.js", + "https://videos.ctfassets.net/spoqsaf9291f/1EL7UZIXfcqngxsNSbL8tR/291f61f56f29dd8e788deaec8561d882/web-homepage-hero-1920x1200_final.mp4", + "https://www.notion.com/_next/static/media/LyonText-Regular-Web.0v5-4d-mnyixl.woff2", + "https://www.notion.com/front-static/fonts/NotionInter-SemiBold.woff2", + "https://www.notion.com/front-static/agents/tasks/checkWhite.svg", + "https://www.notion.com/front-static/agents/tasks/gmail.svg", + "https://www.notion.com/front-static/agents/tasks/hubspot.svg", + "https://www.notion.com/front-static/agents/tasks/github.svg", + "https://www.notion.com/front-static/agents/tasks/slack.svg", + "https://www.notion.com/front-static/agents/tasks/chartWhite.svg", + "https://www.notion.com/_next/static/chunks/12emxo5m3injh.css", + "https://www.notion.com/_next/static/chunks/06-i4cyvsrspt.js", + "https://www.notion.com/_next/static/chunks/2o3-ytfb0gn00.css", + "https://www.notion.com/_next/static/chunks/1uj1ts-fm20mj.js", + "https://www.notion.com/_next/static/chunks/1r85wdqlzcoip.js", + "https://www.notion.com/_next/static/chunks/17y83n3x1rc4z.js", + "https://www.notion.com/_next/static/chunks/0m34qy7ybbz60.js", + "https://www.notion.com/front-api/releases/latest-byline", + "https://www.notion.com/_vercel/speed-insights/script.js", + "https://www.notion.com/front-api/notifications/en-US", + "https://www.notion.com/_next/static/chunks/2-8yass6f93_v.js", + "https://http-inputs-notion.splunkcloud.com/services/collector/raw", + "https://exp.notion.com/v1/rgstr", + "https://exp.notion.com/v1/initialize", + "https://www.notion.com/_next/static/chunks/3mukchbgnsyk6.js", + "https://o324374.ingest.sentry.io/api/4506742283763712/envelope/", + "https://www.notion.com/front-static/favicon.ico", + "https://www.notion.com/_next/static/chunks/1o88pxkmh9bvf.js", + "https://www.notion.com/_next/static/chunks/0sx9lbc-bkxc7.js", + "https://www.notion.com/_next/static/chunks/18rk6nli-hcd9.js", + "https://www.notion.com/_next/static/chunks/2sc500r22glmp.js", + "https://www.notion.com/_next/static/chunks/0exl89qqr0-on.js", + "https://www.notion.com/_next/static/chunks/0holmz3ku0wiw.js", + "https://www.notion.com/_next/static/chunks/1jz8jnpmch-q4.css", + "https://www.notion.com/_next/static/chunks/turbopack-2-bf7-7c96hor.js", + "https://transcend-cdn.com/cm/a36a42ad-3a71-444f-9e8a-b19950129dc6/ui.js", + "https://www.notion.com/front-static/external/transcend/transcend.css", + "https://transcend-cdn.com/cm/a36a42ad-3a71-444f-9e8a-b19950129dc6/translations/en.json", + "https://app.notion.com/api/v3/generateOnetapNonce", + "https://wcs.naver.net/wcslog.js", + "https://www.googletagmanager.com/td", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://trkn.us/pixel/c", + "https://accounts.google.com/gsi/style", + "https://wcs.naver.com/b", + "https://t.co/1/i/adsct", + "https://analytics.twitter.com/1/i/adsct", + "https://ipv4.pdscrb.com/", + "https://cdn.metadata.io/pixel/config/1127.json", + "https://munchkin.marketo.net/165/munchkin.js", + "https://cdn.metadata.io/pixel/config/default.json", + "https://cached-api.tailorhq.ai/t/", + "https://verifi.pdscrb.com/tag", + "https://www.google.com/rmkt/collect/10930095205/", + "https://www.google.com/rmkt/collect/695511889/", + "https://www.google.com/rmkt/collect/18195368920/", + "https://www.google.com/rmkt/collect/18009663456/", + "https://www.google.com/rmkt/collect/16621958730/", + "https://nam.veta.naver.com/nac/2", + "https://analytics.google.com/g/collect", + "https://www.google.com/rmkt/collect/18304253150/", + "https://www.google.com/rmkt/collect/18388395671/", + "https://www.google.com/rmkt/collect/18395639838/", + "https://414-xmy-838.mktoresp.com/webevents/visitWebPage", + "https://px.ads.linkedin.com/collect", + "https://www.google.com/pagead/1p-user-list/10930095205/", + "https://www.google.com/pagead/1p-user-list/695511889/", + "https://www.google.com/pagead/1p-user-list/18195368920/", + "https://www.google.com/pagead/1p-user-list/18009663456/", + "https://www.google.com/pagead/1p-user-list/16621958730/", + "https://www.google.com/pagead/1p-user-list/18304253150/", + "https://www.google.com/pagead/1p-user-list/18388395671/", + "https://www.google.com/pagead/1p-user-list/18395639838/", + "https://px.ads.linkedin.com/wa/", + "https://app.notion.com/api/v3/etClient" + ], + "stylesheets": [ + "/_next/static/chunks/2h40kuyvz4i5r.css", + "/_next/static/chunks/25ytp5cuoqnet.css", + "/_next/static/chunks/385pt_z9of3-d.css", + "/_next/static/chunks/3suwd3stara0h.css", + "/_next/static/chunks/2yq3svosqcca7.css", + "/_next/static/chunks/1dvkjbpbi165u.css", + "/_next/static/chunks/2ydmx5jsxqwaf.css", + "/_next/static/chunks/1fbcxq_e5iifm.css", + "/_next/static/chunks/0-mvk-66noz91.css", + "/_next/static/chunks/0yde6_xz4cb2_.css", + "/_next/static/chunks/1-4hsxfvte0ja.css", + "/_next/static/chunks/1cu0w3hhwctei.css", + "/_next/static/chunks/1pxisrj3v4216.css", + "/_next/static/chunks/0gukrbfew1whv.css", + "/_next/static/chunks/0mhaw-jsyk8xo.css", + "/_next/static/chunks/3inl3-vmttoxj.css", + "/_next/static/chunks/2tjicaenixfnu.css", + "/_next/static/chunks/12emxo5m3injh.css", + "/_next/static/chunks/2o3-ytfb0gn00.css", + "/_next/static/chunks/1jz8jnpmch-q4.css", + "https://accounts.google.com/gsi/style" + ], + "cookies": [ + "notion_browser_id", + "notion_check_cookie_consent", + "_gcl_au", + "g_state", + "Metadata_visitor_id", + "Metadata_session_id", + "_ga", + "_ga_9ZJ8CB186L", + "_mkto_trk", + "_fbp" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "script#__NEXT_DATA__", + "#__next", + "next-route-announcer", + "tailwind-utilities" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__NEXT_DATA__": { + "present": true + }, + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "next": { + "present": true, + "version": "16.3.2" + } + } +} diff --git a/tests/corpus/www.onlyfrontendjobs.com.json b/tests/corpus/www.onlyfrontendjobs.com.json new file mode 100644 index 0000000..21b66e9 --- /dev/null +++ b/tests/corpus/www.onlyfrontendjobs.com.json @@ -0,0 +1,198 @@ +{ + "host": "www.onlyfrontendjobs.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "nextjs", + "react", + "tailwind", + "sentry" + ] + }, + "snapshot": [ + "nextjs:high@16.3.0", + "posthog:high", + "react:high", + "sentry:high", + "tailwind:high", + "turbopack:high" + ], + "signals": { + "url": "https://www.onlyfrontendjobs.com/", + "scripts": [ + "/_next/static/immutable/chunks/2ftp6x_z1yelw.js", + "/_next/static/immutable/chunks/00sl0xxcm-ny8.js", + "/_next/static/immutable/chunks/3tnnfda8m41t4.js", + "/_next/static/immutable/chunks/turbopack-01ens0muov82r.js", + "/_next/static/immutable/chunks/3gg_v07pdn0uw.js", + "/_next/static/immutable/chunks/0wvm6dlbb_aoi.js", + "/_next/static/immutable/chunks/3fn_iqf40wt-l.js", + "/_next/static/immutable/chunks/39w33hr9rxb1h.js", + "/_next/static/immutable/chunks/120zh7yhfz9w1.js", + "/_next/static/immutable/chunks/2ohvwi7md6mie.js", + "/_next/static/immutable/chunks/1k1_3-e8gd4k5.js", + "/_next/static/immutable/chunks/37u2xbpa6mvnh.js", + "/_next/static/immutable/chunks/18khs3yb19kol.js", + "/_next/static/immutable/chunks/1awutnu9yuj68.js", + "/_next/static/immutable/chunks/43kvimo52-jfe.js", + "/_next/static/immutable/chunks/2au7mr_3yfa68.js", + "/_next/static/immutable/chunks/1y-tv9j6nohb4.js", + "/_next/static/immutable/chunks/0h2yprt0c8x-_.js", + "/_next/static/immutable/chunks/0b334k9ohvs8j.js", + "/_next/static/immutable/chunks/40dtg4f3i_jq7.js", + "/_next/static/immutable/chunks/3je88xgc76e1b.js", + "/_next/static/immutable/chunks/3uvijh02fkypp.js", + "/_next/static/immutable/chunks/2e6k0ruppcadv.js", + "/_next/static/immutable/chunks/1p2abed5nr_i_.js", + "/_next/static/immutable/chunks/2jv_jt5n30x3m.js", + "/_next/static/immutable/chunks/0c0hxoamwjsbw.js", + "/_next/static/immutable/chunks/01mk64gq8scf5.js", + "/_next/static/immutable/chunks/3mt1j-n_4x3p1.js", + "/_next/static/immutable/chunks/3_zjl6fyuytxi.js", + "/_next/static/immutable/chunks/40la-cfi41zk7.js", + "/_next/static/immutable/chunks/282-7tz4id2fn.js", + "/_next/static/immutable/chunks/43_rf6mrb4r7e.js", + "/_next/static/immutable/chunks/14yga7kiifbam.js", + "/_next/static/immutable/chunks/3gf7k6qn4ulme.js", + "/_next/static/immutable/chunks/3kt1c1bpz4ooq.js", + "/_next/static/immutable/chunks/2qcnhajj41o4s.js", + "/_next/static/immutable/chunks/3bnhous6jmlha.js", + "/_next/static/immutable/chunks/3r1ckjf4payxu.js", + "/_next/static/immutable/chunks/0vv5jno2_3yv4.js", + "/_next/static/immutable/chunks/0nxfudb1r2o0n.js", + "/_next/static/immutable/chunks/2alk9xbb-f-qw.js", + "/_next/static/immutable/chunks/2slh48f_2vt3k.js", + "/_next/static/immutable/chunks/1bk9u0umev_mj.js", + "/_next/static/immutable/chunks/1xey081bq2tuv.js", + "/_next/static/immutable/chunks/12fb59ku8oinc.js", + "/_next/static/immutable/chunks/0p0t2zs579hce.js", + "/_next/static/immutable/chunks/3xdvvsxc2-f87.js", + "/_next/static/immutable/chunks/0_3x7zw1104nt.js", + "/_next/static/immutable/chunks/0ph15r6eaodsu.js", + "/_next/static/immutable/chunks/3dok1xxj3yr4q.js", + "/_next/static/immutable/chunks/00dr_96sbrrje.js", + "/_next/static/immutable/chunks/0sy1faw_t4_bz.js", + "https://accounts.google.com/gsi/client", + "/_next/static/immutable/media/caa3a2e1cccd8315-s.p.0zr6hhvz-h9nw.woff2", + "inline:#_R_", + "https://www.onlyfrontendjobs.com/_next/static/immutable/media/caa3a2e1cccd8315-s.p.0zr6hhvz-h9nw.woff2", + "https://www.onlyfrontendjobs.com/_next/image", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2t30e4v1arfkp.css", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3y6gpkgvfe2yk.css", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0sy1faw_t4_bz.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2ftp6x_z1yelw.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/turbopack-01ens0muov82r.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3gg_v07pdn0uw.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0wvm6dlbb_aoi.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/00sl0xxcm-ny8.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3tnnfda8m41t4.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3fn_iqf40wt-l.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/120zh7yhfz9w1.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2ohvwi7md6mie.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/39w33hr9rxb1h.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1k1_3-e8gd4k5.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/37u2xbpa6mvnh.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/18khs3yb19kol.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1y-tv9j6nohb4.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/43kvimo52-jfe.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1awutnu9yuj68.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2au7mr_3yfa68.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0b334k9ohvs8j.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0h2yprt0c8x-_.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3uvijh02fkypp.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/40dtg4f3i_jq7.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3je88xgc76e1b.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2e6k0ruppcadv.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1p2abed5nr_i_.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2jv_jt5n30x3m.js", + "https://www.onlyfrontendjobs.com/site.webmanifest", + "https://www.onlyfrontendjobs.com/favicon.svg", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/01mk64gq8scf5.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3mt1j-n_4x3p1.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3_zjl6fyuytxi.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/40la-cfi41zk7.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/282-7tz4id2fn.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/43_rf6mrb4r7e.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/14yga7kiifbam.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3gf7k6qn4ulme.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3kt1c1bpz4ooq.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2qcnhajj41o4s.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3bnhous6jmlha.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3r1ckjf4payxu.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0vv5jno2_3yv4.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0nxfudb1r2o0n.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2alk9xbb-f-qw.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/2slh48f_2vt3k.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1bk9u0umev_mj.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/1xey081bq2tuv.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/12fb59ku8oinc.js", + "https://www.onlyfrontendjobs.com/jobs", + "https://www.onlyfrontendjobs.com/insider-frontend-jobs", + "https://www.onlyfrontendjobs.com/api/version", + "https://www.onlyfrontendjobs.com/api/jobs", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0p0t2zs579hce.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3xdvvsxc2-f87.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0_3x7zw1104nt.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/0ph15r6eaodsu.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/3dok1xxj3yr4q.js", + "https://www.onlyfrontendjobs.com/_next/static/immutable/chunks/00dr_96sbrrje.js", + "https://accounts.google.com/gsi/style" + ], + "stylesheets": [ + "/_next/static/immutable/chunks/2t30e4v1arfkp.css", + "/_next/static/immutable/chunks/3y6gpkgvfe2yk.css", + "https://accounts.google.com/gsi/style" + ], + "cookies": [ + "g_state" + ], + "metas": [], + "inlineSamples": [ + "(self.__next_f=self.__next_f||[]).push([0])", + "self.__next_f.push([1,\"1:I[264920,[\\\"/_next/static/immutable/chunks/3gg_v07pdn0uw.js\\\",\\\"/_next/static/immutable/chunks/0wvm6dlbb_aoi", + "self.__next_f.push([1,\"23:I[49161,[\\\"/_next/static/immutable/chunks/3gg_v07pdn0uw.js\\\",\\\"/_next/static/immutable/chunks/0wvm6dlbb_aoi", + "self.__next_f.push([1,\"26:I[513356,[\\\"/_next/static/immutable/chunks/3gg_v07pdn0uw.js\\\",\\\"/_next/static/immutable/chunks/0wvm6dlbb_ao", + "self.__next_f.push([1,\"2f:I[895024,[\\\"/_next/static/immutable/chunks/3gg_v07pdn0uw.js\\\",\\\"/_next/static/immutable/chunks/0wvm6dlbb_ao", + "self.__next_f.push([1,\"31:[\\\"$\\\",\\\"path\\\",\\\"1ays0h\\\",{\\\"d\\\":\\\"M5 12h14\\\"}]\\n32:[\\\"$\\\",\\\"path\\\",\\\"xquz4c\\\",{\\\"d\\\":\\\"m12 5 7 7-7 7\\\"}]\\", + "self.__next_f.push([1,\"3b:[\\\"$\\\",\\\"span\\\",null,{\\\"className\\\":\\\"text-sm font-semibold text-foreground/90 group-hover:text-foreground ", + "self.__next_f.push([1,\"4d:[\\\"$\\\",\\\"span\\\",null,{\\\"className\\\":\\\"text-sm font-semibold text-foreground/90 group-hover:text-foreground ", + "self.__next_f.push([1,\"33:[\\\"$\\\",\\\"section\\\",null,{\\\"ref\\\":\\\"$undefined\\\",\\\"className\\\":\\\"w-full py-8 md:py-12 bg-background\\\",\\\"chil", + "self.__next_f.push([1,\"4e:[\\\"$\\\",\\\"span\\\",null,{\\\"className\\\":\\\"text-xs text-foreground group-hover:text-muted-foreground transition-", + "self.__next_f.push([1,\"56:[\\\"$\\\",\\\"$L2f\\\",\\\"/gurgaon-frontend-jobs\\\",{\\\"prefetch\\\":false,\\\"href\\\":\\\"/gurgaon-frontend-jobs\\\",\\\"classN" + ], + "domFlags": [ + "next-route-announcer", + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__next_f": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__turbopack": { + "present": true + }, + "next": { + "present": true, + "version": "16.3.0" + }, + "posthog": { + "present": true + } + } +} diff --git a/tests/corpus/www.reddit.com.json b/tests/corpus/www.reddit.com.json new file mode 100644 index 0000000..b1e5ab2 --- /dev/null +++ b/tests/corpus/www.reddit.com.json @@ -0,0 +1,29 @@ +{ + "host": "www.reddit.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": {}, + "snapshot": [ + "tailwind:medium" + ], + "signals": { + "url": "https://www.reddit.com/", + "scripts": [ + "https://www.reddit.com/favicon.ico" + ], + "stylesheets": [], + "cookies": [ + "edgebucket" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "tailwind-syntax", + "tailwind-utilities" + ], + "globals": {}, + "pass": "light" + }, + "globals": {} +} diff --git a/tests/corpus/www.shopify.com.json b/tests/corpus/www.shopify.com.json new file mode 100644 index 0000000..bb8a438 --- /dev/null +++ b/tests/corpus/www.shopify.com.json @@ -0,0 +1,149 @@ +{ + "host": "www.shopify.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "shopify" + ] + }, + "snapshot": [ + "google-analytics:high", + "react-router:high@7.18.2", + "react:high", + "shopify:high", + "tailwind:high" + ], + "signals": { + "url": "https://www.shopify.com/", + "scripts": [ + "https://snap.licdn.com/li.lms-analytics/insight.old.min.js", + "https://connect.facebook.net/signals/config/1904241839800487", + "https://connect.facebook.net/signals/config/1298671233649970", + "https://connect.facebook.net/en_US/fbevents.js", + "https://snap.licdn.com/li.lms-analytics/insight.min.js", + "https://gtm.shopify.com/gtag/js", + "https://www.googletagmanager.com/gtm.js", + "https://gtm.shopify.com/gtm.js", + "https://cdn.shopify.com/b/shopify-brochure2-assets/7ecd57f2fa3d7b997d29181a62c954ee.png", + "https://cdn.shopify.com/b/shopify-brochure2-assets/b2ba26f35a9189c443bbbd74242e6b0e.woff2", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/AgenticSection-DQdI9fII.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/LocalAndGlobalSection-IhaAXew8.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/formatCurrency-BUCVkRaH.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/useCurrentBreakpoint-CCsv83ql.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/SidekickSection-D-0i0CGG.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/AppsSection-Dr5H3MOH.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/DevSection-tXO_voyR.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/RockSteadySection-N4bvTeEX.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/CapitalSection-DGVrgOaj.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/LanguageSelectorImpl-CHB_K90p.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Typography-BXcQlNZ3.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Global-dSN4c9_P.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Close-JghXqPFb.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Arrow-B0ZCJdI8.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/ActiveConsentCompact-EUCRPRS5-C1NhIbUX.js", + "https://cdn.shopify.com/b/shopify-brochure2-assets/d9340911ca8c679b148dd4a205ad2ffa.svg", + "https://cdn.shopify.com/b/shopify-brochure2-assets/07baf8219532d81f6d6725151f9e3482.png", + "https://cdn.shopify.com/b/shopify-brochure2-assets/89c9725d301503b2de05c561eb773134.png", + "https://cdn.shopify.com/b/shopify-brochure2-assets/ecabe88f01662a8048799d22f2c6aa99.svg", + "https://cdn.shopify.com/b/shopify-brochure2-assets/095b0536eb3a264c83761008f47aecbd.png", + "https://cdn.shopify.com/b/shopify-brochure2-assets/bed4594e2c394553b2f03d9da43cb685.png", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/entry.client-DKNOCwou.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/react-dom-CaAuFBL-.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/chunk-62JRHF6Z-D3Q3NlnB.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/jsx-runtime-Cvx0fZjB.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/root-qhPZXoGY.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/documentInlineStylesheet-D3gcTLE2.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/I18N-B1o2bAPg.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Wrapper-DfihFqv3.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/layout-DxAHvh5V.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Provider-ijaylRGR.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/utils-CzNcCjKH.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/route-KEjPH5HM.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/debounce-DbmC1YDx.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/embla-carousel-react.esm-Da7cRkdb.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Message-B_qMqkGv.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Image-BmxNu-Rt.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/useFocusTrap-DZ9FFcBk.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/getLogoSrc-CdTS7Pll.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/useIntersectionObserver-BJKJFJod.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/HeadingGroup-vf4ICXr7.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Button-Gpf8BoLX.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Close-B_yVuI9E.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Card-CgTki_6f.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/useAriaLabel-vxZPGsys.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/InlineVideo-nZs4-DSy.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/utils-DMM2D35p.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/InlineVideoIOWrapper-DsBaRBvl.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Pause-Ciw0WiAj.js", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/Play-C5OJT5nR.js", + "https://cdn.shopify.com/b/shopify-brochure2-assets/61cc781fe73f11e9d4bd160d27cc627b.png", + "https://www.shopify.com/.well-known/dux", + "https://cdn.shopify.com/shopifycloud/world/brochure/production-homepage/assets/content-RTIKRMHG-DHjMRWN6.js", + "https://cdn.shopify.com/b/shopify-brochure2-assets/67e4b3ae607f6a12adb615c0ec0af3b4.jpg", + "https://cdn.shopify.com/b/shopify-brochure2-assets/a011f79527438e06c77694dc9e48f9b2.jpg", + "https://cdn.shopify.com/b/shopify-brochure2-assets/4f34cdb8ec9c120b80b8be143d0791d7.jpg", + "https://www.google.com/ccm/collect", + "https://ad.doubleclick.net/ccm/s/collect", + "https://px.ads.linkedin.com/wa/", + "https://px.ads.linkedin.com/collect", + "https://gtm.shopify.com/g/collect", + "https://gtm3.shopify.com/logging", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=518492415;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;u6=component_viewability;u7=main%7Chero;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t43;~oref=https%3A%2F%2Fwww.shopify.com%2F", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=1432267859;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;u6=component_viewability;u7=main%7Chero;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117549813~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t33;~oref=https%3A%2F%2Fwww.shopify.com%2F", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=1732611492;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;u6=component_viewability;u7=main%7Chero;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t14;~oref=https%3A%2F%2Fwww.shopify.com%2F", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=254754213;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;u6=component_viewability;u7=main%7Chero;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117215459~117549813~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t52;~oref=https%3A%2F%2Fwww.shopify.com%2F", + "https://cdn.shopify.com/b/shopify-brochure2-assets/524da6f828b5a55d571fafa1607b907f.webm", + "https://www.google.com/rmkt/collect/974897256/", + "https://www.google.com/measurement/conversion/", + "https://gtm.shopify.com/_/set_cookie", + "https://analytics.google.com/g/s/collect", + "https://googleads.g.doubleclick.net/pagead/viewthroughconversion/974897256/", + "https://stats.g.doubleclick.net/g/collect", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=1578652229;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117215456~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t2;~oref=https%3A%2F%2Fwww.shopify.com%2F", + "https://c.bing.com/c.gif", + "https://ad.doubleclick.net/activity;src=9321158;type=shopi0;cat=shopi0;ord=922938393;gtm=45h91e69m1v877474166z89102563954z9862613069za20kzb9102563954zd9102563954xf3xg4;dc_pre=1;u6=component_viewability;u7=main%7Chero;match_id=7bf91c1b-5f4a-4e29-b180-d748ff3db632;rcb=18;dma=0;npa=0;gcs=G1--;gcd=13l3l3l3l5l1;uaa=x86;uab=64;uafvl=Chromium%3B151.0.7922.34%7CNot%253DA%253FBrand%3B99.0.0.0;uamb=0;uam=;uap=Linux;uapv=;uaw=0;pscdl=noapi;auiddc=1275368646.1790413173;em=tv.1;tag_exp=115938465~115938468~117215456~117549812~117549814~117776796~118897920~118897930~120213116~120385422~120469145~120469153~121280970;_tu=JA;gap.sstd=5;gap.gtb=2;s3p=1;_is_sw=f15s0t25;~oref=https%3A%2F%2Fwww.shopify.com%2F" + ], + "stylesheets": [], + "cookies": [ + "_shopify_essential_", + "_shopify_y", + "_shopify_s", + "_gcl_au", + "mto_pvs", + "li_fat_id_s", + "_ga", + "_ga_W6NECZNE63", + "_fbp", + "FPAU", + "FPGSID", + "FPLC" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "tailwind-syntax", + "tailwind-utilities", + "tailwind-vars" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__reactRouterDataRouter": { + "present": true + }, + "__reactRouterVersion": { + "present": true, + "version": "7.18.2" + } + } +} diff --git a/tests/corpus/www.spotify.com.json b/tests/corpus/www.spotify.com.json new file mode 100644 index 0000000..92231ba --- /dev/null +++ b/tests/corpus/www.spotify.com.json @@ -0,0 +1,228 @@ +{ + "host": "www.spotify.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "react", + "styled-components" + ] + }, + "snapshot": [ + "google-analytics:high", + "react-router:high@6", + "react:high", + "sentry:high", + "styled-components:high" + ], + "signals": { + "url": "https://open.spotify.com/", + "scripts": [ + "https://sb.scorecardresearch.com/c2/15654041/cs.js", + "https://www.googletagmanager.com/gtag/js", + "https://www.google-analytics.com/analytics.js", + "https://www.googletagmanager.com/gtm.js", + "https://www.gstatic.com/recaptcha/releases/kemdRjWFxNjgsGdhRslyEPwU/recaptcha__en.js", + "https://www.google.com/recaptcha/enterprise.js", + "https://open.spotifycdn.com/cdn/js/gtm.96d60fd6.js", + "https://open.spotifycdn.com/cdn/js/retargeting-pixels.02346b5d.js", + "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", + "//www.gstatic.com/cast/sdk/libs/sender/1.0/cast_framework.js", + "//www.gstatic.com/eureka/clank/151/cast_sender.js", + "https://cdn.cookielaw.org/scripttemplates/202601.2.0/otBannerSdk.js", + "https://open.spotifycdn.com/cdn/build/web-player/web-player.da8b87c8.js", + "https://open.spotifycdn.com/cdn/build/web-player/vendor~web-player.4ad2b3e0.js", + "https://open.spotifycdn.com/cdn/build/web-player/encore~web-player.12a0f55e.js", + "//www.gstatic.com/cv/js/sender/v1/cast_sender.js", + "https://www.fastly-insights.com/insights.js", + "https://encore.scdn.co/fonts/SpotifyMixUI-Regular-76c92fb1a35c462f73429fa8865163eb.woff2", + "https://encore.scdn.co/fonts/SpotifyMixMono-Regular-134eeb986fc0f94a9f0acb9cedaeb584.woff2", + "https://encore.scdn.co/fonts/SpotifyMixUITitleVariable-08bab3354d40f74e5177917b5ae80894.woff2", + "https://encore.scdn.co/fonts/SpotifyMixUI-Bold-09c45a3a0ce9d2971e62cb26e97760fb.woff2", + "https://open.spotifycdn.com/cdn/generated-locales/web-player/en.43e53d4f.json", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-page-error-template.b0add8d7.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-page-error-template.6b264de9.js", + "https://open.spotifycdn.com/cdn/build/web-player/407.c5a8c97d.js", + "https://open.spotifycdn.com/cdn/build/web-player/171.9e2bc092.js", + "https://open.spotifycdn.com/cdn/build/web-player/2877.4bce30e8.js", + "https://open.spotifycdn.com/cdn/build/web-player/7476.34912275.js", + "https://open.spotifycdn.com/cdn/build/web-player/6256.9257f0ac.js", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-search.973a0279.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-search.96d81afe.js", + "https://open.spotifycdn.com/cdn/build/web-player/2678.5092c47e.js", + "https://open.spotifycdn.com/cdn/build/web-player/4001.72e682fb.js", + "https://open.spotifycdn.com/cdn/build/web-player/1905.ccbaed8b.js", + "https://open.spotifycdn.com/cdn/build/web-player/home-ads-container.6eb21a7a.css", + "https://open.spotifycdn.com/cdn/build/web-player/home-ads-container.852dc0f5.js", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-offline-browse.9a1cff83.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-offline-browse.4daed058.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-offline-empty-state.94fc26bc.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-offline-empty-state.4a500025.js", + "inline:#appServerConfig", + "inline:#__CDN_FILE_URLS__", + "inline:#featureFlags", + "inline:#seoExperiments", + "inline:#remoteConfig", + "https://open.spotifycdn.com/cdn/build/web-player/web-player.4bde4ae5.css", + "https://open.spotifycdn.com/cdn/generated/manifest-web-player.1609946b.json", + "https://apresolve.spotify.com/", + "https://open.spotify.com/api/token", + "https://www.google.com/recaptcha/enterprise/anchor", + "https://o22381.ingest.sentry.io/api/114855/envelope/", + "https://gue1-spclient.spotify.com/remote-config-resolver/v3/unauth/configuration", + "https://clienttoken.spotify.com/v1/clienttoken", + "https://open.spotifycdn.com/cdn/build/web-player/workbox-window.d4b636a9.js", + "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js", + "https://spclient.wg.spotify.com/widevine-license/v1/application-certificate", + "https://gue1-spclient.spotify.com/gabo-receiver-service/public/v3/events", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-feedback-bar.648ea9a6.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-feedback-bar.8519d6d6.js", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-your-library-x.f7610fa4.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-your-library-x.d00b3141.js", + "https://open.spotifycdn.com/cdn/build/web-player/5834.5ec10375.js", + "https://open.spotifycdn.com/cdn/build/web-player/8460.ba8600d4.js", + "https://open.spotifycdn.com/cdn/build/web-player/9147.0653ab2f.js", + "https://open.spotifycdn.com/cdn/build/web-player/9712.92feb2ad.css", + "https://open.spotifycdn.com/cdn/build/web-player/9712.48f0cc2d.js", + "https://open.spotifycdn.com/cdn/build/web-player/1771.503c3413.js", + "https://open.spotifycdn.com/cdn/build/web-player/2525.af3666f8.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-now-playing-bar.66e30b59.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-now-playing-bar.a0e2ff1e.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-top-bar.b2e183f5.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-top-bar.2a439bc3.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-header.ad1ccea4.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-header.0d26eb03.js", + "https://open.spotifycdn.com/cdn/build/web-player/985.4ab98c6c.js", + "https://open.spotifycdn.com/cdn/build/web-player/1971.3b678f0a.js", + "https://open.spotifycdn.com/cdn/build/web-player/1584.d6866c47.js", + "https://open.spotifycdn.com/cdn/build/web-player/4700.60355240.css", + "https://open.spotifycdn.com/cdn/build/web-player/4700.733e2920.js", + "https://open.spotifycdn.com/cdn/build/web-player/252.7c9a559e.js", + "https://open.spotifycdn.com/cdn/build/web-player/2396.2b53d263.css", + "https://open.spotifycdn.com/cdn/build/web-player/2396.625372b6.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-chips-row.5f61784d.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-chips-row.1c9eddee.js", + "https://open.spotifycdn.com/cdn/build/web-player/home-v2.0b0f3630.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-video-player.85c381c9.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-video-player.972fc39b.js", + "https://open.spotifycdn.com/cdn/build/web-player/6494.a115c4c1.js", + "https://open.spotifycdn.com/cdn/build/web-player/3284.16e63d42.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-panel-section.206d784c.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-panel-section.218ea16c.js", + "https://open.spotifycdn.com/cdn/build/web-player/2306.a03561fb.js", + "https://open.spotifycdn.com/cdn/build/web-player/6664.65e0eed6.js", + "https://open.spotifycdn.com/cdn/build/web-player/1049.9b83acfa.js", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-root-dialogs.04edcd5c.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-root-dialogs.3ae3351b.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-watch-feed-view-container.ae2f6d52.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-watch-feed-view-container.47b4c1d2.js", + "https://www.gstatic.com/cast/sdk/libs/sender/1.0/cast_framework.js", + "https://www.gstatic.com/eureka/clank/151/cast_sender.js", + "https://cdn.cookielaw.org/consent/50da44be-0564-43df-b139-329aedcf267b/50da44be-0564-43df-b139-329aedcf267b.json", + "https://spclient.wg.spotify.com/library-import/v1/eligible", + "https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location", + "https://api-partner.spotify.com/pathfinder/v2/query", + "https://open.spotifycdn.com/cdn/build/web-player/listening-stats-modal.6b80239d.css", + "https://open.spotifycdn.com/cdn/build/web-player/listening-stats-modal.6962c519.js", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-user-comments.85b63e05.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-user-comments.cd53dd74.js", + "https://cdn.cookielaw.org/consent/50da44be-0564-43df-b139-329aedcf267b/019df341-54d8-70a0-989d-eced0feae4a3/en.json", + "https://cdn.cookielaw.org/scripttemplates/202601.2.0/assets/v2/otPcPanel.json", + "https://cdn.cookielaw.org/scripttemplates/202601.2.0/assets/otCommonStyles.css", + "https://sb.scorecardresearch.com/b", + "https://i.scdn.co/image/ab67616d00001e02ac9d5d5263e9f03802d6864c", + "https://i.scdn.co/image/ab67616d00001e024427c537ffaab6552c96abe8", + "https://i.scdn.co/image/ab67616d00001e02d7812467811a7da6e6a44902", + "https://i.scdn.co/image/ab67616d00001e02322b8ded39dc108536090089", + "https://i.scdn.co/image/ab6742d3000052b7d7e2970cd8ee3f7aaa2ddcc4", + "https://i.scdn.co/image/ab67616d00001e020bb214c1800ec1e4e497cf75", + "https://i.scdn.co/image/ab67616d00001e02c2452dcf7d9dbbff64574d27", + "https://i.scdn.co/image/ab67616d00001e0219e2462d9211bade93d05419", + "https://i.scdn.co/image/ab67616d00001e0255615e9242bd96706c68a743", + "https://i.scdn.co/image/ab6761610000517439ba6dcd4355c03de0b50918", + "https://i.scdn.co/image/ab676161000051744293385d324db8558179afd9", + "https://i.scdn.co/image/ab67616100005174c1719ac9e6a75c1c25835018", + "https://i.scdn.co/image/ab6761610000517498a9ee5f9cac5e3efa057f30", + "https://i.scdn.co/image/ab67616100005174e17c0aa1714a03d62b5ce4e0", + "https://i.scdn.co/image/ab67616100005174cb565a8e684e3be458d329ac", + "https://i.scdn.co/image/ab67616100005174aadc18cac8d48124357c38e6", + "https://i.scdn.co/image/ab676161000051744a21b4760d2ecb7b0dcdc8da", + "https://i.scdn.co/image/ab6761610000517412184bdd29403de54cb9d9c7", + "https://i.scdn.co/image/ab67616d00001e0235ea219ce47813b5e2dc3745", + "https://i.scdn.co/image/ab67616d00001e02bbd45c8d36e0e045ef640411", + "https://i.scdn.co/image/ab67616d00001e02f8e1043df4c08b991aaec9cf", + "https://i.scdn.co/image/ab67616d00001e0271d62ea7ea8a5be92d3c1f62", + "https://i.scdn.co/image/ab67616d00001e02e2a0a166493a2bde5480a420", + "https://i.scdn.co/image/ab67616d00001e02b5a28a256eae6dc0424fef59", + "https://i.scdn.co/image/ab67616d00001e026b219c8d8462bfe254a20469", + "https://i.scdn.co/image/ab67616d00001e02882265cd9bdded9ea9a153b9", + "https://i.scdn.co/image/ab67616d00001e02d72fb5571087bca0a2fed008", + "https://cdn.cookielaw.org/logos/static/ot_guard_logo.svg", + "https://cdn.cookielaw.org/logos/static/ot_company_logo.png", + "https://cdn.cookielaw.org/logos/static/powered_by_logo.svg", + "https://www.google-analytics.com/j/collect", + "https://www.google-analytics.com/g/collect", + "https://analytics.google.com/g/collect", + "https://stats.g.doubleclick.net/g/collect", + "https://www.spotify.com/api/masthead/v1/masthead", + "https://open.spotifycdn.com/cdn/images/favicon.0f31d2ea.ico", + "https://open.spotifycdn.com/cdn/images/icons/Spotify_256.17e41e58.png", + "https://gue1-spclient.spotify.com/gabo-receiver-service/v3/events" + ], + "stylesheets": [ + "https://open.spotifycdn.com/cdn/build/web-player/web-player.4bde4ae5.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-feedback-bar.648ea9a6.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-routes-your-library-x.f7610fa4.css", + "https://open.spotifycdn.com/cdn/build/web-player/9712.92feb2ad.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-now-playing-bar.66e30b59.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-top-bar.b2e183f5.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-header.ad1ccea4.css", + "https://open.spotifycdn.com/cdn/build/web-player/4700.60355240.css", + "https://open.spotifycdn.com/cdn/build/web-player/2396.2b53d263.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-home-chips-row.5f61784d.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-video-player.85c381c9.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-panel-section.206d784c.css", + "https://open.spotifycdn.com/cdn/build/web-player/xpui-root-dialogs.04edcd5c.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-watch-feed-view-container.ae2f6d52.css", + "https://open.spotifycdn.com/cdn/build/web-player/listening-stats-modal.6b80239d.css", + "https://open.spotifycdn.com/cdn/build/web-player/dwp-user-comments.85b63e05.css" + ], + "cookies": [ + "sp_t", + "sp_new", + "_cs_mk_ga", + "OptanonConsent", + "_gid", + "_gat_UA-5784146-31", + "_ga", + "_ga_ZWG1NSHWD8", + "_ga_BMC5VGR8YS" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [ + "[data-styled]" + ], + "globals": {}, + "pass": "light" + }, + "globals": { + "__SENTRY__": { + "present": true + }, + "__reactContainer": { + "present": true + }, + "__reactListening": { + "present": true + }, + "__reactRouterVersion": { + "present": true, + "version": "6" + }, + "gtag": { + "present": true + } + } +} diff --git a/tests/corpus/www.youtube.com.json b/tests/corpus/www.youtube.com.json new file mode 100644 index 0000000..857729c --- /dev/null +++ b/tests/corpus/www.youtube.com.json @@ -0,0 +1,181 @@ +{ + "host": "www.youtube.com", + "capturedAt": "2026-09-26", + "whatstack": "1.7.2", + "chromium": "151.0.7922.34", + "expect": { + "must": [ + "polymer" + ] + }, + "snapshot": [ + "polymer:high@3.5.0" + ], + "signals": { + "url": "https://www.youtube.com/", + "scripts": [ + "https://static.doubleclick.net/instream/ad_status.js", + "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js", + "/s/player/7460dd14/player_ias.vflset/en_US/miniplayer.js", + "/s/player/7460dd14/player_ias.vflset/en_US/remote.js", + "/s/player/7460dd14/player_ias.vflset/en_US/offline.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/web-animations-next-lite.min.vflset/web-animations-next-lite.min.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/webcomponents-all-noPatch.vflset/webcomponents-all-noPatch.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/fetch-polyfill.vflset/fetch-polyfill.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/intersection-observer.min.vflset/intersection-observer.min.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/scheduler.vflset/scheduler.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/www-i18n-constants-en_US.vflset/www-i18n-constants.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/spf.vflset/spf.js", + "https://www.youtube.com/s/desktop/af0a3c1e/jsbin/network.vflset/network.js", + "/s/player/7460dd14/player_ias.vflset/en_US/base.js", + "//www.gstatic.com/eureka/clank/151/cast_sender.js", + "https://www.youtube.com/s/_/ytmainappweb/_/js/k=ytmainappweb.kevlar_base.en_US.Rvn7hceJQ0s.es5.O/am=AAAAgAAAEAASBQ/d=1/br=1/rs=AGKMywGesASh2xsNGyfW8OcFT0DcqGSSAg/m=kevlar_base_module,kevlar_main_module,kevlar_base_sync_mod_chunk", + "inline:#js-1124342058", + "inline:#js-1065286052", + "inline:#base-js", + "https://fonts.googleapis.com/css2", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-main-desktop-home-page-skeleton.css", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-onepick.css", + "https://www.youtube.com/s/_/ytmainappweb/_/ss/k=ytmainappweb.kevlar_base.M7zEd9zTmso.L.W.O/am=AAAAgADAEACbBQ/d=0/br=1/rs=AGKMywHULWSjwJoYzKPvhi1jl_gPBqpKsA", + "https://i.ytimg.com/generate_204", + "https://accounts.google.com/ServiceLogin", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-main-desktop-watch-page-skeleton.css", + "https://www.youtube.com/manifest.webmanifest", + "https://googleads.g.doubleclick.net/pagead/id", + "https://www.google.com/js/th/3sGYGc4hYgVHYZEI2lPZZTlOvxH6DVRbT7JLSrTea7w.js", + "https://www.youtube.com/s/desktop/af0a3c1e/img/favicon.ico", + "https://www.gstatic.com/youtube/img/branding/favicon/favicon_144x144_v2.png", + "https://www.youtube.com/youtubei/v1/guide", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/search/v15/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/menu/v1/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/yt-logo-updated/v3/24px.svg", + "https://www.google.com/pagead/lvz", + "https://fonts.googleapis.com/css", + "https://www.youtube.com/youtubei/v1/feedback", + "https://www.youtube.com/s/search/audio/failure.mp3", + "https://www.youtube.com/s/search/audio/no_input.mp3", + "https://www.youtube.com/s/search/audio/open.mp3", + "https://www.youtube.com/s/search/audio/success.mp3", + "https://www.youtube.com/generate_204", + "https://www.youtube.com/api/jnn/v1/GenerateIT", + "https://youtube.com/", + "https://www.youtube.com/s/player/7460dd14/player_ias.vflset/en_US/base.js", + "https://www.youtube.com/s/player/7460dd14/www-player.css", + "https://www.gstatic.com/youtube/img/icons/web/youtube_outline/refresh/v1/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/chevron_down/v9/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/mic/v14/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/person_circle/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/overflow_vertical/v13/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/home/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/shorts/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/subscriptions/v12/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/history/v1/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/bag/v7/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/audio/v14/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/clapperboard/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/chevron_up/v9/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/youtube_round/v2/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/unplugged_logo/v2/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/youtube_music/v2/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/youtube_kids_round/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/flag/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/x/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/location_pin/v2/24px.svg", + "https://www.youtube.com/s/_/ytmainappweb/_/js/k=ytmainappweb.kevlar_base.en_US.Rvn7hceJQ0s.es5.O/am=AAAAgAAAEAASBQ/d=1/exm=kevlar_base_module,kevlar_base_sync_mod_chunk,kevlar_main_module/ed=1/br=1/rs=AGKMywGesASh2xsNGyfW8OcFT0DcqGSSAg/m=QlbBce,De8mUc", + "https://www.youtube.com/s/_/ytmainappweb/_/js/k=ytmainappweb.kevlar_base.en_US.Rvn7hceJQ0s.es5.O/am=AAAAgAAAEAASBQ/d=1/exm=De8mUc,QlbBce,kevlar_base_module,kevlar_base_sync_mod_chunk,kevlar_main_module/ed=1/br=1/rs=AGKMywGesASh2xsNGyfW8OcFT0DcqGSSAg/m=yTIahe", + "https://www.youtube.com/s/player/7460dd14/player_ias.vflset/en_US/offline.js", + "https://www.youtube.com/s/player/7460dd14/player_ias.vflset/en_US/remote.js", + "https://www.youtube.com/s/player/7460dd14/player_ias.vflset/en_US/miniplayer.js", + "https://www.gstatic.com/eureka/clank/151/cast_sender.js", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/add_circle/v6/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/add_circle/v6/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/alert_bubble/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/audio/v14/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/bag/v7/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/bell/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/bell/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/clapperboard/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/clock/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/clock/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/copy/v3/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/creator_studio_red_logo/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/download/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/fashion/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/fashion/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/flag/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/gaming/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/gaming/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/gear/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/gear/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/help_circle/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/home/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/lightbulb/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/lightbulb/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/live/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/mic/v14/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/news/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/news/v3/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_fill/offline_no_content/v1/192px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/overflow_horizontal/v6/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/play_square_stack/v1/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/play_square_stack/v1/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/playlist/v5/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/podcast/v6/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/podcast/v6/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/search/v15/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/subscriptions/v12/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/thumb_up/v24/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/thumb_up/v24/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/trash_can/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/trash_can/v10/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/trending/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/trending/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/trophy/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/trophy/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/video/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/video/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/video_camera_add/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/youtube_shorts/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/youtube_shorts/v11/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/arrow_down/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/arrow_up/v3/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/pause/v9/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/play/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/play/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/share/v12/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/share/v12/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/text_bubble/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/text_bubble/v4/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/thumb_down/v25/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/thumb_down/v25/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/volume_max/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/volume_max/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_fill_experimental/volume_mute/v2/24px.svg", + "https://fonts.gstatic.com/s/i/youtube_outline_experimental/volume_mute/v2/24px.svg", + "https://www.gstatic.com/youtube/img/icons/web/youtube_outline/waveform/v1/24px.svg" + ], + "stylesheets": [ + "//fonts.googleapis.com/css2", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-main-desktop-home-page-skeleton.css", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-onepick.css", + "https://www.youtube.com/s/_/ytmainappweb/_/ss/k=ytmainappweb.kevlar_base.M7zEd9zTmso.L.W.O/am=AAAAgADAEACbBQ/d=0/br=1/rs=AGKMywHULWSjwJoYzKPvhi1jl_gPBqpKsA", + "https://fonts.googleapis.com/css", + "/s/player/7460dd14/www-player.css", + "https://www.youtube.com/s/desktop/af0a3c1e/cssbin/www-main-desktop-watch-page-skeleton.css" + ], + "cookies": [ + "PREF" + ], + "metas": [], + "inlineSamples": [], + "domFlags": [], + "globals": {}, + "pass": "light" + }, + "globals": { + "Polymer": { + "present": true, + "version": "3.5.0" + } + } +} From 7fb44a5b5ebf8282d32701b0147c06fc654974ce Mon Sep 17 00:00:00 2001 From: Kiro Agent <244629292+kiro-agent@users.noreply.github.com> Date: Sat, 26 Sep 2026 09:04:17 +0000 Subject: [PATCH 7/8] chore: CI, lint, type check, coverage, stronger audits - GitHub Actions: lint, type check, unit + corpus (Node 20/22), coverage gate (>=80% lines), real-extension browser suite in headless Chromium, store zip artifact - ESLint 9 flat config; tsc --checkJs over shared/, background/, popup/ - local-only audit scans every shipped file for fetch/XHR/sendBeacon/ WebSocket/EventSource/importScripts/remote import/beacons and unexpected URLs; manifest audit follows side-effect and dynamic imports - scripts/check-version.mjs: manifest, package, lockfile, release notes - replace two no-op tests (conditional Tailwind assertion, SHA length) --- .github/workflows/ci.yml | 73 +++ eslint.config.js | 30 + package-lock.json | 1153 ++++++++++++++++++++++++++++++++- package.json | 12 +- popup/popup.js | 3 +- scripts/check-version.mjs | 24 + scripts/local-only-audit.js | 88 +-- scripts/manifest-audit.js | 7 +- shared/detect.js | 9 +- shared/signatures.js | 4 +- tests/result-shape.test.js | 15 +- tests/store-readiness.test.js | 16 +- tsconfig.json | 15 + 13 files changed, 1383 insertions(+), 66 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 eslint.config.js create mode 100644 scripts/check-version.mjs create mode 100644 tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1d984bb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,73 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +jobs: + unit: + name: Unit + corpus (Node ${{ matrix.node }}) + runs-on: ubuntu-latest + strategy: + matrix: + node: [20, 22] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: npm + - run: npm ci + - run: npm run lint + - run: npm run typecheck + - run: npm test + - run: npm run audit:manifest + - run: npm run audit:local + + coverage: + name: Coverage (≥ 80% lines) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm run test:coverage + + browser: + name: Real Chromium, real extension + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npx playwright install --with-deps chromium + - run: npm run test:browser + env: + HEADLESS: '1' + + package: + name: Store package + runs-on: ubuntu-latest + needs: [unit, browser] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - run: node scripts/check-version.mjs + - run: npm run pack + - uses: actions/upload-artifact@v4 + with: + name: whatstack-extension + path: dist/*.zip + if-no-files-found: error diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..445c708 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,30 @@ +import js from '@eslint/js'; +import globals from 'globals'; + +export default [ + { ignores: ['dist/**', 'node_modules/**', 'launch-video/**', 'tests/browser/fixtures/**', 'coverage/**'] }, + js.configs.recommended, + { + files: ['**/*.js', '**/*.mjs'], + languageOptions: { + ecmaVersion: 2023, + sourceType: 'module', + globals: { ...globals.browser, ...globals.webextensions }, + }, + rules: { + 'no-unused-vars': ['error', { argsIgnorePattern: '^_', caughtErrors: 'none' }], + 'no-empty': ['error', { allowEmptyCatch: true }], + eqeqeq: ['error', 'smart'], + 'no-var': 'off', + }, + }, + { + // Classic content script: no modules, runs in the page's isolated world. + files: ['content/content-script.js'], + languageOptions: { sourceType: 'script' }, + }, + { + files: ['tests/**', 'scripts/**', 'eslint.config.js'], + languageOptions: { globals: { ...globals.node, ...globals.browser, ...globals.webextensions } }, + }, +]; diff --git a/package-lock.json b/package-lock.json index bee2f22..1ca1e03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,701 @@ "name": "whatstack", "version": "1.7.2", "devDependencies": { - "playwright": "^1.56.0" + "@eslint/js": "^9.39.5", + "@types/chrome": "^0.3.0", + "eslint": "^9.39.5", + "globals": "^17.12.0", + "playwright": "^1.56.0", + "typescript": "^5.9.3" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@types/chrome": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.3.0.tgz", + "integrity": "sha512-HPAMKyJwUnNJdVsxgypwvIStlwRhhaLnxgEwKIB99oOcffJrC4UMeD5xseVoBwDinSkr690DCBaAtSYdK6M1qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -26,6 +718,310 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", + "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/playwright": { "version": "1.62.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.0.tgz", @@ -57,6 +1053,161 @@ "engines": { "node": ">=20" } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 6ec4105..7abddc3 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,17 @@ "test:browser": "node tests/browser/run.mjs", "test:coverage": "node --test --experimental-test-coverage --test-coverage-include=shared/**/*.js --test-coverage-include=background/**/*.js --test-coverage-lines=80 tests/*.test.js", "corpus:capture": "node scripts/capture-corpus.mjs", - "corpus:update": "UPDATE_CORPUS=1 node --test tests/corpus.test.js" + "corpus:update": "UPDATE_CORPUS=1 node --test tests/corpus.test.js", + "lint": "eslint .", + "typecheck": "tsc -p tsconfig.json", + "check": "npm run lint && npm run typecheck && npm test && npm run audit:manifest && npm run audit:local" }, "devDependencies": { - "playwright": "^1.56.0" + "@eslint/js": "^9.39.5", + "@types/chrome": "^0.3.0", + "eslint": "^9.39.5", + "globals": "^17.12.0", + "playwright": "^1.56.0", + "typescript": "^5.9.3" } } diff --git a/popup/popup.js b/popup/popup.js index e959b2e..a4dfb5d 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -12,7 +12,8 @@ import { import { getBrandIcon } from '../shared/brand-icons.js'; import { isRestrictedUrl } from '../shared/url-policy.js'; -const $ = (id) => document.getElementById(id); +/** @param {string} id */ +const $ = (id) => /** @type {HTMLButtonElement} */ (document.getElementById(id)); const els = { status: $('status'), diff --git a/scripts/check-version.mjs b/scripts/check-version.mjs new file mode 100644 index 0000000..6153293 --- /dev/null +++ b/scripts/check-version.mjs @@ -0,0 +1,24 @@ +/** + * Release consistency: manifest.json, package.json and package-lock.json agree, + * and docs/RELEASE-.md exists. + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const read = (rel) => JSON.parse(fs.readFileSync(path.join(root, rel), 'utf8')); +const manifest = read('manifest.json').version; +const pkg = read('package.json').version; +const lock = read('package-lock.json'); +const problems = []; +if (pkg !== manifest) problems.push(`package.json ${pkg} != manifest.json ${manifest}`); +if (lock.version !== manifest) problems.push(`package-lock.json ${lock.version} != manifest.json ${manifest}`); +if (lock.packages?.['']?.version && lock.packages[''].version !== manifest) problems.push(`package-lock root ${lock.packages[''].version} != ${manifest}`); +if (!/^\d+\.\d+\.\d+$/.test(manifest)) problems.push(`manifest version "${manifest}" is not x.y.z`); +if (!fs.existsSync(path.join(root, 'docs', `RELEASE-${manifest}.md`))) problems.push(`docs/RELEASE-${manifest}.md is missing`); +if (problems.length) { + console.error('FAIL\n ' + problems.join('\n ')); + process.exit(1); +} +console.log(`OK version ${manifest} is consistent`); diff --git a/scripts/local-only-audit.js b/scripts/local-only-audit.js index 66f60fb..7ae1a98 100644 --- a/scripts/local-only-audit.js +++ b/scripts/local-only-audit.js @@ -1,5 +1,10 @@ /** - * Grep shipped detection path for outbound detection / remote signature usage. + * "Local only" audit: no shipped file may talk to the network. + * + * Scans EVERY file that goes into the store package (same roots as + * scripts/package-extension.js) for network primitives. The only URLs allowed + * are the "Wrong?" report link the USER opens (REPORT_REPO) — never a request + * the extension makes. */ import fs from 'node:fs'; import path from 'node:path'; @@ -7,56 +12,63 @@ import { fileURLToPath } from 'node:url'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const outPath = process.argv[2] || null; +export const PACKAGED_DIRS = ['background', 'content', 'popup', 'shared']; -const files = [ - 'shared/detect.js', - 'shared/signatures.js', - 'shared/result-shape.js', - 'background/service-worker.js', - 'content/content-script.js', - 'popup/popup.js', +/** Network primitives. Comments are stripped before matching. */ +const NETWORK = [ + [/\bfetch\s*\(/, 'fetch()'], + [/\bXMLHttpRequest\b/, 'XMLHttpRequest'], + [/\bnavigator\.sendBeacon\b/, 'sendBeacon'], + [/\bnew\s+WebSocket\b/, 'WebSocket'], + [/\bnew\s+EventSource\b/, 'EventSource'], + [/\bimportScripts\s*\(/, 'importScripts()'], + [/\bimport\s*\(\s*['"`]https?:/, 'remote dynamic import'], + [/\bnew\s+Image\s*\([^)]*\)\s*\.src\s*=|\.src\s*=\s*['"`]https?:/, 'image / script beacon'], + [/\bconnectNative\b|\bsendNativeMessage\b/, 'native messaging'], + [/\bchrome\.(?:webRequest|declarativeNetRequest)\b/, 'request interception'], + [/wappalyzer\.com|builtwith\.com/i, 'remote detection service'], ]; -const suspicious = - /\b(fetch\s*\(|XMLHttpRequest|axios\.|https?:\/\/api\.|signature.*cdn|wappalyzer\.com|builtwith)/i; +/** Absolute URLs a shipped file may contain (links the user opens, never fetched). */ +const ALLOWED_URLS = [/^https:\/\/github\.com\/deepu0\/whatstack\b/, /^http:\/\/www\.w3\.org\/2000\/svg$/]; -const lines = []; -lines.push('Local-only detection audit'); -lines.push('========================='); -lines.push('Policy: matching uses bundled signatures + probes only; no remote signature fetch.'); -lines.push(''); +function stripComments(text) { + return text.replace(/\/\*[\s\S]*?\*\//g, (m) => m.replace(/[^\n]/g, ' ')).replace(/(^|[^:'"`\\])\/\/[^\n]*/g, '$1'); +} + +function walk(dir) { + const out = []; + for (const entry of fs.readdirSync(path.join(root, dir), { withFileTypes: true })) { + const rel = path.posix.join(dir, entry.name); + if (entry.isDirectory()) out.push(...walk(rel)); + else if (/\.(?:m?js|html)$/.test(entry.name)) out.push(rel); + } + return out; +} +const lines = ['Local-only detection audit', '=========================', 'Policy: bundled rules + in-page probes only; the extension makes no network requests.', '']; let bad = 0; +const files = PACKAGED_DIRS.flatMap(walk).sort(); + for (const rel of files) { - const abs = path.join(root, rel); - const text = fs.readFileSync(abs, 'utf8'); - const hits = []; + const text = stripComments(fs.readFileSync(path.join(root, rel), 'utf8')); + const problems = []; text.split('\n').forEach((line, i) => { - if (suspicious.test(line)) hits.push({ line: i + 1, text: line.trim() }); - }); - // Allow chrome.* APIs; flag only network-ish in detect path - if (rel.startsWith('shared/') && /fetch\s*\(/.test(text)) { - bad++; - lines.push(`FAIL ${rel}: fetch() in shared detection`); - } else if (hits.length && rel.startsWith('shared/')) { - // double-check each hit - for (const h of hits) { - if (/fetch\s*\(|XMLHttpRequest|wappalyzer|builtwith/i.test(h.text)) { - bad++; - lines.push(`FAIL ${rel}:${h.line}: ${h.text}`); - } + for (const [re, label] of NETWORK) if (re.test(line)) problems.push(`${label} at line ${i + 1}: ${line.trim().slice(0, 120)}`); + for (const m of line.matchAll(/https?:\/\/[^\s'"`)<>]+/g)) { + if (!ALLOWED_URLS.some((re) => re.test(m[0]))) problems.push(`unexpected URL at line ${i + 1}: ${m[0]}`); } + }); + if (problems.length) { + bad += problems.length; + for (const p of problems) lines.push(`FAIL ${rel}: ${p}`); + } else { + lines.push(`OK ${rel}`); } - lines.push(`OK ${rel} (${text.split('\n').length} lines) — no remote detection API`); } lines.push(''); -lines.push( - bad === 0 - ? 'RESULT: matching is local (bundled rules/probes only).' - : `RESULT: ${bad} suspicious construct(s).`, -); - +lines.push(bad === 0 ? `RESULT: ${files.length} shipped files, no network access.` : `RESULT: ${bad} problem(s).`); const body = lines.join('\n') + '\n'; console.log(body); if (outPath) fs.writeFileSync(outPath, body); diff --git a/scripts/manifest-audit.js b/scripts/manifest-audit.js index a4b3d79..1a9e1af 100644 --- a/scripts/manifest-audit.js +++ b/scripts/manifest-audit.js @@ -88,7 +88,8 @@ function scanImports(rel, seen = new Set()) { const abs = path.join(root, rel); if (!fs.existsSync(abs) || !/\.m?js$/.test(abs)) return; const text = fs.readFileSync(abs, 'utf8'); - const re = /from\s+['"](\.\.?\/[^'"]+)['"]/g; + // static `from`, side-effect `import './x.js'` and dynamic `import('./x.js')` + const re = /(?:\bfrom\s+|\bimport\s*\(?\s*)['"](\.\.?\/[^'"]+)['"]/g; let m; while ((m = re.exec(text))) { let dep = path.posix.normalize(path.posix.join(path.posix.dirname(rel), m[1])); @@ -101,8 +102,8 @@ function scanImports(rel, seen = new Set()) { if (manifest.background?.service_worker) scanImports(manifest.background.service_worker); if (manifest.action?.default_popup) { const popupHtml = fs.readFileSync(path.join(root, manifest.action.default_popup), 'utf8'); - const sm = popupHtml.match(/src=["']([^"']+\.js)["']/); - if (sm) { + // every popup script, not just the first + for (const sm of popupHtml.matchAll(/src=["']([^"']+\.js)["']/g)) { const rel = path.posix.normalize( path.posix.join(path.posix.dirname(manifest.action.default_popup), sm[1]), ); diff --git a/shared/detect.js b/shared/detect.js index eff0669..8bdd8d0 100644 --- a/shared/detect.js +++ b/shared/detect.js @@ -778,7 +778,7 @@ export function extractVersions(signals) { versions[id] = n; }; const gv = (name) => { - const x = g[name]; + const x = /** @type {any} */ (g[name]); return x && typeof x === 'object' ? x.version : undefined; }; @@ -902,9 +902,10 @@ function evalCheck(signals, check) { const val = globals[key]; // A probe reporting absence as `{ present: false }` must not score as a // hit, so require an explicit positive marker rather than any object. - if (val === true || (val && typeof val === 'object' && val.present !== false)) { + const v = /** @type {any} */ (val); + if (v === true || (v && typeof v === 'object' && v.present !== false)) { const version = - val && typeof val === 'object' && val.version ? ` v${val.version}` : ''; + v && typeof v === 'object' && v.version ? ` v${v.version}` : ''; return pack(`window.${key}${version}`); } } @@ -1573,7 +1574,7 @@ export function mergeDeepSignals(light, mainGlobals) { return { ...light, globals: { ...(light.globals || {}), ...(mainGlobals || {}) }, - pass: 'deep', + pass: /** @type {'deep'} */ ('deep'), }; } diff --git a/shared/signatures.js b/shared/signatures.js index 2a34499..6f70264 100644 --- a/shared/signatures.js +++ b/shared/signatures.js @@ -126,7 +126,7 @@ export const SIGNATURES = [ { type: 'global', pattern: 'ng', weight: 2, runtime: true }, // Flag token emitted by the content-script probe (which ORs _ngcontent/_nghost) { type: 'dom', pattern: '[_ngcontent-]', weight: 4, strong: true, runtime: true }, - { type: 'script', pattern: /(?:^|[\/@])@angular\//i, weight: 4, strong: true, runtime: true }, + { type: 'script', pattern: /(?:^|[/@])@angular\//i, weight: 4, strong: true, runtime: true }, ], }, { @@ -574,7 +574,7 @@ export const SIGNATURES = [ // Loader only — NOT an MFE framework. Tight paths only (no bare system.js). checks: [ { type: 'dom', pattern: 'script[type="systemjs-importmap"]', weight: 5, strong: true, runtime: true }, - { type: 'script', pattern: /(?:^|[\/@])systemjs(?:@|\/|\.js)/i, weight: 5, strong: true, runtime: true }, + { type: 'script', pattern: /(?:^|[/@])systemjs(?:@|\/|\.js)/i, weight: 5, strong: true, runtime: true }, { type: 'script', pattern: /(?:unpkg\.com|jsdelivr\.net|esm\.sh|cdnjs).*systemjs/i, weight: 5, strong: true, runtime: true }, { type: 'script', pattern: /systemjs\.org|systemjs@[\d.]+/i, weight: 5, strong: true, runtime: true }, { type: 'global', pattern: '__systemjs', weight: 4, strong: true, runtime: true }, diff --git a/tests/result-shape.test.js b/tests/result-shape.test.js index d128fe7..06f9d48 100644 --- a/tests/result-shape.test.js +++ b/tests/result-shape.test.js @@ -47,21 +47,16 @@ describe('result shaping for popup', () => { stylesheets: [], cookies: [], metas: [], - // only weak tailwind utilities flag → low tailwind + // only the weak utility-class flag → Tailwind must be low domFlags: ['tailwind-utilities'], - html: '
'.repeat(3), globals: {}, }); const shaped = shapeForPopup(raw); const ui = shaped.sections.find((s) => s.category === 'ui'); - if (ui) { - // if tailwind present only as low, it should be in lowHits - const all = [...ui.hits, ...ui.lowHits]; - const tw = all.find((h) => h.id === 'tailwind'); - if (tw && tw.confidence === 'low') { - assert.ok(ui.lowHits.some((h) => h.id === 'tailwind')); - } - } + assert.ok(ui, 'ui section present'); + assert.deepEqual(ui.hits.map((h) => h.id), [], 'nothing solid'); + assert.deepEqual(ui.lowHits.map((h) => h.id), ['tailwind']); + assert.equal(shaped.highMediumCount, 0); }); it('formatStackSummary lists detected tech', () => { diff --git a/tests/store-readiness.test.js b/tests/store-readiness.test.js index 8ef5b12..3e673bf 100644 --- a/tests/store-readiness.test.js +++ b/tests/store-readiness.test.js @@ -6,7 +6,6 @@ import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { createHash } from 'node:crypto'; import { execFileSync } from 'node:child_process'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); @@ -116,9 +115,16 @@ describe('store publish readiness', () => { fs.rmSync(extractDir, { recursive: true, force: true }); }); - it('hashes PRIVACY.md for evidence trail', () => { - const buf = fs.readFileSync(path.join(root, 'PRIVACY.md')); - const hash = createHash('sha256').update(buf).digest('hex'); - assert.equal(hash.length, 64); + it('toolbar and store icons are the sizes the manifest claims', () => { + const m = readJson('manifest.json'); + for (const [size, rel] of [...Object.entries(m.icons), ...Object.entries(m.action.default_icon)]) { + const { w, h } = pngDimensions(path.join(root, rel)); + assert.equal(w, Number(size), `${rel} width`); + assert.equal(h, Number(size), `${rel} height`); + } + }); + + it('version is consistent across manifest, package, lockfile and release notes', () => { + execFileSync('node', ['scripts/check-version.mjs'], { cwd: root, stdio: 'pipe' }); }); }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b6171e6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "strict": false, + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["chrome"], + "skipLibCheck": true + }, + "include": ["shared/**/*.js", "background/**/*.js", "popup/**/*.js"] +} From 23bce99ef4713a7ed90e11730c8363cf02e31c73 Mon Sep 17 00:00:00 2001 From: Kiro Agent <244629292+kiro-agent@users.noreply.github.com> Date: Sat, 26 Sep 2026 09:08:36 +0000 Subject: [PATCH 8/8] docs: 1.8.0 release notes, README, CONTRIBUTING, listing; bump to 1.8.0 --- CONTRIBUTING.md | 22 ++- README.md | 51 ++++--- docs/AUDIT-2026-09.md | 17 +++ docs/RELEASE-1.8.0.md | 164 +++++++++++++++++++++ manifest.json | 2 +- package-lock.json | 4 +- package.json | 4 +- store/LISTING.md | 5 +- tests/corpus/angular.dev.json | 2 +- tests/corpus/astro.build.json | 2 +- tests/corpus/auth0.com.json | 2 +- tests/corpus/chakra-ui.com.json | 2 +- tests/corpus/clerk.com.json | 2 +- tests/corpus/dev.to.json | 2 +- tests/corpus/discord.com.json | 2 +- tests/corpus/en.wikipedia.org.json | 2 +- tests/corpus/getbootstrap.com.json | 2 +- tests/corpus/github.com.json | 2 +- tests/corpus/gitlab.com.json | 2 +- tests/corpus/jquery.com.json | 2 +- tests/corpus/linear.app.json | 2 +- tests/corpus/medium.com.json | 2 +- tests/corpus/mui.com.json | 2 +- tests/corpus/newrelic.com.json | 2 +- tests/corpus/nextjs.org.json | 2 +- tests/corpus/nuxt.com.json | 2 +- tests/corpus/razorpay.com.json | 2 +- tests/corpus/react.dev.json | 2 +- tests/corpus/remix.run.json | 2 +- tests/corpus/segment.com.json | 2 +- tests/corpus/sentry.io.json | 2 +- tests/corpus/stackoverflow.com.json | 2 +- tests/corpus/stripe.com.json | 2 +- tests/corpus/supabase.com.json | 2 +- tests/corpus/svelte.dev.json | 2 +- tests/corpus/tailwindcss.com.json | 2 +- tests/corpus/vercel.com.json | 2 +- tests/corpus/vuejs.org.json | 2 +- tests/corpus/wordpress.org.json | 2 +- tests/corpus/www.airbnb.com.json | 2 +- tests/corpus/www.atlassian.com.json | 2 +- tests/corpus/www.canva.com.json | 2 +- tests/corpus/www.datadoghq.com.json | 2 +- tests/corpus/www.figma.com.json | 2 +- tests/corpus/www.flipkart.com.json | 2 +- tests/corpus/www.hotjar.com.json | 2 +- tests/corpus/www.intercom.com.json | 2 +- tests/corpus/www.netflix.com.json | 2 +- tests/corpus/www.notion.com.json | 2 +- tests/corpus/www.onlyfrontendjobs.com.json | 2 +- tests/corpus/www.reddit.com.json | 2 +- tests/corpus/www.shopify.com.json | 2 +- tests/corpus/www.spotify.com.json | 2 +- tests/corpus/www.youtube.com.json | 2 +- 54 files changed, 285 insertions(+), 76 deletions(-) create mode 100644 docs/RELEASE-1.8.0.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9a704fd..a0ba363 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,9 +17,19 @@ Before adding a signature: 1. Prefer **asset URLs** and **runtime globals** over page text 2. Never match marketing copy (e.g. “we use React”) 3. For React-like hooks, require real registration (see DevTools renderer rule) -4. Add a **positive fixture** and a **non-flaky prose-only** case when relevant -5. Run `npm test` - -## Publishing (later) - -Chrome Web Store packaging is out of scope until the product owner is satisfied. Do not commit private keys (`.pem`) or store credentials. +4. Match URLs on host / package boundaries — rules see the URL **without** its + query string (set `matchQuery: true` only if the query is the evidence) +5. Globals need a shape check in the probe (`typeof x.method === 'function'`): + any element with an `id` becomes a window property +6. Add a case to `POSITIVE` in `tests/signature-coverage.test.js` — the gate + also runs a prose / file-name / search-query case against every rule +7. Add a brand mark in `shared/brand-icons.js` +8. Run `npm run check`; if the golden corpus snapshot changes on purpose, + review it and run `npm run corpus:update` + +## Releases + +Bump `manifest.json`, `package.json` and `package-lock.json` together +(`npm version --no-git-tag-version`, then the manifest) and add +`docs/RELEASE-.md`; `scripts/check-version.mjs` enforces it. Do not +commit private keys (`.pem`) or store credentials. diff --git a/README.md b/README.md index 89d9855..9b614e8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Chrome extension (Manifest V3) that answers: **what stack is this page using?** -Fully **local** detection — frameworks, architecture (microfrontends), build tools, state/data, UI, auth, payments, observability, analytics, and hosting hints. No cloud matching, no page upload. +Fully **local** detection of 82 technologies — frameworks, CMS / site builders, architecture (microfrontends), build tools, state/data, UI, auth, payments, observability, analytics, and hosting hints. No cloud matching, no page upload. ## Load unpacked (development) @@ -13,8 +13,11 @@ Fully **local** detection — frameworks, architecture (microfrontends), build t ## Features -- Hybrid scan: light pass on navigate (badge) + deep pass when the popup opens +- Hybrid scan: light pass on navigate, then a background MAIN-world probe, so the + **badge counts what the popup shows**; the popup always runs a fresh deep scan - Confidence tiers + expandable evidence (why it matched) +- Evidence from asset URLs (host + path, never the query), runtime objects with the + right shape, and probed DOM flags — never page text, data islands or file names - Core stack headline + Copy / Markdown / JSON export - React detection aligned with React DevTools (renderer registered, not bare hook) - Microfrontend platforms: Module Federation, single-spa, qiankun, SystemJS @@ -23,17 +26,26 @@ Fully **local** detection — frameworks, architecture (microfrontends), build t ## Develop / test ```bash -npm test # unit + integration suites (node:test, no deps) -npm run test:browser # loads the real unpacked extension into Chrome -npm run audit:manifest -npm run audit:local +npm ci +npm test # unit, coverage gate, golden corpus (node:test, offline) +npm run check # lint + type check + tests + audits +npm run test:coverage # fails under 80% lines +npx playwright install chromium +npm run test:browser # real unpacked extension in real Chromium +HEADLESS=1 npm run test:browser # same, headless (CI) +npm run corpus:capture # re-capture real sites into tests/corpus (network) ``` -`npm run test:browser` needs `npm install` (Playwright) and a Chrome/Chromium -build; point `CHROME_PATH` at one if you don't have the `chrome` channel -installed. It serves `tests/browser/fixtures/` over localhost and checks that -pages which merely *display* framework markup produce no detections, while pages -that really use the framework still do. +`npm run test:browser` uses Playwright's bundled Chromium — branded Chrome +stable ignores `--load-extension`. Set `CHROME_PATH` to use another +Chromium-family build. It serves `tests/browser/fixtures/` over localhost and +checks that pages which merely *display* or *mention* a framework produce no +detections, that real ones do, and that the badge matches the popup. + +**Golden corpus.** `tests/corpus/*.json` are real sites captured by +`scripts/capture-corpus.mjs` (light signals + probe globals, query strings and +non-evidence text removed). `npm test` replays them offline. When a change +alters a snapshot on purpose, review it and run `npm run corpus:update`. Detection evidence comes from real `querySelector` probes only — never from the page's HTML as text. `tests/dom-evidence.test.js` is the guard for that. @@ -42,15 +54,20 @@ page's HTML as text. `tests/dom-evidence.test.js` is the guard for that. ``` manifest.json -background/service-worker.js # cache, badge, deep scan -content/content-script.js # light signals +background/service-worker.js # message adapter, tab lifecycle +content/content-script.js # light signals (isolated world) popup/ # toolbar UI -shared/detect.js # pure detection engine -shared/signatures.js # local rule pack -shared/result-shape.js # popup shaping + exports +shared/detect.js # pure engine + MAIN-world probe source +shared/signatures.js # local rule pack (82 technologies) +shared/signature-matcher.js # evidence → confidence +shared/architecture-classifier.js # badge count +shared/scan-orchestrator.js # light/deep passes, cache, badge, timeouts +shared/url-policy.js # which pages can be scanned +shared/result-shape.js # popup shaping + exports + report link shared/brand-icons.js # tech marks (local SVG) tests/ # node:test suites + fixtures -tests/browser/ # real-Chrome end-to-end suite +tests/corpus/ # golden corpus of real captured sites +tests/browser/ # real-Chromium end-to-end suite scripts/ # audits, packaging, store assets icons/ # toolbar + brand assets store/ # listing copy, screenshots, promo tile diff --git a/docs/AUDIT-2026-09.md b/docs/AUDIT-2026-09.md index 8a6bb84..9d41345 100644 --- a/docs/AUDIT-2026-09.md +++ b/docs/AUDIT-2026-09.md @@ -305,3 +305,20 @@ detect({...empty, inlineSamples:['{"title":"Migrating to single-spa and module f ``` Phase 5 turns each of these into a permanent test. + +--- + +## 10. Resolution (1.8.0) + +Every finding above is addressed in 1.8.0; see [RELEASE-1.8.0.md](RELEASE-1.8.0.md). +Each is pinned by a test that reproduces the 1.7.2 input (`tests/audit-regressions.test.js`, +`tests/main-probe.test.js`, `tests/scan-orchestrator.test.js`, browser fixtures). + +Measured with the §8 harness on the same 48 sites: + +| Target (§7) | Result | +|---|---| +| Badge = popup on ≥ 95 % of sites | **48 / 48** | +| 0 confirmed false positives from §3 | **0** — also 0 in the golden corpus expectations | +| Astro and YouTube detected | astro.build → Astro · youtube.com → Polymer 3.5.0 | +| Deep scan p95 < 300 ms | **243 ms** | diff --git a/docs/RELEASE-1.8.0.md b/docs/RELEASE-1.8.0.md new file mode 100644 index 0000000..d551f6d --- /dev/null +++ b/docs/RELEASE-1.8.0.md @@ -0,0 +1,164 @@ +# WhatStack 1.8.0 — precision, a badge you can trust, and 18 new technologies + +This release implements every finding in [AUDIT-2026-09.md](AUDIT-2026-09.md). +Each fix ships with a test that reproduces the 1.7.2 input and fails without it. + +## Headline numbers (48 real sites, same harness before and after) + +| | 1.7.2 | 1.8.0 | +|---|---|---| +| Badge count = popup count | 21 / 48 | **48 / 48** | +| "Tailwind MEDIUM" from class names alone | 17 | 2 (Tailwind-only syntax present) | +| Confirmed wrong results from the audit | 9 | **0** | +| Sites with nothing detected | 3 | 2 (amazon.in, zomato.com) | +| Deep scan median / p95 | 46 / 208 ms | 60 / 243 ms | +| Technologies | 64 | **82** | +| Tests | 134 | **433** (+ 17 real-browser checks) | + +## Precision + +- **`window.next` is a hint, not proof.** DOM clobbering (`