|  | // Copyright (C) 2015 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | // http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | 'use strict'; | 
|  |  | 
|  | // Include Gulp & tools we'll use | 
|  | var gulp = require('gulp'); | 
|  | var $ = require('gulp-load-plugins')(); | 
|  | var del = require('del'); | 
|  | var runSequence = require('run-sequence'); | 
|  | var merge = require('merge-stream'); | 
|  | var path = require('path'); | 
|  | var historyApiFallback = require('connect-history-api-fallback'); | 
|  |  | 
|  | var AUTOPREFIXER_BROWSERS = [ | 
|  | 'ie >= 10', | 
|  | 'ie_mob >= 10', | 
|  | 'ff >= 30', | 
|  | 'chrome >= 34', | 
|  | 'safari >= 7', | 
|  | 'opera >= 23', | 
|  | 'ios >= 7', | 
|  | 'android >= 4.4', | 
|  | 'bb >= 10' | 
|  | ]; | 
|  |  | 
|  | var styleTask = function (stylesPath, srcs) { | 
|  | return gulp.src(srcs.map(function(src) { | 
|  | return path.join('app', stylesPath, src); | 
|  | })) | 
|  | .pipe($.changed(stylesPath, {extension: '.css'})) | 
|  | .pipe($.autoprefixer(AUTOPREFIXER_BROWSERS)) | 
|  | .pipe(gulp.dest('.tmp/' + stylesPath)) | 
|  | .pipe($.cssmin()) | 
|  | .pipe(gulp.dest('dist/' + stylesPath)) | 
|  | .pipe($.size({title: stylesPath})); | 
|  | }; | 
|  |  | 
|  | var imageOptimizeTask = function (src, dest) { | 
|  | return gulp.src(src) | 
|  | .pipe($.cache($.imagemin({ | 
|  | progressive: true, | 
|  | interlaced: true | 
|  | }))) | 
|  | .pipe(gulp.dest(dest)) | 
|  | .pipe($.size({title: 'images'})); | 
|  | }; | 
|  |  | 
|  | var optimizeHtmlTask = function (src, dest) { | 
|  | var assets = $.useref.assets({searchPath: ['.tmp', 'app', 'dist']}); | 
|  |  | 
|  | return gulp.src(src) | 
|  | // Replace path for vulcanized assets | 
|  | .pipe($.if('*.html', $.replace('elements/gr-app.html', 'elements/gr-app.vulcanized.html'))) | 
|  | .pipe(assets) | 
|  | // Concatenate and minify JavaScript | 
|  | .pipe($.if('*.js', $.uglify({preserveComments: 'some'}))) | 
|  | // Concatenate and minify styles | 
|  | // In case you are still using useref build blocks | 
|  | .pipe($.if('*.css', $.cssmin())) | 
|  | .pipe(assets.restore()) | 
|  | .pipe($.useref()) | 
|  | // Minify any HTML | 
|  | .pipe($.if('*.html', $.minifyHtml({ | 
|  | quotes: true, | 
|  | empty: true, | 
|  | spare: true | 
|  | }))) | 
|  | // Output files | 
|  | .pipe(gulp.dest(dest)) | 
|  | .pipe($.size({title: 'html'})); | 
|  | }; | 
|  |  | 
|  | // Compile and automatically prefix stylesheets | 
|  | gulp.task('styles', function () { | 
|  | return styleTask('styles', ['**/*.css']); | 
|  | }); | 
|  |  | 
|  | gulp.task('elements', function () { | 
|  | return styleTask('elements', ['**/*.css']); | 
|  | }); | 
|  |  | 
|  | // Optimize images | 
|  | gulp.task('images', function () { | 
|  | return imageOptimizeTask('app/images/**/*', 'dist/images'); | 
|  | }); | 
|  |  | 
|  | // Copy all files at the root level (app) | 
|  | gulp.task('copy', function () { | 
|  | var app = gulp.src([ | 
|  | 'app/*', | 
|  | '!app/test' | 
|  | ], { | 
|  | dot: true | 
|  | }).pipe(gulp.dest('dist')); | 
|  |  | 
|  | var bower = gulp.src([ | 
|  | 'bower_components/**/*' | 
|  | ]).pipe(gulp.dest('dist/bower_components')); | 
|  |  | 
|  | var elements = gulp.src(['app/elements/**/*.html', | 
|  | 'app/elements/**/*.css', | 
|  | 'app/elements/**/*.js']) | 
|  | .pipe(gulp.dest('dist/elements')); | 
|  |  | 
|  | var vulcanized = gulp.src(['app/elements/gr-app.html']) | 
|  | .pipe($.rename('gr-app.vulcanized.html')) | 
|  | .pipe(gulp.dest('dist/elements')); | 
|  |  | 
|  | return merge(app, bower, elements, vulcanized) | 
|  | .pipe($.size({title: 'copy'})); | 
|  | }); | 
|  |  | 
|  | // Copy web fonts to dist | 
|  | gulp.task('fonts', function () { | 
|  | return gulp.src(['app/fonts/**']) | 
|  | .pipe(gulp.dest('dist/fonts')) | 
|  | .pipe($.size({title: 'fonts'})); | 
|  | }); | 
|  |  | 
|  | // Scan your HTML for assets & optimize them | 
|  | gulp.task('html', function () { | 
|  | return optimizeHtmlTask( | 
|  | ['app/**/*.html', '!app/{elements,test}/**/*.html'], | 
|  | 'dist'); | 
|  | }); | 
|  |  | 
|  | // Vulcanize granular configuration. | 
|  | gulp.task('vulcanize', function () { | 
|  | var DEST_DIR = 'dist/elements'; | 
|  | return gulp.src('dist/elements/gr-app.vulcanized.html') | 
|  | .pipe($.vulcanize({ | 
|  | stripComments: true, | 
|  | inlineCss: true, | 
|  | inlineScripts: true | 
|  | })) | 
|  | .pipe(gulp.dest(DEST_DIR)) | 
|  | .pipe($.size({title: 'vulcanize'})); | 
|  | }); | 
|  |  | 
|  | // Clean output directory | 
|  | gulp.task('clean', function (cb) { | 
|  | del(['.tmp', 'dist'], cb); | 
|  | }); | 
|  |  | 
|  |  | 
|  | // Build production files, the default task | 
|  | gulp.task('default', ['clean'], function (cb) { | 
|  | // Uncomment 'cache-config' if you are going to use service workers. | 
|  | runSequence( | 
|  | ['copy', 'styles'], | 
|  | 'elements', | 
|  | ['images', 'fonts', 'html'], | 
|  | 'vulcanize', // 'cache-config', | 
|  | cb); | 
|  | }); | 
|  |  | 
|  | // Load tasks for web-component-tester | 
|  | // Adds tasks for `gulp test:local` and `gulp test:remote` | 
|  | require('web-component-tester').gulp.init(gulp); | 
|  |  | 
|  | // Load custom tasks from the `tasks` directory | 
|  | try { require('require-dir')('tasks'); } catch (err) {} |