# Images
Extract image attributes from raw HTML and run lightweight accessibility and technical audits.
```ts
import {
analyzeImageAlts,
analyzeImageDimensions,
analyzeImageLoading,
analyzeImages,
extractImages,
} from '@jvpdls/seo-tools/images';
```
## `extractImages(options)`
Returns a typed list of `
` elements and their most useful attributes.
### Result
```ts
{
images: Array<{
src: string | null;
originalSrc: string | null;
framework: 'next' | null;
optimizer: 'next' | null;
alt: string | null;
width: number | null;
height: number | null;
fill: boolean;
loading: string | null;
fetchPriority: string | null;
decoding: string | null;
title: string | null;
srcset: string | null;
sizes: string | null;
index: number;
}>;
warningCodes: ExtractImagesWarningCode[];
}
```
For HTML rendered by `next/image`, `src` keeps the browser-facing optimizer
URL while `originalSrc` contains the decoded source from the optimizer's `url`
parameter. `framework` identifies markup emitted by Next.js, and `optimizer`
identifies URLs served through its built-in `/_next/image` optimizer. For
regular images, `originalSrc` is the same as `src` and both identifier fields
are `null`.
### Warning codes
| Code | When |
| --- | --- |
| `EMPTY_INPUT` | Empty `html` string |
---
## `analyzeImageAlts(options)`
Counts missing, empty, and duplicate `alt` attributes.
### Result
```ts
{
total: number;
missingAlt: number;
emptyAlt: number;
duplicateAlt: number;
warningCodes: ImageAltWarningCode[];
}
```
### Warning codes
| Code | When |
| --- | --- |
| `EMPTY_INPUT` | Empty `html` string |
| `MISSING_ALT` | One or more images have no `alt` attribute |
| `EMPTY_ALT` | One or more images have an empty `alt` value |
| `DUPLICATE_ALT` | Repeated non-empty `alt` text found |
---
## `analyzeImageDimensions(options)`
Checks whether images declare `width` and `height`, and whether those dimensions are valid positive numbers. Next.js images rendered with `data-nimg="fill"` are treated as dimensionally valid because their dimensions come from the parent container.
### Result
```ts
{
total: number;
missingDimensions: number;
invalidDimensions: number;
warningCodes: ImageDimensionWarningCode[];
}
```
### Warning codes
| Code | When |
| --- | --- |
| `EMPTY_INPUT` | Empty `html` string |
| `MISSING_DIMENSIONS` | One or more images are missing `width` and/or `height` |
| `INVALID_DIMENSION_VALUE` | One or more images have non-positive dimensions |
---
## `analyzeImageLoading(options)`
Counts `loading="lazy"`, `loading="eager"`, and missing `loading` attributes. A Next.js image without `loading` (for example, one using `preload`) or any image with `fetchpriority="high"` is counted as eager instead of missing.
### Result
```ts
{
total: number;
lazy: number;
eager: number;
missingLoading: number;
warningCodes: ImageLoadingWarningCode[];
}
```
### Warning codes
| Code | When |
| --- | --- |
| `EMPTY_INPUT` | Empty `html` string |
| `MISSING_LOADING_ATTRIBUTE` | One or more images do not declare `loading` |
---
## `analyzeImages(options)`
Runs the main image checks in one call and returns the original extracted list for downstream automation.
### Next.js example
```ts
const result = analyzeImages({
html: `
`,
});
result.images[0]?.src;
// "/_next/image?url=%2Fhero.jpg&w=1200&q=75"
result.images[0]?.originalSrc;
// "/hero.jpg"
```
### Result
```ts
{
images: ImageItem[];
total: number;
missingAlt: number;
emptyAlt: number;
duplicateAlt: number;
missingDimensions: number;
invalidDimensions: number;
lazy: number;
eager: number;
missingLoading: number;
warningCodes: ImageAnalysisWarningCode[];
}
```