{"_id":"@a11yci/diff","_rev":"6-1c5003f2ed388e4f9d5e5a9d6e7d1df6","name":"@a11yci/diff","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@a11yci/diff","version":"0.1.0","license":"SEE LICENSE IN LICENSE","_id":"@a11yci/diff@0.1.0","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"dist":{"shasum":"2e95b1016c9ac13de984f7fa0fe9864c01323986","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.1.0.tgz","fileCount":7,"integrity":"sha512-xgnvEmGaQbtSGET+SWh4gAgR14frXzD4b5+1HaJpUU91GNesfuYwsg2BuC33c1IqseXAEic8RkKTNoTnhzbpPg==","signatures":[{"sig":"MEYCIQCsF6usEXybg2Wue0UoZkXD5rt/NoLt6/jxyrQ72++voAIhALfnsgtti3R0VB85B6d4Z2z7TeWlMUhcB3qMLVByOZbi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11410},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"31f703e5c8f5413a6eb518a3efde603d85148f6e","scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"_npmVersion":"11.16.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@a11yci/core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/diff_0.1.0_1780609001518_0.08896554204112994","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@a11yci/diff","version":"0.1.1","license":"SEE LICENSE IN LICENSE","_id":"@a11yci/diff@0.1.1","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"dist":{"shasum":"29650cea78022b6c2c46a8ab58cf1edf748ffa5d","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.1.1.tgz","fileCount":7,"integrity":"sha512-2jifmK12ZXLNdxIgiPmpthmOVeXtCA1ClMbMf5p3AByQZI8gFun9w3y5HWTM7KoaMLi1RXyplPTF9rEDOLV4Nw==","signatures":[{"sig":"MEUCIQD8bCAHqIoFWo8jMoWjhD9aZQ5X1itzaG9+JIWYOb5qEQIgFTThhOGU3NHqY2JbeZ1glooc1DXU96rT1ablnRTMLL8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11410},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"919c2eb473649d6f9641eb3e8b3382834ceed539","scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"_npmVersion":"11.16.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@a11yci/core":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/diff_0.1.1_1780609239634_0.7213753541311072","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@a11yci/diff","version":"0.2.0","license":"SEE LICENSE IN LICENSE","_id":"@a11yci/diff@0.2.0","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"dist":{"shasum":"297ae4286fca58fc5d9d7fa0a1bf0334d174df79","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.2.0.tgz","fileCount":7,"integrity":"sha512-XIo0NdEA/p3oy5r2c1lo1SR/NUYGI2kYKZ4ywK2jvWD0pBnUoJZI4N6kjTS9VTeklrd62vDXxW87R+se7urSrA==","signatures":[{"sig":"MEUCIC2YbrInOfvQyKx7JCHASelYBbbhbCGV7tmCmB+Q+EVPAiEA83yFCYbUD7DRreiAcdZlE8N2hMYiyPyNw96paYMZt3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11414},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f0669ee2e2847795949b34ae462b04007960239f","scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"_npmVersion":"11.16.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@a11yci/core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/diff_0.2.0_1780615655567_0.23700528809857668","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@a11yci/diff","version":"0.3.0","license":"SEE LICENSE IN LICENSE","_id":"@a11yci/diff@0.3.0","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"dist":{"shasum":"ecefe8888342ba2f34ac8ffd05975d7a5e2f13c4","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.3.0.tgz","fileCount":7,"integrity":"sha512-4fcuvPV7uCTOzpSAPgy/4Td63cLrhxFkULFV8G+4K3FnSsBMQgLRDsDaVQi9fB1NF9PbFbzfV70grzKUGTg2mA==","signatures":[{"sig":"MEYCIQDTfk0e40qjjdqaHkojudCcGUnOBYRGIPNrHlENqX8BGgIhAJdHDVxToCGwqeVLwiprlBxeyLKXFK/jO2kIinG3LJKL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15109},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"79a2bd8b8c61c81d4f3f59b73eaf01b06d01c9ba","scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"_npmVersion":"11.16.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@a11yci/core":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/diff_0.3.0_1780664812976_0.4535579438401405","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@a11yci/diff","version":"0.4.0","license":"SEE LICENSE IN LICENSE","_id":"@a11yci/diff@0.4.0","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"dist":{"shasum":"a32823dea0878568ae7ed810db7d2dc3b9a3495d","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.4.0.tgz","fileCount":7,"integrity":"sha512-ze6FMQG5erf27WPtbekxE+A6WP3SXSSBaGgcMKa0AX3ZFU1ZBacfybxNuBWv6B6g+8PBSwrs7gViyaCIe9H3FQ==","signatures":[{"sig":"MEQCIBwK4QkDp2RLmO5kCWjd3Z2tCWnYaC3M1ZChDql1eLzxAiAY3M2iuTZKuCQA8A9nPrnFFTwqqcj+PK+QD67lRXnRhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17727},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"94008e548b50bbb6852fd8db56b3c1abb284bc71","scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"_npmVersion":"11.16.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@a11yci/core":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/diff_0.4.0_1780670039614_0.13520397321577704","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@a11yci/diff","version":"0.5.0","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","license":"SEE LICENSE IN LICENSE","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -b","prepublishOnly":"tsc -b"},"dependencies":{"@a11yci/core":"0.5.0"},"_id":"@a11yci/diff@0.5.0","gitHead":"2328a6ee088b1c5e1544c4066f71bb516d93c78d","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-geov7JvOdCsxX9WEeXII3gIiLpD1YOHeNt3UbdKiBqRrKYCSqRwI1qJfUemx0qPOBvMu8UaW4BDQU2r5K+0jmA==","shasum":"b0db8862f711c0f52f6bb410621e08b12f81e74d","tarball":"https://registry.npmjs.org/@a11yci/diff/-/diff-0.5.0.tgz","fileCount":7,"unpackedSize":17727,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCxM2M97Kkgn7pMSLJFbAxP18jL8+v+ZiH/YhMPuR7nLwIgAMEt88wN93meU9QbkiPhtSg15sEGd55EwiTw7x1kafI="}]},"_npmUser":{"name":"innerspark","email":"mike@innersparkmedia.com"},"directories":{},"maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/diff_0.5.0_1780679185959_0.40762226103212784"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T21:36:41.289Z","modified":"2026-06-05T17:06:26.246Z","0.1.0":"2026-06-04T21:36:41.663Z","0.1.1":"2026-06-04T21:40:39.792Z","0.2.0":"2026-06-04T23:27:35.697Z","0.3.0":"2026-06-05T13:06:53.144Z","0.4.0":"2026-06-05T14:33:59.796Z","0.5.0":"2026-06-05T17:06:26.109Z"},"license":"SEE LICENSE IN LICENSE","description":"Regression diff for accessibility audits: what issues did this change add, fix, or leave unchanged.","maintainers":[{"name":"innerspark","email":"mike@innersparkmedia.com"}],"readme":"# @a11yci/diff\n\nRegression-only diff for accessibility audits. Given two `AuditResult`s (base and\nhead), returns `{ added, fixed, unchanged }` so CI gates only on the issues a\nchange **introduces** — not the pre-existing backlog. Normalizes volatile\nframework class hashes so cosmetic churn isn't reported as a new issue.\n\nIdentity is **per node, by content fingerprint**, not by selector. axe reports one\nissue per rule per page and its generated selector latches onto the volatile\nEmotion/MUI `css-XXXX` class, so a selector-based comparison is blind to a\nsame-count *swap* (a removed offending node replaced by a different one). Instead\nthe engine fingerprints each node by stable content (tag, role, accessible name,\nand rule-specific data such as a contrast color pair), and the diff compares the\nmultisets of those fingerprints per rule. So it catches new rules, higher counts,\n*and* swaps, while still absorbing framework-hash churn. A head fingerprint base\ndid not have surfaces as an added entry marked `change: 'worsened'` (or `'new'` for\na wholly new rule), with `addedInstances` set; fewer instances is a partial fix and\nis never gated. When an issue carries no `nodes` (older JSON), it falls back to the\nnormalized selector repeated by `instanceCount`.\n\nResidual limit: two controls with identical content fingerprints are\nindistinguishable, so swapping one identical-looking control for another reads as\nunchanged.\n\n```ts\nimport { diff, gatingRegressions } from '@a11yci/diff';\n\nconst d = diff(baseResult, headResult);\nconst blockers = gatingRegressions(d, 'fail'); // new fails only\n```\n\nPart of [a11y-ci](https://github.com/InnerSpark/a11y-ci). Source-available under the\nElastic License 2.0 (see `LICENSE`).\n","readmeFilename":"README.md"}