forked from adopted-ember-addons/broccoli-sass-source-maps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
80 lines (65 loc) · 2.42 KB
/
index.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
75
76
77
78
79
80
var path = require('path');
var mkdirp = require('mkdirp');
var includePathSearcher = require('include-path-searcher');
var CachingWriter = require('broccoli-caching-writer');
var nodeSass = require('node-sass');
var assign = require('object-assign');
var rsvp = require('rsvp');
var Promise = rsvp.Promise;
var fs = require('fs');
var writeFile = rsvp.denodeify(fs.writeFile);
module.exports = SassCompiler;
SassCompiler.prototype = Object.create(CachingWriter.prototype);
SassCompiler.prototype.constructor = SassCompiler;
function SassCompiler (inputNodes, inputFile, outputFile, options) {
if (!(this instanceof SassCompiler)) { return new SassCompiler(inputNodes, inputFile, outputFile, options); }
if (!Array.isArray(inputNodes)) { throw new Error('Expected array for first argument - did you mean [tree] instead of tree?'); }
CachingWriter.call(this, inputNodes, {
annotation: options.annotation,
cacheInclude: options.cacheInclude,
cacheExclude: options.cacheExclude
});
this.inputFile = inputFile;
this.outputFile = outputFile;
options = options || {};
this.options = {
nodeSass: options.nodeSass
};
var sass = this.options.nodeSass || nodeSass;
this.renderSass = rsvp.denodeify(sass.render);
this.sassOptions = {
importer: options.importer,
functions: options.functions,
indentedSyntax: options.indentedSyntax,
omitSourceMapUrl: options.omitSourceMapUrl,
outputStyle: options.outputStyle,
precision: options.precision,
sourceComments: options.sourceComments,
sourceMap: options.sourceMap,
sourceMapEmbed: options.sourceMapEmbed,
sourceMapContents: options.sourceMapContents
};
}
SassCompiler.prototype.build = function() {
var destFile = path.join(this.outputPath, this.outputFile);
var sourceMapFile = this.sassOptions.sourceMap;
if (typeof sourceMapFile !== 'string') {
sourceMapFile = destFile + '.map';
}
mkdirp.sync(path.dirname(destFile));
var sassOptions = {
file: includePathSearcher.findFileSync(this.inputFile, this.inputPaths),
includePaths: this.inputPaths,
outFile: destFile
};
assign(sassOptions, this.sassOptions);
return this.renderSass(sassOptions).then(function(result) {
var files = [
writeFile(destFile, result.css)
];
if (this.sassOptions.sourceMap && !this.sassOptions.sourceMapEmbed) {
files.push(writeFile(sourceMapFile, result.map));
}
return Promise.all(files);
}.bind(this));
};