Make sourcemap source paths relative to file.base; fixes #92.

This commit is contained in:
David Clark 2014-10-04 17:05:52 -07:00
parent 10b8436a3c
commit 63a08c54f6
4 changed files with 55 additions and 7 deletions

View file

@ -42,15 +42,24 @@ module.exports = function (options) {
opts.includePaths = [fileDir];
}
opts.success = function (css, map) {
var sourceMap;
if (typeof opts.onSuccess === 'function') opts.onSuccess(css, map);
opts.success = function (css, sourceMap) {
if (typeof opts.onSuccess === 'function') opts.onSuccess(css, sourceMap);
if (map) {
if (sourceMap) {
// hack to remove the already added sourceMappingURL from libsass
css = css.replace(/\/\*#\s*sourceMappingURL\=.*\*\//, '');
applySourceMap(file, map);
// libsass gives us sources' paths relative to file;
// gulp-sourcemaps needs sources' paths relative to file.base;
// so alter the sources' paths to please gulp-sourcemaps.
sourceMap = JSON.parse(sourceMap);
sourceMap.sources = sourceMap.sources.map(function(source) {
var abs = path.resolve(path.dirname(file.path), source);
return path.relative(file.base, abs);
});
sourceMap = JSON.stringify(sourceMap);
applySourceMap(file, sourceMap);
}
file.path = ext(file.path, '.css');

View file

@ -1,2 +1,6 @@
$blue: #3bbfce;
$margin: 16px;
$margin: 16px;
body {
background: pink;
}

View file

@ -0,0 +1 @@
@import "../inheritance";

View file

@ -4,6 +4,7 @@ var gutil = require('gulp-util');
var fs = require('fs');
var path = require('path');
var test = require('tape');
var sourcemap = require('source-map');
function createVinyl(sassFileName, contents) {
var base = path.join(__dirname, 'scss');
@ -106,4 +107,37 @@ test('call custom error callback when opts.onError is given', function (t) {
new Buffer('body { font \'Comic Sans\'; }'));
stream.write(errorFile);
});
});
test('sourcemaps', function (t) {
var sassFile = createVinyl('subdir/multilevelimport.scss');
// Pretend sourcemap.init() happened by mimicking
// the object it would create.
sassFile.sourceMap = {
version: 3,
file: 'scss/subdir/multilevelimport.scss',
names: [],
mappings: '',
sources: [ 'scss/subdir/multilevelimport.scss' ],
sourcesContent: [ '@import "../inheritance";\n' ]
};
// Expected sources are relative to file.base
var expectedSources = [
'includes/_cats.scss',
'inheritance.scss'
];
var stream = gsass();
stream.on('data', function (cssFile) {
t.deepEqual(
cssFile.sourceMap.sources,
expectedSources,
'sourcemap paths are relative to file.base'
);
t.end();
});
stream.write(sassFile);
});