diff --git a/lib/preprocessor.js b/lib/preprocessor.js index b7b1a41b2..88f3c67cd 100644 --- a/lib/preprocessor.js +++ b/lib/preprocessor.js @@ -1,9 +1,12 @@ +var path = require('path'); var fs = require('graceful-fs'); var crypto = require('crypto'); var mm = require('minimatch'); var log = require('./logger').create('preprocess'); +// TODO(vojta): extract get/create temp dir somewhere else (use the same for launchers etc) +var TMP = process.env.TMPDIR || process.env.TMP || process.env.TEMP || '/tmp'; var sha1 = function(data) { var hash = crypto.createHash('sha1'); @@ -20,6 +23,7 @@ var createPreprocessor = function(config, basePath, injector) { var preprocessors = []; var nextPreprocessor = function(content) { if (!preprocessors.length) { + file.contentPath = path.normalize(TMP + '/' + sha1(file.path) + path.extname(file.path)); return fs.writeFile(file.contentPath, content, function() { done(); }); @@ -56,11 +60,6 @@ var createPreprocessor = function(config, basePath, injector) { if (preprocessors.length) { return fs.readFile(file.originalPath, function(err, buffer) { - // TODO(vojta): extract get/create temp dir somewhere else (use the same for launchers etc) - var env = process.env; - var tmp = env.TMPDIR || env.TMP || env.TEMP || '/tmp'; - file.contentPath = tmp + '/' + sha1(file.originalPath) + '.js'; - nextPreprocessor(buffer.toString()); }); } diff --git a/test/unit/preprocessor.spec.coffee b/test/unit/preprocessor.spec.coffee index 936296587..3e0e12bbe 100644 --- a/test/unit/preprocessor.spec.coffee +++ b/test/unit/preprocessor.spec.coffee @@ -11,18 +11,25 @@ describe 'preprocessor', -> mockFs = mocks.fs.create some: 'a.js': mocks.fs.file 0, 'content' + 'style.less': mocks.fs.file 0, 'whatever' + temp: {} # so that we can write preprocessed content here + mocks_ = 'graceful-fs': mockFs minimatch: require 'minimatch' - m = mocks.loadFile __dirname + '/../../lib/preprocessor.js', mocks_ + globals_ = + process: + env: TMPDIR: '/temp' + nextTick: process.nextTick + + m = mocks.loadFile __dirname + '/../../lib/preprocessor.js', mocks_, globals_ it 'should preprocess matching file', (done) -> fakePreprocessor = sinon.spy (content, file, done) -> file.path = file.path + '-preprocessed' - file.contentPath = '/some/new.js' done 'new-content' injector = new di.Injector [{'preprocessor:fake': ['factory', -> fakePreprocessor]}] @@ -33,7 +40,7 @@ describe 'preprocessor', -> pp file, -> expect(fakePreprocessor).to.have.been.called expect(file.path).to.equal 'path-preprocessed' - expect(mockFs.readFileSync('/some/new.js').toString()).to.equal 'new-content' + expect(mockFs.readFileSync(file.contentPath).toString()).to.equal 'new-content' done() @@ -53,7 +60,6 @@ describe 'preprocessor', -> it 'should apply all preprocessors', (done) -> fakePreprocessor1 = sinon.spy (content, file, done) -> - file.contentPath = '/some/new.js' file.path = file.path + '-p1' done content + '-c1' @@ -74,5 +80,22 @@ describe 'preprocessor', -> expect(fakePreprocessor1).to.have.been.calledOnce expect(fakePreprocessor2).to.have.been.calledOnce expect(file.path).to.equal 'path-p1-p2' - expect(mockFs.readFileSync('/some/new.js').toString()).to.equal 'content-c1-c2' + expect(mockFs.readFileSync(file.contentPath).toString()).to.equal 'content-c1-c2' + done() + + + it 'should keep processed extension', (done) -> + fakePreprocessor = sinon.spy (content, file, done) -> + file.path = file.path.replace '.less', '.css' + done content + + injector = new di.Injector [{ + 'preprocessor:less': ['factory', -> fakePreprocessor] + }] + + pp = m.createPreprocessor {'**/*.less': ['less']}, null, injector + file = {originalPath: '/some/style.less', path: '/some/style.less'} + + pp file, -> + expect(file.contentPath).to.match /\.css$/ done()