UNPKG

grunt-process

Version:

gruntplugin for processing (add, replace, split) any file

130 lines (104 loc) 2.66 kB
'use strict'; var _ = require('lodash'); var async = require('async'); var asyncRun = function (func, callback, obj) { var async = 0; var done = 0; var result; var err; var _callback = function () { if (!done++) { callback.apply(this, arguments); } callback = null; }; var asyncCbk = function () { return async++ ? null : _callback; }; try { if (obj == null) { result = func(asyncCbk); } else { obj = Object.create(obj); obj.async = asyncCbk; result = func.call(obj); } } catch (e) { err = e; } if (!async) { _callback.call(this, err, result); } }; var task = function (grunt, files, options, gruntDone) { options = _.extend({ log: true, read: function (fSrc, fDest, fOptions) { return grunt.file.read(fSrc); }, process: function (fSrc, fDest, content, fOptions) { return content; }, save: function (fSrc, fDest, content, fOptions) { var fileObject = {}; fileObject[fDest] = content; return fileObject; } }, options); var fileObjects = []; files.forEach(function (f) { f.src.filter(function (filepath) { if (!grunt.file.exists(filepath)) { grunt.log.warn('Source file "' + filepath + '" not found.'); return false; } return true; }).forEach(function (srcFilePath) { fileObjects.push({ src: srcFilePath, dest: f.dest, object: f }); }); }); async.each(fileObjects, function (fileObject, fileDone) { async.nextTick(function () { async.series([ function (done) { asyncRun(function () { return options.read.call(this, fileObject.src, fileObject.dest, fileObject.object); }, function (err, result) { fileObject.content = result; done(err); }, options); }, function (done) { asyncRun(function () { return options.process.call(this, fileObject.src, fileObject.dest, fileObject.content, fileObject.object); }, function (err, result) { fileObject.content = result; done(err); }, options); }, function (done) { asyncRun(function () { return options.save.call(this, fileObject.src, fileObject.dest, fileObject.content, fileObject.object); }, function (err, filesHash) { if (err) { done(err); return; } _.each(filesHash, function (fileContent, filePath) { grunt.file.write(filePath, fileContent); if (options.log) { grunt.log.ok('File "' + filePath.replace(process.cwd(), '') + '" ' + (filePath === fileObject.src ? 'processed' : 'created')); } }); done(); }, options); } ], fileDone); }); }, gruntDone); }; module.exports = task;