| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | 'use strict';var $ = {  fs: require('fs'),  path: require('path')};var config;var fileTypes;var filesCaught = [];var globalDependenciesSorted;var ignorePath;/** * Inject dependencies into the specified source file. * * @param  {object} globalConfig  the global configuration object. * @return {object} config */function injectDependencies(globalConfig) {  config = globalConfig;  var stream = config.get('stream');  filesCaught = [];  globalDependenciesSorted = config.get('global-dependencies-sorted');  ignorePath = config.get('ignore-path');  fileTypes = config.get('file-types');  if (stream.src) {    config.set('stream', {      src: injectScriptsStream(stream.path, stream.src, stream.fileType),      fileType: stream.fileType    });  } else {    config.get('src').forEach(injectScripts);  }  return config;}function replaceIncludes(file, fileType, returnType) {  /**   * Callback function after matching our regex from the source file.   *   * @param  {array}  match       strings that were matched   * @param  {string} startBlock  the opening <!-- bower:xxx --> comment   * @param  {string} spacing     the type and size of indentation   * @param  {string} blockType   the type of block (js/css)   * @param  {string} oldScripts  the old block of scripts we'll remove   * @param  {string} endBlock    the closing <!-- endbower --> comment   * @return {string} the new file contents   */  return function (match, startBlock, spacing, blockType, oldScripts, endBlock, offset, string) {    blockType = blockType || 'js';    var newFileContents = startBlock;    var dependencies = globalDependenciesSorted[blockType] || [];    var quoteMark = '';    (string.substr(0, offset) + string.substr(offset + match.length)).      replace(oldScripts, '').      replace(fileType.block, '').      replace(fileType.detect[blockType], function (match, reference) {        quoteMark = match.match(/['"]/) && match.match(/['"]/)[0];        filesCaught.push(reference.replace(/['"\s]/g, ''));      });    if (!quoteMark) {      // What the heck. Check if there's anything in the oldScripts block.      match.replace(fileType.detect[blockType], function (match) {        quoteMark = match.match(/['"]/) && match.match(/['"]/)[0];      });    }    spacing = returnType + spacing.replace(/\r|\n/g, '');    dependencies.      map(function (filePath) {        return $.path.join(          $.path.relative($.path.dirname(file), $.path.dirname(filePath)),          $.path.basename(filePath)        ).replace(/\\/g, '/').replace(ignorePath, '');      }).      filter(function (filePath) {        return filesCaught.indexOf(filePath) === -1;      }).      forEach(function (filePath) {        if (typeof fileType.replace[blockType] === 'function') {          newFileContents += spacing + fileType.replace[blockType](filePath);        } else if (typeof fileType.replace[blockType] === 'string') {          newFileContents += spacing + fileType.replace[blockType].replace('{{filePath}}', filePath);        }        if (quoteMark) {          newFileContents = newFileContents.replace(/"/g, quoteMark);        }        config.get('on-path-injected')({          block: blockType,          file: file,          path: filePath        });      });    return newFileContents + spacing + endBlock;  };}/** * Take a file path, read its contents, inject the Bower packages, then write * the new file to disk. * * @param  {string} filePath  path to the source file */function injectScripts(filePath) {  var contents = String($.fs.readFileSync(filePath));  var fileExt = $.path.extname(filePath).substr(1);  var fileType = fileTypes[fileExt] || fileTypes['default'];  var returnType = /\r\n/.test(contents) ? '\r\n' : '\n';  var newContents = contents.replace(    fileType.block,    replaceIncludes(filePath, fileType, returnType)  );  if (contents !== newContents) {    $.fs.writeFileSync(filePath, newContents);    config.get('on-file-updated')(filePath);  }}function injectScriptsStream(filePath, contents, fileExt) {  var returnType = /\r\n/.test(contents) ? '\r\n' : '\n';  var fileType = fileTypes[fileExt] || fileTypes['default'];  var newContents = contents.replace(    fileType.block,    replaceIncludes(filePath, fileType, returnType)  );  config.get('on-file-updated')(filePath);  return newContents;}module.exports = injectDependencies;
 |