|
| 1 | +/// <binding Clean='clean' /> |
| 2 | +'use strict'; |
| 3 | + |
| 4 | +// process.env.BROWSERIFYSHIM_DIAGNOSTICS=1 |
| 5 | + |
| 6 | +var gulp = require("gulp"), |
| 7 | + argv = require('yargs').argv, |
| 8 | + rimraf = require("rimraf"), |
| 9 | + concat = require("gulp-concat"), |
| 10 | + cssmin = require("gulp-cssmin"), |
| 11 | + gulpif = require("gulp-if"), |
| 12 | + rename = require("gulp-rename"), |
| 13 | + uglify = require("gulp-uglify"), |
| 14 | + less = require("gulp-less"), |
| 15 | + sourcemaps = require('gulp-sourcemaps'), |
| 16 | + browserify = require('browserify'), |
| 17 | + browserifyShim = require('browserify-shim'), |
| 18 | + eventStream = require('event-stream'), |
| 19 | + typescript = require("gulp-typescript"), |
| 20 | + runSequence = require('run-sequence'), |
| 21 | + buffer = require('vinyl-buffer'), |
| 22 | + source = require('vinyl-source-stream'), |
| 23 | + transform = require('vinyl-transform'); |
| 24 | + |
| 25 | +// |
| 26 | +// Configuration |
| 27 | +// |
| 28 | + |
| 29 | +var paths = { |
| 30 | + source: "./src/", |
| 31 | + output: "./www/" |
| 32 | +}; |
| 33 | + |
| 34 | +var build = { |
| 35 | + input: { |
| 36 | + files: { |
| 37 | + // Source to compile |
| 38 | + ts: [ |
| 39 | + paths.source + '**/*.ts', |
| 40 | + paths.source + '**/*.tsx' |
| 41 | + ], |
| 42 | + |
| 43 | + // Styles |
| 44 | + styles: paths.source + "styles/**/*.css", |
| 45 | + stylesMin: paths.source + "styles/**/*.min.css", |
| 46 | + less: [paths.source + "styles/**/*.less"], |
| 47 | + app_less: [paths.source + "styles/**.less"], |
| 48 | + |
| 49 | + // Images |
| 50 | + images: paths.source + "images/*.png", |
| 51 | + |
| 52 | + // Scripts |
| 53 | + scripts: paths.source + "scripts/**/*.js", |
| 54 | + scriptsMin: paths.source + "scripts/**/*.min.js", |
| 55 | + vendor_js: [ |
| 56 | + // 'history', |
| 57 | + 'react', |
| 58 | + 'react-dom', |
| 59 | + 'react-router', |
| 60 | + 'react-router-dom' |
| 61 | + ], |
| 62 | + extern_js: [ |
| 63 | + 'node_modules/q/q.js', |
| 64 | + ], |
| 65 | + polyfill_js: [ |
| 66 | + paths.source + 'polyfills/Object.assign.js' |
| 67 | + ], |
| 68 | + |
| 69 | + // Miscellaneous files to copy |
| 70 | + public: [paths.source + 'public/**/*'], |
| 71 | + } |
| 72 | + }, |
| 73 | + output: { |
| 74 | + files: { |
| 75 | + styles: paths.output + "styles/main.css", |
| 76 | + scripts: paths.output + "scripts/main.js", |
| 77 | + }, |
| 78 | + dirs: { |
| 79 | + ts: paths.output, |
| 80 | + images: paths.output + 'images', |
| 81 | + root: paths.output, |
| 82 | + styles: paths.output + 'styles', |
| 83 | + scripts: paths.output + 'scripts', |
| 84 | + polyfills: paths.output + 'polyfills', |
| 85 | + views: paths.output + 'views' |
| 86 | + } |
| 87 | + }, |
| 88 | + other: { |
| 89 | + clean: ['output/*', 'build/*'], |
| 90 | + output_typings: 'output/typings', |
| 91 | + // An intermediate file; output from tsx, input to bundle. |
| 92 | + client_js: [paths.output + 'client.js'] |
| 93 | + } |
| 94 | +}; |
| 95 | + |
| 96 | +// |
| 97 | +// Setup |
| 98 | +// |
| 99 | + |
| 100 | +var typescriptProject = typescript.createProject("tsconfig.json"); |
| 101 | + |
| 102 | +var minify = argv.production || argv.staging; |
| 103 | + |
| 104 | +// |
| 105 | +// Basic tasks |
| 106 | +// |
| 107 | + |
| 108 | +gulp.task("clean", function (cb) { |
| 109 | + rimraf(paths.output, cb); |
| 110 | +}); |
| 111 | + |
| 112 | +gulp.task("scripts", function () { |
| 113 | + gulp.src([build.input.files.scripts, "!" + build.input.files.scriptsMin], { base: "." }) |
| 114 | + .pipe(concat(build.output.files.scripts)) |
| 115 | + .pipe(gulpif(minify, uglify())) |
| 116 | + .pipe(gulpif(minify, rename({ suffix: '.min' }))) |
| 117 | + .pipe(gulp.dest(".")); |
| 118 | +}); |
| 119 | + |
| 120 | +gulp.task("styles", function () { |
| 121 | + gulp.src([build.input.files.styles, "!" + build.input.files.stylesMin]) |
| 122 | + .pipe(concat(build.output.files.styles)) |
| 123 | + .pipe(gulpif(minify, cssmin())) |
| 124 | + .pipe(gulp.dest(".")); |
| 125 | +}); |
| 126 | + |
| 127 | +gulp.task('less', function () { |
| 128 | + return gulp.src(build.input.files.app_less) |
| 129 | + .pipe(gulpif(!minify, sourcemaps.init())) |
| 130 | + .pipe(less()).on('error', function (err) { |
| 131 | + console.error(err); |
| 132 | + this.emit('end'); // emit the end event, to properly end the task. |
| 133 | + }) |
| 134 | + .pipe(gulpif(!minify, sourcemaps.write())) |
| 135 | + .pipe(gulpif(minify, cssmin())) |
| 136 | + .pipe(gulpif(minify, rename({ suffix: '.min' }))) |
| 137 | + .pipe(gulp.dest(build.output.dirs.styles)); |
| 138 | +}); |
| 139 | + |
| 140 | +// |
| 141 | +// Compilation and packaging |
| 142 | +// |
| 143 | + |
| 144 | +gulp.task('typescript', function () { |
| 145 | + return gulp |
| 146 | + .src(build.input.files.ts) |
| 147 | + .pipe(typescriptProject()) |
| 148 | + .pipe(gulp.dest(build.output.dirs.ts)); |
| 149 | +}); |
| 150 | + |
| 151 | +gulp.task('vendor', function() { |
| 152 | + return browserify({ |
| 153 | + insertGlobals: true, |
| 154 | + }) |
| 155 | + .transform(browserifyShim) |
| 156 | + .require(build.input.files.vendor_js) |
| 157 | + .bundle() |
| 158 | + .on('error', console.error.bind(console)) |
| 159 | + .pipe(source('vendor.js')) |
| 160 | + // http://stackoverflow.com/questions/24992980/how-to-uglify-output-with-browserify-in-gulp |
| 161 | + // Convert from streaming to buffered vinyl file object for uglify |
| 162 | + .pipe(gulpif(minify, buffer())) |
| 163 | + .pipe(gulpif(minify, uglify())) |
| 164 | + .pipe(gulpif(minify, rename({ suffix: '.min' }))) |
| 165 | + .pipe(gulp.dest(build.output.dirs.scripts)); |
| 166 | +}); |
| 167 | + |
| 168 | +gulp.task('app', function() { |
| 169 | + return browserify({ |
| 170 | + insertGlobals: true, |
| 171 | + entries: build.other.client_js |
| 172 | + }) |
| 173 | + .transform(browserifyShim) |
| 174 | + .external(build.input.files.vendor_js) |
| 175 | + // .add(build.input.files.polyfill_js) |
| 176 | + .bundle() |
| 177 | + .on('error', console.error.bind(console)) |
| 178 | + .pipe(source('app.js')) |
| 179 | + // http://stackoverflow.com/questions/24992980/how-to-uglify-output-with-browserify-in-gulp |
| 180 | + // Convert from streaming to buffered vinyl file object for uglify |
| 181 | + .pipe(gulpif(minify, buffer())) |
| 182 | + .pipe(gulpif(minify, uglify())) |
| 183 | + .pipe(gulpif(minify, rename({ suffix: '.min' }))) |
| 184 | + .pipe(gulp.dest(build.output.dirs.scripts)); |
| 185 | +}); |
| 186 | + |
| 187 | +// |
| 188 | +// Copy tasks |
| 189 | +// |
| 190 | + |
| 191 | +gulp.task('public', function() { |
| 192 | + return gulp.src(build.input.files.public) |
| 193 | + .pipe(gulp.dest(build.output.dirs.root)); |
| 194 | +}); |
| 195 | + |
| 196 | +gulp.task('images', function() { |
| 197 | + return gulp.src(build.input.files.images) |
| 198 | + .pipe(gulp.dest(build.output.dirs.root)); |
| 199 | +}); |
| 200 | + |
| 201 | +gulp.task('extern', function () { |
| 202 | + return gulp.src(build.input.files.extern_js) |
| 203 | + .pipe(gulp.dest(build.output.dirs.scripts)); |
| 204 | +}); |
| 205 | + |
| 206 | +gulp.task('polyfills', function() { |
| 207 | + return gulp.src(build.input.files.polyfill_js) |
| 208 | + .pipe(gulp.dest(build.output.dirs.polyfills)); |
| 209 | +}); |
| 210 | + |
| 211 | +gulp.task('copy', ['public', 'scripts', 'styles','images' /* 'extern', 'polyfills' */], function(){}); |
| 212 | + |
| 213 | +gulp.task('compile', function(callback) { |
| 214 | + runSequence(['typescript', 'less'], ['vendor', 'app'], callback); |
| 215 | +}); |
| 216 | + |
| 217 | +gulp.task('recompile', function(callback) { |
| 218 | + runSequence('typescript', 'app', callback); |
| 219 | +}); |
| 220 | + |
| 221 | +gulp.task('watch', function() { |
| 222 | + gulp.watch(build.input.files.ts, ['recompile']); |
| 223 | + gulp.watch(build.input.files.views, ['views']); |
| 224 | + gulp.watch(build.input.files.styles, ['styles']); |
| 225 | + gulp.watch(build.input.files.less, ['less']); |
| 226 | +}); |
| 227 | + |
| 228 | +// The default task (called when running 'gulp' from the command line). |
| 229 | +gulp.task('default', ['copy', 'compile'], function(){}); |
0 commit comments