Wrapper of the Sharp image manipulation library for Gatsby plugins
57
Pending
Does it follow best practices?
Impact
57%
1.07xAverage score across 10 eval scenarios
Pending
The risk profile of this skill
Configuration management for plugin options, transform parameters, and default settings.
Functions for setting and retrieving global plugin configuration.
/**
* Sets global plugin options
* @param opts - Configuration options object
* @returns Updated plugin options
*/
function setPluginOptions(opts: Record<string, string>): ISharpPluginOptions;
/**
* Retrieves current plugin options
* @returns Current plugin options
*/
function getPluginOptions(): ISharpPluginOptions;
/**
* Gets default plugin options
* @returns Default plugin options
*/
function getPluginOptionsDefaults(): ISharpPluginOptions;
interface ISharpPluginOptions {
/** Width of generated base64 preview images */
base64Width?: number;
/** Force specific format for base64 images */
forceBase64Format?: "png" | "webp" | "jpg" | string;
/** Use mozJpeg encoder for JPEG processing */
useMozJpeg?: boolean;
/** Strip metadata from processed images */
stripMetadata?: boolean;
/** Enable lazy image generation in development */
lazyImageGeneration?: boolean;
/** Default quality for image processing (1-100) */
defaultQuality: number;
/** Level of sensitivity to invalid images */
failOn?: "none" | "truncated" | "error" | "warning";
/** Default settings for gatsby-plugin-image */
defaults?: PluginOptionsDefaults;
}Usage Examples:
import { setPluginOptions, getPluginOptions } from "gatsby-plugin-sharp";
// Set plugin options
const options = setPluginOptions({
defaultQuality: "85",
base64Width: "30",
stripMetadata: "false",
useMozJpeg: "true"
});
// Get current options
const currentOptions = getPluginOptions();
console.log(`Default quality: ${currentOptions.defaultQuality}`);
// Get default options
const defaults = getPluginOptionsDefaults();
console.log(`Default base64 width: ${defaults.base64Width}`);Functions for creating and processing transform parameter objects.
/**
* Creates standardized transform options object
* @param args - Transform arguments
* @returns Processed transform options with defaults applied
*/
function createTransformObject(args: ITransformArgs): Partial<ITransformArgs>;
interface ITransformArgs {
/** Output width in pixels */
width?: number;
/** Output height in pixels */
height?: number;
/** Crop focus area for resizing */
cropFocus?: number | string;
/** Output format */
toFormat?: string;
/** PNG compression level (0-9) */
pngCompressionLevel?: number;
/** Image quality (1-100) */
quality?: number;
/** JPEG quality (overrides general quality) */
jpegQuality?: number;
/** PNG quality (overrides general quality) */
pngQuality?: number;
/** WebP quality (overrides general quality) */
webpQuality?: number;
/** Use progressive JPEG encoding */
jpegProgressive?: boolean;
/** Convert to grayscale */
grayscale?: boolean;
/** Rotation angle in degrees */
rotate?: number;
/** Trim whitespace pixels */
trim?: number;
/** Duotone effect configuration */
duotone?: {
highlight: string;
shadow: string;
opacity?: number;
};
/** Resize fit mode */
fit?: "cover" | "contain" | "fill" | "inside" | "outside";
/** Background color for transparent areas */
background?: string;
/** Path prefix for generated URLs */
pathPrefix?: string;
/** Maximum width for fluid images */
maxWidth?: number;
/** Maximum height for fluid images */
maxHeight?: number;
/** Base64 thumbnail width */
base64Width?: number;
}Usage Examples:
import { createTransformObject } from "gatsby-plugin-sharp";
// Create transform object with defaults
const transform = createTransformObject({
width: 800,
height: 600,
quality: 85,
toFormat: "webp",
fit: "cover"
});
// Transform object filters out undefined values and applies defaults
console.log(transform);
// { width: 800, height: 600, quality: 85, toFormat: "webp", fit: "cover", jpegProgressive: true, pngCompressionLevel: 9 }Functions for merging, validating, and processing configuration options.
/**
* Merges user arguments with plugin defaults for gatsby-plugin-image
* @param args - User-provided image arguments
* @returns Merged configuration with defaults applied
*/
function mergeDefaults(args: ISharpGatsbyImageArgs): PluginOptionsDefaults & ISharpGatsbyImageArgs;
/**
* Normalizes and validates transform options
* @param pluginOptions - Plugin configuration
* @param args - Transform arguments
* @param fileExtension - File extension for format inference
* @param defaultArgs - Additional default arguments
* @returns Processed options with validation and defaults applied
*/
function healOptions(
pluginOptions: Pick<ISharpPluginOptions, "defaultQuality" | "base64Width">,
args: ITransformArgs,
fileExtension?: string,
defaultArgs?: Record<string, any>
): Partial<IGeneralArgs> & { quality: number } & ITransformArgs;
/**
* Strips default values for minimal transform arguments
* @param args - Transform arguments
* @param pluginOptions - Plugin options for comparison
* @returns Minimal transform arguments with defaults removed
*/
function removeDefaultValues(
args: ITransformArgs,
pluginOptions: ISharpPluginOptions
): Partial<ITransformArgs>;Usage Examples:
import { mergeDefaults, healOptions, removeDefaultValues } from "gatsby-plugin-sharp";
// Merge with defaults for gatsby-plugin-image
const mergedArgs = mergeDefaults({
layout: "constrained",
width: 800,
placeholder: "blurred"
});
// Heal and validate options
const processedOptions = healOptions(
{ defaultQuality: 80, base64Width: 20 },
{ width: 800, quality: 85 },
"jpg"
);
// Remove default values for minimal payload
const minimalArgs = removeDefaultValues(
{ width: 800, quality: 50, jpegProgressive: true },
getPluginOptions()
);const pluginDefaults = {
base64Width: 20, // Base64 thumbnail width
forceBase64Format: "", // No forced format
useMozJpeg: process.env.GATSBY_JPEG_ENCODER === "MOZJPEG",
stripMetadata: true, // Strip EXIF data
lazyImageGeneration: true, // Enable lazy loading in development
defaultQuality: 50, // Default image quality
failOn: "warning" // Fail on warnings
};const generalArgs = {
quality: 50, // Default quality
jpegQuality: undefined, // Use general quality
pngQuality: undefined, // Use general quality
webpQuality: undefined, // Use general quality
jpegProgressive: true, // Progressive JPEG
pngCompressionLevel: 9, // Maximum PNG compression
pngCompressionSpeed: 4, // PNG compression speed
base64: true, // Generate base64 placeholders
grayscale: false, // No grayscale conversion
duotone: undefined, // No duotone effect
pathPrefix: "", // No path prefix
toFormat: "", // Auto-detect format
toFormatBase64: "", // Auto-detect base64 format
rotate: 0 // No rotation
};const DEFAULT_PIXEL_DENSITIES = [0.25, 0.5, 1, 2]; // Standard pixel densities
const DEFAULT_FLUID_SIZE = 800; // Default fluid image size
const DEFAULT_BREAKPOINTS = [750, 1080, 1366, 1920]; // Standard responsive breakpoints
const DOMINANT_COLOR_IMAGE_SIZE = 200; // Size for dominant color calculation
const DEFAULT_BLURRED_IMAGE_WIDTH = 20; // Blurred placeholder width// gatsby-config.js
module.exports = {
plugins: [
{
resolve: "gatsby-plugin-sharp",
options: {
defaultQuality: 75,
base64Width: 30,
stripMetadata: false,
useMozJpeg: true,
failOn: "error",
defaults: {
formats: ["auto", "webp"],
placeholder: "blurred",
quality: 80,
breakpoints: [640, 768, 1024, 1280, 1920],
backgroundColor: "transparent"
}
}
}
]
};// gatsby-config.js with comprehensive options
module.exports = {
plugins: [
{
resolve: "gatsby-plugin-sharp",
options: {
defaultQuality: 85,
base64Width: 40,
forceBase64Format: "webp",
stripMetadata: true,
useMozJpeg: process.env.NODE_ENV === "production",
failOn: "warning",
defaults: {
formats: ["auto", "webp", "avif"],
placeholder: "dominantColor",
quality: 90,
breakpoints: [480, 768, 1024, 1200, 1600],
backgroundColor: "#f8f9fa",
transformOptions: {
fit: "cover",
cropFocus: "attention"
},
jpgOptions: {
quality: 95,
progressive: true
},
pngOptions: {
quality: 90,
compressionLevel: 6
},
webpOptions: {
quality: 85
},
avifOptions: {
quality: 80
},
blurredOptions: {
width: 40,
toFormat: "webp"
}
}
}
}
]
};import { setPluginOptions } from "gatsby-plugin-sharp";
// Override options at runtime
setPluginOptions({
defaultQuality: "90",
base64Width: "25",
stripMetadata: "false"
});
// Create custom transform with overrides
const customTransform = createTransformObject({
width: 1200,
quality: 95,
toFormat: "avif",
fit: "cover",
cropFocus: "entropy"
});The plugin respects several environment variables:
# Use mozJpeg encoder for JPEG processing
GATSBY_JPEG_ENCODER=MOZJPEG
# Enable lazy image generation in CI
GATSBY_ENABLE_LAZY_IMAGES_IN_CI=true
# Disable external job processing
ENABLE_GATSBY_EXTERNAL_JOBS=false// Automatic validation of dimension values
const validateDimensions = (options: ITransformArgs) => {
["width", "height", "maxWidth", "maxHeight"].forEach(prop => {
if (typeof options[prop] !== "undefined" && options[prop] < 1) {
throw new Error(
`${prop} has to be a positive int larger than zero (> 0), now it's ${options[prop]}`
);
}
});
};// Automatic format normalization
const normalizeFormat = (format: string) => {
if (format === "jpeg") return "jpg";
return format.toLowerCase();
};// Quality value parsing and validation
const normalizeQuality = (quality: any) => {
const parsed = parseInt(quality, 10);
return Math.max(1, Math.min(100, parsed));
};docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10