Skip to content

Commit

Permalink
fix: lazy loading deps (#411)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait authored Jun 17, 2023
1 parent d66c5bb commit 93412bb
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 141 deletions.
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
}
},
"dependencies": {
"schema-utils": "^4.0.1",
"schema-utils": "^4.2.0",
"serialize-javascript": "^6.0.1"
},
"devDependencies": {
Expand Down
6 changes: 4 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ const path = require("path");
const os = require("os");

const { validate } = require("schema-utils");
const serialize = require("serialize-javascript");

const worker = require("./worker");
const schema = require("./plugin-options.json");
const {
throttleAll,
memoize,
imageminNormalizeConfig,
imageminMinify,
imageminGenerate,
Expand Down Expand Up @@ -171,6 +171,8 @@ const {
* @property {boolean} [deleteOriginalAssets] Allows to remove original assets. Useful for converting to a `webp` and remove original assets.
*/

const getSerializeJavascript = memoize(() => require("serialize-javascript"));

/**
* @template T, [G=T]
* @extends {WebpackPluginInstance}
Expand Down Expand Up @@ -276,7 +278,7 @@ class ImageMinimizerPlugin {
* @returns {Promise<Task<Z>>}
*/
const getFromCache = async (transformer) => {
const cacheName = serialize({ name, transformer });
const cacheName = getSerializeJavascript()({ name, transformer });
const eTag = cache.getLazyHashedEtag(source);
const cacheItem = cache.getItemCache(cacheName, eTag);
const output = await cacheItem.getPromise();
Expand Down
27 changes: 27 additions & 0 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,32 @@ function fileTypeFromBuffer(input) {
}
}

/**
* @template T
* @param fn {(function(): any) | undefined}
* @returns {function(): T}
*/
function memoize(fn) {
let cache = false;
/** @type {T} */
let result;

return () => {
if (cache) {
return result;
}

result = /** @type {function(): any} */ (fn)();
cache = true;
// Allow to clean up memory for fn
// and all dependent resources
// eslint-disable-next-line no-param-reassign
fn = undefined;

return result;
};
}

/**
* @typedef {Object} MetaData
* @property {Array<Error>} warnings
Expand Down Expand Up @@ -1232,6 +1258,7 @@ module.exports = {
throttleAll,
isAbsoluteURL,
replaceFileExtension,
memoize,
imageminNormalizeConfig,
imageminMinify,
imageminGenerate,
Expand Down
131 changes: 0 additions & 131 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,135 +1,4 @@
export = ImageMinimizerPlugin;
/** @typedef {import("schema-utils/declarations/validate").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("./utils.js").imageminMinify} ImageminMinifyFunction */
/** @typedef {import("./utils.js").squooshMinify} SquooshMinifyFunction */
/** @typedef {RegExp | string} Rule */
/** @typedef {Rule[] | Rule} Rules */
/**
* @callback FilterFn
* @param {Buffer} source `Buffer` of source file.
* @param {string} sourcePath Absolute path to source.
* @returns {boolean}
*/
/**
* @typedef {Object} ImageminOptions
* @property {Array<string | [string, Record<string, any>?] | import("imagemin").Plugin>} plugins
*/
/**
* @typedef {Object.<string, any>} SquooshOptions
*/
/**
* @typedef {Object} WorkerResult
* @property {string} filename
* @property {Buffer} data
* @property {Array<Error>} warnings
* @property {Array<Error>} errors
* @property {AssetInfo} info
*/
/**
* @template T
* @typedef {Object} Task
* @property {string} name
* @property {AssetInfo} info
* @property {Source} inputSource
* @property {WorkerResult & { source?: Source } | undefined} output
* @property {ReturnType<ReturnType<Compilation["getCache"]>["getItemCache"]>} cacheItem
* @property {Transformer<T> | Transformer<T>[]} transformer
*/
/**
* @typedef {{ [key: string]: any }} CustomOptions
*/
/**
* @template T
* @typedef {T extends infer U ? U : CustomOptions} InferDefaultType
*/
/**
* @template T
* @typedef {InferDefaultType<T> | undefined} BasicTransformerOptions
*/
/**
* @typedef {Object} ResizeOptions
* @property {number} [width]
* @property {number} [height]
* @property {boolean} [enabled]
*/
/**
* @template T
* @callback BasicTransformerImplementation
* @param {WorkerResult} original
* @param {BasicTransformerOptions<T>} [options]
* @returns {Promise<WorkerResult | null>}
*/
/**
* @typedef {Object} BasicTransformerHelpers
* @property {() => void} [setup]
* @property {() => void} [teardown]
*/
/**
* @template T
* @typedef {BasicTransformerImplementation<T> & BasicTransformerHelpers} TransformerFunction
*/
/**
* @typedef {Object} PathData
* @property {string} [filename]
*/
/**
* @callback FilenameFn
* @param {PathData} pathData
* @param {AssetInfo} [assetInfo]
* @returns {string}
*/
/**
* @template T
* @typedef {Object} Transformer
* @property {TransformerFunction<T>} implementation
* @property {BasicTransformerOptions<T>} [options]
* @property {FilterFn} [filter]
* @property {string | FilenameFn} [filename]
* @property {string} [preset]
* @property {"import" | "asset"} [type]
*/
/**
* @template T
* @typedef {Omit<Transformer<T>, "preset" | "type">} Minimizer
*/
/**
* @template T
* @typedef {Transformer<T>} Generator
*/
/**
* @template T
* @typedef {Object} InternalWorkerOptions
* @property {string} filename
* @property {AssetInfo=} info
* @property {Buffer} input
* @property {Transformer<T> | Transformer<T>[]} transformer
* @property {string} [severityError]
* @property {Function} [generateFilename]
*/
/**
* @template T
* @typedef {import("./loader").LoaderOptions<T>} InternalLoaderOptions
*/
/**
* @template T, G
* @typedef {Object} PluginOptions
* @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<T[P]> } : Minimizer<T> | Minimizer<T>[]} [minimizer] Allows to setup the minimizer.
* @property {G extends any[] ? { [P in keyof G]: Generator<G[P]> } : Generator<G>[]} [generator] Allows to set the generator.
* @property {boolean} [loader] Automatically adding `imagemin-loader`.
* @property {number} [concurrency] Maximum number of concurrency optimization processes in one time.
* @property {string} [severityError] Allows to choose how errors are displayed.
* @property {boolean} [deleteOriginalAssets] Allows to remove original assets. Useful for converting to a `webp` and remove original assets.
*/
/**
* @template T, [G=T]
* @extends {WebpackPluginInstance}
Expand Down
6 changes: 6 additions & 0 deletions types/utils.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ export function isAbsoluteURL(url: string): boolean;
* @returns {string} new filename `path/img.png` -> `path/img.webp`
*/
export function replaceFileExtension(filename: string, ext: string): string;
/**
* @template T
* @param fn {(function(): any) | undefined}
* @returns {function(): T}
*/
export function memoize<T>(fn: (() => any) | undefined): () => T;
/**
* @template T
* @param {ImageminOptions} imageminConfig
Expand Down

0 comments on commit 93412bb

Please sign in to comment.