diff --git a/src/index.js b/src/index.js index 3bc35a1..04268ce 100644 --- a/src/index.js +++ b/src/index.js @@ -19,15 +19,16 @@ const { } = require("./utils.js"); const worker = require("./worker"); -/** @typedef {import("schema-utils/declarations/validate").Schema} Schema */ +/** @typedef {import("schema-utils").Schema} Schema */ /** @typedef {import("webpack").WebpackPluginInstance} WebpackPluginInstance */ /** @typedef {import("webpack").Compiler} Compiler */ /** @typedef {import("webpack").Compilation} Compilation */ -/** @typedef {import("webpack").WebpackError} WebpackError */ /** @typedef {import("webpack").Asset} Asset */ /** @typedef {import("webpack").AssetInfo} AssetInfo */ /** @typedef {import("webpack").sources.Source} Source */ /** @typedef {import("webpack").Module} Module */ +/** @typedef {import("webpack").TemplatePath} TemplatePath */ +/** @typedef {import("webpack").PathData} PathData */ /** @typedef {import("./utils.js").imageminMinify} ImageminMinifyFunction */ /** @typedef {import("./utils.js").squooshMinify} SquooshMinifyFunction */ @@ -41,16 +42,7 @@ const worker = require("./worker"); * @returns {boolean} */ -// eslint-disable-next-line jsdoc/no-restricted-syntax -/** - * @typedef {object} ImageminOptions - * @property {Array?] | import("imagemin").Plugin>} plugins plugins - */ - -// eslint-disable-next-line jsdoc/no-restricted-syntax -/** - * @typedef {{ [key: string]: any }} SquooshOptions - */ +/** @typedef {typeof import("./worker").isFilenameProcessed} IsFilenameProcessed */ /** * @typedef {object} WorkerResult @@ -58,7 +50,7 @@ const worker = require("./worker"); * @property {Buffer} data data buffer * @property {Array} warnings warnings * @property {Array} errors errors - * @property {AssetInfo} info asset info + * @property {AssetInfo & { [worker.isFilenameProcessed]?: boolean }} info asset info */ /** @@ -114,11 +106,6 @@ const worker = require("./worker"); * @typedef {BasicTransformerImplementation & BasicTransformerHelpers} TransformerFunction */ -/** - * @typedef {object} PathData - * @property {string=} filename filename - */ - /** * @callback FilenameFn * @param {PathData} pathData path data @@ -155,7 +142,7 @@ const worker = require("./worker"); * @property {Buffer} input input buffer * @property {Transformer | Transformer[]} transformer transformer * @property {string=} severityError severity error setting - * @property {(filenameTemplate: string, options: { filename: string }) => string=} generateFilename filename generator function + * @property {(filename: TemplatePath, data: PathData) => string} generateFilename filename generator function */ /** @@ -169,7 +156,7 @@ const worker = require("./worker"); * @property {Rule=} test test to match files against * @property {Rule=} include files to include * @property {Rule=} exclude files to exclude - * @property {T extends any[] ? { [P in keyof T]: Minimizer } : Minimizer | Minimizer[]=} minimizer allows to setup the minimizer + * @property {T extends any[] ? { [P in keyof T]: Minimizer } : Minimizer | Minimizer[]=} minimizer allows to set the minimizer * @property {G extends any[] ? { [P in keyof G]: Generator } : Generator[]=} generator allows to set the generator * @property {boolean=} loader automatically adding `image-loader`. * @property {number=} concurrency maximum number of concurrency optimization processes in one time @@ -328,6 +315,7 @@ class ImageMinimizerPlugin { // In some cases cpus() returns undefined // https://github.com/nodejs/node/issues/19022 + // TODO fix me const limit = Math.max( 1, this.options.concurrency ?? os.cpus()?.length ?? 1, @@ -372,15 +360,9 @@ class ImageMinimizerPlugin { }); } - compilation.warnings = [ - ...compilation.warnings, - .../** @type {[WebpackError]} */ (output.warnings), - ]; + compilation.warnings = [...compilation.warnings, ...output.warnings]; - compilation.errors = [ - ...compilation.errors, - .../** @type {[WebpackError]} */ (output.errors), - ]; + compilation.errors = [...compilation.errors, ...output.errors]; if (compilation.getAsset(output.filename)) { compilation.updateAsset( @@ -459,7 +441,7 @@ class ImageMinimizerPlugin { } /** - * @param {import("webpack").Compiler} compiler compiler + * @param {Compiler} compiler compiler */ apply(compiler) { const pluginName = this.constructor.name; diff --git a/src/loader.js b/src/loader.js index 88c18e5..88f35b8 100644 --- a/src/loader.js +++ b/src/loader.js @@ -57,10 +57,10 @@ function processSizeQuery(transformers, widthQuery, heightQuery, unitQuery) { return transformers.map((transformer) => { const minimizer = { ...transformer }; - const minimizerOptions = - /** @type { import("./index").BasicTransformerOptions & { resize?: import("./index").ResizeOptions }} */ - // @ts-expect-error - { ...minimizer.options }; + const minimizerOptions = { + .../** @type {{ options: import("./index").BasicTransformerOptions & { resize?: import("./index").ResizeOptions }}} */ + (minimizer).options, + }; minimizerOptions.resize = { ...minimizerOptions?.resize }; minimizer.options = minimizerOptions; diff --git a/src/utils.js b/src/utils.js index 2b09f71..8dbadb0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,12 +1,14 @@ const path = require("node:path"); /** @typedef {import("./index").WorkerResult} WorkerResult */ -/** @typedef {import("./index").SquooshOptions} SquooshOptions */ -/** @typedef {import("imagemin").Options} ImageminOptions */ +/** @typedef {import("./index").CustomOptions} CustomOptions */ /** @typedef {import("webpack").WebpackError} WebpackError */ /** @typedef {import("webpack").Module} Module */ /** @typedef {import("webpack").AssetInfo} AssetInfo */ +// eslint-disable-next-line jsdoc/no-restricted-syntax +/** @typedef {any} EXPECTED_ANY */ + /** * @template T * @typedef {() => Promise} Task @@ -515,9 +517,8 @@ class InvalidConfigError extends Error { } /** - * @template T - * @param {ImageminOptions} imageminConfig imagemin configuration - * @returns {Promise} normalized imagemin configuration + * @param {Record} imageminConfig imagemin configuration + * @returns {Promise>} normalized imagemin configuration */ async function imageminNormalizeConfig(imageminConfig) { if ( @@ -603,24 +604,28 @@ async function imageminNormalizeConfig(imageminConfig) { } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minimizer options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -async function imageminGenerate(original, minimizerOptions) { - const minimizerOptionsNormalized = /** @type {ImageminOptions} */ ( - await imageminNormalizeConfig( - /** @type {ImageminOptions} */ (minimizerOptions ?? {}), - ) - ); +async function imageminGenerate(original, options) { + /** @typedef {import("imagemin").Options} ImageminOptions */ + + const optionsNormalized = + /** @type {ImageminOptions} */ + ( + await imageminNormalizeConfig( + /** @type {ImageminOptions} */ + (options ?? {}), + ) + ); const imagemin = (await import("imagemin")).default; let result; try { - result = await imagemin.buffer(original.data, minimizerOptionsNormalized); + result = await imagemin.buffer(original.data, optionsNormalized); } catch (error) { const originalError = error instanceof Error ? error : new Error(/** @type {string} */ (error)); @@ -656,24 +661,28 @@ async function imageminGenerate(original, minimizerOptions) { } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} options options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ async function imageminMinify(original, options) { - const minimizerOptionsNormalized = /** @type {ImageminOptions} */ ( - await imageminNormalizeConfig( - /** @type {ImageminOptions} */ (options ?? {}), - ) - ); + /** @typedef {import("imagemin").Options} ImageminOptions */ + + const optionsNormalized = + /** @type {ImageminOptions} */ + ( + await imageminNormalizeConfig( + /** @type {ImageminOptions} */ + (options ?? {}), + ) + ); const imagemin = (await import("imagemin")).default; let result; try { - result = await imagemin.buffer(original.data, minimizerOptionsNormalized); + result = await imagemin.buffer(original.data, optionsNormalized); } catch (error) { const originalError = error instanceof Error ? error : new Error(/** @type {string} */ (error)); @@ -783,20 +792,22 @@ async function squooshImagePoolTeardown() { } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minifyOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -async function squooshGenerate(original, minifyOptions) { +async function squooshGenerate(original, options) { + // eslint-disable-next-line jsdoc/no-restricted-syntax + /** + * @typedef {{ [key: string]: any }} SquooshOptions + */ + const squoosh = require("@squoosh/lib"); const isReusePool = Boolean(pool); const imagePool = pool || squooshImagePoolCreate(); const image = imagePool.ingestImage(new Uint8Array(original.data)); - - const squooshOptions = /** @type {SquooshOptions} */ (minifyOptions ?? {}); - + const squooshOptions = /** @type {SquooshOptions} */ (options ?? {}); const preprocEntries = Object.entries(squooshOptions).filter( ([key, value]) => { if (key === "resize" && value?.enabled === false) { @@ -879,12 +890,16 @@ squooshGenerate.setup = squooshImagePoolSetup; squooshGenerate.teardown = squooshImagePoolTeardown; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} options minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ async function squooshMinify(original, options) { + // eslint-disable-next-line jsdoc/no-restricted-syntax + /** + * @typedef {{ [key: string]: any }} SquooshOptions + */ + const squoosh = require("@squoosh/lib"); const { encoders } = squoosh; @@ -979,35 +994,6 @@ squooshMinify.setup = squooshImagePoolSetup; squooshMinify.teardown = squooshImagePoolTeardown; -/** @typedef {import("sharp")} SharpLib */ -/** @typedef {import("sharp").Sharp} Sharp */ -/** @typedef {import("sharp").ResizeOptions & { enabled?: boolean; unit?: "px" | "percent" }} ResizeOptions */ - -/** - * @typedef {object} SharpEncodeOptions - * @property {import("sharp").AvifOptions=} avif AVIF options - * @property {import("sharp").GifOptions=} gif GIF options - * @property {import("sharp").HeifOptions=} heif HEIF options - * @property {import("sharp").JpegOptions=} jpeg JPEG options - * @property {import("sharp").JpegOptions=} jpg JPG options - * @property {import("sharp").PngOptions=} png PNG options - * @property {import("sharp").WebpOptions=} webp WebP options - */ - -/** - * @typedef SharpFormat - * @type {keyof SharpEncodeOptions} - */ - -// TODO remove the `SizeSuffix` option in the next major release, because we support `[width]` and `[height]` -/** - * @typedef {object} SharpOptions - * @property {ResizeOptions=} resize resize options - * @property {number | 'auto'=} rotate rotate options - * @property {SizeSuffix=} sizeSuffix size suffix - * @property {SharpEncodeOptions=} encodeOptions encode options - */ - /** * @typedef SizeSuffix * @type {(width: number, height: number) => string} @@ -1051,17 +1037,15 @@ const SHARP_MINIFY_FORMATS = new Map([ ["webp", "webp"], ]); +/** @typedef {EXPECTED_ANY} CustomSharpFormat */ + /** * @param {WorkerResult} original original original worker result - * @param {SharpOptions} minimizerOptions minify options - * @param {SharpFormat | null} targetFormat target format + * @param {CustomOptions=} options options + * @param {CustomSharpFormat | null=} targetFormat target format * @returns {Promise} transformed result */ -async function sharpTransform( - original, - minimizerOptions = {}, - targetFormat = null, -) { +async function sharpTransform(original, options = {}, targetFormat = null) { const inputExt = path.extname(original.filename).slice(1).toLowerCase(); if ( @@ -1080,23 +1064,23 @@ async function sharpTransform( return null; } - /** @type {SharpLib} */ + /** @type {import("sharp")} */ const sharp = require("sharp"); const imagePipeline = sharp(original.data, { animated: true }); // ====== rotate ====== - if (typeof minimizerOptions.rotate === "number") { - imagePipeline.rotate(minimizerOptions.rotate); - } else if (minimizerOptions.rotate === "auto") { + if (typeof options.rotate === "number") { + imagePipeline.rotate(options.rotate); + } else if (options.rotate === "auto") { imagePipeline.rotate(); } // ====== resize ====== - if (minimizerOptions.resize) { - const { enabled = true, unit = "px", ...params } = minimizerOptions.resize; + if (options.resize) { + const { enabled = true, unit = "px", ...params } = options.resize; if ( enabled && @@ -1136,10 +1120,26 @@ async function sharpTransform( const imageMetadata = await imagePipeline.metadata(); + /** + * @typedef {object} SharpEncodeOptions + * @property {import("sharp").AvifOptions=} avif AVIF options + * @property {import("sharp").GifOptions=} gif GIF options + * @property {import("sharp").HeifOptions=} heif HEIF options + * @property {import("sharp").JpegOptions=} jpeg JPEG options + * @property {import("sharp").JpegOptions=} jpg JPG options + * @property {import("sharp").PngOptions=} png PNG options + * @property {import("sharp").WebpOptions=} webp WebP options + */ + + /** + * @typedef SharpFormat + * @type {keyof SharpEncodeOptions} + */ + const outputFormat = targetFormat ?? /** @type {SharpFormat} */ (imageMetadata.format); - const encodeOptions = minimizerOptions.encodeOptions?.[outputFormat]; + const encodeOptions = options.encodeOptions?.[outputFormat]; imagePipeline.toFormat(outputFormat, encodeOptions); @@ -1151,8 +1151,8 @@ async function sharpTransform( const { width, height } = result.info; const sizeSuffix = - typeof minimizerOptions.sizeSuffix === "function" - ? minimizerOptions.sizeSuffix(width, height) + typeof options.sizeSuffix === "function" + ? options.sizeSuffix(width, height) : ""; const dotIndex = original.filename.lastIndexOf("."); @@ -1183,17 +1183,41 @@ async function sharpTransform( } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -function sharpGenerate(original, minimizerOptions) { - const sharpOptions = /** @type {SharpOptions} */ (minimizerOptions ?? {}); +function sharpGenerate(original, options) { + /** + * @typedef {object} SharpEncodeOptions + * @property {import("sharp").AvifOptions=} avif AVIF options + * @property {import("sharp").GifOptions=} gif GIF options + * @property {import("sharp").HeifOptions=} heif HEIF options + * @property {import("sharp").JpegOptions=} jpeg JPEG options + * @property {import("sharp").JpegOptions=} jpg JPG options + * @property {import("sharp").PngOptions=} png PNG options + * @property {import("sharp").WebpOptions=} webp WebP options + */ - const targetFormats = /** @type {SharpFormat[]} */ ( - Object.keys(sharpOptions.encodeOptions ?? {}) - ); + // TODO remove the `SizeSuffix` option in the next major release, because we support `[width]` and `[height]` + /** + * @typedef {object} SharpOptions + * @property {ResizeOptions=} resize resize options + * @property {number | 'auto'=} rotate rotate options + * @property {SizeSuffix=} sizeSuffix size suffix + * @property {SharpEncodeOptions=} encodeOptions encode options + */ + + const sharpOptions = /** @type {SharpOptions} */ (options ?? {}); + + /** + * @typedef SharpFormat + * @type {keyof SharpEncodeOptions} + */ + + const targetFormats = + /** @type {SharpFormat[]} */ + (Object.keys(sharpOptions.encodeOptions ?? {})); if (targetFormats.length === 0) { const error = new Error( @@ -1219,33 +1243,28 @@ function sharpGenerate(original, minimizerOptions) { } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -function sharpMinify(original, minimizerOptions) { - return sharpTransform( - original, - /** @type {SharpOptions} */ (minimizerOptions), - ); +function sharpMinify(original, options) { + return sharpTransform(original, options); } -/** @typedef {import("svgo")} SvgoLib */ -/** @typedef {Omit} SvgoEncodeOptions */ - /** - * @typedef {object} SvgoOptions - * @property {SvgoEncodeOptions=} encodeOptions encode options - */ - -/** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -async function svgoMinify(original, minimizerOptions) { +async function svgoMinify(original, options) { + /** @typedef {import("svgo")} SvgoLib */ + /** @typedef {Omit} SvgoEncodeOptions */ + + /** + * @typedef {object} SvgoOptions + * @property {SvgoEncodeOptions=} encodeOptions encode options + */ + if (path.extname(original.filename).toLowerCase() !== ".svg") { return null; } @@ -1253,7 +1272,7 @@ async function svgoMinify(original, minimizerOptions) { /** @type {SvgoLib} */ const { optimize } = require("svgo"); - const { encodeOptions } = /** @type {SvgoOptions} */ (minimizerOptions ?? {}); + const { encodeOptions } = /** @type {SvgoOptions} */ (options ?? {}); /** @type {import("svgo").Output} */ let result; diff --git a/src/worker.js b/src/worker.js index a1aa4dc..f816365 100644 --- a/src/worker.js +++ b/src/worker.js @@ -1,6 +1,7 @@ /** @typedef {import("./index").WorkerResult} WorkerResult */ /** @typedef {import("./index").FilenameFn} FilenameFn */ +/** @type {unique symbol} */ const isFilenameProcessed = Symbol("isFilenameProcessed"); /** @@ -11,12 +12,10 @@ const isFilenameProcessed = Symbol("isFilenameProcessed"); */ function processFilenameTemplate(result, options, filenameTemplate) { if ( - // @ts-expect-error need to fix !result.info[isFilenameProcessed] && typeof filenameTemplate !== "undefined" && typeof options.generateFilename === "function" ) { - // @ts-expect-error need to fix result.filename = options.generateFilename(filenameTemplate, { filename: result.filename, }); @@ -25,7 +24,6 @@ function processFilenameTemplate(result, options, filenameTemplate) { .replaceAll(/\[width\]/gi, result.info.width) .replaceAll(/\[height\]/gi, result.info.height); - // @ts-expect-error need to fix result.info[isFilenameProcessed] = true; } } @@ -136,3 +134,4 @@ async function worker(options) { } module.exports = worker; +module.exports.isFilenameProcessed = isFilenameProcessed; diff --git a/types/index.d.ts b/types/index.d.ts index 63927af..f3a7029 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -29,9 +29,9 @@ declare class ImageMinimizerPlugin { */ private teardownAll; /** - * @param {import("webpack").Compiler} compiler compiler + * @param {Compiler} compiler compiler */ - apply(compiler: import("webpack").Compiler): void; + apply(compiler: Compiler): void; } declare namespace ImageMinimizerPlugin { export { @@ -48,18 +48,18 @@ declare namespace ImageMinimizerPlugin { WebpackPluginInstance, Compiler, Compilation, - WebpackError, Asset, AssetInfo, Source, Module, + TemplatePath, + PathData, ImageminMinifyFunction, SquooshMinifyFunction, Rule, Rules, FilterFn, - ImageminOptions, - SquooshOptions, + IsFilenameProcessed, WorkerResult, Task, CustomOptions, @@ -69,7 +69,6 @@ declare namespace ImageMinimizerPlugin { BasicTransformerImplementation, BasicTransformerHelpers, TransformerFunction, - PathData, FilenameFn, Transformer, Minimizer, @@ -88,31 +87,22 @@ import { squooshGenerate } from "./utils.js"; import { sharpMinify } from "./utils.js"; import { sharpGenerate } from "./utils.js"; import { svgoMinify } from "./utils.js"; -type Schema = import("schema-utils/declarations/validate").Schema; +type Schema = import("schema-utils").Schema; type WebpackPluginInstance = import("webpack").WebpackPluginInstance; type Compiler = import("webpack").Compiler; type Compilation = import("webpack").Compilation; -type WebpackError = import("webpack").WebpackError; type Asset = import("webpack").Asset; type AssetInfo = import("webpack").AssetInfo; type Source = import("webpack").sources.Source; type Module = import("webpack").Module; +type TemplatePath = import("webpack").TemplatePath; +type PathData = import("webpack").PathData; type ImageminMinifyFunction = typeof imageminMinify; type SquooshMinifyFunction = typeof squooshMinify; type Rule = RegExp | string; type Rules = Rule[] | Rule; type FilterFn = (source: Buffer, sourcePath: string) => boolean; -type ImageminOptions = { - /** - * plugins - */ - plugins: Array< - string | [string, Record?] | import("imagemin").Plugin - >; -}; -type SquooshOptions = { - [key: string]: any; -}; +type IsFilenameProcessed = typeof import("./worker").isFilenameProcessed; type WorkerResult = { /** * filename @@ -133,7 +123,9 @@ type WorkerResult = { /** * asset info */ - info: AssetInfo; + info: AssetInfo & { + [worker.isFilenameProcessed]?: boolean; + }; }; type Task = { /** @@ -204,12 +196,6 @@ type BasicTransformerHelpers = { }; type TransformerFunction = BasicTransformerImplementation & BasicTransformerHelpers; -type PathData = { - /** - * filename - */ - filename?: string | undefined; -}; type FilenameFn = ( pathData: PathData, assetInfo?: AssetInfo | undefined, @@ -266,14 +252,7 @@ type InternalWorkerOptions = { /** * filename generator function */ - generateFilename?: - | (( - filenameTemplate: string, - options: { - filename: string; - }, - ) => string) - | undefined; + generateFilename: (filename: TemplatePath, data: PathData) => string; }; type InternalLoaderOptions = import("./loader").LoaderOptions; type PluginOptions = { @@ -290,7 +269,7 @@ type PluginOptions = { */ exclude?: Rule | undefined; /** - * allows to setup the minimizer + * allows to set the minimizer */ minimizer?: | (T extends any[] @@ -320,3 +299,4 @@ type PluginOptions = { */ deleteOriginalAssets?: boolean | undefined; }; +import worker = require("./worker"); diff --git a/types/utils.d.ts b/types/utils.d.ts index c319695..8c74933 100644 --- a/types/utils.d.ts +++ b/types/utils.d.ts @@ -1,19 +1,12 @@ export type WorkerResult = import("./index").WorkerResult; -export type SquooshOptions = import("./index").SquooshOptions; -export type ImageminOptions = import("imagemin").Options; +export type CustomOptions = import("./index").CustomOptions; export type WebpackError = import("webpack").WebpackError; export type Module = import("webpack").Module; export type AssetInfo = import("webpack").AssetInfo; +export type EXPECTED_ANY = any; export type Task = () => Promise; export type FunctionReturning = () => T; -export type SvgoLib = typeof import("svgo"); -export type SvgoEncodeOptions = Omit; -export type SvgoOptions = { - /** - * encode options - */ - encodeOptions?: SvgoEncodeOptions | undefined; -}; +export type CustomSharpFormat = EXPECTED_ANY; export type Uint8ArrayUtf8ByteString = ( array: number[] | Uint8Array, start: number, @@ -69,94 +62,36 @@ export type SquooshImagePool = { */ close: () => Promise; }; -export type SharpLib = typeof import("sharp"); -export type Sharp = import("sharp").Sharp; -export type ResizeOptions = import("sharp").ResizeOptions & { - enabled?: boolean; - unit?: "px" | "percent"; -}; -export type SharpEncodeOptions = { - /** - * AVIF options - */ - avif?: import("sharp").AvifOptions | undefined; - /** - * GIF options - */ - gif?: import("sharp").GifOptions | undefined; - /** - * HEIF options - */ - heif?: import("sharp").HeifOptions | undefined; - /** - * JPEG options - */ - jpeg?: import("sharp").JpegOptions | undefined; - /** - * JPG options - */ - jpg?: import("sharp").JpegOptions | undefined; - /** - * PNG options - */ - png?: import("sharp").PngOptions | undefined; - /** - * WebP options - */ - webp?: import("sharp").WebpOptions | undefined; -}; -export type SharpFormat = keyof SharpEncodeOptions; -export type SharpOptions = { - /** - * resize options - */ - resize?: ResizeOptions | undefined; - /** - * rotate options - */ - rotate?: (number | "auto") | undefined; - /** - * size suffix - */ - sizeSuffix?: SizeSuffix | undefined; - /** - * encode options - */ - encodeOptions?: SharpEncodeOptions | undefined; -}; export type SizeSuffix = (width: number, height: number) => string; export const ABSOLUTE_URL_REGEX: RegExp; /** @type {WeakMap} */ export const IMAGE_MINIMIZER_PLUGIN_INFO_MAPPINGS: WeakMap; export const WINDOWS_PATH_REGEX: RegExp; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minimizer options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -export function imageminGenerate( +export function imageminGenerate( original: WorkerResult, - minimizerOptions: T, + options?: CustomOptions | undefined, ): Promise; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} options options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -export function imageminMinify( +export function imageminMinify( original: WorkerResult, - options: T, + options?: CustomOptions | undefined, ): Promise; /** - * @template T - * @param {ImageminOptions} imageminConfig imagemin configuration - * @returns {Promise} normalized imagemin configuration + * @param {Record} imageminConfig imagemin configuration + * @returns {Promise>} normalized imagemin configuration */ -export function imageminNormalizeConfig( - imageminConfig: ImageminOptions, -): Promise; +export function imageminNormalizeConfig( + imageminConfig: Record, +): Promise>; /** * @param {string} url URL * @returns {boolean} true when URL is absolute, otherwise false @@ -173,11 +108,11 @@ export function isAbsoluteURL(url: string): boolean; */ export function memoize(fn: FunctionReturning): FunctionReturning; /** @typedef {import("./index").WorkerResult} WorkerResult */ -/** @typedef {import("./index").SquooshOptions} SquooshOptions */ -/** @typedef {import("imagemin").Options} ImageminOptions */ +/** @typedef {import("./index").CustomOptions} CustomOptions */ /** @typedef {import("webpack").WebpackError} WebpackError */ /** @typedef {import("webpack").Module} Module */ /** @typedef {import("webpack").AssetInfo} AssetInfo */ +/** @typedef {any} EXPECTED_ANY */ /** * @template T * @typedef {() => Promise} Task @@ -189,68 +124,57 @@ export function memoize(fn: FunctionReturning): FunctionReturning; */ export function replaceFileExtension(filename: string, ext: string): string; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -export function sharpGenerate( +export function sharpGenerate( original: WorkerResult, - minimizerOptions: T, + options?: CustomOptions | undefined, ): Promise; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -export function sharpMinify( +export function sharpMinify( original: WorkerResult, - minimizerOptions: T, + options?: CustomOptions | undefined, ): Promise; /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minifyOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} generated result */ -export function squooshGenerate( +export function squooshGenerate( original: WorkerResult, - minifyOptions: T, + options?: CustomOptions | undefined, ): Promise; export namespace squooshGenerate { export { squooshImagePoolSetup as setup }; export { squooshImagePoolTeardown as teardown }; } /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} options minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -export function squooshMinify( +export function squooshMinify( original: WorkerResult, - options: T, + options?: CustomOptions | undefined, ): Promise; export namespace squooshMinify { export { squooshImagePoolSetup as setup }; export { squooshImagePoolTeardown as teardown }; } -/** @typedef {import("svgo")} SvgoLib */ -/** @typedef {Omit} SvgoEncodeOptions */ -/** - * @typedef {object} SvgoOptions - * @property {SvgoEncodeOptions=} encodeOptions encode options - */ /** - * @template T * @param {WorkerResult} original original worker result - * @param {T} minimizerOptions minify options + * @param {CustomOptions=} options options * @returns {Promise} minified result */ -export function svgoMinify( +export function svgoMinify( original: WorkerResult, - minimizerOptions: T, + options?: CustomOptions | undefined, ): Promise; /** * Run tasks with limited concurrency. diff --git a/types/worker.d.ts b/types/worker.d.ts index f71838c..7201d3c 100644 --- a/types/worker.d.ts +++ b/types/worker.d.ts @@ -8,7 +8,11 @@ declare function worker( options: import("./index").InternalWorkerOptions, ): Promise; declare namespace worker { - export { WorkerResult, FilenameFn }; + export { isFilenameProcessed, WorkerResult, FilenameFn }; } +/** @typedef {import("./index").WorkerResult} WorkerResult */ +/** @typedef {import("./index").FilenameFn} FilenameFn */ +/** @type {unique symbol} */ +declare const isFilenameProcessed: unique symbol; type WorkerResult = import("./index").WorkerResult; type FilenameFn = import("./index").FilenameFn;