metalsmith-optimize-images 0.10.1 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/lib/index.cjs +12 -0
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -199,6 +199,32 @@ Add the `data-no-responsive` attribute to any image you don't want processed:
|
|
|
199
199
|
<img src="image.jpg" data-no-responsive alt="This image won't be processed" />
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
+
## Supported File Types
|
|
203
|
+
|
|
204
|
+
The plugin automatically processes raster images and skips vector graphics:
|
|
205
|
+
|
|
206
|
+
### ✅ Processed
|
|
207
|
+
- **JPEG** (`.jpg`, `.jpeg`)
|
|
208
|
+
- **PNG** (`.png`)
|
|
209
|
+
- **GIF** (`.gif`)
|
|
210
|
+
- **WebP** (`.webp`)
|
|
211
|
+
- **AVIF** (`.avif`)
|
|
212
|
+
|
|
213
|
+
### ❌ Automatically Skipped
|
|
214
|
+
- **SVG** (`.svg`) - Vector graphics don't need responsive raster variants
|
|
215
|
+
- **External URLs** (http/https)
|
|
216
|
+
- **Data URLs** (`data:image/...`)
|
|
217
|
+
- **Images with `data-no-responsive` attribute**
|
|
218
|
+
|
|
219
|
+
### Why SVGs are skipped
|
|
220
|
+
|
|
221
|
+
SVG files are vector graphics that scale perfectly at any resolution without quality loss. Creating multiple raster sizes and formats from SVGs would:
|
|
222
|
+
- Increase build time unnecessarily
|
|
223
|
+
- Generate larger file sizes than the original vector
|
|
224
|
+
- Lose the scalability benefits of SVG format
|
|
225
|
+
|
|
226
|
+
If you have SVG logos or icons, they will remain untouched and work perfectly as-is.
|
|
227
|
+
|
|
202
228
|
## Background Images
|
|
203
229
|
|
|
204
230
|
The plugin automatically processes images that aren't referenced in HTML for use as CSS background images. This feature is enabled by default (`processUnusedImages: true`).
|
package/lib/index.cjs
CHANGED
|
@@ -343,6 +343,12 @@ async function processImage({
|
|
|
343
343
|
return;
|
|
344
344
|
}
|
|
345
345
|
|
|
346
|
+
// Skip SVG files - they are vector graphics that don't need responsive raster variants
|
|
347
|
+
if (src.toLowerCase().endsWith('.svg')) {
|
|
348
|
+
debug(`Skipping SVG file (vector graphics don't need responsive variants): ${src}`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
|
|
346
352
|
// Normalize src path to match Metalsmith files object keys
|
|
347
353
|
// Remove leading slash if present (HTML paths vs Metalsmith file keys)
|
|
348
354
|
const normalizedSrc = src.startsWith('/') ? src.slice(1) : src;
|
|
@@ -999,6 +1005,12 @@ async function processProgressiveImage({
|
|
|
999
1005
|
return;
|
|
1000
1006
|
}
|
|
1001
1007
|
|
|
1008
|
+
// Skip SVG files - they are vector graphics that don't need responsive raster variants
|
|
1009
|
+
if (src.toLowerCase().endsWith('.svg')) {
|
|
1010
|
+
debug(`Skipping SVG file (vector graphics don't need responsive variants): ${src}`);
|
|
1011
|
+
return;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1002
1014
|
// Normalize src path to match Metalsmith files object keys
|
|
1003
1015
|
const normalizedSrc = src.startsWith('/') ? src.slice(1) : src;
|
|
1004
1016
|
|
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/config.js","../src/utils/hash.js","../src/utils/paths.js","../src/processors/imageProcessor.js","../src/processors/progressiveProcessor.js","../src/processors/htmlProcessor.js","../src/index.js"],"sourcesContent":["/**\n * Configuration utility for the plugin\n * Handles merging user options with sensible defaults\n */\n\n/**\n * Deep merge for objects\n * @param {Object} target - Target object\n * @param {Object} source - Source object\n * @return {Object} - Merged result\n */\n/*\nfunction deepMerge( target, source ) {\n const result = { ...target };\n\n for ( const key in source ) {\n if ( source[key] instanceof Object && key in target && target[key] instanceof Object ) {\n result[key] = deepMerge( target[key], source[key] );\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n*/\n\n// Modern functional approach to deep merge - handles nested objects properly\n// This is needed for formatOptions and placeholder options which are nested objects\nconst deepMerge = ( target, source ) =>\n Object.keys( source ).reduce(\n ( acc, key ) => ( {\n ...acc,\n [key]: source[key]?.constructor === Object ? deepMerge( target[key] || {}, source[key] ) : source[key]\n } ),\n { ...target }\n );\n\n/**\n * Builds configuration with sensible defaults\n * @param {Object} options - User provided plugin options\n * @return {Object} - Complete config with defaults\n */\nexport function buildConfig( options = {} ) {\n // Default configuration with sensible defaults\n const defaults = {\n // Responsive breakpoints to generate\n widths: [320, 640, 960, 1280, 1920],\n\n // Formats to generate in order of preference (first is most preferred)\n formats: ['avif', 'webp', 'original'],\n\n // Format-specific compression settings\n formatOptions: {\n avif: { quality: 65, speed: 5 }, // Better compression but slower\n webp: { quality: 80, lossless: false },\n jpeg: { quality: 85, progressive: true },\n png: { compressionLevel: 8, palette: true }\n },\n\n // Which HTML files to process\n htmlPattern: '**/*.html',\n\n // CSS selector for images to process\n imgSelector: 'img:not([data-no-responsive])',\n\n // Output directory for processed images (relative to Metalsmith destination)\n outputDir: 'assets/images/responsive',\n\n // Output naming pattern\n // Available tokens: [filename], [width], [format], [hash]\n outputPattern: '[filename]-[width]w-[hash].[format]',\n\n // Whether to skip generating sizes larger than original\n skipLarger: true,\n\n // Add loading=\"lazy\" to images\n lazy: true,\n\n // Add width and height attributes to prevent layout shift\n dimensionAttributes: true,\n\n // Default sizes attribute value for responsive images\n sizes: '(max-width: 768px) 100vw, 75vw',\n\n // Maximum number of images to process in parallel\n concurrency: 5,\n\n // Whether to generate a metadata JSON file\n generateMetadata: false,\n\n // Progressive loading options\n isProgressive: false, // TODO: Debug timeout issue in tests\n\n // Placeholder image settings for progressive loading\n placeholder: {\n width: 50,\n quality: 30,\n blur: 10\n },\n\n // Background image processing settings\n processUnusedImages: true, // Process images not found in HTML for background use\n imagePattern: '**/*.{jpg,jpeg,png,gif,webp,avif}' // Pattern to find images for background processing\n };\n\n // Special handling for formatOptions to ensure deep merging\n // This allows users to override specific format settings without losing defaults\n // e.g., { formatOptions: { jpeg: { quality: 90 } } } only changes JPEG quality\n if ( options && options.formatOptions ) {\n options = {\n ...options,\n formatOptions: deepMerge( defaults.formatOptions, options.formatOptions )\n };\n }\n\n // Special handling for placeholder options to ensure deep merging\n // Allows partial placeholder config like { placeholder: { width: 100 } }\n if ( options && options.placeholder ) {\n options = {\n ...options,\n placeholder: deepMerge( defaults.placeholder, options.placeholder )\n };\n }\n\n // Merge the defaults with user options\n return { ...defaults, ...( options || {} ) };\n}\n","/**\n * Utility for generating content hashes\n * Used for cache-busting - ensures filenames change when image content changes\n */\nimport crypto from 'crypto';\n\n/**\n * Generates a short hash based on image content\n * Creates an 8-character hash for cache-busting in filenames\n * @param {Buffer} buffer - The image buffer\n * @return {string} - A short hash string (8 characters)\n */\nexport function generateHash( buffer ) {\n // SHA-256 for cache-busting - using secure algorithm to satisfy security scanners\n // Only use first 8 characters to keep filenames manageable\n return crypto.createHash( 'sha256' ).update( buffer ).digest( 'hex' ).slice( 0, 8 );\n}\n","/**\n * Path utilities for image variants\n * Handles the filename pattern system with token replacement\n */\nimport path from 'path';\n\n/**\n * Generate variant filename using pattern\n * Applies token replacement to create output filenames\n * Tokens: [filename], [width], [format], [hash]\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format ('original' means keep source format)\n * @param {string} hash - Content hash for cache busting\n * @param {object} config - Plugin config options\n * @return {string} - Generated path relative to Metalsmith destination\n */\nexport function generateVariantPath( originalPath, width, format, hash, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format (e.g., 'jpeg' for image.jpg)\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Apply pattern replacements using the tokens system\n // Default pattern: '[filename]-[width]w-[hash].[format]'\n // Results in: 'image-320w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '[hash]', hash || '' );\n\n return path.join( config.outputDir, outputName );\n}\n","/**\n * Image processing utilities for creating responsive image variants\n * Handles the core Sharp.js operations for resizing and format conversion\n */\nimport sharp from 'sharp';\nimport fs from 'fs';\nimport path from 'path';\nimport { generateHash } from '../utils/hash.js';\nimport { generateVariantPath } from '../utils/paths.js';\n\n/**\n * Process an image into multiple responsive variants and formats\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nexport async function processImageToVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n const hash = generateHash( buffer );\n\n // Determine which widths to generate based on skipLarger setting\n // If skipLarger is true (default), don't generate sizes larger than original\n const targetWidths = config.skipLarger ? config.widths.filter( ( w ) => w <= metadata.width ) : config.widths;\n\n if ( targetWidths.length === 0 ) {\n debugFn( `Skipping ${originalPath} - no valid target widths` );\n return [];\n }\n\n // Process all widths in parallel for better performance\n const widthPromises = targetWidths.map( async ( width ) => {\n // Create a Sharp instance for this width - clone to avoid conflicts\n const resized = image.clone().resize( {\n width,\n withoutEnlargement: config.skipLarger // Prevents upscaling small images\n } );\n\n // Get actual dimensions after resize (may be smaller than requested width)\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this width\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations (e.g., webp -> original doesn't make sense)\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n let formatted;\n const outputPath = generateVariantPath( originalPath, width, format, hash, config );\n\n // Apply format-specific processing with quality/compression settings\n if ( format === 'original' ) {\n // For 'original' format, use the source image format\n const originalFormat = metadata.format.toLowerCase();\n const formatOptions = config.formatOptions[originalFormat] || {};\n formatted = resized.clone().toFormat( originalFormat, formatOptions );\n } else {\n // For specific formats (avif, webp, etc.), apply format-specific options\n const formatOptions = config.formatOptions[format] || {};\n if ( format === 'avif' ) {\n formatted = resized.clone().avif( formatOptions );\n } else if ( format === 'webp' ) {\n formatted = resized.clone().webp( formatOptions );\n } else if ( format === 'jpeg' ) {\n formatted = resized.clone().jpeg( formatOptions );\n } else if ( format === 'png' ) {\n formatted = resized.clone().png( formatOptions );\n } else {\n formatted = resized.clone()[format]( formatOptions );\n }\n }\n\n // Generate the actual image buffer - this is where compression happens\n const formatBuffer = await formatted.toBuffer();\n\n return {\n path: outputPath,\n buffer: formatBuffer,\n width,\n format: format === 'original' ? metadata.format.toLowerCase() : format,\n originalFormat: metadata.format.toLowerCase(),\n size: formatBuffer.length,\n height: resizedMeta.height\n };\n } catch ( err ) {\n debugFn( `Error generating ${format} variant for ${originalPath} at width ${width}: ${err.message}` );\n return null;\n }\n } );\n\n // Wait for all formats at this width to complete\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( v ) => v !== null );\n } );\n\n // Wait for all widths to complete and flatten the results\n const widthResults = await Promise.all( widthPromises );\n variants.push( ...widthResults.flat() );\n\n return variants;\n}\n\n/**\n * Process a single image\n * @param {Object} context - Processing context\n * @param {Object} context.$ - Cheerio instance\n * @param {Object} context.img - Image DOM element\n * @param {Object} context.files - Metalsmith files object\n * @param {Object} context.metalsmith - Metalsmith instance\n * @param {Map} context.processedImages - Cache of processed images\n * @param {Function} context.debug - Debug function\n * @param {Object} context.config - Plugin configuration\n * @param {Function} context.replacePictureElement - Function to replace img with picture\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nexport async function processImage( {\n $,\n img,\n files,\n metalsmith,\n processedImages,\n debug,\n config,\n replacePictureElement\n} ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n // Remove leading slash if present (HTML paths vs Metalsmith file keys)\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in Metalsmith files object - try to load it from the build directory\n // This handles cases where images were copied by other plugins (like assets)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting - this helps with incremental builds\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to Metalsmith files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key that includes the file path and modification time\n // This prevents reprocessing the same image multiple times in a single build\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this exact image (same file + mtime)\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const variants = processedImages.get( cacheKey );\n replacePictureElement( $, $img, variants, config );\n return;\n }\n\n debug( `Processing image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (different sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Save all generated variants to Metalsmith files object\n // This makes them available in the final build output\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache variants for this image to avoid reprocessing\n processedImages.set( cacheKey, variants );\n\n // Replace the original <img> tag with a responsive <picture> element\n replacePictureElement( $, $img, variants, config );\n } catch ( err ) {\n debug( `Error processing image: ${err.message}` );\n }\n}\n","/**\n * Progressive image loading processor\n * Handles placeholder generation and smooth loading transitions\n */\nimport sharp from 'sharp';\nimport path from 'path';\n\n/**\n * Generate placeholder image for progressive loading\n * Creates a small, blurred, low-quality version for instant display\n * @param {string} imagePath - Original image path\n * @param {Buffer} imageBuffer - Original image buffer\n * @param {Object} placeholderConfig - Placeholder configuration (width, quality, blur)\n * @param {Object} metalsmith - Metalsmith instance\n * @return {Promise<Object>} Placeholder data with path and contents\n */\nexport async function generatePlaceholder( imagePath, imageBuffer, placeholderConfig, metalsmith ) {\n const { width, quality, blur } = placeholderConfig;\n\n try {\n // Get original image dimensions for aspect ratio calculation\n const image = sharp( imageBuffer );\n const metadata = await image.metadata();\n\n // Process image: resize to small width, blur heavily, compress heavily\n const processed = await image\n .resize( width ) // Default: 50px wide\n .blur( blur ) // Default: 10px blur\n .jpeg( { quality } ) // Default: 30% quality\n .toBuffer();\n\n const fileName = `${path.basename( imagePath, path.extname( imagePath ) )}-placeholder.jpg`;\n const outputPath = path.join( 'assets/images/responsive', fileName );\n\n return {\n path: outputPath,\n contents: processed,\n fileName,\n originalWidth: metadata.width,\n originalHeight: metadata.height\n };\n } catch ( error ) {\n metalsmith.debug( 'metalsmith-optimize-images' )( `Error generating placeholder for ${imagePath}: ${error.message}` );\n throw error;\n }\n}\n\n/**\n * Create progressive wrapper HTML structure\n * Creates a container with both placeholder and high-res images for smooth transitions\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} placeholderData - Placeholder image data\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for progressive wrapper\n */\nexport function createProgressiveWrapper( $, $img, variants, placeholderData, _config ) {\n // Get original attributes\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n\n // Group variants by format - use only original format for progressive mode\n // Progressive mode focuses on smooth loading rather than format optimization\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Get original format variants (skip AVIF/WebP for progressive mode)\n // JavaScript will handle format detection dynamically\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n const originalVariants = originalFormat ? variantsByFormat[originalFormat] : [];\n\n if ( originalVariants.length === 0 ) {\n return $img.clone(); // Fallback if no variants\n }\n\n // Calculate aspect ratio using original image dimensions to prevent layout shift\n // Fallback to variant dimensions if placeholderData doesn't have original dimensions\n let aspectRatio;\n if ( placeholderData.originalWidth && placeholderData.originalHeight ) {\n aspectRatio = `${placeholderData.originalWidth}/${placeholderData.originalHeight}`;\n } else {\n // Fallback: use the largest variant for most accurate aspect ratio\n const largestVariant = [...originalVariants].sort( ( a, b ) => b.width - a.width )[0];\n aspectRatio = `${largestVariant.width}/${largestVariant.height}`;\n }\n\n // Find middle-sized variant for high-res image (good balance of quality/size)\n const highResVariant = originalVariants[Math.floor( originalVariants.length / 2 )];\n\n // Create wrapper div with modern CSS aspect-ratio\n const $wrapper = $( '<div>' )\n .addClass( 'responsive-wrapper js-progressive-image-wrapper' )\n .attr( 'style', `aspect-ratio: ${aspectRatio}` );\n\n // Add class from original image if present\n if ( className ) {\n $wrapper.addClass( className );\n }\n\n // Create low-res image (placeholder) - shown immediately\n const $lowRes = $( '<img>' ).addClass( 'low-res' ).attr( 'src', `/${placeholderData.path}` ).attr( 'alt', alt );\n\n // Create high-res image (empty with data source) - loaded by JavaScript\n const $highRes = $( '<img>' )\n .addClass( 'high-res' )\n .attr( 'src', '' )\n .attr( 'alt', alt )\n .attr( 'data-source', `/${highResVariant.path}` );\n\n // Assemble the progressive wrapper\n $lowRes.appendTo( $wrapper );\n $highRes.appendTo( $wrapper );\n\n return $wrapper;\n}\n\n/**\n * Create standard picture element HTML\n * Fallback function for when progressive loading fails\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for picture\n */\nexport function createStandardPicture( $, $img, variants, config ) {\n // Get original attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element with all formats (standard mode)\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order\n ['avif', 'webp'].forEach( ( format ) => {\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as img element\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n const defaultSrc = formatVariants[Math.floor( formatVariants.length / 2 )]?.path;\n\n // Create new img element\n const $newImg = $( '<img>' )\n .attr( 'src', defaultSrc ? `/${defaultSrc}` : src )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .attr( 'alt', alt )\n .attr( 'loading', 'lazy' );\n\n // Add class if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add width/height attributes if configured and available\n if ( config.dimensionAttributes && variants.length > 0 ) {\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n $newImg.appendTo( $picture );\n }\n\n return $picture;\n}\n\n/**\n * Progressive image loader JavaScript\n * Handles intersection observer, format detection, and smooth loading transitions\n */\nexport const progressiveImageLoader = `\n(function() {\n 'use strict';\n \n // Cache for detected format support\n let bestFormat = null;\n \n // Main function called when images enter the viewport\n const loadImage = function(entries, observer) {\n for (let entry of entries) {\n if (entry.isIntersecting) {\n const thisWrapper = entry.target;\n \n // Find the high res image in the wrapper\n const thisImage = thisWrapper.querySelector('.high-res');\n const thisImageSource = thisImage.dataset.source;\n \n if (!thisImageSource) {\n console.warn('No data-source found for high-res image');\n return;\n }\n \n // Apply format based on detected support\n let finalImageSource = thisImageSource;\n \n if (bestFormat === 'avif') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n // If 'original' or null, use original (no change needed)\n \n thisImage.src = finalImageSource;\n \n // Take this image off the observe list to prevent duplicate loading\n observer.unobserve(thisWrapper);\n \n // Once the hi-res image has been loaded, add done class to trigger CSS transition\n thisImage.onload = function() {\n thisWrapper.classList.add('done');\n };\n \n // Handle loading errors gracefully\n thisImage.onerror = function() {\n thisWrapper.classList.add('error');\n };\n }\n }\n };\n\n const init = async function() {\n // Detect best supported format first\n bestFormat = await detectBestFormat();\n \n // Check for Intersection Observer support (not available in older browsers)\n if (!('IntersectionObserver' in window)) {\n // Fallback: load all images immediately for older browsers\n document.querySelectorAll('.js-progressive-image-wrapper').forEach(function(wrapper) {\n const img = wrapper.querySelector('.high-res');\n if (img && img.dataset.source) {\n let finalImageSource = img.dataset.source;\n \n // Apply detected format for fallback\n if (bestFormat === 'avif') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n \n img.src = finalImageSource;\n wrapper.classList.add('done');\n }\n });\n return;\n }\n\n // Create intersection observer with 50px margin (loads images slightly before they're visible)\n const observer = new IntersectionObserver(loadImage, {\n rootMargin: '50px'\n });\n \n // Loop over all image wrappers and add to intersection observer\n const allImageWrappers = document.querySelectorAll('.js-progressive-image-wrapper');\n for (let imageWrapper of allImageWrappers) {\n observer.observe(imageWrapper);\n }\n };\n \n // Format detection using createImageBitmap - more reliable than canvas encoding\n async function detectBestFormat() {\n const fallbackFormat = 'original';\n \n if (!window.createImageBitmap) return fallbackFormat;\n \n const avifData = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABYAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSAAAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB5tZGF0EgAKBzgADlAgIGkyCR/wAABAAACvcA==';\n const webpData = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';\n \n try {\n const avifBlob = await fetch(avifData).then(r => r.blob());\n await createImageBitmap(avifBlob);\n return 'avif';\n } catch {\n try {\n const webpBlob = await fetch(webpData).then(r => r.blob());\n await createImageBitmap(webpBlob);\n return 'webp';\n } catch {\n return fallbackFormat;\n }\n }\n }\n\n // Initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n\n})();\n`;\n\n/**\n * Progressive image CSS styles\n * Handles aspect ratio, positioning, and smooth transitions between placeholder and high-res images\n */\nexport const progressiveImageCSS = `\n.responsive-wrapper {\n position: relative;\n overflow: hidden;\n background-color: #f0f0f0;\n}\n\n.responsive-wrapper .low-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper .high-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper.done .high-res {\n opacity: 1;\n}\n\n.responsive-wrapper.done .low-res {\n opacity: 0;\n}\n\n.responsive-wrapper.error .low-res {\n filter: none;\n}\n\n/* Ensure images are responsive */\n.responsive-wrapper img {\n max-width: 100%;\n height: auto;\n}\n`;\n","/**\n * HTML processing utilities for replacing img tags with responsive picture elements\n * Handles both standard and progressive loading modes\n */\nimport * as cheerio from 'cheerio';\nimport path from 'path';\nimport fs from 'fs';\nimport { processImage, processImageToVariants } from './imageProcessor.js';\nimport {\n generatePlaceholder,\n createProgressiveWrapper,\n createStandardPicture,\n progressiveImageCSS,\n progressiveImageLoader\n} from './progressiveProcessor.js';\n\n/**\n * Replace an img element with a responsive picture element\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Cheerio image element\n * @param {Array<Object>} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n */\nexport function replacePictureElement( $, $img, variants, config ) {\n if ( variants.length === 0 ) {\n return;\n }\n\n // Get original img attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format for creating <source> elements\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element that will contain all formats\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order (avif, webp, then original)\n // Browser will use the first format it supports\n config.formats.forEach( ( format ) => {\n // Skip 'original' placeholder - it's handled separately\n if ( format === 'original' ) {\n return;\n }\n\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width for proper srcset ordering\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string: \"path 320w, path 640w, path 960w\"\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element with format type and srcset\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as last source (fallback for browsers that don't support modern formats)\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n $( '<source>' )\n .attr( 'type', `image/${originalFormat}` )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .appendTo( $picture );\n }\n\n // Create new img element that serves as the final fallback\n const $newImg = $( '<img>' )\n .attr( 'src', src ) // Keep original as fallback for very old browsers\n .attr( 'alt', alt );\n\n // Preserve original class attribute if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add native lazy loading if configured (improves performance)\n if ( config.lazy ) {\n $newImg.attr( 'loading', 'lazy' );\n }\n\n // Add width/height attributes to prevent layout shift (CLS)\n if ( config.dimensionAttributes && variants.length > 0 ) {\n // Use the largest variant as reference for dimensions\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n // Copy any other attributes from original img (except ones we handle specially)\n for ( const attrib in $img[0].attribs ) {\n if ( !['src', 'alt', 'class', 'width', 'height', 'sizes'].includes( attrib ) ) {\n $newImg.attr( attrib, $img.attr( attrib ) );\n }\n }\n\n // Add img to picture element\n $newImg.appendTo( $picture );\n\n // Replace original img with picture element\n $img.replaceWith( $picture );\n}\n\n/**\n * Process an HTML file to replace img tags with responsive picture elements\n * @param {string} htmlFile - Path to HTML file\n * @param {Object} fileData - File data object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when the HTML file is processed\n */\nexport async function processHtmlFile( htmlFile, fileData, files, metalsmith, processedImages, debug, config ) {\n debug( `Processing HTML file: ${htmlFile}` );\n \n // Validate file.contents before processing\n if ( !fileData.contents || !Buffer.isBuffer( fileData.contents ) ) {\n debug( `Skipping ${htmlFile}: invalid or missing file contents` );\n return;\n }\n \n const content = fileData.contents.toString();\n\n // Parse HTML\n const $ = cheerio.load( content );\n\n // Find all images matching our selector (default: img:not([data-no-responsive]))\n const images = $( config.imgSelector );\n if ( images.length === 0 ) {\n debug( `No images found in ${htmlFile}` );\n return;\n }\n\n debug( `Found ${images.length} images in ${htmlFile}` );\n\n // Process images in parallel with a concurrency limit to prevent overwhelming the system\n const imageChunks = [];\n for ( let i = 0; i < images.length; i += config.concurrency ) {\n imageChunks.push( Array.from( images ).slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its images in parallel\n await Promise.all(\n imageChunks.map( async ( imageChunk ) => {\n // Process images within each chunk in parallel\n await Promise.all(\n imageChunk.map( ( img ) =>\n config.isProgressive\n ? processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } )\n : processImage( { $, img, files, metalsmith, processedImages, debug, config, replacePictureElement } )\n )\n );\n } )\n );\n\n // Inject progressive loading CSS and JavaScript if needed\n if ( config.isProgressive ) {\n injectProgressiveAssets( $ );\n }\n\n // Update file contents with modified HTML (converts back to Buffer)\n fileData.contents = Buffer.from( $.html() );\n}\n\n/**\n * Generate metadata file if configured\n * Creates a JSON manifest with information about all processed images\n * Useful for debugging or integration with other tools\n * @param {Map} processedImages - Cache of processed images\n * @param {Object} files - Metalsmith files object\n * @param {Object} config - Plugin configuration\n */\nexport function generateMetadata( processedImages, files, config ) {\n const metadataObj = {};\n processedImages.forEach( ( value, key ) => {\n // Extract the original path from the cache key (path:mtime)\n const [path] = key.split( ':' );\n\n // Handle both array format (from background processing) and object format (from HTML processing)\n const variants = Array.isArray( value ) ? value : value.variants;\n\n metadataObj[path] = variants.map( ( v ) => ( {\n path: v.path,\n width: v.width,\n height: v.height,\n format: v.format,\n size: v.size\n } ) );\n } );\n\n const metadataPath = path.join( config.outputDir, 'responsive-images-manifest.json' );\n files[metadataPath] = {\n contents: Buffer.from( JSON.stringify( metadataObj, null, 2 ) )\n };\n}\n\n/**\n * Process a single image with progressive loading\n * Creates low-quality placeholders and high-resolution images with smooth transitions\n * @param {Object} context - Processing context\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nasync function processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n debug( `Starting progressive processing for: ${src}` );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in files, try to load it from the build directory (same logic as processImage)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this image\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const { variants, placeholderData } = processedImages.get( cacheKey );\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n return;\n }\n\n debug( `Processing progressive image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Generate low-quality placeholder image for smooth loading transitions\n const placeholderData = await generatePlaceholder(\n normalizedSrc,\n files[normalizedSrc].contents,\n config.placeholder,\n metalsmith\n );\n\n // Save all variants to Metalsmith files\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Save placeholder to files\n files[placeholderData.path] = {\n contents: placeholderData.contents\n };\n\n // Cache variants and placeholder for this image\n processedImages.set( cacheKey, { variants, placeholderData } );\n\n // Create progressive wrapper with placeholder and high-res image\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n } catch ( err ) {\n debug( `Error processing progressive image: ${err.message}` );\n\n // Fallback to standard processing if progressive loading fails\n try {\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n const $picture = createStandardPicture( $, $img, variants, config );\n $img.replaceWith( $picture );\n } catch ( fallbackErr ) {\n debug( `Fallback processing also failed: ${fallbackErr.message}` );\n }\n }\n}\n\n/**\n * Inject progressive loading CSS and JavaScript assets\n * Only injects if progressive images are actually present on the page\n * @param {Object} $ - Cheerio instance\n */\nfunction injectProgressiveAssets( $ ) {\n // Check if progressive images exist on this page\n const hasProgressiveImages = $( '.js-progressive-image-wrapper' ).length > 0;\n\n if ( !hasProgressiveImages ) {\n return;\n }\n\n // Inject CSS styles for progressive loading (only once per page)\n if ( !$( '#progressive-image-styles' ).length ) {\n $( 'head' ).append( `<style id=\"progressive-image-styles\">${progressiveImageCSS}</style>` );\n }\n\n // Inject JavaScript for intersection observer and loading logic (only once per page)\n if ( !$( '#progressive-image-loader' ).length ) {\n $( 'body' ).append( `<script id=\"progressive-image-loader\">${progressiveImageLoader}</script>` );\n }\n}\n","/**\n * Metalsmith plugin for generating responsive images with optimal formats\n * @module metalsmith-optimize-images\n */\n\n/**\n * @typedef {Object} Options\n * @property {number[]} [widths=[320, 640, 960, 1280, 1920]] - Array of image widths to generate\n * @property {string[]} [formats=['avif', 'webp', 'original']] - Array of image formats to generate (in order of preference)\n * @property {Object} [formatOptions] - Format-specific compression settings\n * @property {Object} [formatOptions.avif] - AVIF compression options\n * @property {Object} [formatOptions.webp] - WebP compression options\n * @property {Object} [formatOptions.jpeg] - JPEG compression options\n * @property {Object} [formatOptions.png] - PNG compression options\n * @property {string} [htmlPattern='**\\/*.html'] - Glob pattern to match HTML files\n * @property {string} [imgSelector='img:not([data-no-responsive])'] - CSS selector for images to process\n * @property {string} [outputDir='assets/images/responsive'] - Output directory for processed images\n * @property {string} [outputPattern='[filename]-[width]w-[hash].[format]'] - Output naming pattern\n * @property {boolean} [skipLarger=true] - Whether to skip generating sizes larger than original\n * @property {boolean} [lazy=true] - Whether to add loading=\"lazy\" to images\n * @property {boolean} [dimensionAttributes=true] - Whether to add width/height attributes\n * @property {string} [sizes] - Default sizes attribute\n * @property {number} [concurrency=5] - Maximum number of images to process in parallel\n * @property {boolean} [generateMetadata=false] - Whether to generate a metadata JSON file\n * @property {boolean} [isProgressive=false] - Whether to use progressive image loading\n * @property {Object} [placeholder] - Placeholder image settings for progressive loading\n * @property {number} [placeholder.width=50] - Placeholder image width\n * @property {number} [placeholder.quality=30] - Placeholder image quality\n * @property {number} [placeholder.blur=10] - Placeholder image blur amount\n * @property {boolean} [processUnusedImages=true] - Whether to process unused images for background use\n * @property {string} [imagePattern='**\\/*.{jpg,jpeg,png,gif,webp,avif}'] - Glob pattern to find images for background processing\n * @property {string} [imageFolder='lib/assets/images'] - Folder to scan for background images, relative to source\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport * as mkdirp from 'mkdirp';\nimport sharp from 'sharp';\nimport { buildConfig } from './utils/config.js';\nimport { processHtmlFile, generateMetadata } from './processors/htmlProcessor.js';\n\n/**\n * Creates a responsive images plugin for Metalsmith\n * Generates multiple sizes and formats of images and replaces img tags with picture elements\n *\n * @param {Options} [options={}] - Configuration options for the plugin\n * @returns {import('metalsmith').Plugin} - Metalsmith plugin function\n */\nfunction optimizeImagesPlugin( options = {} ) {\n // Build configuration with defaults and user options\n const config = buildConfig( options );\n\n /**\n * The Metalsmith plugin function\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Function} done - Callback function\n * @return {void}\n */\n return async function optimizeImages( files, metalsmith, done ) {\n try {\n const destination = metalsmith.destination();\n const outputPath = path.join( destination, config.outputDir );\n\n // Set up debug function for logging (uses 'DEBUG=metalsmith-optimize-images*' env var)\n const debug = metalsmith.debug( 'metalsmith-optimize-images' );\n\n // Ensure the output directory exists where processed images will be saved\n mkdirp.mkdirpSync( outputPath );\n\n // Find all HTML files that match the pattern (default: **/*.html)\n // Also ensure they actually end with .html to avoid processing CSS/JS files\n const htmlFiles = Object.keys( files ).filter( ( file ) => {\n // Must match the HTML pattern\n if ( !metalsmith.match( config.htmlPattern, file ) ) {\n return false;\n }\n\n // Must actually be an HTML file\n if ( !file.endsWith( '.html' ) ) {\n return false;\n }\n\n return true;\n } );\n\n if ( htmlFiles.length === 0 ) {\n debug( 'No HTML files found' );\n return done();\n }\n\n // Cache to avoid re-processing identical images across different HTML files\n // Key: \"filepath:mtime\", Value: array of processed image variants\n const processedImages = new Map();\n\n // Chunk HTML files to respect concurrency limit (default: 5)\n // This prevents overwhelming the system with too many parallel operations\n const chunks = [];\n for ( let i = 0; i < htmlFiles.length; i += config.concurrency ) {\n chunks.push( htmlFiles.slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its files in parallel\n // This creates a two-level parallelism: chunk-level and file-level within chunks\n await Promise.all(\n chunks.map( async ( chunk ) => {\n // Process files within each chunk in parallel\n await Promise.all(\n chunk.map( async ( htmlFile ) => {\n // This function parses HTML, finds images, processes them, and updates the HTML\n await processHtmlFile( htmlFile, files[htmlFile], files, metalsmith, processedImages, debug, config );\n } )\n );\n } )\n );\n\n // Process unused images for background image support\n // This finds images that weren't processed during HTML scanning and creates variants\n // for use in CSS background-image with image-set()\n if ( config.processUnusedImages ) {\n await processUnusedImages( files, metalsmith, processedImages, debug, config );\n }\n\n // Optional: Generate a JSON metadata file with information about all processed images\n // Useful for debugging or integration with other tools\n if ( config.generateMetadata ) {\n generateMetadata( processedImages, files, config );\n }\n\n debug( 'Responsive images processing complete' );\n done();\n } catch ( err ) {\n // Use console.error for errors to ensure they're visible even if debug mode is not enabled\n console.error( `Error in responsive images plugin: ${err.message}` );\n done( err );\n }\n };\n}\n\n/**\n * Process unused images for background image support\n * Finds images that weren't processed during HTML scanning and creates 1x/2x variants\n * for use in CSS background-image with image-set()\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of already processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when processing is complete\n */\nasync function processUnusedImages( files, metalsmith, processedImages, debug, config ) {\n debug( 'Processing unused images for background image support' );\n\n // Get all image paths that were already processed during HTML scanning\n const processedImagePaths = new Set();\n processedImages.forEach( ( _variants, cacheKey ) => {\n const [imagePath] = cacheKey.split( ':' );\n processedImagePaths.add( imagePath );\n } );\n\n debug( `Processed image paths from HTML: ${Array.from( processedImagePaths ).join( ', ' )}` );\n\n // Find images that weren't processed during HTML scanning using hybrid approach\n const allBackgroundImages = await findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug );\n debug( `Background images found to process: ${allBackgroundImages.map( ( img ) => img.path ).join( ', ' )}` );\n\n if ( allBackgroundImages.length === 0 ) {\n debug( 'No unused images found to process' );\n return;\n }\n\n debug( `Found ${allBackgroundImages.length} unused images to process for background use` );\n\n // Process background images in parallel for better performance\n await Promise.all(\n allBackgroundImages.map( async ( imageObj ) => {\n try {\n debug( `Processing background image: ${imageObj.path} (source: ${imageObj.source})` );\n\n // Generate background variants with original size and half size\n const variants = await processBackgroundImageVariants( imageObj.buffer, imageObj.path, debug, config );\n\n // Save all generated variants to Metalsmith files object\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache the variants (using current timestamp as mtime for unused images)\n const cacheKey = `${imageObj.path}:${Date.now()}`;\n processedImages.set( cacheKey, variants );\n\n debug( `Generated ${variants.length} background variants for ${imageObj.path}` );\n } catch ( err ) {\n debug( `Error processing background image ${imageObj.path}: ${err.message}` );\n }\n } )\n );\n\n debug( 'Background image processing complete' );\n}\n\n/**\n * Find images that weren't processed during HTML scanning\n * Uses a hybrid approach: scans filesystem first, then falls back to Metalsmith files object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Object} config - Plugin configuration\n * @param {Set} processedImagePaths - Set of already processed image paths\n * @param {Function} debug - Debug function\n * @return {Promise<Array>} - Array of unprocessed image objects with {path, buffer}\n */\nasync function findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug ) {\n const unprocessedImages = [];\n const sourceImagesDir = path.join( metalsmith.source(), 'lib/assets/images' );\n\n debug( `Looking for unprocessed images using hybrid approach` );\n\n // Method 1: Scan filesystem (for real testbed scenario)\n try {\n debug( `Attempting to scan source directory: ${sourceImagesDir}` );\n debug( `Source directory exists: ${fs.existsSync( sourceImagesDir )}` );\n debug( `Metalsmith source: ${metalsmith.source()}` );\n debug( `Metalsmith destination: ${metalsmith.destination()}` );\n\n if ( fs.existsSync( sourceImagesDir ) ) {\n debug( `Scanning source directory: ${sourceImagesDir}` );\n\n const scanDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning subdirectory: ${item}` );\n scanDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant: ${itemRelativePath}` );\n continue;\n }\n\n const buildPath = path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem'\n } );\n }\n }\n }\n }\n };\n\n scanDirectory( sourceImagesDir );\n } else {\n debug( `Source directory does not exist, trying alternative paths...` );\n\n // Try alternative paths\n const altPaths = [\n path.join( metalsmith.source(), 'assets/images' ),\n path.join( metalsmith.source(), 'images' ),\n path.join( metalsmith.destination(), 'assets/images' ),\n path.join( process.cwd(), 'lib/assets/images' ),\n path.join( process.cwd(), 'src/assets/images' )\n ];\n\n for ( const altPath of altPaths ) {\n debug( `Trying alternative path: ${altPath} - exists: ${fs.existsSync( altPath )}` );\n if ( fs.existsSync( altPath ) ) {\n debug( `Found images at alternative path: ${altPath}` );\n\n // Scan the found alternative path\n const scanAlternativeDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in alternative path ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning alternative subdirectory: ${item}` );\n scanAlternativeDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant in alt scan: ${itemRelativePath}` );\n continue;\n }\n\n // For build directory, the path structure is already correct\n const buildPath = altPath.includes( 'build' )\n ? path.join( 'assets/images', itemRelativePath )\n : path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found alternative filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed alternative filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem-alt'\n } );\n }\n }\n }\n }\n };\n\n scanAlternativeDirectory( altPath );\n break; // Stop after finding and scanning the first valid path\n }\n }\n }\n } catch ( err ) {\n debug( `Error scanning filesystem: ${err.message}` );\n }\n\n // Method 2: Scan Metalsmith files object (for test scenarios and edge cases)\n debug( `Scanning Metalsmith files object` );\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n\n Object.keys( files ).forEach( ( filePath ) => {\n // Skip if not an image\n if ( !imageExtensions.some( ( ext ) => filePath.toLowerCase().endsWith( ext ) ) ) {\n return;\n }\n\n // Skip if it's already a responsive variant (comprehensive checks)\n if (\n filePath.startsWith( `${config.outputDir}/` ) ||\n filePath.includes( '/responsive/' ) ||\n filePath.includes( 'responsive-images-manifest.json' ) ||\n filePath.match( /-\\d+w(-[a-f0-9]+)?\\.(avif|webp|jpg|jpeg|png)$/i )\n ) {\n debug( `Skipping responsive variant in files object: ${filePath}` );\n return;\n }\n\n // Skip if already processed during HTML scanning\n if ( processedImagePaths.has( filePath ) ) {\n debug( `Skipping already processed files object image: ${filePath}` );\n return;\n }\n\n // Check if we already found this image from filesystem scan\n const isAlreadyFound = unprocessedImages.some( ( img ) => {\n // For files object images starting with 'images/', check if filesystem found the same file\n if ( filePath.startsWith( 'images/' ) ) {\n const relativePath = filePath.replace( 'images/', '' );\n return img.path === relativePath;\n }\n return false;\n } );\n\n if ( !isAlreadyFound ) {\n debug( `Found unprocessed files object image: ${filePath}` );\n unprocessedImages.push( {\n path: filePath,\n buffer: files[filePath].contents,\n source: 'files'\n } );\n }\n } );\n\n debug( `Found ${unprocessedImages.length} unprocessed images total` );\n return unprocessedImages;\n}\n\n/**\n * Process a background image to create 1x (original) and 2x (half-size) variants\n * for use with CSS image-set() for retina displays\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nasync function processBackgroundImageVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n\n debugFn( `Processing background image ${originalPath}: ${metadata.width}x${metadata.height}` );\n\n // Create 1x (original size) and 2x (half size) variants\n const sizes = [\n { width: metadata.width, density: '1x' },\n { width: Math.round( metadata.width / 2 ), density: '2x' }\n ];\n\n // Process both sizes in parallel\n const sizePromises = sizes.map( async ( size ) => {\n // Create a Sharp instance for this size\n const resized = image.clone().resize( {\n width: size.width,\n withoutEnlargement: true // Don't upscale images\n } );\n\n // Get actual dimensions after resize\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this size\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n // Determine output format and Sharp method\n let outputFormat = format;\n let sharpMethod = format;\n\n if ( format === 'original' ) {\n outputFormat = metadata.format.toLowerCase();\n sharpMethod = outputFormat === 'jpeg' ? 'jpeg' : outputFormat;\n }\n\n // Apply format-specific processing\n let processedImage = resized.clone();\n const formatOptions = config.formatOptions[format === 'original' ? outputFormat : format] || {};\n\n if ( sharpMethod === 'avif' ) {\n processedImage = processedImage.avif( formatOptions );\n } else if ( sharpMethod === 'webp' ) {\n processedImage = processedImage.webp( formatOptions );\n } else if ( sharpMethod === 'jpeg' ) {\n processedImage = processedImage.jpeg( formatOptions );\n } else if ( sharpMethod === 'png' ) {\n processedImage = processedImage.png( formatOptions );\n }\n\n // Generate output buffer\n const outputBuffer = await processedImage.toBuffer();\n\n // Generate variant path without hash for easier CSS usage\n const variantPath = generateBackgroundVariantPath( originalPath, size.width, outputFormat, config );\n\n debugFn( `Generated background variant: ${variantPath} (${size.density})` );\n\n return {\n path: variantPath,\n buffer: outputBuffer,\n width: resizedMeta.width,\n height: resizedMeta.height,\n format: outputFormat,\n density: size.density\n };\n } catch ( err ) {\n debugFn( `Error processing ${format} format for ${originalPath}: ${err.message}` );\n return null;\n }\n } );\n\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( result ) => result !== null );\n } );\n\n const sizeResults = await Promise.all( sizePromises );\n\n // Flatten the results\n sizeResults.forEach( ( formatVariants ) => {\n variants.push( ...formatVariants );\n } );\n\n debugFn( `Generated ${variants.length} background variants for ${originalPath}` );\n return variants;\n}\n\n/**\n * Generate background image variant path without hash for easier CSS usage\n * Creates predictable filenames that can be written in CSS without knowing the hash\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format\n * @param {Object} config - Plugin configuration\n * @return {string} - Generated path without hash\n */\nfunction generateBackgroundVariantPath( originalPath, width, format, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Create background pattern without hash: '[filename]-[width]w.[format]'\n // Results in: 'header1-1000w.webp' instead of 'header1-1000w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '-[hash]', '' ) // Remove hash placeholder and preceding dash\n .replace( '[hash]', '' ); // Remove any remaining hash placeholder\n\n return path.join( config.outputDir, outputName );\n}\n\n// Set function name for better debugging\nObject.defineProperty( optimizeImagesPlugin, 'name', { \n value: 'metalsmith-optimize-images' \n} );\n\nexport default optimizeImagesPlugin;\n"],"names":["deepMerge","target","source","Object","keys","reduce","acc","key","_source$key","constructor","buildConfig","options","defaults","widths","formats","formatOptions","avif","quality","speed","webp","lossless","jpeg","progressive","png","compressionLevel","palette","htmlPattern","imgSelector","outputDir","outputPattern","skipLarger","lazy","dimensionAttributes","sizes","concurrency","generateMetadata","isProgressive","placeholder","width","blur","processUnusedImages","imagePattern","generateHash","buffer","crypto","createHash","update","digest","slice","generateVariantPath","originalPath","format","hash","config","parsedPath","path","parse","originalFormat","ext","toLowerCase","outputFormat","outputName","replace","name","join","processImageToVariants","debugFn","image","sharp","metadata","variants","targetWidths","filter","w","length","widthPromises","map","resized","clone","resize","withoutEnlargement","resizedMeta","formatPromises","formatted","outputPath","toFormat","formatBuffer","toBuffer","size","height","err","message","formatResults","Promise","all","v","widthResults","push","flat","processImage","$","img","files","metalsmith","processedImages","debug","replacePictureElement","$img","src","attr","startsWith","normalizedSrc","destination","imagePath","fs","existsSync","imageBuffer","readFileSync","mtime","statSync","mtimeMs","contents","fileMtime","Date","now","cacheKey","has","get","forEach","variant","set","generatePlaceholder","placeholderConfig","processed","fileName","basename","extname","originalWidth","originalHeight","error","createProgressiveWrapper","placeholderData","_config","alt","className","variantsByFormat","find","f","originalVariants","aspectRatio","largestVariant","sort","a","b","highResVariant","Math","floor","$wrapper","addClass","$lowRes","$highRes","appendTo","createStandardPicture","sizesAttr","$picture","formatVariants","srcset","_formatVariants$Math$","defaultSrc","$newImg","progressiveImageLoader","progressiveImageCSS","attrib","attribs","includes","replaceWith","processHtmlFile","htmlFile","fileData","Buffer","isBuffer","content","toString","cheerio","load","images","imageChunks","i","Array","from","imageChunk","processProgressiveImage","injectProgressiveAssets","html","metadataObj","value","split","isArray","metadataPath","JSON","stringify","fallbackErr","hasProgressiveImages","append","optimizeImagesPlugin","optimizeImages","done","mkdirp","mkdirpSync","htmlFiles","file","match","endsWith","Map","chunks","chunk","console","processedImagePaths","Set","_variants","add","allBackgroundImages","findUnprocessedImages","imageObj","processBackgroundImageVariants","unprocessedImages","sourceImagesDir","scanDirectory","dir","relativePath","items","readdirSync","item","fullPath","itemRelativePath","isDirectory","imageExtensions","some","buildPath","normalizedBuildPath","altPaths","process","cwd","altPath","scanAlternativeDirectory","filePath","isAlreadyFound","density","round","sizePromises","sharpMethod","processedImage","outputBuffer","variantPath","generateBackgroundVariantPath","result","sizeResults","defineProperty"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAMA,SAAS,GAAGA,CAAEC,MAAM,EAAEC,MAAM,KAChCC,MAAM,CAACC,IAAI,CAAEF,MAAO,CAAC,CAACG,MAAM,CAC1B,CAAEC,GAAG,EAAEC,GAAG,KAAA;AAAA,EAAA,IAAAC,WAAA,CAAA;EAAA,OAAQ;AAChB,IAAA,GAAGF,GAAG;AACN,IAAA,CAACC,GAAG,GAAG,CAAAC,CAAAA,WAAA,GAAAN,MAAM,CAACK,GAAG,CAAC,qBAAXC,WAAA,CAAaC,WAAW,MAAKN,MAAM,GAAGH,SAAS,CAAEC,MAAM,CAACM,GAAG,CAAC,IAAI,EAAE,EAAEL,MAAM,CAACK,GAAG,CAAE,CAAC,GAAGL,MAAM,CAACK,GAAG,CAAA;GACtG,CAAA;AAAA,CAAE,EACH;EAAE,GAAGN,MAAAA;AAAO,CACd,CAAC,CAAA;;AAEH;AACA;AACA;AACA;AACA;AACO,SAASS,WAAWA,CAAEC,OAAO,GAAG,EAAE,EAAG;AAC1C;AACA,EAAA,MAAMC,QAAQ,GAAG;AACf;IACAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;AAEnC;AACAC,IAAAA,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;AAErC;AACAC,IAAAA,aAAa,EAAE;AACbC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,OAAO,EAAE,EAAE;AAAEC,QAAAA,KAAK,EAAE,CAAA;OAAG;AAAE;AACjCC,MAAAA,IAAI,EAAE;AAAEF,QAAAA,OAAO,EAAE,EAAE;AAAEG,QAAAA,QAAQ,EAAE,KAAA;OAAO;AACtCC,MAAAA,IAAI,EAAE;AAAEJ,QAAAA,OAAO,EAAE,EAAE;AAAEK,QAAAA,WAAW,EAAE,IAAA;OAAM;AACxCC,MAAAA,GAAG,EAAE;AAAEC,QAAAA,gBAAgB,EAAE,CAAC;AAAEC,QAAAA,OAAO,EAAE,IAAA;AAAK,OAAA;KAC3C;AAED;AACAC,IAAAA,WAAW,EAAE,WAAW;AAExB;AACAC,IAAAA,WAAW,EAAE,+BAA+B;AAE5C;AACAC,IAAAA,SAAS,EAAE,0BAA0B;AAErC;AACA;AACAC,IAAAA,aAAa,EAAE,qCAAqC;AAEpD;AACAC,IAAAA,UAAU,EAAE,IAAI;AAEhB;AACAC,IAAAA,IAAI,EAAE,IAAI;AAEV;AACAC,IAAAA,mBAAmB,EAAE,IAAI;AAEzB;AACAC,IAAAA,KAAK,EAAE,gCAAgC;AAEvC;AACAC,IAAAA,WAAW,EAAE,CAAC;AAEd;AACAC,IAAAA,gBAAgB,EAAE,KAAK;AAEvB;AACAC,IAAAA,aAAa,EAAE,KAAK;AAAE;;AAEtB;AACAC,IAAAA,WAAW,EAAE;AACXC,MAAAA,KAAK,EAAE,EAAE;AACTrB,MAAAA,OAAO,EAAE,EAAE;AACXsB,MAAAA,IAAI,EAAE,EAAA;KACP;AAED;AACAC,IAAAA,mBAAmB,EAAE,IAAI;AAAE;IAC3BC,YAAY,EAAE,mCAAmC;GAClD,CAAA;;AAED;AACA;AACA;AACA,EAAA,IAAK9B,OAAO,IAAIA,OAAO,CAACI,aAAa,EAAG;AACtCJ,IAAAA,OAAO,GAAG;AACR,MAAA,GAAGA,OAAO;MACVI,aAAa,EAAEf,SAAS,CAAEY,QAAQ,CAACG,aAAa,EAAEJ,OAAO,CAACI,aAAc,CAAA;KACzE,CAAA;AACH,GAAA;;AAEA;AACA;AACA,EAAA,IAAKJ,OAAO,IAAIA,OAAO,CAAC0B,WAAW,EAAG;AACpC1B,IAAAA,OAAO,GAAG;AACR,MAAA,GAAGA,OAAO;MACV0B,WAAW,EAAErC,SAAS,CAAEY,QAAQ,CAACyB,WAAW,EAAE1B,OAAO,CAAC0B,WAAY,CAAA;KACnE,CAAA;AACH,GAAA;;AAEA;EACA,OAAO;AAAE,IAAA,GAAGzB,QAAQ;IAAE,IAAKD,OAAO,IAAI,EAAE,CAAA;GAAI,CAAA;AAC9C;;AC/HA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS+B,YAAYA,CAAEC,MAAM,EAAG;AACrC;AACA;EACA,OAAOC,0BAAM,CAACC,UAAU,CAAE,QAAS,CAAC,CAACC,MAAM,CAAEH,MAAO,CAAC,CAACI,MAAM,CAAE,KAAM,CAAC,CAACC,KAAK,CAAE,CAAC,EAAE,CAAE,CAAC,CAAA;AACrF;;AChBA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAAEC,YAAY,EAAEZ,KAAK,EAAEa,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAG;AAC/E,EAAA,MAAMC,UAAU,GAAGC,wBAAI,CAACC,KAAK,CAAEN,YAAa,CAAC,CAAA;AAC7C,EAAA,MAAMO,cAAc,GAAGH,UAAU,CAACI,GAAG,CAACV,KAAK,CAAE,CAAE,CAAC,CAACW,WAAW,EAAE,CAAA;;AAE9D;EACA,MAAMC,YAAY,GAAGT,MAAM,KAAK,UAAU,GAAGM,cAAc,GAAGN,MAAM,CAAA;;AAEpE;AACA;AACA;AACA,EAAA,MAAMU,UAAU,GAAGR,MAAM,CAACxB,aAAa,CACpCiC,OAAO,CAAE,YAAY,EAAER,UAAU,CAACS,IAAK,CAAC,CACxCD,OAAO,CAAE,SAAS,EAAExB,KAAM,CAAC,CAC3BwB,OAAO,CAAE,UAAU,EAAEF,YAAa,CAAC,CACnCE,OAAO,CAAE,QAAQ,EAAEV,IAAI,IAAI,EAAG,CAAC,CAAA;EAElC,OAAOG,wBAAI,CAACS,IAAI,CAAEX,MAAM,CAACzB,SAAS,EAAEiC,UAAW,CAAC,CAAA;AAClD;;AClCA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeI,sBAAsBA,CAAEtB,MAAM,EAAEO,YAAY,EAAEgB,OAAO,EAAEb,MAAM,EAAG;AACpF,EAAA,MAAMc,KAAK,GAAGC,yBAAK,CAAEzB,MAAO,CAAC,CAAA;AAC7B,EAAA,MAAM0B,QAAQ,GAAG,MAAMF,KAAK,CAACE,QAAQ,EAAE,CAAA;EACvC,MAAMC,QAAQ,GAAG,EAAE,CAAA;AACnB,EAAA,MAAMlB,IAAI,GAAGV,YAAY,CAAEC,MAAO,CAAC,CAAA;;AAEnC;AACA;EACA,MAAM4B,YAAY,GAAGlB,MAAM,CAACvB,UAAU,GAAGuB,MAAM,CAACxC,MAAM,CAAC2D,MAAM,CAAIC,CAAC,IAAMA,CAAC,IAAIJ,QAAQ,CAAC/B,KAAM,CAAC,GAAGe,MAAM,CAACxC,MAAM,CAAA;AAE7G,EAAA,IAAK0D,YAAY,CAACG,MAAM,KAAK,CAAC,EAAG;AAC/BR,IAAAA,OAAO,CAAE,CAAA,SAAA,EAAYhB,YAAY,CAAA,yBAAA,CAA4B,CAAC,CAAA;AAC9D,IAAA,OAAO,EAAE,CAAA;AACX,GAAA;;AAEA;EACA,MAAMyB,aAAa,GAAGJ,YAAY,CAACK,GAAG,CAAE,MAAQtC,KAAK,IAAM;AACzD;IACA,MAAMuC,OAAO,GAAGV,KAAK,CAACW,KAAK,EAAE,CAACC,MAAM,CAAE;MACpCzC,KAAK;AACL0C,MAAAA,kBAAkB,EAAE3B,MAAM,CAACvB,UAAU;AACvC,KAAE,CAAC,CAAA;;AAEH;AACA,IAAA,MAAMmD,WAAW,GAAG,MAAMJ,OAAO,CAACR,QAAQ,EAAE,CAAA;;AAE5C;IACA,MAAMa,cAAc,GAAG7B,MAAM,CAACvC,OAAO,CAAC8D,GAAG,CAAE,MAAQzB,MAAM,IAAM;MAC7D,IAAI;AACF;AACA,QAAA,IAAKA,MAAM,KAAK,UAAU,IAAIkB,QAAQ,CAAClB,MAAM,CAACQ,WAAW,EAAE,KAAK,MAAM,EAAG;AACvE,UAAA,OAAO,IAAI,CAAA;AACb,SAAA;AAEA,QAAA,IAAIwB,SAAS,CAAA;AACb,QAAA,MAAMC,UAAU,GAAGnC,mBAAmB,CAAEC,YAAY,EAAEZ,KAAK,EAAEa,MAAM,EAAEC,IAAI,EAAEC,MAAO,CAAC,CAAA;;AAEnF;QACA,IAAKF,MAAM,KAAK,UAAU,EAAG;AAC3B;UACA,MAAMM,cAAc,GAAGY,QAAQ,CAAClB,MAAM,CAACQ,WAAW,EAAE,CAAA;UACpD,MAAM5C,aAAa,GAAGsC,MAAM,CAACtC,aAAa,CAAC0C,cAAc,CAAC,IAAI,EAAE,CAAA;AAChE0B,UAAAA,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAACO,QAAQ,CAAE5B,cAAc,EAAE1C,aAAc,CAAC,CAAA;AACvE,SAAC,MAAM;AACL;UACA,MAAMA,aAAa,GAAGsC,MAAM,CAACtC,aAAa,CAACoC,MAAM,CAAC,IAAI,EAAE,CAAA;UACxD,IAAKA,MAAM,KAAK,MAAM,EAAG;YACvBgC,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAAC9D,IAAI,CAAED,aAAc,CAAC,CAAA;AACnD,WAAC,MAAM,IAAKoC,MAAM,KAAK,MAAM,EAAG;YAC9BgC,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAAC3D,IAAI,CAAEJ,aAAc,CAAC,CAAA;AACnD,WAAC,MAAM,IAAKoC,MAAM,KAAK,MAAM,EAAG;YAC9BgC,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAACzD,IAAI,CAAEN,aAAc,CAAC,CAAA;AACnD,WAAC,MAAM,IAAKoC,MAAM,KAAK,KAAK,EAAG;YAC7BgC,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAACvD,GAAG,CAAER,aAAc,CAAC,CAAA;AAClD,WAAC,MAAM;YACLoE,SAAS,GAAGN,OAAO,CAACC,KAAK,EAAE,CAAC3B,MAAM,CAAC,CAAEpC,aAAc,CAAC,CAAA;AACtD,WAAA;AACF,SAAA;;AAEA;AACA,QAAA,MAAMuE,YAAY,GAAG,MAAMH,SAAS,CAACI,QAAQ,EAAE,CAAA;QAE/C,OAAO;AACLhC,UAAAA,IAAI,EAAE6B,UAAU;AAChBzC,UAAAA,MAAM,EAAE2C,YAAY;UACpBhD,KAAK;AACLa,UAAAA,MAAM,EAAEA,MAAM,KAAK,UAAU,GAAGkB,QAAQ,CAAClB,MAAM,CAACQ,WAAW,EAAE,GAAGR,MAAM;AACtEM,UAAAA,cAAc,EAAEY,QAAQ,CAAClB,MAAM,CAACQ,WAAW,EAAE;UAC7C6B,IAAI,EAAEF,YAAY,CAACZ,MAAM;UACzBe,MAAM,EAAER,WAAW,CAACQ,MAAAA;SACrB,CAAA;OACF,CAAC,OAAQC,GAAG,EAAG;AACdxB,QAAAA,OAAO,CAAE,CAAA,iBAAA,EAAoBf,MAAM,CAAA,aAAA,EAAgBD,YAAY,CAAA,UAAA,EAAaZ,KAAK,CAAA,EAAA,EAAKoD,GAAG,CAACC,OAAO,CAAA,CAAG,CAAC,CAAA;AACrG,QAAA,OAAO,IAAI,CAAA;AACb,OAAA;AACF,KAAE,CAAC,CAAA;;AAEH;IACA,MAAMC,aAAa,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAEZ,cAAe,CAAC,CAAA;IACzD,OAAOU,aAAa,CAACpB,MAAM,CAAIuB,CAAC,IAAMA,CAAC,KAAK,IAAK,CAAC,CAAA;AACpD,GAAE,CAAC,CAAA;;AAEH;EACA,MAAMC,YAAY,GAAG,MAAMH,OAAO,CAACC,GAAG,CAAEnB,aAAc,CAAC,CAAA;EACvDL,QAAQ,CAAC2B,IAAI,CAAE,GAAGD,YAAY,CAACE,IAAI,EAAG,CAAC,CAAA;AAEvC,EAAA,OAAO5B,QAAQ,CAAA;AACjB,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAe6B,YAAYA,CAAE;EAClCC,CAAC;EACDC,GAAG;EACHC,KAAK;EACLC,UAAU;EACVC,eAAe;EACfC,KAAK;EACLpD,MAAM;AACNqD,EAAAA,qBAAAA;AACF,CAAC,EAAG;AACF,EAAA,MAAMC,IAAI,GAAGP,CAAC,CAAEC,GAAI,CAAC,CAAA;AACrB,EAAA,MAAMO,GAAG,GAAGD,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,CAAA;AAE9B,EAAA,IAAK,CAACD,GAAG,IAAIA,GAAG,CAACE,UAAU,CAAE,MAAO,CAAC,IAAIF,GAAG,CAACE,UAAU,CAAE,OAAQ,CAAC,EAAG;AACnEL,IAAAA,KAAK,CAAE,CAAA,+BAAA,EAAkCG,GAAG,CAAA,CAAG,CAAC,CAAA;AAChD,IAAA,OAAA;AACF,GAAA;;AAEA;AACA;AACA,EAAA,MAAMG,aAAa,GAAGH,GAAG,CAACE,UAAU,CAAE,GAAI,CAAC,GAAGF,GAAG,CAAC5D,KAAK,CAAE,CAAE,CAAC,GAAG4D,GAAG,CAAA;;AAElE;AACA;AACA,EAAA,IAAK,CAACN,KAAK,CAACS,aAAa,CAAC,EAAG;IAC3B,IAAI;AACF,MAAA,MAAMC,WAAW,GAAGT,UAAU,CAACS,WAAW,EAAE,CAAA;MAC5C,MAAMC,SAAS,GAAG1D,wBAAI,CAACS,IAAI,CAAEgD,WAAW,EAAED,aAAc,CAAC,CAAA;AAEzD,MAAA,IAAKG,sBAAE,CAACC,UAAU,CAAEF,SAAU,CAAC,EAAG;AAChC;AACA,QAAA,MAAMG,WAAW,GAAGF,sBAAE,CAACG,YAAY,CAAEJ,SAAU,CAAC,CAAA;;AAEhD;QACA,MAAMK,KAAK,GAAGJ,sBAAE,CAACK,QAAQ,CAAEN,SAAU,CAAC,CAACO,OAAO,CAAA;;AAE9C;QACAlB,KAAK,CAACS,aAAa,CAAC,GAAG;AACrBU,UAAAA,QAAQ,EAAEL,WAAW;AACrBE,UAAAA,KAAAA;SACD,CAAA;AACH,OAAC,MAAM;AACLb,QAAAA,KAAK,CAAE,CAAA,0BAAA,EAA6BM,aAAa,CAAA,CAAG,CAAC,CAAA;AACrD,QAAA,OAAA;AACF,OAAA;KACD,CAAC,OAAQrB,GAAG,EAAG;AACde,MAAAA,KAAK,CAAE,CAAgDf,6CAAAA,EAAAA,GAAG,CAACC,OAAO,EAAG,CAAC,CAAA;AACtE,MAAA,OAAA;AACF,KAAA;AACF,GAAA;;AAEA;AACA;AACA,EAAA,MAAM+B,SAAS,GAAGpB,KAAK,CAACS,aAAa,CAAC,CAACO,KAAK,IAAIK,IAAI,CAACC,GAAG,EAAE,CAAA;AAC1D,EAAA,MAAMC,QAAQ,GAAG,CAAA,EAAGd,aAAa,CAAA,CAAA,EAAIW,SAAS,CAAE,CAAA,CAAA;;AAEhD;AACA,EAAA,IAAKlB,eAAe,CAACsB,GAAG,CAAED,QAAS,CAAC,EAAG;AACrCpB,IAAAA,KAAK,CAAE,CAAA,0BAAA,EAA6BM,aAAa,CAAA,CAAG,CAAC,CAAA;AACrD,IAAA,MAAMzC,QAAQ,GAAGkC,eAAe,CAACuB,GAAG,CAAEF,QAAS,CAAC,CAAA;IAChDnB,qBAAqB,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAO,CAAC,CAAA;AAClD,IAAA,OAAA;AACF,GAAA;AAEAoD,EAAAA,KAAK,CAAE,CAAA,kBAAA,EAAqBM,aAAa,CAAA,CAAG,CAAC,CAAA;EAE7C,IAAI;AACF;AACA,IAAA,MAAMzC,QAAQ,GAAG,MAAML,sBAAsB,CAAEqC,KAAK,CAACS,aAAa,CAAC,CAACU,QAAQ,EAAEV,aAAa,EAAEN,KAAK,EAAEpD,MAAO,CAAC,CAAA;;AAE5G;AACA;AACAiB,IAAAA,QAAQ,CAAC0D,OAAO,CAAIC,OAAO,IAAM;AAC/B3B,MAAAA,KAAK,CAAC2B,OAAO,CAAC1E,IAAI,CAAC,GAAG;QACpBkE,QAAQ,EAAEQ,OAAO,CAACtF,MAAAA;OACnB,CAAA;AACH,KAAE,CAAC,CAAA;;AAEH;AACA6D,IAAAA,eAAe,CAAC0B,GAAG,CAAEL,QAAQ,EAAEvD,QAAS,CAAC,CAAA;;AAEzC;IACAoC,qBAAqB,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAO,CAAC,CAAA;GACnD,CAAC,OAAQqC,GAAG,EAAG;AACde,IAAAA,KAAK,CAAE,CAA2Bf,wBAAAA,EAAAA,GAAG,CAACC,OAAO,EAAG,CAAC,CAAA;AACnD,GAAA;AACF;;AC9MA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAewC,mBAAmBA,CAAElB,SAAS,EAAEG,WAAW,EAAEgB,iBAAiB,EAAE7B,UAAU,EAAG;EACjG,MAAM;IAAEjE,KAAK;IAAErB,OAAO;AAAEsB,IAAAA,IAAAA;AAAK,GAAC,GAAG6F,iBAAiB,CAAA;EAElD,IAAI;AACF;AACA,IAAA,MAAMjE,KAAK,GAAGC,yBAAK,CAAEgD,WAAY,CAAC,CAAA;AAClC,IAAA,MAAM/C,QAAQ,GAAG,MAAMF,KAAK,CAACE,QAAQ,EAAE,CAAA;;AAEvC;IACA,MAAMgE,SAAS,GAAG,MAAMlE,KAAK,CAC1BY,MAAM,CAAEzC,KAAM,CAAC;AAAC,KAChBC,IAAI,CAAEA,IAAK,CAAC;AAAC,KACblB,IAAI,CAAE;AAAEJ,MAAAA,OAAAA;AAAQ,KAAE,CAAC;KACnBsE,QAAQ,EAAE,CAAA;AAEb,IAAA,MAAM+C,QAAQ,GAAG,CAAA,EAAG/E,wBAAI,CAACgF,QAAQ,CAAEtB,SAAS,EAAE1D,wBAAI,CAACiF,OAAO,CAAEvB,SAAU,CAAE,CAAC,CAAkB,gBAAA,CAAA,CAAA;IAC3F,MAAM7B,UAAU,GAAG7B,wBAAI,CAACS,IAAI,CAAE,0BAA0B,EAAEsE,QAAS,CAAC,CAAA;IAEpE,OAAO;AACL/E,MAAAA,IAAI,EAAE6B,UAAU;AAChBqC,MAAAA,QAAQ,EAAEY,SAAS;MACnBC,QAAQ;MACRG,aAAa,EAAEpE,QAAQ,CAAC/B,KAAK;MAC7BoG,cAAc,EAAErE,QAAQ,CAACoB,MAAAA;KAC1B,CAAA;GACF,CAAC,OAAQkD,KAAK,EAAG;AAChBpC,IAAAA,UAAU,CAACE,KAAK,CAAE,4BAA6B,CAAC,CAAE,CAAoCQ,iCAAAA,EAAAA,SAAS,CAAK0B,EAAAA,EAAAA,KAAK,CAAChD,OAAO,EAAG,CAAC,CAAA;AACrH,IAAA,MAAMgD,KAAK,CAAA;AACb,GAAA;AACF,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,wBAAwBA,CAAExC,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEuE,eAAe,EAAEC,OAAO,EAAG;AACtF;EACA,MAAMC,GAAG,GAAGpC,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,IAAI,EAAE,CAAA;EACpC,MAAMmC,SAAS,GAAGrC,IAAI,CAACE,IAAI,CAAE,OAAQ,CAAC,IAAI,EAAE,CAAA;;AAE5C;AACA;EACA,MAAMoC,gBAAgB,GAAG,EAAE,CAAA;AAC3B3E,EAAAA,QAAQ,CAAC0D,OAAO,CAAIjC,CAAC,IAAM;AACzB,IAAA,IAAK,CAACkD,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,EAAG;AACjC8F,MAAAA,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,GAAG,EAAE,CAAA;AACjC,KAAA;IACA8F,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,CAAC8C,IAAI,CAAEF,CAAE,CAAC,CAAA;AACtC,GAAE,CAAC,CAAA;;AAEH;AACA;EACA,MAAMtC,cAAc,GAAGtD,MAAM,CAACC,IAAI,CAAE6I,gBAAiB,CAAC,CAACC,IAAI,CAAIC,CAAC,IAAMA,CAAC,KAAK,MAAM,IAAIA,CAAC,KAAK,MAAO,CAAC,CAAA;EACpG,MAAMC,gBAAgB,GAAG3F,cAAc,GAAGwF,gBAAgB,CAACxF,cAAc,CAAC,GAAG,EAAE,CAAA;AAE/E,EAAA,IAAK2F,gBAAgB,CAAC1E,MAAM,KAAK,CAAC,EAAG;AACnC,IAAA,OAAOiC,IAAI,CAAC7B,KAAK,EAAE,CAAC;AACtB,GAAA;;AAEA;AACA;AACA,EAAA,IAAIuE,WAAW,CAAA;AACf,EAAA,IAAKR,eAAe,CAACJ,aAAa,IAAII,eAAe,CAACH,cAAc,EAAG;IACrEW,WAAW,GAAG,GAAGR,eAAe,CAACJ,aAAa,CAAII,CAAAA,EAAAA,eAAe,CAACH,cAAc,CAAE,CAAA,CAAA;AACpF,GAAC,MAAM;AACL;IACA,MAAMY,cAAc,GAAG,CAAC,GAAGF,gBAAgB,CAAC,CAACG,IAAI,CAAE,CAAEC,CAAC,EAAEC,CAAC,KAAMA,CAAC,CAACnH,KAAK,GAAGkH,CAAC,CAAClH,KAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACrF+G,WAAW,GAAG,GAAGC,cAAc,CAAChH,KAAK,CAAIgH,CAAAA,EAAAA,cAAc,CAAC7D,MAAM,CAAE,CAAA,CAAA;AAClE,GAAA;;AAEA;AACA,EAAA,MAAMiE,cAAc,GAAGN,gBAAgB,CAACO,IAAI,CAACC,KAAK,CAAER,gBAAgB,CAAC1E,MAAM,GAAG,CAAE,CAAC,CAAC,CAAA;;AAElF;AACA,EAAA,MAAMmF,QAAQ,GAAGzD,CAAC,CAAE,OAAQ,CAAC,CAC1B0D,QAAQ,CAAE,iDAAkD,CAAC,CAC7DjD,IAAI,CAAE,OAAO,EAAE,CAAiBwC,cAAAA,EAAAA,WAAW,EAAG,CAAC,CAAA;;AAElD;AACA,EAAA,IAAKL,SAAS,EAAG;AACfa,IAAAA,QAAQ,CAACC,QAAQ,CAAEd,SAAU,CAAC,CAAA;AAChC,GAAA;;AAEA;AACA,EAAA,MAAMe,OAAO,GAAG3D,CAAC,CAAE,OAAQ,CAAC,CAAC0D,QAAQ,CAAE,SAAU,CAAC,CAACjD,IAAI,CAAE,KAAK,EAAE,CAAIgC,CAAAA,EAAAA,eAAe,CAACtF,IAAI,CAAG,CAAA,CAAC,CAACsD,IAAI,CAAE,KAAK,EAAEkC,GAAI,CAAC,CAAA;;AAE/G;AACA,EAAA,MAAMiB,QAAQ,GAAG5D,CAAC,CAAE,OAAQ,CAAC,CAC1B0D,QAAQ,CAAE,UAAW,CAAC,CACtBjD,IAAI,CAAE,KAAK,EAAE,EAAG,CAAC,CACjBA,IAAI,CAAE,KAAK,EAAEkC,GAAI,CAAC,CAClBlC,IAAI,CAAE,aAAa,EAAE,CAAI6C,CAAAA,EAAAA,cAAc,CAACnG,IAAI,EAAG,CAAC,CAAA;;AAEnD;AACAwG,EAAAA,OAAO,CAACE,QAAQ,CAAEJ,QAAS,CAAC,CAAA;AAC5BG,EAAAA,QAAQ,CAACC,QAAQ,CAAEJ,QAAS,CAAC,CAAA;AAE7B,EAAA,OAAOA,QAAQ,CAAA;AACjB,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASK,qBAAqBA,CAAE9D,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAM,EAAG;AACjE;AACA,EAAA,MAAMuD,GAAG,GAAGD,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,CAAA;EAC9B,MAAMkC,GAAG,GAAGpC,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,IAAI,EAAE,CAAA;EACpC,MAAMmC,SAAS,GAAGrC,IAAI,CAACE,IAAI,CAAE,OAAQ,CAAC,IAAI,EAAE,CAAA;EAC5C,MAAMsD,SAAS,GAAGxD,IAAI,CAACE,IAAI,CAAE,OAAQ,CAAC,IAAIxD,MAAM,CAACpB,KAAK,CAAA;;AAEtD;EACA,MAAMgH,gBAAgB,GAAG,EAAE,CAAA;AAC3B3E,EAAAA,QAAQ,CAAC0D,OAAO,CAAIjC,CAAC,IAAM;AACzB,IAAA,IAAK,CAACkD,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,EAAG;AACjC8F,MAAAA,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,GAAG,EAAE,CAAA;AACjC,KAAA;IACA8F,gBAAgB,CAAClD,CAAC,CAAC5C,MAAM,CAAC,CAAC8C,IAAI,CAAEF,CAAE,CAAC,CAAA;AACtC,GAAE,CAAC,CAAA;;AAEH;AACA,EAAA,MAAMqE,QAAQ,GAAGhE,CAAC,CAAE,WAAY,CAAC,CAAA;;AAEjC;EACA,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC4B,OAAO,CAAI7E,MAAM,IAAM;AACtC,IAAA,MAAMkH,cAAc,GAAGpB,gBAAgB,CAAC9F,MAAM,CAAC,CAAA;IAC/C,IAAK,CAACkH,cAAc,IAAIA,cAAc,CAAC3F,MAAM,KAAK,CAAC,EAAG;AACpD,MAAA,OAAA;AACF,KAAA;;AAEA;AACA2F,IAAAA,cAAc,CAACd,IAAI,CAAE,CAAEC,CAAC,EAAEC,CAAC,KAAMD,CAAC,CAAClH,KAAK,GAAGmH,CAAC,CAACnH,KAAM,CAAC,CAAA;;AAEpD;IACA,MAAMgI,MAAM,GAAGD,cAAc,CAACzF,GAAG,CAAImB,CAAC,IAAM,CAAA,CAAA,EAAIA,CAAC,CAACxC,IAAI,CAAIwC,CAAAA,EAAAA,CAAC,CAACzD,KAAK,CAAA,CAAA,CAAI,CAAC,CAAC0B,IAAI,CAAE,IAAK,CAAC,CAAA;;AAEnF;AACAoC,IAAAA,CAAC,CAAE,UAAW,CAAC,CAACS,IAAI,CAAE,MAAM,EAAE,CAAS1D,MAAAA,EAAAA,MAAM,CAAG,CAAA,CAAC,CAAC0D,IAAI,CAAE,QAAQ,EAAEyD,MAAO,CAAC,CAACzD,IAAI,CAAE,OAAO,EAAEsD,SAAU,CAAC,CAACF,QAAQ,CAAEG,QAAS,CAAC,CAAA;AAC5H,GAAE,CAAC,CAAA;;AAEH;EACA,MAAM3G,cAAc,GAAGtD,MAAM,CAACC,IAAI,CAAE6I,gBAAiB,CAAC,CAACC,IAAI,CAAIC,CAAC,IAAMA,CAAC,KAAK,MAAM,IAAIA,CAAC,KAAK,MAAO,CAAC,CAAA;AAEpG,EAAA,IAAK1F,cAAc,IAAIwF,gBAAgB,CAACxF,cAAc,CAAC,EAAG;AAAA,IAAA,IAAA8G,qBAAA,CAAA;AACxD,IAAA,MAAMF,cAAc,GAAGpB,gBAAgB,CAACxF,cAAc,CAAC,CAAA;AACvD4G,IAAAA,cAAc,CAACd,IAAI,CAAE,CAAEC,CAAC,EAAEC,CAAC,KAAMD,CAAC,CAAClH,KAAK,GAAGmH,CAAC,CAACnH,KAAM,CAAC,CAAA;IAEpD,MAAMgI,MAAM,GAAGD,cAAc,CAACzF,GAAG,CAAImB,CAAC,IAAM,CAAA,CAAA,EAAIA,CAAC,CAACxC,IAAI,CAAIwC,CAAAA,EAAAA,CAAC,CAACzD,KAAK,CAAA,CAAA,CAAI,CAAC,CAAC0B,IAAI,CAAE,IAAK,CAAC,CAAA;IACnF,MAAMwG,UAAU,IAAAD,qBAAA,GAAGF,cAAc,CAACV,IAAI,CAACC,KAAK,CAAES,cAAc,CAAC3F,MAAM,GAAG,CAAE,CAAC,CAAC,KAAvD6F,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAAyDhH,IAAI,CAAA;;AAEhF;IACA,MAAMkH,OAAO,GAAGrE,CAAC,CAAE,OAAQ,CAAC,CACzBS,IAAI,CAAE,KAAK,EAAE2D,UAAU,GAAG,IAAIA,UAAU,CAAA,CAAE,GAAG5D,GAAI,CAAC,CAClDC,IAAI,CAAE,QAAQ,EAAEyD,MAAO,CAAC,CACxBzD,IAAI,CAAE,OAAO,EAAEsD,SAAU,CAAC,CAC1BtD,IAAI,CAAE,KAAK,EAAEkC,GAAI,CAAC,CAClBlC,IAAI,CAAE,SAAS,EAAE,MAAO,CAAC,CAAA;;AAE5B;AACA,IAAA,IAAKmC,SAAS,EAAG;AACfyB,MAAAA,OAAO,CAAC5D,IAAI,CAAE,OAAO,EAAEmC,SAAU,CAAC,CAAA;AACpC,KAAA;;AAEA;IACA,IAAK3F,MAAM,CAACrB,mBAAmB,IAAIsC,QAAQ,CAACI,MAAM,GAAG,CAAC,EAAG;MACvD,MAAM4E,cAAc,GAAG,CAAC,GAAGhF,QAAQ,CAAC,CAACiF,IAAI,CAAE,CAAEC,CAAC,EAAEC,CAAC,KAAMA,CAAC,CAACnH,KAAK,GAAGkH,CAAC,CAAClH,KAAM,CAAC,CAAC,CAAC,CAAC,CAAA;MAC7EmI,OAAO,CAAC5D,IAAI,CAAE,OAAO,EAAEyC,cAAc,CAAChH,KAAM,CAAC,CAAA;MAC7CmI,OAAO,CAAC5D,IAAI,CAAE,QAAQ,EAAEyC,cAAc,CAAC7D,MAAO,CAAC,CAAA;AACjD,KAAA;AAEAgF,IAAAA,OAAO,CAACR,QAAQ,CAAEG,QAAS,CAAC,CAAA;AAC9B,GAAA;AAEA,EAAA,OAAOA,QAAQ,CAAA;AACjB,CAAA;;AAEA;AACA;AACA;AACA;AACO,MAAMM,sBAAsB,GAAG,CAAA;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAG,CAAA;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC1XD;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASjE,qBAAqBA,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAM,EAAG;AACjE,EAAA,IAAKiB,QAAQ,CAACI,MAAM,KAAK,CAAC,EAAG;AAC3B,IAAA,OAAA;AACF,GAAA;;AAEA;AACA,EAAA,MAAMkC,GAAG,GAAGD,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,CAAA;EAC9B,MAAMkC,GAAG,GAAGpC,IAAI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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/config.js","../src/utils/hash.js","../src/utils/paths.js","../src/processors/imageProcessor.js","../src/processors/progressiveProcessor.js","../src/processors/htmlProcessor.js","../src/index.js"],"sourcesContent":["/**\n * Configuration utility for the plugin\n * Handles merging user options with sensible defaults\n */\n\n/**\n * Deep merge for objects\n * @param {Object} target - Target object\n * @param {Object} source - Source object\n * @return {Object} - Merged result\n */\n/*\nfunction deepMerge( target, source ) {\n const result = { ...target };\n\n for ( const key in source ) {\n if ( source[key] instanceof Object && key in target && target[key] instanceof Object ) {\n result[key] = deepMerge( target[key], source[key] );\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n*/\n\n// Modern functional approach to deep merge - handles nested objects properly\n// This is needed for formatOptions and placeholder options which are nested objects\nconst deepMerge = ( target, source ) =>\n Object.keys( source ).reduce(\n ( acc, key ) => ( {\n ...acc,\n [key]: source[key]?.constructor === Object ? deepMerge( target[key] || {}, source[key] ) : source[key]\n } ),\n { ...target }\n );\n\n/**\n * Builds configuration with sensible defaults\n * @param {Object} options - User provided plugin options\n * @return {Object} - Complete config with defaults\n */\nexport function buildConfig( options = {} ) {\n // Default configuration with sensible defaults\n const defaults = {\n // Responsive breakpoints to generate\n widths: [320, 640, 960, 1280, 1920],\n\n // Formats to generate in order of preference (first is most preferred)\n formats: ['avif', 'webp', 'original'],\n\n // Format-specific compression settings\n formatOptions: {\n avif: { quality: 65, speed: 5 }, // Better compression but slower\n webp: { quality: 80, lossless: false },\n jpeg: { quality: 85, progressive: true },\n png: { compressionLevel: 8, palette: true }\n },\n\n // Which HTML files to process\n htmlPattern: '**/*.html',\n\n // CSS selector for images to process\n imgSelector: 'img:not([data-no-responsive])',\n\n // Output directory for processed images (relative to Metalsmith destination)\n outputDir: 'assets/images/responsive',\n\n // Output naming pattern\n // Available tokens: [filename], [width], [format], [hash]\n outputPattern: '[filename]-[width]w-[hash].[format]',\n\n // Whether to skip generating sizes larger than original\n skipLarger: true,\n\n // Add loading=\"lazy\" to images\n lazy: true,\n\n // Add width and height attributes to prevent layout shift\n dimensionAttributes: true,\n\n // Default sizes attribute value for responsive images\n sizes: '(max-width: 768px) 100vw, 75vw',\n\n // Maximum number of images to process in parallel\n concurrency: 5,\n\n // Whether to generate a metadata JSON file\n generateMetadata: false,\n\n // Progressive loading options\n isProgressive: false, // TODO: Debug timeout issue in tests\n\n // Placeholder image settings for progressive loading\n placeholder: {\n width: 50,\n quality: 30,\n blur: 10\n },\n\n // Background image processing settings\n processUnusedImages: true, // Process images not found in HTML for background use\n imagePattern: '**/*.{jpg,jpeg,png,gif,webp,avif}' // Pattern to find images for background processing\n };\n\n // Special handling for formatOptions to ensure deep merging\n // This allows users to override specific format settings without losing defaults\n // e.g., { formatOptions: { jpeg: { quality: 90 } } } only changes JPEG quality\n if ( options && options.formatOptions ) {\n options = {\n ...options,\n formatOptions: deepMerge( defaults.formatOptions, options.formatOptions )\n };\n }\n\n // Special handling for placeholder options to ensure deep merging\n // Allows partial placeholder config like { placeholder: { width: 100 } }\n if ( options && options.placeholder ) {\n options = {\n ...options,\n placeholder: deepMerge( defaults.placeholder, options.placeholder )\n };\n }\n\n // Merge the defaults with user options\n return { ...defaults, ...( options || {} ) };\n}\n","/**\n * Utility for generating content hashes\n * Used for cache-busting - ensures filenames change when image content changes\n */\nimport crypto from 'crypto';\n\n/**\n * Generates a short hash based on image content\n * Creates an 8-character hash for cache-busting in filenames\n * @param {Buffer} buffer - The image buffer\n * @return {string} - A short hash string (8 characters)\n */\nexport function generateHash( buffer ) {\n // SHA-256 for cache-busting - using secure algorithm to satisfy security scanners\n // Only use first 8 characters to keep filenames manageable\n return crypto.createHash( 'sha256' ).update( buffer ).digest( 'hex' ).slice( 0, 8 );\n}\n","/**\n * Path utilities for image variants\n * Handles the filename pattern system with token replacement\n */\nimport path from 'path';\n\n/**\n * Generate variant filename using pattern\n * Applies token replacement to create output filenames\n * Tokens: [filename], [width], [format], [hash]\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format ('original' means keep source format)\n * @param {string} hash - Content hash for cache busting\n * @param {object} config - Plugin config options\n * @return {string} - Generated path relative to Metalsmith destination\n */\nexport function generateVariantPath( originalPath, width, format, hash, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format (e.g., 'jpeg' for image.jpg)\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Apply pattern replacements using the tokens system\n // Default pattern: '[filename]-[width]w-[hash].[format]'\n // Results in: 'image-320w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '[hash]', hash || '' );\n\n return path.join( config.outputDir, outputName );\n}\n","/**\n * Image processing utilities for creating responsive image variants\n * Handles the core Sharp.js operations for resizing and format conversion\n */\nimport sharp from 'sharp';\nimport fs from 'fs';\nimport path from 'path';\nimport { generateHash } from '../utils/hash.js';\nimport { generateVariantPath } from '../utils/paths.js';\n\n/**\n * Process an image into multiple responsive variants and formats\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nexport async function processImageToVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n const hash = generateHash( buffer );\n\n // Determine which widths to generate based on skipLarger setting\n // If skipLarger is true (default), don't generate sizes larger than original\n const targetWidths = config.skipLarger ? config.widths.filter( ( w ) => w <= metadata.width ) : config.widths;\n\n if ( targetWidths.length === 0 ) {\n debugFn( `Skipping ${originalPath} - no valid target widths` );\n return [];\n }\n\n // Process all widths in parallel for better performance\n const widthPromises = targetWidths.map( async ( width ) => {\n // Create a Sharp instance for this width - clone to avoid conflicts\n const resized = image.clone().resize( {\n width,\n withoutEnlargement: config.skipLarger // Prevents upscaling small images\n } );\n\n // Get actual dimensions after resize (may be smaller than requested width)\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this width\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations (e.g., webp -> original doesn't make sense)\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n let formatted;\n const outputPath = generateVariantPath( originalPath, width, format, hash, config );\n\n // Apply format-specific processing with quality/compression settings\n if ( format === 'original' ) {\n // For 'original' format, use the source image format\n const originalFormat = metadata.format.toLowerCase();\n const formatOptions = config.formatOptions[originalFormat] || {};\n formatted = resized.clone().toFormat( originalFormat, formatOptions );\n } else {\n // For specific formats (avif, webp, etc.), apply format-specific options\n const formatOptions = config.formatOptions[format] || {};\n if ( format === 'avif' ) {\n formatted = resized.clone().avif( formatOptions );\n } else if ( format === 'webp' ) {\n formatted = resized.clone().webp( formatOptions );\n } else if ( format === 'jpeg' ) {\n formatted = resized.clone().jpeg( formatOptions );\n } else if ( format === 'png' ) {\n formatted = resized.clone().png( formatOptions );\n } else {\n formatted = resized.clone()[format]( formatOptions );\n }\n }\n\n // Generate the actual image buffer - this is where compression happens\n const formatBuffer = await formatted.toBuffer();\n\n return {\n path: outputPath,\n buffer: formatBuffer,\n width,\n format: format === 'original' ? metadata.format.toLowerCase() : format,\n originalFormat: metadata.format.toLowerCase(),\n size: formatBuffer.length,\n height: resizedMeta.height\n };\n } catch ( err ) {\n debugFn( `Error generating ${format} variant for ${originalPath} at width ${width}: ${err.message}` );\n return null;\n }\n } );\n\n // Wait for all formats at this width to complete\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( v ) => v !== null );\n } );\n\n // Wait for all widths to complete and flatten the results\n const widthResults = await Promise.all( widthPromises );\n variants.push( ...widthResults.flat() );\n\n return variants;\n}\n\n/**\n * Process a single image\n * @param {Object} context - Processing context\n * @param {Object} context.$ - Cheerio instance\n * @param {Object} context.img - Image DOM element\n * @param {Object} context.files - Metalsmith files object\n * @param {Object} context.metalsmith - Metalsmith instance\n * @param {Map} context.processedImages - Cache of processed images\n * @param {Function} context.debug - Debug function\n * @param {Object} context.config - Plugin configuration\n * @param {Function} context.replacePictureElement - Function to replace img with picture\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nexport async function processImage( {\n $,\n img,\n files,\n metalsmith,\n processedImages,\n debug,\n config,\n replacePictureElement\n} ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Skip SVG files - they are vector graphics that don't need responsive raster variants\n if ( src.toLowerCase().endsWith( '.svg' ) ) {\n debug( `Skipping SVG file (vector graphics don't need responsive variants): ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n // Remove leading slash if present (HTML paths vs Metalsmith file keys)\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in Metalsmith files object - try to load it from the build directory\n // This handles cases where images were copied by other plugins (like assets)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting - this helps with incremental builds\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to Metalsmith files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key that includes the file path and modification time\n // This prevents reprocessing the same image multiple times in a single build\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this exact image (same file + mtime)\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const variants = processedImages.get( cacheKey );\n replacePictureElement( $, $img, variants, config );\n return;\n }\n\n debug( `Processing image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (different sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Save all generated variants to Metalsmith files object\n // This makes them available in the final build output\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache variants for this image to avoid reprocessing\n processedImages.set( cacheKey, variants );\n\n // Replace the original <img> tag with a responsive <picture> element\n replacePictureElement( $, $img, variants, config );\n } catch ( err ) {\n debug( `Error processing image: ${err.message}` );\n }\n}\n","/**\n * Progressive image loading processor\n * Handles placeholder generation and smooth loading transitions\n */\nimport sharp from 'sharp';\nimport path from 'path';\n\n/**\n * Generate placeholder image for progressive loading\n * Creates a small, blurred, low-quality version for instant display\n * @param {string} imagePath - Original image path\n * @param {Buffer} imageBuffer - Original image buffer\n * @param {Object} placeholderConfig - Placeholder configuration (width, quality, blur)\n * @param {Object} metalsmith - Metalsmith instance\n * @return {Promise<Object>} Placeholder data with path and contents\n */\nexport async function generatePlaceholder( imagePath, imageBuffer, placeholderConfig, metalsmith ) {\n const { width, quality, blur } = placeholderConfig;\n\n try {\n // Get original image dimensions for aspect ratio calculation\n const image = sharp( imageBuffer );\n const metadata = await image.metadata();\n\n // Process image: resize to small width, blur heavily, compress heavily\n const processed = await image\n .resize( width ) // Default: 50px wide\n .blur( blur ) // Default: 10px blur\n .jpeg( { quality } ) // Default: 30% quality\n .toBuffer();\n\n const fileName = `${path.basename( imagePath, path.extname( imagePath ) )}-placeholder.jpg`;\n const outputPath = path.join( 'assets/images/responsive', fileName );\n\n return {\n path: outputPath,\n contents: processed,\n fileName,\n originalWidth: metadata.width,\n originalHeight: metadata.height\n };\n } catch ( error ) {\n metalsmith.debug( 'metalsmith-optimize-images' )( `Error generating placeholder for ${imagePath}: ${error.message}` );\n throw error;\n }\n}\n\n/**\n * Create progressive wrapper HTML structure\n * Creates a container with both placeholder and high-res images for smooth transitions\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} placeholderData - Placeholder image data\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for progressive wrapper\n */\nexport function createProgressiveWrapper( $, $img, variants, placeholderData, _config ) {\n // Get original attributes\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n\n // Group variants by format - use only original format for progressive mode\n // Progressive mode focuses on smooth loading rather than format optimization\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Get original format variants (skip AVIF/WebP for progressive mode)\n // JavaScript will handle format detection dynamically\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n const originalVariants = originalFormat ? variantsByFormat[originalFormat] : [];\n\n if ( originalVariants.length === 0 ) {\n return $img.clone(); // Fallback if no variants\n }\n\n // Calculate aspect ratio using original image dimensions to prevent layout shift\n // Fallback to variant dimensions if placeholderData doesn't have original dimensions\n let aspectRatio;\n if ( placeholderData.originalWidth && placeholderData.originalHeight ) {\n aspectRatio = `${placeholderData.originalWidth}/${placeholderData.originalHeight}`;\n } else {\n // Fallback: use the largest variant for most accurate aspect ratio\n const largestVariant = [...originalVariants].sort( ( a, b ) => b.width - a.width )[0];\n aspectRatio = `${largestVariant.width}/${largestVariant.height}`;\n }\n\n // Find middle-sized variant for high-res image (good balance of quality/size)\n const highResVariant = originalVariants[Math.floor( originalVariants.length / 2 )];\n\n // Create wrapper div with modern CSS aspect-ratio\n const $wrapper = $( '<div>' )\n .addClass( 'responsive-wrapper js-progressive-image-wrapper' )\n .attr( 'style', `aspect-ratio: ${aspectRatio}` );\n\n // Add class from original image if present\n if ( className ) {\n $wrapper.addClass( className );\n }\n\n // Create low-res image (placeholder) - shown immediately\n const $lowRes = $( '<img>' ).addClass( 'low-res' ).attr( 'src', `/${placeholderData.path}` ).attr( 'alt', alt );\n\n // Create high-res image (empty with data source) - loaded by JavaScript\n const $highRes = $( '<img>' )\n .addClass( 'high-res' )\n .attr( 'src', '' )\n .attr( 'alt', alt )\n .attr( 'data-source', `/${highResVariant.path}` );\n\n // Assemble the progressive wrapper\n $lowRes.appendTo( $wrapper );\n $highRes.appendTo( $wrapper );\n\n return $wrapper;\n}\n\n/**\n * Create standard picture element HTML\n * Fallback function for when progressive loading fails\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for picture\n */\nexport function createStandardPicture( $, $img, variants, config ) {\n // Get original attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element with all formats (standard mode)\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order\n ['avif', 'webp'].forEach( ( format ) => {\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as img element\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n const defaultSrc = formatVariants[Math.floor( formatVariants.length / 2 )]?.path;\n\n // Create new img element\n const $newImg = $( '<img>' )\n .attr( 'src', defaultSrc ? `/${defaultSrc}` : src )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .attr( 'alt', alt )\n .attr( 'loading', 'lazy' );\n\n // Add class if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add width/height attributes if configured and available\n if ( config.dimensionAttributes && variants.length > 0 ) {\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n $newImg.appendTo( $picture );\n }\n\n return $picture;\n}\n\n/**\n * Progressive image loader JavaScript\n * Handles intersection observer, format detection, and smooth loading transitions\n */\nexport const progressiveImageLoader = `\n(function() {\n 'use strict';\n \n // Cache for detected format support\n let bestFormat = null;\n \n // Main function called when images enter the viewport\n const loadImage = function(entries, observer) {\n for (let entry of entries) {\n if (entry.isIntersecting) {\n const thisWrapper = entry.target;\n \n // Find the high res image in the wrapper\n const thisImage = thisWrapper.querySelector('.high-res');\n const thisImageSource = thisImage.dataset.source;\n \n if (!thisImageSource) {\n console.warn('No data-source found for high-res image');\n return;\n }\n \n // Apply format based on detected support\n let finalImageSource = thisImageSource;\n \n if (bestFormat === 'avif') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n // If 'original' or null, use original (no change needed)\n \n thisImage.src = finalImageSource;\n \n // Take this image off the observe list to prevent duplicate loading\n observer.unobserve(thisWrapper);\n \n // Once the hi-res image has been loaded, add done class to trigger CSS transition\n thisImage.onload = function() {\n thisWrapper.classList.add('done');\n };\n \n // Handle loading errors gracefully\n thisImage.onerror = function() {\n thisWrapper.classList.add('error');\n };\n }\n }\n };\n\n const init = async function() {\n // Detect best supported format first\n bestFormat = await detectBestFormat();\n \n // Check for Intersection Observer support (not available in older browsers)\n if (!('IntersectionObserver' in window)) {\n // Fallback: load all images immediately for older browsers\n document.querySelectorAll('.js-progressive-image-wrapper').forEach(function(wrapper) {\n const img = wrapper.querySelector('.high-res');\n if (img && img.dataset.source) {\n let finalImageSource = img.dataset.source;\n \n // Apply detected format for fallback\n if (bestFormat === 'avif') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n \n img.src = finalImageSource;\n wrapper.classList.add('done');\n }\n });\n return;\n }\n\n // Create intersection observer with 50px margin (loads images slightly before they're visible)\n const observer = new IntersectionObserver(loadImage, {\n rootMargin: '50px'\n });\n \n // Loop over all image wrappers and add to intersection observer\n const allImageWrappers = document.querySelectorAll('.js-progressive-image-wrapper');\n for (let imageWrapper of allImageWrappers) {\n observer.observe(imageWrapper);\n }\n };\n \n // Format detection using createImageBitmap - more reliable than canvas encoding\n async function detectBestFormat() {\n const fallbackFormat = 'original';\n \n if (!window.createImageBitmap) return fallbackFormat;\n \n const avifData = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABYAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSAAAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB5tZGF0EgAKBzgADlAgIGkyCR/wAABAAACvcA==';\n const webpData = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';\n \n try {\n const avifBlob = await fetch(avifData).then(r => r.blob());\n await createImageBitmap(avifBlob);\n return 'avif';\n } catch {\n try {\n const webpBlob = await fetch(webpData).then(r => r.blob());\n await createImageBitmap(webpBlob);\n return 'webp';\n } catch {\n return fallbackFormat;\n }\n }\n }\n\n // Initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n\n})();\n`;\n\n/**\n * Progressive image CSS styles\n * Handles aspect ratio, positioning, and smooth transitions between placeholder and high-res images\n */\nexport const progressiveImageCSS = `\n.responsive-wrapper {\n position: relative;\n overflow: hidden;\n background-color: #f0f0f0;\n}\n\n.responsive-wrapper .low-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper .high-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper.done .high-res {\n opacity: 1;\n}\n\n.responsive-wrapper.done .low-res {\n opacity: 0;\n}\n\n.responsive-wrapper.error .low-res {\n filter: none;\n}\n\n/* Ensure images are responsive */\n.responsive-wrapper img {\n max-width: 100%;\n height: auto;\n}\n`;\n","/**\n * HTML processing utilities for replacing img tags with responsive picture elements\n * Handles both standard and progressive loading modes\n */\nimport * as cheerio from 'cheerio';\nimport path from 'path';\nimport fs from 'fs';\nimport { processImage, processImageToVariants } from './imageProcessor.js';\nimport {\n generatePlaceholder,\n createProgressiveWrapper,\n createStandardPicture,\n progressiveImageCSS,\n progressiveImageLoader\n} from './progressiveProcessor.js';\n\n/**\n * Replace an img element with a responsive picture element\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Cheerio image element\n * @param {Array<Object>} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n */\nexport function replacePictureElement( $, $img, variants, config ) {\n if ( variants.length === 0 ) {\n return;\n }\n\n // Get original img attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format for creating <source> elements\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element that will contain all formats\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order (avif, webp, then original)\n // Browser will use the first format it supports\n config.formats.forEach( ( format ) => {\n // Skip 'original' placeholder - it's handled separately\n if ( format === 'original' ) {\n return;\n }\n\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width for proper srcset ordering\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string: \"path 320w, path 640w, path 960w\"\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element with format type and srcset\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as last source (fallback for browsers that don't support modern formats)\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n $( '<source>' )\n .attr( 'type', `image/${originalFormat}` )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .appendTo( $picture );\n }\n\n // Create new img element that serves as the final fallback\n const $newImg = $( '<img>' )\n .attr( 'src', src ) // Keep original as fallback for very old browsers\n .attr( 'alt', alt );\n\n // Preserve original class attribute if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add native lazy loading if configured (improves performance)\n if ( config.lazy ) {\n $newImg.attr( 'loading', 'lazy' );\n }\n\n // Add width/height attributes to prevent layout shift (CLS)\n if ( config.dimensionAttributes && variants.length > 0 ) {\n // Use the largest variant as reference for dimensions\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n // Copy any other attributes from original img (except ones we handle specially)\n for ( const attrib in $img[0].attribs ) {\n if ( !['src', 'alt', 'class', 'width', 'height', 'sizes'].includes( attrib ) ) {\n $newImg.attr( attrib, $img.attr( attrib ) );\n }\n }\n\n // Add img to picture element\n $newImg.appendTo( $picture );\n\n // Replace original img with picture element\n $img.replaceWith( $picture );\n}\n\n/**\n * Process an HTML file to replace img tags with responsive picture elements\n * @param {string} htmlFile - Path to HTML file\n * @param {Object} fileData - File data object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when the HTML file is processed\n */\nexport async function processHtmlFile( htmlFile, fileData, files, metalsmith, processedImages, debug, config ) {\n debug( `Processing HTML file: ${htmlFile}` );\n \n // Validate file.contents before processing\n if ( !fileData.contents || !Buffer.isBuffer( fileData.contents ) ) {\n debug( `Skipping ${htmlFile}: invalid or missing file contents` );\n return;\n }\n \n const content = fileData.contents.toString();\n\n // Parse HTML\n const $ = cheerio.load( content );\n\n // Find all images matching our selector (default: img:not([data-no-responsive]))\n const images = $( config.imgSelector );\n if ( images.length === 0 ) {\n debug( `No images found in ${htmlFile}` );\n return;\n }\n\n debug( `Found ${images.length} images in ${htmlFile}` );\n\n // Process images in parallel with a concurrency limit to prevent overwhelming the system\n const imageChunks = [];\n for ( let i = 0; i < images.length; i += config.concurrency ) {\n imageChunks.push( Array.from( images ).slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its images in parallel\n await Promise.all(\n imageChunks.map( async ( imageChunk ) => {\n // Process images within each chunk in parallel\n await Promise.all(\n imageChunk.map( ( img ) =>\n config.isProgressive\n ? processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } )\n : processImage( { $, img, files, metalsmith, processedImages, debug, config, replacePictureElement } )\n )\n );\n } )\n );\n\n // Inject progressive loading CSS and JavaScript if needed\n if ( config.isProgressive ) {\n injectProgressiveAssets( $ );\n }\n\n // Update file contents with modified HTML (converts back to Buffer)\n fileData.contents = Buffer.from( $.html() );\n}\n\n/**\n * Generate metadata file if configured\n * Creates a JSON manifest with information about all processed images\n * Useful for debugging or integration with other tools\n * @param {Map} processedImages - Cache of processed images\n * @param {Object} files - Metalsmith files object\n * @param {Object} config - Plugin configuration\n */\nexport function generateMetadata( processedImages, files, config ) {\n const metadataObj = {};\n processedImages.forEach( ( value, key ) => {\n // Extract the original path from the cache key (path:mtime)\n const [path] = key.split( ':' );\n\n // Handle both array format (from background processing) and object format (from HTML processing)\n const variants = Array.isArray( value ) ? value : value.variants;\n\n metadataObj[path] = variants.map( ( v ) => ( {\n path: v.path,\n width: v.width,\n height: v.height,\n format: v.format,\n size: v.size\n } ) );\n } );\n\n const metadataPath = path.join( config.outputDir, 'responsive-images-manifest.json' );\n files[metadataPath] = {\n contents: Buffer.from( JSON.stringify( metadataObj, null, 2 ) )\n };\n}\n\n/**\n * Process a single image with progressive loading\n * Creates low-quality placeholders and high-resolution images with smooth transitions\n * @param {Object} context - Processing context\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nasync function processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n debug( `Starting progressive processing for: ${src}` );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Skip SVG files - they are vector graphics that don't need responsive raster variants\n if ( src.toLowerCase().endsWith( '.svg' ) ) {\n debug( `Skipping SVG file (vector graphics don't need responsive variants): ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in files, try to load it from the build directory (same logic as processImage)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this image\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const { variants, placeholderData } = processedImages.get( cacheKey );\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n return;\n }\n\n debug( `Processing progressive image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Generate low-quality placeholder image for smooth loading transitions\n const placeholderData = await generatePlaceholder(\n normalizedSrc,\n files[normalizedSrc].contents,\n config.placeholder,\n metalsmith\n );\n\n // Save all variants to Metalsmith files\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Save placeholder to files\n files[placeholderData.path] = {\n contents: placeholderData.contents\n };\n\n // Cache variants and placeholder for this image\n processedImages.set( cacheKey, { variants, placeholderData } );\n\n // Create progressive wrapper with placeholder and high-res image\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n } catch ( err ) {\n debug( `Error processing progressive image: ${err.message}` );\n\n // Fallback to standard processing if progressive loading fails\n try {\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n const $picture = createStandardPicture( $, $img, variants, config );\n $img.replaceWith( $picture );\n } catch ( fallbackErr ) {\n debug( `Fallback processing also failed: ${fallbackErr.message}` );\n }\n }\n}\n\n/**\n * Inject progressive loading CSS and JavaScript assets\n * Only injects if progressive images are actually present on the page\n * @param {Object} $ - Cheerio instance\n */\nfunction injectProgressiveAssets( $ ) {\n // Check if progressive images exist on this page\n const hasProgressiveImages = $( '.js-progressive-image-wrapper' ).length > 0;\n\n if ( !hasProgressiveImages ) {\n return;\n }\n\n // Inject CSS styles for progressive loading (only once per page)\n if ( !$( '#progressive-image-styles' ).length ) {\n $( 'head' ).append( `<style id=\"progressive-image-styles\">${progressiveImageCSS}</style>` );\n }\n\n // Inject JavaScript for intersection observer and loading logic (only once per page)\n if ( !$( '#progressive-image-loader' ).length ) {\n $( 'body' ).append( `<script id=\"progressive-image-loader\">${progressiveImageLoader}</script>` );\n }\n}\n","/**\n * Metalsmith plugin for generating responsive images with optimal formats\n * @module metalsmith-optimize-images\n */\n\n/**\n * @typedef {Object} Options\n * @property {number[]} [widths=[320, 640, 960, 1280, 1920]] - Array of image widths to generate\n * @property {string[]} [formats=['avif', 'webp', 'original']] - Array of image formats to generate (in order of preference)\n * @property {Object} [formatOptions] - Format-specific compression settings\n * @property {Object} [formatOptions.avif] - AVIF compression options\n * @property {Object} [formatOptions.webp] - WebP compression options\n * @property {Object} [formatOptions.jpeg] - JPEG compression options\n * @property {Object} [formatOptions.png] - PNG compression options\n * @property {string} [htmlPattern='**\\/*.html'] - Glob pattern to match HTML files\n * @property {string} [imgSelector='img:not([data-no-responsive])'] - CSS selector for images to process\n * @property {string} [outputDir='assets/images/responsive'] - Output directory for processed images\n * @property {string} [outputPattern='[filename]-[width]w-[hash].[format]'] - Output naming pattern\n * @property {boolean} [skipLarger=true] - Whether to skip generating sizes larger than original\n * @property {boolean} [lazy=true] - Whether to add loading=\"lazy\" to images\n * @property {boolean} [dimensionAttributes=true] - Whether to add width/height attributes\n * @property {string} [sizes] - Default sizes attribute\n * @property {number} [concurrency=5] - Maximum number of images to process in parallel\n * @property {boolean} [generateMetadata=false] - Whether to generate a metadata JSON file\n * @property {boolean} [isProgressive=false] - Whether to use progressive image loading\n * @property {Object} [placeholder] - Placeholder image settings for progressive loading\n * @property {number} [placeholder.width=50] - Placeholder image width\n * @property {number} [placeholder.quality=30] - Placeholder image quality\n * @property {number} [placeholder.blur=10] - Placeholder image blur amount\n * @property {boolean} [processUnusedImages=true] - Whether to process unused images for background use\n * @property {string} [imagePattern='**\\/*.{jpg,jpeg,png,gif,webp,avif}'] - Glob pattern to find images for background processing\n * @property {string} [imageFolder='lib/assets/images'] - Folder to scan for background images, relative to source\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport * as mkdirp from 'mkdirp';\nimport sharp from 'sharp';\nimport { buildConfig } from './utils/config.js';\nimport { processHtmlFile, generateMetadata } from './processors/htmlProcessor.js';\n\n/**\n * Creates a responsive images plugin for Metalsmith\n * Generates multiple sizes and formats of images and replaces img tags with picture elements\n *\n * @param {Options} [options={}] - Configuration options for the plugin\n * @returns {import('metalsmith').Plugin} - Metalsmith plugin function\n */\nfunction optimizeImagesPlugin( options = {} ) {\n // Build configuration with defaults and user options\n const config = buildConfig( options );\n\n /**\n * The Metalsmith plugin function\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Function} done - Callback function\n * @return {void}\n */\n return async function optimizeImages( files, metalsmith, done ) {\n try {\n const destination = metalsmith.destination();\n const outputPath = path.join( destination, config.outputDir );\n\n // Set up debug function for logging (uses 'DEBUG=metalsmith-optimize-images*' env var)\n const debug = metalsmith.debug( 'metalsmith-optimize-images' );\n\n // Ensure the output directory exists where processed images will be saved\n mkdirp.mkdirpSync( outputPath );\n\n // Find all HTML files that match the pattern (default: **/*.html)\n // Also ensure they actually end with .html to avoid processing CSS/JS files\n const htmlFiles = Object.keys( files ).filter( ( file ) => {\n // Must match the HTML pattern\n if ( !metalsmith.match( config.htmlPattern, file ) ) {\n return false;\n }\n\n // Must actually be an HTML file\n if ( !file.endsWith( '.html' ) ) {\n return false;\n }\n\n return true;\n } );\n\n if ( htmlFiles.length === 0 ) {\n debug( 'No HTML files found' );\n return done();\n }\n\n // Cache to avoid re-processing identical images across different HTML files\n // Key: \"filepath:mtime\", Value: array of processed image variants\n const processedImages = new Map();\n\n // Chunk HTML files to respect concurrency limit (default: 5)\n // This prevents overwhelming the system with too many parallel operations\n const chunks = [];\n for ( let i = 0; i < htmlFiles.length; i += config.concurrency ) {\n chunks.push( htmlFiles.slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its files in parallel\n // This creates a two-level parallelism: chunk-level and file-level within chunks\n await Promise.all(\n chunks.map( async ( chunk ) => {\n // Process files within each chunk in parallel\n await Promise.all(\n chunk.map( async ( htmlFile ) => {\n // This function parses HTML, finds images, processes them, and updates the HTML\n await processHtmlFile( htmlFile, files[htmlFile], files, metalsmith, processedImages, debug, config );\n } )\n );\n } )\n );\n\n // Process unused images for background image support\n // This finds images that weren't processed during HTML scanning and creates variants\n // for use in CSS background-image with image-set()\n if ( config.processUnusedImages ) {\n await processUnusedImages( files, metalsmith, processedImages, debug, config );\n }\n\n // Optional: Generate a JSON metadata file with information about all processed images\n // Useful for debugging or integration with other tools\n if ( config.generateMetadata ) {\n generateMetadata( processedImages, files, config );\n }\n\n debug( 'Responsive images processing complete' );\n done();\n } catch ( err ) {\n // Use console.error for errors to ensure they're visible even if debug mode is not enabled\n console.error( `Error in responsive images plugin: ${err.message}` );\n done( err );\n }\n };\n}\n\n/**\n * Process unused images for background image support\n * Finds images that weren't processed during HTML scanning and creates 1x/2x variants\n * for use in CSS background-image with image-set()\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of already processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when processing is complete\n */\nasync function processUnusedImages( files, metalsmith, processedImages, debug, config ) {\n debug( 'Processing unused images for background image support' );\n\n // Get all image paths that were already processed during HTML scanning\n const processedImagePaths = new Set();\n processedImages.forEach( ( _variants, cacheKey ) => {\n const [imagePath] = cacheKey.split( ':' );\n processedImagePaths.add( imagePath );\n } );\n\n debug( `Processed image paths from HTML: ${Array.from( processedImagePaths ).join( ', ' )}` );\n\n // Find images that weren't processed during HTML scanning using hybrid approach\n const allBackgroundImages = await findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug );\n debug( `Background images found to process: ${allBackgroundImages.map( ( img ) => img.path ).join( ', ' )}` );\n\n if ( allBackgroundImages.length === 0 ) {\n debug( 'No unused images found to process' );\n return;\n }\n\n debug( `Found ${allBackgroundImages.length} unused images to process for background use` );\n\n // Process background images in parallel for better performance\n await Promise.all(\n allBackgroundImages.map( async ( imageObj ) => {\n try {\n debug( `Processing background image: ${imageObj.path} (source: ${imageObj.source})` );\n\n // Generate background variants with original size and half size\n const variants = await processBackgroundImageVariants( imageObj.buffer, imageObj.path, debug, config );\n\n // Save all generated variants to Metalsmith files object\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache the variants (using current timestamp as mtime for unused images)\n const cacheKey = `${imageObj.path}:${Date.now()}`;\n processedImages.set( cacheKey, variants );\n\n debug( `Generated ${variants.length} background variants for ${imageObj.path}` );\n } catch ( err ) {\n debug( `Error processing background image ${imageObj.path}: ${err.message}` );\n }\n } )\n );\n\n debug( 'Background image processing complete' );\n}\n\n/**\n * Find images that weren't processed during HTML scanning\n * Uses a hybrid approach: scans filesystem first, then falls back to Metalsmith files object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Object} config - Plugin configuration\n * @param {Set} processedImagePaths - Set of already processed image paths\n * @param {Function} debug - Debug function\n * @return {Promise<Array>} - Array of unprocessed image objects with {path, buffer}\n */\nasync function findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug ) {\n const unprocessedImages = [];\n const sourceImagesDir = path.join( metalsmith.source(), 'lib/assets/images' );\n\n debug( `Looking for unprocessed images using hybrid approach` );\n\n // Method 1: Scan filesystem (for real testbed scenario)\n try {\n debug( `Attempting to scan source directory: ${sourceImagesDir}` );\n debug( `Source directory exists: ${fs.existsSync( sourceImagesDir )}` );\n debug( `Metalsmith source: ${metalsmith.source()}` );\n debug( `Metalsmith destination: ${metalsmith.destination()}` );\n\n if ( fs.existsSync( sourceImagesDir ) ) {\n debug( `Scanning source directory: ${sourceImagesDir}` );\n\n const scanDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning subdirectory: ${item}` );\n scanDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant: ${itemRelativePath}` );\n continue;\n }\n\n const buildPath = path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem'\n } );\n }\n }\n }\n }\n };\n\n scanDirectory( sourceImagesDir );\n } else {\n debug( `Source directory does not exist, trying alternative paths...` );\n\n // Try alternative paths\n const altPaths = [\n path.join( metalsmith.source(), 'assets/images' ),\n path.join( metalsmith.source(), 'images' ),\n path.join( metalsmith.destination(), 'assets/images' ),\n path.join( process.cwd(), 'lib/assets/images' ),\n path.join( process.cwd(), 'src/assets/images' )\n ];\n\n for ( const altPath of altPaths ) {\n debug( `Trying alternative path: ${altPath} - exists: ${fs.existsSync( altPath )}` );\n if ( fs.existsSync( altPath ) ) {\n debug( `Found images at alternative path: ${altPath}` );\n\n // Scan the found alternative path\n const scanAlternativeDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in alternative path ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning alternative subdirectory: ${item}` );\n scanAlternativeDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant in alt scan: ${itemRelativePath}` );\n continue;\n }\n\n // For build directory, the path structure is already correct\n const buildPath = altPath.includes( 'build' )\n ? path.join( 'assets/images', itemRelativePath )\n : path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found alternative filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed alternative filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem-alt'\n } );\n }\n }\n }\n }\n };\n\n scanAlternativeDirectory( altPath );\n break; // Stop after finding and scanning the first valid path\n }\n }\n }\n } catch ( err ) {\n debug( `Error scanning filesystem: ${err.message}` );\n }\n\n // Method 2: Scan Metalsmith files object (for test scenarios and edge cases)\n debug( `Scanning Metalsmith files object` );\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n\n Object.keys( files ).forEach( ( filePath ) => {\n // Skip if not an image\n if ( !imageExtensions.some( ( ext ) => filePath.toLowerCase().endsWith( ext ) ) ) {\n return;\n }\n\n // Skip if it's already a responsive variant (comprehensive checks)\n if (\n filePath.startsWith( `${config.outputDir}/` ) ||\n filePath.includes( '/responsive/' ) ||\n filePath.includes( 'responsive-images-manifest.json' ) ||\n filePath.match( /-\\d+w(-[a-f0-9]+)?\\.(avif|webp|jpg|jpeg|png)$/i )\n ) {\n debug( `Skipping responsive variant in files object: ${filePath}` );\n return;\n }\n\n // Skip if already processed during HTML scanning\n if ( processedImagePaths.has( filePath ) ) {\n debug( `Skipping already processed files object image: ${filePath}` );\n return;\n }\n\n // Check if we already found this image from filesystem scan\n const isAlreadyFound = unprocessedImages.some( ( img ) => {\n // For files object images starting with 'images/', check if filesystem found the same file\n if ( filePath.startsWith( 'images/' ) ) {\n const relativePath = filePath.replace( 'images/', '' );\n return img.path === relativePath;\n }\n return false;\n } );\n\n if ( !isAlreadyFound ) {\n debug( `Found unprocessed files object image: ${filePath}` );\n unprocessedImages.push( {\n path: filePath,\n buffer: files[filePath].contents,\n source: 'files'\n } );\n }\n } );\n\n debug( `Found ${unprocessedImages.length} unprocessed images total` );\n return unprocessedImages;\n}\n\n/**\n * Process a background image to create 1x (original) and 2x (half-size) variants\n * for use with CSS image-set() for retina displays\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nasync function processBackgroundImageVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n\n debugFn( `Processing background image ${originalPath}: ${metadata.width}x${metadata.height}` );\n\n // Create 1x (original size) and 2x (half size) variants\n const sizes = [\n { width: metadata.width, density: '1x' },\n { width: Math.round( metadata.width / 2 ), density: '2x' }\n ];\n\n // Process both sizes in parallel\n const sizePromises = sizes.map( async ( size ) => {\n // Create a Sharp instance for this size\n const resized = image.clone().resize( {\n width: size.width,\n withoutEnlargement: true // Don't upscale images\n } );\n\n // Get actual dimensions after resize\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this size\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n // Determine output format and Sharp method\n let outputFormat = format;\n let sharpMethod = format;\n\n if ( format === 'original' ) {\n outputFormat = metadata.format.toLowerCase();\n sharpMethod = outputFormat === 'jpeg' ? 'jpeg' : outputFormat;\n }\n\n // Apply format-specific processing\n let processedImage = resized.clone();\n const formatOptions = config.formatOptions[format === 'original' ? outputFormat : format] || {};\n\n if ( sharpMethod === 'avif' ) {\n processedImage = processedImage.avif( formatOptions );\n } else if ( sharpMethod === 'webp' ) {\n processedImage = processedImage.webp( formatOptions );\n } else if ( sharpMethod === 'jpeg' ) {\n processedImage = processedImage.jpeg( formatOptions );\n } else if ( sharpMethod === 'png' ) {\n processedImage = processedImage.png( formatOptions );\n }\n\n // Generate output buffer\n const outputBuffer = await processedImage.toBuffer();\n\n // Generate variant path without hash for easier CSS usage\n const variantPath = generateBackgroundVariantPath( originalPath, size.width, outputFormat, config );\n\n debugFn( `Generated background variant: ${variantPath} (${size.density})` );\n\n return {\n path: variantPath,\n buffer: outputBuffer,\n width: resizedMeta.width,\n height: resizedMeta.height,\n format: outputFormat,\n density: size.density\n };\n } catch ( err ) {\n debugFn( `Error processing ${format} format for ${originalPath}: ${err.message}` );\n return null;\n }\n } );\n\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( result ) => result !== null );\n } );\n\n const sizeResults = await Promise.all( sizePromises );\n\n // Flatten the results\n sizeResults.forEach( ( formatVariants ) => {\n variants.push( ...formatVariants );\n } );\n\n debugFn( `Generated ${variants.length} background variants for ${originalPath}` );\n return variants;\n}\n\n/**\n * Generate background image variant path without hash for easier CSS usage\n * Creates predictable filenames that can be written in CSS without knowing the hash\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format\n * @param {Object} config - Plugin configuration\n * @return {string} - Generated path without hash\n */\nfunction generateBackgroundVariantPath( originalPath, width, format, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Create background pattern without hash: '[filename]-[width]w.[format]'\n // Results in: 'header1-1000w.webp' instead of 'header1-1000w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '-[hash]', '' ) // Remove hash placeholder and preceding dash\n .replace( '[hash]', '' ); // Remove any remaining hash placeholder\n\n return path.join( config.outputDir, outputName );\n}\n\n// Set function name for better debugging\nObject.defineProperty( optimizeImagesPlugin, 'name', { \n value: 'metalsmith-optimize-images' \n} );\n\nexport default optimizeImagesPlugin;\n"],"names":["deepMerge","target","source","Object","keys","reduce","acc","key","_source$key","constructor","buildConfig","options","defaults","widths","formats","formatOptions","avif","quality","speed","webp","lossless","jpeg","progressive","png","compressionLevel","palette","htmlPattern","imgSelector","outputDir","outputPattern","skipLarger","lazy","dimensionAttributes","sizes","concurrency","generateMetadata","isProgressive","placeholder","width","blur","processUnusedImages","imagePattern","generateHash","buffer","crypto","createHash","update","digest","slice","generateVariantPath","originalPath","format","hash","config","parsedPath","path","parse","originalFormat","ext","toLowerCase","outputFormat","outputName","replace","name","join","processImageToVariants","debugFn","image","sharp","metadata","variants","targetWidths","filter","w","length","widthPromises","map","resized","clone","resize","withoutEnlargement","resizedMeta","formatPromises","formatted","outputPath","toFormat","formatBuffer","toBuffer","size","height","err","message","formatResults","Promise","all","v","widthResults","push","flat","processImage","$","img","files","metalsmith","processedImages","debug","replacePictureElement","$img","src","attr","startsWith","endsWith","normalizedSrc","destination","imagePath","fs","existsSync","imageBuffer","readFileSync","mtime","statSync","mtimeMs","contents","fileMtime","Date","now","cacheKey","has","get","forEach","variant","set","generatePlaceholder","placeholderConfig","processed","fileName","basename","extname","originalWidth","originalHeight","error","createProgressiveWrapper","placeholderData","_config","alt","className","variantsByFormat","find","f","originalVariants","aspectRatio","largestVariant","sort","a","b","highResVariant","Math","floor","$wrapper","addClass","$lowRes","$highRes","appendTo","createStandardPicture","sizesAttr","$picture","formatVariants","srcset","_formatVariants$Math$","defaultSrc","$newImg","progressiveImageLoader","progressiveImageCSS","attrib","attribs","includes","replaceWith","processHtmlFile","htmlFile","fileData","Buffer","isBuffer","content","toString","cheerio","load","images","imageChunks","i","Array","from","imageChunk","processProgressiveImage","injectProgressiveAssets","html","metadataObj","value","split","isArray","metadataPath","JSON","stringify","fallbackErr","hasProgressiveImages","append","optimizeImagesPlugin","optimizeImages","done","mkdirp","mkdirpSync","htmlFiles","file","match","Map","chunks","chunk","console","processedImagePaths","Set","_variants","add","allBackgroundImages","findUnprocessedImages","imageObj","processBackgroundImageVariants","unprocessedImages","sourceImagesDir","scanDirectory","dir","relativePath","items","readdirSync","item","fullPath","itemRelativePath","isDirectory","imageExtensions","some","buildPath","normalizedBuildPath","altPaths","process","cwd","altPath","scanAlternativeDirectory","filePath","isAlreadyFound","density","round","sizePromises","sharpMethod","processedImage","outputBuffer","variantPath","generateBackgroundVariantPath","result","sizeResults","defineProperty"],"mappings":"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,CAAC,CAAA;AACjD,KAAA;AAEAiF,IAAAA,OAAO,CAACR,QAAQ,CAAEG,QAAS,CAAC,CAAA;AAC9B,GAAA;AAEA,EAAA,OAAOA,QAAQ,CAAA;AACjB,CAAA;;AAEA;AACA;AACA;AACA;AACO,MAAMM,sBAAsB,GAAG,CAAA;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAG,CAAA;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC1XD;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASlE,qBAAqBA,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAM,EAAG;AACjE,EAAA,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"}
|
package/lib/index.js
CHANGED
|
@@ -314,6 +314,12 @@ async function processImage({
|
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
316
|
|
|
317
|
+
// Skip SVG files - they are vector graphics that don't need responsive raster variants
|
|
318
|
+
if (src.toLowerCase().endsWith('.svg')) {
|
|
319
|
+
debug(`Skipping SVG file (vector graphics don't need responsive variants): ${src}`);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
317
323
|
// Normalize src path to match Metalsmith files object keys
|
|
318
324
|
// Remove leading slash if present (HTML paths vs Metalsmith file keys)
|
|
319
325
|
const normalizedSrc = src.startsWith('/') ? src.slice(1) : src;
|
|
@@ -970,6 +976,12 @@ async function processProgressiveImage({
|
|
|
970
976
|
return;
|
|
971
977
|
}
|
|
972
978
|
|
|
979
|
+
// Skip SVG files - they are vector graphics that don't need responsive raster variants
|
|
980
|
+
if (src.toLowerCase().endsWith('.svg')) {
|
|
981
|
+
debug(`Skipping SVG file (vector graphics don't need responsive variants): ${src}`);
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
|
|
973
985
|
// Normalize src path to match Metalsmith files object keys
|
|
974
986
|
const normalizedSrc = src.startsWith('/') ? src.slice(1) : src;
|
|
975
987
|
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/config.js","../src/utils/hash.js","../src/utils/paths.js","../src/processors/imageProcessor.js","../src/processors/progressiveProcessor.js","../src/processors/htmlProcessor.js","../src/index.js"],"sourcesContent":["/**\n * Configuration utility for the plugin\n * Handles merging user options with sensible defaults\n */\n\n/**\n * Deep merge for objects\n * @param {Object} target - Target object\n * @param {Object} source - Source object\n * @return {Object} - Merged result\n */\n/*\nfunction deepMerge( target, source ) {\n const result = { ...target };\n\n for ( const key in source ) {\n if ( source[key] instanceof Object && key in target && target[key] instanceof Object ) {\n result[key] = deepMerge( target[key], source[key] );\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n*/\n\n// Modern functional approach to deep merge - handles nested objects properly\n// This is needed for formatOptions and placeholder options which are nested objects\nconst deepMerge = ( target, source ) =>\n Object.keys( source ).reduce(\n ( acc, key ) => ( {\n ...acc,\n [key]: source[key]?.constructor === Object ? deepMerge( target[key] || {}, source[key] ) : source[key]\n } ),\n { ...target }\n );\n\n/**\n * Builds configuration with sensible defaults\n * @param {Object} options - User provided plugin options\n * @return {Object} - Complete config with defaults\n */\nexport function buildConfig( options = {} ) {\n // Default configuration with sensible defaults\n const defaults = {\n // Responsive breakpoints to generate\n widths: [320, 640, 960, 1280, 1920],\n\n // Formats to generate in order of preference (first is most preferred)\n formats: ['avif', 'webp', 'original'],\n\n // Format-specific compression settings\n formatOptions: {\n avif: { quality: 65, speed: 5 }, // Better compression but slower\n webp: { quality: 80, lossless: false },\n jpeg: { quality: 85, progressive: true },\n png: { compressionLevel: 8, palette: true }\n },\n\n // Which HTML files to process\n htmlPattern: '**/*.html',\n\n // CSS selector for images to process\n imgSelector: 'img:not([data-no-responsive])',\n\n // Output directory for processed images (relative to Metalsmith destination)\n outputDir: 'assets/images/responsive',\n\n // Output naming pattern\n // Available tokens: [filename], [width], [format], [hash]\n outputPattern: '[filename]-[width]w-[hash].[format]',\n\n // Whether to skip generating sizes larger than original\n skipLarger: true,\n\n // Add loading=\"lazy\" to images\n lazy: true,\n\n // Add width and height attributes to prevent layout shift\n dimensionAttributes: true,\n\n // Default sizes attribute value for responsive images\n sizes: '(max-width: 768px) 100vw, 75vw',\n\n // Maximum number of images to process in parallel\n concurrency: 5,\n\n // Whether to generate a metadata JSON file\n generateMetadata: false,\n\n // Progressive loading options\n isProgressive: false, // TODO: Debug timeout issue in tests\n\n // Placeholder image settings for progressive loading\n placeholder: {\n width: 50,\n quality: 30,\n blur: 10\n },\n\n // Background image processing settings\n processUnusedImages: true, // Process images not found in HTML for background use\n imagePattern: '**/*.{jpg,jpeg,png,gif,webp,avif}' // Pattern to find images for background processing\n };\n\n // Special handling for formatOptions to ensure deep merging\n // This allows users to override specific format settings without losing defaults\n // e.g., { formatOptions: { jpeg: { quality: 90 } } } only changes JPEG quality\n if ( options && options.formatOptions ) {\n options = {\n ...options,\n formatOptions: deepMerge( defaults.formatOptions, options.formatOptions )\n };\n }\n\n // Special handling for placeholder options to ensure deep merging\n // Allows partial placeholder config like { placeholder: { width: 100 } }\n if ( options && options.placeholder ) {\n options = {\n ...options,\n placeholder: deepMerge( defaults.placeholder, options.placeholder )\n };\n }\n\n // Merge the defaults with user options\n return { ...defaults, ...( options || {} ) };\n}\n","/**\n * Utility for generating content hashes\n * Used for cache-busting - ensures filenames change when image content changes\n */\nimport crypto from 'crypto';\n\n/**\n * Generates a short hash based on image content\n * Creates an 8-character hash for cache-busting in filenames\n * @param {Buffer} buffer - The image buffer\n * @return {string} - A short hash string (8 characters)\n */\nexport function generateHash( buffer ) {\n // SHA-256 for cache-busting - using secure algorithm to satisfy security scanners\n // Only use first 8 characters to keep filenames manageable\n return crypto.createHash( 'sha256' ).update( buffer ).digest( 'hex' ).slice( 0, 8 );\n}\n","/**\n * Path utilities for image variants\n * Handles the filename pattern system with token replacement\n */\nimport path from 'path';\n\n/**\n * Generate variant filename using pattern\n * Applies token replacement to create output filenames\n * Tokens: [filename], [width], [format], [hash]\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format ('original' means keep source format)\n * @param {string} hash - Content hash for cache busting\n * @param {object} config - Plugin config options\n * @return {string} - Generated path relative to Metalsmith destination\n */\nexport function generateVariantPath( originalPath, width, format, hash, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format (e.g., 'jpeg' for image.jpg)\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Apply pattern replacements using the tokens system\n // Default pattern: '[filename]-[width]w-[hash].[format]'\n // Results in: 'image-320w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '[hash]', hash || '' );\n\n return path.join( config.outputDir, outputName );\n}\n","/**\n * Image processing utilities for creating responsive image variants\n * Handles the core Sharp.js operations for resizing and format conversion\n */\nimport sharp from 'sharp';\nimport fs from 'fs';\nimport path from 'path';\nimport { generateHash } from '../utils/hash.js';\nimport { generateVariantPath } from '../utils/paths.js';\n\n/**\n * Process an image into multiple responsive variants and formats\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nexport async function processImageToVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n const hash = generateHash( buffer );\n\n // Determine which widths to generate based on skipLarger setting\n // If skipLarger is true (default), don't generate sizes larger than original\n const targetWidths = config.skipLarger ? config.widths.filter( ( w ) => w <= metadata.width ) : config.widths;\n\n if ( targetWidths.length === 0 ) {\n debugFn( `Skipping ${originalPath} - no valid target widths` );\n return [];\n }\n\n // Process all widths in parallel for better performance\n const widthPromises = targetWidths.map( async ( width ) => {\n // Create a Sharp instance for this width - clone to avoid conflicts\n const resized = image.clone().resize( {\n width,\n withoutEnlargement: config.skipLarger // Prevents upscaling small images\n } );\n\n // Get actual dimensions after resize (may be smaller than requested width)\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this width\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations (e.g., webp -> original doesn't make sense)\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n let formatted;\n const outputPath = generateVariantPath( originalPath, width, format, hash, config );\n\n // Apply format-specific processing with quality/compression settings\n if ( format === 'original' ) {\n // For 'original' format, use the source image format\n const originalFormat = metadata.format.toLowerCase();\n const formatOptions = config.formatOptions[originalFormat] || {};\n formatted = resized.clone().toFormat( originalFormat, formatOptions );\n } else {\n // For specific formats (avif, webp, etc.), apply format-specific options\n const formatOptions = config.formatOptions[format] || {};\n if ( format === 'avif' ) {\n formatted = resized.clone().avif( formatOptions );\n } else if ( format === 'webp' ) {\n formatted = resized.clone().webp( formatOptions );\n } else if ( format === 'jpeg' ) {\n formatted = resized.clone().jpeg( formatOptions );\n } else if ( format === 'png' ) {\n formatted = resized.clone().png( formatOptions );\n } else {\n formatted = resized.clone()[format]( formatOptions );\n }\n }\n\n // Generate the actual image buffer - this is where compression happens\n const formatBuffer = await formatted.toBuffer();\n\n return {\n path: outputPath,\n buffer: formatBuffer,\n width,\n format: format === 'original' ? metadata.format.toLowerCase() : format,\n originalFormat: metadata.format.toLowerCase(),\n size: formatBuffer.length,\n height: resizedMeta.height\n };\n } catch ( err ) {\n debugFn( `Error generating ${format} variant for ${originalPath} at width ${width}: ${err.message}` );\n return null;\n }\n } );\n\n // Wait for all formats at this width to complete\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( v ) => v !== null );\n } );\n\n // Wait for all widths to complete and flatten the results\n const widthResults = await Promise.all( widthPromises );\n variants.push( ...widthResults.flat() );\n\n return variants;\n}\n\n/**\n * Process a single image\n * @param {Object} context - Processing context\n * @param {Object} context.$ - Cheerio instance\n * @param {Object} context.img - Image DOM element\n * @param {Object} context.files - Metalsmith files object\n * @param {Object} context.metalsmith - Metalsmith instance\n * @param {Map} context.processedImages - Cache of processed images\n * @param {Function} context.debug - Debug function\n * @param {Object} context.config - Plugin configuration\n * @param {Function} context.replacePictureElement - Function to replace img with picture\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nexport async function processImage( {\n $,\n img,\n files,\n metalsmith,\n processedImages,\n debug,\n config,\n replacePictureElement\n} ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n // Remove leading slash if present (HTML paths vs Metalsmith file keys)\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in Metalsmith files object - try to load it from the build directory\n // This handles cases where images were copied by other plugins (like assets)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting - this helps with incremental builds\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to Metalsmith files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key that includes the file path and modification time\n // This prevents reprocessing the same image multiple times in a single build\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this exact image (same file + mtime)\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const variants = processedImages.get( cacheKey );\n replacePictureElement( $, $img, variants, config );\n return;\n }\n\n debug( `Processing image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (different sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Save all generated variants to Metalsmith files object\n // This makes them available in the final build output\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache variants for this image to avoid reprocessing\n processedImages.set( cacheKey, variants );\n\n // Replace the original <img> tag with a responsive <picture> element\n replacePictureElement( $, $img, variants, config );\n } catch ( err ) {\n debug( `Error processing image: ${err.message}` );\n }\n}\n","/**\n * Progressive image loading processor\n * Handles placeholder generation and smooth loading transitions\n */\nimport sharp from 'sharp';\nimport path from 'path';\n\n/**\n * Generate placeholder image for progressive loading\n * Creates a small, blurred, low-quality version for instant display\n * @param {string} imagePath - Original image path\n * @param {Buffer} imageBuffer - Original image buffer\n * @param {Object} placeholderConfig - Placeholder configuration (width, quality, blur)\n * @param {Object} metalsmith - Metalsmith instance\n * @return {Promise<Object>} Placeholder data with path and contents\n */\nexport async function generatePlaceholder( imagePath, imageBuffer, placeholderConfig, metalsmith ) {\n const { width, quality, blur } = placeholderConfig;\n\n try {\n // Get original image dimensions for aspect ratio calculation\n const image = sharp( imageBuffer );\n const metadata = await image.metadata();\n\n // Process image: resize to small width, blur heavily, compress heavily\n const processed = await image\n .resize( width ) // Default: 50px wide\n .blur( blur ) // Default: 10px blur\n .jpeg( { quality } ) // Default: 30% quality\n .toBuffer();\n\n const fileName = `${path.basename( imagePath, path.extname( imagePath ) )}-placeholder.jpg`;\n const outputPath = path.join( 'assets/images/responsive', fileName );\n\n return {\n path: outputPath,\n contents: processed,\n fileName,\n originalWidth: metadata.width,\n originalHeight: metadata.height\n };\n } catch ( error ) {\n metalsmith.debug( 'metalsmith-optimize-images' )( `Error generating placeholder for ${imagePath}: ${error.message}` );\n throw error;\n }\n}\n\n/**\n * Create progressive wrapper HTML structure\n * Creates a container with both placeholder and high-res images for smooth transitions\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} placeholderData - Placeholder image data\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for progressive wrapper\n */\nexport function createProgressiveWrapper( $, $img, variants, placeholderData, _config ) {\n // Get original attributes\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n\n // Group variants by format - use only original format for progressive mode\n // Progressive mode focuses on smooth loading rather than format optimization\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Get original format variants (skip AVIF/WebP for progressive mode)\n // JavaScript will handle format detection dynamically\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n const originalVariants = originalFormat ? variantsByFormat[originalFormat] : [];\n\n if ( originalVariants.length === 0 ) {\n return $img.clone(); // Fallback if no variants\n }\n\n // Calculate aspect ratio using original image dimensions to prevent layout shift\n // Fallback to variant dimensions if placeholderData doesn't have original dimensions\n let aspectRatio;\n if ( placeholderData.originalWidth && placeholderData.originalHeight ) {\n aspectRatio = `${placeholderData.originalWidth}/${placeholderData.originalHeight}`;\n } else {\n // Fallback: use the largest variant for most accurate aspect ratio\n const largestVariant = [...originalVariants].sort( ( a, b ) => b.width - a.width )[0];\n aspectRatio = `${largestVariant.width}/${largestVariant.height}`;\n }\n\n // Find middle-sized variant for high-res image (good balance of quality/size)\n const highResVariant = originalVariants[Math.floor( originalVariants.length / 2 )];\n\n // Create wrapper div with modern CSS aspect-ratio\n const $wrapper = $( '<div>' )\n .addClass( 'responsive-wrapper js-progressive-image-wrapper' )\n .attr( 'style', `aspect-ratio: ${aspectRatio}` );\n\n // Add class from original image if present\n if ( className ) {\n $wrapper.addClass( className );\n }\n\n // Create low-res image (placeholder) - shown immediately\n const $lowRes = $( '<img>' ).addClass( 'low-res' ).attr( 'src', `/${placeholderData.path}` ).attr( 'alt', alt );\n\n // Create high-res image (empty with data source) - loaded by JavaScript\n const $highRes = $( '<img>' )\n .addClass( 'high-res' )\n .attr( 'src', '' )\n .attr( 'alt', alt )\n .attr( 'data-source', `/${highResVariant.path}` );\n\n // Assemble the progressive wrapper\n $lowRes.appendTo( $wrapper );\n $highRes.appendTo( $wrapper );\n\n return $wrapper;\n}\n\n/**\n * Create standard picture element HTML\n * Fallback function for when progressive loading fails\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for picture\n */\nexport function createStandardPicture( $, $img, variants, config ) {\n // Get original attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element with all formats (standard mode)\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order\n ['avif', 'webp'].forEach( ( format ) => {\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as img element\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n const defaultSrc = formatVariants[Math.floor( formatVariants.length / 2 )]?.path;\n\n // Create new img element\n const $newImg = $( '<img>' )\n .attr( 'src', defaultSrc ? `/${defaultSrc}` : src )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .attr( 'alt', alt )\n .attr( 'loading', 'lazy' );\n\n // Add class if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add width/height attributes if configured and available\n if ( config.dimensionAttributes && variants.length > 0 ) {\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n $newImg.appendTo( $picture );\n }\n\n return $picture;\n}\n\n/**\n * Progressive image loader JavaScript\n * Handles intersection observer, format detection, and smooth loading transitions\n */\nexport const progressiveImageLoader = `\n(function() {\n 'use strict';\n \n // Cache for detected format support\n let bestFormat = null;\n \n // Main function called when images enter the viewport\n const loadImage = function(entries, observer) {\n for (let entry of entries) {\n if (entry.isIntersecting) {\n const thisWrapper = entry.target;\n \n // Find the high res image in the wrapper\n const thisImage = thisWrapper.querySelector('.high-res');\n const thisImageSource = thisImage.dataset.source;\n \n if (!thisImageSource) {\n console.warn('No data-source found for high-res image');\n return;\n }\n \n // Apply format based on detected support\n let finalImageSource = thisImageSource;\n \n if (bestFormat === 'avif') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n // If 'original' or null, use original (no change needed)\n \n thisImage.src = finalImageSource;\n \n // Take this image off the observe list to prevent duplicate loading\n observer.unobserve(thisWrapper);\n \n // Once the hi-res image has been loaded, add done class to trigger CSS transition\n thisImage.onload = function() {\n thisWrapper.classList.add('done');\n };\n \n // Handle loading errors gracefully\n thisImage.onerror = function() {\n thisWrapper.classList.add('error');\n };\n }\n }\n };\n\n const init = async function() {\n // Detect best supported format first\n bestFormat = await detectBestFormat();\n \n // Check for Intersection Observer support (not available in older browsers)\n if (!('IntersectionObserver' in window)) {\n // Fallback: load all images immediately for older browsers\n document.querySelectorAll('.js-progressive-image-wrapper').forEach(function(wrapper) {\n const img = wrapper.querySelector('.high-res');\n if (img && img.dataset.source) {\n let finalImageSource = img.dataset.source;\n \n // Apply detected format for fallback\n if (bestFormat === 'avif') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n \n img.src = finalImageSource;\n wrapper.classList.add('done');\n }\n });\n return;\n }\n\n // Create intersection observer with 50px margin (loads images slightly before they're visible)\n const observer = new IntersectionObserver(loadImage, {\n rootMargin: '50px'\n });\n \n // Loop over all image wrappers and add to intersection observer\n const allImageWrappers = document.querySelectorAll('.js-progressive-image-wrapper');\n for (let imageWrapper of allImageWrappers) {\n observer.observe(imageWrapper);\n }\n };\n \n // Format detection using createImageBitmap - more reliable than canvas encoding\n async function detectBestFormat() {\n const fallbackFormat = 'original';\n \n if (!window.createImageBitmap) return fallbackFormat;\n \n const avifData = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABYAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSAAAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB5tZGF0EgAKBzgADlAgIGkyCR/wAABAAACvcA==';\n const webpData = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';\n \n try {\n const avifBlob = await fetch(avifData).then(r => r.blob());\n await createImageBitmap(avifBlob);\n return 'avif';\n } catch {\n try {\n const webpBlob = await fetch(webpData).then(r => r.blob());\n await createImageBitmap(webpBlob);\n return 'webp';\n } catch {\n return fallbackFormat;\n }\n }\n }\n\n // Initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n\n})();\n`;\n\n/**\n * Progressive image CSS styles\n * Handles aspect ratio, positioning, and smooth transitions between placeholder and high-res images\n */\nexport const progressiveImageCSS = `\n.responsive-wrapper {\n position: relative;\n overflow: hidden;\n background-color: #f0f0f0;\n}\n\n.responsive-wrapper .low-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper .high-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper.done .high-res {\n opacity: 1;\n}\n\n.responsive-wrapper.done .low-res {\n opacity: 0;\n}\n\n.responsive-wrapper.error .low-res {\n filter: none;\n}\n\n/* Ensure images are responsive */\n.responsive-wrapper img {\n max-width: 100%;\n height: auto;\n}\n`;\n","/**\n * HTML processing utilities for replacing img tags with responsive picture elements\n * Handles both standard and progressive loading modes\n */\nimport * as cheerio from 'cheerio';\nimport path from 'path';\nimport fs from 'fs';\nimport { processImage, processImageToVariants } from './imageProcessor.js';\nimport {\n generatePlaceholder,\n createProgressiveWrapper,\n createStandardPicture,\n progressiveImageCSS,\n progressiveImageLoader\n} from './progressiveProcessor.js';\n\n/**\n * Replace an img element with a responsive picture element\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Cheerio image element\n * @param {Array<Object>} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n */\nexport function replacePictureElement( $, $img, variants, config ) {\n if ( variants.length === 0 ) {\n return;\n }\n\n // Get original img attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format for creating <source> elements\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element that will contain all formats\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order (avif, webp, then original)\n // Browser will use the first format it supports\n config.formats.forEach( ( format ) => {\n // Skip 'original' placeholder - it's handled separately\n if ( format === 'original' ) {\n return;\n }\n\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width for proper srcset ordering\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string: \"path 320w, path 640w, path 960w\"\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element with format type and srcset\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as last source (fallback for browsers that don't support modern formats)\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n $( '<source>' )\n .attr( 'type', `image/${originalFormat}` )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .appendTo( $picture );\n }\n\n // Create new img element that serves as the final fallback\n const $newImg = $( '<img>' )\n .attr( 'src', src ) // Keep original as fallback for very old browsers\n .attr( 'alt', alt );\n\n // Preserve original class attribute if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add native lazy loading if configured (improves performance)\n if ( config.lazy ) {\n $newImg.attr( 'loading', 'lazy' );\n }\n\n // Add width/height attributes to prevent layout shift (CLS)\n if ( config.dimensionAttributes && variants.length > 0 ) {\n // Use the largest variant as reference for dimensions\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n // Copy any other attributes from original img (except ones we handle specially)\n for ( const attrib in $img[0].attribs ) {\n if ( !['src', 'alt', 'class', 'width', 'height', 'sizes'].includes( attrib ) ) {\n $newImg.attr( attrib, $img.attr( attrib ) );\n }\n }\n\n // Add img to picture element\n $newImg.appendTo( $picture );\n\n // Replace original img with picture element\n $img.replaceWith( $picture );\n}\n\n/**\n * Process an HTML file to replace img tags with responsive picture elements\n * @param {string} htmlFile - Path to HTML file\n * @param {Object} fileData - File data object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when the HTML file is processed\n */\nexport async function processHtmlFile( htmlFile, fileData, files, metalsmith, processedImages, debug, config ) {\n debug( `Processing HTML file: ${htmlFile}` );\n \n // Validate file.contents before processing\n if ( !fileData.contents || !Buffer.isBuffer( fileData.contents ) ) {\n debug( `Skipping ${htmlFile}: invalid or missing file contents` );\n return;\n }\n \n const content = fileData.contents.toString();\n\n // Parse HTML\n const $ = cheerio.load( content );\n\n // Find all images matching our selector (default: img:not([data-no-responsive]))\n const images = $( config.imgSelector );\n if ( images.length === 0 ) {\n debug( `No images found in ${htmlFile}` );\n return;\n }\n\n debug( `Found ${images.length} images in ${htmlFile}` );\n\n // Process images in parallel with a concurrency limit to prevent overwhelming the system\n const imageChunks = [];\n for ( let i = 0; i < images.length; i += config.concurrency ) {\n imageChunks.push( Array.from( images ).slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its images in parallel\n await Promise.all(\n imageChunks.map( async ( imageChunk ) => {\n // Process images within each chunk in parallel\n await Promise.all(\n imageChunk.map( ( img ) =>\n config.isProgressive\n ? processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } )\n : processImage( { $, img, files, metalsmith, processedImages, debug, config, replacePictureElement } )\n )\n );\n } )\n );\n\n // Inject progressive loading CSS and JavaScript if needed\n if ( config.isProgressive ) {\n injectProgressiveAssets( $ );\n }\n\n // Update file contents with modified HTML (converts back to Buffer)\n fileData.contents = Buffer.from( $.html() );\n}\n\n/**\n * Generate metadata file if configured\n * Creates a JSON manifest with information about all processed images\n * Useful for debugging or integration with other tools\n * @param {Map} processedImages - Cache of processed images\n * @param {Object} files - Metalsmith files object\n * @param {Object} config - Plugin configuration\n */\nexport function generateMetadata( processedImages, files, config ) {\n const metadataObj = {};\n processedImages.forEach( ( value, key ) => {\n // Extract the original path from the cache key (path:mtime)\n const [path] = key.split( ':' );\n\n // Handle both array format (from background processing) and object format (from HTML processing)\n const variants = Array.isArray( value ) ? value : value.variants;\n\n metadataObj[path] = variants.map( ( v ) => ( {\n path: v.path,\n width: v.width,\n height: v.height,\n format: v.format,\n size: v.size\n } ) );\n } );\n\n const metadataPath = path.join( config.outputDir, 'responsive-images-manifest.json' );\n files[metadataPath] = {\n contents: Buffer.from( JSON.stringify( metadataObj, null, 2 ) )\n };\n}\n\n/**\n * Process a single image with progressive loading\n * Creates low-quality placeholders and high-resolution images with smooth transitions\n * @param {Object} context - Processing context\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nasync function processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n debug( `Starting progressive processing for: ${src}` );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in files, try to load it from the build directory (same logic as processImage)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this image\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const { variants, placeholderData } = processedImages.get( cacheKey );\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n return;\n }\n\n debug( `Processing progressive image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Generate low-quality placeholder image for smooth loading transitions\n const placeholderData = await generatePlaceholder(\n normalizedSrc,\n files[normalizedSrc].contents,\n config.placeholder,\n metalsmith\n );\n\n // Save all variants to Metalsmith files\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Save placeholder to files\n files[placeholderData.path] = {\n contents: placeholderData.contents\n };\n\n // Cache variants and placeholder for this image\n processedImages.set( cacheKey, { variants, placeholderData } );\n\n // Create progressive wrapper with placeholder and high-res image\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n } catch ( err ) {\n debug( `Error processing progressive image: ${err.message}` );\n\n // Fallback to standard processing if progressive loading fails\n try {\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n const $picture = createStandardPicture( $, $img, variants, config );\n $img.replaceWith( $picture );\n } catch ( fallbackErr ) {\n debug( `Fallback processing also failed: ${fallbackErr.message}` );\n }\n }\n}\n\n/**\n * Inject progressive loading CSS and JavaScript assets\n * Only injects if progressive images are actually present on the page\n * @param {Object} $ - Cheerio instance\n */\nfunction injectProgressiveAssets( $ ) {\n // Check if progressive images exist on this page\n const hasProgressiveImages = $( '.js-progressive-image-wrapper' ).length > 0;\n\n if ( !hasProgressiveImages ) {\n return;\n }\n\n // Inject CSS styles for progressive loading (only once per page)\n if ( !$( '#progressive-image-styles' ).length ) {\n $( 'head' ).append( `<style id=\"progressive-image-styles\">${progressiveImageCSS}</style>` );\n }\n\n // Inject JavaScript for intersection observer and loading logic (only once per page)\n if ( !$( '#progressive-image-loader' ).length ) {\n $( 'body' ).append( `<script id=\"progressive-image-loader\">${progressiveImageLoader}</script>` );\n }\n}\n","/**\n * Metalsmith plugin for generating responsive images with optimal formats\n * @module metalsmith-optimize-images\n */\n\n/**\n * @typedef {Object} Options\n * @property {number[]} [widths=[320, 640, 960, 1280, 1920]] - Array of image widths to generate\n * @property {string[]} [formats=['avif', 'webp', 'original']] - Array of image formats to generate (in order of preference)\n * @property {Object} [formatOptions] - Format-specific compression settings\n * @property {Object} [formatOptions.avif] - AVIF compression options\n * @property {Object} [formatOptions.webp] - WebP compression options\n * @property {Object} [formatOptions.jpeg] - JPEG compression options\n * @property {Object} [formatOptions.png] - PNG compression options\n * @property {string} [htmlPattern='**\\/*.html'] - Glob pattern to match HTML files\n * @property {string} [imgSelector='img:not([data-no-responsive])'] - CSS selector for images to process\n * @property {string} [outputDir='assets/images/responsive'] - Output directory for processed images\n * @property {string} [outputPattern='[filename]-[width]w-[hash].[format]'] - Output naming pattern\n * @property {boolean} [skipLarger=true] - Whether to skip generating sizes larger than original\n * @property {boolean} [lazy=true] - Whether to add loading=\"lazy\" to images\n * @property {boolean} [dimensionAttributes=true] - Whether to add width/height attributes\n * @property {string} [sizes] - Default sizes attribute\n * @property {number} [concurrency=5] - Maximum number of images to process in parallel\n * @property {boolean} [generateMetadata=false] - Whether to generate a metadata JSON file\n * @property {boolean} [isProgressive=false] - Whether to use progressive image loading\n * @property {Object} [placeholder] - Placeholder image settings for progressive loading\n * @property {number} [placeholder.width=50] - Placeholder image width\n * @property {number} [placeholder.quality=30] - Placeholder image quality\n * @property {number} [placeholder.blur=10] - Placeholder image blur amount\n * @property {boolean} [processUnusedImages=true] - Whether to process unused images for background use\n * @property {string} [imagePattern='**\\/*.{jpg,jpeg,png,gif,webp,avif}'] - Glob pattern to find images for background processing\n * @property {string} [imageFolder='lib/assets/images'] - Folder to scan for background images, relative to source\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport * as mkdirp from 'mkdirp';\nimport sharp from 'sharp';\nimport { buildConfig } from './utils/config.js';\nimport { processHtmlFile, generateMetadata } from './processors/htmlProcessor.js';\n\n/**\n * Creates a responsive images plugin for Metalsmith\n * Generates multiple sizes and formats of images and replaces img tags with picture elements\n *\n * @param {Options} [options={}] - Configuration options for the plugin\n * @returns {import('metalsmith').Plugin} - Metalsmith plugin function\n */\nfunction optimizeImagesPlugin( options = {} ) {\n // Build configuration with defaults and user options\n const config = buildConfig( options );\n\n /**\n * The Metalsmith plugin function\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Function} done - Callback function\n * @return {void}\n */\n return async function optimizeImages( files, metalsmith, done ) {\n try {\n const destination = metalsmith.destination();\n const outputPath = path.join( destination, config.outputDir );\n\n // Set up debug function for logging (uses 'DEBUG=metalsmith-optimize-images*' env var)\n const debug = metalsmith.debug( 'metalsmith-optimize-images' );\n\n // Ensure the output directory exists where processed images will be saved\n mkdirp.mkdirpSync( outputPath );\n\n // Find all HTML files that match the pattern (default: **/*.html)\n // Also ensure they actually end with .html to avoid processing CSS/JS files\n const htmlFiles = Object.keys( files ).filter( ( file ) => {\n // Must match the HTML pattern\n if ( !metalsmith.match( config.htmlPattern, file ) ) {\n return false;\n }\n\n // Must actually be an HTML file\n if ( !file.endsWith( '.html' ) ) {\n return false;\n }\n\n return true;\n } );\n\n if ( htmlFiles.length === 0 ) {\n debug( 'No HTML files found' );\n return done();\n }\n\n // Cache to avoid re-processing identical images across different HTML files\n // Key: \"filepath:mtime\", Value: array of processed image variants\n const processedImages = new Map();\n\n // Chunk HTML files to respect concurrency limit (default: 5)\n // This prevents overwhelming the system with too many parallel operations\n const chunks = [];\n for ( let i = 0; i < htmlFiles.length; i += config.concurrency ) {\n chunks.push( htmlFiles.slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its files in parallel\n // This creates a two-level parallelism: chunk-level and file-level within chunks\n await Promise.all(\n chunks.map( async ( chunk ) => {\n // Process files within each chunk in parallel\n await Promise.all(\n chunk.map( async ( htmlFile ) => {\n // This function parses HTML, finds images, processes them, and updates the HTML\n await processHtmlFile( htmlFile, files[htmlFile], files, metalsmith, processedImages, debug, config );\n } )\n );\n } )\n );\n\n // Process unused images for background image support\n // This finds images that weren't processed during HTML scanning and creates variants\n // for use in CSS background-image with image-set()\n if ( config.processUnusedImages ) {\n await processUnusedImages( files, metalsmith, processedImages, debug, config );\n }\n\n // Optional: Generate a JSON metadata file with information about all processed images\n // Useful for debugging or integration with other tools\n if ( config.generateMetadata ) {\n generateMetadata( processedImages, files, config );\n }\n\n debug( 'Responsive images processing complete' );\n done();\n } catch ( err ) {\n // Use console.error for errors to ensure they're visible even if debug mode is not enabled\n console.error( `Error in responsive images plugin: ${err.message}` );\n done( err );\n }\n };\n}\n\n/**\n * Process unused images for background image support\n * Finds images that weren't processed during HTML scanning and creates 1x/2x variants\n * for use in CSS background-image with image-set()\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of already processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when processing is complete\n */\nasync function processUnusedImages( files, metalsmith, processedImages, debug, config ) {\n debug( 'Processing unused images for background image support' );\n\n // Get all image paths that were already processed during HTML scanning\n const processedImagePaths = new Set();\n processedImages.forEach( ( _variants, cacheKey ) => {\n const [imagePath] = cacheKey.split( ':' );\n processedImagePaths.add( imagePath );\n } );\n\n debug( `Processed image paths from HTML: ${Array.from( processedImagePaths ).join( ', ' )}` );\n\n // Find images that weren't processed during HTML scanning using hybrid approach\n const allBackgroundImages = await findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug );\n debug( `Background images found to process: ${allBackgroundImages.map( ( img ) => img.path ).join( ', ' )}` );\n\n if ( allBackgroundImages.length === 0 ) {\n debug( 'No unused images found to process' );\n return;\n }\n\n debug( `Found ${allBackgroundImages.length} unused images to process for background use` );\n\n // Process background images in parallel for better performance\n await Promise.all(\n allBackgroundImages.map( async ( imageObj ) => {\n try {\n debug( `Processing background image: ${imageObj.path} (source: ${imageObj.source})` );\n\n // Generate background variants with original size and half size\n const variants = await processBackgroundImageVariants( imageObj.buffer, imageObj.path, debug, config );\n\n // Save all generated variants to Metalsmith files object\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache the variants (using current timestamp as mtime for unused images)\n const cacheKey = `${imageObj.path}:${Date.now()}`;\n processedImages.set( cacheKey, variants );\n\n debug( `Generated ${variants.length} background variants for ${imageObj.path}` );\n } catch ( err ) {\n debug( `Error processing background image ${imageObj.path}: ${err.message}` );\n }\n } )\n );\n\n debug( 'Background image processing complete' );\n}\n\n/**\n * Find images that weren't processed during HTML scanning\n * Uses a hybrid approach: scans filesystem first, then falls back to Metalsmith files object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Object} config - Plugin configuration\n * @param {Set} processedImagePaths - Set of already processed image paths\n * @param {Function} debug - Debug function\n * @return {Promise<Array>} - Array of unprocessed image objects with {path, buffer}\n */\nasync function findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug ) {\n const unprocessedImages = [];\n const sourceImagesDir = path.join( metalsmith.source(), 'lib/assets/images' );\n\n debug( `Looking for unprocessed images using hybrid approach` );\n\n // Method 1: Scan filesystem (for real testbed scenario)\n try {\n debug( `Attempting to scan source directory: ${sourceImagesDir}` );\n debug( `Source directory exists: ${fs.existsSync( sourceImagesDir )}` );\n debug( `Metalsmith source: ${metalsmith.source()}` );\n debug( `Metalsmith destination: ${metalsmith.destination()}` );\n\n if ( fs.existsSync( sourceImagesDir ) ) {\n debug( `Scanning source directory: ${sourceImagesDir}` );\n\n const scanDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning subdirectory: ${item}` );\n scanDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant: ${itemRelativePath}` );\n continue;\n }\n\n const buildPath = path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem'\n } );\n }\n }\n }\n }\n };\n\n scanDirectory( sourceImagesDir );\n } else {\n debug( `Source directory does not exist, trying alternative paths...` );\n\n // Try alternative paths\n const altPaths = [\n path.join( metalsmith.source(), 'assets/images' ),\n path.join( metalsmith.source(), 'images' ),\n path.join( metalsmith.destination(), 'assets/images' ),\n path.join( process.cwd(), 'lib/assets/images' ),\n path.join( process.cwd(), 'src/assets/images' )\n ];\n\n for ( const altPath of altPaths ) {\n debug( `Trying alternative path: ${altPath} - exists: ${fs.existsSync( altPath )}` );\n if ( fs.existsSync( altPath ) ) {\n debug( `Found images at alternative path: ${altPath}` );\n\n // Scan the found alternative path\n const scanAlternativeDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in alternative path ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning alternative subdirectory: ${item}` );\n scanAlternativeDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant in alt scan: ${itemRelativePath}` );\n continue;\n }\n\n // For build directory, the path structure is already correct\n const buildPath = altPath.includes( 'build' )\n ? path.join( 'assets/images', itemRelativePath )\n : path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found alternative filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed alternative filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem-alt'\n } );\n }\n }\n }\n }\n };\n\n scanAlternativeDirectory( altPath );\n break; // Stop after finding and scanning the first valid path\n }\n }\n }\n } catch ( err ) {\n debug( `Error scanning filesystem: ${err.message}` );\n }\n\n // Method 2: Scan Metalsmith files object (for test scenarios and edge cases)\n debug( `Scanning Metalsmith files object` );\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n\n Object.keys( files ).forEach( ( filePath ) => {\n // Skip if not an image\n if ( !imageExtensions.some( ( ext ) => filePath.toLowerCase().endsWith( ext ) ) ) {\n return;\n }\n\n // Skip if it's already a responsive variant (comprehensive checks)\n if (\n filePath.startsWith( `${config.outputDir}/` ) ||\n filePath.includes( '/responsive/' ) ||\n filePath.includes( 'responsive-images-manifest.json' ) ||\n filePath.match( /-\\d+w(-[a-f0-9]+)?\\.(avif|webp|jpg|jpeg|png)$/i )\n ) {\n debug( `Skipping responsive variant in files object: ${filePath}` );\n return;\n }\n\n // Skip if already processed during HTML scanning\n if ( processedImagePaths.has( filePath ) ) {\n debug( `Skipping already processed files object image: ${filePath}` );\n return;\n }\n\n // Check if we already found this image from filesystem scan\n const isAlreadyFound = unprocessedImages.some( ( img ) => {\n // For files object images starting with 'images/', check if filesystem found the same file\n if ( filePath.startsWith( 'images/' ) ) {\n const relativePath = filePath.replace( 'images/', '' );\n return img.path === relativePath;\n }\n return false;\n } );\n\n if ( !isAlreadyFound ) {\n debug( `Found unprocessed files object image: ${filePath}` );\n unprocessedImages.push( {\n path: filePath,\n buffer: files[filePath].contents,\n source: 'files'\n } );\n }\n } );\n\n debug( `Found ${unprocessedImages.length} unprocessed images total` );\n return unprocessedImages;\n}\n\n/**\n * Process a background image to create 1x (original) and 2x (half-size) variants\n * for use with CSS image-set() for retina displays\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nasync function processBackgroundImageVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n\n debugFn( `Processing background image ${originalPath}: ${metadata.width}x${metadata.height}` );\n\n // Create 1x (original size) and 2x (half size) variants\n const sizes = [\n { width: metadata.width, density: '1x' },\n { width: Math.round( metadata.width / 2 ), density: '2x' }\n ];\n\n // Process both sizes in parallel\n const sizePromises = sizes.map( async ( size ) => {\n // Create a Sharp instance for this size\n const resized = image.clone().resize( {\n width: size.width,\n withoutEnlargement: true // Don't upscale images\n } );\n\n // Get actual dimensions after resize\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this size\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n // Determine output format and Sharp method\n let outputFormat = format;\n let sharpMethod = format;\n\n if ( format === 'original' ) {\n outputFormat = metadata.format.toLowerCase();\n sharpMethod = outputFormat === 'jpeg' ? 'jpeg' : outputFormat;\n }\n\n // Apply format-specific processing\n let processedImage = resized.clone();\n const formatOptions = config.formatOptions[format === 'original' ? outputFormat : format] || {};\n\n if ( sharpMethod === 'avif' ) {\n processedImage = processedImage.avif( formatOptions );\n } else if ( sharpMethod === 'webp' ) {\n processedImage = processedImage.webp( formatOptions );\n } else if ( sharpMethod === 'jpeg' ) {\n processedImage = processedImage.jpeg( formatOptions );\n } else if ( sharpMethod === 'png' ) {\n processedImage = processedImage.png( formatOptions );\n }\n\n // Generate output buffer\n const outputBuffer = await processedImage.toBuffer();\n\n // Generate variant path without hash for easier CSS usage\n const variantPath = generateBackgroundVariantPath( originalPath, size.width, outputFormat, config );\n\n debugFn( `Generated background variant: ${variantPath} (${size.density})` );\n\n return {\n path: variantPath,\n buffer: outputBuffer,\n width: resizedMeta.width,\n height: resizedMeta.height,\n format: outputFormat,\n density: size.density\n };\n } catch ( err ) {\n debugFn( `Error processing ${format} format for ${originalPath}: ${err.message}` );\n return null;\n }\n } );\n\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( result ) => result !== null );\n } );\n\n const sizeResults = await Promise.all( sizePromises );\n\n // Flatten the results\n sizeResults.forEach( ( formatVariants ) => {\n variants.push( ...formatVariants );\n } );\n\n debugFn( `Generated ${variants.length} background variants for ${originalPath}` );\n return variants;\n}\n\n/**\n * Generate background image variant path without hash for easier CSS usage\n * Creates predictable filenames that can be written in CSS without knowing the hash\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format\n * @param {Object} config - Plugin configuration\n * @return {string} - Generated path without hash\n */\nfunction generateBackgroundVariantPath( originalPath, width, format, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Create background pattern without hash: '[filename]-[width]w.[format]'\n // Results in: 'header1-1000w.webp' instead of 'header1-1000w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '-[hash]', '' ) // Remove hash placeholder and preceding dash\n .replace( '[hash]', '' ); // Remove any remaining hash placeholder\n\n return path.join( config.outputDir, outputName );\n}\n\n// Set function name for better debugging\nObject.defineProperty( optimizeImagesPlugin, 'name', { \n value: 'metalsmith-optimize-images' \n} );\n\nexport default optimizeImagesPlugin;\n"],"names":["deepMerge","target","source","Object","keys","reduce","acc","key","_source$key","constructor","buildConfig","options","defaults","widths","formats","formatOptions","avif","quality","speed","webp","lossless","jpeg","progressive","png","compressionLevel","palette","htmlPattern","imgSelector","outputDir","outputPattern","skipLarger","lazy","dimensionAttributes","sizes","concurrency","generateMetadata","isProgressive","placeholder","width","blur","processUnusedImages","imagePattern","generateHash","buffer","crypto","createHash","update","digest","slice","generateVariantPath","originalPath","format","hash","config","parsedPath","path","parse","originalFormat","ext","toLowerCase","outputFormat","outputName","replace","name","join","processImageToVariants","debugFn","image","sharp","metadata","variants","targetWidths","filter","w","length","widthPromises","map","resized","clone","resize","withoutEnlargement","resizedMeta","formatPromises","formatted","outputPath","toFormat","formatBuffer","toBuffer","size","height","err","message","formatResults","Promise","all","v","widthResults","push","flat","processImage","$","img","files","metalsmith","processedImages","debug","replacePictureElement","$img","src","attr","startsWith","normalizedSrc","destination","imagePath","fs","existsSync","imageBuffer","readFileSync","mtime","statSync","mtimeMs","contents","fileMtime","Date","now","cacheKey","has","get","forEach","variant","set","generatePlaceholder","placeholderConfig","processed","fileName","basename","extname","originalWidth","originalHeight","error","createProgressiveWrapper","placeholderData","_config","alt","className","variantsByFormat","find","f","originalVariants","aspectRatio","largestVariant","sort","a","b","highResVariant","Math","floor","$wrapper","addClass","$lowRes","$highRes","appendTo","createStandardPicture","sizesAttr","$picture","formatVariants","srcset","_formatVariants$Math$","defaultSrc","$newImg","progressiveImageLoader","progressiveImageCSS","attrib","attribs","includes","replaceWith","processHtmlFile","htmlFile","fileData","Buffer","isBuffer","content","toString","cheerio","load","images","imageChunks","i","Array","from","imageChunk","processProgressiveImage","injectProgressiveAssets","html","metadataObj","value","split","isArray","metadataPath","JSON","stringify","fallbackErr","hasProgressiveImages","append","optimizeImagesPlugin","optimizeImages","done","mkdirp","mkdirpSync","htmlFiles","file","match","endsWith","Map","chunks","chunk","console","processedImagePaths","Set","_variants","add","allBackgroundImages","findUnprocessedImages","imageObj","processBackgroundImageVariants","unprocessedImages","sourceImagesDir","scanDirectory","dir","relativePath","items","readdirSync","item","fullPath","itemRelativePath","isDirectory","imageExtensions","some","buildPath","normalizedBuildPath","altPaths","process","cwd","altPath","scanAlternativeDirectory","filePath","isAlreadyFound","density","round","sizePromises","sharpMethod","processedImage","outputBuffer","variantPath","generateBackgroundVariantPath","result","sizeResults","defineProperty"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAG,CAAA;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC1XD;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASjE,qBAAqBA,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAM,EAAG;AACjE,EAAA,IAAKiB,QAAQ,CAACI,MAAM,KAAK,CAAC,EAAG;AAC3B,IAAA,OAAA;AACF,GAAA;;AAEA;AACA,EAAA,MAAMkC,GAAG,GAAGD,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,CAAA;EAC9B,MAAMkC,GAAG,GAAGpC,IAAI,CAACE,IAAI,CAAE,KAAM,CAAC,IAAI,EAAE,CAAA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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/config.js","../src/utils/hash.js","../src/utils/paths.js","../src/processors/imageProcessor.js","../src/processors/progressiveProcessor.js","../src/processors/htmlProcessor.js","../src/index.js"],"sourcesContent":["/**\n * Configuration utility for the plugin\n * Handles merging user options with sensible defaults\n */\n\n/**\n * Deep merge for objects\n * @param {Object} target - Target object\n * @param {Object} source - Source object\n * @return {Object} - Merged result\n */\n/*\nfunction deepMerge( target, source ) {\n const result = { ...target };\n\n for ( const key in source ) {\n if ( source[key] instanceof Object && key in target && target[key] instanceof Object ) {\n result[key] = deepMerge( target[key], source[key] );\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n*/\n\n// Modern functional approach to deep merge - handles nested objects properly\n// This is needed for formatOptions and placeholder options which are nested objects\nconst deepMerge = ( target, source ) =>\n Object.keys( source ).reduce(\n ( acc, key ) => ( {\n ...acc,\n [key]: source[key]?.constructor === Object ? deepMerge( target[key] || {}, source[key] ) : source[key]\n } ),\n { ...target }\n );\n\n/**\n * Builds configuration with sensible defaults\n * @param {Object} options - User provided plugin options\n * @return {Object} - Complete config with defaults\n */\nexport function buildConfig( options = {} ) {\n // Default configuration with sensible defaults\n const defaults = {\n // Responsive breakpoints to generate\n widths: [320, 640, 960, 1280, 1920],\n\n // Formats to generate in order of preference (first is most preferred)\n formats: ['avif', 'webp', 'original'],\n\n // Format-specific compression settings\n formatOptions: {\n avif: { quality: 65, speed: 5 }, // Better compression but slower\n webp: { quality: 80, lossless: false },\n jpeg: { quality: 85, progressive: true },\n png: { compressionLevel: 8, palette: true }\n },\n\n // Which HTML files to process\n htmlPattern: '**/*.html',\n\n // CSS selector for images to process\n imgSelector: 'img:not([data-no-responsive])',\n\n // Output directory for processed images (relative to Metalsmith destination)\n outputDir: 'assets/images/responsive',\n\n // Output naming pattern\n // Available tokens: [filename], [width], [format], [hash]\n outputPattern: '[filename]-[width]w-[hash].[format]',\n\n // Whether to skip generating sizes larger than original\n skipLarger: true,\n\n // Add loading=\"lazy\" to images\n lazy: true,\n\n // Add width and height attributes to prevent layout shift\n dimensionAttributes: true,\n\n // Default sizes attribute value for responsive images\n sizes: '(max-width: 768px) 100vw, 75vw',\n\n // Maximum number of images to process in parallel\n concurrency: 5,\n\n // Whether to generate a metadata JSON file\n generateMetadata: false,\n\n // Progressive loading options\n isProgressive: false, // TODO: Debug timeout issue in tests\n\n // Placeholder image settings for progressive loading\n placeholder: {\n width: 50,\n quality: 30,\n blur: 10\n },\n\n // Background image processing settings\n processUnusedImages: true, // Process images not found in HTML for background use\n imagePattern: '**/*.{jpg,jpeg,png,gif,webp,avif}' // Pattern to find images for background processing\n };\n\n // Special handling for formatOptions to ensure deep merging\n // This allows users to override specific format settings without losing defaults\n // e.g., { formatOptions: { jpeg: { quality: 90 } } } only changes JPEG quality\n if ( options && options.formatOptions ) {\n options = {\n ...options,\n formatOptions: deepMerge( defaults.formatOptions, options.formatOptions )\n };\n }\n\n // Special handling for placeholder options to ensure deep merging\n // Allows partial placeholder config like { placeholder: { width: 100 } }\n if ( options && options.placeholder ) {\n options = {\n ...options,\n placeholder: deepMerge( defaults.placeholder, options.placeholder )\n };\n }\n\n // Merge the defaults with user options\n return { ...defaults, ...( options || {} ) };\n}\n","/**\n * Utility for generating content hashes\n * Used for cache-busting - ensures filenames change when image content changes\n */\nimport crypto from 'crypto';\n\n/**\n * Generates a short hash based on image content\n * Creates an 8-character hash for cache-busting in filenames\n * @param {Buffer} buffer - The image buffer\n * @return {string} - A short hash string (8 characters)\n */\nexport function generateHash( buffer ) {\n // SHA-256 for cache-busting - using secure algorithm to satisfy security scanners\n // Only use first 8 characters to keep filenames manageable\n return crypto.createHash( 'sha256' ).update( buffer ).digest( 'hex' ).slice( 0, 8 );\n}\n","/**\n * Path utilities for image variants\n * Handles the filename pattern system with token replacement\n */\nimport path from 'path';\n\n/**\n * Generate variant filename using pattern\n * Applies token replacement to create output filenames\n * Tokens: [filename], [width], [format], [hash]\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format ('original' means keep source format)\n * @param {string} hash - Content hash for cache busting\n * @param {object} config - Plugin config options\n * @return {string} - Generated path relative to Metalsmith destination\n */\nexport function generateVariantPath( originalPath, width, format, hash, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format (e.g., 'jpeg' for image.jpg)\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Apply pattern replacements using the tokens system\n // Default pattern: '[filename]-[width]w-[hash].[format]'\n // Results in: 'image-320w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '[hash]', hash || '' );\n\n return path.join( config.outputDir, outputName );\n}\n","/**\n * Image processing utilities for creating responsive image variants\n * Handles the core Sharp.js operations for resizing and format conversion\n */\nimport sharp from 'sharp';\nimport fs from 'fs';\nimport path from 'path';\nimport { generateHash } from '../utils/hash.js';\nimport { generateVariantPath } from '../utils/paths.js';\n\n/**\n * Process an image into multiple responsive variants and formats\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nexport async function processImageToVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n const hash = generateHash( buffer );\n\n // Determine which widths to generate based on skipLarger setting\n // If skipLarger is true (default), don't generate sizes larger than original\n const targetWidths = config.skipLarger ? config.widths.filter( ( w ) => w <= metadata.width ) : config.widths;\n\n if ( targetWidths.length === 0 ) {\n debugFn( `Skipping ${originalPath} - no valid target widths` );\n return [];\n }\n\n // Process all widths in parallel for better performance\n const widthPromises = targetWidths.map( async ( width ) => {\n // Create a Sharp instance for this width - clone to avoid conflicts\n const resized = image.clone().resize( {\n width,\n withoutEnlargement: config.skipLarger // Prevents upscaling small images\n } );\n\n // Get actual dimensions after resize (may be smaller than requested width)\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this width\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations (e.g., webp -> original doesn't make sense)\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n let formatted;\n const outputPath = generateVariantPath( originalPath, width, format, hash, config );\n\n // Apply format-specific processing with quality/compression settings\n if ( format === 'original' ) {\n // For 'original' format, use the source image format\n const originalFormat = metadata.format.toLowerCase();\n const formatOptions = config.formatOptions[originalFormat] || {};\n formatted = resized.clone().toFormat( originalFormat, formatOptions );\n } else {\n // For specific formats (avif, webp, etc.), apply format-specific options\n const formatOptions = config.formatOptions[format] || {};\n if ( format === 'avif' ) {\n formatted = resized.clone().avif( formatOptions );\n } else if ( format === 'webp' ) {\n formatted = resized.clone().webp( formatOptions );\n } else if ( format === 'jpeg' ) {\n formatted = resized.clone().jpeg( formatOptions );\n } else if ( format === 'png' ) {\n formatted = resized.clone().png( formatOptions );\n } else {\n formatted = resized.clone()[format]( formatOptions );\n }\n }\n\n // Generate the actual image buffer - this is where compression happens\n const formatBuffer = await formatted.toBuffer();\n\n return {\n path: outputPath,\n buffer: formatBuffer,\n width,\n format: format === 'original' ? metadata.format.toLowerCase() : format,\n originalFormat: metadata.format.toLowerCase(),\n size: formatBuffer.length,\n height: resizedMeta.height\n };\n } catch ( err ) {\n debugFn( `Error generating ${format} variant for ${originalPath} at width ${width}: ${err.message}` );\n return null;\n }\n } );\n\n // Wait for all formats at this width to complete\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( v ) => v !== null );\n } );\n\n // Wait for all widths to complete and flatten the results\n const widthResults = await Promise.all( widthPromises );\n variants.push( ...widthResults.flat() );\n\n return variants;\n}\n\n/**\n * Process a single image\n * @param {Object} context - Processing context\n * @param {Object} context.$ - Cheerio instance\n * @param {Object} context.img - Image DOM element\n * @param {Object} context.files - Metalsmith files object\n * @param {Object} context.metalsmith - Metalsmith instance\n * @param {Map} context.processedImages - Cache of processed images\n * @param {Function} context.debug - Debug function\n * @param {Object} context.config - Plugin configuration\n * @param {Function} context.replacePictureElement - Function to replace img with picture\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nexport async function processImage( {\n $,\n img,\n files,\n metalsmith,\n processedImages,\n debug,\n config,\n replacePictureElement\n} ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Skip SVG files - they are vector graphics that don't need responsive raster variants\n if ( src.toLowerCase().endsWith( '.svg' ) ) {\n debug( `Skipping SVG file (vector graphics don't need responsive variants): ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n // Remove leading slash if present (HTML paths vs Metalsmith file keys)\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in Metalsmith files object - try to load it from the build directory\n // This handles cases where images were copied by other plugins (like assets)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting - this helps with incremental builds\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to Metalsmith files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key that includes the file path and modification time\n // This prevents reprocessing the same image multiple times in a single build\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this exact image (same file + mtime)\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const variants = processedImages.get( cacheKey );\n replacePictureElement( $, $img, variants, config );\n return;\n }\n\n debug( `Processing image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (different sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Save all generated variants to Metalsmith files object\n // This makes them available in the final build output\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache variants for this image to avoid reprocessing\n processedImages.set( cacheKey, variants );\n\n // Replace the original <img> tag with a responsive <picture> element\n replacePictureElement( $, $img, variants, config );\n } catch ( err ) {\n debug( `Error processing image: ${err.message}` );\n }\n}\n","/**\n * Progressive image loading processor\n * Handles placeholder generation and smooth loading transitions\n */\nimport sharp from 'sharp';\nimport path from 'path';\n\n/**\n * Generate placeholder image for progressive loading\n * Creates a small, blurred, low-quality version for instant display\n * @param {string} imagePath - Original image path\n * @param {Buffer} imageBuffer - Original image buffer\n * @param {Object} placeholderConfig - Placeholder configuration (width, quality, blur)\n * @param {Object} metalsmith - Metalsmith instance\n * @return {Promise<Object>} Placeholder data with path and contents\n */\nexport async function generatePlaceholder( imagePath, imageBuffer, placeholderConfig, metalsmith ) {\n const { width, quality, blur } = placeholderConfig;\n\n try {\n // Get original image dimensions for aspect ratio calculation\n const image = sharp( imageBuffer );\n const metadata = await image.metadata();\n\n // Process image: resize to small width, blur heavily, compress heavily\n const processed = await image\n .resize( width ) // Default: 50px wide\n .blur( blur ) // Default: 10px blur\n .jpeg( { quality } ) // Default: 30% quality\n .toBuffer();\n\n const fileName = `${path.basename( imagePath, path.extname( imagePath ) )}-placeholder.jpg`;\n const outputPath = path.join( 'assets/images/responsive', fileName );\n\n return {\n path: outputPath,\n contents: processed,\n fileName,\n originalWidth: metadata.width,\n originalHeight: metadata.height\n };\n } catch ( error ) {\n metalsmith.debug( 'metalsmith-optimize-images' )( `Error generating placeholder for ${imagePath}: ${error.message}` );\n throw error;\n }\n}\n\n/**\n * Create progressive wrapper HTML structure\n * Creates a container with both placeholder and high-res images for smooth transitions\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} placeholderData - Placeholder image data\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for progressive wrapper\n */\nexport function createProgressiveWrapper( $, $img, variants, placeholderData, _config ) {\n // Get original attributes\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n\n // Group variants by format - use only original format for progressive mode\n // Progressive mode focuses on smooth loading rather than format optimization\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Get original format variants (skip AVIF/WebP for progressive mode)\n // JavaScript will handle format detection dynamically\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n const originalVariants = originalFormat ? variantsByFormat[originalFormat] : [];\n\n if ( originalVariants.length === 0 ) {\n return $img.clone(); // Fallback if no variants\n }\n\n // Calculate aspect ratio using original image dimensions to prevent layout shift\n // Fallback to variant dimensions if placeholderData doesn't have original dimensions\n let aspectRatio;\n if ( placeholderData.originalWidth && placeholderData.originalHeight ) {\n aspectRatio = `${placeholderData.originalWidth}/${placeholderData.originalHeight}`;\n } else {\n // Fallback: use the largest variant for most accurate aspect ratio\n const largestVariant = [...originalVariants].sort( ( a, b ) => b.width - a.width )[0];\n aspectRatio = `${largestVariant.width}/${largestVariant.height}`;\n }\n\n // Find middle-sized variant for high-res image (good balance of quality/size)\n const highResVariant = originalVariants[Math.floor( originalVariants.length / 2 )];\n\n // Create wrapper div with modern CSS aspect-ratio\n const $wrapper = $( '<div>' )\n .addClass( 'responsive-wrapper js-progressive-image-wrapper' )\n .attr( 'style', `aspect-ratio: ${aspectRatio}` );\n\n // Add class from original image if present\n if ( className ) {\n $wrapper.addClass( className );\n }\n\n // Create low-res image (placeholder) - shown immediately\n const $lowRes = $( '<img>' ).addClass( 'low-res' ).attr( 'src', `/${placeholderData.path}` ).attr( 'alt', alt );\n\n // Create high-res image (empty with data source) - loaded by JavaScript\n const $highRes = $( '<img>' )\n .addClass( 'high-res' )\n .attr( 'src', '' )\n .attr( 'alt', alt )\n .attr( 'data-source', `/${highResVariant.path}` );\n\n // Assemble the progressive wrapper\n $lowRes.appendTo( $wrapper );\n $highRes.appendTo( $wrapper );\n\n return $wrapper;\n}\n\n/**\n * Create standard picture element HTML\n * Fallback function for when progressive loading fails\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Original img element\n * @param {Array} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n * @return {Object} Cheerio element for picture\n */\nexport function createStandardPicture( $, $img, variants, config ) {\n // Get original attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element with all formats (standard mode)\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order\n ['avif', 'webp'].forEach( ( format ) => {\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as img element\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n const defaultSrc = formatVariants[Math.floor( formatVariants.length / 2 )]?.path;\n\n // Create new img element\n const $newImg = $( '<img>' )\n .attr( 'src', defaultSrc ? `/${defaultSrc}` : src )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .attr( 'alt', alt )\n .attr( 'loading', 'lazy' );\n\n // Add class if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add width/height attributes if configured and available\n if ( config.dimensionAttributes && variants.length > 0 ) {\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n $newImg.appendTo( $picture );\n }\n\n return $picture;\n}\n\n/**\n * Progressive image loader JavaScript\n * Handles intersection observer, format detection, and smooth loading transitions\n */\nexport const progressiveImageLoader = `\n(function() {\n 'use strict';\n \n // Cache for detected format support\n let bestFormat = null;\n \n // Main function called when images enter the viewport\n const loadImage = function(entries, observer) {\n for (let entry of entries) {\n if (entry.isIntersecting) {\n const thisWrapper = entry.target;\n \n // Find the high res image in the wrapper\n const thisImage = thisWrapper.querySelector('.high-res');\n const thisImageSource = thisImage.dataset.source;\n \n if (!thisImageSource) {\n console.warn('No data-source found for high-res image');\n return;\n }\n \n // Apply format based on detected support\n let finalImageSource = thisImageSource;\n \n if (bestFormat === 'avif') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = thisImageSource.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n // If 'original' or null, use original (no change needed)\n \n thisImage.src = finalImageSource;\n \n // Take this image off the observe list to prevent duplicate loading\n observer.unobserve(thisWrapper);\n \n // Once the hi-res image has been loaded, add done class to trigger CSS transition\n thisImage.onload = function() {\n thisWrapper.classList.add('done');\n };\n \n // Handle loading errors gracefully\n thisImage.onerror = function() {\n thisWrapper.classList.add('error');\n };\n }\n }\n };\n\n const init = async function() {\n // Detect best supported format first\n bestFormat = await detectBestFormat();\n \n // Check for Intersection Observer support (not available in older browsers)\n if (!('IntersectionObserver' in window)) {\n // Fallback: load all images immediately for older browsers\n document.querySelectorAll('.js-progressive-image-wrapper').forEach(function(wrapper) {\n const img = wrapper.querySelector('.high-res');\n if (img && img.dataset.source) {\n let finalImageSource = img.dataset.source;\n \n // Apply detected format for fallback\n if (bestFormat === 'avif') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.avif');\n } else if (bestFormat === 'webp') {\n finalImageSource = img.dataset.source.replace(/\\.(jpg|jpeg|png)$/i, '.webp');\n }\n \n img.src = finalImageSource;\n wrapper.classList.add('done');\n }\n });\n return;\n }\n\n // Create intersection observer with 50px margin (loads images slightly before they're visible)\n const observer = new IntersectionObserver(loadImage, {\n rootMargin: '50px'\n });\n \n // Loop over all image wrappers and add to intersection observer\n const allImageWrappers = document.querySelectorAll('.js-progressive-image-wrapper');\n for (let imageWrapper of allImageWrappers) {\n observer.observe(imageWrapper);\n }\n };\n \n // Format detection using createImageBitmap - more reliable than canvas encoding\n async function detectBestFormat() {\n const fallbackFormat = 'original';\n \n if (!window.createImageBitmap) return fallbackFormat;\n \n const avifData = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABYAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSAAAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB5tZGF0EgAKBzgADlAgIGkyCR/wAABAAACvcA==';\n const webpData = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';\n \n try {\n const avifBlob = await fetch(avifData).then(r => r.blob());\n await createImageBitmap(avifBlob);\n return 'avif';\n } catch {\n try {\n const webpBlob = await fetch(webpData).then(r => r.blob());\n await createImageBitmap(webpBlob);\n return 'webp';\n } catch {\n return fallbackFormat;\n }\n }\n }\n\n // Initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n\n})();\n`;\n\n/**\n * Progressive image CSS styles\n * Handles aspect ratio, positioning, and smooth transitions between placeholder and high-res images\n */\nexport const progressiveImageCSS = `\n.responsive-wrapper {\n position: relative;\n overflow: hidden;\n background-color: #f0f0f0;\n}\n\n.responsive-wrapper .low-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper .high-res {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n transition: opacity 0.4s ease;\n}\n\n.responsive-wrapper.done .high-res {\n opacity: 1;\n}\n\n.responsive-wrapper.done .low-res {\n opacity: 0;\n}\n\n.responsive-wrapper.error .low-res {\n filter: none;\n}\n\n/* Ensure images are responsive */\n.responsive-wrapper img {\n max-width: 100%;\n height: auto;\n}\n`;\n","/**\n * HTML processing utilities for replacing img tags with responsive picture elements\n * Handles both standard and progressive loading modes\n */\nimport * as cheerio from 'cheerio';\nimport path from 'path';\nimport fs from 'fs';\nimport { processImage, processImageToVariants } from './imageProcessor.js';\nimport {\n generatePlaceholder,\n createProgressiveWrapper,\n createStandardPicture,\n progressiveImageCSS,\n progressiveImageLoader\n} from './progressiveProcessor.js';\n\n/**\n * Replace an img element with a responsive picture element\n * @param {Object} $ - Cheerio instance\n * @param {Object} $img - Cheerio image element\n * @param {Array<Object>} variants - Generated image variants\n * @param {Object} config - Plugin configuration\n */\nexport function replacePictureElement( $, $img, variants, config ) {\n if ( variants.length === 0 ) {\n return;\n }\n\n // Get original img attributes\n const src = $img.attr( 'src' );\n const alt = $img.attr( 'alt' ) || '';\n const className = $img.attr( 'class' ) || '';\n const sizesAttr = $img.attr( 'sizes' ) || config.sizes;\n\n // Group variants by format for creating <source> elements\n const variantsByFormat = {};\n variants.forEach( ( v ) => {\n if ( !variantsByFormat[v.format] ) {\n variantsByFormat[v.format] = [];\n }\n variantsByFormat[v.format].push( v );\n } );\n\n // Create picture element that will contain all formats\n const $picture = $( '<picture>' );\n\n // Add format-specific source elements in preference order (avif, webp, then original)\n // Browser will use the first format it supports\n config.formats.forEach( ( format ) => {\n // Skip 'original' placeholder - it's handled separately\n if ( format === 'original' ) {\n return;\n }\n\n const formatVariants = variantsByFormat[format];\n if ( !formatVariants || formatVariants.length === 0 ) {\n return;\n }\n\n // Sort variants by width for proper srcset ordering\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n // Create srcset string: \"path 320w, path 640w, path 960w\"\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n // Create source element with format type and srcset\n $( '<source>' ).attr( 'type', `image/${format}` ).attr( 'srcset', srcset ).attr( 'sizes', sizesAttr ).appendTo( $picture );\n } );\n\n // Add original format as last source (fallback for browsers that don't support modern formats)\n const originalFormat = Object.keys( variantsByFormat ).find( ( f ) => f !== 'avif' && f !== 'webp' );\n\n if ( originalFormat && variantsByFormat[originalFormat] ) {\n const formatVariants = variantsByFormat[originalFormat];\n formatVariants.sort( ( a, b ) => a.width - b.width );\n\n const srcset = formatVariants.map( ( v ) => `/${v.path} ${v.width}w` ).join( ', ' );\n\n $( '<source>' )\n .attr( 'type', `image/${originalFormat}` )\n .attr( 'srcset', srcset )\n .attr( 'sizes', sizesAttr )\n .appendTo( $picture );\n }\n\n // Create new img element that serves as the final fallback\n const $newImg = $( '<img>' )\n .attr( 'src', src ) // Keep original as fallback for very old browsers\n .attr( 'alt', alt );\n\n // Preserve original class attribute if present\n if ( className ) {\n $newImg.attr( 'class', className );\n }\n\n // Add native lazy loading if configured (improves performance)\n if ( config.lazy ) {\n $newImg.attr( 'loading', 'lazy' );\n }\n\n // Add width/height attributes to prevent layout shift (CLS)\n if ( config.dimensionAttributes && variants.length > 0 ) {\n // Use the largest variant as reference for dimensions\n const largestVariant = [...variants].sort( ( a, b ) => b.width - a.width )[0];\n $newImg.attr( 'width', largestVariant.width );\n $newImg.attr( 'height', largestVariant.height );\n }\n\n // Copy any other attributes from original img (except ones we handle specially)\n for ( const attrib in $img[0].attribs ) {\n if ( !['src', 'alt', 'class', 'width', 'height', 'sizes'].includes( attrib ) ) {\n $newImg.attr( attrib, $img.attr( attrib ) );\n }\n }\n\n // Add img to picture element\n $newImg.appendTo( $picture );\n\n // Replace original img with picture element\n $img.replaceWith( $picture );\n}\n\n/**\n * Process an HTML file to replace img tags with responsive picture elements\n * @param {string} htmlFile - Path to HTML file\n * @param {Object} fileData - File data object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when the HTML file is processed\n */\nexport async function processHtmlFile( htmlFile, fileData, files, metalsmith, processedImages, debug, config ) {\n debug( `Processing HTML file: ${htmlFile}` );\n \n // Validate file.contents before processing\n if ( !fileData.contents || !Buffer.isBuffer( fileData.contents ) ) {\n debug( `Skipping ${htmlFile}: invalid or missing file contents` );\n return;\n }\n \n const content = fileData.contents.toString();\n\n // Parse HTML\n const $ = cheerio.load( content );\n\n // Find all images matching our selector (default: img:not([data-no-responsive]))\n const images = $( config.imgSelector );\n if ( images.length === 0 ) {\n debug( `No images found in ${htmlFile}` );\n return;\n }\n\n debug( `Found ${images.length} images in ${htmlFile}` );\n\n // Process images in parallel with a concurrency limit to prevent overwhelming the system\n const imageChunks = [];\n for ( let i = 0; i < images.length; i += config.concurrency ) {\n imageChunks.push( Array.from( images ).slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its images in parallel\n await Promise.all(\n imageChunks.map( async ( imageChunk ) => {\n // Process images within each chunk in parallel\n await Promise.all(\n imageChunk.map( ( img ) =>\n config.isProgressive\n ? processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } )\n : processImage( { $, img, files, metalsmith, processedImages, debug, config, replacePictureElement } )\n )\n );\n } )\n );\n\n // Inject progressive loading CSS and JavaScript if needed\n if ( config.isProgressive ) {\n injectProgressiveAssets( $ );\n }\n\n // Update file contents with modified HTML (converts back to Buffer)\n fileData.contents = Buffer.from( $.html() );\n}\n\n/**\n * Generate metadata file if configured\n * Creates a JSON manifest with information about all processed images\n * Useful for debugging or integration with other tools\n * @param {Map} processedImages - Cache of processed images\n * @param {Object} files - Metalsmith files object\n * @param {Object} config - Plugin configuration\n */\nexport function generateMetadata( processedImages, files, config ) {\n const metadataObj = {};\n processedImages.forEach( ( value, key ) => {\n // Extract the original path from the cache key (path:mtime)\n const [path] = key.split( ':' );\n\n // Handle both array format (from background processing) and object format (from HTML processing)\n const variants = Array.isArray( value ) ? value : value.variants;\n\n metadataObj[path] = variants.map( ( v ) => ( {\n path: v.path,\n width: v.width,\n height: v.height,\n format: v.format,\n size: v.size\n } ) );\n } );\n\n const metadataPath = path.join( config.outputDir, 'responsive-images-manifest.json' );\n files[metadataPath] = {\n contents: Buffer.from( JSON.stringify( metadataObj, null, 2 ) )\n };\n}\n\n/**\n * Process a single image with progressive loading\n * Creates low-quality placeholders and high-resolution images with smooth transitions\n * @param {Object} context - Processing context\n * @return {Promise<void>} - Promise that resolves when the image is processed\n */\nasync function processProgressiveImage( { $, img, files, metalsmith, processedImages, debug, config } ) {\n const $img = $( img );\n const src = $img.attr( 'src' );\n\n debug( `Starting progressive processing for: ${src}` );\n\n if ( !src || src.startsWith( 'http' ) || src.startsWith( 'data:' ) ) {\n debug( `Skipping external or data URL: ${src}` );\n return;\n }\n\n // Skip SVG files - they are vector graphics that don't need responsive raster variants\n if ( src.toLowerCase().endsWith( '.svg' ) ) {\n debug( `Skipping SVG file (vector graphics don't need responsive variants): ${src}` );\n return;\n }\n\n // Normalize src path to match Metalsmith files object keys\n const normalizedSrc = src.startsWith( '/' ) ? src.slice( 1 ) : src;\n\n // Image not in files, try to load it from the build directory (same logic as processImage)\n if ( !files[normalizedSrc] ) {\n try {\n const destination = metalsmith.destination();\n const imagePath = path.join( destination, normalizedSrc );\n\n if ( fs.existsSync( imagePath ) ) {\n // Load the image contents from the build directory\n const imageBuffer = fs.readFileSync( imagePath );\n\n // Get modification time for cache busting\n const mtime = fs.statSync( imagePath ).mtimeMs;\n\n // Add it to files so the plugin can process it\n files[normalizedSrc] = {\n contents: imageBuffer,\n mtime\n };\n } else {\n debug( `Image not found in build: ${normalizedSrc}` );\n return;\n }\n } catch ( err ) {\n debug( `Error processing image from build directory: ${err.message}` );\n return;\n }\n }\n\n // Create a cache key\n const fileMtime = files[normalizedSrc].mtime || Date.now();\n const cacheKey = `${normalizedSrc}:${fileMtime}`;\n\n // Check if we've already processed this image\n if ( processedImages.has( cacheKey ) ) {\n debug( `Using cached variants for ${normalizedSrc}` );\n const { variants, placeholderData } = processedImages.get( cacheKey );\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n return;\n }\n\n debug( `Processing progressive image: ${normalizedSrc}` );\n\n try {\n // Process image to generate all variants (sizes and formats)\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n // Generate low-quality placeholder image for smooth loading transitions\n const placeholderData = await generatePlaceholder(\n normalizedSrc,\n files[normalizedSrc].contents,\n config.placeholder,\n metalsmith\n );\n\n // Save all variants to Metalsmith files\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Save placeholder to files\n files[placeholderData.path] = {\n contents: placeholderData.contents\n };\n\n // Cache variants and placeholder for this image\n processedImages.set( cacheKey, { variants, placeholderData } );\n\n // Create progressive wrapper with placeholder and high-res image\n const $wrapper = createProgressiveWrapper( $, $img, variants, placeholderData, config );\n $img.replaceWith( $wrapper );\n } catch ( err ) {\n debug( `Error processing progressive image: ${err.message}` );\n\n // Fallback to standard processing if progressive loading fails\n try {\n const variants = await processImageToVariants( files[normalizedSrc].contents, normalizedSrc, debug, config );\n\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n const $picture = createStandardPicture( $, $img, variants, config );\n $img.replaceWith( $picture );\n } catch ( fallbackErr ) {\n debug( `Fallback processing also failed: ${fallbackErr.message}` );\n }\n }\n}\n\n/**\n * Inject progressive loading CSS and JavaScript assets\n * Only injects if progressive images are actually present on the page\n * @param {Object} $ - Cheerio instance\n */\nfunction injectProgressiveAssets( $ ) {\n // Check if progressive images exist on this page\n const hasProgressiveImages = $( '.js-progressive-image-wrapper' ).length > 0;\n\n if ( !hasProgressiveImages ) {\n return;\n }\n\n // Inject CSS styles for progressive loading (only once per page)\n if ( !$( '#progressive-image-styles' ).length ) {\n $( 'head' ).append( `<style id=\"progressive-image-styles\">${progressiveImageCSS}</style>` );\n }\n\n // Inject JavaScript for intersection observer and loading logic (only once per page)\n if ( !$( '#progressive-image-loader' ).length ) {\n $( 'body' ).append( `<script id=\"progressive-image-loader\">${progressiveImageLoader}</script>` );\n }\n}\n","/**\n * Metalsmith plugin for generating responsive images with optimal formats\n * @module metalsmith-optimize-images\n */\n\n/**\n * @typedef {Object} Options\n * @property {number[]} [widths=[320, 640, 960, 1280, 1920]] - Array of image widths to generate\n * @property {string[]} [formats=['avif', 'webp', 'original']] - Array of image formats to generate (in order of preference)\n * @property {Object} [formatOptions] - Format-specific compression settings\n * @property {Object} [formatOptions.avif] - AVIF compression options\n * @property {Object} [formatOptions.webp] - WebP compression options\n * @property {Object} [formatOptions.jpeg] - JPEG compression options\n * @property {Object} [formatOptions.png] - PNG compression options\n * @property {string} [htmlPattern='**\\/*.html'] - Glob pattern to match HTML files\n * @property {string} [imgSelector='img:not([data-no-responsive])'] - CSS selector for images to process\n * @property {string} [outputDir='assets/images/responsive'] - Output directory for processed images\n * @property {string} [outputPattern='[filename]-[width]w-[hash].[format]'] - Output naming pattern\n * @property {boolean} [skipLarger=true] - Whether to skip generating sizes larger than original\n * @property {boolean} [lazy=true] - Whether to add loading=\"lazy\" to images\n * @property {boolean} [dimensionAttributes=true] - Whether to add width/height attributes\n * @property {string} [sizes] - Default sizes attribute\n * @property {number} [concurrency=5] - Maximum number of images to process in parallel\n * @property {boolean} [generateMetadata=false] - Whether to generate a metadata JSON file\n * @property {boolean} [isProgressive=false] - Whether to use progressive image loading\n * @property {Object} [placeholder] - Placeholder image settings for progressive loading\n * @property {number} [placeholder.width=50] - Placeholder image width\n * @property {number} [placeholder.quality=30] - Placeholder image quality\n * @property {number} [placeholder.blur=10] - Placeholder image blur amount\n * @property {boolean} [processUnusedImages=true] - Whether to process unused images for background use\n * @property {string} [imagePattern='**\\/*.{jpg,jpeg,png,gif,webp,avif}'] - Glob pattern to find images for background processing\n * @property {string} [imageFolder='lib/assets/images'] - Folder to scan for background images, relative to source\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport * as mkdirp from 'mkdirp';\nimport sharp from 'sharp';\nimport { buildConfig } from './utils/config.js';\nimport { processHtmlFile, generateMetadata } from './processors/htmlProcessor.js';\n\n/**\n * Creates a responsive images plugin for Metalsmith\n * Generates multiple sizes and formats of images and replaces img tags with picture elements\n *\n * @param {Options} [options={}] - Configuration options for the plugin\n * @returns {import('metalsmith').Plugin} - Metalsmith plugin function\n */\nfunction optimizeImagesPlugin( options = {} ) {\n // Build configuration with defaults and user options\n const config = buildConfig( options );\n\n /**\n * The Metalsmith plugin function\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Function} done - Callback function\n * @return {void}\n */\n return async function optimizeImages( files, metalsmith, done ) {\n try {\n const destination = metalsmith.destination();\n const outputPath = path.join( destination, config.outputDir );\n\n // Set up debug function for logging (uses 'DEBUG=metalsmith-optimize-images*' env var)\n const debug = metalsmith.debug( 'metalsmith-optimize-images' );\n\n // Ensure the output directory exists where processed images will be saved\n mkdirp.mkdirpSync( outputPath );\n\n // Find all HTML files that match the pattern (default: **/*.html)\n // Also ensure they actually end with .html to avoid processing CSS/JS files\n const htmlFiles = Object.keys( files ).filter( ( file ) => {\n // Must match the HTML pattern\n if ( !metalsmith.match( config.htmlPattern, file ) ) {\n return false;\n }\n\n // Must actually be an HTML file\n if ( !file.endsWith( '.html' ) ) {\n return false;\n }\n\n return true;\n } );\n\n if ( htmlFiles.length === 0 ) {\n debug( 'No HTML files found' );\n return done();\n }\n\n // Cache to avoid re-processing identical images across different HTML files\n // Key: \"filepath:mtime\", Value: array of processed image variants\n const processedImages = new Map();\n\n // Chunk HTML files to respect concurrency limit (default: 5)\n // This prevents overwhelming the system with too many parallel operations\n const chunks = [];\n for ( let i = 0; i < htmlFiles.length; i += config.concurrency ) {\n chunks.push( htmlFiles.slice( i, i + config.concurrency ) );\n }\n\n // Process all chunks in parallel - each chunk processes its files in parallel\n // This creates a two-level parallelism: chunk-level and file-level within chunks\n await Promise.all(\n chunks.map( async ( chunk ) => {\n // Process files within each chunk in parallel\n await Promise.all(\n chunk.map( async ( htmlFile ) => {\n // This function parses HTML, finds images, processes them, and updates the HTML\n await processHtmlFile( htmlFile, files[htmlFile], files, metalsmith, processedImages, debug, config );\n } )\n );\n } )\n );\n\n // Process unused images for background image support\n // This finds images that weren't processed during HTML scanning and creates variants\n // for use in CSS background-image with image-set()\n if ( config.processUnusedImages ) {\n await processUnusedImages( files, metalsmith, processedImages, debug, config );\n }\n\n // Optional: Generate a JSON metadata file with information about all processed images\n // Useful for debugging or integration with other tools\n if ( config.generateMetadata ) {\n generateMetadata( processedImages, files, config );\n }\n\n debug( 'Responsive images processing complete' );\n done();\n } catch ( err ) {\n // Use console.error for errors to ensure they're visible even if debug mode is not enabled\n console.error( `Error in responsive images plugin: ${err.message}` );\n done( err );\n }\n };\n}\n\n/**\n * Process unused images for background image support\n * Finds images that weren't processed during HTML scanning and creates 1x/2x variants\n * for use in CSS background-image with image-set()\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Map} processedImages - Cache of already processed images\n * @param {Function} debug - Debug function\n * @param {Object} config - Plugin configuration\n * @return {Promise<void>} - Promise that resolves when processing is complete\n */\nasync function processUnusedImages( files, metalsmith, processedImages, debug, config ) {\n debug( 'Processing unused images for background image support' );\n\n // Get all image paths that were already processed during HTML scanning\n const processedImagePaths = new Set();\n processedImages.forEach( ( _variants, cacheKey ) => {\n const [imagePath] = cacheKey.split( ':' );\n processedImagePaths.add( imagePath );\n } );\n\n debug( `Processed image paths from HTML: ${Array.from( processedImagePaths ).join( ', ' )}` );\n\n // Find images that weren't processed during HTML scanning using hybrid approach\n const allBackgroundImages = await findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug );\n debug( `Background images found to process: ${allBackgroundImages.map( ( img ) => img.path ).join( ', ' )}` );\n\n if ( allBackgroundImages.length === 0 ) {\n debug( 'No unused images found to process' );\n return;\n }\n\n debug( `Found ${allBackgroundImages.length} unused images to process for background use` );\n\n // Process background images in parallel for better performance\n await Promise.all(\n allBackgroundImages.map( async ( imageObj ) => {\n try {\n debug( `Processing background image: ${imageObj.path} (source: ${imageObj.source})` );\n\n // Generate background variants with original size and half size\n const variants = await processBackgroundImageVariants( imageObj.buffer, imageObj.path, debug, config );\n\n // Save all generated variants to Metalsmith files object\n variants.forEach( ( variant ) => {\n files[variant.path] = {\n contents: variant.buffer\n };\n } );\n\n // Cache the variants (using current timestamp as mtime for unused images)\n const cacheKey = `${imageObj.path}:${Date.now()}`;\n processedImages.set( cacheKey, variants );\n\n debug( `Generated ${variants.length} background variants for ${imageObj.path}` );\n } catch ( err ) {\n debug( `Error processing background image ${imageObj.path}: ${err.message}` );\n }\n } )\n );\n\n debug( 'Background image processing complete' );\n}\n\n/**\n * Find images that weren't processed during HTML scanning\n * Uses a hybrid approach: scans filesystem first, then falls back to Metalsmith files object\n * @param {Object} files - Metalsmith files object\n * @param {Object} metalsmith - Metalsmith instance\n * @param {Object} config - Plugin configuration\n * @param {Set} processedImagePaths - Set of already processed image paths\n * @param {Function} debug - Debug function\n * @return {Promise<Array>} - Array of unprocessed image objects with {path, buffer}\n */\nasync function findUnprocessedImages( files, metalsmith, config, processedImagePaths, debug ) {\n const unprocessedImages = [];\n const sourceImagesDir = path.join( metalsmith.source(), 'lib/assets/images' );\n\n debug( `Looking for unprocessed images using hybrid approach` );\n\n // Method 1: Scan filesystem (for real testbed scenario)\n try {\n debug( `Attempting to scan source directory: ${sourceImagesDir}` );\n debug( `Source directory exists: ${fs.existsSync( sourceImagesDir )}` );\n debug( `Metalsmith source: ${metalsmith.source()}` );\n debug( `Metalsmith destination: ${metalsmith.destination()}` );\n\n if ( fs.existsSync( sourceImagesDir ) ) {\n debug( `Scanning source directory: ${sourceImagesDir}` );\n\n const scanDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning subdirectory: ${item}` );\n scanDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant: ${itemRelativePath}` );\n continue;\n }\n\n const buildPath = path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem'\n } );\n }\n }\n }\n }\n };\n\n scanDirectory( sourceImagesDir );\n } else {\n debug( `Source directory does not exist, trying alternative paths...` );\n\n // Try alternative paths\n const altPaths = [\n path.join( metalsmith.source(), 'assets/images' ),\n path.join( metalsmith.source(), 'images' ),\n path.join( metalsmith.destination(), 'assets/images' ),\n path.join( process.cwd(), 'lib/assets/images' ),\n path.join( process.cwd(), 'src/assets/images' )\n ];\n\n for ( const altPath of altPaths ) {\n debug( `Trying alternative path: ${altPath} - exists: ${fs.existsSync( altPath )}` );\n if ( fs.existsSync( altPath ) ) {\n debug( `Found images at alternative path: ${altPath}` );\n\n // Scan the found alternative path\n const scanAlternativeDirectory = ( dir, relativePath = '' ) => {\n const items = fs.readdirSync( dir );\n debug( `Found ${items.length} items in alternative path ${dir}` );\n\n for ( const item of items ) {\n if ( item === '.DS_Store' ) {\n continue;\n }\n\n const fullPath = path.join( dir, item );\n const itemRelativePath = path.join( relativePath, item );\n\n if ( fs.statSync( fullPath ).isDirectory() ) {\n debug( `Scanning alternative subdirectory: ${item}` );\n scanAlternativeDirectory( fullPath, itemRelativePath );\n } else {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n if ( imageExtensions.some( ( ext ) => item.toLowerCase().endsWith( ext ) ) ) {\n // Skip if this is in the responsive output directory\n if (\n itemRelativePath.startsWith( 'responsive/' ) ||\n itemRelativePath.includes( '/responsive/' ) ||\n fullPath.includes( config.outputDir )\n ) {\n debug( `Skipping responsive variant in alt scan: ${itemRelativePath}` );\n continue;\n }\n\n // For build directory, the path structure is already correct\n const buildPath = altPath.includes( 'build' )\n ? path.join( 'assets/images', itemRelativePath )\n : path.join( 'assets/images', itemRelativePath );\n const normalizedBuildPath = buildPath.replace( /\\\\/g, '/' );\n\n debug( `Found alternative filesystem image: ${item} -> ${normalizedBuildPath}` );\n debug( `Already processed? ${processedImagePaths.has( normalizedBuildPath )}` );\n\n if ( !processedImagePaths.has( normalizedBuildPath ) ) {\n debug( `Found unprocessed alternative filesystem image: ${itemRelativePath}` );\n const imageBuffer = fs.readFileSync( fullPath );\n unprocessedImages.push( {\n path: itemRelativePath,\n buffer: imageBuffer,\n source: 'filesystem-alt'\n } );\n }\n }\n }\n }\n };\n\n scanAlternativeDirectory( altPath );\n break; // Stop after finding and scanning the first valid path\n }\n }\n }\n } catch ( err ) {\n debug( `Error scanning filesystem: ${err.message}` );\n }\n\n // Method 2: Scan Metalsmith files object (for test scenarios and edge cases)\n debug( `Scanning Metalsmith files object` );\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.avif'];\n\n Object.keys( files ).forEach( ( filePath ) => {\n // Skip if not an image\n if ( !imageExtensions.some( ( ext ) => filePath.toLowerCase().endsWith( ext ) ) ) {\n return;\n }\n\n // Skip if it's already a responsive variant (comprehensive checks)\n if (\n filePath.startsWith( `${config.outputDir}/` ) ||\n filePath.includes( '/responsive/' ) ||\n filePath.includes( 'responsive-images-manifest.json' ) ||\n filePath.match( /-\\d+w(-[a-f0-9]+)?\\.(avif|webp|jpg|jpeg|png)$/i )\n ) {\n debug( `Skipping responsive variant in files object: ${filePath}` );\n return;\n }\n\n // Skip if already processed during HTML scanning\n if ( processedImagePaths.has( filePath ) ) {\n debug( `Skipping already processed files object image: ${filePath}` );\n return;\n }\n\n // Check if we already found this image from filesystem scan\n const isAlreadyFound = unprocessedImages.some( ( img ) => {\n // For files object images starting with 'images/', check if filesystem found the same file\n if ( filePath.startsWith( 'images/' ) ) {\n const relativePath = filePath.replace( 'images/', '' );\n return img.path === relativePath;\n }\n return false;\n } );\n\n if ( !isAlreadyFound ) {\n debug( `Found unprocessed files object image: ${filePath}` );\n unprocessedImages.push( {\n path: filePath,\n buffer: files[filePath].contents,\n source: 'files'\n } );\n }\n } );\n\n debug( `Found ${unprocessedImages.length} unprocessed images total` );\n return unprocessedImages;\n}\n\n/**\n * Process a background image to create 1x (original) and 2x (half-size) variants\n * for use with CSS image-set() for retina displays\n * @param {Buffer} buffer - Original image buffer\n * @param {string} originalPath - Original image path\n * @param {Function} debugFn - Debug function for logging\n * @param {Object} config - Plugin configuration\n * @return {Promise<Array<Object>>} - Array of generated variants\n */\nasync function processBackgroundImageVariants( buffer, originalPath, debugFn, config ) {\n const image = sharp( buffer );\n const metadata = await image.metadata();\n const variants = [];\n\n debugFn( `Processing background image ${originalPath}: ${metadata.width}x${metadata.height}` );\n\n // Create 1x (original size) and 2x (half size) variants\n const sizes = [\n { width: metadata.width, density: '1x' },\n { width: Math.round( metadata.width / 2 ), density: '2x' }\n ];\n\n // Process both sizes in parallel\n const sizePromises = sizes.map( async ( size ) => {\n // Create a Sharp instance for this size\n const resized = image.clone().resize( {\n width: size.width,\n withoutEnlargement: true // Don't upscale images\n } );\n\n // Get actual dimensions after resize\n const resizedMeta = await resized.metadata();\n\n // Process each format in parallel for this size\n const formatPromises = config.formats.map( async ( format ) => {\n try {\n // Skip problematic format combinations\n if ( format === 'original' && metadata.format.toLowerCase() === 'webp' ) {\n return null;\n }\n\n // Determine output format and Sharp method\n let outputFormat = format;\n let sharpMethod = format;\n\n if ( format === 'original' ) {\n outputFormat = metadata.format.toLowerCase();\n sharpMethod = outputFormat === 'jpeg' ? 'jpeg' : outputFormat;\n }\n\n // Apply format-specific processing\n let processedImage = resized.clone();\n const formatOptions = config.formatOptions[format === 'original' ? outputFormat : format] || {};\n\n if ( sharpMethod === 'avif' ) {\n processedImage = processedImage.avif( formatOptions );\n } else if ( sharpMethod === 'webp' ) {\n processedImage = processedImage.webp( formatOptions );\n } else if ( sharpMethod === 'jpeg' ) {\n processedImage = processedImage.jpeg( formatOptions );\n } else if ( sharpMethod === 'png' ) {\n processedImage = processedImage.png( formatOptions );\n }\n\n // Generate output buffer\n const outputBuffer = await processedImage.toBuffer();\n\n // Generate variant path without hash for easier CSS usage\n const variantPath = generateBackgroundVariantPath( originalPath, size.width, outputFormat, config );\n\n debugFn( `Generated background variant: ${variantPath} (${size.density})` );\n\n return {\n path: variantPath,\n buffer: outputBuffer,\n width: resizedMeta.width,\n height: resizedMeta.height,\n format: outputFormat,\n density: size.density\n };\n } catch ( err ) {\n debugFn( `Error processing ${format} format for ${originalPath}: ${err.message}` );\n return null;\n }\n } );\n\n const formatResults = await Promise.all( formatPromises );\n return formatResults.filter( ( result ) => result !== null );\n } );\n\n const sizeResults = await Promise.all( sizePromises );\n\n // Flatten the results\n sizeResults.forEach( ( formatVariants ) => {\n variants.push( ...formatVariants );\n } );\n\n debugFn( `Generated ${variants.length} background variants for ${originalPath}` );\n return variants;\n}\n\n/**\n * Generate background image variant path without hash for easier CSS usage\n * Creates predictable filenames that can be written in CSS without knowing the hash\n * @param {string} originalPath - Original image path\n * @param {number} width - Target width\n * @param {string} format - Target format\n * @param {Object} config - Plugin configuration\n * @return {string} - Generated path without hash\n */\nfunction generateBackgroundVariantPath( originalPath, width, format, config ) {\n const parsedPath = path.parse( originalPath );\n const originalFormat = parsedPath.ext.slice( 1 ).toLowerCase();\n\n // If format is 'original', use the source format\n const outputFormat = format === 'original' ? originalFormat : format;\n\n // Create background pattern without hash: '[filename]-[width]w.[format]'\n // Results in: 'header1-1000w.webp' instead of 'header1-1000w-abc12345.webp'\n const outputName = config.outputPattern\n .replace( '[filename]', parsedPath.name )\n .replace( '[width]', width )\n .replace( '[format]', outputFormat )\n .replace( '-[hash]', '' ) // Remove hash placeholder and preceding dash\n .replace( '[hash]', '' ); // Remove any remaining hash placeholder\n\n return path.join( config.outputDir, outputName );\n}\n\n// Set function name for better debugging\nObject.defineProperty( optimizeImagesPlugin, 'name', { \n value: 'metalsmith-optimize-images' \n} );\n\nexport default optimizeImagesPlugin;\n"],"names":["deepMerge","target","source","Object","keys","reduce","acc","key","_source$key","constructor","buildConfig","options","defaults","widths","formats","formatOptions","avif","quality","speed","webp","lossless","jpeg","progressive","png","compressionLevel","palette","htmlPattern","imgSelector","outputDir","outputPattern","skipLarger","lazy","dimensionAttributes","sizes","concurrency","generateMetadata","isProgressive","placeholder","width","blur","processUnusedImages","imagePattern","generateHash","buffer","crypto","createHash","update","digest","slice","generateVariantPath","originalPath","format","hash","config","parsedPath","path","parse","originalFormat","ext","toLowerCase","outputFormat","outputName","replace","name","join","processImageToVariants","debugFn","image","sharp","metadata","variants","targetWidths","filter","w","length","widthPromises","map","resized","clone","resize","withoutEnlargement","resizedMeta","formatPromises","formatted","outputPath","toFormat","formatBuffer","toBuffer","size","height","err","message","formatResults","Promise","all","v","widthResults","push","flat","processImage","$","img","files","metalsmith","processedImages","debug","replacePictureElement","$img","src","attr","startsWith","endsWith","normalizedSrc","destination","imagePath","fs","existsSync","imageBuffer","readFileSync","mtime","statSync","mtimeMs","contents","fileMtime","Date","now","cacheKey","has","get","forEach","variant","set","generatePlaceholder","placeholderConfig","processed","fileName","basename","extname","originalWidth","originalHeight","error","createProgressiveWrapper","placeholderData","_config","alt","className","variantsByFormat","find","f","originalVariants","aspectRatio","largestVariant","sort","a","b","highResVariant","Math","floor","$wrapper","addClass","$lowRes","$highRes","appendTo","createStandardPicture","sizesAttr","$picture","formatVariants","srcset","_formatVariants$Math$","defaultSrc","$newImg","progressiveImageLoader","progressiveImageCSS","attrib","attribs","includes","replaceWith","processHtmlFile","htmlFile","fileData","Buffer","isBuffer","content","toString","cheerio","load","images","imageChunks","i","Array","from","imageChunk","processProgressiveImage","injectProgressiveAssets","html","metadataObj","value","split","isArray","metadataPath","JSON","stringify","fallbackErr","hasProgressiveImages","append","optimizeImagesPlugin","optimizeImages","done","mkdirp","mkdirpSync","htmlFiles","file","match","Map","chunks","chunk","console","processedImagePaths","Set","_variants","add","allBackgroundImages","findUnprocessedImages","imageObj","processBackgroundImageVariants","unprocessedImages","sourceImagesDir","scanDirectory","dir","relativePath","items","readdirSync","item","fullPath","itemRelativePath","isDirectory","imageExtensions","some","buildPath","normalizedBuildPath","altPaths","process","cwd","altPath","scanAlternativeDirectory","filePath","isAlreadyFound","density","round","sizePromises","sharpMethod","processedImage","outputBuffer","variantPath","generateBackgroundVariantPath","result","sizeResults","defineProperty"],"mappings":"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AACR,QAAQ,CAAEG,QAAS,CAAC,CAAA;AAC9B,GAAA;AAEA,EAAA,OAAOA,QAAQ,CAAA;AACjB,CAAA;;AAEA;AACA;AACA;AACA;AACO,MAAMM,sBAAsB,GAAG,CAAA;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAG,CAAA;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC1XD;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASlE,qBAAqBA,CAAEN,CAAC,EAAEO,IAAI,EAAErC,QAAQ,EAAEjB,MAAM,EAAG;AACjE,EAAA,IAAKiB,QAAQ,CAACI,MAAM,KAAK,CAAC,EAAG;AAC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"}
|