stpettersens/Cart

View on GitHub
Gulpfile.js

Summary

Maintainability
A
2 hrs
Test Coverage
/*
    Compile Cart.ts to JavaScript for end-use.
*/

var gulp = require('gulp'),
      fs = require('fs'),
     tsc = require('gulp-typescript'),
  insert = require('gulp-insert'),
 replace = require('gulp-replace'),
  rename = require('gulp-rename'),
  uglify = require('gulp-uglify');

var header = '/*' +
'\nA shopping cart implemented via the client-side in TypeScript.' +
'\nCopyright 2015 Sam Saint-Pettersen.' +
'\nReleased under the MIT License.' +
'\nhttps://github.com/stpettersens/Cart' +
'\n*/\n';

gulp.task('js', function() {
    return gulp.src('Cart.ts')
    .pipe(tsc({
        noImplicitAny: true,
        removeComments: true,
        out: 'cart.js'
    }))
    .pipe(gulp.dest('.'))
    .pipe(insert.prepend(header))
    .pipe(gulp.dest('.'));
});

gulp.task('node', function() {
    return gulp.src('Cart.ts')
    .pipe(tsc({
        noImplicitAny: true,
        removeComments: true,
        out: 'cart.node.js'
    }))
    .pipe(gulp.dest('.'))
    .pipe(insert.prepend('var $ = require(\'jquery\')(jsdom.jsdom(\'' +
    '<div id="cart-alert"></div>' +
    '<div id="cart-box"></div>' +
    '<div id="product-1">' +
    '<p class="item name">Supa Soda</p>' +
    '<p class="price">$ 0.85</p>' +
    '<p class="qty">5</p>' +
    '</div>' +
    '<div id="product-2">' +
    '<p class="item name">Dakota Cola</p>' +
    '<p class="price">$ 0.70</p>' +
    '<p class="qty">5</p>' +
    '</div>' +
    '<div id="product-3">' +
    '<p class="item name">Soda Water (250ml)</p>' +
    '<p class="price">$ 1.50</p>' +
    '<p class="qty>"5</p>' +
    '</div>\').parentWindow);\n'))
    .pipe(insert.prepend('var fc = require(\'fake-cookie\');\n'))
    .pipe(insert.prepend('var Storage = \'ssp-fake-storage\';\n'))
    .pipe(insert.prepend('var jsdom = require(\'node-jsdom\');\n'))
    .pipe(insert.prepend('var localStorage = require(\'ssp-fake-storage\');\n'))
    .pipe(insert.prepend(header))
    .pipe(insert.prepend('/* FOR HEADLESS TESTING IN NODE.JS ONLY. DO NOT USE IN BROWSER. */\n'))
    .pipe(insert.append('module.exports = Cart'))
    .pipe(replace(/(localStorage).length/g, '$1.count'))
    .pipe(replace(/for \(var key in (localStorage)\)/g,
    'for (var i = 0; i < $1.count; i++)'))
    .pipe(replace(/key.search/g, 'localStorage.key(i).search'))
    .pipe(replace(/key.indexOf/g, 'localStorage.key()'))
    .pipe(replace(/(localStorage.getItem)\(key\)/g, '$1(localStorage.key(i))'))
    .pipe(replace(/(localStorage.removeItem)\(key\)/g, '$1(localStorage.key(i))'))
    .pipe(replace(/\$.(cookie)/g, 'fc.$1'))
    .pipe(replace(/\$.(removeCookie)/g, 'fc.$1'))
    .pipe(gulp.dest('.'));
})

gulp.task('jsmin', function() {
    return gulp.src('Cart.ts')
    .pipe(tsc({
        noImplicitAny: true,
        removeComments: true,
        out: 'cart.js'
    }))
    .pipe(insert.prepend(header))
    .pipe(gulp.dest('.'))
    .pipe(rename('cart.min.js'))
    .pipe(uglify())
    .pipe(insert.prepend(header))
    .pipe(gulp.dest('.'));
});

gulp.task('clean', function() {
    fs.unlinkSync('cart.js');
    fs.unlinkSync('cart.min.js');
});

gulp.task('default', ['jsmin'], function(){});