{"_id":"cssomnom","_rev":"11-a52d493ef29329aa6883c5da722d4934","name":"cssomnom","dist-tags":{"latest":"0.1.12"},"versions":{"0.1.0":{"name":"cssomnom","version":"0.1.0","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.0","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"e1b4fcb62b0f452b0635b33393fc77d65a9f1373","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.0.tgz","fileCount":74,"integrity":"sha512-RgWjD1gcWYmD4NVWmYf7Trn1X3kfkrLRtzEPs3m5m0RljAn6FgcXPcB8+nQOaKoMsbJ3rt7dLkzgXjJrFHSB6g==","signatures":[{"sig":"MEUCIDMgNz9GmD+yibMDZk8iBnKqn2HWEzZAS+QpdM/15QUsAiEA9f1scA8QrjQj/QbgHDkN8D1R1XbggrOpyRgY4qvL3Nw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1848859},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"b4c2b8886eb9fd035bbe056fa18794b1aaa6ba04","scripts":{"lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/generate_all.ts","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","preflight":"pnpm typecheck && pnpm lint && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:sandbox":"node scripts/run_wpt_sandbox.ts","wpt:baseline":"node scripts/run_wpt_crawler.ts --update-baseline","wpt:progress":"node scripts/run_wpt_crawler.ts --update-progress","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/prune_resolved_failures.ts","external:extract":"node scripts/extract_external_suites.ts","fixtures:generate":"node scripts/extract_external_suites.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","test:wpt-typed-om:chrome":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-chrome.json --log-wptscreenshot dist/chrome-screenshots.txt --log-html dist/report-chrome.html --inject-script dist/cssomnom.iife.global.js chrome css/css-typed-om || true) && node scripts/generate_wpt_report.ts","test:wpt-typed-om:firefox":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-firefox.json --log-wptscreenshot dist/firefox-screenshots.txt --log-html dist/report-firefox.html --inject-script dist/cssomnom.iife.global.js firefox css/css-typed-om || true) && node scripts/generate_wpt_report.ts"},"_npmUser":{"name":"paulirish","email":"npm@paul.irish"},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.6.2","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.0_1786322250501_0.0013333334335123848","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"cssomnom","version":"0.1.1","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.1","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"100e623846c08f572cb9e2bb730bab07203f4fc2","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.1.tgz","fileCount":74,"integrity":"sha512-w679REwKCIc7Qf7CY2Ek80Pnas4iz4Y9lxcTahtBOXfeW+cLwDC1HIFCtYZcMSe8Uld8ZlNNMlsGrln43jr4Pg==","signatures":[{"sig":"MEYCIQCXn3pi7HCZ5hJTNa+doJskO/JA2g8M8rME27ozsQ/bcQIhAM25u75n1J6urTkXXQLEcOly+dHBrzIMoovyOo6GRI3x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1848860},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"23df166ebc2b8de200cc3b5683230c23b37bb249","scripts":{"lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/generate_all.ts","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","preflight":"pnpm typecheck && pnpm lint && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:sandbox":"node scripts/run_wpt_sandbox.ts","wpt:baseline":"node scripts/run_wpt_crawler.ts --update-baseline","wpt:progress":"node scripts/run_wpt_crawler.ts --update-progress","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/prune_resolved_failures.ts","external:extract":"node scripts/extract_external_suites.ts","fixtures:generate":"node scripts/extract_external_suites.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","test:wpt-typed-om:chrome":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-chrome.json --log-wptscreenshot dist/chrome-screenshots.txt --log-html dist/report-chrome.html --inject-script dist/cssomnom.iife.global.js chrome css/css-typed-om || true) && node scripts/generate_wpt_report.ts","test:wpt-typed-om:firefox":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-firefox.json --log-wptscreenshot dist/firefox-screenshots.txt --log-html dist/report-firefox.html --inject-script dist/cssomnom.iife.global.js firefox css/css-typed-om || true) && node scripts/generate_wpt_report.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.16.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.1_1786322466457_0.8004981469306816","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"cssomnom","version":"0.1.2","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.2","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"45ba374824fac0bce6614dacafceaa6f1ab820df","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.2.tgz","fileCount":81,"integrity":"sha512-uW6axstteGHduY7IOe1s4IVL6pw3bAN9zJffT76xX3RB2qzLWrAM+9g8x/YFghOEN82ym9T7i3Ws4523UKAdQw==","signatures":[{"sig":"MEQCIFe2AB+Ka2gTeWp6fnsI9AaJ2bka4w8cs9FHBCTe2TcpAiBeejXf3mytunslBKSHnaSTqRkDMFnPQbMUOolWYvdDew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2285290},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"8c763b8d070409d396c5d0fb1a6a6f04f9a844cd","scripts":{"lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/generate_all.ts","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","wpt:node":"node scripts/run_wpt_node.ts","preflight":"pnpm typecheck && pnpm lint && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:sandbox":"node scripts/run_wpt_node.ts","wpt:baseline":"node scripts/run_wpt_node_crawler.ts --update-baseline","wpt:progress":"node scripts/run_wpt_node_crawler.ts --update-progress","prepublishOnly":"pnpm run preflight && pnpm run build","wpt:node:crawl":"node scripts/run_wpt_node_crawler.ts","baselines:prune":"node scripts/prune_resolved_failures.ts","external:extract":"node scripts/extract_external_suites.ts","wpt:node:cluster":"node scripts/wpt_cluster_failures.ts","fixtures:generate":"node scripts/extract_external_suites.ts","submodules:update":"git submodule update --init --recursive","wpt:node:baseline":"node scripts/run_wpt_node_crawler.ts --update-baseline","wpt:node:progress":"node scripts/run_wpt_node_crawler.ts --update-progress","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-chrome.json --log-wptscreenshot dist/chrome-screenshots.txt --log-html dist/report-chrome.html --inject-script dist/cssomnom.iife.global.js chrome css/css-typed-om || true) && node scripts/generate_wpt_browser_report.ts","wpt:browser:firefox":"pnpm run build && (python3 submodules/web-platform-tests/wpt run --processes 16 --headless -y --log-wptreport dist/report-firefox.json --log-wptscreenshot dist/firefox-screenshots.txt --log-html dist/report-firefox.html --inject-script dist/cssomnom.iife.global.js firefox css/css-typed-om || true) && node scripts/generate_wpt_browser_report.ts","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.16.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.2_1786474537338_0.6098430133929476","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"cssomnom","version":"0.1.3","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.3","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"7ef52c91a86debc3f55b6f86ae6c991c1a07882c","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.3.tgz","fileCount":79,"integrity":"sha512-xq8F1kpN8LOD0n/edCojK076djDUC3GtCMzpklGSoUbNT5n5YNzKdUic1ZobSOyYEMBRxwSuSaAhn69PJMAc4w==","signatures":[{"sig":"MEUCIHD3QY/9NkoTIaw/VVzG85x7rNaYHJZhNt4YQyH8FofBAiEArOQ7gEW+ZSy1ug5zL4HxwSs2G13aOEQ4cGXJg323nm8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2405647},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"783b944169c028c3e5461c821c406f194069c032","scripts":{"lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","wpt:node":"node scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:sandbox":"node scripts/wpt/node/run.ts","wpt:baseline":"node scripts/wpt/node/crawl.ts --update-baseline","wpt:progress":"node scripts/wpt/node/crawl.ts --update-progress","wpt:node:diff":"node scripts/wpt/node/diff.ts","prepublishOnly":"pnpm run preflight && pnpm run build","wpt:node:crawl":"node scripts/wpt/node/crawl.ts","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","external:extract":"node scripts/external_suites/extract_all.ts","wpt:node:cluster":"node scripts/wpt/node/cluster.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","wpt:node:baseline":"node scripts/wpt/node/crawl.ts --update-baseline","wpt:node:progress":"node scripts/wpt/node/crawl.ts --update-progress","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.17.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.3_1786562991525_0.41106218914300596","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"cssomnom","version":"0.1.4","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.4","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"cfd9c0817d8e54722f23b4372853fdafa70a04c6","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.4.tgz","fileCount":163,"integrity":"sha512-TlHXKwGFR4sUrMaJusJqXnRqHfH6pOCGFcz7+2cIEhgCr7THEElrbs0EkOG8e3ZdNOdtF+M6JIczViXNEFvq6A==","signatures":[{"sig":"MEUCIQCYPZK7RzfT6HYWyVDeAN3HeqfV7qxJGY+KFPdBQjVjfwIgU0JAxshJJrcIaVKf0AUyfRuvzHby7xn/xHBKc6KIpVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2903838},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"264c2ea5544795e366f2132a9683a2ec1b5476d1","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.17.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.4_1787272149608_0.4434859602272172","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"cssomnom","version":"0.1.6","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.6","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"cedc6e1b0c290006eaa10ace46b829520acb7519","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.6.tgz","fileCount":173,"integrity":"sha512-ma/+Gm8/UbHWp701E04a6UGzlsIIIEgLGCXN0tG6veUP4BXwjdtpUBDXwbsS4yujUaF5dMwkI/KglEJomuKs2A==","signatures":[{"sig":"MEYCIQDyuYN6h1m/l6wBOsGmJWAzrm2Qp3/rkrCYz7ZpXU/LSQIhAIVbrA5/wENdA0jbuMb9V9PSCmt5FWcagvK+3oXV7Iop","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID6G6bSq60MB5d50D4t0J6GpvGQQMPY1ilNPptcGfVlRAiEA6yBYroSh8i7yBlofaP6Yw8X8PdyRvjKCESRY5X+e4WI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3007968},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"f0a6feff3635cc4f3b2e77f15b23cdb5c93ba996","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.74.0","linkedom":"^0.18.13","mdn-data":"^2.28.1","typescript":"^7.0.2","@types/node":"^26.1.1","@webref/css":"^8.7.0","puppeteer-core":"^25.10.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.6_1789338024417_0.8317000737270384","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"cssomnom","version":"0.1.8","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.8","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"de93a4b12ee0c1236dca278d574d6c7a0ddf7126","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.8.tgz","fileCount":181,"integrity":"sha512-feV3ao6xVQtfg8wVZZYrgUgALOa/dDxrdTROzE4p4qK5pu4M3M6PnPeOJ4Jin6EcUTUr5A8J4ImCfr4N0m7MoQ==","signatures":[{"sig":"MEQCIErk4Hgn+2flGc6Axlos7Mx5OA6x1LFYU7S31c0/X+zGAiBSjanRJX6wcgCCT1zTqQJ87x5GJehJ79lRzJ61VxPPiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFw+c+OgTBCGIAHRyr1l59CZ0yOFIbUbjtHUYYj2HH52AiAIDrTsOg6Gd1J1BDyna0wshYtDCjE3iUu4qCFnsDpyQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3126375},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"a91e6c6ed9d6e35908aad4bc7ab9c9a5f3931f60","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","prepare":"git config core.hooksPath .githooks","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight && pnpm run wpt:baseline","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.85.0","linkedom":"^0.18.13","mdn-data":"^2.36.0","typescript":"^7.0.2","@types/node":"^26.6.2","@webref/css":"^8.7.5","puppeteer-core":"^25.11.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.8_1790263207138_0.6948315333642401","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"cssomnom","version":"0.1.9","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.9","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"73e8c5f83518577b63d941ef5b1a05f7514591bd","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.9.tgz","fileCount":183,"integrity":"sha512-3LgRnYCwlUxtVcMwRmOyZtOC2OkY/OE+3w5XS2e3hETC1RmRWGOuLzYbmKG7PjGftY691IXib5Oeo5gdlsWLVg==","signatures":[{"sig":"MEYCIQCDvazDtLXBKxP4gsD0Q/aXlL/2xecVM1MxDXQoC0iKdAIhAOXsKPssi2FZrNuVXff7jKo3mXT9HDf/Hf4gKAaCez0D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHyL/QccMRqx86PaWIqwlClvlI7JlX8J0T8dZ1JX9IfmAiEA0vdRzniNRL+TB/RR4tpaF07Na3V6wXsacJxn3Kxoeg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3105461},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.11.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"978f4055aebc9e5c2878d52c81a3ae8df1c16238","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","bench":"node scripts/benchmarks/parser.bench.ts","build":"tsup && tsup --config tsup.browser.config.ts && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","prepare":"git config core.hooksPath .githooks","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight && pnpm run wpt:baseline","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","bench:compare":"node scripts/benchmarks/compare.ts","prepublishOnly":"pnpm run preflight && pnpm run build","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f","devDependencies":{"tsup":"^8.5.1","oxlint":"^1.85.0","linkedom":"^0.18.13","mdn-data":"^2.36.0","typescript":"^7.0.2","@types/node":"^26.6.2","@webref/css":"^8.7.5","puppeteer-core":"^25.11.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.9_1792095153848_0.6588922231069683","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"cssomnom","version":"0.1.10","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.10","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"039bfa65e8a13b58a5c612c80ce40ebaefd08575","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.10.tgz","fileCount":192,"integrity":"sha512-HKqGsqRNIeliLmNqg2iJn4FfGTNHb2xFG7O9XaWd37zXpW+umKHkFjrb2s0Va3e6guuEALiqkeih7anDe5E6Bw==","signatures":[{"sig":"MEUCIQDNaUalMIZoWSIMB/wnuppnPZ69dM2M2+j/bXmhWz8lSgIgIx5WUAfPBjR2KmIYnm6AiTYvDxu3OVQj8wCWAelq8bE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFKLChqTjynsHTPmIj1lB8PbhNFrTwR59mfFJkvvGPZWAiEAttYWvNqWYtljPbgcctyMKvCi+Eocuv/zzhZx2b4pmK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2287445},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ts":{"types":"./src/index.ts","import":"./src/index.ts"},"./parse":{"types":"./dist/parse-entry.d.ts","import":"./dist/parse.js","default":"./dist/parse.js"},"./parser-api":{"types":"./dist/parser-api.d.ts","import":"./dist/parser-api.js","default":"./dist/parser-api.js"}},"gitHead":"00fa1541bba82c5e3f4dc172f1f1dbc6053911d6","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","bench":"node scripts/benchmarks/parser.bench.ts","build":"tsdown && tsc -p tsconfig.build.json","codegen":"node scripts/codegen/generate_all.ts","prepare":"git config core.hooksPath .githooks","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight && pnpm run wpt:baseline","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm check:spec-anchors && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","bench:compare":"node scripts/benchmarks/compare.ts","prepublishOnly":"pnpm run build && pnpm run preflight","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","check:spec-anchors":"node scripts/ci/check-spec-anchors.ts","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":["./dist/index.js","./src/cascade.ts","./src/css-namespace.ts","./src/MediaParser.ts","./src/PropertyRegistry.ts","./src/typed-om/**"],"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f","devDependencies":{"oxlint":"^1.89.0","tsdown":"^0.23.2","linkedom":"^0.18.14","mdn-data":"^2.37.2","typescript":"^7.0.2","@types/node":"^26.6.5","@webref/css":"^8.7.8","puppeteer-core":"^25.16.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.10_1793158599602_0.37472565257684454","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"cssomnom","version":"0.1.11","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"license":"Apache-2.0","_id":"cssomnom@0.1.11","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"92aeb767e84c151b31d104ba058f54892f69f956","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.11.tgz","fileCount":10,"integrity":"sha512-P4RkO1Sq2Ual77xypEmAc4MkM5k2Ha4UwtBPCOpJmXculGCYPgzsU/xnOCy084esZaPePgGkkJg4Il/HE7GS5A==","signatures":[{"sig":"MEUCIE0fVKLzJZ4P98hQpvVSh+nMYBoN6qV9ZeLAftEWGg6xAiEA3LHAPMjo9rSavHT5+UsoZ3dlzHbcuzLLqbaBlJ2ElZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDEU9DQU8LE4U+cR1L/e8M2SYBpO9EyUkbuis68EX1HmwIgb0a0IadQyRUwhC/ddXh/pb6v2SnUeoiig6Xzw8UJ9YA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1016117},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./parse":{"types":"./dist/parse.d.ts","import":"./dist/parse.js","default":"./dist/parse.js"},"./parser-api":{"types":"./dist/parser-api.d.ts","import":"./dist/parser-api.js","default":"./dist/parser-api.js"}},"gitHead":"fdc730ece1c02f7e411db03b696214515fe0f2d2","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","bench":"node scripts/benchmarks/parser.bench.ts","build":"tsc -p tsconfig.build.json && tsdown","codegen":"node scripts/codegen/generate_all.ts","prepare":"git config core.hooksPath .githooks","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight && pnpm run wpt:baseline","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm check:spec-anchors && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","bench:compare":"node scripts/benchmarks/compare.ts","prepublishOnly":"pnpm run build && pnpm run preflight","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","check:spec-anchors":"node scripts/ci/check-spec-anchors.ts","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.1","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"sideEffects":["./dist/index.js"],"_nodeVersion":"24.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f","devDependencies":{"oxlint":"^1.89.0","tsdown":"^0.23.2","linkedom":"^0.18.14","mdn-data":"^2.37.2","typescript":"^7.0.2","@types/node":"^26.6.5","@webref/css":"^8.7.8","puppeteer-core":"^25.16.0"},"_npmOperationalInternal":{"tmp":"tmp/cssomnom_0.1.11_1793487954486_0.8214335637626484","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"_id":"cssomnom@0.1.12","bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"dist":{"shasum":"92651aa9a4b8a25cf8112bc9d5d117a96af2f0a3","tarball":"https://registry.npmjs.org/cssomnom/-/cssomnom-0.1.12.tgz","fileCount":10,"integrity":"sha512-nlsLjRxRN2RPomw3r+e+oD3KQBbEbKK0+oBUATbodf5N38FlOMg/5nqV0CdClNvpVsjFLikD63H6dgKTgeuuUg==","signatures":[{"sig":"MEUCIQD4HHfpxEGw55sRNcAcmhcAUmlbYCj+RA2zodk3CRn4KgIgcHcV15fSPUpaJ2TS4ReaHmsaDG8VMesiIx5G9oQPMBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBynjN8vZFo9Tsf07MSoXT5roSRoEIAYy90yF8TPR7I+AiEA70C+AQyLrNsfN/yvkiWfHTq/pOcUjLbAfaab1ZtiG5c="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cssomnom@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1016102},"main":"./dist/index.js","name":"cssomnom","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./parse":{"types":"./dist/parse.d.ts","import":"./dist/parse.js","default":"./dist/parse.js"},"./parser-api":{"types":"./dist/parser-api.d.ts","import":"./dist/parser-api.js","default":"./dist/parser-api.js"}},"gitHead":"11f4a8d121b44468fd1d8ee177b10c0fdee710ee","license":"Apache-2.0","scripts":{"wpt":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts","lint":"oxlint","test":"pnpm run preflight","bench":"node scripts/benchmarks/parser.bench.ts","build":"tsc -p tsconfig.build.json && tsdown","codegen":"node scripts/codegen/generate_all.ts","prepare":"git config core.hooksPath .githooks","wpt:run":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run","maintain":"pnpm update --latest && pnpm run submodules:upgrade && pnpm run codegen && pnpm run external:extract && pnpm run preflight && pnpm run wpt:baseline","wpt:diff":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts diff","wpt:node":"node --max-old-space-size=4096 scripts/wpt/node/run.ts","preflight":"pnpm typecheck && pnpm lint && pnpm check:safe-exec && pnpm check:spec-anchors && pnpm test:node","test:node":"node --test --test-reporter=dot 'tests/**/*.test.ts' 'skills/**/*.test.ts'","typecheck":"tsc --noEmit","wpt:crawl":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","wpt:parity":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts parity","wpt:verify":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --verify-exact-baseline","wpt:cluster":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts cluster","wpt:baseline":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-passing-set-baseline","wpt:progress":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts run --write-progress-markdown","bench:compare":"node scripts/benchmarks/compare.ts","prepublishOnly":"pnpm run build && pnpm run preflight","baselines:prune":"node scripts/baselines/prune_resolved_failures.ts","check:safe-exec":"node scripts/ci/check-safe-exec.ts","external:extract":"node scripts/external_suites/extract_all.ts","fixtures:generate":"node scripts/external_suites/extract_all.ts","submodules:update":"git submodule update --init --recursive","check:spec-anchors":"node scripts/ci/check-spec-anchors.ts","submodules:upgrade":"git submodule update --init --remote && pnpm run submodules:update","wpt:browser:chrome":"node scripts/wpt/browser/run.ts --browser=chrome","wpt:fetch-upstream":"node --max-old-space-size=4096 scripts/wpt/node/cli.ts fetch-upstream","wpt:browser:firefox":"node scripts/wpt/browser/run.ts --browser=firefox","test:wpt-typed-om:chrome":"pnpm run wpt:browser:chrome","test:wpt-typed-om:firefox":"pnpm run wpt:browser:firefox"},"version":"0.1.12","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"756bbc99-39b8-4c3f-9a44-e470f836b4c0"}},"homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"_npmVersion":"11.19.1","description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","directories":{},"maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"sideEffects":["./dist/index.js"],"_nodeVersion":"24.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f","devDependencies":{"oxlint":"^1.89.0","tsdown":"^0.23.2","linkedom":"^0.18.14","mdn-data":"^2.37.2","typescript":"^7.0.2","@types/node":"^26.6.5","@webref/css":"^8.7.8","puppeteer-core":"^25.16.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cssomnom_0.1.12_1794587459674_0.9079396570106667"}}},"time":{"created":"2026-08-10T00:37:30.315Z","modified":"2026-11-13T16:31:00.136Z","0.1.0":"2026-08-10T00:37:30.658Z","0.1.1":"2026-08-10T00:41:06.614Z","0.1.2":"2026-08-11T18:55:37.486Z","0.1.3":"2026-08-12T19:29:51.683Z","0.1.4":"2026-08-21T00:29:09.765Z","0.1.6":"2026-09-13T22:20:24.547Z","0.1.8":"2026-09-24T15:20:07.276Z","0.1.9":"2026-10-15T20:12:34.188Z","0.1.10":"2026-10-28T03:36:39.711Z","0.1.11":"2026-10-31T23:05:54.582Z","0.1.12":"2026-11-13T16:30:59.790Z"},"bugs":{"url":"https://github.com/GoogleChromeLabs/cssomnom/issues"},"license":"Apache-2.0","homepage":"https://github.com/GoogleChromeLabs/cssomnom#readme","keywords":["css","cssom","typed-om","parser","ast","stylesheet","w3c"],"repository":{"url":"git+https://github.com/GoogleChromeLabs/cssomnom.git","type":"git"},"description":"Fast, spec-compliant CSS Object Model (CSSOM) and Typed OM parser in pure TypeScript","maintainers":[{"name":"paulirish","email":"npm@paul.irish"}],"readme":"# cssomnom\n\n[![npm version](https://img.shields.io/npm/v/cssomnom.svg)](https://www.npmjs.com/package/cssomnom)\n\nA high-performance, zero-dependency, spec-compliant CSS Object Model (CSSOM) parser and query engine in pure TypeScript. Purpose-built for static analysis, testing, and eating style rules for breakfast.\n\n_Built with coding agents against 23,000+ W3C Web Platform Tests (WPT) across CSSOM, Syntax, Selectors, Cascade, Variables, Nesting, Media Queries, and Typed OM. Coding agents + conformance suites is a really fun meta-project (I recommend it!)._\n\n## Why cssomnom?\n\nOther tools like PostCSS and CSSTree expose custom Abstract Syntax Trees (ASTs) that require learning tool-specific APIs to navigate. \n\n`cssomnom` implements the standard **W3C CSS Object Model (CSSOM)** API. You get a familiar, standardized interface to query styles directly in Node.js. For example, you can use `stylesheet.cssRules[0].style.getPropertyValue('color')` instead of writing complex AST traversal code.\n\nIt is uniquely suited for **static analysis** and **automated grading** where you need to evaluate CSS rules against DOM structures without the overhead of a full browser environment.\n\n## Features\n\n*   **Full Spec Compliance**: Implements CSS Syntax Module Level 3, CSSOM Level 1, CSS Nesting, CSS Logical Properties, and Houdini specifications (Properties and Values API, Typed OM Level 1 & 2).\n*   **Cascade Resolution**: Query which styles apply to a mock element without a real DOM using `getCascadedStyle`.\n*   **Houdini Powered**: Full support for `CSS.registerProperty()`, `CSSNumericValue.parse()`, and complex math functions (e.g., `calc`, `sin`, `atan2`).\n*   **Fast and Buildless-Ready**: Executes directly in Node.js 24.11.0+ without a build step for development, or can be consumed as a pre-bundled ESM package.\n\n## API Documentation & Quickstarts\n\n### Subpath Exports & Import Options\n\n`cssomnom` provides focused subpath entrypoints depending on what you need:\n\n```typescript\n// 1. Full Package (\"cssomnom\"): Browser CSSOM, Typed OM, W3C CSS namespace, Cascade & Node AST tools\nimport { parse, getCascadedStyle, CSSNumericValue, CSS } from 'cssomnom';\n\n// 2. Lightweight Parser & CSSOM Subset (\"cssomnom/parse\" — ~338 KB, >60% smaller bundle!)\n// Minimal subset of \"cssomnom\" excluding Cascade, UA Stylesheet, and Typed OM; ideal for DOM shims (LinkeDOM) and workers\nimport { parse, CSSStyleSheet, CSSStyleDeclaration } from 'cssomnom/parse';\n\n// 3. WICG CSS Parser API Draft (\"cssomnom/parser-api\")\nimport { parseStylesheet, parseRule, CSSParserAtRule, CSSParserQualifiedRule } from 'cssomnom/parser-api';\n```\n\n### Basic CSS Parsing & Rule Traversal\n\nParse CSS into a standard `CSSStyleSheet` and traverse rules like `CSSStyleRule`, `CSSMediaRule`, and `CSSNestedDeclarations`.\n\n```typescript\nimport { parse, type CSSStyleRule, type CSSMediaRule } from 'cssomnom';\n\nconst css = `\n  body { color: red; }\n  @media (max-width: 600px) {\n    body { \n      color: blue;\n      margin: 0;\n    }\n  }\n`;\n\nconst stylesheet = parse(css);\n\n// Access a basic style rule\nconst bodyRule = stylesheet.cssRules[0] as CSSStyleRule;\nconsole.log(bodyRule.style.getPropertyValue('color')); // 'red'\n\n// Access nested rules (like inside an @media block)\nconst mediaRule = stylesheet.cssRules[1] as CSSMediaRule;\nconst nestedBodyRule = mediaRule.cssRules[0] as CSSStyleRule;\nconsole.log(nestedBodyRule.style.getPropertyValue('margin')); // '0'\n```\n\n### Static Analysis Traversal & Property Indexing (`getRules`, `closestRule`, `resolveSelector`, `parseSelectorAST`, `getDeclaredProperties`, `getPropertyValues`)\n\nUse `getRules`, `closestRule`, `resolveSelector`, `parseSelectorAST`, `getDeclaredProperties`, and `getPropertyValues` to inspect stylesheets using standard CSSOM instances without custom wrapper objects or hand-rolled recursive visitors:\n\n```typescript\nimport {\n  parse,\n  getRules,\n  closestRule,\n  resolveSelector,\n  parseSelectorAST,\n  getDeclaredProperties,\n  getPropertyValues,\n  CSSStyleRule,\n  CSSMediaRule,\n} from 'cssomnom';\n\nconst css = `\n  .card {\n    border: 1px solid var(--accent);\n    margin-inline-start: 1rem;\n    grid-template-rows: auto;\n    grid-template-rows: subgrid;\n    @media (min-width: 600px) {\n      color: blue;\n      & .title { font-weight: bold; }\n    }\n  }\n  @supports (interpolate-size: allow-keywords) {\n    :root { interpolate-size: allow-keywords; }\n  }\n`;\n\nconst sheet = parse(css);\n\n// 1. Collect all CSSStyleRule instances (or omit the filter class to get all CSSRule instances)\nfor (const rule of getRules(sheet, CSSStyleRule)) {\n  console.log({\n    rawSelector: rule.selectorText,                    // '.card', '& .title', ':root'\n    resolvedSelector: resolveSelector(rule),           // '.card', ':is(.card) .title', ':root'\n    selectorAST: parseSelectorAST(rule),               // Selectors Level 4 SelectorList AST (with '&' resolved)\n    media: closestRule(rule, CSSMediaRule)?.conditionText ?? null, // null, '(min-width: 600px)', null\n    line: rule.location?.line,                         // 1-based line number\n    rows: getPropertyValues(rule, 'grid-template-rows'), // ['auto', 'subgrid'] (preserves fallback order!)\n    marginLeft: getPropertyValues(rule, 'margin-left'),  // ['1rem'] (resolves logical↔physical aliases!)\n    borderColor: getPropertyValues(rule, 'border-color'), // ['1px solid var(--accent)'] (inspects var() shorthands!)\n  });\n}\n\n// 2. Collect every declared property across the stylesheet (longhands, parent shorthands, and @supports features)\nconst props = getDeclaredProperties(sheet);\nconsole.log(props.has('border'));           // true (parent shorthand indexed alongside border-top-width, etc.)\nconsole.log(props.has('border-color'));     // true\nconsole.log(props.has('interpolate-size')); // true (from both style rules and @supports conditions)\n```\n\n### CSS Typed OM\n\nParse and manipulate CSS values directly as objects instead of strings using the CSS Typed OM API.\n\n```typescript\nimport { CSSNumericValue, CSSUnitValue, CSS } from 'cssomnom';\n\n// Parse values\nconst length = CSSNumericValue.parse('10px');\nconsole.log(length instanceof CSSUnitValue); // true\nconsole.log(length.value); // 10\nconsole.log(length.unit); // 'px'\n\n// Use factory methods\nconst width = CSS.px(100);\nconst padding = CSS.rem(2);\n\n// Complex mathematical operations\nconst calcValue = CSSNumericValue.parse('calc(1in + 96px)');\nconsole.log(calcValue.toString()); // '192px' (canonicalizes to px)\n\nconst angle = CSSNumericValue.parse('calc(45deg + 0.25turn)');\nconsole.log(angle.toString()); // '135deg'\n\n// Note: Complex math functions (trigonometric, exponential, stepped) remain as\n// tree-structured CSSMathValue objects in the Typed OM specified style rather\n// than collapsing to a single scalar, preserving the calculation tree for\n// computed-value time resolution per css-values-4 #calc-internal.\n```\n\n### CSS Custom Properties & Houdini\n\nRegister custom properties with syntax validation and evaluate support for features.\n\n```typescript\nimport { CSS } from 'cssomnom';\n\n// Register custom properties with syntax validation\nCSS.registerProperty({\n  name: '--main-color',\n  syntax: '<color>',\n  inherits: false,\n  initialValue: 'red'\n});\n\n// Check feature support\nif (CSS.supports('display', 'grid')) {\n  console.log('Grid is supported!');\n}\nif (CSS.supports('(transform-origin: 5% 5%)')) {\n  console.log('Conditional supports rule allowed');\n}\n```\n\n### Static Analysis & Cascade Resolution\n\nCompute the cascaded style for a particular element. You can pair `cssomnom` with lightweight DOM implementations like `linkedom` to resolve styles against HTML.\n\n```typescript\nimport { parse, getCascadedStyle } from 'cssomnom';\nimport { parseHTML } from 'linkedom';\n\nconst html = `\n  <div class=\"box highlight\">Hello World</div>\n`;\nconst css = `\n  .box { color: red; }\n  .box.highlight { color: blue; }\n`;\n\nconst { document } = parseHTML(html);\nconst element = document.querySelector('.box');\n\nconst stylesheet = parse(css);\nconst style = getCascadedStyle(element, stylesheet);\nconst mobileStyle = getCascadedStyle(element, stylesheet, { width: 480 });\n\nconsole.log(style.getPropertyValue('color')); // 'blue'\n```\n\n### Low-level Tokenization, Serialization, and StreamingTokenizer\n\nFor performance-critical tasks, skip the high-level object model and work directly with tokens. \n\n```typescript\nimport { tokenize, serialize, StreamingTokenizer } from 'cssomnom';\n\nconst cssText = '.btn { color: #fff; }';\n\n// 1. Direct Tokenization\nconst tokens = tokenize(cssText);\nconsole.log(tokens.length); // Outputs total number of tokens\n\n// 2. Serialization (back to string)\nconst output = serialize(tokens);\nconsole.log(output === cssText); // true\n\n// 3. Streaming Tokenization (Memory Efficient)\nconst tokenizer = new StreamingTokenizer();\ntokenizer.appendChunk('.btn { col');\ntokenizer.appendChunk('or: #fff; }');\nconst streamingTokens = tokenizer.getTokens();\nconsole.log(streamingTokens);\n```\n\n## API Reference Summary\n\nThis library implements standard W3C CSSOM interfaces (refer to [MDN Web Docs on CSSOM](https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model)).\n\nBelow are the primary entry points and custom utilities:\n\n*   **`parse(css: string, options?: ParserOptions): CSSStyleSheet`** — Parses a CSS string directly into a `CSSStyleSheet`.\n*   **`tokenize(css: string): Token[]`** — Synchronous low-level tokenizer.\n*   **`serialize(nodes: ComponentValue[] | Token[]): string`** — Serializes component values or tokens back to CSS text.\n*   **`new StreamingTokenizer()`** — Class for processing chunked CSS streams.\n*   **`getRules(root, RuleClass?)`** — Recursively collects rules in depth-first pre-order across a `CSSStyleSheet`, `CSSRule`, or `Iterable<CSSRule>`, optionally narrowed to instances of `RuleClass` (e.g. `getRules(sheet, CSSStyleRule)`).\n*   **`closestRule(rule, ...RuleClasses)`** — Walks strict ancestors via `rule.parentRule` and returns the nearest enclosing rule matching any of `RuleClasses` (e.g. `closestRule(rule, CSSMediaRule)`).\n*   **`resolveSelector(rule)`** — Resolves CSS Nesting `&` combinators and relative selectors across enclosing `CSSStyleRule` and `@scope` ancestors into a canonical selector string.\n*   **`parseSelectorAST(input, options?)`** — Parses a selector string or `CSSRule` into a Selectors Level 4 `SelectorList` AST (resolving nested `&` selectors by default when given a `CSSRule`).\n*   **`getDeclaredProperties(root, options?)`** — Collects all declared CSS property names across the rule tree, including parent shorthands and `@supports` feature queries.\n*   **`getPropertyValues(target, property, options?)`** — Returns all authored values for `property` in declaration order on a `CSSRule` or `CSSStyleDeclaration`, resolving logical↔physical property aliases, unexpanded `var()` shorthands, and same-rule progressive-enhancement fallbacks.\n*   **`calculateSpecificity(selector: string | SelectorList)`** — Calculates selector specificity tuple `[a, b, c]`.\n*   **`getCascadedStyle(element, rulesOrSheet?, pseudoOrEnv?, envOptions?)`** — Computes cascaded styles against a DOM/linkedom element (accepting a `CSSStyleSheet` or rule list, plus optional `Partial<MediaEnvironment>` overrides).\n*   **`resolveVariables(style: CSSStyleDeclaration, property: string, envMap?)`** — Resolves `var()` and `env()` substitutions on a `CSSStyleDeclaration`.\n\n## Architecture & Spec Boundaries\n\nThis section outlines the boundaries between standard CSSOM specifications (`src/entry/spec.ts`) and standalone Node tooling (`src/entry/tools.ts`).\n\n### 1. Standard CSSOM Layer (`src/entry/spec.ts`)\nThese APIs are defined in the [CSSOM-1](https://drafts.csswg.org/cssom-1/) specification and related module extensions (CSS Conditional Rules, CSS Nesting, CSS Anchor Positioning, CSS Fonts, CSS Animations, CSS Paged Media, CSS View Transitions, and CSS Cascade). They are designed to mirror standard browser CSSOM APIs in Node.js and headless environments, and are verified bidirectionally against W3C WebIDL definitions via `webidl2.js` in [`tests/api-surface.test.ts`](./tests/api-surface.test.ts).\n\n**Interfaces & Classes**\n- **Base Hierarchy & Collections**: `StyleSheet`, `CSSStyleSheet`, `StyleSheetList`, `CSSRule`, `CSSRuleList`, `CSSGroupingRule`, `MediaList`, `LinkStyle` (TypeScript interface)\n- **Style Rules & Nesting**: `CSSStyleRule`, `CSSNestedDeclarations`\n- **Conditional & Grouping Rules**: `CSSConditionRule`, `CSSMediaRule`, `CSSSupportsRule`, `CSSContainerRule`, `CSSLayerBlockRule`, `CSSLayerStatementRule`, `CSSScopeRule`, `CSSStartingStyleRule`\n- **Specialized Rules**: `CSSFontFaceRule`, `CSSPageRule`, `CSSPositionTryRule`, `CSSMarginRule`, `CSSKeyframesRule`, `CSSKeyframeRule`, `CSSNamespaceRule`, `CSSImportRule`, `CSSPropertyRule`, `CSSCounterStyleRule`, `CSSFontFeatureValuesRule`, `CSSViewTransitionRule`, `CSSCustomMediaRule`\n- **Declarations & Descriptors**: `CSSStyleDeclaration`, `CSSStyleProperties`, `CSSFontFaceDescriptors`, `CSSPageDescriptors`, `CSSPositionTryDescriptors`, `CSSMarginDescriptors`, `CSSFontFeatureValuesMap`\n\n**Deviations & Extensions**\n- **Rule Constructors**: Standard CSSOM rules are typically instantiated via `insertRule()` or stylesheet parsing. `CSSStyleSheet` supports standard `CSSStyleSheetInit` options (`new CSSStyleSheet({ baseURL, media, disabled })`).\n- **Synchronous `CSSStyleSheet.prototype.replace()`**: While the CSSOM-1 specification specifies parallel parsing for `replace()`, our implementation executes parsing synchronously via `replaceSync()` and returns `Promise.resolve(this)`.\n- **`CSSImportRule.styleSheet`**: Evaluates to `null` because the library operates as a static, offline parser without network or disk I/O to load external stylesheets.\n- **Source Location Tracking (`CSSRule.prototype.location`)**: Parsed CSS rules expose their source offsets (`{ start: number, end: number, line: number, column: number, bodyStart?: number, bodyEnd?: number }`) relative to the original source text via a non-enumerable `location` property on `CSSRule.prototype` (with 1-based `line` and `column` numbers), enabling source maps, DevTools coverage pruning, and refactoring tools without breaking standard IDL enumeration or serialization.\n- **Legacy `CSSRule.type` Constants**: Numeric type constants (`STYLE_RULE = 1`, `MEDIA_RULE = 4`, etc.) are retained on `CSSRule` instances and static constructors for backward compatibility, with modern rule types evaluating to `0`.\n- **CSSStyleDeclaration Host Integration**: `CSSStyleDeclaration` supports a `(parentRule?, onChange?)` constructor signature and public `onChange` callback hook (temporarily setting `decl.onChange = null` suppresses callbacks when hydrating from host DOM `style` attributes). It also provides a full Proxy supporting camelCase (`style.fontSize`), kebab-case (`style['font-size']`), `style.cssFloat`, `webkit*` prefixes, exact case preservation on `--customProperties`, and WebIDL-compliant `Object.keys(style)` returning only indexed property names `0..length-1`.\n- **CSSSupportsRule Feature Evaluation**: `CSSSupportsRule.prototype.matches` returns a boolean evaluating the condition text via the conditional rules engine per CSS Conditional 4/5.\n- **Single Rule Model (`CSSRule`)**: The public `Rule` type is an alias for `CSSRule`. Custom at-rules parsed via the `atRules` option with `parse()` produce `CSSAtRule` instances (exported in `src/entry/tools.ts`) exposing `.declarations` (for declaration blocks) or `.childRules` (for rule blocks) and standard `.cssText`.\n\n---\n\n### 2. Houdini & WICG Parser API Layer (Modern & Experimental)\nThese APIs expose low-level parsing, property registration, and typed values defined in Houdini and CSS Values specifications.\n\n**Specifications Followed**\n- **CSS Typed OM Level 1**: `submodules/css-houdini-drafts/css-typed-om/Overview.bs`\n- **CSS Typed OM Level 2 / CSS Color API**: `submodules/css-houdini-drafts/css-typed-om-2/Overview.bs`\n- **CSS Properties and Values API Level 1**: `submodules/css-houdini-drafts/css-properties-values-api/Overview.bs`\n- **CSS Parser API (`cssomnom/parser-api`)**: Based on the [WICG CSS Parser API](https://github.com/WICG/css-parser-api) draft.\n- **CSS Values and Units Level 4**: `submodules/csswg-drafts/css-values-4/Overview.bs` (Calculation trees, math functions, color models).\n\n**Interfaces & Methods**\n- **WICG Parser API (`import { ... } from 'cssomnom/parser-api'`)**:\n    - `parseStylesheet()`, `parseRuleList()`, `parseRule()`, `parseDeclarationList()`, `parseDeclaration()`, `parseComponentValue()`, `parseValue()`, `parseValueList()`, `parseCommaValueList()`\n    - Structure classes: `CSSParserValue`, `CSSParserToken`, `CSSParserBlock`, `CSSParserFunction`, `CSSParserRule`, `CSSParserAtRule`, `CSSParserQualifiedRule`, `CSSParserDeclaration`\n- **Typed OM Values & Math (`import { ... } from 'cssomnom'`)**:\n    - `CSSStyleValue` (base class, `CSSStyleValue.parse()`, `CSSStyleValue.parseAll()`)\n    - `CSSKeywordValue`, `CSSUnparsedValue`, `CSSVariableReferenceValue`, `CSSPositionValue`, `CSSImageValue`, `CSSNumericArray`\n    - `CSSNumericValue`, `CSSUnitValue`, `CSSMathValue`\n    - Math subclasses: `CSSMathSum`, `CSSMathProduct`, `CSSMathNegate`, `CSSMathInvert`, `CSSMathMin`, `CSSMathMax`, `CSSMathClamp`, `CSSMathRound`, `CSSMathFunction`\n    - Unit factory methods on `CSS` (`CSS.px()`, `CSS.em()`, `CSS.rem()`, `CSS.deg()`, `CSS.s()`, `CSS.Hz()`, `CSS.kHz()`, `CSS.Q()`, etc.)\n- **Color Typed OM**:\n    - `CSSColorValue` (base class)\n    - `CSSColor`, `CSSRGB`, `CSSHSL`, `CSSHWB`, `CSSLab`, `CSSLCH`, `CSSOKLab`, `CSSOKLCH`\n- **Transforms & Geometry**:\n    - `CSSTransformValue`, `CSSTransformComponent`\n    - Transform subclasses: `CSSTranslate`, `CSSRotate`, `CSSScale`, `CSSSkew`, `CSSSkewX`, `CSSSkewY`, `CSSPerspective`, `CSSMatrixComponent`\n    - `DOMMatrix`, `DOMMatrixReadOnly`\n- **Style Property Maps**:\n    - `StylePropertyMap`, `StylePropertyMapReadOnly`\n- **Custom Properties & Feature Detection (`CSS`)**:\n    - `CSS.registerProperty()` (CSS Properties and Values API)\n    - `CSS.supports()` (CSS Conditional Rules Level 3 & 4)\n    - `CSS.escape()` (CSSOM Level 1)\n\n**Deviations & Extensions**\n- **String Boxing**: The spec defines `CSSToken` as `typedef (DOMString or CSSStyleValue or CSSParserValue) CSSToken;`. We box raw strings in `CSSParserToken` instead of using raw string primitives.\n- **Synchronous Execution**: `parseRule`, `parseDeclarationList`, `parseDeclaration`, `parseComponentValue`, `parseValue`, `parseValueList`, and `parseCommaValueList` execute synchronously; `parseStylesheet` and `parseRuleList` accept strings or `ReadableStream`s and return a `Promise`.\n- **Immutability**: Parser rule and block properties (`prelude`, `body`, `args`) are mutable TypeScript arrays rather than `FrozenArray`.\n- **Constructor Arguments**: `body` is mandatory in `CSSParserQualifiedRule` constructor (`constructor(prelude, body)`).\n- **CSS Values 4 Math Functions (`CSSMathFunction`)**: New math functions (`sin()`, `cos()`, `abs()`, etc.) are represented by `CSSMathFunction`. Its `operator` getter returns the function's identifier name (e.g. `'sin'`).\n- **WebIDL Dictionary Bindings**: Dictionary constraints and computationally independent initial value validations for `CSS.registerProperty()` are enforced natively in JavaScript.\n- **`CSSTransformComponent` Inheritance**: `CSSTransformComponent` inherits from `CSSStyleValue`, aligning with browser implementations (Blink, WebKit) and enabling reification from `CSSStyleValue.parseAll()` and `StylePropertyMap.get()`.\n- **Math Simplification & Calculation Tree Preservation**: Calculation trees from `CSSNumericValue.parse()` and `StylePropertyMap` preserve `CSSMathValue` tree structures per `css-values-4 #calc-internal` rather than performing eager unit reduction at parse time.\n- **Typed OM Color Property Reification**: Per `css-typed-om #reify-property`, W3C Houdini Issue [#689](https://github.com/w3c/css-houdini-drafts/issues/689), and WPT conformance tests, color properties accessed via `StylePropertyMap` (`styleMap.get('color')`, etc.) reify as generic base `CSSStyleValue` objects (with `currentcolor` and grammar keywords like `auto` on `caret-color` reifying as `CSSKeywordValue`). `CSSColorValue` subclasses (`CSSRGB`, `CSSHSL`, etc.) are exposed via `CSSColorValue.parse()`, deferring property-level color reification to Level 2 in alignment with browser engines.\n\n---\n\n### 3. Node Static Analysis, Cascade & Tooling Layer (`src/entry/tools.ts`)\nThese standalone tree-shakeable functions and classes are exported from `cssomnom` (`src/entry/tools.ts`):\n\n**Functions & Classes**\n- `parse(css, options?)`: Direct parser returning a constructable `CSSStyleSheet` (`cssomnom` and `cssomnom/parse`).\n- `getRules(root, RuleClass?)`: Depth-first pre-order collector returning `CSSRule[]` (or narrowed `T[]` when `RuleClass` is passed).\n- `closestRule(rule, RuleClass)`: Walks strict `rule.parentRule` ancestors to find the nearest enclosing `RuleClass` instance.\n- `resolveSelector(rule)`: Resolves CSS Nesting `&` combinators and relative selectors across enclosing `CSSStyleRule` and `@scope` ancestors into a canonical selector string.\n- `parseSelectorAST(input, options?)`: Parses a selector string or `CSSRule` into a Selectors Level 4 `SelectorList` AST.\n- `getDeclaredProperties(root, options?)`: Collects a `Set<string>` of all declared CSS property names across the stylesheet, including parent shorthands (`border`, `border-color`, `outline`, `overflow`, `padding`, `margin`, `line-clamp`, etc.) and `@supports` feature queries (`{ includeSupports?: boolean }`, default `true`).\n- `getPropertyValues(target, property, options?)`: Returns all authored values for `property` in declaration order on a `CSSRule` or `CSSStyleDeclaration`, resolving logical↔physical property aliases, unexpanded `var()` shorthands, and same-rule progressive-enhancement fallbacks.\n- `calculateSpecificity(selector)`: Calculates selector specificity tuple `[a, b, c]`.\n- `tokenize(text)`: Low-level tokenizer returning `Token[]`.\n- `serialize(nodes)`: Low-level serializer turning component values or tokens into CSS text.\n- `getCascadedStyle(element, rulesOrSheet?, pseudoOrEnv?, envOptions?)`: Computes cascaded styles against a DOM element.\n- `resolveVariables(style, property, envMap?)`: Resolves `var()` and `env()` substitutions with fallback handling.\n- `matches(element, selector)` / `querySelector(root, selector)` / `querySelectorAll(root, selector)`: Static selector matchers and DOM query utilities (featuring a 1,000-entry bounded LRU selector AST cache and RFC 4647 `:lang()` extended language range matching).\n- `StreamingTokenizer`: Memory-efficient streaming generator tokenizer.\n- `CSSAtRule`: Custom at-rule representation created when `ParserOptions.atRules` is passed to `parse()`.\n\n**API Surface Verification**\nThe public API surface area is locked down and verified by [api-surface.test.ts](./tests/api-surface.test.ts). Any additions or removals of public exports must be reflected in that test to ensure intentional API changes.\n\n---\n\n### Parser Architecture & Upward `ParseHooks`\nThe core parser (`src/parser.ts`) exports standalone pure functions (`parseStyleAttribute`, `consumeRule`, `consumeListOfRules`, `parseComponentValues`, `parseSelectorAST`, `validateCustomPropertyValue`) for direct, tree-shakeable consumption by CSSOM and Typed OM modules. For upward extensibility without circular imports, `ParseHooks` (`src/parse-hooks.ts`) provides optional feature hooks (such as `createStylePropertyMap`, `supports`, and media query parsing/serialization) that higher-level modules register at bootstrap.\n\n---\n\n### Intentional Non-Goals & Boundaries\n\n- **No `getComputedStyle()` Support**: We intentionally **do not** implement or expose `window.getComputedStyle()`. Resolving true computed styles requires a full visual rendering and layout engine (calculating font metrics, line heights, box-model geometry, viewport dimensions, and interaction states like `:hover` / `:focus`). In a server-side, headless Node.js environment, a partially correct `getComputedStyle()` produces subtle, misleading bugs and false confidence (**\"if it cannot be completely correct, partially correct is harmful\"**). Instead, `cssomnom` provides [`getCascadedStyle(element, rules)`](#static-analysis--cascade-resolution) to resolve deterministic, declarative cascade and specificity order, leaving visual layout to real browsers.\n- **No Layout Guessing in Computed Values**: Layout-dependent used values (auto margins, auto min sizes, percentage positions against box size) return computed values. We do not infer layout context or fake used-value geometry without a browser layout engine.\n\n---\n\n**Guidelines for Maintainers**\n- When adding new features, clearly identify which layer they belong to.\n- Prefer implementing standard APIs (Houdini or CSSOM) over custom ones whenever possible.\n- Cite spec anchors in code comments for all standard implementations.\n\n## Web Platform Test (WPT) Conformance & Parity\n\n`cssomnom` is evaluated against the official [W3C Web Platform Tests (WPT)](https://github.com/web-platform-tests/wpt) in pure Node.js across 8 major specification suites (CSSOM, Syntax, Nesting, Variables, Selectors, Media Queries, Cascade, and Typed OM).\n\n<!-- WPT_PROGRESS_SUMMARY_START -->\n* **W3C Standards Conformance**: **93.7%** (21,691 / 23,157 passed assertions across 1,882 test files).\n* **Chrome 154 Parity**: **93.7%** pass rate across 28,773 common subtests evaluated against official [`wpt.fyi`](https://wpt.fyi) runs.\n\n| Specification Suite | In-Scope Tests | **cssomnom** | Pass Rate | Parity vs Chrome 154 |\n| :--- | :---: | :---: | :---: | :---: |\n| **`Typed OM`** | 12,768 | 12,224 | **95.7%** | 🟢 **+2.2%** (ahead of Chrome) |\n| **`CSSOM`** | 2,527 | 2,347 | **92.9%** | -4.3% |\n| **`Nesting`** | 126 | 126 | **100.0%** | 🟢 **+0.7%** (ahead of Chrome) |\n| **`Syntax`** | 418 | 412 | **98.6%** | 🟢 **+0.2%** (ahead of Chrome) |\n| **`Cascade`** | 556 | 528 | **95.0%** | -4.9% |\n| **`Variables`** | 501 | 466 | **93.0%** | 🟢 **+2.5%** (ahead of Chrome) |\n| **`Selectors`** | 5,842 | 5,178 | **88.6%** | 🟢 **+2.7%** (ahead of Chrome) |\n| **`Media Queries`** | 419 | 410 | **97.9%** | -0.7% |\n| **OVERALL** | **23,157** | **21,691** | **93.7%** | 🟢 **+0.6%** |\n<!-- WPT_PROGRESS_SUMMARY_END -->\n\n> See [wpt-progress.md](./wpt-progress.md) for the live historical progress log and [scripts/wpt/node/README.md](./scripts/wpt/node/README.md) for feasibility architecture and capability boundaries.\n\n## Development\n\nRun type checking:\n```bash\npnpm run typecheck\n```\n\nRun tests:\n```bash\npnpm test\n```\n\n## Project Documents\n\n- `ARCHITECTURE.md`: High-level codebase architecture, module ownership, and orientation map.\n- `PLAN.md`: High-level project plan and roadmap (older completed phases in `PLAN.archive.md`).\n- `AGENTS.md`: Instructions and context for AI agents working on this repo.\n- `LOOP.md`: Details the multi-agent PR lifecycle loops.\n\n## Related Proposals\n\n- [CSS Parser Extensions](https://github.com/bramus/css-parser-extensions): A proposal along similar lines to the CSS Parser API by Bramus.\n","readmeFilename":"README.md"}