{"_id":"@adguard/safari-extension","_rev":"16-a6168208d155fc4c4f2fc3a70383eddc","name":"@adguard/safari-extension","dist-tags":{"latest":"4.3.0"},"versions":{"3.0.0-alpha.1":{"name":"@adguard/safari-extension","version":"3.0.0-alpha.1","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@3.0.0-alpha.1","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"7b6ae4308e9fa2a2a1e8bf94ab12cd99a0c301ac","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-3.0.0-alpha.1.tgz","fileCount":7,"integrity":"sha512-55D9yFNWDOMLP7LFgIMBZZrhGDPBL/fyb4LH6iQJbsR60yDWT/YkhhjYBMCpJ1NxlSviESQ4r2xeIHk+Vz5ddQ==","signatures":[{"sig":"MEUCIQDq2JPu8PTQLQDn1eqGL7UXFohArhPcNUpbIhXFm3tg2wIgCnOvDdCMx0c6M6fAls8/aRUfdeXteVEvp5ug2AYEomE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3576421},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/Users/ameshkov/Documents/Work/bit.adguard.com/safari-converter/Extension/adguard-safari-extension.tgz","_integrity":"sha512-55D9yFNWDOMLP7LFgIMBZZrhGDPBL/fyb4LH6iQJbsR60yDWT/YkhhjYBMCpJ1NxlSviESQ4r2xeIHk+Vz5ddQ==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.8.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"20.17.0","dependencies":{"@adguard/scriptlets":"^2.1.4","@adguard/extended-css":"^2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","@rollup/plugin-node-resolve":"^15.2.1","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_3.0.0-alpha.1_1744810107854_0.9621988911560633","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@adguard/safari-extension","version":"3.0.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@3.0.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"84ef7c24e715d9a4f3cf5007a876808d46ea4d8c","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-3.0.0.tgz","fileCount":4,"integrity":"sha512-Gl2Qw/WIRt9EK2BK9E4Fh2ibWSzM9GvxvlGmiADdkCMZ/HRH74oPnRALIA0Ravi+rZp3cdpnX8ItzoqlgCdUhA==","signatures":[{"sig":"MEYCIQDbQawBvSY6OwF6+Po69CBWhydEbEw2qq15LRRk/2wk2QIhAN5GZaaDh++CtMu5hTGMpg5eWZflnt/p6jWV0AqZZtS1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":879529},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"maximtop","email":"maximtop@gmail.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/204505107/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-Gl2Qw/WIRt9EK2BK9E4Fh2ibWSzM9GvxvlGmiADdkCMZ/HRH74oPnRALIA0Ravi+rZp3cdpnX8ItzoqlgCdUhA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"^2.1.4","@adguard/extended-css":"^2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","@rollup/plugin-node-resolve":"^15.2.1","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_3.0.0_1744908315940_0.35233665825380367","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@adguard/safari-extension","version":"3.0.1","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@3.0.1","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"3be2c184ebf8425838a0e9c51450e046847a0196","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-3.0.1.tgz","fileCount":4,"integrity":"sha512-OFT9NnvdXpF8z1erd4AmNQTebHQVu23PvycFwOlKNTHPiGZMgNvXkvjto4kJwhAMbxq07F6NSBPHMBuLM8PFFg==","signatures":[{"sig":"MEQCIFWN8nEYxiIIFWS6g0lg4EvbQfi+cQqJj2CAbYUX1Gs9AiB+Np4gw0ubwgZjL0OrzAxyZ/u+UPuC6RtcH/uVteJkmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":879529},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","actor":{"name":"ameshkov","type":"user","email":"am@adguard.com"},"email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/1933313/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-OFT9NnvdXpF8z1erd4AmNQTebHQVu23PvycFwOlKNTHPiGZMgNvXkvjto4kJwhAMbxq07F6NSBPHMBuLM8PFFg==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"^2.1.4","@adguard/extended-css":"^2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","@rollup/plugin-node-resolve":"^15.2.1","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_3.0.1_1752143816664_0.8061302299227342","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@adguard/safari-extension","version":"3.1.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@3.1.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"3242b9f9650ce443f6932d71e00ae77b9045ddfe","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-3.1.0.tgz","fileCount":4,"integrity":"sha512-rbbYOE0wLPO0mov60gJwUXKdXArlsEIqCU4pFDmi3DFM9yQcIvUfzlkGkuKu2K5N+bAIYHyHhidpmCauGHeqMA==","signatures":[{"sig":"MEUCIQDFpP4E0SZ7m7/88MoeGOdY22Ob1pe0cO/Zj+XjYl1GwwIgNmsybI/QWCx5pzBhfUif5woHWPLYLgdaEcDSc28Gvlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":772230},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/163841/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-rbbYOE0wLPO0mov60gJwUXKdXArlsEIqCU4pFDmi3DFM9yQcIvUfzlkGkuKu2K5N+bAIYHyHhidpmCauGHeqMA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"^2.2.8","@adguard/extended-css":"^2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","@rollup/plugin-node-resolve":"^15.2.1","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_3.1.0_1752254360550_0.23538324081559936","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@adguard/safari-extension","version":"4.0.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.0.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"be2a1b564a315324d510c95cd4d8c78eb5f4f954","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.0.0.tgz","fileCount":5,"integrity":"sha512-mBR6UZp4jKxYrF/hg+i7WTb7fnKxi8hLVHD7ypltihwJCQYwZuMyMZFUjg4ngkVURKPB2GYAFPNsc3oE+I36aA==","signatures":[{"sig":"MEUCIQCibAMwFNG5zZXC/Td/OTQ/kWr4FB98MwtJM0fFBOvslQIgVH+OLDWKiXwFSnEeOKqSNVOlPKyRGm+jn/HC+UiLSbU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113808},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/1933313/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-mBR6UZp4jKxYrF/hg+i7WTb7fnKxi8hLVHD7ypltihwJCQYwZuMyMZFUjg4ngkVURKPB2GYAFPNsc3oE+I36aA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.8","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.0.0_1754053205443_0.375682767023797","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@adguard/safari-extension","version":"4.0.1","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.0.1","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"bbdff60aa59a8b228a5782748c377e027a01e07e","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.0.1.tgz","fileCount":5,"integrity":"sha512-KpMuQIIf9oH1wLe2ZIWOsDv638KeTwWFDXAcbwFU+1MuCzgxhqeLtmx0EwWZVvMHffiRiD+YnU6mHUmgcpHapA==","signatures":[{"sig":"MEYCIQCXeWC5P+gj04VUe3U477guUaVs3dYDZZIYDLavgRFyygIhAJs46IYjWrxrged8a2H5XHGLROOy+6KD4Y5kNaIYWQhv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/1933315/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-KpMuQIIf9oH1wLe2ZIWOsDv638KeTwWFDXAcbwFU+1MuCzgxhqeLtmx0EwWZVvMHffiRiD+YnU6mHUmgcpHapA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.8","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.0.1_1754064759538_0.0286680920598279","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@adguard/safari-extension","version":"4.0.2","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.0.2","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"235afc05b97a80144fd2deb39d41e3ed1e9cc5d7","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.0.2.tgz","fileCount":5,"integrity":"sha512-TiK/quEhnC0+bll2x/FJ5+PwJB925h7n80HNdAS4eH4bW2ik/VRxIIv54yi2WcDs1T3AKrW+Du9hup/2AayJrg==","signatures":[{"sig":"MEUCIC3sYzgyJsQz/vYd4irhs9xhSoOr9NeYya3EXv8LZklwAiEAvyE8AeFAAOu1OR4sjV2zRZeD96Nmk38CqEPOanwQme4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/137953282/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-TiK/quEhnC0+bll2x/FJ5+PwJB925h7n80HNdAS4eH4bW2ik/VRxIIv54yi2WcDs1T3AKrW+Du9hup/2AayJrg==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.8","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.0.2_1754663556137_0.4799443575557252","host":"s3://npm-registry-packages-npm-production"}},"4.0.3":{"name":"@adguard/safari-extension","version":"4.0.3","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.0.3","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"2782e537955b7e569b4641c709ed0d6eff2e4157","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.0.3.tgz","fileCount":5,"integrity":"sha512-mAlB0vyqzkZRgpkbVwmkgUnINv10XhPHXTWS9ZF4iv5ePK03O0DePutFMuiyi67i7ceswJV+BPqSTfLjR3Y/JA==","signatures":[{"sig":"MEUCIDINaxUJvaja2jRsvpEiR2YH72uSINqg7iIiVBQUCp8eAiEAmA8ofmE5Qt+sCT17e25R0WXLIGciKli96dUSVRL2Wp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/1933313/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-mAlB0vyqzkZRgpkbVwmkgUnINv10XhPHXTWS9ZF4iv5ePK03O0DePutFMuiyi67i7ceswJV+BPqSTfLjR3Y/JA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.8","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.0.3_1754744541792_0.7478612677020351","host":"s3://npm-registry-packages-npm-production"}},"4.0.4":{"name":"@adguard/safari-extension","version":"4.0.4","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.0.4","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"d40dc65302cb00ace3b7b5dc9912d325590e8630","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.0.4.tgz","fileCount":5,"integrity":"sha512-wi3/A/HN7o+M//CRZKA0T6L8asu7ZkIkdaC/HZKtkvUl5CnU8oPLNtMkGucClqrwI06JQVe5nLfi77tMHxi06A==","signatures":[{"sig":"MEYCIQC0O8/+18D9/mqnlZhsP2+iwRJZMUVPE6AlrCN3KOM3+AIhAPqLqH8OdMY6nIf0IPNTtIyQZOugzd0df4eqP8CSCPZK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/163512322/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-wi3/A/HN7o+M//CRZKA0T6L8asu7ZkIkdaC/HZKtkvUl5CnU8oPLNtMkGucClqrwI06JQVe5nLfi77tMHxi06A==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.9","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.0.4_1755238150280_0.6924530273579603","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@adguard/safari-extension","version":"4.1.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.1.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"f0805f22e4c0add417310f0949da5fc9959cc239","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.1.0.tgz","fileCount":5,"integrity":"sha512-YIcZFjEGMA2moes0vMoDPnHe3iad3ifHcUML93fur0zMR5YvORe35vmmf9bNDxlpNP/1Hzkwfy6RakkoE/Rbsg==","signatures":[{"sig":"MEUCICEXjyyJsYSZ/xoDbUHDJ4vTy2pVOKE8ljhJN4X+v0noAiEA6OnLQuIfTqL0sf5u0EDD/b/oZeT32yTo6osG7SnZ1ZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/opt/atlassian/application-data/bamboo/shared/build-dir/137953281/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-YIcZFjEGMA2moes0vMoDPnHe3iad3ifHcUML93fur0zMR5YvORe35vmmf9bNDxlpNP/1Hzkwfy6RakkoE/Rbsg==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.9","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.1.0_1766490290107_0.6824754531170845","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@adguard/safari-extension","version":"4.1.1","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.1.1","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"92ecf50e65e93befbe7e65690dcf49414b561858","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.1.1.tgz","fileCount":5,"integrity":"sha512-iye2bA23hndboBhVEZsbMnDDb7VkQTT59LlQ2EnWFN4KenpnzmZEjW/wAa3jZnudTWbO/2adH5Q6tuVEvSekRw==","signatures":[{"sig":"MEQCICUzKh1M6chWEr6X8gQQ65CNw5+ryUO3KYRSo9qSOiT4AiBkXfpP3o2A5nQY7s3JRmngNbS1LDVJyj9mrOYwyNV+gA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/var/atlassian/application-data/bamboo/shared/build-dir/174817281/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-iye2bA23hndboBhVEZsbMnDDb7VkQTT59LlQ2EnWFN4KenpnzmZEjW/wAa3jZnudTWbO/2adH5Q6tuVEvSekRw==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.9","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.1.1_1770040121757_0.7596777324890964","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@adguard/safari-extension","version":"4.2.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.2.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"99d8d16c4b4611ac90da1c6c96c5de04f3017ae6","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.2.0.tgz","fileCount":5,"integrity":"sha512-bCTv2x0I7VhLjon7yFKcXCzkqy7q3wwOi15Bwu6lCM3CpJxRsVT16n0zIN2GjUBlEd/0eOr6NGn7cdIy5qUIDA==","signatures":[{"sig":"MEUCIBj0NhMiqfovM9o1wWUODXdsuU+Bj+MsOPJAp2WqqwEnAiEAjq5BEhCr1dZNYQUuypry+gOIUozg2UJQHJUbyh0M8O8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/var/atlassian/application-data/bamboo/shared/build-dir/137953282/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-bCTv2x0I7VhLjon7yFKcXCzkqy7q3wwOi15Bwu6lCM3CpJxRsVT16n0zIN2GjUBlEd/0eOr6NGn7cdIy5qUIDA==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.9","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.2.0_1771498555719_0.8378788825808914","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@adguard/safari-extension","version":"4.2.1","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.2.1","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"dfd30b0289c2627ad45de8787de4c673b078bf53","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.2.1.tgz","fileCount":5,"integrity":"sha512-cxyZS2gYC6usVmwSLg4vPK4WMrRTR9y18P0hRp1ditL6UbiNHGoTBUcEx37ZR2iJ7kQOyo1JtHzUaHOAtI17Ew==","signatures":[{"sig":"MEUCICwp2yMAYMU/UUI/ZFY9qNgkH5JAPYqnbWNXLhtb8m3IAiEAwnhPAUvcmlzEIPzZui2po/Oo4ZSz/XfI+s+OGq1r2FE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111654},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/var/atlassian/application-data/bamboo/shared/build-dir/1933313/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-cxyZS2gYC6usVmwSLg4vPK4WMrRTR9y18P0hRp1ditL6UbiNHGoTBUcEx37ZR2iJ7kQOyo1JtHzUaHOAtI17Ew==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.2.16","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.2.1_1771502056062_0.1843690823189259","host":"s3://npm-registry-packages-npm-production"}},"4.2.2":{"name":"@adguard/safari-extension","version":"4.2.2","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.2.2","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"5c55620e4b2909e88b04fe8a709aaaead63610eb","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.2.2.tgz","fileCount":5,"integrity":"sha512-mqgZ29/LHT7Ovv/Pu9+xA2tPZ2pH+hE5O6fLaM4ZYyMDDx9vTaO/U7AltYYs25pOIChKAacmNkhmFd0JR2oRqg==","signatures":[{"sig":"MEQCIFsbN/wdr/19XzWH+I1bWf23Sev9YZBoEz0iK2g5Io5BAiBA6OWnmtmiFOKt/3Qyu9t+9hHf97djoGq0cHGqX2qbxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/var/atlassian/application-data/bamboo/shared/build-dir/1933313/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-mqgZ29/LHT7Ovv/Pu9+xA2tPZ2pH+hE5O6fLaM4ZYyMDDx9vTaO/U7AltYYs25pOIChKAacmNkhmFd0JR2oRqg==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.3.1","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.2.2_1774468079787_0.06868383583718041","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@adguard/safari-extension","version":"4.3.0","author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","_id":"@adguard/safari-extension@4.3.0","maintainers":[{"name":"ameshkov","email":"am@adguard.com"},{"name":"maximtop","email":"maximtop@gmail.com"},{"name":"blakhard","email":"vlad.abdulmianov@gmail.com"}],"homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"dist":{"shasum":"bf9ce22fe6f0042be8b8a28ed0c7dc5bcefd057f","tarball":"https://registry.npmjs.org/@adguard/safari-extension/-/safari-extension-4.3.0.tgz","fileCount":5,"integrity":"sha512-Zhif8fpD+qnT/YpAs1C8esXpMSkpx7Cs4mnSF1aO/v62sj343y2wWkEZZ+Iy972pHjkMwG9of7ARKJwBQwJvPg==","signatures":[{"sig":"MEUCID9/HujZ9WhTlPo0cevV7Clt7UN6n6lKv3DUAAcIiOipAiEAo4YAqLytq+oKvFnzWUWMynNIDLYkU/lpzPyIyzS8tt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111653},"main":"dist/safari-extension.cjs","type":"module","_from":"file:adguard-safari-extension.tgz","types":"dist/safari-extension.d.ts","module":"dist/safari-extension.esm.js","browser":"dist/safari-extension.umd.min.js","exports":{".":{"types":"./dist/safari-extension.d.ts","import":"./dist/safari-extension.esm.js","require":"./dist/safari-extension.cjs"},"./es":"./dist/safari-extension.esm.js","./umd":"./dist/safari-extension.umd.min.js","./iife":"./dist/safari-extension.iife.min.js"},"scripts":{"lint":"eslint . --cache --ext .ts","test":"vitest","build":"pnpm clean && pnpm build-types && pnpm rollup --config rollup.config.ts --configPlugin @rollup/plugin-json --configPlugin @rollup/plugin-typescript && pnpm clean-types","clean":"rimraf dist","package":"pnpm build && pnpm pack --out adguard-safari-extension.tgz","build-types":"tsc --declaration --emitDeclarationOnly --outdir dist/types","check-types":"tsc --noEmit","clean-types":"rimraf dist/types"},"_npmUser":{"name":"ameshkov","email":"am@adguard.com"},"_resolved":"/var/atlassian/application-data/bamboo/shared/build-dir/204505108/256475140-256606212/adguard-safari-extension.tgz","_integrity":"sha512-Zhif8fpD+qnT/YpAs1C8esXpMSkpx7Cs4mnSF1aO/v62sj343y2wWkEZZ+Iy972pHjkMwG9of7ARKJwBQwJvPg==","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"_npmVersion":"10.9.2","description":"Safari Web Extension API for SafariConverterLib","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@adguard/scriptlets":"2.3.1","@adguard/extended-css":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^3.29.4","vitest":"^3.0.4","typescript":"^5.1.6","@babel/core":"^7.22.8","markdownlint":"^0.31.1","markdown-table":"^3.0.3","markdownlint-cli":"^0.37.0","@babel/preset-env":"^7.22.7","rollup-plugin-dts":"^6.0.2","@rollup/plugin-json":"^6.0.0","eslint-plugin-jsdoc":"^46.8.2","@rollup/plugin-babel":"^6.0.3","eslint-plugin-import":"^2.28.0","@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-typescript":"^11.1.4","@typescript-eslint/parser":"^7.0.0","eslint-config-airbnb-base":"^15.0.0","@rollup/plugin-node-resolve":"^15.2.1","@types/webextension-polyfill":"^0.12.3","eslint-plugin-import-newlines":"^1.3.4","eslint-config-airbnb-typescript":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safari-extension_4.3.0_1780572987455_0.3798094493550932","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-04-16T13:28:27.801Z","modified":"2026-08-19T10:43:35.946Z","3.0.0-alpha.1":"2025-04-16T13:28:28.046Z","3.0.0":"2025-04-17T16:45:16.167Z","3.0.1":"2025-07-10T10:36:56.868Z","3.1.0":"2025-07-11T17:19:20.738Z","4.0.0":"2025-08-01T13:00:05.685Z","4.0.1":"2025-08-01T16:12:39.758Z","4.0.2":"2025-08-08T14:32:36.387Z","4.0.3":"2025-08-09T13:02:21.990Z","4.0.4":"2025-08-15T06:09:10.496Z","4.1.0":"2025-12-23T11:44:50.260Z","4.1.1":"2026-02-02T13:48:41.951Z","4.2.0":"2026-02-19T10:55:55.866Z","4.2.1":"2026-02-19T11:54:16.202Z","4.2.2":"2026-03-25T19:47:59.947Z","4.3.0":"2026-06-04T11:36:27.613Z"},"bugs":{"url":"https://github.com/AdguardTeam/SafariConverterLib/issues"},"author":{"name":"Adguard Software Ltd."},"license":"GPL-3.0","homepage":"https://github.com/AdguardTeam/SafariConverterLib/tree/master/Extension","repository":{"url":"git+https://github.com/AdguardTeam/SafariConverterLib.git","type":"git","directory":"Extension"},"description":"Safari Web Extension API for SafariConverterLib","maintainers":[{"email":"am@adguard.com","name":"ameshkov"},{"email":"maximtop@gmail.com","name":"maximtop"},{"email":"vlad.abdulmianov@gmail.com","name":"blakhard"},{"email":"d.naumov@adguard.com","name":"d13410n3"}],"readme":"# Safari Extension API\n\n- [Build Instructions](#build-instructions)\n- [How does it work](#how-does-it-work)\n- [How to use the library](#how-to-use-the-library)\n    - [Host app](#host-app)\n    - [Safari Web Extension](#safari-web-extension)\n        - [Web Extension's Content Script](#web-extensions-content-script)\n        - [Web Extension's Background Script](#web-extensions-background-script)\n        - [Web Extension's Native Host](#web-extensions-native-host)\n    - [Safari App Extension](#safari-app-extension)\n        - [App Extension's Content Script](#app-extensions-content-script)\n        - [App Extension's Native Host](#app-extensions-native-host)\n\nThe library itself is part of the [SafariConverterLib] project that is\nresponsible for interpreting AdGuard rules and applying them to web pages.\n\nThe output of the [SafariConverterLib] is a set of rules that can be used in\nthe browser extension in two different ways:\n\n1. As a set of rules for Safari content blocker. In this case, Safari\n   takes care of applying the rules to the web page.\n2. As a set of \"advanced\" rules that can be used either in a\n   [Safari Web Extension][SafariWebExtension] or a [Safari App Extension][SafariAppExtension].\n   In either case, the rules are interpreted by the JavaScript that runs in the\n   browser extension. This library provides the API for the JavaScript to\n   interpret the rules and apply them to the web page.\n\nThis library provides the API to interpret \"advanced rules\" and is supposed to\nbe used from a browser extension's content script.\n\n[SafariConverterLib]: https://github.com/AdguardTeam/SafariConverterLib\n[SafariWebExtension]: https://developer.apple.com/documentation/safariservices/safari-web-extensions\n[SafariAppExtension]: https://developer.apple.com/documentation/safariservices/safari-app-extensions\n\n## Build Instructions\n\n- `pnpm install` - install dependencies.\n- `pnpm build` - build the `dist` directory.\n- `pnpm lint` - run linter.\n- `pnpm test` - run tests.\n\n## How does it work\n\nThe library provides a set of classes that can be used to interpret the rules\nand apply them to the web page.\n\nThe main class is [Configuration]. It is used to configure the library and to\nget the rules that should be applied to the web page.\n\nIt is mapped to an instance of [WebExtension.Configuration] which should be\npassed from the extension's native host to the content script.\n\nThis object is then interpreted either by [ContentScript] or [BackgroundScript]\ndepending on the extension type (it will be explained below).\n\nThis class has the following fields:\n\n- `css` - a set of CSS rules (selector + style) that will be used to apply\n  additional styles to the elements on a page.\n- `extendedCss` - a set of CSS rules that will be used to apply additional\n  styles to the elements on a page via Extended CSS library.\n- `js` - a set of JS scripts that will be executed on the page.\n- `scriptlets` - a set of scriptlet parameters that will be used to run\n  \"scriptlets\" on the page. Scriptlet implementations are provided by the\n  [Scriptlets] library.\n- `engineTimestamp` - the timestamp of the engine that was used to generate\n  the configuration. This can be used to determine if the configuration is\n  outdated and needs to be updated.\n\n[Scriptlets]: https://github.com/AdguardTeam/Scriptlets\n[Configuration]: src/configuration.ts\n[ContentScript]: src/content-script.ts\n[BackgroundScript]: src/background-script.ts\n[WebExtension.Configuration]: ../Sources/FilterEngine/WebExtension.swift\n\n## How to use the library\n\nThe way the library is used depends on whether it is used in a [Safari App Extension][SafariAppExtension]\nor a [Safari Web Extension][SafariWebExtension].\n\nIn the explanation below, we will be using the following terms you need to\nfamiliarize yourself with:\n\n- \"Host app\" - the app that hosts the extension. This is the app that the user\n  will actually run.\n- \"Extension native host\" - the app that hosts the Web Extension's or the\n  App Extension's native code. It can share files with the \"Host app\" using app\n  groups.\n- \"Background page\" - the browser extension's background page (written in JS).\n  Runs in the extension’s own context, separate from the web pages, there's\n  only one instance of it. **Only exists in a Web Extension**.\n- \"Content script\" - the browser extension's content script (written in JS).\n  Runs in the context of the web page.\n\nSee the full example here or read below:\n\n- [Web Extension's native host][webextnativehost]\n- [Web Extension's javascript][webextjavascript]\n- [App Extension's native host][appextnativehost]\n- [App Extension's content script][appextcontentscript]\n\n[webextnativehost]: https://github.com/ameshkov/safari-blocker/tree/master/web-extension\n[webextjavascript]: https://github.com/ameshkov/safari-blocker/tree/master/extensions/webext\n[appextnativehost]: https://github.com/ameshkov/safari-blocker/tree/master/app-extension\n[appextcontentscript]: https://github.com/ameshkov/safari-blocker/tree/master/extensions/appext\n\n### Host app\n\nThe main prerequisite is that you first need to figure out which AdGuard rules\nare counted as \"advanced\" and which can be used natively by Safari. You can read\nhow to do that in the [project README.md](../README.md).\n\nOnce you have the advanced rules, use them **in your Host app** to build the\nfiltering engine that the extension will use for doing lookups. This is done by\nusing this code:\n\n```swift\nlet webExtension = try WebExtension.shared(groupID: \"your.group.id\")\n\n// Build the engine and serialize it to the shared location.\n_ = try webExtension.buildFilterEngine(rules: advancedRulesText)\n```\n\n### Javascript code\n\nStart with adding the library as a dependency to your extension code:\n\n```sh\nnpm add -i @adguard/safari-extension\n```\n\nLogger can be redefined by the library user or you can use `ConsoleLogger` class\nthat is provided by the library. Use `setLogger` to set the logger that will\nbe used:\n\n```ts\nimport { setLogger, ConsoleLogger, LoggingLevel } from '@adguard/safari-extension';\n\nsetLogger(new ConsoleLogger('[Safari Extension]', LoggingLevel.Info));\n```\n\n### Safari Web Extension\n\nIn the case of [Safari Web Extension][SafariWebExtension], there's a background\npage and we can use the `browser.scripting` API to inject JS and CSS to avoid the\nrisk of being blocked by the website's CSP.\n\nHowever, due to [a bug in Safari Web Extension][bugexecutescript], we have to use\nthe fallback approach for `about:blank` and `about:srcdoc` frames. Hopefully,\nthis will be resolved in the future.\n\n[bugexecutescript]: https://bugs.webkit.org/show_bug.cgi?id=296702\n\n#### Web Extension's Content Script\n\nMake sure that the content script is configured to run on all pages including\niframes. Below is an example of how the content script should be registered in\n`manifest.json`:\n\n```json\n    \"content_scripts\": [\n        {\n            \"js\": [\n                \"content.js\"\n            ],\n            \"matches\": [\n                \"<all_urls>\"\n            ],\n            \"run_at\": \"document_start\",\n            \"all_frames\": true,\n            \"match_about_blank\": true,\n            \"match_origin_as_fallback\": true\n        }\n    ]\n```\n\nThe very first step would be to expose `ContentScript` to other content scripts;\nthis way it can be called from scripts injected by `scripting.executeScript()`.\n\n```ts\n// First of all, make sure that the content script is exposed to the\n// scripts that will be called by background script.\nwindow.adguard = {\n    contentScript: new ContentScript(),\n};\n```\n\nThe second thing is to delay native load events:\n\n```js\n// Initialize the delayed event dispatcher. This may intercept DOMContentLoaded\n// and load events. The delay of 1000ms is used as a buffer to capture critical\n// initial events while waiting for the rules response.\nconst cancelDelayedDispatchAndDispatch = setupDelayedEventDispatcher(1000);\n```\n\nFinally, request configuration from the background page:\n\n```js\nconst main = async () => {\n    const message = {\n        type: 'lookup',\n    };\n\n    // Send the message to the background script and await the response.\n    const response = await browser.runtime.sendMessage(message);\n\n    // If the background page returned payload with configuration, it means\n    // that it cannot apply it on its own and commands the content script\n    // to do that.\n    if (response?.payload) {\n        window.adguard.contentScript.applyConfiguration(response?.payload);\n    }\n\n    // After processing, cancel any pending delayed event dispatch and process\n    // any queued events immediately.\n    cancelDelayedDispatchAndDispatch();\n};\n\n// Execute the main function and catch any runtime errors.\nmain().catch((error) => {\n    console.error('Error in content script: ', error);\n});\n```\n\n#### Web Extension's Background Script\n\nOn the background page, you should listen for incoming messages and relay them\nto the native host. In addition to that, we strongly recommend having a local\ncache on the background page to speed up lookups.\n\n```js\nimport browser from 'webextension-polyfill';\nimport { type Configuration, BackgroundScript } from '@adguard/safari-extension';\n\n/**\n * BackgroundScript is used to apply filtering configuration to web pages.\n * Note that it relies on the content script to be injected into the page\n * and available in the ISOLATED world via the `adguard.contentScript` object.\n */\nconst backgroundScript = new BackgroundScript();\n\nbrowser.runtime.onMessage.addListener(async (message, sender) => {\n    if (message.type === 'lookup') {\n        // Extract the URL from the sender data.\n        const tabId = sender.tab?.id ?? 0;\n        const frameId = sender.frameId ?? 0;\n        let blankFrame = false;\n\n        let url = sender.url || '';\n        const topUrl = frameId === 0 ? undefined : sender.tab?.url;\n\n        if (!url.startsWith('http') && topUrl) {\n            // Handle the case of non-HTTP iframes, i.e., frames created by JS.\n            // For instance, frames can be created as 'about:blank' or 'data:text/html'.\n            url = topUrl;\n            blankFrame = true;\n        }\n\n        const lookupMessage = {\n            type: 'lookup',\n            url,\n            topUrl,\n        };\n\n        // Ask the native host to lookup rules for the given URL and top-level URL.\n        const response = await browser.runtime.sendNativeMessage('application.id', lookupMessage);\n\n        // In the current Safari version, we cannot apply rules to blank frames from\n        // the background: https://bugs.webkit.org/show_bug.cgi?id=296702\n        //\n        // In this case, we fall back to using the content script to apply rules.\n        // The downside here is that the content script cannot override the website's\n        // CSPs.\n        if (!blankFrame && response.payload) {\n            await backgroundScript.applyConfiguration(\n                tabId,\n                frameId,\n                response.payload,\n            );\n        }\n\n        // Pass the configuration to the content script.\n        return response;\n    }\n});\n```\n\n### Web Extension's Native Host\n\nFinally, in the native host code, you should handle the message and use\n`WebExtension` to look up the configuration.\n\n**IMPORTANT:** You need to replace `your.group.id` with your own group ID.\n\n```swift\nimport FilterEngine\nimport SafariServices\nimport os.log\n\npublic class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {\n    public func beginRequest(with context: NSExtensionContext) {\n        let request = context.inputItems.first as? NSExtensionItem\n\n        let message = getMessage(from: request)\n\n        guard let message = message,\n              let type = message[\"type\"] as? String\n        else {\n            return\n        }\n\n        var responseMessage: [String: Any] = [:]\n\n        if type == \"lookup\" {\n            do {\n                guard let urlString = message[\"url\"] as? String else {\n                    return\n                }\n                let topUrlString = message[\"topUrl\"] as? String\n\n                guard let url = URL(string: urlString) else {\n                    return\n                }\n\n                let topUrl = URL(string: topUrlString ?? \"\")\n\n                let webExtension = try WebExtension.shared(\n                    groupID: \"your.group.id\"\n                )\n\n                if let configuration = webExtension.lookup(pageUrl: url, topUrl: topUrl) {\n                    responseMessage[\"configuration\"] = convertToDictionary(configuration)\n                }\n            } catch {\n                os_log(\n                    .error,\n                    \"Failed to get WebExtension instance: %@\",\n                    error.localizedDescription\n                )\n            }\n        }\n\n        context.completeRequest(\n            returningItems: [createResponse(with: responseMessage)],\n            completionHandler: nil\n        )\n    }\n\n    private func convertToDictionary(\n        _ configuration: WebExtension.Configuration\n    ) -> [String: Any] {\n        var payload: [String: Any] = [:]\n        payload[\"css\"] = configuration.css\n        payload[\"extendedCss\"] = configuration.extendedCss\n        payload[\"js\"] = configuration.js\n\n        var scriptlets: [[String: Any]] = []\n        for scriptlet in configuration.scriptlets {\n            var scriptletData: [String: Any] = [:]\n            scriptletData[\"name\"] = scriptlet.name\n            scriptletData[\"args\"] = scriptlet.args\n            scriptlets.append(scriptletData)\n        }\n\n        payload[\"scriptlets\"] = scriptlets\n        payload[\"engineTimestamp\"] = configuration.engineTimestamp\n\n        return payload\n    }\n\n    private func createResponse(with json: [String: Any?]) -> NSExtensionItem {\n        let response = NSExtensionItem()\n        if #available(iOS 15.0, macOS 11.0, *) {\n            response.userInfo = [SFExtensionMessageKey: json]\n        } else {\n            response.userInfo = [\"message\": json]\n        }\n\n        return response\n    }\n\n    private func getMessage(from request: NSExtensionItem?) -> [String: Any?]? {\n        if request == nil {\n            return nil\n        }\n\n        let message: Any?\n        if #available(iOS 15.0, macOS 11.0, *) {\n            message = request?.userInfo?[SFExtensionMessageKey]\n        } else {\n            message = request?.userInfo?[\"message\"]\n        }\n\n        if message is [String: Any?] {\n            return message as? [String: Any?]\n        }\n\n        return nil\n    }\n}\n```\n\n### Safari App Extension\n\nIn the case of [Safari App Extension][SafariAppExtension], there's no background\npage and all rule types are interpreted by [ContentScript].\n\nAdd the library as a dependency to your extension code:\n\n```sh\nnpm add -i @adguard/safari-extension\n```\n\n#### App Extension's Content Script\n\nIn the content script request the rules from the native host:\n\n```js\n// Generate a pseudo-unique request ID for properly tracing the response to the\n// request that was sent by this instance of an SFSafariContentScript.\n// We will only accept responses to this specific request.\nconst requestId = Math.random().toString(36);\n\n// Prepare the message to request configuration rules for the current page.\n// getUrl() and getTopUrl() need to be implemented (see safari-blocker for an\n// example).\nconst message = {\n    requestId,\n    url: getUrl(),\n    topUrl: getTopUrl(),\n};\n\n// Dispatch the \"requestRules\" message to the Safari extension.\nsafari.extension.dispatchMessage('requestRules', message);\n```\n\nYou also need to handle the response from the native host and pass the\n[Configuration] object to [ContentScript]:\n\n```js\nimport {\n    type Configuration,\n    ContentScript,\n    setupDelayedEventDispatcher\n} from '@adguard/safari-extension';\n\n// Initialize the delayed event dispatcher. This may intercept DOMContentLoaded\n// and load events. The delay of 1000ms is used as a buffer to capture critical\n// initial events while waiting for the rules response.\nconst cancelDelayedDispatchAndDispatch = setupDelayedEventDispatcher(1000);\n\n// Register the event listener for incoming messages from the extension.\nsafari.self.addEventListener('message', handleMessage);\n\nconst handleMessage = (event) => {\n    const message = event.message;\n\n    if (message?.requestId !== requestId) {\n        // Received response for a different request ID; ignore it as it\n        // was sent to a different frame.\n\n        return;\n    }\n\n    // If the configuration payload exists, run the ContentScript with it.\n    if (message?.payload) {\n        new ContentScript().applyConfiguration(message?.payload);\n    }\n\n    // Cancel the pending delayed event dispatch and process any queued events.\n    cancelDelayedDispatchAndDispatch();\n};\n```\n\n#### App Extension's Native Host\n\nFinally, in the extension's native host code, you should handle the message and\nuse `WebExtension` to look up the configuration.\n\n```swift\npublic override func messageReceived(\n    withName messageName: String,\n    from page: SFSafariPage,\n    userInfo: [String: Any]?\n) {\n    // Skip code\n\n    let webExtension = try WebExtension.shared(\n        groupID: GroupIdentifier.shared.value\n    )\n\n    if let conf = webExtension.lookup(pageUrl: url, topUrl: topUrl) {\n        // Convert the configuration into a payload (dictionary\n        // format) that is consumable by the content script.\n        let payload = convertToPayload(conf)\n\n        // Dispatch the payload back to the web page under the same\n        // message name.\n        let responseUserInfo: [String: Any] = [\n            \"requestId\": requestId,\n            \"payload\": payload,\n        ]\n\n        page.dispatchMessageToScript(\n            withName: \"requestRules\",\n            userInfo: responseUserInfo\n        )\n    }\n}\n```\n","readmeFilename":"README.md"}