github.com/fanux/shipyard@v0.0.0-20161009071005-6515ce223235/controller/static/semantic/tasks/admin/distributions/create.js (about)

     1  /*******************************
     2       Create Distributions
     3  *******************************/
     4  
     5  /*
     6   This will create individual distribution repositories for each SUI distribution
     7  
     8    * copy distribution files to release
     9    * update package.json file
    10  */
    11  
    12  var
    13    gulp            = require('gulp'),
    14  
    15    // node dependencies
    16    console         = require('better-console'),
    17    del             = require('del'),
    18    fs              = require('fs'),
    19    path            = require('path'),
    20    runSequence     = require('run-sequence'),
    21    mergeStream     = require('merge-stream'),
    22  
    23    // admin dependencies
    24    concatFileNames = require('gulp-concat-filenames'),
    25    debug           = require('gulp-debug'),
    26    flatten         = require('gulp-flatten'),
    27    git             = require('gulp-git'),
    28    jsonEditor      = require('gulp-json-editor'),
    29    plumber         = require('gulp-plumber'),
    30    rename          = require('gulp-rename'),
    31    replace         = require('gulp-replace'),
    32    tap             = require('gulp-tap'),
    33  
    34    // config
    35    config          = require('../../config/user'),
    36    release         = require('../../config/admin/release'),
    37    project         = require('../../config/project/release'),
    38  
    39    // shorthand
    40    version         = project.version,
    41    output          = config.paths.output
    42  
    43  ;
    44  
    45  
    46  module.exports = function(callback) {
    47    var
    48      stream,
    49      index,
    50      tasks = []
    51    ;
    52  
    53    for(index in release.distributions) {
    54  
    55      var
    56        distribution = release.distributions[index]
    57      ;
    58  
    59      // streams... designed to save time and make coding fun...
    60      (function(distribution) {
    61  
    62        var
    63          distLowerCase   = distribution.toLowerCase(),
    64          outputDirectory = path.join(release.outputRoot, distLowerCase),
    65          packageFile     = path.join(outputDirectory, release.files.npm),
    66          repoName        = release.distRepoRoot + distribution,
    67          regExp          = {
    68            match : {
    69              files   : '{files}',
    70              version : '{version}'
    71            }
    72          },
    73          task = {
    74            all     : distribution + ' copying files',
    75            repo    : distribution + ' create repo',
    76            meteor  : distribution + ' create meteor package.js',
    77            package : distribution + ' create package.json'
    78          },
    79          gatherFiles,
    80          createList
    81        ;
    82  
    83        // get files for meteor
    84        gatherFiles = function(dir) {
    85          var
    86            dir   = dir || path.resolve('.'),
    87            list  = fs.readdirSync(dir),
    88            omitted = [
    89              '.git',
    90              'node_modules',
    91              'package.js',
    92              'LICENSE',
    93              'README.md',
    94              'package.json',
    95              'bower.json',
    96              '.gitignore'
    97            ]
    98            files = []
    99          ;
   100          list.forEach(function(file) {
   101            var
   102              isOmitted = (omitted.indexOf(file) > -1),
   103              filePath  = path.join(dir, file),
   104              stat      = fs.statSync(filePath)
   105            ;
   106            if(!isOmitted) {
   107              if(stat && stat.isDirectory()) {
   108                files = files.concat(gatherFiles(filePath));
   109              }
   110              else {
   111                files.push(filePath.replace(outputDirectory + path.sep, ''));
   112              }
   113            }
   114          })
   115          return files
   116        };
   117  
   118        // spaces out list correctly
   119        createList = function(files) {
   120          var filenames = '';
   121          for(file in files) {
   122            if(file == (files.length - 1) ) {
   123              filenames += "'" + files[file] + "'";
   124            }
   125            else {
   126              filenames += "'" + files[file] + "',\n    ";
   127            }
   128          }
   129          return filenames;
   130        };
   131  
   132  
   133        gulp.task(task.meteor, function() {
   134          var
   135            files     = gatherFiles(outputDirectory)
   136            filenames = createList(files)
   137          ;
   138          gulp.src(release.templates.meteor[distLowerCase])
   139            .pipe(plumber())
   140            .pipe(flatten())
   141            .pipe(replace(regExp.match.version, version))
   142            .pipe(replace(regExp.match.files, filenames))
   143            .pipe(rename(release.files.meteor))
   144            .pipe(gulp.dest(outputDirectory))
   145          ;
   146        });
   147  
   148        if(distribution == 'CSS') {
   149          gulp.task(task.repo, function() {
   150            var
   151              themes,
   152              component,
   153              releases
   154            ;
   155            themes = gulp.src('dist/themes/default/**/*', { base: 'dist/' })
   156              .pipe(gulp.dest(outputDirectory))
   157            ;
   158            components = gulp.src('dist/components/*', { base: 'dist/' })
   159              .pipe(gulp.dest(outputDirectory))
   160            ;
   161            releases = gulp.src('dist/*', { base: 'dist/' })
   162              .pipe(gulp.dest(outputDirectory))
   163            ;
   164            return mergeStream(themes, components, releases);
   165          });
   166        }
   167        else if(distribution == 'LESS') {
   168          gulp.task(task.repo, function() {
   169            var
   170              definitions,
   171              themeImport,
   172              themeConfig,
   173              siteTheme,
   174              themes
   175            ;
   176            definitions = gulp.src('src/definitions/**/*', { base: 'src/' })
   177              .pipe(gulp.dest(outputDirectory))
   178            ;
   179            themeImport = gulp.src('src/semantic.less', { base: 'src/' })
   180              .pipe(gulp.dest(outputDirectory))
   181            ;
   182            themeImport = gulp.src('src/theme.less', { base: 'src/' })
   183              .pipe(gulp.dest(outputDirectory))
   184            ;
   185            themeConfig = gulp.src('src/theme.config.example', { base: 'src/' })
   186              .pipe(gulp.dest(outputDirectory))
   187            ;
   188            siteTheme = gulp.src('src/_site/**/*', { base: 'src/' })
   189              .pipe(gulp.dest(outputDirectory))
   190            ;
   191            themes = gulp.src('src/themes/**/*', { base: 'src/' })
   192              .pipe(gulp.dest(outputDirectory))
   193            ;
   194            return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes);
   195          });
   196        }
   197  
   198        // extend package.json
   199        gulp.task(task.package, function() {
   200          return gulp.src(packageFile)
   201            .pipe(plumber())
   202            .pipe(jsonEditor(function(package) {
   203              if(version) {
   204                package.version = version;
   205              }
   206              return package;
   207            }))
   208            .pipe(gulp.dest(outputDirectory))
   209          ;
   210        });
   211  
   212        tasks.push(task.meteor);
   213        tasks.push(task.repo);
   214        tasks.push(task.package);
   215  
   216      })(distribution);
   217    }
   218    runSequence(tasks, callback);
   219  };