diff --git a/.github/linters/.htmlhintrc b/.github/linters/.htmlhintrc index fece650f..eb09a7ae 100644 --- a/.github/linters/.htmlhintrc +++ b/.github/linters/.htmlhintrc @@ -4,11 +4,11 @@ "attr-value-double-quotes": true, "attr-value-not-empty": false, "attr-no-duplication": true, - "attr-unsafe-chars": true, - "doctype-first": true, + "attr-unsafe-chars": false, + "doctype-first": false, "doctype-html5": true, "empty-tag-self-close": true, - "id-unique": true, + "id-unique": false, "id-class-value": true, "head-script-disabled": false, "href-abs-or-rel": false, diff --git a/.github/linters/.htmlhintrc_morechecks b/.github/linters/.htmlhintrc_morechecks index fece650f..3313207b 100644 --- a/.github/linters/.htmlhintrc_morechecks +++ b/.github/linters/.htmlhintrc_morechecks @@ -4,11 +4,11 @@ "attr-value-double-quotes": true, "attr-value-not-empty": false, "attr-no-duplication": true, - "attr-unsafe-chars": true, + "attr-unsafe-chars": false, "doctype-first": true, "doctype-html5": true, "empty-tag-self-close": true, - "id-unique": true, + "id-unique": false, "id-class-value": true, "head-script-disabled": false, "href-abs-or-rel": false, diff --git a/astro.config.mjs b/astro.config.mjs index 6483150f..068a95fc 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,4 +1,7 @@ import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import starlightLinksValidator from 'starlight-links-validator'; +import starlightLlmsTxt from 'starlight-llms-txt'; const sourceMaps = process.env.SOURCE_MAPS === 'true'; @@ -19,6 +22,50 @@ export default defineConfig({ // Don't add trailing slashes to output filenames format: 'directory', }, + integrations: [ + starlight({ + title: 'HTTP Archive Docs', + disable404Route: true, + components: { + Header: './src/components/docs/Header.astro', + }, + sidebar: [ + { + label: 'Guides', + items: [ + { label: 'Getting started', link: 'docs/guides/getting-started' }, + { label: 'Minimizing query costs', link: 'docs/guides/minimizing-costs' }, + { label: 'Guided tour', link: 'docs/guides/guided-tour' }, + { label: 'Release cycle', link: 'docs/guides/release-cycle' }, + ], + }, + { + label: 'Tables', + items: [{ autogenerate: { directory: 'docs/reference/tables' } }] + }, + { + label: 'Structs', + items: [{ autogenerate: { directory: 'docs/reference/structs' } }] + }, + { + label: 'Blobs', + items: [{ autogenerate: { directory: 'docs/reference/blobs' } }] + }, + { + label: 'Custom Metrics', + items: [{ autogenerate: { directory: 'docs/reference/custom-metrics' } }] + }, + { + label: 'Functions', + items: [{ autogenerate: { directory: 'docs/reference/functions' } }] + }, + ], + editLink: { + baseUrl: 'https://github.com/HTTPArchive/httparchive.org/edit/main/' + }, + plugins: [starlightLlmsTxt(), starlightLinksValidator()], + }), + ], vite: { build: { sourcemap: sourceMaps, diff --git a/config/last_updated.json b/config/last_updated.json index 173aa441..fb9e98eb 100644 --- a/config/last_updated.json +++ b/config/last_updated.json @@ -4,15 +4,140 @@ "date_modified": "2026-07-02T00:00:00.000Z", "hash": "ef6555255ad26e4e47da7186be9bd999" }, + "docs/guides/getting-started": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "cd0a8ad4379b0f3b312e8ba56032d4a6" + }, + "docs/guides/guided-tour": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "a52176e67f1d794e051c1aebd471f471" + }, + "docs/guides/minimizing-costs": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "a103e22b684565b1a55e4b722d66f0bf" + }, + "docs/guides/release-cycle": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "8259e9969874283a66929c525e1e2e19" + }, + "docs/index": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "c374905b3752c4c66b835830bd8940f8" + }, + "docs/reference/blobs/lighthouse": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "de55578fc8edfadce490f0ce9205d279" + }, + "docs/reference/blobs/page-metadata": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "3d746a46653adc82819e234d9c092f32" + }, + "docs/reference/blobs/page-payload": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "564869fe373e6de48547b627f4bc7287" + }, + "docs/reference/blobs/page-summary": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "ab57f4a09c389cf6bdbb1c0dbe83a31b" + }, + "docs/reference/blobs/request-payload": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "a4e80fb44f65e6504d2b9e5b2e87f22f" + }, + "docs/reference/blobs/request-summary": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "72d4210cd35088c8706a1ea02f58c952" + }, + "docs/reference/custom-metrics/ads": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "6261101aa4c53499a24f49431a5a1027" + }, + "docs/reference/custom-metrics/other": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "999e963a01ec07de9bd58e1cfb28aab3" + }, + "docs/reference/custom-metrics/privacy": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "a8c0e88f953021ffcfbf037bdadfea4b" + }, + "docs/reference/functions/capo": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "f030d469063a7ca5ac5881e300995a93" + }, + "docs/reference/functions/get_host_categories": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "74e4235447f6d0f8e9e66957ae2fdbd5" + }, + "docs/reference/functions/get_lcp_lazy": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "9347d792c09501f366e8673714b42c89" + }, + "docs/reference/functions/get_lcp_priority": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "70b1661490313f5cf448e20b4568924d" + }, + "docs/reference/functions/get_origin": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "a75d9efb5b4e0a260ef7de7d7e51e293" + }, + "docs/reference/structs/custom-metrics": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "4b2eeb1aaec6c982ae82031de1061546" + }, + "docs/reference/structs/feature": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "387f5c67a41f137abea9817ff9396de3" + }, + "docs/reference/structs/header": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "2ec68ca21788e35622b1312452c6ea94" + }, + "docs/reference/structs/technology": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "6f2463eb1f62e9a15717f9f186eccb61" + }, + "docs/reference/tables/pages": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "8183f41800e611b1d94eaf1d7fd3e656" + }, + "docs/reference/tables/requests": { + "date_published": "2026-09-14T00:00:00.000Z", + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "cebd71a60ba1b7d32af85baab3a224bf" + }, "faq.html": { "date_published": "2018-05-08T00:00:00.000Z", - "date_modified": "2026-06-29T00:00:00.000Z", - "hash": "474a30967e56a20920b1aed21c276923" + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "ae9d8ef644bae6fea657921c8f65bcdf" }, "index.html": { "date_published": "2018-05-08T00:00:00.000Z", - "date_modified": "2026-08-10T00:00:00.000Z", - "hash": "e12fad43d5aaa52dba0f32e7101f0f39" + "date_modified": "2026-09-14T00:00:00.000Z", + "hash": "c2a97964a5e61083bba0831b010c40f4" }, "reports.html": { "date_published": "2018-05-08T00:00:00.000Z", diff --git a/docs/faq.md b/docs/faq.md index e6942312..f71c93cd 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -16,7 +16,7 @@ The list of URLs is fed to our private instance of [WebPageTest](https://webpage As of March 1 2016, the tests are performed on Chrome for desktop and emulated Android (on Chrome) for mobile. -The test agents are run from [Google Cloud regions](https://cloud.google.com/compute/docs/regions-zones) across the US. Each URL is loaded once with an empty cache ("first view") for normal metrics collection and again, in a clean browser profile, using [Lighthouse](https://developers.google.com/web/tools/lighthouse). The data is collected via a [HAR file](https://en.wikipedia.org/wiki/.har). The HTTP Archive collects these HAR files, parses them, and populates [a public dataset in BigQuery](https://har.fyi/guides/getting-started/). +The test agents are run from [Google Cloud regions](https://cloud.google.com/compute/docs/regions-zones) across the US. Each URL is loaded once with an empty cache ("first view") for normal metrics collection and again, in a clean browser profile, using [Lighthouse](https://developers.google.com/web/tools/lighthouse). The data is collected via a [HAR file](https://en.wikipedia.org/wiki/.har). The HTTP Archive collects these HAR files, parses them, and populates [a public dataset in BigQuery](/docs/guides/getting-started/). ## How accurate is the data, in particular the time measurements? @@ -33,7 +33,7 @@ Given these conditions it's virtually impossible to compare the HTTP Archive's t ## How do I use BigQuery to write custom queries over the data? -The HTTP Archive dataset is available publicly on BigQuery. Check out [Getting Started Accessing the HTTP Archive with BigQuery](https://har.fyi/guides/getting-started/). +The HTTP Archive dataset is available publicly on BigQuery. Check out [Getting Started Accessing the HTTP Archive with BigQuery](/docs/guides/getting-started/). ## What changes have been made to the test environment that might affect the data? diff --git a/package-lock.json b/package-lock.json index 66f66b33..21f66b47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "devDependencies": { "@astrojs/sitemap": "^3.7.4", + "@astrojs/starlight": "^0.41.1", "astro": "^7.3.1", "ejs": "6.0.1", "fs-extra": "11.4.0", @@ -18,6 +19,8 @@ "node-fetch": "3.3.2", "puppeteer": "^25.10.0", "run-script-os": "1.1.6", + "starlight-links-validator": "^0.25.1", + "starlight-llms-txt": "^0.11.0", "web-vitals": "6.2.1", "xml-js": "1.6.11", "zod": "^4.4.3" @@ -267,6 +270,356 @@ "zod": "^4.3.6" } }, + "node_modules/@astrojs/starlight": { + "version": "0.41.11", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.41.11.tgz", + "integrity": "sha512-hM95Mbsl4l60SBwaNQA/HTxpOLGfeB5EfR9qY3kr0SsAVKUspCssjO0RVBsLiPAE6EA5xuORcCoz/Q6DTX+MuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/markdown-satteri": "^0.3.5", + "@astrojs/mdx": "^7.0.5", + "@astrojs/sitemap": "^3.7.3", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.44.0", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.3", + "hast-util-select": "^6.0.4", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", + "i18next": "^26.0.7", + "js-yaml": "^4.1.1", + "klona": "^2.0.6", + "magic-string": "^0.30.21", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.5.2", + "rehype": "^13.0.2", + "rehype-format": "^5.0.1", + "remark-directive": "^4.0.0", + "satteri": "^0.9.1", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.2.0", + "astro": "^7.0.2" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/internal-helpers": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.4.tgz", + "integrity": "sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.8.tgz", + "integrity": "sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/satteri": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", + "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/mdx": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.8.tgz", + "integrity": "sha512-RNuwq2ccTSi7NX9YqlR0noaWoVdOrZuJvdfWXotAzdhMVB0b0zEMLnNU+xar7le0GwTMlTObD/QAu8jeHA/3nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/markdown-remark": "7.2.4", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/markdown-satteri": "^0.3.1", + "astro": "^7.0.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-satteri": { + "optional": true + } + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.4.tgz", + "integrity": "sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/starlight/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@astrojs/starlight/node_modules/satteri": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", + "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.5", + "@bruits/satteri-darwin-x64": "0.9.5", + "@bruits/satteri-linux-arm64-gnu": "0.9.5", + "@bruits/satteri-linux-arm64-musl": "0.9.5", + "@bruits/satteri-linux-x64-gnu": "0.9.5", + "@bruits/satteri-linux-x64-musl": "0.9.5", + "@bruits/satteri-wasm32-wasi": "0.9.5", + "@bruits/satteri-win32-arm64-msvc": "0.9.5", + "@bruits/satteri-win32-x64-msvc": "0.9.5" + } + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", + "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.5.tgz", + "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.5.tgz", + "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.5.tgz", + "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.5.tgz", + "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.5.tgz", + "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.5.tgz", + "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.5.tgz", + "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.5.tgz", + "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@astrojs/telemetry": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", @@ -518,6 +871,39 @@ "node": ">= 20.12.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.1.tgz", + "integrity": "sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -971,6 +1357,55 @@ "node": ">=18" } }, + "node_modules/@expressive-code/core": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.2.tgz", + "integrity": "sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.2.tgz", + "integrity": "sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.2.tgz", + "integrity": "sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2", + "shiki": "^4.0.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.2.tgz", + "integrity": "sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1506,18 +1941,56 @@ "dev": true, "license": "MIT" }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", - "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" }, "funding": { "type": "github", @@ -1545,6 +2018,111 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", + "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", + "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@puppeteer/browsers": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.2.tgz", @@ -1968,6 +2546,23 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/braces": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", + "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -1995,6 +2590,13 @@ "@types/unist": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2005,6 +2607,30 @@ "@types/unist": "*" } }, + "node_modules/@types/mdx": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", + "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/micromatch": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.10.tgz", + "integrity": "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/braces": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/nlcst": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", @@ -2024,6 +2650,13 @@ "undici-types": "~8.3.0" } }, + "node_modules/@types/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -2048,6 +2681,29 @@ "dev": true, "license": "ISC" }, + "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/am-i-vibing": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", @@ -2061,6 +2717,22 @@ "am-i-vibing": "dist/cli.mjs" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", @@ -2138,6 +2810,27 @@ "node": ">= 0.4" } }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/astro": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.1.tgz", @@ -2223,6 +2916,20 @@ } } }, + "node_modules/astro-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.2.tgz", + "integrity": "sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.44.2", + "url-extras": "^0.1.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" + } + }, "node_modules/astro/node_modules/p-limit": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", @@ -2260,6 +2967,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/bcp-47": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", + "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2267,6 +3001,19 @@ "dev": true, "license": "ISC" }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -2278,6 +3025,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", @@ -2300,6 +3058,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -2402,6 +3171,17 @@ "node": ">=6" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2471,6 +3251,23 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -2498,6 +3295,19 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -2543,23 +3353,55 @@ "node": ">= 12" } }, - "node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "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" - } - }, + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", @@ -2603,8 +3445,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1666840.tgz", "integrity": "sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/diff": { "version": "9.0.0", @@ -2616,6 +3457,20 @@ "node": ">=0.3.1" } }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "dev": true, + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -2717,12 +3572,72 @@ "dev": true, "license": "MIT" }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/es-module-lexer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", @@ -2730,7 +3645,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -2776,6 +3690,117 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz", + "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", @@ -2783,6 +3808,19 @@ "dev": true, "license": "MIT" }, + "node_modules/expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.2.tgz", + "integrity": "sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2", + "@expressive-code/plugin-frames": "^0.44.2", + "@expressive-code/plugin-shiki": "^0.44.2", + "@expressive-code/plugin-text-markers": "^0.44.2" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2858,6 +3896,19 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-proc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.1.0.tgz", @@ -3014,509 +4065,2031 @@ "uncrypto": "^0.1.3" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "hast-util-is-element": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/highcharts": { - "version": "11.4.8", - "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-11.4.8.tgz", - "integrity": "sha512-5Tke9LuzZszC4osaFisxLIcw7xgNGz4Sy3Jc9pRMV+ydm6sYqsPYdU8ELOgpzGNrbrRNDRBtveoR5xS3SzneEA==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "dev": true, "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, "funding": { - "url": "https://github.com/sponsors/brc-dd" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-docker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=20" + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "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" + "@types/hast": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", "dev": true, "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], + "node_modules/hast-util-to-mdast": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", + "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "hast-util-to-text": "^4.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-minify-whitespace": "^6.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/highcharts": { + "version": "11.4.8", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-11.4.8.tgz", + "integrity": "sha512-5Tke9LuzZszC4osaFisxLIcw7xgNGz4Sy3Jc9pRMV+ydm6sYqsPYdU8ELOgpzGNrbrRNDRBtveoR5xS3SzneEA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", + "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "dev": true, + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-5.0.0.tgz", + "integrity": "sha512-sdJyNpBnQHuVnBunfzjAecOhZr2+A30ywfFvu3EnxtKLUWfwGgyWUmqHbGZiU6vTfHpCPm5GvLe4BAvlU9n8VQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.1.0.tgz", + "integrity": "sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz", + "integrity": "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/magic-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.1.0.tgz", - "integrity": "sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==", + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/marked": { - "version": "18.0.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz", - "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, - "license": "CC0-1.0" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "funding": [ { @@ -3530,14 +6103,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/micromark-util-encode": { + "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "funding": [ { @@ -3549,7 +6121,10 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", @@ -3573,6 +6148,29 @@ "micromark-util-symbol": "^2.0.0" } }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", @@ -3607,6 +6205,33 @@ ], "license": "MIT" }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -3634,6 +6259,13 @@ "node": ">=10" } }, + "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/nanoid": { "version": "3.3.18", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", @@ -3830,15 +6462,93 @@ "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "dev": true, + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/piccolore": { "version": "0.1.3", @@ -3895,6 +6605,46 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -3987,6 +6737,77 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", @@ -4004,16 +6825,273 @@ "dev": true, "license": "MIT", "dependencies": { - "regex-utilities": "^2.3.0" + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.2.tgz", + "integrity": "sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expressive-code": "^0.44.2" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-minify-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz", + "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-remark": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", + "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "hast-util-to-mdast": "^10.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", + "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -4024,6 +7102,39 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/retext-smartypants": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", @@ -4040,6 +7151,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rolldown": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", @@ -4225,59 +7352,432 @@ "sitemap": "dist/esm/cli.js" }, "engines": { - "node": ">=20.19.5", - "npm": ">=10.8.2" + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/sitemap/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/starlight-links-validator": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/starlight-links-validator/-/starlight-links-validator-0.25.3.tgz", + "integrity": "sha512-kNE2F8fwdq7r8l6Zx2nH3SDnLlVu2VRmbmyV/nSpbtWzf9+S81H2VBZ6GRevIKbm8qOoYSZvXzNATT8ZXw9bmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/markdown-satteri": "^0.3.2", + "@types/picomatch": "^4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "is-absolute-url": "^5.0.0", + "mdast-util-mdx-jsx": "^3.2.0", + "mdast-util-to-hast": "^13.2.1", + "picomatch": "^4.0.3", + "satteri": "^0.9.3", + "terminal-link": "^5.0.0", + "unist-util-visit": "^5.1.0", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.41.0", + "astro": ">=7.0.2" + } + }, + "node_modules/starlight-links-validator/node_modules/@astrojs/internal-helpers": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.4.tgz", + "integrity": "sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/starlight-links-validator/node_modules/@astrojs/markdown-satteri": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.8.tgz", + "integrity": "sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" + } + }, + "node_modules/starlight-links-validator/node_modules/@astrojs/markdown-satteri/node_modules/satteri": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", + "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" + } + }, + "node_modules/starlight-links-validator/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/starlight-links-validator/node_modules/satteri": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", + "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.5", + "@bruits/satteri-darwin-x64": "0.9.5", + "@bruits/satteri-linux-arm64-gnu": "0.9.5", + "@bruits/satteri-linux-arm64-musl": "0.9.5", + "@bruits/satteri-linux-x64-gnu": "0.9.5", + "@bruits/satteri-linux-x64-musl": "0.9.5", + "@bruits/satteri-wasm32-wasi": "0.9.5", + "@bruits/satteri-win32-arm64-msvc": "0.9.5", + "@bruits/satteri-win32-x64-msvc": "0.9.5" + } + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", + "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.5.tgz", + "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.5.tgz", + "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.5.tgz", + "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.5.tgz", + "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.5.tgz", + "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.5.tgz", + "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.5.tgz", + "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/sitemap/node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "node_modules/starlight-links-validator/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.5.tgz", + "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/smol-toml": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "node_modules/starlight-llms-txt": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/starlight-llms-txt/-/starlight-llms-txt-0.11.0.tgz", + "integrity": "sha512-83TU5zPgJhL9fXIWAOWjQjyQ6EKocshEjJyA4zOJjOqu/oxQsrTpYGYxjHLyfZe4LRD52N9eCuykSkaIYwUyDw==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" + "license": "MIT", + "dependencies": { + "@astrojs/mdx": "^7.0.0", + "@types/hast": "^3.0.4", + "@types/micromatch": "^4.0.10", + "github-slugger": "^2.0.0", + "hast-util-select": "^6.0.4", + "micromatch": "^4.0.8", + "rehype-parse": "^9.0.1", + "rehype-remark": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5", + "unist-util-remove": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" + "peerDependencies": { + "@astrojs/starlight": ">=0.41.0", + "astro": "^7.0.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/starlight-llms-txt/node_modules/@astrojs/internal-helpers": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.4.tgz", + "integrity": "sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "node_modules/starlight-llms-txt/node_modules/@astrojs/markdown-remark": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.4.tgz", + "integrity": "sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/starlight-llms-txt/node_modules/@astrojs/mdx": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.8.tgz", + "integrity": "sha512-RNuwq2ccTSi7NX9YqlR0noaWoVdOrZuJvdfWXotAzdhMVB0b0zEMLnNU+xar7le0GwTMlTObD/QAu8jeHA/3nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/markdown-remark": "7.2.4", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/markdown-satteri": "^0.3.1", + "astro": "^7.0.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-satteri": { + "optional": true + } } }, "node_modules/string-width": { @@ -4328,6 +7828,56 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.5.0.tgz", + "integrity": "sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, "node_modules/svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", @@ -4364,6 +7914,23 @@ "node": ">=16" } }, + "node_modules/terminal-link": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-5.0.0.tgz", + "integrity": "sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^4.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", @@ -4408,6 +7975,19 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -4419,6 +7999,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", + "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", @@ -4514,6 +8105,21 @@ "undici": "^8.0.0" } }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", @@ -4528,6 +8134,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", @@ -4542,6 +8163,51 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -4572,6 +8238,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", @@ -4694,6 +8374,26 @@ } } }, + "node_modules/url-extras": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", + "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -4709,6 +8409,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-message": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", @@ -4730,7 +8445,6 @@ "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -4823,6 +8537,17 @@ } } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/web-streams-polyfill": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", @@ -4933,6 +8658,22 @@ "node": ">=10" } }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", diff --git a/package.json b/package.json index edd5a4dd..f3ae1ae9 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@astrojs/sitemap": "^3.7.4", + "@astrojs/starlight": "^0.41.1", "astro": "^7.3.1", "ejs": "6.0.1", "fs-extra": "11.4.0", @@ -36,6 +37,8 @@ "node-fetch": "3.3.2", "puppeteer": "^25.10.0", "run-script-os": "1.1.6", + "starlight-links-validator": "^0.25.1", + "starlight-llms-txt": "^0.11.0", "web-vitals": "6.2.1", "xml-js": "1.6.11", "zod": "^4.4.3" diff --git a/public/sitemap.xml b/public/sitemap.xml index bf2e9a17..566164b0 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -3,7 +3,7 @@ https://httparchive.org/ - 2026-08-10 + 2026-09-14 @@ -11,9 +11,134 @@ 2026-07-02 + + https://httparchive.org/docs + 2026-09-14 + + + + https://httparchive.org/docs/guides/getting-started + 2026-09-14 + + + + https://httparchive.org/docs/guides/guided-tour + 2026-09-14 + + + + https://httparchive.org/docs/guides/minimizing-costs + 2026-09-14 + + + + https://httparchive.org/docs/guides/release-cycle + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/lighthouse + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/page-metadata + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/page-payload + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/page-summary + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/request-payload + 2026-09-14 + + + + https://httparchive.org/docs/reference/blobs/request-summary + 2026-09-14 + + + + https://httparchive.org/docs/reference/custom-metrics/ads + 2026-09-14 + + + + https://httparchive.org/docs/reference/custom-metrics/other + 2026-09-14 + + + + https://httparchive.org/docs/reference/custom-metrics/privacy + 2026-09-14 + + + + https://httparchive.org/docs/reference/functions/capo + 2026-09-14 + + + + https://httparchive.org/docs/reference/functions/get_host_categories + 2026-09-14 + + + + https://httparchive.org/docs/reference/functions/get_lcp_lazy + 2026-09-14 + + + + https://httparchive.org/docs/reference/functions/get_lcp_priority + 2026-09-14 + + + + https://httparchive.org/docs/reference/functions/get_origin + 2026-09-14 + + + + https://httparchive.org/docs/reference/structs/custom-metrics + 2026-09-14 + + + + https://httparchive.org/docs/reference/structs/feature + 2026-09-14 + + + + https://httparchive.org/docs/reference/structs/header + 2026-09-14 + + + + https://httparchive.org/docs/reference/structs/technology + 2026-09-14 + + + + https://httparchive.org/docs/reference/tables/pages + 2026-09-14 + + + + https://httparchive.org/docs/reference/tables/requests + 2026-09-14 + + https://httparchive.org/faq - 2026-06-29 + 2026-09-14 diff --git a/public/static/img/mag.png b/public/static/img/mag.png new file mode 100644 index 00000000..84ecb094 Binary files /dev/null and b/public/static/img/mag.png differ diff --git a/src/assets/mag.png b/src/assets/mag.png new file mode 100644 index 00000000..84ecb094 Binary files /dev/null and b/src/assets/mag.png differ diff --git a/src/components/Header.astro b/src/components/Header.astro index efac38e4..2c3f805a 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -54,7 +54,7 @@ const reports = getReports();
  • Contribute
  • Contact
  • FAQ
  • -
  • Docs
  • +
  • Docs
  • diff --git a/src/components/docs/Header.astro b/src/components/docs/Header.astro new file mode 100644 index 00000000..5fa0ca7b --- /dev/null +++ b/src/components/docs/Header.astro @@ -0,0 +1,318 @@ +--- +/** + * Starlight Header override. + * Renders the HTTP Archive site navbar + Starlight search. + * All styles are scoped — Bootstrap is NOT loaded, to avoid conflicts with Starlight's CSS. + */ +import type { Props } from '@astrojs/starlight/props'; +import Search from '@astrojs/starlight/components/Search.astro'; + +import { getReports, getReportUrl } from '../../utils/reports.js'; +const reports = getReports(); +--- + +
    +
    +
    + +
    + + + +
    + + +
    + + + + + + + +
    +
    +
    + + + +
    + + + + + + diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 00000000..a05db8c9 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content'; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/src/content/docs/docs/guides/bigquery-httparchive-pinned.png b/src/content/docs/docs/guides/bigquery-httparchive-pinned.png new file mode 100644 index 00000000..9a6bb0cd Binary files /dev/null and b/src/content/docs/docs/guides/bigquery-httparchive-pinned.png differ diff --git a/src/content/docs/docs/guides/bigquery-pages.png b/src/content/docs/docs/guides/bigquery-pages.png new file mode 100644 index 00000000..3c7cbd17 Binary files /dev/null and b/src/content/docs/docs/guides/bigquery-pages.png differ diff --git a/src/content/docs/docs/guides/bigquery-query-in-a-new-tab.png b/src/content/docs/docs/guides/bigquery-query-in-a-new-tab.png new file mode 100644 index 00000000..9a72173e Binary files /dev/null and b/src/content/docs/docs/guides/bigquery-query-in-a-new-tab.png differ diff --git a/src/content/docs/docs/guides/bigquery-run-sample-query.png b/src/content/docs/docs/guides/bigquery-run-sample-query.png new file mode 100644 index 00000000..56f7412f Binary files /dev/null and b/src/content/docs/docs/guides/bigquery-run-sample-query.png differ diff --git a/src/content/docs/docs/guides/bq-preview.webp b/src/content/docs/docs/guides/bq-preview.webp new file mode 100644 index 00000000..4d8b4a0c Binary files /dev/null and b/src/content/docs/docs/guides/bq-preview.webp differ diff --git a/src/content/docs/docs/guides/exploring_summary_pages_tables.png b/src/content/docs/docs/guides/exploring_summary_pages_tables.png new file mode 100644 index 00000000..2031ba24 Binary files /dev/null and b/src/content/docs/docs/guides/exploring_summary_pages_tables.png differ diff --git a/src/content/docs/docs/guides/getting-started.mdx b/src/content/docs/docs/guides/getting-started.mdx new file mode 100644 index 00000000..0cd7c72f --- /dev/null +++ b/src/content/docs/docs/guides/getting-started.mdx @@ -0,0 +1,247 @@ +--- +title: Getting started +description: Using HTTP Archive on BigQuery for the first time +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The [HTTP Archive](https://httparchive.org) is an open source project that tracks how the web is built. Historical data is provided to show how the web is constantly evolving, and the project is frequently used for research by the web community, scholars and industry leaders. If you are interested in digging into the HTTP Archive and are not sure where to start, then this guide should help you get started quickly. + +There are over 1 million pages tracked on desktop and emulated mobile in the most recent HTTP Archive data, and the historical data goes back to 2010. While the HTTP Archive website makes a lot of information available via [curated reports](https://httparchive.org/reports), analyzing the raw data is a powerful way of answering your questions about the web. + +All of the data collected by the HTTP Archive is available via [Google BigQuery](https://cloud.google.com/bigquery/). This makes analyzing the data easy because all of the storage and indexing is taken care of for you. And with the processing power behind BigQuery, even some of the most complex queries runs in seconds. + +This document is an update to [Ilya Grigorik's 2013 introduction](https://www.igvita.com/2013/06/20/http-archive-bigquery-web-performance-answers/), and walks you through everything you need to get started accessing BigQuery and analyzing the data. + +## Setting up BigQuery to Access the HTTP Archive + +In order to access the HTTP Archive via BigQuery, you'll need a Google account. To document this process for new visitors, this example uses a new Google account that has never logged into any Google Cloud services. + +1. Navigate to the [Google Cloud Projects Page](https://console.cloud.google.com/start) and log in with your Google account if prompted. If this is your first time accessing Google Cloud, you may be prompted to accept the terms of service. Once you are logged in, you'll see a page like this: + + ![Google Cloud Welcome](./google-cloud-welcome.png) + +2. Click **Select a project** and then **New Project**. This takes you to a New Project page. + + ![Google Cloud select project](./google-cloud-select-project.png) + +3. Give your project a name and then click the **Create** button. + + ![Create a Project](./google-cloud-create-new-project.png) + +4. Optional: Enable Billing by clicking on the Billing menu item and adding your billing information. + + :::note + BigQuery has a [free tier](https://cloud.google.com/bigquery/pricing#free-tier) that you can use to get started without enabling billing. At the time of this writing, the free tier allows 10GB of storage and 1TB of data processing per month. Google also provides a [$300 credit for new accounts](https://cloud.google.com/free/docs/frequently-asked-questions#free-trial). + ::: + +5. Navigate to the [BigQuery console](https://console.cloud.google.com/bigquery) where you should see your project, with no data. + +6. In order to add the HTTP Archive tables to your project, click on the **+ Add** button on top of the Explorer sidebar and choose the **Star a project by name** option from the side menu. + +7. Type in `httparchive` (case-sensitive) and click **STAR**. + +8. You should now see the HTTP Archive data set pinned: + + ![BigQuery HTTPArchive pinned](./bigquery-httparchive-pinned.png) + +9. Let's run a quick sample query to confirm access is all working. Navigate to the `crawl` dataset and select the `pages` table: + + ![BigQuery summary_pages tables](./bigquery-pages.png) + +10. Click on the **QUERY** button and select **In a new tab**: + + ![BigQuery Query in a new tab](./bigquery-query-in-a-new-tab.png) + +11. Change the query to take a small sample of the table (e.g. `SELECT *`), click the `RUN` button and you should see the results of your query. + + :::danger + The size of the tables you query are important because BigQuery is billed based on the number of processed data. There is 1TB of processed data included in the free tier, so running a full scan query on one of the larger tables can easily eat up your quota. This is where it becomes important to design queries that process only the data you wish to explore. + + HTTP Archive collecting metadata from millions of websites each month, an the dataset is _extremely large_—multiple petabytes. + + See the guide on [minimizing query costs](/docs/guides/minimizing-costs/) to learn more. + + Also, take a moment setting up [cost controls](https://cloud.google.com/bigquery/docs/custom-quotas) to be informed of the costs inqurred throughout the month. + ::: + + ```sql + SELECT * + FROM `httparchive.crawl.pages` TABLESAMPLE SYSTEM (0.00001 PERCENT) + WHERE date = "2024-05-01" + ``` + + ![BigQuery run a sample query](./bigquery-run-sample-query.png) + +In the next section, we explore the structure of these tables so you can start digging in! + +## Understanding how the tables are structured + +So, now you have access! But what do you have access to? + +In order to understand what each of these tables contain, you can click on the table name and view the details. For example, if you expand the `crawl` dataset and click on the `pages` table you can see the schema. Clicking **Details** tells you some information about the table, such as its size and the number of rows. Clicking **Preview** shows an example of some data from the table. + +![Table Preview](./exploring_summary_pages_tables.png) + +Some of the types of tables you'll find useful when getting started are described below. + +### HAR Tables + +The HTTP Archive stores detailed information about each page load in [HAR (HTTP Archive) files](https://en.wikipedia.org/wiki/.har). Each HAR file is JSON formatted and contains detailed performance data about a web page. The [specification for this format](https://w3c.github.io/web-performance/specs/HAR/Overview.html) is produced by the Web Performance Working Group of the W3C. The HTTP Archive splits each HAR file into multiple BigQuery tables, which are described below. + +* [`httparchive.crawl.pages`](/docs/reference/tables/pages/) - HAR extract for each page url. + +* [`httparchive.crawl.requests`](/docs/reference/tables/requests/) - HAR extract for each resource. + +You'll find JSON encoded HAR files for pages, requests, lighthouse reports and even response bodies! The table below outlines what these tables include. + +Table | Monthly Size (Oct 2024) | History Since +--|--|-- +crawl.pages | ~30 TB | June 2011 +crawl.requests | ~199 TB | June 2011 + +### Blink Features Tables + +* [`httparchive.blink_features.usage`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1shttparchive!2sblink_features!3susage): + + * Summary information about the [Blink features](https://chromestatus.com/roadmap) detected on each page. + * Table contains the number, percentage and samples of URLs for each feature. + * This data is also available in the HAR of the `pages` table but is extracted into the `blink_features` tables for easy lookup. + * This table is ~1 GB as of Oct 2024. + +## Some Example Queries to Get Started Exploring the Data + +The [HTTP Archive Discuss section](https://discuss.httparchive.org/) has lots of useful examples and discussion on how to analyze this data. + +Now that you are all set up, let's run some queries! Most HTTP Archive users start off examining the summary tables, so we'll start there as well. Below is a simple aggregate query that tells you how many URLs are contained in the latest HTTP Archive data. + + + +```sql +SELECT + COUNT(0) AS total_pages +FROM `httparchive.crawl.pages` +WHERE + date = "2024-06-01" AND + client = "desktop" AND + is_root_page +``` + + + + ![Simple Aggregate Query](./simple_agg_query_example.png) + + + + +Perhaps you want to JOIN the pages and requests tables together, and see how many page URLs and request URLs are in this data set. + + + +```sql +SELECT + COUNT(DISTINCT pages.page) AS total_pages, + COUNT(0) AS total_requests +FROM `httparchive.crawl.pages` pages +INNER JOIN `httparchive.crawl.requests`requests +ON pages.page = requests.page +WHERE + pages.date = "2024-06-01" AND + requests.date = "2024-06-01" AND + pages.client = "desktop" AND + requests.client = "desktop" AND + pages.is_root_page AND + requests.is_root_page +``` + + + + ![Simple JOIN Job Information](./simple_join_example.png) + + + +When we look at the results of this, you can see how much data was processed during this query. Writing efficient queries limits the number of bytes processed - which is helpful since that's how BigQuery is billed. + +:::note +There is [1TB free per month](https://cloud.google.com/bigquery/pricing#on_demand_pricing). +::: + +If you look closely, you'll notice that this particular query could actually be written without the JOIN. For example, we can count `DISTINCT page` from the `requests` table instead of JOINing the `pages` table. If you run this query, you'll notice that the results are the same as the previous query, and the processed bytes are a bit less. + +```sql +SELECT + COUNT(DISTINCT page) total_pages, + COUNT(0) total_requests +FROM `httparchive.crawl.requests` +WHERE + date = "2024-06-01" AND + client = "desktop" AND + is_root_page +``` + +Next let's summarize all of the HTTP requests by a type, and the number of pages that contain at least one request of that type. In the example below, you can see that I added `type` to the SELECT clause, added a GROUP clause and sorted the results by types that have the most requests. + + + +```sql +SELECT + type, + COUNT(DISTINCT page) total_pages, + COUNT(0) total_requests +FROM `httparchive.crawl.requests` +WHERE + date = "2024-06-01" AND + client = "desktop" AND + is_root_page +GROUP BY type +ORDER BY total_requests DESC +``` + + + ![Simple JOIN Example](./type_summary_example_query.png) + + + +Now things are starting to get interesting. So let's try to learn something from this basic example. We know from the first example that there are 12.7 million URLs in the latest HTTP Archive dataset. Let's calculate the percent of pages that have each resource type. To do this, we'll divide the number of pages by the total pages (using our first query as a subquery). Then we'll use a `ROUND()` function to trim the result to 2 decimal points. + + + +```sql +WITH requests AS ( + SELECT + type, + page, + COUNT(0) OVER () AS requests_total, + COUNT(DISTINCT page) OVER () AS pages_total, + FROM `httparchive.crawl.requests` + WHERE + date = "2024-06-01" AND + client = "desktop" AND + is_root_page +) + +SELECT + type, + COUNT(DISTINCT page) AS pages_total, + ANY_VALUE(requests_total) AS requests_total, + ROUND(COUNT(DISTINCT page) / ANY_VALUE(pages_total), 2) AS pages_percent +FROM requests +GROUP BY type +ORDER BY pages_percent DESC +``` + + + ![Simple JOIN Example](./type_summary_example_query2.png) + + + +When analyzing the results from this, you can see the % of websites that use different resource types. You can see that: + +* 100% of sites have HTML and at least one image, +* 97% have at least 1 script resource, +* 96% load at least 1 CSS style, +* and 87% load fonts on their homepage, etc. + +To explore more interactive examples, read the [Guided Tour](/docs/guides/guided-tour/). + +If you want to explore deeper you have everything you need - infrastructure, documentation, community. Enjoy exploring this data and feel free to share your results and ask questions on the [HTTP Archive Discuss section](https://discuss.httparchive.org/). diff --git a/src/content/docs/docs/guides/google-cloud-create-new-project.png b/src/content/docs/docs/guides/google-cloud-create-new-project.png new file mode 100644 index 00000000..42348401 Binary files /dev/null and b/src/content/docs/docs/guides/google-cloud-create-new-project.png differ diff --git a/src/content/docs/docs/guides/google-cloud-select-project.png b/src/content/docs/docs/guides/google-cloud-select-project.png new file mode 100644 index 00000000..3d276d9a Binary files /dev/null and b/src/content/docs/docs/guides/google-cloud-select-project.png differ diff --git a/src/content/docs/docs/guides/google-cloud-welcome.png b/src/content/docs/docs/guides/google-cloud-welcome.png new file mode 100644 index 00000000..3fcfd167 Binary files /dev/null and b/src/content/docs/docs/guides/google-cloud-welcome.png differ diff --git a/src/content/docs/docs/guides/guided-tour.mdx b/src/content/docs/docs/guides/guided-tour.mdx new file mode 100644 index 00000000..ae0bbc81 --- /dev/null +++ b/src/content/docs/docs/guides/guided-tour.mdx @@ -0,0 +1,27 @@ +--- +title: Guided Tour +description: HTTP Archive data analysis in BigQuery +--- + + +The HTTP Archive contains a tremendous amount of information that can be used to understand the evolution of the web. And since the raw data is available in Google BigQuery, you can start digging into it with a minimal amount of setup! + +If you are new to BigQuery, then the [Getting Started guide](/docs/guides/getting-started/) will walk you through the basic setup. That guide ends with a sample query that explores MIME types from the `pages` tables. In this guide, we'll explore more of the tables and build additional queries that you can learn from. The easiest way to get started is by following along, testing some of the queries and learning from them. If you need any help then there is plenty of support available from the community at [https://discuss.httparchive.org](https://discuss.httparchive.org). + +**Prerequisites:** + +- This guide assumes that you've completed the setup from the [Getting Started guide](/docs/guides/getting-started/). +- You would be safe processing extremely-large tables contained in this dataset if you follow the [minimizing query costs guide](/docs/guides/minimizing-costs/). +- It also assumes some familiarity with [Google SQL](https://docs.cloud.google.com/bigquery/docs/introduction-sql). + +This guide is split into multiple sections, each one focusing on different tables in the HTTP Archive. Each section builds on top of the previous one: + +1. [Exploring the `httparchive.crawl.pages` tables](https://colab.research.google.com/github/HTTPArchive/httparchive.org/blob/main/workbooks/exploring_httparchive-all-pages_tables.ipynb) +2. [Exploring the `httparchive.crawl.requests` tables](https://colab.research.google.com/github/HTTPArchive/httparchive.org/blob/main/workbooks/exploring_httparchive-all-requests_tables.ipynb) +3. [JOINing `pages` and `requests` tables](https://colab.research.google.com/github/HTTPArchive/httparchive.org/blob/main/workbooks/exploring_pages_and_requests_tables_joined.ipynb) + +:::caution +HTTP Archive uses clustered tables. BigQuery [doesn't guarantee](https://cloud.google.com/bigquery/docs/clustered-tables#clustered_table_pricing:~:text=BigQuery%20might%20not%20be%20able%20to%20accurately%20estimate%20the%20bytes%20to%20be%20processed) accuracy of estimations for bytes to be processed when querying clustered tables. For your information the actual bytes processed amount is provided in a comment for each query. + +Please also read [Minimizing query costs](/docs/guides/minimizing-costs/) for more details on the topic. +::: diff --git a/src/content/docs/docs/guides/minimizing-costs.md b/src/content/docs/docs/guides/minimizing-costs.md new file mode 100644 index 00000000..bc7181ad --- /dev/null +++ b/src/content/docs/docs/guides/minimizing-costs.md @@ -0,0 +1,189 @@ +--- +title: Minimizing query costs +description: Practical tips for minimizing the cost of querying the HTTP Archive dataset +--- + +The HTTP Archive dataset is large and complex, and it's easy to write queries that are slow and expensive. All BigQuery users have a free quota of 1 TB per month. To stretch your free quota as far as possible, you'll want to minimize the amount of data that your queries scan. This guide provides some practical tips for minimizing the cost of querying the HTTP Archive dataset. + +## Use cluster columns + +Table | Partitioned by | Clustered by +--- | --- | --- +`httparchive.crawl.pages` | `date` | 1.`client`
    2.`is_root_page`
    3.`rank`
    4.`page` +`httparchive.crawl.requests` | `date` | 1.`client`
    2.`is_root_page`
    3.`type`
    4.`rank` + +For example, the `httparchive.crawl.pages` table is [partitioned](https://cloud.google.com/bigquery/docs/partitioned-tables) by `date` and [clustered](https://cloud.google.com/bigquery/docs/clustered-tables) by the `client`, `is_root_page`, `rank` and `page` columns, which means that queries that filter on these columns will be much faster and cheaper than queries that don't. + +:::caution +[Cluster column ordering](https://docs.cloud.google.com/bigquery/docs/clustered-tables#cluster_column_ordering) is important. BigQuery can take full advantage of clustering if the query filters on the clustered columns in the order they are defined. For example, a query that filters on `client` and `is_root_page` will be able to take full advantage of clustering, but a query that filters on `page` will not be able to take full advantage (but will still be considerably quicker/cheaper than a query that does not use any clustered columns). +BigQuery [doesn't guarantee](https://cloud.google.com/bigquery/docs/clustered-tables#clustered_table_pricing:~:text=BigQuery%20might%20not%20be%20able%20to%20accurately%20estimate%20the%20bytes%20to%20be%20processed) accuracy of estimations for 'Bytes processed' when querying clustered tables ([Issue Link](https://issuetracker.google.com/issues/176795805)). The actual data volume may be smaller than the amount provided in the estimate. +::: + +:::tip +Filter by the top 1k websites. This is the smallest rank bucket and will result in the smallest sample of data being scanned. + +```sql +SELECT + page +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + rank <= 1000 +``` + +::: + +:::tip +Use the `type` column for `requests` table as often you may only be interested in `html` and `script` contents but not `css` for example. + +```sql +SELECT + page +FROM + `httparchive.crawl.requests` +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + rank <= 1000 AND + type IN ('html', 'script') +``` + +This is particularly relevant if using the `response_bodies` or `payload` columns. But these are large columns so try to avoid using them where at all possible. Also note that binary response bodies (e.g. images and fonts) are not stored, so these are mostly `html`, `script`, and `css` so selecting all three of those will not save much. +::: + +## Use the `RECORD` columns + +Some of our columns in the table are structured `RECORD` columns. When querying these you only pay for the costs of the records needed. + +```sql +SELECT + custom_metrics +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + rank <= 1000 +``` + +This query will process 329 MB when run as it's looking at all the custom_metrics. + +However, the same query looking at just the `a11y` custom metrics is much cheaper at 10 MB: + +```sql +SELECT + custom_metrics.a11y +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + rank <= 1000 +``` + +## Use `TABLESAMPLE` + +The `TABLESAMPLE` clause allows you to sample a table without scanning the entire table. This is useful for getting a rough idea of the data in a table before running a more expensive query. + +For example, without `TABLESAMPLE`: + +```sql +SELECT + custom_metrics.other.avg_dom_depth +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' +``` + +This query will process 6.56 TB when run. + +However, the same query with `TABLESAMPLE` at 0.01% is much cheaper: + +```sql +SELECT + custom_metrics.other.avg_dom_depth +FROM + `httparchive.crawl.pages` TABLESAMPLE SYSTEM (0.01 PERCENT) +WHERE + date = '2023-05-01' AND + client = 'desktop' +``` + +This query will only process 680.01 MB when run. + +The 0.01% of rows that are sampled are chosen randomly, so the results of the query will be different each time it's run. + +:::danger +## Don't rely on LIMIT +Don't rely on the `LIMIT` clause to reduce the amount of data scanned. `LIMIT` is applied after the query is run, so the entire table will still be scanned. + +For example, this query still processes 6.56 TB: + +```sql +SELECT + custom_metrics.other.avg_dom_depth +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' +LIMIT + 1 +``` + +::: + +## Use RANK + +An alternative to `TABLESAMPLE`, to get a consistent set of data returning for a subset of data, is to use the `rank` column as mentioned previously. For the top 1,000 or even 10,000 sites: + +```sql +SELECT + custom_metrics.other.avg_dom_depth +FROM + `httparchive.crawl.pages` +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + rank <= 1000 +``` + +While this constency is an advantage over `TABLESAMPLE`, annoyingly due to the [previously mentioned bug](https://issuetracker.google.com/issues/176795805), using `rank` will not give an accurate estimate, while `TABLESAMPLE` will. So it can be a bit more of a leap of faith using `rank`. + +To get around that you can use the `sample_data` dataset. + +## Use the `sample_data` dataset + +The `sample_data` dataset contains 10k subsets of the full pages and requests tables. These tables are useful for testing queries before running them on the full dataset, without the risk of incurring a large query cost. + +Table names correspond to their full-size counterparts of the form `[table]_10k` for `crawl.pages` and `crawl.requests` tables. For example, to query the summary data for the subset of 10k pages, you would use the `httparchive.sample_data.pages_10k` table. + +In reality as `rank` is part of the clustering of the tables you don't need to use the `sample_data` dataset. However, due to inaccurate estimates mentioned above, the `sample_data` dataset is safer since it only contains 10,000 pages so even with inaccurate estimates it will be smaller than the full `crawl` dataset. + +## Whether to use `TABLESAMPLE`, `rank`, or `sample_data` + +This comes down largely to a matter of personal preference. Each has their advantage and disadvantage. + +Advantage|`TABLESAMPLE`|`rank`|`sample_data` +----|---|---|--- +Consistency of results returned|❌|✅|✅ (if run in same month) +Accurate estimates|✅|❌|✅ +Ease of commenting out for full run|✅|✅|❌ +Allows querying of any months|✅|✅|❌ (previous month only) +Allows variable sample size|✅|✅|❌ + +If they ever fix the estimate bug then `rank` will be a clear winner. Until then use whatever works for you! + +## Use table previews + +BigQuery allows you to preview entire rows of a table without incurring a query cost. This is useful for getting a rough idea of the data in a table before running a more expensive query. + +![Preview tab on BigQuery](./bq-preview.webp) + +To access the preview, click on a table name from the workspace explorer and select the **Preview** tab. + +Note that generating the preview may be slow for these tables as they include large payloads. Also note that the text values are truncated by default, so you will need to expand the field to get the full value. diff --git a/src/content/docs/docs/guides/release-cycle.mdx b/src/content/docs/docs/guides/release-cycle.mdx new file mode 100644 index 00000000..c45eaba3 --- /dev/null +++ b/src/content/docs/docs/guides/release-cycle.mdx @@ -0,0 +1,31 @@ +--- +title: The HTTP Archive release cycle +description: Learn about the process of testing millions of web pages each month +--- + +The HTTP Archive dataset is updated each month with data from millions of web pages. This guide explores the end-to-end release cycle from sourcing URLs to publishing results to BigQuery. + +[](https://www.plantuml.com/plantuml/uml/RL5DRnCn4BtxLppr60aaEFQ0Aie9eHAQ5BXExEckXMCRUvme5tuxpdgtkrNNKYpvPTxi-xZBGadAqIb3GWVAZFlqz5l5Ybfj8tcf09qTfrVOraPsrZCeu-PBfRuWDujDBXIpav2eQuC3W8RKGHsSOoqs-8n7ZY59dicVRVUZSBeezH244KwS1cctAB4EiK7m-EWDzeMpeGl2CwHd78ENNgbHzBjFZRCB9Udc3K-Ftx8YBVP4mY_kK8-QJApHZYp9wWLp6bOBscZZ5jjoS3Rtk0-9yOiF-6c5NCQUTU-32zq5QPXLXjziR6Aw54fi-l2tS66OakWQ5_xX0yxCVuP15q94v8G3YUwlEKJgE2kCPuvYqKVrHgT1sRQ-zfm5ShqIv-8au-lk-yFR3LCfZVsQORq4PA7E-WwrH3TAO6zK_IqgcMpYTdJtR7tDYatpRNYzd9R7sKflFGYrym5VJszwp9hdJWm9GG8scruaKjAzFV5xVVtMPZFycrdcBUl5jlQQnPKA1yjtzIf7zny0) +![Release cycle diagram](./release_cycle_diagram.png) + +## Sourcing URLs + +The pages HTTP Archive tests are ultimately sourced from the [Chrome UX Report](https://developer.chrome.com/docs/crux/) (CrUX) dataset. CrUX is a public dataset that contains anonymized, aggregated metrics about real-world Chrome users' experiences on popular destinations on the web. HTTP Archive takes the _origins_ in the public CrUX dataset and classifies them as either desktop and mobile. Origins are segmented by desktop or mobile depending on the [`form_factor`](https://developer.chrome.com/docs/crux/methodology/#form-factor-dimension) dimension in the CrUX schema, which corresponds to the actual device type real visitors used to access the website. + +CrUX also includes origins without any distinct form factor data. HTTP Archive classifies these origins as _both_ desktop and mobile. + +## Running the crawl + +Previously, HTTP Archive would start testing each web page (the crawl) on the first of the month. Now, to be in closer alignment with the upstream CrUX dataset, HTTP Archive starts testing pages as soon as the CrUX dataset is available on the second Tuesday of each month. Crawl dates are always rounded down to the first of the month, regardless of which day they actually started. For example, the June 2023 crawl kicks off on the 13th of the month, but the dataset would be accessible on BigQuery under the date `2023-06-01`. + +:::note +As of [May 2023](https://httparchive.org/reports/state-of-the-web?start=2023_04_01&end=2023_05_01&view=list#numUrls) there are 16.6 million mobile pages and 12.8 million desktop pages. It takes 1–2 weeks to test all of these pages, so the crawl is usually complete in the second half of the month. +::: + +## Publishing the raw data + +As each page's test results are completed, the raw data is saved to a public Google Cloud Storage bucket. Once the crawl is complete, the data is processed and published to BigQuery. The `httparchive.crawl` dataset is available to the public for analysis. + +## Generating reports + +The reports on the [HTTP Archive website](https://httparchive.org/reports) and auxilliary ones like the [Core Web Vitals Technology Report](https://httparchive.org/reports/techreport/landing) are automatically generated as soon as the data is available in BigQuery. diff --git a/src/content/docs/docs/guides/release_cycle_diagram.png b/src/content/docs/docs/guides/release_cycle_diagram.png new file mode 100644 index 00000000..ebf7a992 Binary files /dev/null and b/src/content/docs/docs/guides/release_cycle_diagram.png differ diff --git a/src/content/docs/docs/guides/simple_agg_query_example.png b/src/content/docs/docs/guides/simple_agg_query_example.png new file mode 100644 index 00000000..a5dfccaa Binary files /dev/null and b/src/content/docs/docs/guides/simple_agg_query_example.png differ diff --git a/src/content/docs/docs/guides/simple_join_example.png b/src/content/docs/docs/guides/simple_join_example.png new file mode 100644 index 00000000..b8f025d1 Binary files /dev/null and b/src/content/docs/docs/guides/simple_join_example.png differ diff --git a/src/content/docs/docs/guides/type_summary_example_query.png b/src/content/docs/docs/guides/type_summary_example_query.png new file mode 100644 index 00000000..72177900 Binary files /dev/null and b/src/content/docs/docs/guides/type_summary_example_query.png differ diff --git a/src/content/docs/docs/guides/type_summary_example_query2.png b/src/content/docs/docs/guides/type_summary_example_query2.png new file mode 100644 index 00000000..ece286f9 Binary files /dev/null and b/src/content/docs/docs/guides/type_summary_example_query2.png differ diff --git a/src/content/docs/docs/index.mdx b/src/content/docs/docs/index.mdx new file mode 100644 index 00000000..64cdbaa0 --- /dev/null +++ b/src/content/docs/docs/index.mdx @@ -0,0 +1,40 @@ +--- +title: Docs +description: Learn how the HTTP Archive (HAR) dataset works and how to use it to explore the state of the web. +template: splash +hero: + tagline: A new reference doc for the HTTP Archive dataset + image: + file: ../../../assets/mag.png + actions: + - text: Get started + link: /docs/guides/getting-started/ + icon: right-arrow + variant: primary + - text: Contribute on GitHub + link: https://github.com/HTTPArchive/httparchive.org + icon: external + variant: minimal +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## Next steps + + + + Learn how to start [querying HTTP Archive on BigQuery](/docs/guides/getting-started/) + + + Learn about the [`pages`](/docs/reference/tables/pages/) table + + + Contribute to the project on [GitHub](https://github.com/HTTPArchive/httparchive.org) + + + See [httparchive.org](https://httparchive.org/) + + + Start a thread on the [HTTP Archive discussion forum](https://discuss.httparchive.org/) + + diff --git a/src/content/docs/docs/reference/blobs/lighthouse.mdx b/src/content/docs/docs/reference/blobs/lighthouse.mdx new file mode 100644 index 00000000..b1f6eb98 --- /dev/null +++ b/src/content/docs/docs/reference/blobs/lighthouse.mdx @@ -0,0 +1,11 @@ +--- +title: Lighthouse blob +description: Reference docs for the Lighthouse blob +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As: [`lighthouse`](/docs/reference/tables/pages/#lighthouse)_ + +JSON-encoded blob of Lighthouse data for the page. + +**The actual schema of the Lighthouse object is liable to change depending on the page and Lighthouse version. See the [Lighthouse documentation](https://github.com/GoogleChrome/lighthouse/blob/main/docs/understanding-results.md) for the most up-to-date information.** diff --git a/src/content/docs/docs/reference/blobs/page-metadata.mdx b/src/content/docs/docs/reference/blobs/page-metadata.mdx new file mode 100644 index 00000000..44fd6ed0 --- /dev/null +++ b/src/content/docs/docs/reference/blobs/page-metadata.mdx @@ -0,0 +1,94 @@ +--- +title: Page metadata blob +description: Reference docs for the HAR page metadata blob +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As: [`metadata`](/docs/reference/tables/pages/#metadata)_ + +JSON-encoded HTTP Archive metadata about the page that was tested. + +
    +An example of the decoded object +```json +{ + "crawl_depth": 1, + "layout": "Desktop", + "link_depth": 0, + "parent_page_test_id": "241008_Dx133_8DPZ7", + "parent_page_url": "https://httparchive.org/", + "rank": 5000000, + "retry_count": 0, + "root_page_test_id": "241008_Dx133_8DPZ7", + "root_page_url": "https://httparchive.org/", + "tested_url": "https://httparchive.org/faq", + "visited": [ + "https://httparchive.org/", + "https://httparchive.org/faq" + ] +} +``` +
    + +## Schema + +### `crawl_depth` + +Levels of depth from the root page. HTTP Archive is currently configured to crawl one level into a website, so this value will always be `0` or `1`. + +A value of `0` means that the page is the root page. A value of `1` means that the page is an _interior_ or _secondary page_. + +When a root page is being tested, secondary page candidates are collected using the [`crawl-links`](https://github.com/HTTPArchive/custom-metrics/blob/main/dist/crawl_links.js) custom metric. The criteria for candidate pages are: + +- The page is linked from the root page +- The page is on the same origin as the root page +- The page is not the same as the root page +- The link to the page is visible within the viewport + +From the list of candidates, the link with the largest hit area is selected to be tested next. If that test fails, the next largest link is used. + +### `layout` + +Whether the page was tested in a desktop or mobile environment. Values are `"Desktop"` or `"Mobile"`. + +### `link_depth` + +At a given crawl depth, this value represents the index in the list of pages being tested. Currently, HTTP Archive only crawls one page per level, so this value is always `0`. + +Hypothetically, HTTP Archive can crawl multiple pages per level. For example, at crawl depth `0`, the page is the root. Given that there's only one root page, the `link_depth` would be `0`. At crawl depth `1`, there may be many secondary page candidates. Instead of testing only one of them, HTTP Archive could test multiple secondary pages that are all linked from the root page. These pages would have a `link_depth` of `0`, `1`, `2`, etc, where the smaller indexes represent the pages that are more prominently linked from the preceding page. + +### `parent_page_test_id` + +The test ID of the parent page. This is useful for debugging purposes. + +### `parent_page_url` + +URL of the parent page. + +### `rank` + +The rank magnitude of the origin, which is a measure of relative popularity. + +For example, the page `https://www.example.com/` has a rank of `500000`, which means that the `https://www.example.com` website is in the top 500k most popular, according to the [Chrome UX Report](https://developer.chrome.com/docs/crux/methodology/#popularity-metric). + +### `retry_count` + +The number of times the page was retried. This is useful for debugging purposes. + +### `root_page_test_id` + +The test ID of the root page. + +### `root_page_url` + +URL of the root page. + +### `tested_url` + +The actual URL of the page that was intended to be tested. + +This is useful when there may be ambiguity caused by redirects or known issues where the certificate request appears before the page itself. + +### `visited` + +An array of URLs that were visited during the test. This includes the root page and any secondary pages that were tested. diff --git a/src/content/docs/docs/reference/blobs/page-payload.mdx b/src/content/docs/docs/reference/blobs/page-payload.mdx new file mode 100644 index 00000000..9a9adadd --- /dev/null +++ b/src/content/docs/docs/reference/blobs/page-payload.mdx @@ -0,0 +1,1244 @@ +--- +title: Page payload blob +description: Reference docs for the page payload blob +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As: [`payload`](/docs/reference/tables/pages/#payload)_ + +JSON-encoded WebPageTest result data for a page. + +
    +An example of the decoded object +```json +{ + "_LargestContentfulPaintNodeType": "P", + "_LargestContentfulPaintType": "text", + "_LastInteractive": 400, + "_PerformancePaintTiming.first-contentful-paint": 314.80000000447035, + "_PerformancePaintTiming.first-paint": 314.80000000447035, + "_SpeedIndex": 400, + "_TTFB": 232, + "_TTIMeasurementEnd": 3452, + "_URL": "https://www.example.com/", + "_aft": 0, + "_audit_issues": [ + { + "code": "QuirksModeIssue", + "details": { + "quirksModeIssueDetails": { + "documentNodeId": 2, + "frameId": "E021D0149DE3689992ECE4DF4B0ECA38", + "isLimitedQuirksMode": false, + "loaderId": "67DD39DE1A5C91FCB7B25B32EB8F7231", + "url": "http://127.0.0.1:8888/orange.html" + } + } + } + ], + "_basePageSSLTime": 98, + "_base_page_cdn": "Edgecast", + "_base_page_cname": "", + "_base_page_dns_server": "a.iana-servers.net", + "_base_page_ip_ptr": "", + "_browserVersion": "128.0.0.0", + "_browser_name": "Chrome", + "_browser_version": "128.0.0.0", + "_bytesIn": 1296, + "_bytesInDoc": 1296, + "_bytesOut": 4112, + "_bytesOutDoc": 4112, + "_cached": 0, + "_chromeUserTiming": [ + { + "name": "navigationStart", + "time": 39 + }, + ... + ], + "_chromeUserTiming.CumulativeLayoutShift": 0, + "_chromeUserTiming.LargestContentfulPaint": 354, + "_chromeUserTiming.LargestTextPaint": 354, + "_chromeUserTiming.TotalLayoutShift": 0, + "_chromeUserTiming.commitNavigationEnd": 285, + "_chromeUserTiming.domComplete": 320, + "_chromeUserTiming.domContentLoadedEventEnd": 320, + "_chromeUserTiming.domContentLoadedEventStart": 320, + "_chromeUserTiming.domInteractive": 320, + "_chromeUserTiming.domLoading": 285, + "_chromeUserTiming.fetchStart": 48, + "_chromeUserTiming.firstContentfulPaint": 354, + "_chromeUserTiming.firstMeaningfulPaint": 354, + "_chromeUserTiming.firstMeaningfulPaintCandidate": 354, + "_chromeUserTiming.firstPaint": 354, + "_chromeUserTiming.loadEventEnd": 320, + "_chromeUserTiming.loadEventStart": 320, + "_chromeUserTiming.markAsMainFrame": 284, + "_chromeUserTiming.navigationStart": 74, + "_chromeUserTiming.responseEnd": 277, + "_chromeUserTiming.unloadEventEnd": 284, + "_chromeUserTiming.unloadEventStart": 284, + "_connections": 1, + "_consoleLog": [ + { + "level": "error", + "networkRequestId": "344808.2", + "source": "network", + "text": "Failed to load resource: the server responded with a status of 404 ()", + "timestamp": 1726370503561.599, + "url": "https://www.example.com/favicon.ico" + } + ], + "_cpu.CommitLoad": 0, + "_cpu.EventDispatch": 0, + "_cpu.FunctionCall": 0, + "_cpu.HTMLDocumentParser::FetchQueuedPreloads": 0, + "_cpu.Idle": 302, + "_cpu.Layerize": 0, + "_cpu.Layout": 18, + "_cpu.MarkDOMContent": 0, + "_cpu.MarkLoad": 0, + "_cpu.Paint": 0, + "_cpu.ParseHTML": 2, + "_cpu.PrePaint": 0, + "_cpu.ResourceFetcher::requestResource": 0, + "_cpu.UpdateLayoutTree": 0, + "_cpu.V8.GC_TIME_TO_SAFEPOINT": 0, + "_cpu.largestContentfulPaint::Candidate": 0, + "_cpuTimes": { + "CommitLoad": 0, + "EventDispatch": 0, + "FunctionCall": 0, + "HTMLDocumentParser::FetchQueuedPreloads": 0, + "Idle": 302, + "Layerize": 0, + "Layout": 18, + "MarkDOMContent": 0, + "MarkLoad": 0, + "Paint": 0, + "ParseHTML": 2, + "PrePaint": 0, + "ResourceFetcher::requestResource": 0, + "UpdateLayoutTree": 0, + "V8.GC_TIME_TO_SAFEPOINT": 0, + "largestContentfulPaint::Candidate": 0 + }, + "_cpuTimesDoc": { + "CommitLoad": 0, + "EventDispatch": 0, + "FunctionCall": 0, + "HTMLDocumentParser::FetchQueuedPreloads": 0, + "Idle": 299, + "Layerize": 0, + "Layout": 18, + "MarkDOMContent": 0, + "MarkLoad": 0, + "Paint": 0, + "ParseHTML": 2, + "PrePaint": 0, + "ResourceFetcher::requestResource": 0, + "UpdateLayoutTree": 0, + "V8.GC_TIME_TO_SAFEPOINT": 0, + "largestContentfulPaint::Candidate": 0 + }, + "_date": 1726370503.1648238, + "_docTime": 320, + "_document_URL": "https://www.example.com/", + "_document_hostname": "www.example.com", + "_document_origin": "https://www.example.com", + "_domComplete": 281, + "_domContentLoadedEventEnd": 280, + "_domContentLoadedEventStart": 280, + "_domElements": 12, + "_domInteractive": 280, + "_domLoading": 0, + "_domTime": 0, + "_edge-processed": true, + "_effectiveBps": 14727, + "_eventName": "Step_1", + "_execution_contexts": [ + { + "id": 1, + "name": "", + "origin": "https://www.example.com" + }, + ... + ], + "_final_base_page_request": 0, + "_final_base_page_request_id": "44714C6F6C72B045136D19CA9894886A", + "_final_url": "https://www.example.com/", + "_firstContentfulPaint": 354, + "_firstMeaningfulPaint": 354, + "_firstPaint": 314.80000000447035, + "_fullyLoaded": 323, + "_fullyLoadedCPUms": 610, + "_fullyLoadedCPUpct": 9.41358024700691, + "_gzip_savings": 0, + "_gzip_total": 648, + "_image_savings": 0, + "_image_total": 0, + "_interactivePeriods": [[0, 3452]], + "_largestPaints": [ + { + "DOMNodeId": 3, + "event": "LargestTextPaint", + "nodeInfo": { + "bounds": [660, 192.875, 600, 57], + "nodeType": "P", + "styles": { + "background-image": "none" + } + }, + "size": 33858, + "time": 354 + } + ], + "_lastVisualChange": 400, + "_lighthouse.Accessibility": 0.88, + "_lighthouse.BestPractices": 0.96, + "_lighthouse.Performance": 1, + "_lighthouse.Performance.cumulative-layout-shift": 0, + "_lighthouse.Performance.first-contentful-paint": 329.542, + "_lighthouse.Performance.largest-contentful-paint": 329.542, + "_lighthouse.Performance.speed-index": 322, + "_lighthouse.Performance.total-blocking-time": 0, + "_lighthouse.SEO": 0.9, + "_loadEventEnd": 281, + "_loadEventStart": 281, + "_loadTime": 320, + "_main_frame": "E021D0149DE3689992ECE4DF4B0ECA38", + "_minify_savings": -1, + "_minify_total": -1, + "_optimization_checked": 1, + "_origin_dns": { + "cname": [], + "https": [], + "mx": ["0 ."], + "ns": [ + "a.iana-servers.net.", + "b.iana-servers.net." + ], + "soa": [ + "ns.icann.org. noc.dns.icann.org. 2024081420 7200 3600 1209600 3600" + ], + "svcb": [], + "txt": [ + "\"v=spf1 -all\"", + "\"wgyf8z8cgvm2qmxpnbnldrcltvk4xqfn\"" + ] + }, + "_osPlatform": "x86_64 x86_64", + "_osVersion": "Linux 6.8.0-1014-gcp", + "_os_version": "Linux 6.8.0-1014-gcp", + "_render": 400, + "_renderBlockingCSS": 0, + "_renderBlockingJS": 0, + "_requests": 2, + "_requestsDoc": 2, + "_requestsFull": 2, + "_responses_200": 1, + "_responses_404": 1, + "_responses_other": 0, + "_result": 99999, + "_run": 1, + "_score_cache": -1, + "_score_cdn": 100, + "_score_combine": -1, + "_score_compress": -1, + "_score_cookies": -1, + "_score_etags": -1, + "_score_gzip": 100, + "_score_keep-alive": 100, + "_score_minify": -1, + "_score_progressive_jpeg": -1, + "_server_rtt": 0, + "_start_epoch": 1726370501.1809506, + "_step": 1, + "_testID": "240912_Dx1XE_EVGML", + "_testStartOffset": 0, + "_testUrl": "https://www.example.com/", + "_test_run_time_ms": 5850, + "_tester": "agents-west-1-kl42-10.138.2.146", + "_titleTime": 76, + "_v8Stats": { + "background": {}, + "main_thread": {} + }, + "_viewport": { + "dpr": 1, + "height": 993, + "width": 1920 + }, + "_visualComplete": 400, + "_visualComplete85": 400, + "_visualComplete90": 400, + "_visualComplete95": 400, + "_visualComplete99": 400, + "id": "page_1_0_1", + "pageTimings": { + "_startRender": 400, + "onContentLoad": -1, + "onLoad": 320 + }, + "startedDateTime": "2024-09-15T03:21:42.914962", + "testID": "240912_Dx1XE_EVGML", + "title": "Run 1, First View for https://www.example.com/" +} +``` +
    + +## Schema + +### `_LargestContentfulPaintNodeType` + +Type: `string` + +The node type of the largest contentful paint + +### `_LargestContentfulPaintType` + +Type: `string` + +The type of the largest contentful paint + +### `_LastInteractive` + +Type: `int` + +The time when the page was last interactive in milliseconds + +### `_PerformancePaintTiming.first-contentful-paint` + +Type: `float` + +The time when the first contentful paint occurred in milliseconds + +### `_PerformancePaintTiming.first-paint` + +Type: `float` + +The time when the first paint occurred in milliseconds + +### `_SpeedIndex` + +Type: `int` + +The Speed Index score + +### `_TTFB` + +Type: `int` + +The time to first byte in milliseconds + +### `_TTIMeasurementEnd` + +Type: `int` + +The time when the TTI measurement ended in milliseconds + +### `_URL` + +Type: `string` + +The URL of the page + +### `_aft` + +Type: `int` + +The above-the-fold time in milliseconds + +### `_audit_issues` + +Type: `array` + +Audit issues + +### `_basePageSSLTime` + +Type: `int` + +The time spent on SSL for the base page in milliseconds + +### `_base_page_cdn` + +Type: `string` + +The CDN used for the base page + +### `_base_page_cname` + +Type: `string` + +The CNAME used for the base page + +### `_base_page_dns_server` + +Type: `string` + +The DNS server used for the base page + +### `_base_page_ip_ptr` + +Type: `string` + +The IP PTR used for the base page + +### `_browserVersion` + +Type: `string` + +The browser version + +### `_browser_name` + +Type: `string` + +The browser name + +### `_browser_version` + +Type: `string` + +The browser version + +### `_bytesIn` + +Type: `int` + +The number of bytes received in + +### `_bytesInDoc` + +Type: `int` + +The number of bytes received in the document + +### `_bytesOut` + +Type: `int` + +The number of bytes sent out + +### `_bytesOutDoc` + +Type: `int` + +The number of bytes sent out in the document + +### `_cached` + +Type: `int` + +Whether the page was cached + +### `_chromeUserTiming` + +Type: `array` + +Chrome user timing + +### `_chromeUserTiming.CumulativeLayoutShift` + +Type: `int` + +The cumulative layout shift + +### `_chromeUserTiming.LargestContentfulPaint` + +Type: `int` + +The largest contentful paint + +### `_chromeUserTiming.LargestTextPaint` + +Type: `int` + +The largest text paint + +### `_chromeUserTiming.TotalLayoutShift` + +Type: `int` + +The total layout shift + +### `_chromeUserTiming.commitNavigationEnd` + +Type: `int` + +The commit navigation end + +### `_chromeUserTiming.domComplete` + +Type: `int` + +The DOM complete + +### `_chromeUserTiming.domContentLoadedEventEnd` + +Type: `int` + +The DOM content loaded event end + +### `_chromeUserTiming.domContentLoadedEventStart` + +Type: `int` + +The DOM content loaded event start + +### `_chromeUserTiming.domInteractive` + +Type: `int` + +The DOM interactive + +### `_chromeUserTiming.domLoading` + +Type: `int` + +The DOM loading in milliseconds + +### `_chromeUserTiming.fetchStart` + +Type: `int` + +The fetch start in milliseconds + +### `_chromeUserTiming.firstContentfulPaint` + +Type: `int` + +The first contentful paint + +### `_chromeUserTiming.firstMeaningfulPaint` + +Type: `int` + +The first meaningful paint + +### `_chromeUserTiming.firstMeaningfulPaintCandidate` + +Type: `int` + +The first meaningful paint candidate + +### `_chromeUserTiming.firstPaint` + +Type: `int` + +The first paint + +### `_chromeUserTiming.loadEventEnd` + +Type: `int` + +The load event end + +### `_chromeUserTiming.loadEventStart` + +Type: `int` + +The load event start + +### `_chromeUserTiming.markAsMainFrame` + +Type: `int` + +The mark as main frame + +### `_chromeUserTiming.navigationStart` + +Type: `int` + +The navigation start + +### `_chromeUserTiming.responseEnd` + +Type: `int` + +The response end + +### `_chromeUserTiming.unloadEventEnd` + +Type: `int` + +The unload event end + +### `_chromeUserTiming.unloadEventStart` + +Type: `int` + +The unload event start + +### `_connections` + +Type: `int` + +The number of connections + +### `_consoleLog` + +Type: `array` + +Console logs + +### `_cpu.CommitLoad` + +Type: `int` + +The CPU time spent on commit load in milliseconds + +### `_cpu.EventDispatch` + +Type: `int` + +The CPU time spent on event dispatch in milliseconds + +### `_cpu.FunctionCall` + +Type: `int` + +The CPU time spent on function call in milliseconds + +### `_cpu.HTMLDocumentParser::FetchQueuedPreloads` + +Type: `int` + +The CPU time spent on HTML document parser fetch queued preloads in milliseconds + +### `_cpu.Idle` + +Type: `int` + +The CPU time spent on idle in milliseconds + +### `_cpu.Layerize` + +Type: `int` + +The CPU time spent on layerize in milliseconds + +### `_cpu.Layout` + +Type: `int` + +The CPU time spent on layout in milliseconds + +### `_cpu.MarkDOMContent` + +Type: `int` + +The CPU time spent on marking DOM content in milliseconds + +### `_cpu.MarkLoad` + +Type: `int` + +The CPU time spent on marking load in milliseconds + +### `_cpu.Paint` + +Type: `int` + +The CPU time spent on paint in milliseconds + +### `_cpu.ParseHTML` + +Type: `int` + +The CPU time spent on parsing HTML in milliseconds + +### `_cpu.PrePaint` + +Type: `int` + +The CPU time spent on pre-paint in milliseconds + +### `_cpu.ResourceFetcher::requestResource` + +Type: `int` + +The CPU time spent on resource fetcher request resource in milliseconds + +### `_cpu.UpdateLayoutTree` + +Type: `int` + +The CPU time spent on updating layout tree in milliseconds + +### `_cpu.V8.GC_TIME_TO_SAFEPOINT` + +Type: `int` + +The CPU time spent on V8 GC time to safepoint in milliseconds + +### `_cpu.largestContentfulPaint::Candidate` + +Type: `int` + +The CPU time spent on largest contentful paint candidate in milliseconds + +### `_cpuTimes` + +Type: `object` + +CPU times + +### `_cpuTimesDoc` + +CPU times for the document + +### `_date` + +The date in Unix timestamp format + +### `_docTime` + +The document time in milliseconds + +### `_document_URL` + +The URL of the document + +### `_document_hostname` + +The hostname of the document + +### `_document_origin` + +The origin of the document + +### `_domComplete` + +Type: `int` + +The DOM complete in milliseconds + +### `_domContentLoadedEventEnd` + +Type: `int` + +The DOM content loaded event end in milliseconds + +### `_domContentLoadedEventStart` + +Type: `int` + +The DOM content loaded event start in milliseconds + +### `_domElements` + +Type: `int` + +The number of DOM elements + +### `_domInteractive` + +Type: `int` + +The DOM interactive in milliseconds + +### `_domLoading` + +Type: `int` + +The DOM loading in milliseconds + +### `_domTime` + +Type: `int` + +The DOM time in milliseconds + +### `_edge-processed` + +Type: `boolean` + +Whether the page was processed by Edge + +### `_effectiveBps` + +Type: `int` + +The effective BPS + +### `_eventName` + +Type: `string` + +The event name + +### `_execution_contexts` + +Type: `array` + +Execution contexts + +### `_final_base_page_request` + +Type: `int` + +The final base page request + +### `_final_base_page_request_id` + +Type: `string` + +The final base page request ID + +### `_final_url` + +Type: `string` + +The final URL + +### `_firstContentfulPaint` + +Type: `int` + +The first contentful paint in milliseconds + +### `_firstMeaningfulPaint` + +Type: `int` + +The first meaningful paint in milliseconds + +### `_firstPaint` + +Type: `float` + +The first paint in milliseconds + +### `_fullyLoaded` + +Type: `int` + +The fully loaded time in milliseconds + +### `_fullyLoadedCPUms` + +Type: `int` + +The fully loaded CPU time in milliseconds + +### `_fullyLoadedCPUpct` + +Type: `float` + +The fully loaded CPU percentage + +### `_gzip_savings` + +Type: `int` + +The bytes saved by gzip compression + +### `_gzip_total` + +Type: `int` + +The total bytes in gzip compression + +### `_image_savings` + +Type: `int` + +The bytes saved by image compression + +### `_image_total` + +Type: `int` + +The total bytes in image compression + +### `_interactivePeriods` + +Type: `array` + +Interactive periods in milliseconds + +### `_largestPaints` + +Type: `array` + +Largest paints + +### `_lastVisualChange` + +Type: `int` + +The time of the last visual change in milliseconds + +### `_lighthouse.Accessibility` + +Type: `float` + +The Lighthouse accessibility score + +### `_lighthouse.BestPractices` + +Type: `float` + +The Lighthouse best practices score + +### `_lighthouse.Performance` + +Type: `float` + +The Lighthouse performance score + +### `_lighthouse.Performance.cumulative-layout-shift` + +Type: `int` + +The Lighthouse cumulative layout shift + +### `_lighthouse.Performance.first-contentful-paint` + +Type: `float` + +The Lighthouse first contentful paint + +### `_lighthouse.Performance.largest-contentful-paint` + +Type: `float` + +The Lighthouse largest contentful paint + +### `_lighthouse.Performance.speed-index` + +Type: `int` + +The Lighthouse speed index + +### `_lighthouse.Performance.total-blocking-time` + +Type: `int` + +The Lighthouse total blocking time + +### `_lighthouse.SEO` + +Type: `float` + +The Lighthouse SEO score + +### `_loadEventEnd` + +Type: `int` + +The load event end in milliseconds + +### `_loadEventStart` + +Type: `int` + +The load event start in milliseconds + +### `_loadTime` + +Type: `int` + +The load time in milliseconds + +### `_main_frame` + +Type: `string` + +The main frame + +### `_minify_savings` + +Type: `int` + +The bytes saved by minification + +### `_minify_total` + +Type: `int` + +The total bytes in minification + +### `_optimization_checked` + +Type: `int` + +Whether optimization checks were performed + +### `_origin_dns` + +Type: `object` + +Origin DNS + +### `_osPlatform` + +Type: `string` + +The OS platform + +### `_osVersion` + +Type: `string` + +The OS version + +### `_os_version` + +Type: `string` + +The OS version + +### `_render` + +Type: `int` + +The render time in milliseconds + +### `_renderBlockingCSS` + +Type: `int` + +The render blocking CSS time in milliseconds + +### `_renderBlockingJS` + +Type: `int` + +The render blocking JS time in milliseconds + +### `_requests` + +Type: `int` + +The number of requests + +### `_requestsDoc` + +Type: `int` + +The number of requests in the document + +### `_requestsFull` + +Type: `int` + +The number of full requests + +### `_responses_200` + +Type: `int` + +The number of 200 responses + +### `_responses_404` + +Type: `int` + +The number of 404 responses + +### `_responses_other` + +Type: `int` + +The number of other responses + +### `_result` + +Type: `int` + +The result code of the test run + +### `_run` + +Type: `int` + +The run number + +### `_score_cache` + +Type: `int` + +The cache score + +### `_score_cdn` + +Type: `int` + +The CDN score + +### `_score_combine` + +Type: `int` + +The combine score + +### `_score_compress` + +Type: `int` + +The compress score + +### `_score_cookies` + +Type: `int` + +The cookies score + +### `_score_etags` + +Type: `int` + +The etags score + +### `_score_gzip` + +Type: `int` + +The gzip score + +### `_score_keep-alive` + +Type: `int` + +The keep-alive score + +### `_score_minify` + +Type: `int` + +The minify score + +### `_score_progressive_jpeg` + +Type: `int` + +The progressive JPEG score + +### `_server_rtt` + +Type: `int` + +The server RTT + +### `_start_epoch` + +Type: `float` + +The start epoch in Unix timestamp format + +### `_step` + +Type: `int` + +The step number + +### `_testID` + +Type: `string` + +The test ID + +### `_testStartOffset` + +Type: `int` + +The test start offset + +### `_testUrl` + +Type: `string` + +The test URL + +### `_test_run_time_ms` + +Type: `int` + +The test run time in milliseconds + +### `_tester` + +Type: `string` + +The tester + +### `_titleTime` + +Type: `int` + +The title time in milliseconds + +### `_v8Stats` + +Type: `object` + +V8 stats + +### `_viewport` + +Type: `object` + +The viewport dimensions + +### `_visualComplete` + +Type: `int` + +The visual complete time in milliseconds + +### `_visualComplete85` + +Type: `int` + +The 85th percentile visual complete time in milliseconds + +### `_visualComplete90` + +Type: `int` + +The 90th percentile visual complete time in milliseconds + +### `_visualComplete95` + +Type: `int` + +The 95th percentile visual complete time in milliseconds + +### `_visualComplete99` + +Type: `int` + +The 99th percentile visual complete time in milliseconds + +### `id` + +Type: `string` + +The page ID + +### `pageTimings` + +Type: `object` + +Page timings + +### `startedDateTime` + +Type: `string` + +The start date and time of the page in Unix timestamp format + +### `testID` + +Type: `string` + +The test ID + +### `title` + +Type: `string` + +The page title diff --git a/src/content/docs/docs/reference/blobs/page-summary.mdx b/src/content/docs/docs/reference/blobs/page-summary.mdx new file mode 100644 index 00000000..d9443e75 --- /dev/null +++ b/src/content/docs/docs/reference/blobs/page-summary.mdx @@ -0,0 +1,354 @@ +--- +title: Page summary blob +description: Reference docs for the page summary blob +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As: [`summary`](/docs/reference/tables/pages/#summary)_ + +JSON-encoded summarization of the page-level data. + +
    +An example of the decoded object +```json +{ + "SpeedIndex": 400, + "TTFB": 232, + "_connections": 1, + "bytesAudio": 0, + "bytesCss": 0, + "bytesFlash": 0, + "bytesFont": 0, + "bytesGif": 0, + "bytesHtml": 648, + "bytesHtmlDoc": 648, + "bytesImg": 648, + "bytesJS": 0, + "bytesJpg": 0, + "bytesJson": 0, + "bytesOther": 0, + "bytesPng": 0, + "bytesSvg": 0, + "bytesText": 0, + "bytesTotal": 1296, + "bytesVideo": 0, + "bytesWebp": 0, + "bytesXml": 0, + "cdn": "Edgecast", + "crux": { + "collectionPeriod": { + "firstDate": { + "day": 17, + "month": 8, + "year": 2024 + }, + "lastDate": { + "day": 13, + "month": 9, + "year": 2024 + } + }, + "key": { + "formFactor": "DESKTOP", + "url": "https://www.example.com/" + }, + "metrics": { + ... + } + }, + "fullyLoaded": 323, + "gzipSavings": 0, + "gzipTotal": 648, + "maxDomainReqs": 1, + "maxage0": 0, + "maxage1": 0, + "maxage30": 2, + "maxage365": 0, + "maxageMore": 0, + "maxageNull": 0, + "numCompressed": 2, + "numDomElements": 12, + "numDomains": 1, + "numErrors": 1, + "numGlibs": 0, + "numHttps": 2, + "numRedirects": 0, + "onContentLoaded": 280, + "onLoad": 320, + "renderStart": 400, + "reqAudio": 0, + "reqCss": 0, + "reqFlash": 0, + "reqFont": 0, + "reqGif": 0, + "reqHtml": 1, + "reqImg": 1, + "reqJS": 0, + "reqJpg": 0, + "reqJson": 0, + "reqOther": 0, + "reqPng": 0, + "reqSvg": 0, + "reqText": 0, + "reqTotal": 2, + "reqVideo": 0, + "reqWebp": 0, + "reqXml": 0, + "visualComplete": 400 +} +``` +
    + +## Schema + +### `SpeedIndex` + +The Speed Index score. + +### `TTFB` + +The time to first byte + +### `_connections` + +The number of connections. + +### `bytesAudio` + +The number of bytes for audio. + +### `bytesCss` + +The number of bytes for CSS. + +### `bytesFlash` + +The number of bytes for Flash. + +### `bytesFont` + +The number of bytes for font. + +### `bytesGif` + +The number of bytes for GIF. + +### `bytesHtml` + +The number of bytes for HTML. + +### `bytesHtmlDoc` + +The number of bytes for HTML document. + +### `bytesImg` + +The number of bytes for image. + +### `bytesJS` + +The number of bytes for JavaScript. + +### `bytesJpg` + +The number of bytes for JPG. + +### `bytesJson` + +The number of bytes for JSON. + +### `bytesOther` + +The number of bytes for other. + +### `bytesPng` + +The number of bytes for PNG. + +### `bytesSvg` + +The number of bytes for SVG. + +### `bytesText` + +The number of bytes for text. + +### `bytesTotal` + +The total number of bytes. + +### `bytesVideo` + +The number of bytes for video. + +### `bytesWebp` + +The number of bytes for WebP. + +### `bytesXml` + +The number of bytes for XML. + +### `cdn` + +The Content Delivery Network provider. + +### `crux` + +The CrUX data. + +### `fullyLoaded` + +The fully loaded time. + +### `gzipSavings` + +The bytes saved due to gzip compression. + +### `gzipTotal` + +The total bytes in gzip compression. + +### `maxDomainReqs` + +The maximum number of requests to a domain. + +### `maxage0` + +The number of requests with a max-age of 0. + +### `maxage1` + +The number of requests with a max-age > 0 and \<= 1 day. + +### `maxage30` + +The number of requests with a max-age > 1 day and \<= 30 days. + +### `maxage365` + +The number of requests with a max-age > 30 days and \<= 365 days. + +### `maxageMore` + +The number of requests with a max-age greater than 365 days. + +### `maxageNull` + +The number of requests with a max-age of null. + +### `numCompressed` + +The number of compressed files. + +### `numDomElements` + +The number of DOM elements. + +### `numDomains` + +The number of domains. + +### `numErrors` + +The number of errors. + +### `numGlibs` + +The number of glibs. + +### `numHttps` + +The number of HTTPS requests. + +### `numRedirects` + +The number of redirects. + +### `onContentLoaded` + +The onContentLoaded time. + +### `onLoad` + +The onLoad time. + +### `renderStart` + +The renderStart time. + +### `reqAudio` + +The number of requests for audio. + +### `reqCss` + +The number of requests for CSS. + +### `reqFlash` + +The number of requests for Flash. + +### `reqFont` + +The number of requests for fonts. + +### `reqGif` + +The number of requests for GIF. + +### `reqHtml` + +The number of requests for HTML. + +### `reqImg` + +The number of requests for images. + +### `reqJS` + +The number of requests for JavaScript. + +### `reqJpg` + +The number of requests for JPG. + +### `reqJson` + +The number of requests for JSON. + +### `reqOther` + +The number of requests for other. + +### `reqPng` + +The number of requests for PNG. + +### `reqSvg` + +The number of requests for SVG. + +### `reqText` + +The number of requests for text. + +### `reqTotal` + +The total number of requests. + +### `reqVideo` + +The number of requests for video. + +### `reqWebp` + +The number of requests for WebP. + +### `reqXml` + +The number of requests for XML. + +### `visualComplete` + +The visualComplete time. diff --git a/src/content/docs/docs/reference/blobs/request-payload.mdx b/src/content/docs/docs/reference/blobs/request-payload.mdx new file mode 100644 index 00000000..afce41cb --- /dev/null +++ b/src/content/docs/docs/reference/blobs/request-payload.mdx @@ -0,0 +1,1188 @@ +--- +title: Request payload blob +description: Reference docs for the request payload blob +--- + +_Appears in: [`requests`](/docs/reference/tables/requests/) table_\ +_As: [`payload`](/docs/reference/tables/requests/#payload)_ + +JSON-encoded WebPageTest result data for a request. + +**The actual schema is liable to change, depending on a request.** + +
    +An example of the decoded object +```json +{ + "_all_end": 234, + "_all_ms": 233, + "_all_start": 1, + "_body_file": "001-44714C6F6C72B045136D19CA9894886A-body.txt", + "_body_hash": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9", + "_bytesIn": 648, + "_bytesOut": 2143, + "_cacheControl": "max-age=604800", + "_cache_time": null, + "_cached": 0, + "_cdn_provider": "Edgecast", + "_certificates": [ + "-----BEGIN CERTIFICATE-----\nMIIHbjCCBlagAwIBAgIQB1vO8waJyK3fE+Ua9K/hhzANBgkqhkiG9w0BAQsFADBZ\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypE\naWdpQ2VydCBHbG9iYWwgRzIgVExTIFJTQSBTSEEyNTYgMjAyMCBDQTEwHhcNMjQw\nMTMwMDAwMDAwWhcNMjUwMzAxMjM1OTU5WjCBljELMAkGA1UEBhMCVVMxEzARBgNV\nBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMUIwQAYDVQQKDDlJ\nbnRlcm5ldMKgQ29ycG9yYXRpb27CoGZvcsKgQXNzaWduZWTCoE5hbWVzwqBhbmTC\noE51bWJlcnMxGDAWBgNVBAMTD3d3dy5leGFtcGxlLm9yZzCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBAIaFD7sO+cpf2fXgCjIsM9mqDgcpqC8IrXi9wga/\n9y0rpqcnPVOmTMNLsid3INbBVEm4CNr5cKlh9rJJnWlX2vttJDRyLkfwBD+dsVvi\nvGYxWTLmqX6/1LDUZPVrynv/cltemtg/1Aay88jcj2ZaRoRmqBgVeacIzgU8+zmJ\n7236TnFSe7fkoKSclsBhPaQKcE3Djs1uszJs8sdECQTdoFX9I6UgeLKFXtg7rRf/\nhcW5dI0zubhXbrW8aWXbCzySVZn0c7RkJMpnTCiZzNxnPXnHFpwr5quqqjVyN/aB\nKkjoP04Zmr+eRqoyk/+lslq0sS8eaYSSHbC5ja/yMWyVhvMCAwEAAaOCA/IwggPu\nMB8GA1UdIwQYMBaAFHSFgMBmx9833s+9KTeqAx2+7c0XMB0GA1UdDgQWBBRM/tAS\nTS4hz2v68vK4TEkCHTGRijCBgQYDVR0RBHoweIIPd3d3LmV4YW1wbGUub3Jnggtl\neGFtcGxlLm5ldIILZXhhbXBsZS5lZHWCC2V4YW1wbGUuY29tggtleGFtcGxlLm9y\nZ4IPd3d3LmV4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5lZHWCD3d3dy5leGFtcGxl\nLm5ldDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcGCCsGAQUFBwIBFhtodHRwOi8v\nd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQG\nCCsGAQUFBwMBBggrBgEFBQcDAjCBnwYDVR0fBIGXMIGUMEigRqBEhkJodHRwOi8v\nY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRHbG9iYWxHMlRMU1JTQVNIQTI1NjIw\nMjBDQTEtMS5jcmwwSKBGoESGQmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdp\nQ2VydEdsb2JhbEcyVExTUlNBU0hBMjU2MjAyMENBMS0xLmNybDCBhwYIKwYBBQUH\nAQEEezB5MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wUQYI\nKwYBBQUHMAKGRWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\nb2JhbEcyVExTUlNBU0hBMjU2MjAyMENBMS0xLmNydDAMBgNVHRMBAf8EAjAAMIIB\nfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcAdABOdaMnXJoQwzhbbNTfP1LrHfDgjhuN\nacCx+mSxYpo53wAAAY1b0vxkAAAEAwBFMEMCH0BRCgxPbBBVxhcWZ26a8JCe83P1\nJZ6wmv56GsVcyMACIDgpMbEo5HJITTRPnoyT4mG8cLrWjEvhchUdEcWUuk1TAHYA\nfVkeEuF4KnscYWd8Xv340IdcFKBOlZ65Ay/ZDowuebgAAAGNW9L8MAAABAMARzBF\nAiBdv5Z3pZFbfgoM3tGpCTM3ZxBMQsxBRSdTS6d8d2NAcwIhALLoCT9mTMN9OyFz\nIBV5MkXVLyuTf2OAzAOa7d8x2H6XAHcA5tIxY0B3jMEQQQbXcbnOwdJA9paEhvu6\nhzId/R43jlAAAAGNW9L8XwAABAMASDBGAiEA4Koh/VizdQU1tjZ2E2VGgWSXXkwn\nQmiYhmAeKcVLHeACIQD7JIGFsdGol7kss2pe4lYrCgPVc+iGZkuqnj26hqhr0TAN\nBgkqhkiG9w0BAQsFAAOCAQEABOFuAj4N4yNG9OOWNQWTNSICC4Rd4nOG1HRP/Bsn\nrz7KrcPORtb6D+Jx+Q0amhO31QhIvVBYs14gY4Ypyj7MzHgm4VmPXcqLvEkxb2G9\nQv9hYuEiNSQmm1fr5QAN/0AzbEbCM3cImLJ69kP5bUjfv/76KB57is8tYf9sh5ik\nLGKauxCM/zRIcGa3bXLDafk5S2g5Vr2hs230d/NGW1wZrE+zdGuMxfGJzJP+DAFv\niBfcQnFg4+1zMEKcqS87oniOyG+60RMM0MdejBD7AS43m9us96Gsun/4kufLQUTI\nFfnzxLutUV++3seshgefQOy5C/ayi8y1VTNmujPCxPCi6Q==\n-----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\nMIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\nMjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh\nbCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV\ncNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy\nFuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc\n3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8\nosicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT\nzGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud\nEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G\nA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd\nBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG\nCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG\nNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH\nMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t\nL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC\nATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG\n9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t\nwcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS\nslme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R\nbpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4\nchDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN\nJCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA==\n-----END CERTIFICATE-----\n" + ], + "_chunks": [ + { + "bytes": 648, + "inflated": 1256, + "ts": 234 + } + ], + "_connect_end": 93, + "_connect_ms": 33, + "_connect_start": 60, + "_contentEncoding": "gzip", + "_contentType": "text/html", + "_created": 8, + "_dns_end": 60, + "_dns_info": { + "results": { + "aliases": [ + "www.example.com" + ], + "canonical_names": [ + "www.example.com" + ], + "endpoint_metadatas": [], + "expiration": "13370780176732624", + "host_ports": [], + "hostname_results": [], + "ip_endpoints": [ + { + "endpoint_address": "93.184.215.14", + "endpoint_port": 0 + } + ], + "text_records": [] + }, + "secure": false, + "transactions_needed": [ + { + "dns_query_type": "A" + }, + { + "dns_query_type": "HTTPS" + } + ] + }, + "_dns_ms": 59, + "_dns_start": 1, + "_documentURL": "https://www.example.com/", + "_download_end": 234, + "_download_ms": 2, + "_download_start": 232, + "_expires": "Sun, 22 Sep 2024 03:21:43 GMT", + "_final_base_page": true, + "_frame_id": "E021D0149DE3689992ECE4DF4B0ECA38", + "_full_url": "https://www.example.com/", + "_gzip_save": 0, + "_gzip_total": 648, + "_host": "www.example.com", + "_http2_server_settings": { + "SETTINGS_DEPRECATE_HTTP2_PRIORITIES": 0, + "SETTINGS_ENABLE_PUSH": 0, + "SETTINGS_HEADER_TABLE_SIZE": 4096, + "SETTINGS_INITIAL_WINDOW_SIZE": 1048576, + "SETTINGS_MAX_CONCURRENT_STREAMS": 100, + "SETTINGS_MAX_FRAME_SIZE": 16384, + "SETTINGS_MAX_HEADER_LIST_SIZE": 16384 + }, + "_http2_stream_dependency": 0, + "_http2_stream_exclusive": 1, + "_http2_stream_id": 1, + "_http2_stream_weight": 256, + "_id": "44714C6F6C72B045136D19CA9894886A", + "_image_save": null, + "_image_total": null, + "_index": 0, + "_initial_priority": "Highest", + "_initiator": "", + "_initiator_column": "", + "_initiator_line": "", + "_initiator_type": "script", + "_ip_addr": "93.184.215.14", + "_is_base_page": true, + "_is_secure": 1, + "_load_end": 234, + "_load_ms": 43, + "_load_start": 191, + "_load_start_float": 191.000079, + "_method": "GET", + "_minify_save": null, + "_minify_total": null, + "_netlog_id": 79, + "_number": 1, + "_objectSize": 648, + "_objectSizeUncompressed": 1256, + "_priority": "Highest", + "_protocol": "HTTP/2", + "_raw_id": "44714C6F6C72B045136D19CA9894886A", + "_request_id": "44714C6F6C72B045136D19CA9894886A", + "_request_type": "Document", + "_responseCode": 200, + "_run": 1, + "_score_cache": -1, + "_score_cdn": 100, + "_score_combine": -1, + "_score_compress": -1, + "_score_cookies": -1, + "_score_etags": -1, + "_score_gzip": 100, + "_score_keep-alive": 100, + "_score_minify": -1, + "_securityDetails": { + "certificateId": 0, + "certificateTransparencyCompliance": "compliant", + "cipher": "AES_256_GCM", + "encryptedClientHello": false, + "issuer": "DigiCert Global G2 TLS RSA SHA256 2020 CA1", + "keyExchange": "", + "keyExchangeGroup": "P-256", + "protocol": "TLS 1.3", + "sanList": [ + "www.example.org", + "example.net", + "example.edu", + "example.com", + "example.org", + "www.example.com", + "www.example.edu", + "www.example.net" + ], + "serverSignatureAlgorithm": 2052, + "signedCertificateTimestampList": [ + { + "hashAlgorithm": "SHA-256", + "logDescription": "Google 'Argon2025h1' log", + "logId": "4E75A3275C9A10C3385B6CD4DF3F52EB1DF0E08E1B8D69C0B1FA64B1629A39DF", + "origin": "Embedded in certificate", + "signatureAlgorithm": "ECDSA", + "signatureData": "3043021F40510A0C4F6C1055C61716676E9AF0909EF373F5259EB09AFE7A1AC55CC8C00220382931B128E472484D344F9E8C93E261BC70BAD68C4BE172151D11C594BA4D53", + "status": "Verified", + "timestamp": 1706642570340 + }, + { + "hashAlgorithm": "SHA-256", + "logDescription": "DigiCert Yeti2025 Log", + "logId": "7D591E12E1782A7B1C61677C5EFDF8D0875C14A04E959EB9032FD90E8C2E79B8", + "origin": "Embedded in certificate", + "signatureAlgorithm": "ECDSA", + "signatureData": "304502205DBF9677A5915B7E0A0CDED1A909333767104C42CC414527534BA77C77634073022100B2E8093F664CC37D3B21732015793245D52F2B937F6380CC039AEDDF31D87E97", + "status": "Verified", + "timestamp": 1706642570288 + }, + { + "hashAlgorithm": "SHA-256", + "logDescription": "DigiCert Nessie2025 Log", + "logId": "E6D2316340778CC1104106D771B9CEC1D240F6968486FBBA87321DFD1E378E50", + "origin": "Embedded in certificate", + "signatureAlgorithm": "ECDSA", + "signatureData": "3046022100E0AA21FD58B3750535B636761365468164975E4C2742689886601E29C54B1DE0022100FB248185B1D1A897B92CB36A5EE2562B0A03D573E886664BAA9E3DBA86A86BD1", + "status": "Verified", + "timestamp": 1706642570335 + } + ], + "subjectName": "www.example.org", + "validFrom": 1706572800, + "validTo": 1740873599 + }, + "_server_count": null, + "_server_port": "443", + "_server_rtt": null, + "_socket": 86, + "_socket_group": "https://www.example.com ", + "_ssl_end": 191, + "_ssl_ms": 98, + "_ssl_start": 93, + "_tls_cipher_suite": 4866, + "_tls_next_proto": "h2", + "_tls_resumed": "False", + "_tls_version": "TLS 1.3", + "_ttfb_end": 232, + "_ttfb_ms": 41, + "_ttfb_start": 191, + "_type": 3, + "_url": "/", + "cache": {}, + "pageref": "page_1_0_1", + "request": { + "bodySize": -1, + "cookies": [], + "headersSize": 683, + "httpVersion": "HTTP/2", + "method": "GET", + "queryString": [], + "url": "https://www.example.com/" + }, + "response": { + "bodySize": 648, + "content": { + "mimeType": "text/html", + "size": 648 + }, + "cookies": [], + "headersSize": 376, + "httpVersion": "HTTP/2", + "status": 200, + "statusText": "" + }, + "startedDateTime": "2024-09-15T03:21:43.105962", + "time": 285, + "timings": { + "blocked": 52, + "connect": 131, + "dns": 59, + "receive": 2, + "send": 0, + "ssl": 98, + "wait": 41 + } +} +``` +
    + +## Schema + +### `_all_end` + +Type: `int` + +End time of all operations. + +### `_all_ms` + +Type: `int` + +Total time taken for all operations. + +### `_all_start` + +Type: `int` + +Start time of all operations. + +### `_body_file` + +Type: `string` + +File containing the body of the request. + +### `_bytesIn` + +Type: `int` + +Number of bytes received. + +### `_bytesOut` + +Type: `int` + +Number of bytes sent. + +### `_cacheControl` + +Type: `string` + +Cache control header value. + +### `_cache_time` + +Type: `int` + +Cache time. + +### `_cached` + +Type: `int` + +Indicates if the request was cached (0 or 1). + +### `_cdn_provider` + +Type: `string` + +CDN provider used. + +### `_certificates` + +Type: `array` + +Certificates used. + +### `_chunks` + +Type: `array` + +Array of chunks received. + +- #### `_chunks[].bytes` + + Type: `int` + + Size of the chunk. + +- #### `_chunks[].inflated` + + Type: `int` + + Size of the inflated chunk. + +- #### `_chunks[].ts` + + Type: `int` + + Timestamp of the chunk. + +### `_connect_end` + +Type: `int` + +Connection end time. + +### `_connect_ms` + +Type: `int` + +Connection time in milliseconds. + +### `_connect_start` + +Type: `int` + +Connection start time. + +### `_contentEncoding` + +Type: `string` + +Content encoding of the response. + +### `_contentType` + +Type: `string` + +Content type of the response. + +### `_created` + +Type: `int` + +Creation time of the request. + +### `_dns_end` + +Type: `int` + +DNS end time. + +### `_dns_info` + +Type: `object` + +DNS information. + +- #### `_dns_info.results` + + Type: `object` + + Results of the DNS query. + +- #### `_dns_info.results.aliases` + + Type: `array` + + Aliases for the domain. + +- #### `_dns_info.results.canonical_names` + + Type: `array` + + Canonical names for the domain. + +- #### `_dns_info.results.endpoint_metadatas` + + Type: `array` + + Endpoint metadata. + +- #### `_dns_info.results.expiration` + + Type: `string` + + Expiration date of the DNS query. + +- #### `_dns_info.results.host_ports` + + Type: `array` + + Host ports. + +- #### `_dns_info.results.hostname_results` + + Type: `array` + + Hostname results. + +- #### `_dns_info.results.ip_endpoints` + + Type: `array` + + IP endpoints. + +- #### `_dns_info.results.ip_endpoints[].endpoint_address` + + Type: `string` + + IP address of the endpoint. + +- #### `_dns_info.results.ip_endpoints[].endpoint_port` + + Type: `int` + + Port of the endpoint. + +- #### `_dns_info.results.text_records` + + Type: `array` + + Text records. + +- #### `_dns_info.secure` + + Type: `int` + + Indicates if the DNS query is secure. + +- #### `_dns_info.transactions_needed` + + Type: `array` + + Transactions needed for DNS query. + +- #### `_dns_info.transactions_needed[].dns_query_type` + + Type: `string` + + Type of DNS query. + +### `_dns_ms` + +Type: `int` + +DNS lookup time in milliseconds. + +### `_dns_start` + +Type: `int` + +DNS start time. + +### `_documentURL` + +Type: `string` + +Document URL of the request. + +### `_download_end` + +Type: `int` + +Download end time. + +### `_download_ms` + +Type: `int` + +Download time in milliseconds. + +### `_download_start` + +Type: `int` + +Download start time. + +### `_expires` + +Type: `string` + +Expiry date of the request. + +### `_final_base_page` + +Type: `int` + +Indicates if the request is the final base page. + +### `_frame_id` + +Type: `string` + +Frame ID where the request was made. + +### `_full_url` + +Type: `string` + +Full URL of the request. + +### `_gzip_save` + +Type: `int` + +Size saved due to gzip compression. + +### `_gzip_total` + +Type: `int` + +Total size of the gzip-compressed content. + +### `_host` + +Type: `string` + +Host of the request. + +### `_http2_server_settings` + +Type: `object` + +HTTP/2 server settings. + +### `_http2_stream_dependency` + +Type: `int` + +HTTP/2 stream dependency. + +### `_http2_stream_exclusive` + +Type: `int` + +HTTP/2 stream exclusivity. + +### `_http2_stream_id` + +Type: `int` + +HTTP/2 stream ID. + +### `_http2_stream_weight` + +Type: `int` + +HTTP/2 stream weight. + +### `_id` + +Type: `string` + +Unique identifier for the request. + +### `_image_save` + +Type: `int` + +Size saved due to image optimization. + +### `_image_total` + +Type: `int` + +Total size of images. + +### `_index` + +Type: `int` + +Index of the request. + +### `_initial_priority` + +Type: `string` + +Initial priority of the request. + +### `_initiator` + +Type: `string` + +Initiator of the request. + +### `_initiator_column` + +Type: `string` + +Column number of the initiator. + +### `_initiator_line` + +Type: `string` + +Line number of the initiator. + +### `_initiator_type` + +Type: `string` + +Type of initiator (e.g., script). + +### `_ip_addr` + +Type: `string` + +IP address of the requested server. + +### `_is_base_page` + +Type: `int` + +Indicates if the request is the base page. + +### `_is_secure` + +Type: `int` + +Indicates if the request is secure (0 or 1). + +### `_load_end` + +Type: `int` + +Load end time. + +### `_load_ms` + +Type: `int` + +Load time in milliseconds. + +### `_load_start` + +Type: `int` + +Start time of load in milliseconds. + +### `_load_start_float` + +Type: `float` + +Precise start time of load. + +### `_method` + +Type: `string` + +HTTP method used for the request. + +### `_minify_save` + +Type: `int` + +Size saved due to minification. + +### `_minify_total` + +Type: `int` + +Total size of minified content. + +### `_netlog_id` + +Type: `int` + +Netlog ID. + +### `_number` + +Type: `int` + +Number of the request. + +### `_objectSize` + +Type: `int` + +Size of the object received. + +### `_objectSizeUncompressed` + +Type: `int` + +Uncompressed size of the object received. + +### `_priority` + +Type: `string` + +Priority of the request. + +### `_protocol` + +Type: `string` + +Protocol used for the request. + +### `_raw_id` + +Type: `string` + +Raw ID for the request. + +### `_request_id` + +Type: `string` + +Identifier for the original request. + +### `_request_type` + +Type: `string` + +Type of the request (e.g., Document). + +### `_responseCode` + +Type: `int` + +HTTP response code. + +### `_run` + +Type: `int` + +The run number of the test. + +### `_score_cache` + +Type: `int` + +Cache score. + +### `_score_cdn` + +Type: `int` + +CDN score. + +### `_score_combine` + +Type: `int` + +Combine score. + +### `_score_compress` + +Type: `int` + +Compression score. + +### `_score_cookies` + +Type: `int` + +Cookies score. + +### `_score_etags` + +Type: `int` + +ETags score. + +### `_score_gzip` + +Type: `int` + +Gzip compression score. + +### `_score_keep-alive` + +Type: `int` + +Keep-alive score. + +### `_score_minify` + +Type: `int` + +Minification score. + +### `_securityDetails` + +Type: `object` + +Security details of the request. + +- #### `_securityDetails.certificateId` + + Type: `int` + + Certificate ID. + +- #### `_securityDetails.certificateTransparencyCompliance` + + Type: `string` + + Certificate transparency compliance. + +- #### `_securityDetails.cipher` + + Type: `string` + + Cipher used. + +- #### `_securityDetails.encryptedClientHello` + + Type: `int` + + Indicates if the client hello is encrypted. + +- #### `_securityDetails.issuer` + + Type: `string` + + Issuer of the certificate. + +- #### `_securityDetails.keyExchange` + + Type: `string` + + Key exchange used. + +- #### `_securityDetails.keyExchangeGroup` + + Type: `string` + + Key exchange group used. + +- #### `_securityDetails.protocol` + + Type: `string` + + Security protocol used. + +- #### `_securityDetails.sanList` + + Type: `array` + + Subject alternative names. + +- #### `_securityDetails.serverSignatureAlgorithm` + + Type: `int` + + Server signature algorithm. + +- #### `_securityDetails.signedCertificateTimestampList` + + Type: `array` + + List of signed certificate timestamps. + +- #### `_securityDetails.subjectName` + + Type: `string` + + Subject name of the certificate. + +- #### `_securityDetails.validFrom` + + Type: `int` + + Valid from date of the certificate. + +- #### `_securityDetails.validTo` + + Type: `int` + + Valid to date of the certificate. + +### `_server_count` + +Type: `int` + +Number of servers used. + +### `_server_port` + +Type: `string` + +Server port. + +### `_server_rtt` + +Type: `int` + +Server round-trip time. + +### `_socket` + +Type: `int` + +Socket used for the request. + +### `_socket_group` + +Type: `string` + +Socket group. + +### `_ssl_end` + +Type: `int` + +SSL handshake end time. + +### `_ssl_ms` + +Type: `int` + +SSL handshake time in milliseconds. + +### `_ssl_start` + +Type: `int` + +SSL handshake start time. + +### `_tls_cipher_suite` + +Type: `int` + +Cipher suite used. + +### `_tls_next_proto` + +Type: `string` + +Next protocol used. + +### `_tls_resumed` + +Type: `string` + +Indicates if the TLS session was resumed. + +### `_tls_version` + +Type: `string` + +TLS version used. + +### `_ttfb_end` + +Type: `int` + +Time to first byte end time. + +### `_ttfb_ms` + +Type: `int` + +Time to first byte in milliseconds. + +### `_ttfb_start` + +Type: `int` + +Time to first byte start time. + +### `_type` + +Type: `int` + +Type identifier for the request. + +### `_url` + +Type: `string` + +URL path of the request. + +### `cache` + +Type: `object` + +Cache details (empty in this example). + +### `pageref` + +Type: `string` + +Reference to the page containing this request. + +### `request` + +Type: `object` + +Details of the request. + +- #### `request.bodySize` + + Type: `int` + + Size of the request body. + +- #### `request.cookies` + + Type: `array` + + Cookies sent with the request. + +- #### `request.headersSize` + + Type: `int` + + Size of the request headers. + +- #### `request.httpVersion` + + Type: `string` + + HTTP version used for the request. + +- #### `request.method` + + Type: `string` + + HTTP method used for the request. + +- #### `request.queryString` + + Type: `array` + + Query string parameters. + +- #### `request.url` + + Type: `string` + + URL of the requested resource. + +### `response` + +Type: `object` + +Details of the response. + +- #### `response.bodySize` + + Type: `int` + + Size of the response body. + +- #### `response.content` + + Type: `object` + + Content details of the response. + +- #### `response.content.mimeType` + + Type: `string` + + MIME type of the content. + +- #### `response.content.size` + + Type: `int` + + Size of the content. + +- #### `response.cookies` + + Type: `array` + + Cookies received with the response. + +- #### `response.headersSize` + + Type: `int` + + Size of the response headers. + +- #### `response.httpVersion` + + Type: `string` + + HTTP version used for the response. + +- #### `response.status` + + Type: `int` + + HTTP response status code. + +- #### `response.statusText` + + Type: `string` + + Status text of the response. + +### `startedDateTime` + +Type: `string` + +Start time of the request. + +### `time` + +Type: `int` + +Total time taken for the request in milliseconds. + +### `timings` + +Type: `object` + +Timing details of various stages of the request. + +- #### `timings.blocked` + + Type: `int` + + Time spent in blocking. + +- #### `timings.connect` + + Type: `int` + + Time spent in establishing a connection. + +- #### `timings.dns` + + Type: `int` + + Time spent in DNS lookup. + +- #### `timings.receive` + + Type: `int` + + Time spent in receiving the response. + +- #### `timings.send` + + Type: `int` + + Time spent in sending the request. + +- #### `timings.ssl` + + Type: `int` + + Time spent in SSL handshake. + +- #### `timings.wait` + + Type: `int` + + Time spent in waiting for the response. diff --git a/src/content/docs/docs/reference/blobs/request-summary.mdx b/src/content/docs/docs/reference/blobs/request-summary.mdx new file mode 100644 index 00000000..6434a211 --- /dev/null +++ b/src/content/docs/docs/reference/blobs/request-summary.mdx @@ -0,0 +1,110 @@ +--- +title: Request summary blob +description: Reference docs for the request summary blob +--- + +_Appears in: [`requests`](/docs/reference/tables/requests/) table_\ +_As: [`summary`](/docs/reference/tables/requests/#summary)_ + +JSON-encoded summarization of request data. + +
    +An example of the decoded object +```json +{ + "_cdn_provider": "Edgecast", + "_gzip_save": 0, + "expAge": 604800, + "ext": "", + "format": "", + "method": "GET", + "mimeType": "text/html", + "redirectUrl": null, + "reqBodySize": null, + "reqCookieLen": 0, + "reqHeadersSize": 683, + "respBodySize": 648, + "respCookieLen": 0, + "respHeadersSize": 376, + "respHttpVersion": "HTTP/2", + "respSize": 648, + "status": 200, + "time": 285, + "type": "html" +} +``` +
    + +## Schema + +### `time` + +The total time taken for the request in milliseconds. + +### `_cdn_provider` + +The Content Delivery Network provider. + +### `_gzip_save` + +Bytes saved due to gzip compression. + +### `method` + +The HTTP method used for the request (e.g., "GET", "POST"). + +### `reqHeadersSize` + +The size of the request headers in bytes. + +### `reqBodySize` + +The size of the request body in bytes. + +### `reqCookieLen` + +The length of the request cookies. + +### `status` + +The HTTP status code of the response. + +### `respHttpVersion` + +The HTTP version used in the response. + +### `redirectUrl` + +The URL to which the request was redirected. + +### `respHeadersSize` + +The size of the response headers in bytes. + +### `respBodySize` + +The size of the response body in bytes. + +### `respSize` + +The total size of the response in bytes. + +### `mimeType` + +The MIME type of the response. + +### `ext` + +The file extension of the requested resource. + +### `format` + +The format of the resource. + +### `respCookieLen` + +The length of the response cookies. + +### `expAge` + +The age of the cached response in seconds. diff --git a/src/content/docs/docs/reference/custom-metrics/ads.mdx b/src/content/docs/docs/reference/custom-metrics/ads.mdx new file mode 100644 index 00000000..6d7a259c --- /dev/null +++ b/src/content/docs/docs/reference/custom-metrics/ads.mdx @@ -0,0 +1,446 @@ +--- +title: Ads custom metric +description: Reference docs for the feature struct +--- + +_Appears in: [`custom_metrics.other`](/docs/reference/custom-metrics/other/) struct_\ +_As: [`ads`](/docs/reference/custom-metrics/other/#ads)_ + +
    +An example of the decoded object from `https://www.amazon.com/` page crawl +```json +{ + "ads": { + "present": true, + "status": 200, + "redirected": false, + "account_count": 1, + "account_types": { + "direct": { + "domains": [ + "placeholder.example.com" + ], + "account_count": 1, + "domain_count": 1 + }, + "reseller": { + "domains": [], + "account_count": 0, + "domain_count": 0 + } + }, + "line_count": 10, + "variables": [], + "variable_count": 0 + }, + "app_ads": { + "present": true, + "status": 200, + "redirected": false, + "account_count": 1, + "account_types": { + "direct": { + "domains": [ + "placeholder.example.com" + ], + "account_count": 1, + "domain_count": 1 + }, + "reseller": { + "domains": [], + "account_count": 0, + "domain_count": 0 + } + }, + "line_count": 10, + "variables": [], + "variable_count": 0 + }, + "sellers": { + "present": true, + "redirected": true, + "status": 200, + "seller_count": 2732, + "seller_types": { + "publisher": { + "domains": [ + "cumuli.com", + "realself.com", + "trendscatchers.io", + ... + ], + "seller_count": 2199, + "domain_count": 1923 + }, + "intermediary": { + "domains": [ + "bidsxchange.com", + "vuukle.com", + "vdo.ai", + ... + ], + "seller_count": 232, + "domain_count": 172 + }, + "both": { + "domains": [ + "gourmetads.com", + "freestar.com", + "shinez.io", + ... + ], + "seller_count": 148, + "domain_count": 134 + } + }, + "passthrough_count": 0, + "confidential_count": 2 + } +} +``` +
    + +## Schema + +### `ads` + +Type: `object` + +Contains information about the ads.txt file. + +#### `ads.present` + +Type: `boolean` + +Indicates if the ads.txt file is present. + +#### `ads.status` + +Type: `integer` + +HTTP status code of the ads.txt file response. + +#### `ads.redirected` + +Type: `boolean` + +Indicates if the ads.txt file request was redirected. + +#### `ads.redirected_to` + +Type: `string` + +URL to which the ads.txt resource was redirected. + +#### `ads.account_count` + +Type: `integer` + +Number of advertising accounts listed in the ads.txt file. + +#### `ads.account_types` + +Type: `object` + +Types of accounts (direct or reseller) listed in the ads.txt file. + +#### `ads.account_types.direct` + +Type: `object` + +Information about direct advertising accounts. + +##### `ads.account_types.direct.domains` + +Type: `array` + +List of domains with direct advertising accounts. + +##### `ads.account_types.direct.account_count` + +Type: `integer` + +Number of direct advertising accounts. + +##### `ads.account_types.direct.domain_count` + +Type: `integer` + +Number of unique domains with direct advertising accounts. + +#### `ads.account_types.reseller` + +Type: `object` + +Information about reseller advertising accounts. + +##### `ads.account_types.reseller.domains` + +Type: `array` + +List of domains with reseller advertising accounts. + +##### `ads.account_types.reseller.account_count` + +Type: `integer` + +Number of reseller advertising accounts. + +##### `ads.account_types.reseller.domain_count` + +Type: `integer` + +Number of unique domains with reseller advertising accounts. + +#### `ads.line_count` + +Type: `integer` + +Total number of lines in the ads.txt file. + +#### `ads.variables` + +Type: `array` + +List of variables found in the ads.txt file. + +#### `ads.variable_count` + +Type: `integer` + +Number of variables found in the ads.txt file. + +### `app_ads` + +Type: `object` + +Contains information about the app-ads.txt file. + +#### `app_ads.present` + +Type: `boolean` + +Indicates if the app-ads.txt file is present. + +#### `app_ads.status` + +Type: `integer` + +HTTP status code of the app-ads.txt file response. + +#### `app_ads.redirected` + +Type: `boolean` + +Indicates if the app-ads.txt file request was redirected. + +#### `app_ads.redirected_to` + +Type: `string` + +URL to which the app-ads.txt resource was redirected. + +#### `app_ads.account_count` + +Type: `integer` + +Number of advertising accounts listed in the app-ads.txt file. + +#### `app_ads.account_types` + +Type: `object` + +Types of accounts (direct or reseller) listed in the app-ads.txt file. + +#### `app_ads.account_types.direct` + +Type: `object` + +Information about direct advertising accounts. + +##### `app_ads.account_types.direct.domains` + +Type: `array` + +List of domains with direct advertising accounts. + +##### `app_ads.account_types.direct.account_count` + +Type: `integer` + +Number of direct advertising accounts. + +##### `app_ads.account_types.direct.domain_count` + +Type: `integer` + +Number of unique domains with direct advertising accounts. + +#### `app_ads.account_types.reseller` + +Type: `object` + +Information about reseller advertising accounts. + +##### `app_ads.account_types.reseller.domains` + +Type: `array` + +List of domains with reseller advertising accounts. + +##### `app_ads.account_types.reseller.account_count` + +Type: `integer` + +Number of reseller advertising accounts. + +##### `app_ads.account_types.reseller.domain_count` + +Type: `integer` + +Number of unique domains with reseller advertising accounts. + +#### `app_ads.line_count` + +Type: `integer` + +Total number of lines in the app-ads.txt file. + +#### `app_ads.variables` + +Type: `array` + +List of variables found in the app-ads.txt file. + +#### `app_ads.variable_count` + +Type: `integer` + +Number of variables found in the app-ads.txt file. + +### `sellers` + +Type: `object` + +Contains information about the sellers.json file. + +#### `sellers.present` + +Type: `boolean` + +Indicates if the sellers.json file is present. + +#### `sellers.status` + +Type: `integer` + +HTTP status code of the sellers.json file response. + +#### `sellers.redirected` + +Type: `boolean` + +Indicates if the sellers.json file request was redirected. + +#### `sellers.redirected_to` + +Type: `string` + +URL to which the sellers.json resource was redirected. + +#### `sellers.seller_count` + +Type: `integer` + +Number of sellers listed in the sellers.json file. + +#### `sellers.seller_types` + +Type: `object` + +Types of sellers (publisher, intermediary, both) listed in the sellers.json file. + +#### `sellers.seller_types.publisher` + +Type: `object` + +Information about publisher sellers. + +##### `sellers.seller_types.publisher.domains` + +Type: `array` + +List of domains associated with publisher sellers. + +##### `sellers.seller_types.publisher.seller_count` + +Type: `integer` + +Number of publisher sellers. + +##### `sellers.seller_types.publisher.domain_count` + +Type: `integer` + +Number of unique domains associated with publisher sellers. + +#### `sellers.seller_types.intermediary` + +Type: `object` + +Information about intermediary sellers. + +##### `sellers.seller_types.intermediary.domains` + +Type: `array` + +List of domains associated with intermediary sellers. + +##### `sellers.seller_types.intermediary.seller_count` + +Type: `integer` + +Number of intermediary sellers. + +##### `sellers.seller_types.intermediary.domain_count` + +Type: `integer` + +Number of unique domains associated with intermediary sellers. + +#### `sellers.seller_types.both` + +Type: `object` + +Information about sellers who are both publishers and intermediaries. + +##### `sellers.seller_types.both.domains` + +Type: `array` + +List of domains associated with sellers who are both publishers and intermediaries. + +##### `sellers.seller_types.both.seller_count` + +Type: `integer` + +Number of sellers who are both publishers and intermediaries. + +##### `sellers.seller_types.both.domain_count` + +Type: `integer` + +Number of unique domains associated with sellers who are both publishers and intermediaries. + +#### `sellers.passthrough_count` + +Type: `integer` + +Number of passthrough sellers listed in the sellers.json file. + +#### `sellers.confidential_count` + +Type: `integer` + +Number of confidential sellers listed in the sellers.json file. + diff --git a/src/content/docs/docs/reference/custom-metrics/other.mdx b/src/content/docs/docs/reference/custom-metrics/other.mdx new file mode 100644 index 00000000..2a016072 --- /dev/null +++ b/src/content/docs/docs/reference/custom-metrics/other.mdx @@ -0,0 +1,163 @@ +--- +title: Other custom metric +description: Reference docs for the other custom metric +--- + +_Appears in: [`custom_metrics`](/docs/reference/structs/custom-metrics/) struct_\ +_As: [`other`](/docs/reference/structs/custom-metrics/#other)_ + +## Schema + +### `ads` + +Advertising technology and usage. See the [ads](/docs/reference/custom-metrics/ads/) custom metric for more information. + +### `almanac` + +Metrics defined in the early versions of Web Almanac crawls. + +### `aurora` + +Project Aurora. + +### `avg_dom_depth` + +The average DOM depth of a page. + +### `Colordepth` + +Color depth of a screen. + +### `crawl_links` + +The links found during a crawl. + +### `css` + +CSS usage. + +### `doctype` + +Document type declaration. + +### `document_height` + +Height of the document. + +### `document_width` + +Width of the document. + +### `Dpi` + +Dots per inch (DPI) of a screen. + +### `event-names` + +Event names used in JavaScript. + +### `fugu-apis` + +Usage of Fugu APIs. + +### `generated-content` + +Client-side generated content. + +### `has_shadow_root` + +Presence of shadow DOM roots. + +### `Images` + +Images usage. + +### `img-loading-attr` + +Image loading attributes. + +### `initiators` + +Resource initiators. + +### `inline_style_bytes` + +Type: `integer` + +Size of inline styles. + +### `lib-detector-version` + +Libraries detector version. + +### `localstorage_size` + +Size of local storage. + +### `meta_viewport` + +Meta viewport tag. + +### `num_iframes` + +Type: `integer` + +Number of iframes on a page. + +### `num_scripts` + +Type: `integer` + +Number of script tags. + +### `num_scripts_async` + +Type: `integer` + +Number of asynchronous scripts. + +### `num_scripts_sync` + +Type: `integer` + +Number of synchronous scripts. + +### `observers` + +Metrics related to the usage of observer APIs. + +### `privacy-sandbox` + +Privacy Sandbox initiative usage. + +### `pwa` + +Progressive Web Apps. + +### `quirks_mode` + +Usage of quirks mode in browsers. + +### `Resolution` + +Resolution of a screen. + +### `robots_meta` + +Robots meta tag. + +### `sass` + +Usage of Sass. + +### `sessionstorage_size` + +Size of session storage. + +### `usertiming` + +User Timing API. + +### `valid-head` + +Validity of the head element. diff --git a/src/content/docs/docs/reference/custom-metrics/privacy.mdx b/src/content/docs/docs/reference/custom-metrics/privacy.mdx new file mode 100644 index 00000000..070f60be --- /dev/null +++ b/src/content/docs/docs/reference/custom-metrics/privacy.mdx @@ -0,0 +1,293 @@ +--- +title: Privacy custom metric +description: Reference docs for the privacy custom metric +--- + +_Appears in: [`custom_metrics`](/docs/reference/structs/custom-metrics/) struct_\ +_As: [`privacy`](/docs/reference/structs/custom-metrics/#privacy)_ + +
    +An example of the decoded object from `https://www.google.com/` page crawl +```json +{ + "privacy_wording_links": [ + { + "text": "Privacy" + } + ], + "iab_tcf_v1": { + "present": false, + "data": null, + "compliant_setup": null + }, + "iab_tcf_v2": { + "present": false, + "data": null, + "compliant_setup": null + }, + "iab_usp": { + "present": false, + "privacy_string": null + }, + "navigator_doNotTrack": false, + "navigator_globalPrivacyControl": false, + "document_permissionsPolicy": false, + "document_featurePolicy": false, + "referrerPolicy": { + "entire_document_policy": "origin", + "individual_requests": null, + "link_relations": null + }, + "media_devices": { + "navigator_mediaDevices_enumerateDevices": false, + "navigator_mediaDevices_getUserMedia": true, + "navigator_mediaDevices_getDisplayMedia": false + }, + "geolocation": { + "navigator_geolocation_getCurrentPosition": false, + "navigator_geolocation_watchPosition": false + }, + "fingerprinting": { + "counts": { + "prefers-contrast": 4, + "forced-colors": 15, + "devicememory": 1, + "hardwareconcurrency": 2, + "localstorage": 5, + "screen.width": 7, + "screen.height": 5, + "sessionstorage": 1, + "gettimezoneoffset": 5, + "maxtouchpoints": 5, + "ontouchstart": 5, + "navigator.vendor": 1, + "getchanneldata": 4, + "navigator.platform": 1 + }, + "likelyFingerprintingScripts": [ + "https://www.google.com/", + "https://www.gstatic.com/og/_/js/k=og.qtm.en_US.ftxzKLuybBw.2019.O/rt=j/m=qabr,q_d,qcwid,qapid,qald,q_dg/exm=qaaw,qadd,qaid,qein,qhaw,qhba,qhbr,qhch,qhga,qhid,qhin/d=1/ed=1/rs=AA2YrTsOEv0aSAP39vut5xzjLXfdU4aRbQ", + ... + ] + }, + "request_hostnames_with_cname": { + "ogs.google.com": [ + "www3.l.google.com" + ], + "apis.google.com": [ + "plus.l.google.com" + ] + }, + "ccpa_link": { + "hasCCPALink": false, + "CCPALinkPhrases": [] + } +} +``` +
    + +## Schema + +### `privacy_wording_links` + +Type: `array` + +Links related to privacy policy. + +#### `privacy_wording_links[i].text` + +Type: `string` + +Title of the link. + +### `iab_tcf_v1` + +Type: `object` + +IAB TCF v1 settings. + +#### `iab_tcf_v1.present` + +Type: `boolean` + +Presence of IAB TCF v1. + +#### `iab_tcf_v1.data` + +Type: `object` + +TCF v1 vendor consents. [VendorConsents](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/CMP%20JS%20API%20v1.1%20Final.md#vendorconsents-) + +#### `iab_tcf_v1.compliant_setup` + +Type: `boolean` + +Verifies compliance of TCF v1 vendor consents. + +### `iab_tcf_v2` + +Type: `object` + +IAB TCF v2 settings. + +#### `iab_tcf_v2.present` + +Type: `boolean` + +Presence of IAB TCF v2. + +#### `iab_tcf_v2.data` + +Type: `object` + +TCF v2 vendor consents. [TCData](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#tcdata) + +#### `iab_tcf_v2.compliant_setup` + +Type: `boolean` + +Verifies compliance of TCF v2 vendor consents. + +### `iab_usp` + +Type: `object` + +Shows the presence of IAB U.S. Privacy String. + +#### `iab_usp.present` + +Type: `boolean` + +Shows the presence of IAB U.S. Privacy String. + +#### `iab_usp.privacy_string` + +Type: `string` + +IAB U.S. Privacy String. + +### `navigator_doNotTrack` + +Type: `boolean` + +Indicates whether the browser's "Do Not Track" setting is enabled. + +### `navigator_globalPrivacyControl` + +Type: `boolean` + +Indicates whether the browser's Global Privacy Control setting is enabled. + +### `document_permissionsPolicy` + +Type: `boolean` + +Indicates the presence of the Permissions Policy. + +### `document_featurePolicy` + +Type: `boolean` + +Indicates the presence of the Feature Policy. + +### `referrerPolicy` + +Type: `object` + +Specifies the referrer policy for the entire document and individual requests. + +#### `referrerPolicy.entire_document_policy` + +Type: `string` + +Referrer policy for the entire document. + +#### `referrerPolicy.individual_requests` + +Type: `string` + +Referrer policy for individual requests. + +#### `referrerPolicy.link_relations` + +Type: `string` + +Referrer policy for link relations. + +### `media_devices` + +Type: `object` + +Tracks the usage of media device APIs like `enumerateDevices` and `getUserMedia`. + +#### `media_devices["API_NAME"]` + +Type: `boolean` + +Indicates usage of a particular API. + +### `geolocation` + +Type: `object` + +Tracks the usage of geolocation APIs like `getCurrentPosition` and `watchPosition`. + +#### `geolocation["API_NAME"]` + +Type: `boolean` + +Indicates usage of a particular API. + +### `fingerprinting` + +Type: `object` + +Tracks potential fingerprinting attempts by counting API calls and listing likely fingerprinting scripts. + +#### `fingerprinting.counts` + +Type: `object` + +Counts of fingerprinting-related API calls. + +#### `fingerprinting.counts["API_NAME"]` + +Type: `integer` + +Counts of fingerprinting-related API calls. + +#### `fingerprinting.likelyFingerprintingScripts` + +Type: `array` + +List of likely fingerprinting script URLs. + +### `request_hostnames_with_cname` + +Type: `object` + +Lists hostnames with their corresponding CNAME records. + +#### `request_hostnames_with_cname.["HOSTNAME"]` + +Type: `array` + +CNAME records for a given hostname. + +### `ccpa_link` + +Type: `object` + +California Consumer Privacy Act (CCPA) compliance. + +#### `ccpa_link.hasCCPALink` + +Type: `boolean` + +Presence of a CCPA link. + +#### `ccpa_link.CCPALinkPhrases` + +Type: `array` + +Related CCPA link phrases. diff --git a/src/content/docs/docs/reference/functions/capo.mdx b/src/content/docs/docs/reference/functions/capo.mdx new file mode 100644 index 00000000..6b3f2c30 --- /dev/null +++ b/src/content/docs/docs/reference/functions/capo.mdx @@ -0,0 +1,98 @@ +--- +title: CAPO function +description: Reference docs for the httparchive.fn.CAPO function +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The [`httparchive.fn.CAPO`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sCAPO) function takes an HTML response body and returns an array of objects containing the relative performance weighting for each element in the static HTML ``. + +Learn more about using Capo on BigQuery in the [capo.js docs](https://github.com/rviscomi/capo.js/tree/main/bigquery). + +## Input + +### `html` + +The HTML response body. + +**Type:** `STRING` + +Response bodies can be sourced from the `response_body` field of the [`requests`](/docs/reference/tables/requests/) table, or the `body` field of legacy `response_bodies` tables. + +The HTML does not need to be complete and can contain only the `` element, so for faster results and to avoid hitting memory limitations of BigQuery functions, it's recommended to extract everything before the opening `` tag using a regular expression like this: + +```sql +REGEXP_EXTRACT(response_body, r'(?s)(.*)()') +``` + +## Output + +Capo object. + +**Type:** `ARRAY>` + +## Example usage + +### Static input + + + + +```sql +SELECT httparchive.fn.CAPO(''' + + + Example + + + + + + +''') +``` + + + + +vizWeight | weight | element +-- | -- | -- +██████████ | 9 | `Example` +█ | 0 | `` +█████ | 4 | `` +███ | 2 | `` +███████████ | 10 | `` + + + + +### Live input + + + + +```sql +SELECT + page, + httparchive.fn.CAPO(response_body) AS capo +FROM `httparchive.crawl.requests` TABLESAMPLE SYSTEM (0.001 PERCENT) +WHERE + date = '2023-05-01' AND + client = 'desktop' AND + is_main_document +LIMIT 1 +``` + + + + +page | vizWeight | weight | element +-- | -- | -- | -- +https://www.example.com/ | ██████████ | 9 | `Example Domain` +https://www.example.com/ | ███████████ | 10 | `` +https://www.example.com/ | ███████████ | 10 | `` +https://www.example.com/ | ███████████ | 10 | `` +https://www.example.com/ | █████ | 4 | `` + + + diff --git a/src/content/docs/docs/reference/functions/get_host_categories.mdx b/src/content/docs/docs/reference/functions/get_host_categories.mdx new file mode 100644 index 00000000..0f776bc9 --- /dev/null +++ b/src/content/docs/docs/reference/functions/get_host_categories.mdx @@ -0,0 +1,105 @@ +--- +title: GET_HOST_CATEGORIES function +description: Reference docs for the httparchive.fn.GET_HOST_CATEGORIES function +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +We are happy to release the largest open-source dataset of website categories, featuring 147 million hosts and 31 million domains, making it the most extensive open-source data available in this area. + +The [`GET_HOST_CATEGORIES`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sGET_HOST_CATEGORIES) function retrieves the category information of a given hostname. It maps hostnames to their respective categories using a pre-classified dataset. + +## Input + +### `input_host` +The function takes a single parameter: `input_host`, which is a STRING representing the hostname to be classified. The hostname can be a full URL (e.g., `https://store.google.com/product`) or just the host (e.g., `store.google.com`). + +**Type:** `STRING` + + +### Output +- ARRAY of STRUCT containing: + - `domain` (STRING): The queried host. + - `category_id` (INT64): The category ID of the host. + - `full_category` (STRING): The full hierarchical category. + - `subcategory` (STRING): The most specific subcategory. + - `parent_category` (STRING): The parent category. + +### Example Query + + + + +```sql +SELECT * +FROM UNNEST(httparchive.fn.GET_HOST_CATEGORIES('apple.com')) +``` + + + + +```json +[{ + "host": "apple.com", + "category_id": "528", + "full_category": "/Internet \u0026 Telecom/Mobile Phones", + "subcategory": "Mobile Phones", + "parent_category": "/Internet \u0026 Telecom/" +}, { + "host": "apple.com", + "category_id": "129", + "full_category": "/Computers \u0026 Electronics/Consumer Electronics", + "subcategory": "Consumer Electronics", + "parent_category": "/Computers \u0026 Electronics/" +}] +``` + + + +You can also integrate this function into another SQL query by joining its result with your target table. Here is an example: + + + + +```sql +SELECT + url, + category_id, + full_category, + subcategory, + parent_category +FROM `httparchive.urls.latest_crux_mobile`, + UNNEST(`httparchive.fn.GET_HOST_CATEGORIES`(url)) + ``` + + + + + +## Methodology +The classification of hostnames is performed using Chrome's Topics API (currently `chrome5`) by [Nurullah Demir](https://ndemir.com) and [Yohan Beugin](https://yohan.beugin.org/) using [this repository](https://github.com/yohhaan/httparchive-topics-classification). The taxonomy used is version 2, which consists of 469 categories as defined in the [Topics API taxonomy v2](https://github.com/patcg-individual-drafts/topics/blob/a116e9e404dd96c7793fe6542c53e9a9d93cb75b/taxonomy_v2.md). + +This model is applied to all requests in the HTTP Archive's dataset from the first crawl in November 2010 to June 2024. These requests include the page's HTML document itself as well as all of its subresources. + +### Raw Data +The raw data for the classifications is stored in the `httparchive.urls.categories` table. This table consists of pre-classified hostnames with their corresponding categories. The categories follow a hierarchical structure, providing both specific subcategories and broader parent categories. + +Please consider the limitations of our method regarding some hosts discussed [here](https://github.com/HTTPArchive/httparchive.org/issues/868). Thus, while this data can be accessed directly, we highly recommend using the `GET_HOST_CATEGORIES` function due to the handling of hashed subdomains. If your analysis requires working with domains (e.g., `google.com` instead of `maps.google.com`), accessing the raw data directly is also appropriate. + + +## Limitations +As with many classification models, our approach has some limitations: + +- **Unclassified Hosts**: Some hosts might not be classified if they fall outside the scope of the classification model used, such as adult or gambling sites. +- **Hashed Subdomains**: For certain hosts like `googlesyndication.com` and others, the function returns the category of the main domain. This is because these hosts typically contain hashed subdomains, which would otherwise lead to inconsistent classifications. + +The function specifically addresses domains (currently top 50) known for having numerous hashed subdomains. Some of these domains include: +- `googlesyndication.com` +- `gstatic.com` +- `cloudfront.net` +- `akamaihd.net` +- `doubleclick.net` +- `amazonaws.com` + +And others as seen in the [function source](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sGET_HOST_CATEGORIES). + diff --git a/src/content/docs/docs/reference/functions/get_lcp_lazy.mdx b/src/content/docs/docs/reference/functions/get_lcp_lazy.mdx new file mode 100644 index 00000000..61a667c6 --- /dev/null +++ b/src/content/docs/docs/reference/functions/get_lcp_lazy.mdx @@ -0,0 +1,149 @@ +--- +title: GET_LCP_LAZY function +description: Reference docs for the httparchive.fn.GET_LCP_LAZY function +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The [`httparchive.fn.GET_LCP_LAZY`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sGET_LCP_LAZY) function returns whether the LCP element had native and/or custom lazy-loading attributes. + +## Input + +### `performance_custom_metric` + +The JSON-encoded [`performance`](https://github.com/HTTPArchive/custom-metrics/blob/main/dist/performance.js) custom metric of a page. + +**Type:** `STRING` + +## Output + +Lazy-loading information about the LCP element. + +If the LCP element had native lazy-loading, the `native` property will be `true`. + +If the LCP element had custom lazy-loading, the `custom` property will be an array of CSS selectors representing the techniques used, which can be any of: + +- `[data-src]` +- `[data-rimg]` +- `[data-lazy]` +- `[class~=lazyload]` +- `[class~=swiper-lazy]` + +For custom attributes, only the name needs to match (the value is ignored). For custom classes, the value must exist anywhere in the attribute separated by whitespace. + +**Type:** `STRUCT>` + +## Example usage + +### Percent of pages that natively lazy load their LCP element + + + + +```sql +WITH lazy AS ( + SELECT + `httparchive.fn.GET_LCP_LAZY`(TO_JSON_STRING(custom_metrics.performance)).native + FROM `httparchive.crawl.pages` + WHERE + date = '2023-11-01' AND + client = 'mobile' AND + is_root_page +) + +SELECT + COUNTIF(native) / COUNT(0) AS pct_lazy +FROM + lazy +``` + + + + +| pct_lazy | +| -- | +| 0.039 | + + + + +### Top custom lazy-loading techniques + + + + +```sql +WITH lazy AS ( + SELECT + `httparchive.fn.GET_LCP_LAZY`(TO_JSON_STRING(custom_metrics.performance)).custom + FROM `httparchive.crawl.pages` + WHERE + date = '2023-11-01' AND + client = 'mobile' AND + is_root_page +) + +SELECT + APPROX_TOP_COUNT(value, 10) AS custom_technique +FROM + lazy, + UNNEST(custom) AS value +``` + + + + +custom_technique.value | custom_technique.count +-- | -- +`[data-src]` | 585469 +`[data-rimg]` | 12434 +`[class~=lazyload]` | 6497 +`[data-lazy]` | 4490 +`[class~=swiper-lazy]` | 553 + + + + +## Routine + +```sql +try { + const perf = JSON.parse(performance_custom_metric); + const lcpAttrs = perf.lcp_elem_stats.attributes; + + const custom = [{ + name: 'data-src' + }, { + name: 'data-rimg' + }, { + name: 'data-lazy' + }, { + name: 'class', + value: 'lazyload' + }, { + name: 'class', + value: 'swiper-lazy' + }].map(config => { + if (config.value) { + config.regex = new RegExp(`(^|\\s)${config.value}(\\s|$)`); + } + return config; + }); + + + return { + native: lcpAttrs.some(({name, value}) => { + return name == 'loading' && value == 'lazy'; + }), + custom: custom.filter(({name, value, regex}) => { + return lcpAttrs.some(attr => { + return attr.name == name && (!value || regex.test(attr.value)); + }); + }).map(({name, value}) => { + return `[${name}${value ? `~=${value}` : ''}]`; + }) + } +} catch { + return null; +} +``` diff --git a/src/content/docs/docs/reference/functions/get_lcp_priority.mdx b/src/content/docs/docs/reference/functions/get_lcp_priority.mdx new file mode 100644 index 00000000..2157722c --- /dev/null +++ b/src/content/docs/docs/reference/functions/get_lcp_priority.mdx @@ -0,0 +1,75 @@ +--- +title: GET_LCP_PRIORITY function +description: Reference docs for the httparchive.fn.GET_LCP_PRIORITY function +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The [`httparchive.fn.GET_LCP_PRIORITY`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sGET_LCP_PRIORITY) function returns the value of the `fetchpriority` attribute of the LCP element. + +## Input + +### `performance_custom_metric` + +The JSON-encoded [`performance`](https://github.com/HTTPArchive/custom-metrics/blob/main/dist/performance.js) custom metric of a page. + +**Type:** `STRING` + +## Output + +The value of the `fetchpriority` attribute of the LCP element, or `null` if the LCP element does not have a `fetchpriority` attribute. + +**Type:** `STRING` + +## Example usage + +### Top `fetchpriority` values + + + + +```sql +WITH lcp AS ( + SELECT + `httparchive.fn.GET_LCP_PRIORITY`(TO_JSON_STRING(custom_metrics.performance)) AS priority + FROM `httparchive.crawl.pages` + WHERE + date = '2023-11-01' AND + client = 'mobile' AND + is_root_page +) + +SELECT APPROX_TOP_COUNT(priority, 10) AS priority +FROM lcp +``` + + + + +priority.value | priority.count +-- | -- +_null_ | 15892076 +high | 697184 +low | 5103 +auto | 3255 +hight | 24 +highest | 17 +"" | 14 +”high” | 4 +High | 4 +medium | 3 + + + + +## Routine + +```sql +try { + const perf = JSON.parse(performance_custom_metric); + const lcpAttrs = perf.lcp_elem_stats.attributes; + return lcpAttrs.find(attr => attr.name == 'fetchpriority')?.value +} catch { + return null; +} +``` diff --git a/src/content/docs/docs/reference/functions/get_origin.mdx b/src/content/docs/docs/reference/functions/get_origin.mdx new file mode 100644 index 00000000..2160bdab --- /dev/null +++ b/src/content/docs/docs/reference/functions/get_origin.mdx @@ -0,0 +1,99 @@ +--- +title: GET_ORIGIN function +description: Reference docs for the httparchive.fn.CAPO function +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The [`httparchive.fn.GET_ORIGIN`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!6m3!1shttparchive!2sfn!3sGET_ORIGIN) function returns the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) for a given URL. + +## Input + +### `url` + +The URL of a web page. + +**Type:** `STRING` + +## Output + +The corresponding origin. + +**Type:** `STRING` + +## Example usage + +### Basic usage + + + + +```sql +SELECT + url, + `httparchive.fn.GET_ORIGIN`(url) AS origin +FROM UNNEST([ + 'https://www.example.com/product/123', + 'https://example.com/', + 'http://example.com:80/index.html' + ]) AS url +``` + + + + +url | origin +-- | -- +https://www.example.com/product/123 | https://www.example.com +https://example.com/ | https://example.com +http://example.com:80/index.html | http://example.com:80 + + + + +### Counting cross-origin resources per page + + + + +```sql +WITH cross_origin AS ( + SELECT + COUNT(0) AS resources + FROM `httparchive.crawl.requests` + WHERE + date = '2023-11-01' AND + client = 'mobile' AND + is_root_page AND + `httparchive.fn.GET_ORIGIN`(url) != `httparchive.fn.GET_ORIGIN`(page) + GROUP BY page +) + + +SELECT + APPROX_QUANTILES(resources, 1000)[OFFSET(500)] AS median_xo_resources_per_page +FROM + cross_origin +``` + + + + +| median_xo_resources_per_page | +| -- | +| 27 | + + + + +## Routine + +```sql +LOWER(CONCAT( + -- only network protocols (excludes blob, filesystem, chrome, etc) + REGEXP_EXTRACT(url, r'(?i)^(https?://)'), + NET.HOST(url), + -- be lazy and include @ and : for username/password without enforcing order. + IFNULL(REGEXP_EXTRACT(url, r'(?i)^https?://[\w-.@:]+(:\d+)'), '') + )) +``` diff --git a/src/content/docs/docs/reference/structs/custom-metrics.mdx b/src/content/docs/docs/reference/structs/custom-metrics.mdx new file mode 100644 index 00000000..5867a2f6 --- /dev/null +++ b/src/content/docs/docs/reference/structs/custom-metrics.mdx @@ -0,0 +1,153 @@ +--- +title: Custom metrics struct +description: Reference docs for the custom metrics struct +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As [`custom_metrics`](/docs/reference/tables/pages/#custom_metrics)_ + +## Schema + +
    Field name
    |
    Type
    | Description +---|---|--- +`a11y` | `JSON` | Accessibility +`cms` | `JSON` | Content Management Systems +`cookies` | `JSON` | Cookie usage +`css_variables` | `JSON` | Use of CSS variables +`ecommerce` | `JSON` | E-commerce features +`element_count` | `JSON` | Number of elements on a page +`javascript` | `JSON` | JavaScript usage +`markup` | `JSON` | HTML markup +`media` | `JSON` | Media elements +`origin_trials` | `JSON` | Origin Trials +`performance` | `JSON` | Web performance +`privacy` | `JSON` | Privacy settings and policies. See the [`privacy`](/docs/reference/custom-metrics/privacy/) custom metrics for more information +`responsive_images` | `JSON` | Responsive image techniques +`robots_txt` | `JSON` | robots.txt file +`security` | `JSON` | Security features +`structured_data` | `JSON` | Structured data +`third_parties` | `JSON` | Third-party resources +`well_known` | `JSON` | well-known URIs +`wpt_bodies` | `JSON` | Metrics derived from WebPageTest bodies object +`other` | `JSON` | See the [other](/docs/reference/custom-metrics/other/) custom metrics for more information + + +### `a11y` + +Type: `JSON` + +Accessibility. + +### `cms` + +Type: `JSON` + +Content Management Systems. + +### `cookies` + +Type: `JSON` + +Cookie usage. + +### `css_variables` + +Type: `JSON` + +Use of CSS variables. + +### `ecommerce` + +Type: `JSON` + +E-commerce features. + +### `element_count` + +Type: `JSON` + +Number of elements on a page. + +### `javascript` + +Type: `JSON` + +JavaScript usage. + +### `markup` + +Type: `JSON` + +HTML markup. + +### `media` + +Type: `JSON` + +Media elements. + +### `origin_trials` + +Type: `JSON` + +Origin Trials. + +### `performance` + +Type: `JSON` + +Web performance. + +### `privacy` + +Type: `JSON` + +Privacy settings and policies. See the [`privacy`](/docs/reference/custom-metrics/privacy/) custom metrics for more information. + +### `responsive_images` + +Type: `JSON` + +Responsive image techniques. + +### `robots_txt` + +Type: `JSON` + +robots.txt file. + +### `security` + +Type: `JSON` + +Security features. + +### `structured_data` + +Type: `JSON` + +Structured data. + +### `third_parties` + +Type: `JSON` + +Third-party resources. + +### `well_known` + +Type: `JSON` + +well-known URIs. + +### `wpt_bodies` + +Type: `JSON` + +Metrics derived from WebPageTest bodies object. + +### `other` + +Type: `JSON` + +See the [other](/docs/reference/custom-metrics/other/) custom metrics for more information. diff --git a/src/content/docs/docs/reference/structs/feature.mdx b/src/content/docs/docs/reference/structs/feature.mdx new file mode 100644 index 00000000..00261947 --- /dev/null +++ b/src/content/docs/docs/reference/structs/feature.mdx @@ -0,0 +1,28 @@ +--- +title: Feature struct +description: Reference docs for the feature struct +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_ + +Each header is a key-value pair corresponding to an HTTP header sent from or to the client: request and response headers, respectively. + +## Schema + +Field name | Type | Description +---|---|--- +`feature` | `STRING` | Blink feature name +`id` | `STRING` | Blink feature ID +`type` | `STRING` | Blink feature type (css, default) + +### `feature` + +Blink feature name + +### `id` + +Blink feature ID + +### `type` + +Blink feature type (css, default) diff --git a/src/content/docs/docs/reference/structs/header.mdx b/src/content/docs/docs/reference/structs/header.mdx new file mode 100644 index 00000000..6a66c286 --- /dev/null +++ b/src/content/docs/docs/reference/structs/header.mdx @@ -0,0 +1,24 @@ +--- +title: Header struct +description: Reference docs for the header struct +--- + +_Appears in: [`requests`](/docs/reference/tables/requests/) table_\ +_As: `request_headers`, `response_headers`_ + +Each header is a key-value pair corresponding to an HTTP header sent from or to the client: request and response headers, respectively. + +## Schema + +Field name | Type | Description +---|---|--- +`name` | string | Header name +`value` | string | Header value + +### `name` + +Header name + +### `value` + +Header value diff --git a/src/content/docs/docs/reference/structs/technology.mdx b/src/content/docs/docs/reference/structs/technology.mdx new file mode 100644 index 00000000..843550ef --- /dev/null +++ b/src/content/docs/docs/reference/structs/technology.mdx @@ -0,0 +1,100 @@ +--- +title: Technology struct +description: Reference docs for the technology struct +--- + +_Appears in: [`pages`](/docs/reference/tables/pages/) table_\ +_As: [`technologies`](/docs/reference/tables/pages/#technologies)_ + +Technologies are detected by [Wappalyzer](https://www.wappalyzer.com/). Refer to HTTP Archive's fork of the [Wappalyzer repository](https://github.com/HTTPArchive/wappalyzer) on GitHub to request a new technology detection or to browse the source code of existing detections. + +## Schema + +
    Field name
    |
    Type
    | Description +---|---|--- +`technology` | `STRING` | Name of the detected technology +`categories` | `ARRAY` | List of categories to which this technology belongs +`info` | `ARRAY` | Additional metadata about the detected technology, ie version number + +### `technology` + +Type: `STRING` + +Name of the detected technology + +### `categories` + +Type: `ARRAY` + +List of categories to which this technology belongs + +### `info` + +Type: `ARRAY` + +Additional metadata about the detected technology, ie version number + +## Example queries + +### Pages using WordPress in the top 1k + +As the `technologies` field is a repeated struct, we need to use `UNNEST` to query it. + +```sql +SELECT DISTINCT + root_page +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS t +WHERE + date = '2023-09-01' AND + rank = 1000 AND + t.technology = 'WordPress' +``` + +### Top 10 CMSs + +Within the `technologies` field, the `categories` field is also repeated. We can use `UNNEST` to query it as well. + +It's straightforward to detect whether a page uses a technology. However, to generalize that to an entire website (or origin), we detect if either its `root_page` or secondary page use it. To handle this in the query, we count the distinct number of pages' `root_page` fields. + +```sql +SELECT + t.technology AS cms, + COUNT(DISTINCT root_page) AS sites +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS t, + UNNEST(t.categories) AS category +WHERE + date = '2023-09-01' AND + category = 'CMS' +GROUP BY + cms +ORDER BY + sites DESC +LIMIT + 10 +``` + +### Top 10 WordPress versions + +There is usually only one technology version on a given page, but in some cases a site uses the same technology twice. For example, multiple widgets load different versions of jQuery. + +To account for these edge cases, the `info` field is also repeated, so we need to use `UNNEST` to query it as well. + +Also note that some pages omit version numbers, so you may see empty or null values in the results. + +Regular expressions can be used to parse major version numbers, for example `REGEXP_EXTRACT(version, r'^(\d+)')`. Beware of garbage values, as the version info is extracted from the source HTML. For example, you may encounter a subset of pages with a version number that hasn't even been released yet. + +```sql +SELECT + APPROX_TOP_COUNT(version, 10) +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS t, + UNNEST(t.info) AS version +WHERE + date = '2023-09-01' AND + t.technology = 'WordPress' +``` diff --git a/src/content/docs/docs/reference/tables/pages.mdx b/src/content/docs/docs/reference/tables/pages.mdx new file mode 100644 index 00000000..e7102856 --- /dev/null +++ b/src/content/docs/docs/reference/tables/pages.mdx @@ -0,0 +1,214 @@ +--- +title: Pages table +description: Reference docs for the httparchive.crawl.pages table +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +[`httparchive.crawl.pages`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1shttparchive!2scrawl!3spages) is a partitioned and clustered table containing one row per page tested in the HTTP Archive. Pages are tested on a monthly basis and as of April 2022, both the root page and one secondary page are tested. + +## Schema + +
    Field name
    |
    Type
    | Description +---|---|--- +[`date`](#date) | `DATE` | YYYY-MM-DD format of the HTTP Archive monthly crawl +[`client`](#client) | `STRING` | Test environment: `'desktop'` or `'mobile'` +[`page`](#page) | `STRING` | The URL of the page being tested +[`is_root_page`](#is_root_page) | `BOOLEAN` | Whether the page is the root of the origin +[`root_page`](#root_page) | `STRING` | The URL of the root page being tested, the origin followed by `/` +[`rank`](#rank) | `INTEGER` | Site popularity rank, from CrUX +[`wptid`](#wptid) | `STRING` | ID of the WebPageTest results +[`payload`](#payload) | `JSON` | JSON-encoded WebPageTest results for the page +[`summary`](#summary) | `JSON` | JSON-encoded summarization of the page-level data +[`custom_metrics`](#custom_metrics) | `RECORD` | JSON-encoded test results of the custom metrics +[`lighthouse`](#lighthouse) | `JSON` | JSON-encoded Lighthouse report +[`features`](#features) | ARRAY\ | Blink features detected at runtime +[`technologies`](#technologies) | ARRAY\ | Technologies detected at runtime +[`metadata`](#metadata) | `JSON` | Additional metadata about the test + +### `date` + +**This field is required for all queries over the `pages` table.** + +YYYY-MM-DD format of the HTTP Archive monthly crawl. + + Example: `date = '2023-06-01'` + +### `client` + +Test environment: `'desktop'` or `'mobile'`. + +### `page` + +The URL of the page being tested. + +Example: `page = 'https://httparchive.org/'` + +### `is_root_page` + +Whether the page is the root of the origin. + +### `root_page` + +The URL of the root page being tested, the origin followed by `/`. + +Example: `root_page = 'https://httparchive.org/'` + +### `rank` + +Site popularity rank, from CrUX + +### `wptid` + +ID of the WebPageTest results, for example `wptid = '230509_Dx20W_FMHK5'`. + +The ID encodes the date of the test at the start in YYMMDD format. The date is followed by an underscore and a `D` or `M` character indicating whether it was a desktop or mobile test. The rest of the ID is randomly generated. In the example above we can tell that the page was tested on May 9, 2023, and that it was a desktop test. + +You can view the WebPageTest results in the browser by visiting `https://webpagetest.httparchive.org/result//`, eg https://webpagetest.httparchive.org/result/230509_Dx20W_FMHK5/. This is HTTP Archive's own private instance of WebPageTest, which is required to view any of the results. + +### `payload` + +JSON-encoded WebPageTest results for the page. + +For a full example value, see [payload.json](/static/json/payload.json). + +See the [Page payload](/docs/reference/blobs/page-payload/) reference for more details. + +### `summary` + +JSON-encoded summarization of the page-level data + +See the [Page summary](/docs/reference/blobs/page-summary/) reference for more details. + +### `custom_metrics` + +JSON-encoded test results of the custom metrics. + +See the [Custom metrics](/docs/reference/structs/custom-metrics/) reference for more details. + +### `lighthouse` + +JSON-encoded Lighthouse report. + +See the [Lighthouse](/docs/reference/blobs/lighthouse/) reference for more details. + +### `features` + +Blink features detected at runtime (see https://chromestatus.com/features) + +See the [Feature](/docs/reference/structs/feature/) reference for more details. + +### `technologies` + +Technologies detected at runtime (see https://www.wappalyzer.com/) + +See the [Technology](/docs/reference/structs/technology/) reference for more details. + +### `metadata` + +Additional metadata about the test + +See the [Page metadata](/docs/reference/blobs/page-metadata/) reference for more details. + +## Example queries + +Here are some common operations you can perform with the `pages` table. + +### Count the pages crawled + + + +```sql +/* This query will process 1 GB when run. */ +SELECT + client, + is_root_page, + count(0) AS pages_total +FROM `httparchive.crawl.pages` +WHERE date = '2024-05-01' +GROUP BY client, is_root_page +``` + + +client | is_root_page | pages_total +-- | -- | -- +mobile | false | 13998652 +mobile | true | 16193055 +desktop | true | 12900240 +desktop | false | 11585746 + + + +### Get the median page weight + + + +```sql +/* This query will process 1.12 GB when run. */ +WITH pages AS ( + SELECT + client, + INT64(summary.bytesTotal) AS page_weight + FROM `httparchive.crawl.pages` TABLESAMPLE SYSTEM (1 PERCENT) + WHERE date = '2023-05-01' +) + +SELECT + client, + APPROX_QUANTILES(page_weight, 1000)[OFFSET(500)] AS median_page_weight +FROM pages +GROUP BY client +``` + + +client | median_page_weight +-- | -- +mobile | 1776291 +desktop | 2029751 + + + +The median mobile page weighs 1.78 MB and the median desktop page weighs 2.03 MB. + +This query uses the [`APPROX_QUANTILES`](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions#approx_quantiles) function to calculate the median page weight for each client type as of May 2023. + +The `bytesTotal` property of the `summary` object represents the total number of bytes loaded on the page. This value is stored as a JSON-encoded string, so we use [`INT64`](https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#int64_for_json) to convert it to an integer. + +We're also using the [`WITH`](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#with_clause) clause here to create a temporary table called `pages`, which is then fed into the main query below. This makes the query a bit easier to read. + +Also note that for demonstration purposes, this query processes a 1% sample of the `httparchive.crawl.pages` table. This reduces the amount of data processed by the query, which can help reduce costs. But note that the results will be less accurate than if you ran the query on the full table. + +### The average number of requests per page + + + +```sql +/* This query will process 0.6 GB when run. */ +WITH pages_summary AS ( + SELECT + INT64(summary.reqTotal) AS reqTotal, + INT64(summary.numDomains) AS numDomains + FROM `httparchive.crawl.pages` TABLESAMPLE SYSTEM (1 PERCENT) + WHERE + date = '2024-06-01' AND + client = 'mobile' +) + +SELECT + COUNT(0) pages, + ROUND(AVG(reqTotal), 2) avg_requests, + APPROX_QUANTILES(reqTotal, 100)[SAFE_ORDINAL(25)] p25_requests, + APPROX_QUANTILES(reqTotal, 100)[SAFE_ORDINAL(50)] p50_requests, + APPROX_QUANTILES(reqTotal, 100)[SAFE_ORDINAL(75)] p75_requests, + APPROX_QUANTILES(reqTotal, 100)[SAFE_ORDINAL(95)] p95_requests +FROM pages_summary +``` + + +pages | avg_requests | p25_requests | p50_requests | p75_requests | p95_requests +-- | -- | -- | -- | -- | -- +306151 | 92.53 | 37 | 65 | 107 | 212 + +The median number of requests per page is 65. The average is in fact skewed by outliers. Also, since the 25th percentile is 37 requests and the 75th percentile is 107 requests, that tells us that 50% of the 300K pages tracked by the HTTP Archive have between 37 and 107 requests. This is also known as the [interquartile range](https://en.wikipedia.org/wiki/Interquartile_range). + + diff --git a/src/content/docs/docs/reference/tables/requests.mdx b/src/content/docs/docs/reference/tables/requests.mdx new file mode 100644 index 00000000..5b6457c2 --- /dev/null +++ b/src/content/docs/docs/reference/tables/requests.mdx @@ -0,0 +1,228 @@ +--- +title: Requests table +description: Reference docs for the httparchive.crawl.requests table +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +[`httparchive.crawl.requests`](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1shttparchive!2scrawl!3srequests) is a partitioned and clustered table containing one row per request per page tested in the HTTP Archive. Pages are tested on a monthly basis and as of April 2022, both the root page and one secondary page are tested. + +## Schema + +
    Field name
    |
    Type
    | Description +---|---|--- +[`date`](#date) | `DATE` | YYYY-MM-DD format of the HTTP Archive monthly crawl +[`client`](#client) | `STRING` | Test environment: `'desktop'` or `'mobile'` +[`page`](#page) | `STRING` | The URL of the page being tested +[`is_root_page`](#is_root_page) | `BOOLEAN` | Whether the page is the root of the origin +[`root_page`](#root_page) | `STRING` | The URL of the root page being tested, the origin followed by `/` +[`url`](#url) | `STRING` | The URL of the request +[`is_main_document`](#is_main_document) | `BOOLEAN` | Whether this request corresponds with the main HTML document of the page, which is the first HTML request after redirects +[`type`](#type) | `STRING` | Simplified description of the type of resource (script, html, css, text, other, etc) +[`index`](#index) | `INTEGER` | The sequential 0-based index of the request +[`payload`](#payload) | `JSON` | JSON-encoded WebPageTest result data for this request +[`summary`](#summary) | `JSON` | JSON-encoded summarization of request data +[`request_headers`](#request_headers) | ARRAY\ | Request headers +[`response_headers`](#response_headers) | ARRAY\ | Response headers +[`response_body`](#response_body) | `STRING` | Text-based response body + +### `date` + +**This field is required for all queries over the `requests` table.** + +YYYY-MM-DD format of the HTTP Archive monthly crawl. + + Example: `date = '2023-06-01'` + +### `client` + +Test environment: `'desktop'` or `'mobile'`. + +### `page` + +The URL of the page being tested. + +Example: `page = 'https://httparchive.org/'` + +### `is_root_page` + +Whether the page is the root of the origin. + +### `root_page` + +The URL of the root page being tested, the origin followed by `/`. + +Example: `root_page = 'https://httparchive.org/'` + +### `url` + +The URL of the request + +### `is_main_document` + +Whether this request corresponds with the main HTML document of the page, which is the first HTML request after redirects + +### `type` + +Simplified description of the type of resource (script, image, css, html, other, font, text, video, xml, audio, wasm, etc) + +### `index` + +The sequential 1-based index of the request + +### `payload` + +JSON-encoded WebPageTest result data for this request + +See the [Request payload](/docs/reference/blobs/request-payload/) reference for more details. + +### `summary` + +JSON-encoded summarization of request data + +See the [Request summary](/docs/reference/blobs/request-summary/) reference for more details. + +### `request_headers` + +Request headers + +See the [Header](/docs/reference/structs/header/) reference for more details. + +### `response_headers` + +Response headers + +See the [Header](/docs/reference/structs/header/) reference for more details. + +### `response_body` + +Text-based response body + +## Example queries + +Here are some common operations you can perform with the `requests` table. + +### Count the pages crawled + + + + ```sql + /* This query will process 85 GB when run. */ + SELECT + client, + is_root_page, + count(0) AS requests_total + FROM `httparchive.crawl.requests` + WHERE date = '2024-05-01' + group by client, is_root_page + ``` + + + client | is_root_page | requests_total + -- | -- | -- + mobile | true | 1517364094 + desktop | true | 1299394354 + mobile | false | 1216156430 + desktop | false | 1093804725 + + + +### Size of requests served + +Let's check the size of individual requests served from websites across the entire dataset. To do this, we'll be using the respBodySize summary metric. This metric represents the size of the response payload in bytes. Since 1 byte is very granular, we'll divide by 1024 to get to 1 KB and then by 100 so that we are looking at this data with bin sizes of 100KB. We'll also wrap this in a CEIL() function to remove the decimal points and then multiply the result by 100. Using this technique, 1234567 bytes would be rounded to a bin of 1300 KB. + + + + ```sql + /* This query will process 26 GB when run. */ + WITH requests AS ( + SELECT + CEIL(INT64(summary.respBodySize)/1024/100)*100 AS responseSize100KB, + COUNT(0) OVER () AS total_requests + FROM `httparchive.crawl.requests` TABLESAMPLE SYSTEM (1 PERCENT) + WHERE + date = '2024-06-01' AND + client = 'desktop' AND + is_root_page AND + INT64(summary.respBodySize) > 0 + ) + + SELECT + responseSize100KB, + COUNT(0) AS requests, + COUNT(0)/ANY_VALUE(total_requests) AS pct_requests + FROM requests + GROUP BY responseSize100KB + ORDER BY responseSize100KB ASC + LIMIT 10 + ``` + + + responseSize100KB | requests | pct_requests + -- | -- | -- + 100.0 | 10113115 | 0.90864138408777051 + 200.0 | 486257 | 0.043689133714228209 + 300.0 | 188335 | 0.016921490072264605 + 400.0 | 87127 | 0.0078281714260556891 + 500.0 | 54134 | 0.004863822144433972 + 600.0 | 37443 | 0.0033641721017113315 + 700.0 | 26985 | 0.0024245435505883687 + 800.0 | 19817 | 0.0017805143428575023 + 900.0 | 24519 | 0.0022029788147814046 + 1000.0 | 11787 | 0.0010590363102014118 + + + +We can see that that 91% of requests have a response size less than 100KB. Try repeating this with 10KB bin sizes and you'll be able to see the spread of response sizes with more granularity. + +### Popularity of various image formats + +Let's filter out all of the non-Image content and examine the popularity of various image formats. For example, how often is jpg, gif, webp, etc used. + + + + ```sql + /* This query will process 8 GB when run. */ + WITH requests AS ( + SELECT + STRING(summary.format) AS format, + page, + COUNT(0) OVER() AS total_requests, + COUNT(DISTINCT page) OVER() AS total_pages + FROM `httparchive.crawl.requests` TABLESAMPLE SYSTEM (1 PERCENT) + WHERE + date = '2024-06-01' AND + client = 'desktop' AND + is_root_page AND + type = 'image' + ) + + SELECT + format, + COUNT(0) requests, + COUNT(DISTINCT page) pages, + ROUND(COUNT(0) / ANY_VALUE(total_requests), 2) percent_image_requests, + ROUND(COUNT(DISTINCT page) / ANY_VALUE(total_pages), 2) percent_pages + FROM requests + GROUP BY format + ORDER BY requests DESC + ``` + + + format | requests | pages | percent_image_requests | percent_pages + -- | -- | -- | -- | -- + jpg | 1644804 | 1310081 | 0.38 | 0.43 + png | 1328825 | 1151809 | 0.31 | 0.38 + gif | 793541 | 495055 | 0.18 | 0.16 + svg | 250130 | 227550 | 0.06 | 0.08 + webp | 223783 | 191184 | 0.05 | 0.06 + ico | 64468 | 64016 | 0.01 | 0.02 + avif | 29226 | 25794 | 0.01 | 0.01 + | | 4405 | 3938 | 0.0 | 0.0 + heic | 395 | 382 | 0.0 | 0.0 + + + +:::note +It's important to understand the bias in the data when doing this type of analysis. While 1.3 million page views is a very diverse set - the technology used to parse these pages is Chrome browsers (both Desktop and Emulated mobile). Because of this, some formats may be under-represented - since Chrome supports webp but not jpeg-xr or jpeg2000. There may be cases like this with other type of technologies as well - for example custom web font types that vary based on browser support. +::: diff --git a/src/pages/404.astro b/src/pages/404.astro index e597b07c..22f22392 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -24,7 +24,7 @@ const description = 'Page not found on the HTTP Archive website.';

    diff --git a/src/pages/index.astro b/src/pages/index.astro index afb0f6b1..705fa9b7 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -128,13 +128,13 @@ const description = download this data for offline analysis, or access it as a public dataset via Google BigQuery for fast and rapid analysis.

    - Get Started with Public Dataset