forked from esnext/es6-module-transpiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwriter.js
74 lines (59 loc) · 1.85 KB
/
writer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* jshint node:true, undef:true, unused:true */
var assert = require('assert');
var recast = require('recast');
var fs = require('fs');
var Path = require('path');
var mkdirp = require('mkdirp');
function Writer(target) {
this.target = target;
}
Writer.prototype.write = function(files) {
var target = this.target;
switch (files.length) {
case 0:
throw new Error('expected at least one file to write, got zero');
case 1:
// We got a single file, so `target` should refer to either a file or a
// directory, but only if the file has a name.
var isDirectory = false;
try {
isDirectory = fs.statSync(target).isDirectory();
} catch (ex) {}
assert.ok(
!isDirectory || files[0].filename,
'unable to determine filename for output to directory: ' + target
);
this.writeFile(
files[0],
isDirectory ? Path.resolve(target, files[0].filename) : target
);
break;
default:
// We got multiple files to output, so `target` should be a directory or
// not exist (so we can create it).
var self = this;
files.forEach(function(file) {
self.writeFile(file, Path.resolve(target, file.filename));
});
break;
}
};
Writer.prototype.writeFile = function(file, filename) {
var sourceMapFilename = filename + '.map';
var rendered = recast.print(file, {
sourceMapName: Path.basename(filename)
});
var code = rendered.code;
assert.ok(filename, 'missing filename for file: ' + code);
mkdirp.sync(Path.dirname(filename));
if (rendered.map) {
code += '\n\n//# sourceMappingURL=' + Path.basename(sourceMapFilename);
fs.writeFileSync(
sourceMapFilename,
JSON.stringify(rendered.map),
{ encoding: 'utf8' }
);
}
fs.writeFileSync(filename, code, { encoding: 'utf8' });
};
module.exports = Writer;