{"_id":"tag-soup","_rev":"19-e98f9f22871803bd15615f26106e2e34","name":"tag-soup","dist-tags":{"latest":"3.2.0","next":"3.1.2-next.dcc2023"},"versions":{"0.0.2":{"name":"tag-soup","version":"0.0.2","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@0.0.2","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"1185b93c4507564e4ae8ad7801144bbeef40a2c0","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-0.0.2.tgz","fileCount":33,"integrity":"sha512-5/TCc+TEVwSvw7bhPB0aB0p4GhYZG8klRx0xhGll8aVsfmpyvyamysK4aaByIgQpXJsIxJFbGpxUGCxEYOD/wA==","signatures":[{"sig":"MEQCIFLzmABpJCCIIxgfoCORUoCtT3Fod4i+VKIaJiPbi+4oAiA0RiZZxzH7dXZ2W/wY0un5/v7N60EigAYMUkA25Ti/fw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfW+0lCRA9TVsSAnZWagAAIlkQAJPKkq2FPicW42T70XFg\nxaKx7NmhLpF3tl8XiOrGgEbY85YcM13qaiA8K1m08GneJV0MXdRnTltQFZUB\n77tqEH1xmK8TwUIN8eOP5ODqMJXYIjSHSCRPM0rvAPg+TFWcdJadcPUDNu0P\nJQx5XNk+p16D2WfSA+mp6MsJ+upurbUuiLDP22PZgARNj+BElfs5FlXk49fm\nAiVZcTAuYo7m5j7khgqdgRnJzYHcjFHWDExEu0bgAAHt1PPixP5/3OcN+SqX\nefky/1FSxbGOK1Exj8nl+Dxq/lz/0h7VMCNSJrR3L0C2m/g54K9zA1/gkydx\nkyVl/0SCt344sfePZjtFhh+YeM13ipLFx8mEGYrQxlD8YxS0hMzc/MErbW3B\nMTs0TG+QKTKHxk7Tjt3jElHCgAWAEkiqs1jN8dmiDimNdf92JNBp4mp6Hf/q\njV+xuuCWhsuxGLbPnYiXHBoRn4k4LvrBjpxetn1DMUUUix+uJzG2TIJJFDBL\nU4pqTlRqP3YxjBz7pORbIeKKmgUaVtGVEJoyvaLsKvCiU2R9FGTp3WFX9u8+\n7BXmR9KK/6DdpbuEshl1JNUQHBuvjHn5LAadHTyL4oIFRIVt1bm/o4g8hyxV\nA0DDTh0AV/+ryyt7g4rj1tvz8Nv/QhJxxD/5j4lXJWrh5+3hnhV42aDAJI6J\ncfCY\r\n=VHcO\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest"},"main":"./lib/index.js","types":"./lib/index.d.ts","gitHead":"f4c0c31edfd203a162b06ccf52f992b2d093bb4e","scripts":{"tsc":"tsc --module commonjs","docs":"typedoc ./src/main/html.ts","perf":"node --max-old-space-size=4096 ./src/test/perf.js","test":"jest","build":"set -e; npm run tsc; npm run rollup; npm run terser","clean":"rm -rf ./{lib,docs}","rollup":"for p in ./src/main/{index,html}.ts; do rollup --input $p --dir ./lib --format cjs --plugin @rollup/plugin-typescript; done","terser":"for p in ./lib/{index,html}.js; do terser --compress --mangle toplevel --output $p -- $p; done","publish-docs":"set -ex; [ -d ./docs ]; [[ ! $(git status --porcelain) ]]; branch=$(git rev-parse --abbrev-ref HEAD); sha=$(git rev-parse --short HEAD); t=$(mktemp -d); cp -R ./docs/ $t; git checkout ghpages; ls -A | grep -wv .git | xargs rm -rf; cp -R $t/ .; git add .; git commit -m \"Updated docs ($sha)\"; git push; git checkout $branch","release-docs":"set -e; npm run clean; npm run docs; npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"6.14.5","description":"The fastest JS SAX/DOM XML/HTML parser","directories":{},"_nodeVersion":"12.1.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"sax":"^1.2.4","jest":"^26.0.1","tslib":"^2.0.0","parse5":"^6.0.1","rollup":"^2.12.0","terser":"^4.7.0","ts-jest":"^26.1.0","typedoc":"^0.17.0-3","nodemark":"^0.3.0","typescript":"^4.0.2","@types/jest":"^25.2.3","htmlparser2":"^4.1.0","@rollup/plugin-typescript":"^4.1.2"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_0.0.2_1599860004732_0.7557067001400848","host":"s3://npm-registry-packages"}},"1.0.0-next.0":{"name":"tag-soup","version":"1.0.0-next.0","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.0.0-next.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"7d1592d109119ae44add700ae1baee395bca9399","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.0.0-next.0.tgz","fileCount":32,"integrity":"sha512-T0F8XzZr0wvub2iBqFYoet3i4AyFQEMYGfYu7clElkhc11qYd8sM+p77b0TIwZGlRSmZ1m3+xrsuYzupZWCyuA==","signatures":[{"sig":"MEUCIQCvdnsn+1oOZGI+K+tWCW5YnHKb7Vix+2v8Sq6f1ob60AIgHZYwqacQtoTheKzH2q0CdrF7n71UBPxc4JJknWP3weU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":80325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhAGAdCRA9TVsSAnZWagAAjTYP/1NvwL9i/jfcWaYINku9\nK7vRiSFVDWSQzZPiT3tmraaMupPUTtDSjSdr0s/XUCpAdx/9qtFCkqOqlWoY\ns70AoX2evVMr+47OUyg01SN/9ZGrKTQMJhYA5w5s6RCG3qFF4MkF7cAEKOmp\nZrlu3oQ07c5LgRa86dSmykSirUsOAgZmv8Xp4iWBu4lhX2hRE3JdK0RtDzWq\n13EBEfuew4Mb3PzWO6VvxZ8hYhLiymXKtZm2k3O7NT17RUKeEzKljCnV8g5X\niqZhvoW8i2ujtB6kDGnMEYiJaFjCf0xUZvEfBp8MH/Eastpvy3J12MITHag+\nhK6NaFQAmqMOwDmC94A3Z3PZ7yTueHjcyp581tJpwBuMRma+XE4ygISrTkYJ\nDMdoQxIrojNE9zGnS8gR/JvwI1lkeYBMD1u1+PXPTaZK0RI3EcMYe4DUCT/n\nC8TMH4Zq46LU6CsQmYhqwTFNhYDCu2YHjtUExCPrOcNUWPj3ZMGiBnG1R2eH\nukZdhLUeZD0mQBAEKITWutj1vAb3edvlxRzri283a9O5hbuJAireKTFGDuRd\n7eqtD+A8b0pAiliZDytf/jaLMtplqv3l/0j1U/Cfb9vJhw34uatLeM5JTH0n\nwZoee3PdHc+qcrXrIDWQQ6TdJgwPinMT+j08RJiknGbrvesAX7XKYQ37qbK1\nicNE\r\n=qTla\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest"},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"a4856350c8eb8a8e29ba9cd71d82adf261e85b92","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external speedy-entities --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"7.15.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"_nodeVersion":"14.15.5","dependencies":{"tokenizer-dsl":"1.0.0","speedy-entities":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.0.0-next.0_1627414557532_0.8264624357603763","host":"s3://npm-registry-packages"}},"1.0.0-next.1":{"name":"tag-soup","version":"1.0.0-next.1","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.0.0-next.1","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"f2a41117152387068cfd746908e6c14af8fe9ea3","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.0.0-next.1.tgz","fileCount":30,"integrity":"sha512-TINrFeIfkQoeZODgbBFjCn3VMP97soNA0q1ePlwHyg4e4O6cOBLwiyt8y/dOcRQRFBbKkLd6qKvjM/3sEXgaeg==","signatures":[{"sig":"MEUCIB7wo17VN6WCCTNFrXsieUEg4mtE9HeV5NGz05IgkKK8AiEAgkSkyzyCDxafRIqyx4LWuMTsHJqXYoAwV9aY5v4+o68=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":86965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE8rQCRA9TVsSAnZWagAAvi8P/3RJOqOdqz16bJgamAOu\npC4oJo73fDljOTrDQ03pInD/3dMcbjY7zlGinYW9Gapcin4Yttz3ccKe4upg\nMEMm3Ri8Oj9vEw8tP3St88y9ABXQTUTLevEzUzLd7x2iH+sscO3y5OQJaXgY\n8at0juxedTQER7RQ87//EnvX9aUmxDxkTWwL6DjRBv4RHYgWDZFBmutE1T/x\nekkWTBAHRb+jAh4NINhCj4PEQGIRpbaOrJ/EM8Y/H242HgP0asV2XYxu/v9A\n98Hd82KiVlEKdjoDnQctuwp7+p2j5X9ksTaxg8hQdfqBoicG0aQwgrDDtUyc\nB2k+9q4mLd6UdZAQTLVadWZ5BepKSJxevNmq2XDaHR7rHt/Z0wJJT/XpL3oT\nlwlT8aLB8p7zO6kOWKrzvibPzwWONzhibLvpOx+DTWyh0lb/cVmeZvwDtGHK\nJ0sUsxgfADAnfcclg6kNW6GndZ0wIzb9OFge17kutiairfZ7ipnerI0VfUyi\nO6eCl6ndAwruDXsHYHYGhuiMDVahiE5BQrFFClrGUYcnQe+/K3Bjc8zMCmoq\ngJWApJql3IoP+T6w915+Pr2R1OVG5yDAbvF1f5DRu7UOjGeNr5TozGoELncI\nX61+4h1zWVYjENEd14iQoZpqBJHPJ9ThFgLy35QfvZC0K4/KzR8AHDC11Xkr\nW93X\r\n=h6IM\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"57c04c65bca36c6171a8f3c62428b784160a5148","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external speedy-entities --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"7.15.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"_nodeVersion":"14.15.5","dependencies":{"tokenizer-dsl":"^1.0.1","speedy-entities":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","tslib":"^2.3.0","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.0.0-next.1_1628687056217_0.4286888906880397","host":"s3://npm-registry-packages"}},"1.0.0-next.2":{"name":"tag-soup","version":"1.0.0-next.2","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.0.0-next.2","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"d3e76be7a126c4b7a102ffd824a982bf0cb1d997","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.0.0-next.2.tgz","fileCount":30,"integrity":"sha512-ru0nmUNk/xk3PFmKExhG6A2cdcBLEyk2Rtfg8HrC73aPbMwFoyKHxDmIaH2Iyc4ONAkghcw55at8RtjW5bBGBg==","signatures":[{"sig":"MEUCIQDjWyrEglBZPW5VrvdXRAUg1E3GTRC3zr7CsXWrkd3VIQIga2yvJ61b5F1mMVx/CQJ06Qvh+sea3o/xw+DNPfyJveM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85349,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE9FECRA9TVsSAnZWagAABc0P/2P7oGK2AsIGii+fKUeS\ntSO8mVdRC/tlM+5gnx0UtxlE466xjfc7BEmH+ne+yfYi5uk0xx8m8dssysqh\nobvmEx26o07Q1Id4ZWBexpRn50Z2xhX0ekRoURD79N1O/xY+pQFMQ4yw1PiA\nLT4BduqMS46zeSqisZRmq0DKib3cgiL1RQu3F1uSzPQkKldUanvf75V8JDMB\nXomN8kJmXjvDz843zptrfqhExV505YQThXBT5IQ0/q+FxXONgGLXphCih6S5\nuZte0C2gNAJs6Ky3BNlMC1lgXSdSWkTa9gsdFbX23xXIhR5cq8JE/1+dxODM\naw6le2OejD1eK4QidQVE9h9TgZxlwefC2k8TrCHfurE5X8FPv0tZn0WNWaPI\ntMRAvocX7K2fxynWnk7L0Eqj+Z8zBuXQOqRgHehtBWnLKci+fFecY7eH1f6D\nUxlfCZ6dhAyT+F42d6zFkbNq8dteIaT3AR03H8JQ8+wbn7wYYQgGLQ+1zBi8\niBdOxz/aQR2BCmDN9/SiGD+x+SbpJhJx+0wznW8g4e2bRujeGCrNQSDQbYvJ\nib5nyR6EnjvxML0fkeCPb+I62mLVtVEQYOf6SdxsE+6WWHDk73mOmaI09NLy\nxiTKQ6gGB0UaA8129OY3d/oAS4HfOANugrJCc7Hm9AL8IR40+eTzrN2ytr47\nFe57\r\n=zR5E\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"55ace0c19304f4890325a7e73d62bf1d2f4e8c3e","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"7.15.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"_nodeVersion":"14.15.5","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^1.0.1","speedy-entities":"^1.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.0.0-next.2_1628688708633_0.3633715153769588","host":"s3://npm-registry-packages"}},"1.0.0-next.3":{"name":"tag-soup","version":"1.0.0-next.3","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.0.0-next.3","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"ec3a2488007b5b32041f7c456c0e92c6731eee17","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.0.0-next.3.tgz","fileCount":30,"integrity":"sha512-Pmc5ogRIlaCTyKFmParmKO78BvHZtNHURaKesCmi4nUSlIroy8VFXALXu9s2iXv7gTXZnc7Ueeq5XA+dDdQ5Tw==","signatures":[{"sig":"MEUCIQDtraUbLVrwJ3xGyPFYscjm0fGvuc+coBMZ/mq/BSjOEAIgICUx3JVy8PDvRlr+oG9Vtl2d2bQ5tGZYBkgHyX1+Ago=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85373,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE9S3CRA9TVsSAnZWagAA4b8P/i8ZkF5cBbh55DNfEOO5\nqvevHL1jfoMsqSTyA0STAsvZqGxrTzejkDgSUpvtPZYMmmuNmxvykxglkpQu\nl8OyoHdBTv3ze4QL/0IMX2uCwb/KJVSSmATcQ3/EGVwbwOmCzPa4KZ0dkT6w\nJ32leBznk6aOnt/cY+StHPQRwjQawt7hwVNsTxcuXDPN6u6AMNvl/ENui1Sr\nzZYnE0Woh21HoSjSVC6OzxAlrVFv13yVyZo5R9RMNS3f0p4x5Bi4gcYcIVT0\nGcReVekjxbo1nvBm0G7n5hP2nXReT1yXKDI5/i3g5fAoNqR7pC/gldld8wts\nljFHVM0LAkMvZYKYJA4vjwa/hARsbAeN7zV0QiLXk6ex2xZU2NUeO7ugMa/O\nrHWayl21uRhP+Izm22jI4fLAK0Acj9FXMWCOoB9IeV2NimeHr0fsrgqPggSj\nWBmQQA7vNem+rQVC3xw6EW1ncTNJUTxF9kDMvOYMLeVDDhK9uCboO4iWT7+q\nzYUvBGT2BxRyZJdehRtiVXQl3VoAvxnhH2b6yVi7JwVPZc3Ca+zwCU0KnpPg\n/JRtRwFXPg/ZlGaA+0FkO8ZZTwFoA9/sVi9dkdNZvCOp411K1xA1omM7TATD\nGHVa1vLRqcF8GFusPIA29hhncMObqHss8OZatcoQdgxj80w4Gz7h7vlDx2Da\n/u/e\r\n=OQLT\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"708aa1aaf20a09d27fb1e9ff31392e2a5ca2bf60","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"7.15.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"14.15.5","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^1.0.1","speedy-entities":"^1.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.0.0-next.3_1628689590894_0.24340467974802493","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"tag-soup","version":"1.0.0","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.0.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"4711f4ef849007e99ca295290866da25dc78c061","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.0.0.tgz","fileCount":30,"integrity":"sha512-ZVKsKwAArExCmXgOu3s1soaNuImlE2+GZPIpPPi28s6ak8ew+ifU591e3QEBtQjvuaYQyqnmrlu+aDiO+dKprg==","signatures":[{"sig":"MEUCIQDtJi9i1km7dMtRRpq43YDnRJf7Ks0hPca2ptGJ4Vl+vwIgcPqy2qgN9bzUld68FgNqZGs9n8Ht1Uj8Bk2Kye4X+P4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85400,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFAPzCRA9TVsSAnZWagAAHHUP/R6o43dVYhfA3gwmu24v\nSQPElprtxZTXTIeJSWHJsyYF4e4f7NTfm9WCeQM71B9M6+d5crS5nUEMgrL2\nK1CuO2GeWJy+t16x853IWgP7hQGsuLjbKCr1TifBfqBTWAHvK2gu0cGfBV39\nBzIp9SOAik1XO3J4BypiZuF+FEFW/kXuc3Yc8nrxqmXOniyBX5futIlgGvMj\nXOauDnGramYIHylwkm1EEWd2TWD1Qod5fmJMc94lZ0VeHycYnjdqJRt+z2d1\n4K/7zk+Lu9ilBbjv8g8MH9zzY+jIwderaXkLct+zOvPPFm31TvrA7MWDeS9E\nHOWHDDA+WCR7T+vKnoNYJ2JEOoCqvG74ZIefqDt3nKNWAv/5/eiZVZBNXkhK\nRrB0tz0OatkHL1r4msHB8FojgJgO8mHOdTuAJJSZKf8x73oQ9qQJoBBl/T/W\n92z9sRNhrt1iJZq/ipPdV+VytDggPjHH49yhBbPdcoYVQMkfjhC0YP6I831z\nch9bHJNdl41NEgh65pzGH5ioy0uVxjgiAgVeiS+RmVzzTvzGVcY98wwcSb/j\nIj8ZRcTTQ7c+3c9qKepi8uds4cW/HHP/cByD6wZ3U4kEaIAvvKDZ6ku/gQTY\n1fO4g2v5qU3yJ10hDA1x4vCVK1TyrPiYDTEsVch+JWs3mbuzlKFyAKXypepS\nVjYl\r\n=jri8\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"21fd1a337b8af53484b8dec27c1b58b68df1c8e4","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"7.15.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"14.15.5","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^1.0.1","speedy-entities":"^1.1.2"},"_hasShrinkwrap":false,"devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.0.0_1628701682928_0.23151206252376233","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"tag-soup","version":"1.1.0","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.1.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"0d62397fa7e04869f48e039268f49acc69c06295","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.1.0.tgz","fileCount":28,"integrity":"sha512-irb/Zc5UE/N6mLN8RK38TbKVg9grNUfmwRRguQgAnpKl0KdBSPBDVy8K7drSzPUQlaT8XKn8bIQ7wcpI/UFA1w==","signatures":[{"sig":"MEQCIECyF9Tptzmd2hVLdb4W2DXtGeXqak2mElx1KXuSFRywAiAhFCgivSH7AdnA8MuHueIfp7AEMbC/miGUajay+SEC5A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":83117,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhvG7RCRA9TVsSAnZWagAAWwcP/A4pqjAZTz5GT4ElmskA\nW1ZxLZi6JdxgeIT/r1pX6yITeXgWxyvBiO/MZcfbmvZ5WmVnksBtibw/fumg\nOl+ngGcQu61QhUPL9W2Xzggk+f/DAOK599KRBoZFyyQrAt0ho94GBE1uIBiF\ncwisocFv+seJn48vnBWyKWBRBeTEqjqUQgz4DAUza9/+wP23+ThnPfDVloL5\nT4dMu0KZdfJzOkh+PO1CeRHkoYWduSN+YBdkWLvsTZqCjGvs1kHsPAWOLxAc\nnxVCX0qfOYKoYFm5iQpX7TeI3MLQ9xAgKI4dJNd58itOKwJ77LAnebTRqclM\n7afjyIDR3vNwYqB164n9rrvpaIyuS3vEzUIekVFz3KDn2+KIZ+LwTCLYChsS\noLf9WZYWpGOKZ2yH6bQQ+rK8kpVx3+49gUKXxux/r/UC4GIwtLHIjUoTfkAq\n1euWfuRqJidjJU/Ry2jXBDiEuzS/Iyre/xfvtgnfo3/e69Xum+evaaI4bDLG\nEhLWK4gDrDMmd/qr43ZzzBKFSeT8eXD0btlZU9fUzoGs+n+CxIKX3T++HuVd\nUqu5sdNu1/n5Yrva4RE0DF6xnZHSbDRX9UDlQSW4zXtOT6k9nbZybS/NPloo\nNmWjrfpGRWI7+FnfMz21U2jfeCh+mZ++Ygxj4wfnw6u0dbExLslP+6eJQlHf\nVG9m\r\n=L569\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"6adaa123b79274ba7aba57871ee9c64ed38cf8f6","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external @smikhalevski/object-pool,speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"8.1.2","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"16.7.0","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^2.0.0","speedy-entities":"^1.1.2","@smikhalevski/object-pool":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.1.0_1639739089578_0.21843868944955802","host":"s3://npm-registry-packages"}},"1.1.1-next.0":{"name":"tag-soup","version":"1.1.1-next.0","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.1.1-next.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"5706e19ebc6201a9efd1d59426c9b01867a424d6","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.1.1-next.0.tgz","fileCount":28,"integrity":"sha512-IZ+ejuqtuzbpUWqonnwrhO3sYpxTiu+wFNLXaR2PL1YtpQlUkh/okHjLOg5b20wMOk07HJTva51O/iA5dp3V/A==","signatures":[{"sig":"MEYCIQDJH3AggWkEV0yb8RYJ1Dvdfew6N+7KIV87vtgUoGUfRgIhAIsIIQcHgimit8eUOXaMtubZzlatmVISNlfFxL7yPhqb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":83108,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhwjHjCRA9TVsSAnZWagAA8kAP+wc4Jm+b03NPp5BMizvW\nfU3xIoEvQ4Rp32fWcPvOqMbZewP9xIXSxqaqvi+VOqMHTPfS6a4YDYsFNkt0\nEfAkhHr7doK+PHL6wAIywkoYuJPqDKb8x2qLuw2OdOYebSlUht9zYShLw+7e\n8bf471uLdjlXdVHu1zF7jrDboAAs0vZQuYDrkcKSTE5Q4HD8pyJmyK8E80k8\ngL2rg+uvk4sMByc/ix36FrsIKb+BiifZsnWLS8Drge2749suP2LkXDshaLWw\nzfc5YKnVwtvFDR0y5etzl/r9iDVLqrTqWvC5A/PaTY5rro0LRf4u+hmU1S+X\nV9TW2tDueUWCKp3X9bJ5HDsRbHz+aJLrUOofKQrwpoBZpPKa7ZhISWI0SH3s\noSV3ERkYNhhEpmVHzJgvx3Xvq1JydowTJ6EKlSarVbf5h+kaaIncUG46aExj\nJ2GUJmDtcnq8+l8F1tu/I3+DZdwQeQWEkz3Pz8pAdiWU2g8CGazF/9AdOfzF\nXljbZZRTh1W4KHLMrqdsI6zauCVS2aVX8LKHvRoRYxh/NJUO6gldOvGQdzQF\n5bBdgLT65P6wm2YjocUFk4F4CxsVQb08J1rawvLX3BrXF5v4bmCpRvQgFpwg\npfXuUBB7QRWRTZQPSuIbGBl52gkbvemS9oJaf8FcYHK9igt2A/ZJGqbm4w2J\ngEYe\r\n=b0q7\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"f6eeb69d27cfa4ce6e271de6b100a4df451e5b7b","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && npm run rollup && npm run terser","clean":"rm -rf ./lib ./docs","rollup":"rollup --external @smikhalevski/object-pool,speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"8.1.2","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"16.7.0","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^2.0.0","speedy-entities":"^1.1.2","@smikhalevski/object-pool":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"sax":"^1.2.4","jest":"^27.0.2","chalk":"^4.1.1","parse5":"^6.0.1","rollup":"^2.50.5","terser":"^5.7.0","ts-jest":"^27.0.2","typedoc":"^0.20.36","typescript":"4.2.4","@types/jest":"^26.0.23","htmlparser2":"^6.1.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.1.1-next.0_1640116707642_0.9635168292182463","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"tag-soup","version":"1.1.1","keywords":["tiny","small","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@1.1.1","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"faeacfa8f054f00f2c7443bca87b7775b9dc510b","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-1.1.1.tgz","fileCount":26,"integrity":"sha512-907l7uEGI3oc4ONsVlHyDXDmWWGIxWN+atj/BUQctExL4WgotQnW3jz0KgzNfFlWM7dChSRhB73KpZPSACvrdg==","signatures":[{"sig":"MEUCIQDP3PqjVEgxfwpAxOpkPIEkMhzQQfOesPX87ajkFN8k6gIgXrFrlEUGPwPQ0Q+JJpGJcIAf4IfBCZ2JiVlVm+WHgvg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":83056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNlboACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjMg//b4blN3OaoyuV5WJzN5rx/H6kCHCaF/UG8ffyQ0BqvMuwIPFB\r\nfy1YsThJy6YGAbLxHwz/nhNegwnW0xE9+y1FWPPJk9jEEvjvhYVBvG1uJj7X\r\nX0tjTiW3+OPHAWV0oDH6qjHUVoJBSf+M3W0GzkJZ+PnVu5/lRQm2McpKA38t\r\n5riLV4g2t04Ww9DbNiAUmSTIjj2f7fjgt8qhvUF+u4yUvhz0BFV7Le2XnOWb\r\nf2qKq/4h/MvSowRJM9lexIPnTCdP3ZIYfbsqsFOPCjt6EphXl9srTiNpkzDU\r\nwfuUYG6ex5UCq/L3jCgCQeKabnBhAGS+1EUbIdSDAauEApZtXvGdvipNigqw\r\npS+DcquXe5+diV5vIcn3EP1shOXJVSo75j2CmVZV8cMHJGsyQiu0m3C0vxx6\r\necfm4OHwA/4t3skyAmjKR4jImUz1ZShPzMhLmiG1jBOc3wNnJ46ueQrkj09/\r\ntKMt2nCcGtVkd3WBGlasNNd99d2XRYo+VneEtUboDdtACnMWd9pEiuikVAUF\r\n2aXG4S4t60ViLKWtrEYsnUN0Hnph0DiDWNhNUzvds/FbxQSiGdb+O2XcRyfi\r\njMkVHenX0Jl+L091PZoZsEjVcwgd1ZstmDHPrl4tsr0mLXUOk8Q1rOApXCA+\r\nyeXKuOZPpNFWzjms+2kdySPjLFhntcfg2DQ=\r\n=5dWG\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","globals":{"ts-jest":{"diagnostics":{"ignoreCodes":[151001]}}}},"main":"./lib/index-cjs.js","types":"./lib/index.d.ts","module":"./lib/index.js","gitHead":"b37fec049ce20679d7837873a49deed5593d9ef2","scripts":{"docs":"typedoc ./src/main/index.ts","perf":"[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./node_modules/.bin/toofast ./src/test/perf.js","test":"jest --detectOpenHandles","build":"tsc && rimraf './lib/CharCode.*' && npm run rollup && npm run terser","clean":"rimraf ./lib ./docs","rollup":"rollup --external @smikhalevski/object-pool,speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve","terser":"terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js","publish-docs":"[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch","release-docs":"npm run clean && npm run docs && npm run publish-docs"},"_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"8.5.1","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"tslib":"^2.3.0","tokenizer-dsl":"^3.0.0","speedy-entities":"^1.1.3","@smikhalevski/object-pool":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"sax":"^1.2.4","jest":"^27.5.1","parse5":"^6.0.1","rimraf":"^3.0.2","rollup":"^2.70.1","terser":"^5.12.1","toofast":"^1.0.0","ts-jest":"^27.1.3","typedoc":"^0.22.13","typescript":"^4.6.2","@types/jest":"^27.4.1","htmlparser2":"^7.2.0","htmlparser-benchmark":"^1.1.3","@smikhalevski/perf-test":"^1.0.0","@rollup/plugin-node-resolve":"^13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/tag-soup_1.1.1_1647728360502_0.7306087309893312","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"tag-soup","version":"3.0.0","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@3.0.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"d3c53b26c8216dd0f07753b82ecc705a669653e6","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.0.0.tgz","fileCount":21,"integrity":"sha512-UUw6+PmeeSKXTYOHMUqXwkfcX5Q2LDmEBOFHgEaHscV4YruFZ/kP/27ImdZivXgIgolWSRR/30744yIaS8eDkg==","signatures":[{"sig":"MEQCIDSJfaWWrBlYqOIHnlOnTs6rRFE1Ng+oj6aG/R+cRB10AiAOg2xt0o2qIIP4ZuuUHD2xiz3owpbr9x9l0I+xIwwHjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68012},"main":"./index.js","type":"module","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"a233040c4a21c2a64e4078adf7986edbb05431d4","_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"10.9.2","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"23.11.1","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tag-soup_3.0.0_1759932632990_0.2326506769564809","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"tag-soup","version":"3.1.0","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@3.1.0","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"f36e96b7eb084d4481ecc9e21e976e742a2e72cd","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.1.0.tgz","fileCount":23,"integrity":"sha512-3WWbN1kBUyKJUyQh+hDoTlyYpJ3TeciGWQEIjq3gyjoYZCtUBRskbjXUG4GRtzaaAwZXSHJC8WQkCG5N+THNwg==","signatures":[{"sig":"MEUCIGOQcEstO3g1b8l7JYVWPLSLOhinsarfOcTAErt2cD5MAiEAnTpnoSqSDykRnhRa2g1EirSkR1FHQ/jpn/ez74DW12k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71035},"main":"./index.js","type":"module","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"742689c531c87bc651b9524c4871a17aa50ae5a8","_npmUser":{"name":"smikhalevski","email":"smikhalevski@gmail.com"},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"10.9.2","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"23.11.1","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tag-soup_3.1.0_1760276249288_0.4101410586940697","host":"s3://npm-registry-packages-npm-production"}},"3.1.1-next.d63af67":{"name":"tag-soup","version":"3.1.1-next.d63af67","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@3.1.1-next.d63af67","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"83685351f24faf69fccaae5b11f918a71432840e","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.1.1-next.d63af67.tgz","fileCount":23,"integrity":"sha512-ucIVpTGeUhZxHhEiTBjPHg/7Sp01GpEu2XaH4kvvNaR8NOMKymOInMuMsTT5xIk2mOPpKCfNN1VsT1c62n1PTg==","signatures":[{"sig":"MEUCIQDzc4lpL3q1YveGA4lV07zKEZ3KWrnAUteoFQ8h3al+4wIgKbsr3en6Gsc1clvkd8CpoiyVgqbHH17KNffGULBN7Cs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/tag-soup@3.1.1-next.d63af67","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":80203},"main":"./index.js","type":"module","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"d63af6707c18c5427b2c4f633b5e9894749f9ced","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7ac7723d-004c-44a1-b64d-2efe1d49ae93"}},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"11.11.0","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/tag-soup_3.1.1-next.d63af67_1775592633920_0.8274832830191949","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"tag-soup","version":"3.1.1","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@3.1.1","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"b79236199e48fd8bc7315e04efc0cd9f6cde7e59","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.1.1.tgz","fileCount":23,"integrity":"sha512-1/gQVVPWxOXQVv4k4kwpJbw7Qpl2w+8d25YZ6BeN4dF+A7Mo5aNwKvOyVQClsCeodW38AEAiROOFdx5YaUg7+g==","signatures":[{"sig":"MEUCIB9Fp18fAOHHmwnEExOkAXOZl8ikS25eznbtZazZ4vhJAiEAniq9CbQT3Phq/Rn2RR88+sOE7VdShvxoZWz/cW40Pnk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/tag-soup@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":80190},"main":"./index.js","type":"module","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"4a0a16023005dc1fbc358f76ce8a226a84aba515","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7ac7723d-004c-44a1-b64d-2efe1d49ae93"}},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"11.11.0","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tag-soup_3.1.1_1775592799070_0.5443966066715973","host":"s3://npm-registry-packages-npm-production"}},"3.1.2-next.dcc2023":{"name":"tag-soup","version":"3.1.2-next.dcc2023","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","_id":"tag-soup@3.1.2-next.dcc2023","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"homepage":"https://github.com/smikhalevski/tag-soup#readme","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"dist":{"shasum":"fd4fc8e59263e9fa69564383b79afa9b964f22b4","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.1.2-next.dcc2023.tgz","fileCount":23,"integrity":"sha512-MSP+VJFP2o4ymtXVFEgCmyryOWEt76GMAP7NKEZzdWhpFFdhFdMJS8/VCP8dhlonujnJYVFrBrwgazC29AegGg==","signatures":[{"sig":"MEYCIQCQtRg+Ix4lUdzXKBMnjT89MfxQ4FIlcL/HqPLoxRdHiAIhAKsftLl2ZHPsjl0hJe+5u6lJwOyI+r+eAUXCNXQ51st+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/tag-soup@3.1.2-next.dcc2023","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":89575},"main":"./index.js","type":"module","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"dcc2023f7a9933090e66a976e5da4cd7732e35fc","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7ac7723d-004c-44a1-b64d-2efe1d49ae93"}},"repository":{"url":"git+https://github.com/smikhalevski/tag-soup.git","type":"git"},"_npmVersion":"11.11.0","description":"The fastest pure JS SAX/DOM XML/HTML parser.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/tag-soup_3.1.2-next.dcc2023_1776691395937_0.9039547082511532","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"tag-soup","version":"3.2.0","description":"The fastest pure JS SAX/DOM XML/HTML parser.","type":"module","main":"./index.js","types":"./index.d.ts","exports":{".":"./index.js","./package.json":"./package.json"},"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/smikhalevski/tag-soup.git"},"keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"homepage":"https://github.com/smikhalevski/tag-soup#readme","dependencies":{"flyweight-dom":"^2.2.1","speedy-entities":"^3.1.0"},"gitHead":"ea90bc1fc73c09c2cfc0980d41b10793ad858e13","_id":"tag-soup@3.2.0","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-LOty/3Pvwl0zV6q3NP3P2VE0Rs7EPyva7oIrSyJMzxcwZclVH3ro1VgqF06vPHa0UirLrN/AzdwZrrfKBpUS9g==","shasum":"a1a9a651dc51cfcc8742a67fd15505e8fef5a256","tarball":"https://registry.npmjs.org/tag-soup/-/tag-soup-3.2.0.tgz","fileCount":23,"unpackedSize":89562,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/tag-soup@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCc16yLWqZJOb0y1SRXnFdghivta3k3hhzHh8oyhKot2AIgQ5OtU1jaS4ms1Sk6/L1TjrKRNdX90tpiyPHsQHvFjn0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7ac7723d-004c-44a1-b64d-2efe1d49ae93"}},"directories":{},"maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tag-soup_3.2.0_1776692119871_0.19469187343749605"},"_hasShrinkwrap":false}},"time":{"created":"2020-09-11T21:33:24.732Z","modified":"2026-04-20T13:35:20.343Z","0.0.1":"2020-09-10T20:16:30.825Z","0.0.2":"2020-09-11T21:33:24.940Z","1.0.0-next.0":"2021-07-27T19:35:57.680Z","1.0.0-next.1":"2021-08-11T13:04:16.347Z","1.0.0-next.2":"2021-08-11T13:31:48.808Z","1.0.0-next.3":"2021-08-11T13:46:31.220Z","1.0.0":"2021-08-11T17:08:03.085Z","1.1.0":"2021-12-17T11:04:49.689Z","1.1.1-next.0":"2021-12-21T19:58:27.804Z","1.1.1":"2022-03-19T22:19:20.639Z","3.0.0":"2025-10-08T14:10:33.210Z","3.1.0":"2025-10-12T13:37:29.490Z","3.1.1-next.d63af67":"2026-04-07T20:10:34.071Z","3.1.1":"2026-04-07T20:13:19.254Z","3.1.2-next.dcc2023":"2026-04-20T13:23:16.082Z","3.2.0":"2026-04-20T13:35:19.994Z"},"bugs":{"url":"https://github.com/smikhalevski/tag-soup/issues"},"author":{"name":"Savva Mikhalevski","email":"smikhalevski@gmail.com"},"license":"MIT","homepage":"https://github.com/smikhalevski/tag-soup#readme","keywords":["tiny","forgiving","stream","fast","sax","dom","html","xml","parser"],"repository":{"type":"git","url":"git+https://github.com/smikhalevski/tag-soup.git"},"description":"The fastest pure JS SAX/DOM XML/HTML parser.","maintainers":[{"name":"smikhalevski","email":"smikhalevski@gmail.com"}],"readme":"<p align=\"center\">\n  <a href=\"#readme\"><img alt=\"TagSoup\" src=\"./assets/logo.png\" width=\"250\" /></a>\n</p>\n\nTagSoup is [the fastest](#performance) pure JS SAX/DOM XML/HTML parser and serializer.\n\n- Extremely low memory consumption.\n- Tolerant of malformed tag nesting, missing end tags, etc.\n- Recognizes CDATA sections, processing instructions, and DOCTYPE declarations.\n- Supports both strict XML and forgiving HTML parsing modes.\n- [20 kB gzipped](https://bundlephobia.com/result?p=tag-soup), including dependencies.\n- Check out TagSoup dependencies: [Speedy Entities](https://github.com/smikhalevski/speedy-entities#readme)\n  and [Flyweight DOM](https://github.com/smikhalevski/flyweight-dom#readme).\n\n```sh\nnpm install --save-prod tag-soup\n```\n\n- [API docs](https://smikhalevski.github.io/tag-soup/)\n- [DOM parsing](#dom-parsing)\n- [SAX parsing](#sax-parsing)\n- [Tokenization](#tokenization)\n- [Serialization](#serialization)\n- [Parser options](#parser-options)\n- [Performance](#performance)\n- [Limitations](#limitations)\n\n# DOM parsing\n\nTagSoup exports preconfigured [`HTMLDOMParser`](https://smikhalevski.github.io/tag-soup/variables/HTMLDOMParser.html)\nwhich parses HTML markup as a DOM node. This parser never throws errors during parsing and forgives malformed markup:\n\n```ts\nimport { HTMLDOMParser, toHTML } from 'tag-soup';\n\nconst fragment = HTMLDOMParser.parseFragment('<p>hello<p>cool</br>');\n// ⮕ DocumentFragment\n\ntoHTML(fragment);\n// ⮕ '<p>hello</p><p>cool<br></p>'\n```\n\n`HTMLDOMParser` decodes both HTML entities and numeric character references with\n[`decodeHTML`](https://smikhalevski.github.io/speedy-entities/variables/decodeHTML.html).\n\n[`XMLDOMParser`](https://smikhalevski.github.io/tag-soup/variables/XMLDOMParser.html)\nparses XML markup as a DOM node. It throws\n[`ParserError`](https://smikhalevski.github.io/tag-soup/classes/ParserError.html) if markup doesn't satisfy XML spec:\n\n```ts\nimport { XMLDOMParser, toXML } from 'tag-soup';\n\nXMLDOMParser.parseFragment('<p>hello</br>');\n// ❌ ParserError: Unexpected end tag.\n\nconst fragment = XMLDOMParser.parseFragment('<p>hello<br/></p>');\n// ⮕ DocumentFragment\n\ntoXML(fragment);\n// ⮕ '<p>hello<br/></p>'\n```\n\n`XMLDOMParser` decodes both XML entities and numeric character references with\n[`decodeXML`](https://smikhalevski.github.io/speedy-entities/variables/decodeXML.html).\n\nTagSoup uses [Flyweight DOM](https://github.com/smikhalevski/flyweight-dom#readme) nodes, which provide many standard\nDOM manipulation features:\n\n```ts\nconst document = HTMLDOMParser.parseDocument('<!DOCTYPE html><html>hello</html>');\n\ndocument.doctype.name;\n// ⮕ 'html'\n\ndocument.textContent;\n// ⮕ 'hello'\n```\n\nFor example, you can use `TreeWalker` to traverse DOM nodes:\n\n```ts\nimport { TreeWalker, NodeFilter } from 'flyweight-dom';\n\nconst fragment = XMLDOMParser.parseFragment('<p>hello<br/></p>');\n\nconst treeWalker = new TreeWalker(fragment, NodeFilter.SHOW_TEXT);\n\ntreeWalker.nextNode();\n// ⮕ Text { 'hello' }\n```\n\nCreate a custom DOM parser using\n[`createDOMParser`](https://smikhalevski.github.io/tag-soup/functions/createDOMParser.html):\n\n```ts\nimport { createDOMParser } from 'tag-soup';\n\nconst myParser = createDOMParser({\n  voidTags: ['br'],\n});\n\nmyParser.parseFragment('<p><br></p>');\n// ⮕ DocumentFragment\n```\n\n# SAX parsing\n\nTagSoup exports preconfigured [`HTMLSAXParser`](https://smikhalevski.github.io/tag-soup/variables/HTMLSAXParser.html)\nwhich parses HTML markup and calls handler methods when a token is read. This parser never throws errors during parsing\nand forgives malformed markup:\n\n```ts\nimport { HTMLSAXParser } from 'tag-soup';\n\nHTMLSAXParser.parseFragment('<p>hello<p>cool</br>', {\n  onStartTagOpening(tagName) {\n    // Called with 'p', 'p', and 'br'\n  },\n  onText(text) {\n    // Called with 'hello' and 'cool'\n  },\n});\n```\n\n[`XMLSAXParser`](https://smikhalevski.github.io/tag-soup/variables/XMLSAXParser.html) parses XML markup and calls\nhandler methods when a token is read. It throws\n[`ParserError`](https://smikhalevski.github.io/tag-soup/classes/ParserError.html) if markup doesn't satisfy XML spec:\n\n```ts\nimport { XMLSAXParser } from 'tag-soup';\n\nXMLSAXParser.parseFragment('<p>hello</br>', {});\n// ❌ ParserError: Unexpected end tag.\n\nXMLSAXParser.parseFragment('<p>hello<br/></p>', {\n  onEndTag(tagName) {\n    // Called with 'br' and 'p'\n  },\n});\n```\n\nCreate a custom SAX parser using\n[`createSAXParser`](https://smikhalevski.github.io/tag-soup/functions/createSAXParser.html):\n\n```ts\nimport { createSAXParser } from 'tag-soup';\n\nconst myParser = createSAXParser({\n  voidTags: ['br'],\n});\n\nmyParser.parseFragment('<p><br></p>', {\n  onStartTagOpening(tagName) {\n    // Called with 'p' and 'br'\n  },\n});\n```\n\n## SAX handler callbacks\n\nThe [`SAXHandler`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html) defines the following optional\ncallbacks. Implement only the ones you need.\n\n| Callback                                                                                                                | Description                                    |\n| :---------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------- |\n| [`onStartTagOpening`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onstarttagopening)             | A start tag name is read.                      |\n| [`onAttribute`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onattribute)                         | An attribute and its decoded value were read.  |\n| [`onStartTagClosing`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onstarttagclosing)             | A start tag is closed `>`.                     |\n| [`onStartTagSelfClosing`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onstarttagselfclosing)     | A start tag is self-closed `/>`.               |\n| [`onStartTag`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onstarttag)                           | A start tag and its atributes were read.       |\n| [`onEndTag`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onendtag)                               | An end tag matching an open start tag is read. |\n| [`onText`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#ontext)                                   | A decoded text content is read.                |\n| [`onComment`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#oncomment)                             | A comment is read.                             |\n| [`onDoctype`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#ondoctype)                             | A DOCTYPE declaration is read.                 |\n| [`onCDATASection`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#oncdatasection)                   | A CDATA section is read.                       |\n| [`onProcessingInstruction`](https://smikhalevski.github.io/tag-soup/interfaces/SAXHandler.html#onprocessinginstruction) | A processing instruction is read.              |\n\nExample using several callbacks at once:\n\n```ts\nimport { HTMLSAXParser } from 'tag-soup';\n\nHTMLSAXParser.parseFragment('<!-- greeting --><p class=\"x\">hello</p>', {\n  onComment(data) {\n    // Called with ' greeting '\n  },\n  onStartTagOpening(tagName) {\n    // Called with 'p'\n  },\n  onAttribute(name, value) {\n    // Called with 'class', 'x'\n  },\n  onStartTagClosing() {\n    // Called after all attributes of 'p' are read\n  },\n  onStartTag(tagName, attributes, isSelfClosing) {\n    // Called after onStartTagClosing\n  },\n  onText(text) {\n    // Called with 'hello'\n  },\n  onEndTag(tagName) {\n    // Called with 'p'\n  },\n});\n```\n\n# Tokenization\n\nTagSoup exports preconfigured\n[`HTMLTokenizer`](https://smikhalevski.github.io/tag-soup/variables/HTMLSAXParser.html) which parses HTML markup and\ninvokes a callback when a token is read. This tokenizer never throws errors during tokenization and forgives malformed\nmarkup:\n\n```ts\nimport { HTMLTokenizer } from 'tag-soup';\n\nHTMLTokenizer.tokenizeFragment('<p>hello<p>cool</br>', (token, startIndex, endIndex) => {\n  // Handle token\n});\n```\n\n[`XMLTokenizer`](https://smikhalevski.github.io/tag-soup/variables/XMLTokenizer.html) parses XML markup and invokes\na callback when a token is read. It throws\n[`ParserError`](https://smikhalevski.github.io/tag-soup/classes/ParserError.html) if markup doesn't satisfy XML spec:\n\n```ts\nimport { XMLTokenizer } from 'tag-soup';\n\nXMLTokenizer.tokenizeFragment('<p>hello</br>', (token, startIndex, endIndex) => {});\n// ❌ ParserError: Unexpected end tag.\n\nXMLTokenizer.tokenizeFragment('<p>hello<br/></p>', (token, startIndex, endIndex) => {\n  // Handle token\n});\n```\n\nCreate a custom tokenizer using\n[`createTokenizer`](https://smikhalevski.github.io/tag-soup/functions/createTokenizer.html):\n\n```ts\nimport { createTokenizer } from 'tag-soup';\n\nconst myTokenizer = createTokenizer({\n  voidTags: ['br'],\n});\n\nmyTokenizer.tokenizeFragment('<p><br></p>', (token, startIndex, endIndex) => {\n  // Handle token\n});\n```\n\nThe [`Token`](https://smikhalevski.github.io/tag-soup/types/Token.html) passed to the callback is one of the\nfollowing string literals. `startIndex` and `endIndex` are the character positions of the token's value in the input.\n\n| Token                             | Description                                                          |\n| :-------------------------------- | :------------------------------------------------------------------- |\n| `\"TEXT\"`                          | Text content between tags.                                           |\n| `\"START_TAG_NAME\"`                | The name portion of an opening tag, e.g. `p` in `<p>`.               |\n| `\"START_TAG_CLOSING\"`             | The `>` that closes an opening tag.                                  |\n| `\"START_TAG_SELF_CLOSING\"`        | The `/>` that self-closes a tag.                                     |\n| `\"END_TAG_NAME\"`                  | The name portion of a closing tag, e.g. `p` in `</p>`.               |\n| `\"ATTRIBUTE_NAME\"`                | An attribute name.                                                   |\n| `\"ATTRIBUTE_VALUE\"`               | A decoded attribute value.                                           |\n| `\"COMMENT\"`                       | Comment content, excluding `<!--` and `-->`.                         |\n| `\"PROCESSING_INSTRUCTION_TARGET\"` | The target of a processing instruction, e.g. `xml` in `<?xml ...?>`. |\n| `\"PROCESSING_INSTRUCTION_DATA\"`   | The data portion of a processing instruction.                        |\n| `\"CDATA_SECTION\"`                 | Content of a CDATA section, excluding `<![CDATA[` and `]]>`.         |\n| `\"DOCTYPE_NAME\"`                  | The name in a DOCTYPE declaration, e.g. `html` in `<!DOCTYPE html>`. |\n\n# Serialization\n\nTagSoup exports two preconfigured serializers:\n[`toHTML`](https://smikhalevski.github.io/tag-soup/variables/toHTML.html) and\n[`toXML`](https://smikhalevski.github.io/tag-soup/variables/toXML.html).\n\n```ts\nimport { HTMLDOMParser, toHTML } from 'tag-soup';\n\nconst fragment = HTMLDOMParser.parseFragment('<p>hello<p>cool</br>');\n// ⮕ DocumentFragment\n\ntoHTML(fragment);\n// ⮕ '<p>hello</p><p>cool<br></p>'\n```\n\nCreate a custom serializer using\n[`createSerializer`](https://smikhalevski.github.io/tag-soup/functions/createSerializer.html):\n\n```ts\nimport { HTMLDOMParser, createSerializer } from 'tag-soup';\n\nconst mySerializer = createSerializer({\n  voidTags: ['br'],\n});\n\nconst fragment = HTMLDOMParser.parseFragment('<p>hello</br>');\n// ⮕ DocumentFragment\n\nmySerializer(fragment);\n// ⮕ '<p>hello<br></p>'\n```\n\n[`SerializerOptions`](https://smikhalevski.github.io/tag-soup/interfaces/SerializerOptions.html) accepts the\nfollowing properties:\n\n| Option                                                                                                                                  | Description                                                       |\n| :-------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |\n| [`voidTags`](https://smikhalevski.github.io/tag-soup/interfaces/SerializerOptions.html#voidtags)                                        | Tags that have no content and no closing tag (e.g. `br`, `img`).  |\n| [`encodeText`](https://smikhalevski.github.io/tag-soup/interfaces/SerializerOptions.html#encodetext)                                    | Callback to encode text content and attribute values.             |\n| [`areSelfClosingTags​Supported`](https://smikhalevski.github.io/tag-soup/interfaces/SerializerOptions.html#areselfclosingtagssupported) | If `true`, void tags are serialized as `<br/>` instead of `<br>`. |\n| [`areTagNamesCaseInsensitive`](https://smikhalevski.github.io/tag-soup/interfaces/SerializerOptions.html#aretagnamescaseinsensitive)    | If `true`, tag name comparisons are case-insensitive.             |\n\nSerialize XML with entity encoding:\n\n```ts\nimport { XMLDOMParser, createSerializer } from 'tag-soup';\nimport { encodeXML } from 'speedy-entities';\n\nconst toXMLEncoded = createSerializer({\n  areSelfClosingTagsSupported: true,\n  encodeText: encodeXML,\n});\n\nconst fragment = XMLDOMParser.parseFragment('<note><text>AT&amp;T</text></note>');\n\ntoXMLEncoded(fragment);\n// ⮕ '<note><text>AT&amp;T</text></note>'\n```\n\n# Parser options\n\n`createDOMParser`, `createSAXParser`, and `createTokenizer` accept a\n[`ParserOptions`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html) object.\n\n| Option                                                                                                                                                     | Description                                                                                                                                                                    |\n| :--------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [`voidTags`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#voidtags)                                                               | Tags that have no content and no end tag (e.g. `br`, `img`). See [HTML5 Void Elements](https://www.w3.org/TR/2010/WD-html5-20101019/syntax.html#void-elements).                |\n| [`rawTextTags`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#rawtexttags)                                                         | Tags whose content is treated as raw text (e.g. `script`, `style`). See [HTML5 Raw Text Elements](https://www.w3.org/TR/2010/WD-html5-20101019/syntax.html#raw-text-elements). |\n| [`foreignTags`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#foreigntags)                                                         | Map from a tag to tokenizer options that are applied inside the tag.                                                                                                           |\n| [`decodeText`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#decodetext)                                                           | Callback to decode text content and attribute values (e.g. `decodeHTML` from `speedy-entities`).                                                                               |\n| [`implicitlyClosedTags`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#implicitlyclosedtags)                                       | Map from a tag to the list of open tags it implicitly closes. For example `{ h1: ['p'] }` means an opening `<h1>` closes any currently open `<p>`.                             |\n| [`implicitlyOpenedTags`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#implicitlyopenedtags)                                       | Tags for which a synthetic start tag is inserted when an unbalanced end tag is encountered (e.g. `['p', 'br']` so `</p>` becomes `<p></p>`).                                   |\n| [`areTagNames​CaseInsensitive`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#aretagnamescaseinsensitive)                          | If `true`, tag name comparisons ignore ASCII case.                                                                                                                             |\n| [`areCDATASections​Recognized`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#arecdatasectionsrecognized)                          | If `true`, CDATA sections (`<![CDATA[...]]>`) are recognized.                                                                                                                  |\n| [`areProcessing​Instructions​Recognized`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#areprocessinginstructionsrecognized)       | If `true`, processing instructions (`<?target data?>`) are recognized.                                                                                                         |\n| [`areSelfClosingTags​Recognized`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#areselfclosingtagsrecognized)                      | If `true`, self-closing tags (`<br/>`) are recognized; otherwise treated as start tags.                                                                                        |\n| [`isStrict`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#isstrict)                                                               | If `true`, tag names and attributes are validated against XML constraints.                                                                                                     |\n| [`areUnbalanced​EndTags​Ignored`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#areunbalancedendtagsignored)                       | If `true`, end tags without a matching start tag are silently dropped instead of throwing.                                                                                     |\n| [`areUnbalanced​StartTags​ImplicitlyClosed`](https://smikhalevski.github.io/tag-soup/interfaces/ParserOptions.html#areunbalancedstarttagsimplicitlyclosed) | If `true`, unclosed start tags are forcefully closed at the end of their parent.                                                                                               |\n\nA parser that mimics browser HTML behavior:\n\n```ts\nimport { createDOMParser } from 'tag-soup';\nimport { decodeHTML } from 'speedy-entities';\n\nconst myParser = createDOMParser({\n  voidTags: [\n    'area',\n    'base',\n    'br',\n    'col',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr',\n  ],\n  rawTextTags: ['script', 'style'],\n  decodeText,\n  areTagNamesCaseInsensitive: true,\n  areUnbalancedEndTagsIgnored: true,\n  areUnbalancedStartTagsImplicitlyClosed: true,\n  implicitlyClosedTags: {\n    h1: ['p'],\n    h2: ['p'],\n    li: ['li'],\n    dt: ['dd', 'dt'],\n    dd: ['dd', 'dt'],\n  },\n  foreignTags: {\n    svg: {\n      areCDATASectionsRecognized: true,\n      areProcessingInstructionsRecognized: true,\n      areSelfClosingTagsRecognized: true,\n    },\n    math: {\n      areCDATASectionsRecognized: true,\n      areProcessingInstructionsRecognized: true,\n      areSelfClosingTagsRecognized: true,\n    },\n  },\n});\n```\n\n# Performance\n\nExecution performance is measured in operations per second (± 5%), the higher number is better.\nMemory consumption (RAM) is measured in bytes, the lower number is better.\n\n<table>\n<tr>\n<th align=\"right\" valign=\"top\" rowspan=\"2\">Library</th>\n<th align=\"right\" valign=\"top\" rowspan=\"2\">Library size</th>\n<th align=\"center\" colspan=\"2\">DOM parsing</th>\n<th align=\"center\" colspan=\"2\">SAX parsing</th>\n</tr>\n\n<tr>\n<td align=\"right\">Ops/sec</td>\n<td align=\"right\">RAM</td>\n<td align=\"right\">Ops/sec</td>\n<td align=\"right\">RAM</td>\n</tr>\n\n<tr>\n<td align=\"right\">tag-soup&#x200B;@3.2.1</td>\n<td align=\"right\">\n<a href=\"https://bundlephobia.com/package/tag-soup@3.0.0\">21 kB</a>\n</td>\n<td align=\"right\"><strong>35 Hz</strong></td>\n<td align=\"right\"><strong>22 MB</strong></td>\n<td align=\"right\"><strong>54 Hz</strong></td>\n<td align=\"right\"><strong>22 kB</strong></td>\n</tr>\n\n<tr>\n<td align=\"right\">\n<a href=\"https://github.com/fb55/htmlparser2\">htmlparser2</a>&#x200B;@12.0.0\n</td>\n<td align=\"right\">\n<a href=\"https://bundlephobia.com/package/htmlparser2@12.0.0\">34 kB</a>\n</td>\n<td align=\"right\">15 Hz</td>\n<td align=\"right\">35 MB</td>\n<td align=\"right\">24 Hz</td>\n<td align=\"right\">6 MB</td>\n</tr>\n\n<tr>\n<td align=\"right\">\n<a href=\"https://github.com/inikulin/parse5\">parse5</a>&#x200B;@8.0.0\n</td>\n<td align=\"right\">\n<a href=\"https://bundlephobia.com/package/parse5@8.0.0\">45 kB</a>\n</td>\n<td align=\"right\">7 Hz</td>\n<td align=\"right\">105 MB</td>\n<td align=\"right\">11 Hz</td>\n<td align=\"right\">10 MB</td>\n</tr>\n\n</table>\n\nPerformance was measured when parsing [the 3.64 MB HTML file](./src/test/test.html).\n\nTests were conducted using [TooFast](https://github.com/smikhalevski/toofast#readme) on Apple M1 with Node.js v25.6.0.\n\nTo reproduce [the performance test suite](./src/test/perf/overall.perf.js) results, clone this repo and run:\n\n```shell\nnpm ci\nnpm run build\nnpm run perf\n```\n\n# Limitations\n\nTagSoup doesn't resolve some quirky element structures that malformed HTML may cause.\n\nAssume the following markup:\n\n<!-- prettier-ignore -->\n```html\n<p><strong>okay\n<p>nope\n```\n\nWith [`DOMParser`](https://developer.mozilla.org/en-US/docs/Web/API/DOMParser) this markup would be transformed to:\n\n```html\n<p><strong>okay</strong></p>\n<p><strong>nope</strong></p>\n```\n\nTagSoup doesn't insert the second `strong` tag:\n\n```html\n<p><strong>okay</strong></p>\n<p>nope</p>\n```\n","readmeFilename":"README.md"}