{"_id":"@bernierllc/validators-image-asset","_rev":"7-e5a0a010ea964513303a3508c274a08a","name":"@bernierllc/validators-image-asset","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@bernierllc/validators-image-asset","version":"0.1.0","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"19401d0ed314c3468759e115908a501c70b4f85b","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.1.0.tgz","fileCount":14,"integrity":"sha512-FUhPh85cHuvBlJw2xn3mCAXvMgrmt6+JkLEV/vIXFzn8jBw+3lssUAOmuPYAL4mNSZI1sUg0xsEtTi1P4AB84A==","signatures":[{"sig":"MEQCIC+N8ii8vcQjzII7rsA6idSm14ivrPT3FE8xatNcCHqhAiAj7gw8/69s/qRJEfJRNBCgr0wi509NTPUaPsA0Bn+pDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31376},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c5ae13f5ff57b9795ce9a1e574455bf202c93763","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"11.4.2","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/validators-core":"^0.1.1","@bernierllc/validators-utils":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.1.0_1760211631890_0.1857641201363136","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/validators-image-asset","version":"0.3.0","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"f915f8c354ae870849f05a57e16ba25323627b59","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.3.0.tgz","fileCount":14,"integrity":"sha512-t+6YIwHa13v38UP6dcyY809Cub+uF1/b+aQ+XmvpHWCYOnwgvr3LbhDpMIoDd8KD05Vs0clH28ibTeMSKDA1dg==","signatures":[{"sig":"MEUCIQDwGfddcMH1pkCj72PKSNJYHgOH6e1bVvKf+WuI/UuCaAIgJz0fxVMYjP7THoMLpa7dGsZuh/eodXWWMSWEYGkmXns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31478},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/validators-core":"0.1.2","@bernierllc/validators-utils":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.3.0_1767642366894_0.6443664265437361","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/validators-image-asset","version":"0.3.1","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"2982d843294a0aeadbd08fa76e3122509ce8db7f","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.3.1.tgz","fileCount":14,"integrity":"sha512-Eza6Or5um8Zs3SSu2ar+L/IUcO7UNvv/vCyfx9u60/w4T9Q8a7bFoLGLKjy18WHj+n1B4j7/wNl4Lv3KDMGu2w==","signatures":[{"sig":"MEUCIQDTopLB2yVhrZAyaa6TrKXPucExCVbnoHXZqg8usSLo9QIgHaaseAlAnRKZx42yjAh46pFKVQHrw7T21oUpF11tbVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31420},"main":"dist/index.js","_from":"file:bernierllc-validators-image-asset-0.3.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"_resolved":"/tmp/47009234372cfb82af244dcd7e7d3859/bernierllc-validators-image-asset-0.3.1.tgz","_integrity":"sha512-Eza6Or5um8Zs3SSu2ar+L/IUcO7UNvv/vCyfx9u60/w4T9Q8a7bFoLGLKjy18WHj+n1B4j7/wNl4Lv3KDMGu2w==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"11.11.0","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.3","@bernierllc/validators-utils":"0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.3.1_1773078294718_0.22472694524087733","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/validators-image-asset","version":"0.3.2","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"932033021f7c4d5e6ef8b3aa353b7b0570a210a4","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.3.2.tgz","fileCount":14,"integrity":"sha512-glP3iiqcdOUf+oluRWqv3TC11aDsa+pNkbL04cxyEmKbG4cg4i4UYjqqvsChc8C6hUm1ngXB+QaqLg5aVB8q5Q==","signatures":[{"sig":"MEQCIAZCaetBpNtjRKOKPmarPONY2oz6ugA2U7shFQ8/XhiEAiB+BewvRpYyRZgs/yH8EUc0XWpUcMuqD5lkymw1kHFOwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31420},"main":"dist/index.js","_from":"file:bernierllc-validators-image-asset-0.3.2.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-image-asset/bernierllc-validators-image-asset-0.3.2.tgz","_integrity":"sha512-glP3iiqcdOUf+oluRWqv3TC11aDsa+pNkbL04cxyEmKbG4cg4i4UYjqqvsChc8C6hUm1ngXB+QaqLg5aVB8q5Q==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"11.11.0","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.4","@bernierllc/validators-utils":"0.1.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.3.2_1773163937316_0.30640461223959337","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/validators-image-asset","version":"0.4.0","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"28a987729694735b000c389555ba15475466a0d7","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.4.0.tgz","fileCount":14,"integrity":"sha512-rZ0cOk/N7S9E2F4YGfgwVbhhoXNOXv64Ksi68LzXBPcjmQKULDRZBqSr9AKK8tErA9h2c6t0qUH24hTfDoAtdw==","signatures":[{"sig":"MEUCIC3YcTs8K1nTSrHGZDAVBvN4o10OE+JkDXJ/dU/76EaLAiEAs/PfSs4lsXgES2wntcwlVkPOV26G4CZbcJkBkYZEkBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31420},"main":"dist/index.js","_from":"file:bernierllc-validators-image-asset-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-image-asset/bernierllc-validators-image-asset-0.4.0.tgz","_integrity":"sha512-rZ0cOk/N7S9E2F4YGfgwVbhhoXNOXv64Ksi68LzXBPcjmQKULDRZBqSr9AKK8tErA9h2c6t0qUH24hTfDoAtdw==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"11.14.1","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.2.0","@bernierllc/validators-utils":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.4.0_1779242167270_0.2852506784328561","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/validators-image-asset","version":"0.5.0","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-image-asset@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"b0c6bd78294ff5ec151bd99df29d3db6559b15da","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.5.0.tgz","fileCount":14,"integrity":"sha512-4HMkLqxTU3ny/2SebchlHGHivzT9yXpHtEM5fTLArKPbXkjJVHibbiLfTOYzok2bzIfUZQ9hT1fpFuj7PpJfYg==","signatures":[{"sig":"MEYCIQCdXfTMUl/vzPecFQp2EgFxxjxmLg/Pc8oTlf0tJLaP9QIhALSDQmZKFBZvOui7gZPfSjApt1tRJCZ6WWBGr1oqgse8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31420},"main":"dist/index.js","_from":"file:bernierllc-validators-image-asset-0.5.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-image-asset/bernierllc-validators-image-asset-0.5.0.tgz","_integrity":"sha512-4HMkLqxTU3ny/2SebchlHGHivzT9yXpHtEM5fTLArKPbXkjJVHibbiLfTOYzok2bzIfUZQ9hT1fpFuj7PpJfYg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-image-asset"},"_npmVersion":"11.14.1","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.3.0","@bernierllc/validators-utils":"0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-image-asset_0.5.0_1779250924822_0.3779925377011104","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bernierllc/validators-image-asset","version":"0.7.0","description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","main":"dist/index.js","types":"dist/index.d.ts","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","dependencies":{"@bernierllc/validators-core":"0.4.0","@bernierllc/validators-utils":"0.5.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/eslint-plugin":"^5.57.0","@typescript-eslint/parser":"^5.57.0","eslint":"^8.37.0","jest":"^29.5.0","ts-jest":"^29.0.5","typescript":"^5.0.0"},"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/validators/validators-image-asset"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rm -rf dist coverage"},"_id":"@bernierllc/validators-image-asset@0.7.0","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools#readme","_integrity":"sha512-2sqG1jVAmaBz6ss2+bqcuB22TOr6/hz1di8BanyPqrmg3c7ByV++TQ0Ug+yXp4vj/yicjuetQF9Z0k/e4jgejQ==","_resolved":"/home/runner/work/tools/tools/packages/validators/validators-image-asset/bernierllc-validators-image-asset-0.7.0.tgz","_from":"file:bernierllc-validators-image-asset-0.7.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-2sqG1jVAmaBz6ss2+bqcuB22TOr6/hz1di8BanyPqrmg3c7ByV++TQ0Ug+yXp4vj/yicjuetQF9Z0k/e4jgejQ==","shasum":"16507e3a47d7cd8c4d3ebe479189efa11b3f9b18","tarball":"https://registry.npmjs.org/@bernierllc/validators-image-asset/-/validators-image-asset-0.7.0.tgz","fileCount":16,"unpackedSize":33266,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFia4b4BSihHcFUZ2Kj2uqojN3o21A2d6scrLtEzDkogAiBhgrAO+V6J1hvGOpkPZQ17jY0WxG+Au5/v5T4M5jmvdg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:96239aab-df21-4d72-b25c-36d8ae68e7b8"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/validators-image-asset_0.7.0_1779252211603_0.629772516200219"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-11T19:40:31.797Z","modified":"2026-05-20T04:43:31.914Z","0.1.0":"2025-10-11T19:40:32.082Z","0.3.0":"2026-01-05T19:46:07.052Z","0.3.1":"2026-03-09T17:44:54.847Z","0.3.2":"2026-03-10T17:32:17.453Z","0.4.0":"2026-05-20T01:56:07.417Z","0.5.0":"2026-05-20T04:22:04.988Z","0.7.0":"2026-05-20T04:43:31.765Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","homepage":"https://github.com/bernierllc/tools#readme","keywords":["validation","validators","image","asset","primitive","content","accessibility","optimization"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/validators/validators-image-asset"},"description":"Image asset validation for the BernierLLC validators ecosystem - validates alt text, formats, sizes, and optimization","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/validators-image-asset\n\nImage asset validation for the BernierLLC validators ecosystem - validates accessibility, performance, and optimization.\n\n## Installation\n\n```bash\nnpm install @bernierllc/validators-image-asset\n```\n\n## Features\n\n- **Accessibility**: Validates alt text presence for screen readers\n- **Performance**: Checks file sizes and image dimensions\n- **Optimization**: Recommends modern formats (WebP, AVIF) and responsive images\n- **Responsive**: Validates srcset usage for large images\n- **Type-Safe**: Full TypeScript support with detailed interfaces\n\n## Usage\n\n### Basic Validation\n\n```typescript\nimport { validateImageAsset } from '@bernierllc/validators-image-asset';\n\nconst imageData = {\n  src: 'example.jpg',\n  alt: 'A beautiful sunset',\n  format: 'jpg',\n  size: 150000, // bytes\n  width: 1920,\n  height: 1080\n};\n\nconst problems = await validateImageAsset(imageData);\n\nproblems.forEach(problem => {\n  console.log(`${problem.severity}: ${problem.message}`);\n  if (problem.suggestion) {\n    console.log(`  Suggestion: ${problem.suggestion}`);\n  }\n});\n```\n\n### Using Individual Rules\n\n```typescript\nimport {\n  missingAltText,\n  inefficientFormat,\n  excessiveFileSize\n} from '@bernierllc/validators-image-asset';\nimport { createRuleContext } from '@bernierllc/validators-core';\nimport { createSharedUtils } from '@bernierllc/validators-utils';\n\nconst imageData = {\n  src: 'example.png',\n  alt: 'Example image',\n  format: 'png',\n  size: 250000\n};\n\nconst sharedUtils = createSharedUtils();\nconst context = createRuleContext('image-asset', imageData, sharedUtils);\n\n// Run specific rule\nconst check = missingAltText.create(context);\ncheck(imageData);\n\nconst problems = context.getProblems();\n```\n\n### Integration with Validator Runner\n\n```typescript\nimport { imageAssetValidator } from '@bernierllc/validators-image-asset';\nimport { createRuleContext } from '@bernierllc/validators-core';\nimport { createSharedUtils } from '@bernierllc/validators-utils';\n\nconst imageData = {\n  src: 'hero.webp',\n  alt: 'Hero image',\n  format: 'webp',\n  size: 180000,\n  width: 1920,\n  height: 1080,\n  srcset: 'hero-320w.webp 320w, hero-640w.webp 640w, hero.webp 1920w'\n};\n\nconst sharedUtils = createSharedUtils();\nconst context = createRuleContext('image-asset', imageData, sharedUtils);\n\nconst problems = await imageAssetValidator.validate(imageData, context);\n```\n\n## API Reference\n\n### `validateImageAsset(imageData, utils?)`\n\nValidates image assets for accessibility, performance, and optimization.\n\n**Parameters:**\n- `imageData: ImageAssetData` - The image data to validate\n- `utils?: SharedUtils` - Optional shared utilities (created automatically if not provided)\n\n**Returns:** `Promise<Problem[]>` - Array of validation problems\n\n### `ImageAssetData`\n\n```typescript\ninterface ImageAssetData {\n  src: string;           // Image source URL (required)\n  alt?: string;          // Alt text for accessibility\n  title?: string;        // Optional title attribute\n  format?: string;       // Image format (jpg, png, webp, avif, svg, etc.)\n  size?: number;         // File size in bytes\n  width?: number;        // Image width in pixels\n  height?: number;       // Image height in pixels\n  srcset?: string;       // Responsive image srcset\n}\n```\n\n## Validation Rules\n\n### 1. Missing Alt Text (`image-asset/missing-alt-text`)\n\n**Severity:** Error\n**Description:** All images must have descriptive alt text for accessibility\n\n```typescript\n// ❌ Invalid - Missing alt text\nconst invalid = {\n  src: 'example.jpg'\n};\n\n// ✅ Valid - Has alt text\nconst valid = {\n  src: 'example.jpg',\n  alt: 'A beautiful mountain landscape'\n};\n```\n\n### 2. Inefficient Format (`image-asset/inefficient-format`)\n\n**Severity:** Error (legacy formats), Warning (acceptable formats)\n**Description:** Images should use modern formats like WebP or AVIF\n\n```typescript\n// ❌ Error - Legacy format\nconst legacy = {\n  src: 'example.bmp',\n  alt: 'Example',\n  format: 'bmp'\n};\n\n// ⚠️ Warning - Acceptable but not optimal\nconst acceptable = {\n  src: 'example.jpg',\n  alt: 'Example',\n  format: 'jpg'\n};\n\n// ✅ Valid - Modern format\nconst modern = {\n  src: 'example.webp',\n  alt: 'Example',\n  format: 'webp'\n};\n```\n\n**Format Categories:**\n- **Modern** (no warning): WebP, AVIF, SVG\n- **Acceptable** (warning): PNG, JPG, JPEG, GIF\n- **Legacy** (error): BMP, TIFF, TIF\n\n### 3. Excessive File Size (`image-asset/excessive-file-size`)\n\n**Severity:** Error (>1MB), Warning (>500KB), Info (>200KB)\n**Description:** Image files should be compressed to reduce load time\n\n```typescript\n// ❌ Error - Too large (>1MB)\nconst tooLarge = {\n  src: 'example.jpg',\n  alt: 'Example',\n  size: 1.5 * 1024 * 1024\n};\n\n// ⚠️ Warning - Large (>500KB)\nconst large = {\n  src: 'example.jpg',\n  alt: 'Example',\n  size: 600 * 1024\n};\n\n// ℹ️ Info - Could be optimized (>200KB)\nconst moderate = {\n  src: 'example.jpg',\n  alt: 'Example',\n  size: 250 * 1024\n};\n\n// ✅ Valid - Optimized (<200KB)\nconst optimized = {\n  src: 'example.webp',\n  alt: 'Example',\n  size: 150 * 1024\n};\n```\n\n**Size Thresholds:**\n- Recommended: < 200KB\n- Maximum: < 500KB\n- Critical: < 1MB\n\n### 4. Excessive Dimensions (`image-asset/excessive-dimensions`)\n\n**Severity:** Error (>4096x2160), Warning (>2560x1440)\n**Description:** Image dimensions should match display requirements\n\n```typescript\n// ❌ Error - Excessive dimensions\nconst excessive = {\n  src: 'example.jpg',\n  alt: 'Example',\n  width: 5000,\n  height: 3000\n};\n\n// ⚠️ Warning - Large dimensions\nconst large = {\n  src: 'example.jpg',\n  alt: 'Example',\n  width: 3000,\n  height: 1600\n};\n\n// ✅ Valid - Reasonable dimensions\nconst reasonable = {\n  src: 'example.jpg',\n  alt: 'Example',\n  width: 1920,\n  height: 1080\n};\n```\n\n**Dimension Thresholds:**\n- Recommended: ≤ 2560x1440 (4K displays)\n- Critical: ≤ 4096x2160\n\n### 5. Missing Srcset (`image-asset/missing-srcset`)\n\n**Severity:** Warning\n**Description:** Large images should provide multiple sizes via srcset\n\n```typescript\n// ⚠️ Warning - Large image without srcset\nconst noSrcset = {\n  src: 'example.jpg',\n  alt: 'Example',\n  width: 1920,\n  height: 1080\n};\n\n// ✅ Valid - Has responsive srcset\nconst withSrcset = {\n  src: 'example.jpg',\n  alt: 'Example',\n  width: 1920,\n  height: 1080,\n  srcset: 'example-320w.jpg 320w, example-640w.jpg 640w, example.jpg 1920w',\n  sizes: '(max-width: 640px) 100vw, 640px'\n};\n\n// ✅ Valid - Small image doesn't need srcset\nconst smallImage = {\n  src: 'icon.png',\n  alt: 'Icon',\n  width: 64,\n  height: 64\n};\n```\n\n**Thresholds:**\n- Width > 800px OR Height > 600px: srcset recommended\n\n## Examples\n\n### Optimal Web Image\n\n```typescript\nconst optimalImage = {\n  src: 'hero.webp',\n  alt: 'Hero section showing our product dashboard',\n  format: 'webp',\n  size: 180 * 1024, // 180KB\n  width: 1920,\n  height: 1080,\n  srcset: 'hero-320w.webp 320w, hero-640w.webp 640w, hero-1280w.webp 1280w, hero.webp 1920w',\n  sizes: '(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px'\n};\n\nconst problems = await validateImageAsset(optimalImage);\n// Result: [] (no problems)\n```\n\n### Email-Safe Image\n\n```typescript\nconst emailImage = {\n  src: 'newsletter-banner.jpg',\n  alt: 'Monthly newsletter banner',\n  format: 'jpg',\n  size: 120 * 1024, // 120KB\n  width: 600,\n  height: 200\n};\n\nconst problems = await validateImageAsset(emailImage);\n// Result: [{ severity: 'warning', message: '...not optimal format...' }]\n// JPG acceptable for email compatibility\n```\n\n### Icon/Thumbnail\n\n```typescript\nconst icon = {\n  src: 'user-avatar.webp',\n  alt: 'User profile picture',\n  format: 'webp',\n  size: 8 * 1024, // 8KB\n  width: 150,\n  height: 150\n};\n\nconst problems = await validateImageAsset(icon);\n// Result: [] (no problems - small images don't need srcset)\n```\n\n## Integration Status\n\n- **Logger**: Not applicable (primitive validator)\n- **Docs-Suite**: Ready - Markdown documentation with code examples\n- **NeverHub**: Not applicable (primitive validator)\n\n## Best Practices\n\n### 1. Always Provide Alt Text\n\n```typescript\n// ❌ Bad\n<img src=\"product.jpg\" />\n\n// ✅ Good\n<img src=\"product.jpg\" alt=\"Red running shoes with white soles\" />\n```\n\n### 2. Use Modern Formats with Fallbacks\n\n```html\n<picture>\n  <source srcset=\"image.avif\" type=\"image/avif\">\n  <source srcset=\"image.webp\" type=\"image/webp\">\n  <img src=\"image.jpg\" alt=\"Fallback for older browsers\">\n</picture>\n```\n\n### 3. Implement Responsive Images\n\n```html\n<img\n  src=\"large.jpg\"\n  srcset=\"small.jpg 320w, medium.jpg 640w, large.jpg 1280w\"\n  sizes=\"(max-width: 640px) 100vw, 50vw\"\n  alt=\"Responsive image example\"\n/>\n```\n\n### 4. Optimize File Sizes\n\n- Use compression tools (ImageOptim, Squoosh, Sharp)\n- Target < 200KB for web images\n- Use progressive JPEG for large photos\n- Consider lazy loading for below-fold images\n\n### 5. Match Dimensions to Display\n\n- Don't serve 4K images for mobile devices\n- Use srcset to provide appropriate sizes\n- Consider device pixel ratio (2x, 3x for retina)\n\n## Testing\n\n```bash\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n\n# Run tests once (CI)\nnpm run test:run\n```\n\n## Development\n\n```bash\n# Build the package\nnpm run build\n\n# Watch mode for development\nnpm run dev\n\n# Lint code\nnpm run lint\n\n# Fix linting issues\nnpm run lint:fix\n\n# Clean build artifacts\nnpm run clean\n```\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\n## See Also\n\n- [@bernierllc/validators-core](../validators-core) - Core validation framework\n- [@bernierllc/validators-utils](../validators-utils) - Shared validation utilities\n- [@bernierllc/validators-a11y-contrast](../validators-a11y-contrast) - Accessibility contrast validation\n- [@bernierllc/validators-web](../validators-web) - Complete web page validation\n","readmeFilename":"README.md"}