| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | /* * grunt-contrib-concat * http://gruntjs.com/ * * Copyright (c) 2015 "Cowboy" Ben Alman, contributors * Licensed under the MIT license. */'use strict';module.exports = function(grunt) {  // Internal lib.  var comment = require('./lib/comment').init(grunt);  var chalk = require('chalk');  var sourcemap = require('./lib/sourcemap').init(grunt);  grunt.registerMultiTask('concat', 'Concatenate files.', function() {    // Merge task-specific and/or target-specific options with these defaults.    var options = this.options({      separator: grunt.util.linefeed,      banner: '',      footer: '',      stripBanners: false,      process: false,      sourceMap: false,      sourceMapName: undefined,      sourceMapStyle: 'embed'    });    // Normalize boolean options that accept options objects.    if (options.stripBanners === true) { options.stripBanners = {}; }    if (options.process === true) { options.process = {}; }    // Process banner and footer.    var banner = grunt.template.process(options.banner);    var footer = grunt.template.process(options.footer);    // Set a local variable for whether to build source maps or not.    var sourceMap = options.sourceMap;    // If content is not embedded and it will be modified, either exit or do    // not make the source map.    if (      sourceMap && options.sourceMapStyle === 'link' &&        (options.stripBanners || options.process)    ) {      // Warn and exit if --force isn't set.      grunt.warn(        'stripBanners or process option is enabled. ' +        'Set sourceMapStyle option to \'embed\' or \'inline\'.'      );      // --force is set, continue on without the source map.      grunt.log.warn('Skipping creation of source maps.');      // Set sourceMap to false to keep maps from being constructed.      sourceMap = false;    }    // Iterate over all src-dest file pairs.    this.files.forEach(function(f) {      // Initialize source map objects.      var sourceMapHelper;      if (sourceMap) {        sourceMapHelper = sourcemap.helper(f, options);        sourceMapHelper.add(banner);      }      // Concat banner + specified files + footer.      var src = banner + f.src.filter(function(filepath) {        // Warn on and remove invalid source files (if nonull was set).        if (!grunt.file.exists(filepath)) {          grunt.log.warn('Source file "' + filepath + '" not found.');          return false;        } else {          return true;        }      }).map(function(filepath, i) {        if (grunt.file.isDir(filepath)) {          return;        }        // Read file source.        var src = grunt.file.read(filepath);        // Process files as templates if requested.        if (typeof options.process === 'function') {          src = options.process(src, filepath);        } else if (options.process) {          src = grunt.template.process(src, options.process);        }        // Strip banners if requested.        if (options.stripBanners) {          src = comment.stripBanner(src, options.stripBanners);        }        // Add the lines of this file to our map.        if (sourceMapHelper) {          src = sourceMapHelper.addlines(src, filepath);          if (i < f.src.length - 1) {            sourceMapHelper.add(options.separator);          }        }        return src;      }).join(options.separator) + footer;      if (sourceMapHelper) {        sourceMapHelper.add(footer);        sourceMapHelper.write();        // Add sourceMappingURL to the end.        src += sourceMapHelper.url();      }      // Write the destination file.      grunt.file.write(f.dest, src);      // Print a success message.      grunt.log.writeln('File ' + chalk.cyan(f.dest) + ' created.');    });  });};
 |