{"_id":"@airframeui/eslint-plugin","_rev":"10-5387017bd7e67e30533562afb069b793","name":"@airframeui/eslint-plugin","dist-tags":{"latest":"0.7.0"},"versions":{"0.2.0":{"name":"@airframeui/eslint-plugin","version":"0.2.0","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.2.0","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"b763b8eae6d89654980569cc77a012ab224e9e3b","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.2.0.tgz","fileCount":16,"integrity":"sha512-bdNetURWxPB5/dc28y2F4VGkfZblZWqrxVKjwrGQKJKam7KRMEdMu0RrMFB0CgNv2j8M0k6T30xHHI7VufRV8g==","signatures":[{"sig":"MEYCIQDv52EamMiu+m1XQ7ddxXPftFffO1+oLSyDV4609QjbfgIhAIrEok63+I3QxbUCkd+Q3gXEXFde7qw2b7I2Rsf0Gl4E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142514},"type":"module","_from":"file:airframeui-eslint-plugin-0.2.0.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/9c850b854eac162fa737914702f75d73/airframeui-eslint-plugin-0.2.0.tgz","_integrity":"sha512-bdNetURWxPB5/dc28y2F4VGkfZblZWqrxVKjwrGQKJKam7KRMEdMu0RrMFB0CgNv2j8M0k6T30xHHI7VufRV8g==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.2.0","@airframeui/tokens":"0.2.0"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.2.0_1787064660237_0.3549778977536162","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@airframeui/eslint-plugin","version":"0.3.0","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.3.0","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"7888f03ca7609ab526da641aff656294885d27cf","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.3.0.tgz","fileCount":16,"integrity":"sha512-bGcmjr8T1XIOKl0zM603vzhpd3b9tvm8lBOtx+1RllpMK1fRHaZAA10FbavoKdjtmoyykedBlz4O9DRsPW51zw==","signatures":[{"sig":"MEYCIQDsr07bK+nGufSiiXtqhErxpt3rCGqVEoyaYp//W9uvFwIhALjBs8yPFO7yjWZIKAoQ9NpF//h7YY4pYwGY5Rj9Wh48","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143629},"type":"module","_from":"file:airframeui-eslint-plugin-0.3.0.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/2142b8a5d3c94c6ed7b9b4a7c3f2af20/airframeui-eslint-plugin-0.3.0.tgz","_integrity":"sha512-bGcmjr8T1XIOKl0zM603vzhpd3b9tvm8lBOtx+1RllpMK1fRHaZAA10FbavoKdjtmoyykedBlz4O9DRsPW51zw==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.3.0","@airframeui/tokens":"0.3.0"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.3.0_1787388432328_0.2748895653112531","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@airframeui/eslint-plugin","version":"0.3.1","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.3.1","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"be2bfca961ded589f53e7f24b2ffe312c88571de","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.3.1.tgz","fileCount":16,"integrity":"sha512-4AJmo5oFEQU1RDAyeXM0Q6o6+Q5QZ391JatB8jvKV8ryt6eTlyGFH92b/CFP9EZBGpr6M6NmFx6d4JI6MkNRCQ==","signatures":[{"sig":"MEQCIGYP4Qw9ERYcm/T2/vgWcKOcIouEFdudTF8FV4Sku9u1AiAFmd6iKFthp+uOMwOe4tbLHb/84cOyDvvsPDC2aI9wiA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143853},"type":"module","_from":"file:airframeui-eslint-plugin-0.3.1.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/b0c699e0326be26d7d743b456d7a1f1c/airframeui-eslint-plugin-0.3.1.tgz","_integrity":"sha512-4AJmo5oFEQU1RDAyeXM0Q6o6+Q5QZ391JatB8jvKV8ryt6eTlyGFH92b/CFP9EZBGpr6M6NmFx6d4JI6MkNRCQ==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.3.1","@airframeui/tokens":"0.3.1"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.3.1_1787390673955_0.0816475065997071","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@airframeui/eslint-plugin","version":"0.3.2","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.3.2","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"4589452065eeb8ab1e64d07906da55c5a6059707","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.3.2.tgz","fileCount":16,"integrity":"sha512-blslF/UbVERsCzhO4Z0lRU6cnTKFolFQbRDKFOb5Ng1S5y3360p2E+vKfSNSEBw3d8ge7kLhhZ8k7j31+jzmeA==","signatures":[{"sig":"MEUCIAkjRAgShGbSqWQgRE3tglHBrkzyLNsFsGFJDr8/QjWSAiEAr4Js/Gl75YPc+VEuQDvBOH1DYwFy7TaW9ZvzQocKhvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146222},"type":"module","_from":"file:airframeui-eslint-plugin-0.3.2.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/f779ed92fae9ed3e8ed53adf70060c00/airframeui-eslint-plugin-0.3.2.tgz","_integrity":"sha512-blslF/UbVERsCzhO4Z0lRU6cnTKFolFQbRDKFOb5Ng1S5y3360p2E+vKfSNSEBw3d8ge7kLhhZ8k7j31+jzmeA==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.3.2","@airframeui/tokens":"0.3.2"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.3.2_1787406954294_0.5821562027500313","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@airframeui/eslint-plugin","version":"0.4.0","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.4.0","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"f3100e2047260c4c4b06a4e23bf84c01ea201571","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.4.0.tgz","fileCount":16,"integrity":"sha512-Ie6ZDpIVPwBk33z63L+fxgntbjUWfVtM9i/k2sGMiGZLlphLdTjh+98Hxe1SZlSe0aNb+otviTZHPL3FyOw5/Q==","signatures":[{"sig":"MEYCIQCTzvf6m7P/XWzjW0Az6CPCStM+Gd/MHZmguvuim9INSgIhAIwUdinRYOQ+3X6+7dYOzvzhJgxab3QtdZHws6mBnbn1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146329},"type":"module","_from":"file:airframeui-eslint-plugin-0.4.0.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/376eabf50e004369758d71f8e8479d47/airframeui-eslint-plugin-0.4.0.tgz","_integrity":"sha512-Ie6ZDpIVPwBk33z63L+fxgntbjUWfVtM9i/k2sGMiGZLlphLdTjh+98Hxe1SZlSe0aNb+otviTZHPL3FyOw5/Q==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.4.0","@airframeui/tokens":"0.4.0"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.4.0_1787469484028_0.3082400677784658","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@airframeui/eslint-plugin","version":"0.4.1","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.4.1","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"7236490b7ec9e93c7e5b6c555084e2527fe1f9e8","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.4.1.tgz","fileCount":16,"integrity":"sha512-70h7tbjbiQNoWLI6D1KgdbviKZsHL62V2gxMkvIx5mJLu0Ppp4/3m5xkSGK313Yh1DYF3fGicTMi4FMHi3j49A==","signatures":[{"sig":"MEQCICrADUCoZOoBqBAtpW8g+4aJrU7zGeyQqLcixAXc8pe3AiA9tA7A7qgOEViTrnS9H2yhvMuCUv2ZlMQOcT6Je1Fnlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147561},"type":"module","_from":"file:airframeui-eslint-plugin-0.4.1.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/521772d6d977021a4a17c013fe4e2383/airframeui-eslint-plugin-0.4.1.tgz","_integrity":"sha512-70h7tbjbiQNoWLI6D1KgdbviKZsHL62V2gxMkvIx5mJLu0Ppp4/3m5xkSGK313Yh1DYF3fGicTMi4FMHi3j49A==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.4.1","@airframeui/tokens":"0.4.1"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.4.1_1787499874769_0.61272865257492","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@airframeui/eslint-plugin","version":"0.4.2","keywords":["airframe","airframeui","eslint","eslint-plugin","css"],"license":"MIT","_id":"@airframeui/eslint-plugin@0.4.2","maintainers":[{"name":"itodd","email":"itodd@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"a376e129b11bc52871057177ffb91fc4c67380d0","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.4.2.tgz","fileCount":16,"integrity":"sha512-ov1/+lgryZP9aIL6vbXeUVnZKo1CLT10+BgqEOyVENLLb7vvs1eD3zyky9JQjtnzojWqCMkKYoCokqtvau5Qog==","signatures":[{"sig":"MEUCIQD140acwvVWXWObAS1jfODeLo48RNj9luTK3U1J//6BQQIgC3/xXymCQiK0vLAXnQEWOhYjlEGum1qy0latQGwP+eU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147561},"type":"module","_from":"file:airframeui-eslint-plugin-0.4.2.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/204a35f4886d0e8a96a6795cd816e64a/airframeui-eslint-plugin-0.4.2.tgz","_integrity":"sha512-ov1/+lgryZP9aIL6vbXeUVnZKo1CLT10+BgqEOyVENLLb7vvs1eD3zyky9JQjtnzojWqCMkKYoCokqtvau5Qog==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.4.2","@airframeui/tokens":"0.4.2"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.4.2_1787557327893_0.2976929997871194","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@airframeui/eslint-plugin","version":"0.5.0","keywords":["airframe","airframeui","eslint","eslint-plugin","css","angular"],"author":{"name":"Airframe","email":"team@airframeui.com"},"license":"MIT","_id":"@airframeui/eslint-plugin@0.5.0","maintainers":[{"name":"itodd","email":"itodd+npm@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"7bf4a2128c90e11bd1d850e0f5fa0726996907a0","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.5.0.tgz","fileCount":16,"integrity":"sha512-fNG3T94ybnbQY/JfF3ZPbeli/HOaAFUyyFcM1nCcn5l7nSThtuhkyHrrdJGluGTY5ep2yWZhWNDwClI7oBZJTg==","signatures":[{"sig":"MEYCIQDMiF4SEzF/ztiqm0b5vPaZGzQzy0dxzbhS8w8Hl56BzgIhAIwX0ci/b+9/3RmlQQILUBj/WsRBw8e7N8Pq0ii3MIfW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164148},"type":"module","_from":"file:airframeui-eslint-plugin-0.5.0.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/angular.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd+npm@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/470da2e1bb548ca587089f61420004ed/airframeui-eslint-plugin-0.5.0.tgz","_integrity":"sha512-fNG3T94ybnbQY/JfF3ZPbeli/HOaAFUyyFcM1nCcn5l7nSThtuhkyHrrdJGluGTY5ep2yWZhWNDwClI7oBZJTg==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults in JSX and Angular templates","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.8.1","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.5.0","@airframeui/tokens":"0.5.0","@angular-eslint/template-parser":"^22.1.0"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0","@angular-eslint/template-parser":">=20.0.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true},"@angular-eslint/template-parser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.5.0_1787658787572_0.9703735956176212","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@airframeui/eslint-plugin","version":"0.6.0","keywords":["airframe","airframeui","eslint","eslint-plugin","css","angular"],"author":{"name":"Airframe","email":"team@airframeui.com"},"license":"MIT","_id":"@airframeui/eslint-plugin@0.6.0","maintainers":[{"name":"itodd","email":"itodd+npm@hotmail.co.uk"}],"homepage":"https://airframeui.com/docs/eslint-plugin","bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"dist":{"shasum":"17769aaa50fb4fb74ce6a4b5b840c1a52493f324","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.6.0.tgz","fileCount":16,"integrity":"sha512-B9hZh4H3V/sK1VFkcgQU2ztPhvdyPEjXMlP9UIv4fwOIivc6x5XAoj+8xi0WxzOkGWGJyC/XyWVMbcdg4IgwqQ==","signatures":[{"sig":"MEQCIArHx/ga9JGRAPvlxxUOStR85/xv8SQl9WcH2HgUlGgQAiB3YZh/QQBkT8pxqRkDL0dNT+ZAjcI9/3NCXUGrDvHT+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164243},"type":"module","_from":"file:airframeui-eslint-plugin-0.6.0.tgz","turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/angular.test.ts src/generate-data.test.mjs","build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs"},"_npmUser":{"name":"itodd","email":"itodd+npm@hotmail.co.uk"},"_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/0dd391efe0aadc31f0971c55a0d43c85/airframeui-eslint-plugin-0.6.0.tgz","_integrity":"sha512-B9hZh4H3V/sK1VFkcgQU2ztPhvdyPEjXMlP9UIv4fwOIivc6x5XAoj+8xi0WxzOkGWGJyC/XyWVMbcdg4IgwqQ==","repository":{"url":"git+https://github.com/airframeui/airframeui.git","type":"git","directory":"packages/eslint-plugin"},"_npmVersion":"11.19.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults in JSX and Angular templates","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.9.0","typescript":"6.0.3","@types/node":"26.2.0","@types/eslint":"9.6.1","@airframeui/core":"0.6.0","@airframeui/tokens":"0.6.0","@angular-eslint/template-parser":"^22.1.0"},"peerDependencies":{"eslint":">=8.57.0","@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0","@angular-eslint/template-parser":">=20.0.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true},"@angular-eslint/template-parser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.6.0_1787847532447_0.7296254985501973","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@airframeui/eslint-plugin","version":"0.7.0","description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults in JSX and Angular templates","author":{"name":"Airframe","email":"team@airframeui.com"},"license":"MIT","homepage":"https://airframeui.com/docs/eslint-plugin","keywords":["airframe","airframeui","eslint","eslint-plugin","css","angular"],"repository":{"type":"git","url":"git+https://github.com/airframeui/airframeui.git","directory":"packages/eslint-plugin"},"bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"publishConfig":{"access":"public"},"peerDependencies":{"@airframeui/core":">=0.1.0","@airframeui/tokens":">=0.1.0","@angular-eslint/template-parser":">=20.0.0","eslint":">=8.57.0"},"peerDependenciesMeta":{"@airframeui/core":{"optional":true},"@airframeui/tokens":{"optional":true},"@angular-eslint/template-parser":{"optional":true}},"devDependencies":{"@angular-eslint/template-parser":"^22.1.0","@types/eslint":"9.6.1","@types/node":"26.2.0","eslint":"10.9.0","typescript":"6.0.3","@airframeui/core":"0.7.0","@airframeui/tokens":"0.7.0"},"turbo":{"tasks":{"build":{"outputs":["dist/**","src/data.json"]}}},"scripts":{"build":"npm run generate-data && tsc -p tsconfig.json","generate-data":"node build/generate-data.mjs","dev":"tsc -p tsconfig.json --watch","lint":"eslint src build","test":"npm run generate-data && tsc -p tsconfig.json && node --test --experimental-strip-types src/index.test.ts src/angular.test.ts src/generate-data.test.mjs"},"_id":"@airframeui/eslint-plugin@0.7.0","_integrity":"sha512-ksfGcMqR7u85HNpiqaSWiwWI3tMpDs4GUpvyNAqH8VEMGmYeICUkp6mtX/c7IY4GTdDhoavj04rNvo7XsIzPOA==","_resolved":"/private/var/folders/3z/31jdvz690j13v6kzqwd719yc0000gn/T/da7eeda9c8882db6d4f2bbdcbad10b89/airframeui-eslint-plugin-0.7.0.tgz","_from":"file:airframeui-eslint-plugin-0.7.0.tgz","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-ksfGcMqR7u85HNpiqaSWiwWI3tMpDs4GUpvyNAqH8VEMGmYeICUkp6mtX/c7IY4GTdDhoavj04rNvo7XsIzPOA==","shasum":"66d3f42e4eb31771a2335ebbb20b9955b52a8a85","tarball":"https://registry.npmjs.org/@airframeui/eslint-plugin/-/eslint-plugin-0.7.0.tgz","fileCount":16,"unpackedSize":164243,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAd75S2/WeL6jI6uU04b02Gs+PQvWzS2gS/S3tDgRXCCAiEA9UXbyBEaSeSWQZphTo5UE3+vMAUHejlVIXBCHuQ5Xus="}]},"_npmUser":{"name":"itodd","email":"itodd+npm@hotmail.co.uk"},"directories":{},"maintainers":[{"name":"itodd","email":"itodd+npm@hotmail.co.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin_0.7.0_1788002142989_0.23318744852902817"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T14:50:59.652Z","modified":"2026-08-29T11:15:43.383Z","0.2.0":"2026-08-18T14:51:00.364Z","0.3.0":"2026-08-22T08:47:12.463Z","0.3.1":"2026-08-22T09:24:34.101Z","0.3.2":"2026-08-22T13:55:54.487Z","0.4.0":"2026-08-23T07:18:04.267Z","0.4.1":"2026-08-23T15:44:34.926Z","0.4.2":"2026-08-24T07:42:08.024Z","0.5.0":"2026-08-25T11:53:07.711Z","0.6.0":"2026-08-27T16:18:52.586Z","0.7.0":"2026-08-29T11:15:43.144Z"},"bugs":{"url":"https://github.com/airframeui/airframeui/issues"},"author":{"name":"Airframe","email":"team@airframeui.com"},"license":"MIT","homepage":"https://airframeui.com/docs/eslint-plugin","keywords":["airframe","airframeui","eslint","eslint-plugin","css","angular"],"repository":{"type":"git","url":"git+https://github.com/airframeui/airframeui.git","directory":"packages/eslint-plugin"},"description":"Airframe UI ESLint plugin — catch Tailwind/Bootstrap drift, unknown af-* classes, and redundant defaults in JSX and Angular templates","maintainers":[{"name":"itodd","email":"itodd+npm@hotmail.co.uk"}],"readme":"# @airframeui/eslint-plugin\n\nESLint rules that keep **JSX** and **Angular templates** on [Airframe](https://airframeui.com): leftover Tailwind/Bootstrap utilities, unknown `af-*` names, redundant defaults, structure classes, and field-error ARIA.\n\nString literals on `class` / `className` in `.js` / `.jsx` / `.ts` / `.tsx`, plus Angular `class=\"…\"`, `[class]=\"'…'\"`, `[class.token]`, and `[ngClass]` string/map keys in `.html` (and inline `template:` via `angular-eslint` `processInlineTemplates`). It does **not** parse Vue bindings or `class:list`. For those hosts, use MCP `validate_markup` (or pretty-print `@airframeui/core/catalog` when MCP is off).\n\nSame version as `@airframeui/core`. Docs: [airframeui.com/docs/eslint-plugin](https://airframeui.com/docs/eslint-plugin) · [Changelog](https://airframeui.com/docs/changelog)\n\n## Installation\n\n```bash\nnpm install -D @airframeui/eslint-plugin\n```\n\nRequires ESLint 9+ (flat config) or ESLint 8.57+ with eslintrc. Core and tokens are optional peers — if they are installed, their catalogs win so lint matches the CSS you ship.\n\nAngular templates need [`@angular-eslint/template-parser`](https://www.npmjs.com/package/@angular-eslint/template-parser) (Angular 20+, typically via `angular-eslint`) on `**/*.html`. The plugin does not parse HTML as JavaScript.\n\n## Setup\n\n### Flat config (ESLint 9+)\n\n```js\n// eslint.config.js\nimport airframe from '@airframeui/eslint-plugin';\n\nexport default [airframe.configs['flat/recommended']];\n```\n\nDrop `airframe.configs['flat/recommended']` into an existing `export default [ ... ]` array. It enables JSX parsing and matches `.js`, `.jsx`, `.ts`, and `.tsx` (ESLint does not lint `.jsx` / `.ts` unless `files` says so).\n\n### Angular templates (v20+)\n\nUse alongside `angular-eslint`. `flat/angular` turns the Airframe rules on for `**/*.html`; it does not set a parser — `templateRecommended` (or `languageOptions.parser: angular.templateParser`) must already apply.\n\n```js\n// eslint.config.js\nimport airframe from '@airframeui/eslint-plugin';\nimport angular from 'angular-eslint';\n\nexport default [\n  ...airframe.configs['flat/recommended'],\n  {\n    files: ['**/*.ts'],\n    processor: angular.processInlineTemplates,\n  },\n  ...angular.configs.templateRecommended,\n  ...airframe.configs['flat/angular'],\n];\n```\n\n`processInlineTemplates` extracts `@Component({ template: \\`…\\` })`so the same rules run on inline templates. External`*.html`files are covered by`flat/angular`.\n\nOverride a rule after the preset:\n\n```js\nexport default [\n  airframe.configs['flat/recommended'],\n  {\n    rules: {\n      '@airframeui/no-tailwind-classes': 'off',\n    },\n  },\n];\n```\n\n### Legacy eslintrc\n\n```js\n// .eslintrc.cjs\nmodule.exports = {\n  plugins: ['@airframeui'],\n  extends: ['plugin:@airframeui/recommended'],\n};\n```\n\n## Rules\n\nAll seven rules ship in `recommended` (JSX) and `flat/angular` (templates). They inspect **string literals** on `class` / `className` in JSX, and Angular `class`, `[class]=\"'…'\"`, `[class.token]`, and `[ngClass]` string/map keys. Existing `af-*` tokens are ignored by the Tailwind and Bootstrap detectors.\n\n| Rule                                         | Recommended | Autofix | What it does                                                                                                         |\n| -------------------------------------------- | ----------- | ------- | -------------------------------------------------------------------------------------------------------------------- |\n| `@airframeui/no-bootstrap-classes`           | `warn`      | no      | Leftover Bootstrap tokens (`btn`, `row`, `col-*`, `d-flex`, …)                                                       |\n| `@airframeui/no-redundant-defaults`          | `warn`      | yes     | Restated defaults: `af-card af-stack`, `af-btn af-is-primary`, `af-container af-container-xl`, matching `af-text-h*` |\n| `@airframeui/no-redundant-width`             | `warn`      | yes     | `af-w-full` on form controls; `af-block` on `af-btn`                                                                 |\n| `@airframeui/no-tailwind-classes`            | `warn`      | no      | Leftover Tailwind utilities (`flex`, `gap-4`, `md:gap-4`, `bg-blue-600`, …)                                          |\n| `@airframeui/no-unknown-airframe-class`      | `error`     | yes\\*   | Invented `af-*` names. Autofix for known aliases and catalog heuristics                                              |\n| `@airframeui/prefer-airframe-layout-recipes` | `warn`      | yes     | Rewrites `flex flex-col`, `grid grid-cols-*`, `row`, `container`, …                                                  |\n| `@airframeui/require-field-error-aria`       | `error`     | no      | `af-field__error` needs `id`; error inputs need `aria-describedby`                                                   |\n\n## Autofix\n\nRules with a fix rewrite the `class` / `className` string (quotes stay; an empty class attribute is removed). The same rewrite applies to static `class=\"…\"` in Angular templates and to `[class]=\"'…'\"` string literals. `[class.token]` and `[ngClass]` object maps are reported without a rewrite.\n\n```bash\nnpx eslint . --fix\n```\n\nSame command as the editor **Fix all auto-fixable problems** action.\n\nAutofix only runs when the replacement is deterministic: known aliases, catalog heuristics, structure classes, redundant defaults, and redundant width. Unknown names with only a fuzzy guess, leftover Tailwind/Bootstrap that is not a structure rewrite, and field-error ARIA are reported without a fix.\n\n## Rewrites\n\n### Structure classes\n\n`@airframeui/prefer-airframe-layout-recipes` — skipped if the attribute already has `af-stack`, `af-inline`, `af-grid`, `af-cluster`, `af-spread`, `af-center`, or `af-container`.\n\nGap numbers map to the Airframe named scale (`0` · `xs` · `sm` · `md` · `lg` · `xl` · `2xl` · `3xl` · `4xl`). Default `md` (`gap-3` / `g-3`) is omitted because `af-stack` / `af-grid` already use it.\n\n| Before                                    | After                                     |\n| ----------------------------------------- | ----------------------------------------- |\n| `flex flex-col` / `flex flex-col gap-4`   | `af-stack` / `af-stack af-gap-lg`         |\n| `flex flex-wrap` / `flex flex-wrap gap-2` | `af-inline` / `af-inline af-gap-sm`       |\n| `grid` / `grid grid-cols-3 gap-6`         | `af-grid` / `af-grid af-grid-3 af-gap-xl` |\n| `d-flex flex-column`                      | `af-stack`                                |\n| `d-flex flex-wrap`                        | `af-inline`                               |\n| `d-grid` / `row`                          | `af-grid`                                 |\n| `container` / `container-fluid`           | `af-container`                            |\n\n### Unknown `af-*` names\n\n`@airframeui/no-unknown-airframe-class` — prefers the project's `@airframeui/core/classes.json`, then the snapshot bundled at plugin build time.\n\n| Invented                                                                      | Autofix                                      |\n| ----------------------------------------------------------------------------- | -------------------------------------------- |\n| `af-btn-primary`                                                              | `af-btn`                                     |\n| `af-btn-secondary` / `af-btn-danger`                                          | `af-btn af-is-secondary` / `af-is-danger`    |\n| `af-btn-destructive`                                                          | `af-btn af-is-danger`                        |\n| `af-btn-block` / `af-is-block` / `af-is-full`                                 | `af-w-full`                                  |\n| `af-{pattern}-{variant}` when both `af-{pattern}` and `af-is-{variant}` exist | `af-{pattern} af-is-{variant}`               |\n| Anything else unknown                                                         | Message may suggest a close name; no autofix |\n\nDo not invent `af-*` names. Use catalog classes (`af-btn af-is-danger`, not `af-btn-danger`).\n\n### Redundant markup\n\n| Before                                     | After                  | Rule                    |\n| ------------------------------------------ | ---------------------- | ----------------------- |\n| `af-btn af-is-primary`                     | `af-btn`               | `no-redundant-defaults` |\n| `af-card af-stack af-gap-md`               | `af-card`              | `no-redundant-defaults` |\n| `af-grid af-gap-md` / `af-stack af-gap-md` | `af-grid` / `af-stack` | `no-redundant-defaults` |\n| `af-container af-container-xl`             | `af-container-xl`      | `no-redundant-defaults` |\n| `<h1 class=\"af-text-h1\">`                  | `<h1>`                 | `no-redundant-defaults` |\n| `af-input af-w-full`                       | `af-input`             | `no-redundant-width`    |\n| `af-btn af-block`                          | `af-btn af-w-full`     | `no-redundant-width`    |\n\nKept: `af-card af-gap-lg`, `af-card af-inline`, `af-container af-container-lg@xl`, `<h2 class=\"af-text-h1\">`, `af-btn af-w-full`, `af-input af-is-autosize af-w-full`.\n\nForm controls that already span full width: `af-input`, `af-textarea`, `af-select`, `af-range`, `af-progress`, `af-meter`, `af-input-group`, `af-field__control`.\n\n### Field-error ARIA\n\nNo autofix — you must choose the `id`.\n\n| Markup                                                   | Required                                      |\n| -------------------------------------------------------- | --------------------------------------------- |\n| `class` contains `af-field__error`                       | `id` on that element (for `aria-describedby`) |\n| `class` contains `af-is-error`, or `aria-invalid=\"true\"` | `aria-describedby` on that element            |\n\n```jsx\n<label className=\"af-field\">\n  <span className=\"af-field__label\">Email</span>\n  <input className=\"af-input af-is-error\" aria-describedby=\"email-error\" />\n  <p className=\"af-field__error\" id=\"email-error\">\n    Enter a valid email.\n  </p>\n</label>\n```\n\n## For coding agents\n\nEnable `recommended`, then treat lint as the source of truth for `af-*` markup:\n\n```text\nwrite class / className (and Angular class / [class] / [ngClass]) → npx eslint . --fix → fix remaining reports by hand\n```\n\n- Apply `--fix` first. Do not invent a different `af-*` name when the message already suggests one.\n- Map leftover Tailwind/Bootstrap layout combos with the tables above. Do not leave `flex flex-col` next to `af-stack`.\n- For field-error ARIA, add a real `id` and matching `aria-describedby`. There is no autofix.\n- Do not wrap classes in template literals, `clsx`, or `class:list` to dodge the rules — those forms are not checked yet, and the markup is still wrong.\n\n## Current limitations\n\n- **JSX and Angular templates.** String literals on `class` / `className` in `.js` / `.jsx` / `.ts` / `.tsx`. Angular `*.html` (v20+ control flow included) with `@angular-eslint/template-parser`: `class=\"…\"`, `[class]=\"'…'\"`, `[class.token]`, `[ngClass]` strings and map keys. Not Vue/Svelte bindings, `class:list`, template literals, Astro expression attributes, or `[class]=\"variable\"`. For other HTML hosts, use MCP `validate_markup`.\n- `@airframeui/no-unknown-airframe-class` prefers the project's `@airframeui/core/classes.json`, then the snapshot generated from core at plugin build time (same `classes.json` + token catalog as [IntelliSense for Airframe](https://airframeui.com/docs/vscode-extension)).\n- Tailwind/Bootstrap detectors ignore existing `af-*` tokens so `af-grid` / `af-btn` are not flagged.\n\n## Related\n\n- Docs: [airframeui.com/docs/eslint-plugin](https://airframeui.com/docs/eslint-plugin)\n- [Angular setup](https://airframeui.com/docs/angular) — `examples/angular` in the repo (`pnpm example:angular`)\n- [Changelog](https://airframeui.com/docs/changelog)\n- [`@airframeui/core`](https://www.npmjs.com/package/@airframeui/core) — CSS system (install this in the app)\n- [IntelliSense for Airframe](https://airframeui.com/docs/vscode-extension) — autocomplete for `af-*` / `--af-*`\n- [Coming from Bootstrap or Tailwind](https://airframeui.com/docs/migrate)\n- [Packages](https://airframeui.com/docs/packages)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}