1
1
import path from 'path' ;
2
2
import fs from 'fs/promises' ;
3
3
import type { Plugin } from 'imagemin' ;
4
+ import { AssetData } from 'metro' ;
4
5
5
6
import { ImageminMinimizer } from './config' ;
6
7
@@ -19,6 +20,36 @@ export const generateGitignoreFile = async (dir: string) => {
19
20
}
20
21
}
21
22
23
+ /**
24
+ * Runs imagemin on the given asset data and generates optimized image files.
25
+ *
26
+ * @param assetData - The asset data containing the files to be optimized.
27
+ * @param outputDirPath - The output directory path where the optimized files will be saved.
28
+ * @param minimizerOptions - The options for the imagemin minimizer.
29
+ * @returns The modified asset data with the optimized files.
30
+ */
31
+ export const imageminGenerate = async ( assetData : AssetData , outputDirPath : string , minimizerOptions : ImageminMinimizer [ 'options' ] ) => {
32
+ const plugins = await imageminNormalizeConfig ( minimizerOptions || { } ) ;
33
+
34
+ let outFiles = assetData . files ;
35
+ try {
36
+ const imagemin = ( await import ( "imagemin" ) ) . default ;
37
+ const tmpFiles = await imagemin ( assetData . files , {
38
+ destination : outputDirPath ,
39
+ plugins,
40
+ } ) ;
41
+ outFiles = tmpFiles . map ( file => file . destinationPath ) ;
42
+ } catch ( error ) {
43
+ // FIXME: Error [ERR_REQUIRE_ESM]: require() of ES Module ...
44
+ logError ( error )
45
+ }
46
+
47
+ return {
48
+ ...assetData ,
49
+ files : outFiles
50
+ }
51
+ }
52
+
22
53
/**
23
54
* Normalize the imagemin configuration by importing the required plugins and their options.
24
55
* @param imageminConfig - The imagemin configuration.
@@ -45,27 +76,15 @@ export const imageminNormalizeConfig = async (imageminConfig: ImageminMinimizer[
45
76
const pluginOptions = isPluginArray ? plugin [ 1 ] : undefined ;
46
77
47
78
let requiredPlugin = null ;
48
- let requiredPluginName = `imagemin-${ pluginName } ` ;
79
+ let requiredPluginName = pluginName . startsWith ( 'imagemin-' ) ? pluginName : `imagemin-${ pluginName } ` ;
49
80
50
81
try {
51
82
requiredPlugin = ( await import ( requiredPluginName ) ) . default (
52
83
pluginOptions
53
84
) ;
54
85
} catch {
55
- requiredPluginName = pluginName ;
56
-
57
- try {
58
- requiredPlugin = ( await import ( requiredPluginName ) ) . default (
59
- pluginOptions
60
- ) ;
61
- } catch {
62
- const pluginNameForError = pluginName . startsWith ( "imagemin" )
63
- ? pluginName
64
- : `imagemin-${ pluginName } ` ;
65
-
66
- const message = `Unknown plugin: ${ pluginNameForError } \n\nDid you forget to install the plugin?\nYou can install it with:\n\n$ npm install ${ pluginNameForError } --save-dev\n$ yarn add ${ pluginNameForError } --dev`
67
- logError ( message )
68
- }
86
+ const message = `Unknown plugin: ${ requiredPluginName } \n\nDid you forget to install the plugin?\nYou can install it with:\n\n$ npm install ${ requiredPluginName } --save-dev\n$ yarn add ${ requiredPluginName } --dev`
87
+ logError ( message )
69
88
}
70
89
plugins . push ( requiredPlugin ) ;
71
90
} else {
0 commit comments