import * as path from 'path' const imageminSvgo = require('../vendor/imagemin-svgo') import imagemin from 'imagemin' import imageminJpegtran from 'imagemin-jpegtran' import imageminPngquant from 'imagemin-pngquant' import type { Options as OptionsPng} from 'imagemin-pngquant' import type { Options as OptionsJpeg } from 'imagemin-jpegtran' import type {PluginConfig } from "svgo" import { wrapper, TypeOnBody, TypeToolProp, TypeToolOptions } from '@asset-toolkit/core' export interface TypeProps extends TypeToolOptions { jpgOptions: OptionsJpeg pngOptions: OptionsPng svgOptions: PluginConfig plugins: any[] } /** * A tool compress image and svg. * https://www.npmjs.com/package/imagemin * * @param props - { pathIn, pathOut } * @param options - { jpgOptions, pngOptions, svgOptions, plugins } * @returns { Promise(returns) } */ const imageCompression: (_props: TypeToolProp, options?: TypeProps) => Promise = wrapper( undefined, ({ pathIn, pathOut, options, wrapperProps }: TypeOnBody): Promise => { const { jpgOptions, pngOptions, svgOptions, plugins } = Object.assign( { jpgOptions: false, pngOptions: false, svgOptions: false, plugins: [], }, options, ) const exts = (wrapperProps && wrapperProps.exts) || [] return imagemin([path.join(pathIn || pathOut, `/**/*.{${exts.join(',')}}`)], { destination: path.join(pathOut, '/'), plugins: [imageminJpegtran(jpgOptions), imageminPngquant(pngOptions), imageminSvgo(svgOptions), ...plugins], }) }, { exts: ['jpg', 'JPG', 'jpeg', 'JPEG', 'png', 'PNG', 'svg', 'SVG'], name: 'Image Compression' }, ) export default imageCompression