Skip to content

Commit d75fe49

Browse files
authored
Merge pull request #73 from straker/auditFix
fix(utils): update to async/await and ensure callback is called in file order
2 parents 3a67968 + 7ce10e8 commit d75fe49

File tree

8 files changed

+1686
-919
lines changed

8 files changed

+1686
-919
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ node_modules
33
/coverage
44
examples/**/*.html
55
bower_components
6-
npm-debug.log
6+
npm-debug.log
7+
.nyc_output

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
language: node_js
22
node_js:
33
- "8.0"
4-
- "6.0"
4+
- "10.0"
5+
- "12.0"
56
after_script: "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"

index.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,7 @@ function livingcss(source, dest, options) {
9696

9797
return Promise.all([
9898
// read the handlebars template
99-
new Promise(function(resolve, reject) {
100-
fs.readFile(options.template, 'utf8', function(err, data) {
101-
if (err) {
102-
reject(err);
103-
}
104-
105-
resolve(data);
106-
});
107-
}),
99+
utils._readFileWithPromise(options.template),
108100

109101
// read all source files and handlebar templates
110102
utils.readFileGlobs(source, function(data, file) {

lib/utils.js

Lines changed: 70 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,44 @@ var svgRegex = /url\("data:image\/svg\+xml;.*?"\)/gi;
77
var whiteSpaceRegex = /\s/g;
88
var 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

Comments
 (0)