Skip to content

Commit 8ff675a

Browse files
committed
Refactor CLI to use promises/async fns.
1 parent 41ca312 commit 8ff675a

File tree

6 files changed

+197
-207
lines changed

6 files changed

+197
-207
lines changed

packages/babel-cli/src/babel/dir.js

Lines changed: 89 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -6,61 +6,62 @@ import fs from "fs";
66

77
import * as util from "./util";
88

9-
let compiledFiles = 0;
10-
11-
export default function({ cliOptions, babelOptions }) {
9+
export default async function({ cliOptions, babelOptions }) {
1210
const filenames = cliOptions.filenames;
1311

14-
function write(src, base, callback) {
12+
async function write(src, base) {
1513
let relative = path.relative(base, src);
14+
1615
if (!util.isCompilableExtension(relative, cliOptions.extensions)) {
17-
return process.nextTick(callback);
16+
return false;
1817
}
1918

2019
// remove extension and then append back on .js
2120
relative = util.adjustRelative(relative, cliOptions.keepFileExtension);
2221

2322
const dest = getDest(relative, base);
2423

25-
util.compile(
26-
src,
27-
defaults(
28-
{
29-
sourceFileName: slash(path.relative(dest + "/..", src)),
30-
},
31-
babelOptions,
32-
),
33-
function(err, res) {
34-
if (err && cliOptions.watch) {
35-
console.error(err);
36-
err = null;
37-
}
38-
if (err) return callback(err);
39-
if (!res) return callback();
40-
41-
// we've requested explicit sourcemaps to be written to disk
42-
if (
43-
res.map &&
44-
babelOptions.sourceMaps &&
45-
babelOptions.sourceMaps !== "inline"
46-
) {
47-
const mapLoc = dest + ".map";
48-
res.code = util.addSourceMappingUrl(res.code, mapLoc);
49-
res.map.file = path.basename(relative);
50-
outputFileSync(mapLoc, JSON.stringify(res.map));
51-
}
52-
53-
outputFileSync(dest, res.code);
54-
util.chmod(src, dest);
55-
56-
compiledFiles += 1;
57-
58-
if (cliOptions.verbose) {
59-
console.log(src + " -> " + dest);
60-
}
61-
return callback(null, true);
62-
},
63-
);
24+
try {
25+
const res = await util.compile(
26+
src,
27+
defaults(
28+
{
29+
sourceFileName: slash(path.relative(dest + "/..", src)),
30+
},
31+
babelOptions,
32+
),
33+
);
34+
35+
if (!res) return false;
36+
37+
// we've requested explicit sourcemaps to be written to disk
38+
if (
39+
res.map &&
40+
babelOptions.sourceMaps &&
41+
babelOptions.sourceMaps !== "inline"
42+
) {
43+
const mapLoc = dest + ".map";
44+
res.code = util.addSourceMappingUrl(res.code, mapLoc);
45+
res.map.file = path.basename(relative);
46+
outputFileSync(mapLoc, JSON.stringify(res.map));
47+
}
48+
49+
outputFileSync(dest, res.code);
50+
util.chmod(src, dest);
51+
52+
if (cliOptions.verbose) {
53+
console.log(src + " -> " + dest);
54+
}
55+
56+
return true;
57+
} catch (err) {
58+
if (cliOptions.watch) {
59+
console.error(err);
60+
return false;
61+
}
62+
63+
throw err;
64+
}
6465
}
6566

6667
function getDest(filename, base) {
@@ -77,84 +78,62 @@ export default function({ cliOptions, babelOptions }) {
7778
}
7879
}
7980

80-
function handleFile(src, base, callback) {
81-
write(src, base, function(err, res) {
82-
if (err) return callback(err);
83-
if (!res && cliOptions.copyFiles) {
84-
const filename = path.relative(base, src);
85-
const dest = getDest(filename, base);
86-
outputFileSync(dest, fs.readFileSync(src));
87-
util.chmod(src, dest);
88-
}
89-
90-
return callback();
91-
});
92-
}
93-
94-
function sequentialHandleFile(files, dirname, index, callback) {
95-
if (files.length === 0) {
96-
outputDestFolder(cliOptions.outDir);
97-
return;
98-
}
81+
async function handleFile(src, base) {
82+
const written = await write(src, base);
9983

100-
if (typeof index === "function") {
101-
callback = index;
102-
index = 0;
84+
if (!written && cliOptions.copyFiles) {
85+
const filename = path.relative(base, src);
86+
const dest = getDest(filename, base);
87+
outputFileSync(dest, fs.readFileSync(src));
88+
util.chmod(src, dest);
10389
}
90+
return written;
91+
}
10492

105-
const filename = files[index];
106-
const src = path.join(dirname, filename);
93+
async function handle(filenameOrDir) {
94+
if (!fs.existsSync(filenameOrDir)) return 0;
10795

108-
handleFile(src, dirname, function(err) {
109-
if (err) return callback(err);
110-
index++;
111-
if (index !== files.length) {
112-
sequentialHandleFile(files, dirname, index, callback);
113-
} else {
114-
callback();
115-
}
116-
});
117-
}
96+
const stat = fs.statSync(filenameOrDir);
11897

119-
function handle(filename, callback) {
120-
if (!fs.existsSync(filename)) return;
98+
if (stat.isDirectory(filenameOrDir)) {
99+
const dirname = filenameOrDir;
121100

122-
const stat = fs.statSync(filename);
101+
let count = 0;
123102

124-
if (stat.isDirectory(filename)) {
125-
const dirname = filename;
103+
const files = util.readdir(dirname, cliOptions.includeDotfiles);
104+
for (const filename of files) {
105+
const src = path.join(dirname, filename);
126106

127-
if (cliOptions.deleteDirOnStart) {
128-
util.deleteDir(cliOptions.outDir);
107+
const written = await handleFile(src, dirname);
108+
if (written) count += 1;
129109
}
130110

131-
const files = util.readdir(dirname, cliOptions.includeDotfiles);
132-
sequentialHandleFile(files, dirname, callback);
111+
return count;
133112
} else {
134-
write(filename, path.dirname(filename), callback);
135-
}
136-
}
113+
const filename = filenameOrDir;
114+
const written = await handleFile(filename, path.dirname(filename));
137115

138-
function sequentialHandle(filenames, index = 0) {
139-
const filename = filenames[index];
140-
141-
handle(filename, function(err) {
142-
if (err) throw new Error(err);
143-
index++;
144-
if (index !== filenames.length) {
145-
sequentialHandle(filenames, index);
146-
} else {
147-
console.log(
148-
`🎉 Successfully compiled ${compiledFiles} ${
149-
compiledFiles > 1 ? "files" : "file"
150-
} with Babel.`,
151-
);
152-
}
153-
});
116+
return written ? 1 : 0;
117+
}
154118
}
155119

156120
if (!cliOptions.skipInitialBuild) {
157-
sequentialHandle(filenames);
121+
if (cliOptions.deleteDirOnStart) {
122+
util.deleteDir(cliOptions.outDir);
123+
}
124+
125+
outputDestFolder(cliOptions.outDir);
126+
127+
let compiledFiles = 0;
128+
for (const filename of cliOptions.filenames) {
129+
compiledFiles += await handle(filename);
130+
}
131+
132+
console.log(
133+
`🎉 Successfully compiled ${compiledFiles} ${
134+
compiledFiles !== 1 ? "files" : "file"
135+
} with Babel.`,
136+
);
158137
}
159138

160139
if (cliOptions.watch) {
@@ -177,10 +156,9 @@ export default function({ cliOptions, babelOptions }) {
177156
filename === filenameOrDir
178157
? path.dirname(filenameOrDir)
179158
: filenameOrDir,
180-
function(err) {
181-
if (err) console.error(err.stack);
182-
},
183-
);
159+
).catch(err => {
160+
console.error(err);
161+
});
184162
});
185163
});
186164
});

0 commit comments

Comments
 (0)