@@ -53,122 +53,126 @@ sharp.concurrency(1)
53
53
* @param {String } file
54
54
* @param {Transform[] } transforms
55
55
*/
56
- exports . processFile = ( file , transforms , options = { } ) => {
56
+ exports . processFile = async ( file , transforms , options = { } ) => {
57
57
let pipeline
58
58
try {
59
- pipeline = ! options . failOnError ? sharp ( { failOnError : false } ) : sharp ( )
59
+ const inputBuffer = await fs . readFile ( file )
60
+ pipeline = ! options . failOnError
61
+ ? sharp ( inputBuffer , { failOnError : false } )
62
+ : sharp ( inputBuffer )
60
63
61
64
// Keep Metadata
62
65
if ( ! options . stripMetadata ) {
63
66
pipeline = pipeline . withMetadata ( )
64
67
}
65
- fs . createReadStream ( file ) . pipe ( pipeline )
66
68
} catch ( err ) {
67
69
throw new SharpError ( `Failed to load image ${ file } into sharp.` , err )
68
70
}
69
71
70
- return transforms . map ( async transform => {
71
- try {
72
- const { outputPath, args } = transform
73
- debug ( `Start processing ${ outputPath } ` )
74
- await fs . ensureDir ( path . dirname ( outputPath ) )
75
-
76
- const transformArgs = healOptions (
77
- { defaultQuality : options . defaultQuality } ,
78
- args
79
- )
80
-
81
- let clonedPipeline = transforms . length > 1 ? pipeline . clone ( ) : pipeline
82
-
83
- if ( transformArgs . trim ) {
84
- clonedPipeline = clonedPipeline . trim ( transformArgs . trim )
85
- }
86
-
87
- if ( ! transformArgs . rotate ) {
88
- clonedPipeline = clonedPipeline . rotate ( )
89
- }
90
-
91
- // Sharp only allows ints as height/width. Since both aren't always
92
- // set, check first before trying to round them.
93
- let roundedHeight = transformArgs . height
94
- if ( roundedHeight ) {
95
- roundedHeight = Math . round ( roundedHeight )
96
- }
97
-
98
- let roundedWidth = transformArgs . width
99
- if ( roundedWidth ) {
100
- roundedWidth = Math . round ( roundedWidth )
101
- }
102
-
103
- clonedPipeline
104
- . resize ( roundedWidth , roundedHeight , {
105
- position : transformArgs . cropFocus ,
106
- fit : transformArgs . fit ,
107
- background : transformArgs . background ,
108
- } )
109
- . png ( {
110
- compressionLevel : transformArgs . pngCompressionLevel ,
111
- adaptiveFiltering : false ,
112
- quality : transformArgs . pngQuality || transformArgs . quality ,
113
- force : transformArgs . toFormat === `png` ,
114
- } )
115
- . webp ( {
116
- quality : transformArgs . webpQuality || transformArgs . quality ,
117
- force : transformArgs . toFormat === `webp` ,
118
- } )
119
- . tiff ( {
120
- quality : transformArgs . quality ,
121
- force : transformArgs . toFormat === `tiff` ,
122
- } )
123
- . avif ( {
124
- quality : transformArgs . quality ,
125
- force : transformArgs . toFormat === `avif` ,
126
- } )
127
- . jpeg ( {
128
- mozjpeg : options . useMozJpeg ,
129
- quality : transformArgs . jpegQuality || transformArgs . quality ,
130
- progressive : transformArgs . jpegProgressive ,
131
- force : transformArgs . toFormat === `jpg` ,
132
- } )
133
-
134
- // grayscale
135
- if ( transformArgs . grayscale ) {
136
- clonedPipeline = clonedPipeline . grayscale ( )
137
- }
138
-
139
- // rotate
140
- if ( transformArgs . rotate && transformArgs . rotate !== 0 ) {
141
- clonedPipeline = clonedPipeline . rotate ( transformArgs . rotate )
142
- }
72
+ return Promise . all (
73
+ transforms . map ( async transform => {
74
+ try {
75
+ const { outputPath, args } = transform
76
+ debug ( `Start processing ${ outputPath } ` )
77
+ await fs . ensureDir ( path . dirname ( outputPath ) )
143
78
144
- // duotone
145
- if ( transformArgs . duotone ) {
146
- clonedPipeline = await duotone (
147
- transformArgs . duotone ,
148
- transformArgs . toFormat ,
149
- clonedPipeline
79
+ const transformArgs = healOptions (
80
+ { defaultQuality : options . defaultQuality } ,
81
+ args
150
82
)
151
- }
152
83
153
- try {
154
- const buffer = await clonedPipeline . toBuffer ( )
155
- await fs . writeFile ( outputPath , buffer )
84
+ let clonedPipeline = transforms . length > 1 ? pipeline . clone ( ) : pipeline
85
+
86
+ if ( transformArgs . trim ) {
87
+ clonedPipeline = clonedPipeline . trim ( transformArgs . trim )
88
+ }
89
+
90
+ if ( ! transformArgs . rotate ) {
91
+ clonedPipeline = clonedPipeline . rotate ( )
92
+ }
93
+
94
+ // Sharp only allows ints as height/width. Since both aren't always
95
+ // set, check first before trying to round them.
96
+ let roundedHeight = transformArgs . height
97
+ if ( roundedHeight ) {
98
+ roundedHeight = Math . round ( roundedHeight )
99
+ }
100
+
101
+ let roundedWidth = transformArgs . width
102
+ if ( roundedWidth ) {
103
+ roundedWidth = Math . round ( roundedWidth )
104
+ }
105
+
106
+ clonedPipeline
107
+ . resize ( roundedWidth , roundedHeight , {
108
+ position : transformArgs . cropFocus ,
109
+ fit : transformArgs . fit ,
110
+ background : transformArgs . background ,
111
+ } )
112
+ . png ( {
113
+ compressionLevel : transformArgs . pngCompressionLevel ,
114
+ adaptiveFiltering : false ,
115
+ quality : transformArgs . pngQuality || transformArgs . quality ,
116
+ force : transformArgs . toFormat === `png` ,
117
+ } )
118
+ . webp ( {
119
+ quality : transformArgs . webpQuality || transformArgs . quality ,
120
+ force : transformArgs . toFormat === `webp` ,
121
+ } )
122
+ . tiff ( {
123
+ quality : transformArgs . quality ,
124
+ force : transformArgs . toFormat === `tiff` ,
125
+ } )
126
+ . avif ( {
127
+ quality : transformArgs . quality ,
128
+ force : transformArgs . toFormat === `avif` ,
129
+ } )
130
+ . jpeg ( {
131
+ mozjpeg : options . useMozJpeg ,
132
+ quality : transformArgs . jpegQuality || transformArgs . quality ,
133
+ progressive : transformArgs . jpegProgressive ,
134
+ force : transformArgs . toFormat === `jpg` ,
135
+ } )
136
+
137
+ // grayscale
138
+ if ( transformArgs . grayscale ) {
139
+ clonedPipeline = clonedPipeline . grayscale ( )
140
+ }
141
+
142
+ // rotate
143
+ if ( transformArgs . rotate && transformArgs . rotate !== 0 ) {
144
+ clonedPipeline = clonedPipeline . rotate ( transformArgs . rotate )
145
+ }
146
+
147
+ // duotone
148
+ if ( transformArgs . duotone ) {
149
+ clonedPipeline = await duotone (
150
+ transformArgs . duotone ,
151
+ transformArgs . toFormat ,
152
+ clonedPipeline
153
+ )
154
+ }
155
+
156
+ try {
157
+ const buffer = await clonedPipeline . toBuffer ( )
158
+ await fs . writeFile ( outputPath , buffer )
159
+ } catch ( err ) {
160
+ throw new Error (
161
+ `Failed to write ${ file } into ${ outputPath } . (${ err . message } )`
162
+ )
163
+ }
156
164
} catch ( err ) {
157
- throw new Error (
158
- `Failed to write ${ file } into ${ outputPath } . (${ err . message } )`
159
- )
160
- }
161
- } catch ( err ) {
162
- if ( err instanceof SharpError ) {
163
- // rethrow
164
- throw err
165
- }
165
+ if ( err instanceof SharpError ) {
166
+ // rethrow
167
+ throw err
168
+ }
166
169
167
- throw new SharpError ( `Processing ${ file } failed` , err )
168
- }
170
+ throw new SharpError ( `Processing ${ file } failed` , err )
171
+ }
169
172
170
- return transform
171
- } )
173
+ return transform
174
+ } )
175
+ )
172
176
}
173
177
174
178
exports . createArgsDigest = args => {
0 commit comments