forked from adopted-ember-addons/broccoli-sass-source-maps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
102 lines (84 loc) · 2.98 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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?'); }
options = options || {};
CachingWriter.call(this, inputNodes, {
annotation: options.annotation,
cacheInclude: options.cacheInclude,
cacheExclude: options.cacheExclude
});
this.inputFile = inputFile;
this.outputFile = outputFile;
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,
sourceMapRoot: options.sourceMapRoot
};
}
/**
* Mutates the error to include properties expected by Ember CLI.
* See https://github.com/ember-cli/ember-cli/blob/master/docs/ERRORS.md#error-object
* @param {Error} error
*/
function rethrowBuildError(error) {
if (typeof error === 'string') {
throw new Error('[string exception] ' + error);
} else {
error.type = 'Sass Syntax Error';
error.message = error.formatted;
error.location = {
line: error.line,
column: error.column
};
throw error;
}
}
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)).catch(rethrowBuildError);
};