@@ -7,6 +7,44 @@ var svgRegex = /url\("data:image\/svg\+xml;.*?"\)/gi;
77var whiteSpaceRegex = / \s / g;
88var utils = { } ;
99
10+ /**
11+ * Read a file and return a promise.
12+ * @param {string } file - Path to the file
13+ * @returns Promise
14+ */
15+ utils . _readFileWithPromise = function readFileWithPromise ( file ) {
16+ return new Promise ( ( resolve , reject ) => {
17+ fs . readFile ( file , 'utf8' , function ( err , data ) {
18+ if ( err ) {
19+ reject ( err ) ;
20+ }
21+
22+ resolve ( data ) ;
23+ } ) ;
24+ } ) ;
25+ }
26+
27+ /**
28+ * Read a glob string and return a promise.
29+ * @param {string } pattern - Glob file pattern
30+ * @returns Promise
31+ */
32+ function globWithPromsie ( pattern ) {
33+ return new Promise ( ( resolve , reject ) => {
34+ glob ( pattern , function ( err , files ) {
35+ if ( err ) {
36+ reject ( err ) ;
37+ }
38+
39+ if ( files . length === 0 ) {
40+ console . warn ( 'pattern "' + pattern + '" does not match any file' ) ;
41+ }
42+
43+ resolve ( files ) ;
44+ } ) ;
45+ } ) ;
46+ }
47+
1048/**
1149 * Get an id by hyphen separating the name.
1250 *
@@ -112,53 +150,33 @@ utils.sortCategoryBy = function sortCategoryBy(categories, sortOrder) {
112150 * @param {function } callback - Callback to execute for each read file.
113151 * @returns {Promise }
114152 */
115- utils . readFileGlobs = function readFileGlobs ( patterns , callback ) {
153+ utils . readFileGlobs = async function readFileGlobs ( patterns , callback ) {
116154 patterns = ( ! Array . isArray ( patterns ) ? [ patterns ] : patterns ) ;
117- var promises = [ ] ;
118-
119- patterns . forEach ( function ( pattern ) {
120-
121- promises . push ( new Promise ( function ( resolve , reject ) {
122- glob ( pattern , function ( err , files ) {
123- if ( err ) {
124- reject ( err ) ;
125- }
126-
127- if ( files . length === 0 ) {
128- console . warn ( 'pattern "' + pattern + '" does not match any file' ) ;
129- }
130-
131- resolve ( files ) ;
132- } ) ;
133- } ) ) ;
134-
155+ let globPromises = await patterns . map ( async ( pattern ) => {
156+ return globWithPromsie ( pattern ) ;
135157 } ) ;
136158
137- return Promise . all ( promises ) . then ( function ( fileList ) {
138- var readFilePromises = [ ] ;
159+ return Promise . all ( globPromises )
160+ . then ( async ( fileList ) => {
139161
140- fileList . forEach ( function ( files ) {
141- files . forEach ( function ( file ) {
142- readFilePromises . push ( new Promise ( function ( resolve , reject ) {
143- utils . readFiles ( file , function ( data , file ) {
144- resolve ( [ data , file ] ) ;
145- } ) ;
146- } ) ) ;
162+ // fileList is an array of arrays of files
163+ // e.g. [ [fileOne, fileTwo], [fileThree, fileFour], ...]
164+ let readFilePromises = await fileList . map ( async ( files ) => {
165+ return await utils . readFiles ( files )
147166 } ) ;
148- } ) ;
149167
150- return Promise . all ( readFilePromises ) . then ( function ( files ) {
151- files . forEach ( function ( data ) {
152- callback . apply ( null , data ) ;
153- } ) ;
168+ return Promise . all ( readFilePromises ) ;
154169 } )
155- . catch ( function ( err ) {
156- throw err ;
170+ . then ( readFileList => {
171+
172+ // readFileList is an array of arrays of file data
173+ // e.g. [ [ ['contents fileOne', fileOne], ['contents fileTwo', fileTow] ] ]
174+ readFileList . forEach ( readFiles => {
175+ readFiles . forEach ( fileData => {
176+ callback . apply ( null , fileData ) ;
177+ } ) ;
178+ } ) ;
157179 } ) ;
158- } )
159- . catch ( function ( err ) {
160- throw err ;
161- } ) ;
162180} ;
163181
164182/**
@@ -169,37 +187,25 @@ utils.readFileGlobs = function readFileGlobs(patterns, callback) {
169187 * @param {function } callback - Callback to execute for each read file.
170188 * @returns {Promise }
171189 */
172- utils . readFiles = function readFiles ( files , callback ) {
173- if ( ! files || files . length === 0 ) {
174- return Promise . resolve ( ) ;
175- }
190+ utils . readFiles = async function readFiles ( files , callback ) {
191+ if ( ! files || ( Array . isArray ( files ) && ! files . length ) ) return Promise . resolve ( ) ;
176192
177193 files = ( ! Array . isArray ( files ) ? [ files ] : files ) ;
178- var promises = [ ] ;
194+ let promises = await Promise . all ( files . map ( async ( file ) => {
195+ let data = await utils . _readFileWithPromise ( file ) ;
196+ return [ data , file ] ;
197+ } ) ) ;
179198
180- files . forEach ( function ( file ) {
181-
182- promises . push ( new Promise ( function ( resolve , reject ) {
183- fs . readFile ( file , 'utf8' , function ( err , data ) {
184- if ( err ) {
185- reject ( err ) ;
186- }
187-
188- resolve ( [ data , file ] ) ;
199+ return Promise . all ( promises ) . then ( files => {
200+ if ( callback ) {
201+ files . forEach ( function ( data ) {
202+ callback . apply ( null , data ) ;
189203 } ) ;
190- } ) ) ;
191-
192- } ) ;
204+ }
193205
194- return Promise . all ( promises ) . then ( function ( files ) {
195- files . forEach ( function ( data ) {
196- callback . apply ( null , data ) ;
197- } ) ;
206+ return files ;
198207 } )
199- . catch ( function ( err ) {
200- throw err ;
201- } ) ;
202- } ;
208+ }
203209
204210/**
205211 * Workaround for polymer issue: https://github.com/Polymer/polymer/issues/1276.
0 commit comments