Michael Lando | efa037d | 2017-02-19 12:57:33 +0200 | [diff] [blame] | 1 | /*- |
| 2 | * ============LICENSE_START======================================================= |
| 3 | * SDC |
| 4 | * ================================================================================ |
| 5 | * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| 6 | * ================================================================================ |
| 7 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 8 | * you may not use this file except in compliance with the License. |
| 9 | * You may obtain a copy of the License at |
| 10 | * |
| 11 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 12 | * |
| 13 | * Unless required by applicable law or agreed to in writing, software |
| 14 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 16 | * See the License for the specific language governing permissions and |
| 17 | * limitations under the License. |
| 18 | * ============LICENSE_END========================================================= |
| 19 | */ |
| 20 | |
| 21 | 'use strict'; |
| 22 | |
| 23 | var path = require('path'); |
| 24 | var gulp = require('gulp'); |
| 25 | var gulpHelpers = require('gulp-helpers'); |
| 26 | var taskMaker = gulpHelpers.taskMaker(gulp); |
| 27 | var _ = gulpHelpers.framework('_'); |
| 28 | var runSequence = gulpHelpers.framework('run-sequence'); |
| 29 | var i18nTask = require('./tools/gulp/tasks/i18n'); |
| 30 | var prodTask = require('./tools/gulp/tasks/prod'); |
| 31 | var gulpCssUsage = require('gulp-css-usage').default; |
| 32 | var webpack = require('webpack'); |
| 33 | var WebpackDevServer = require('webpack-dev-server'); |
| 34 | |
| 35 | var localDevConfig = {}; |
| 36 | try { |
| 37 | localDevConfig = require('./devConfig'); |
| 38 | } catch (e) { |
| 39 | } |
| 40 | var devConfig = Object.assign({}, require('./devConfig.defaults'), localDevConfig); |
| 41 | var webpackConfig = require('./webpack.config'); |
| 42 | |
| 43 | function defineTasks(mode) { |
| 44 | let appName = 'onboarding'; |
| 45 | let dist = 'dist/' + mode + '/'; |
| 46 | |
| 47 | let path = { |
| 48 | locales: 'i18n/', |
| 49 | jssource: 'src/**/*.js', |
| 50 | jsxsource: 'src/**/*.jsx', |
| 51 | html: '**/*.html', |
| 52 | output: dist, |
| 53 | assets: './resources/**/*.{css,png,svg,eot,ttf,woff,woff2,otf}', |
| 54 | json: './src/**/*.json', |
| 55 | index: './src/index.html', |
| 56 | heat: './src/heat.html', |
| 57 | watch: ['./src/**'], |
| 58 | scss: './resources/scss/**/*.scss', |
| 59 | css: dist + '/css', |
| 60 | war: [dist + 'index.html', dist + 'punch-outs_en.js', dist + '**/*.{css,png,svg,eot,ttf,woff,woff2,otf}', dist + '**/*(config.json|locale.json)', 'tools/gulp/deployment/**', 'webapp-onboarding/**'], |
| 61 | heatWar: [dist + 'heat.html', dist + 'heat-validation_en.js', dist + '**/*.{css,png,svg,eot,ttf,woff,woff2,otf}', dist + '**/*(config.json|locale.json)', 'webapp-heat-validation/**'], |
| 62 | wardest: 'dist/' |
| 63 | }; |
| 64 | |
| 65 | taskMaker.defineTask('clean', {taskName: 'clean', src: path.output}); |
| 66 | taskMaker.defineTask('copy', {taskName: 'copy-assets', src: path.assets, dest: path.output}); |
| 67 | taskMaker.defineTask('copy', { |
| 68 | taskName: 'copy-json', |
| 69 | src: path.json, |
| 70 | dest: path.output, |
| 71 | changed: {extension: '.json'} |
| 72 | }); |
| 73 | taskMaker.defineTask('copy', { |
| 74 | taskName: 'copy-index.html', |
| 75 | src: path.index, |
| 76 | dest: path.output, |
| 77 | rename: 'index.html' |
| 78 | }); |
| 79 | taskMaker.defineTask('copy', { |
| 80 | taskName: 'copy-heat.html', |
| 81 | src: path.heat, |
| 82 | dest: path.output, |
| 83 | rename: 'heat.html' |
| 84 | }); |
| 85 | taskMaker.defineTask('sass', { |
| 86 | taskName: 'sass', |
| 87 | src: path.scss, |
| 88 | dest: path.css, |
| 89 | config: {outputStyle: 'compressed'} |
| 90 | }); |
| 91 | taskMaker.defineTask('compress', { |
| 92 | taskName: 'compress-war', |
| 93 | src: path.war, |
| 94 | filename: appName + '.war', |
| 95 | dest: path.wardest |
| 96 | }); |
| 97 | taskMaker.defineTask('compress', { |
| 98 | taskName: 'compress-heat-war', |
| 99 | src: path.heatWar, |
| 100 | filename: 'heat-validation.war', |
| 101 | dest: path.wardest |
| 102 | }); |
| 103 | taskMaker.defineTask('watch', { |
| 104 | taskName: 'watch-stuff', |
| 105 | src: [path.assets, path.json, path.index, path.heat], |
| 106 | tasks: ['copy-stuff'] |
| 107 | }); |
| 108 | taskMaker.defineTask('watch', {taskName: 'watch-sass', src: path.scss, tasks: ['sass']}); |
| 109 | |
| 110 | gulp.task('copy-stuff', callback => { |
| 111 | return runSequence(['copy-assets', 'copy-json', 'copy-index.html', 'copy-heat.html'], callback); |
| 112 | }); |
| 113 | |
| 114 | gulp.task('i18n', () => { |
| 115 | return i18nTask({ |
| 116 | outputPath: path.output, |
| 117 | localesPath: path.locales, |
| 118 | lang: 'en' |
| 119 | }).catch(err => { |
| 120 | console.log('i18n Task : Error! ', err); |
| 121 | throw err; |
| 122 | }); |
| 123 | }); |
| 124 | |
| 125 | |
| 126 | gulp.task('dependencies', () => { |
| 127 | //TODO: |
| 128 | }); |
| 129 | |
| 130 | } |
| 131 | |
| 132 | gulp.task('dev', callback => { |
| 133 | defineTasks('dev'); |
| 134 | return runSequence('clean', ['i18n', 'copy-stuff'], 'webpack-dev-server', ['watch-stuff'], callback); |
| 135 | }); |
| 136 | |
| 137 | // Production build |
| 138 | gulp.task('build', callback => { |
| 139 | defineTasks('prod'); |
| 140 | return runSequence('clean', ['copy-stuff', 'i18n'], 'prod', ['compress-war', 'compress-heat-war'], callback); |
| 141 | }); |
| 142 | |
| 143 | gulp.task('default', ['dev']); |
| 144 | |
| 145 | gulp.task('prod', () => { |
| 146 | |
| 147 | // configure webpack for production |
| 148 | let webpackProductionConfig = Object.create(webpackConfig); |
| 149 | |
| 150 | for (let name in webpackProductionConfig.entry) { |
| 151 | webpackProductionConfig.entry[name] = webpackProductionConfig.entry[name].filter(path => !path.startsWith('webpack')); |
| 152 | } |
| 153 | |
| 154 | webpackProductionConfig.cache = true; |
| 155 | webpackProductionConfig.output = { |
| 156 | path: path.join(__dirname, 'dist/prod'), |
| 157 | publicPath: '/onboarding/', |
| 158 | filename: '[name].js' |
| 159 | }; |
| 160 | webpackProductionConfig.resolveLoader = { |
| 161 | root: [path.resolve('.')], |
| 162 | alias: { |
| 163 | 'config-json-loader': 'tools/webpack/config-json-loader/index.js' |
| 164 | } |
| 165 | }; |
| 166 | |
| 167 | // remove source maps |
| 168 | webpackProductionConfig.devtool = undefined; |
| 169 | webpackProductionConfig.module.preLoaders = webpackProductionConfig.module.preLoaders.filter(preLoader => preLoader.loader != 'source-map-loader'); |
| 170 | webpackProductionConfig.module.loaders.forEach(loader => { |
| 171 | if (loader.loaders && loader.loaders[0] === 'style') { |
| 172 | loader.loaders = loader.loaders.map(loaderName => loaderName.replace('?sourceMap', '')); |
| 173 | } |
| 174 | }); |
| 175 | |
| 176 | webpackProductionConfig.module.loaders.push({test: /config.json$/, loaders: ['config-json-loader']}); |
| 177 | webpackProductionConfig.eslint = { |
| 178 | configFile: './.eslintrc', |
| 179 | failOnError: true |
| 180 | }; |
| 181 | webpackProductionConfig.babel = {//TODO: remove this when UglifyJS will support user or |
| 182 | // Webpack 2.0 |
| 183 | presets: ['es2015', 'stage-0', 'react'] |
| 184 | } |
| 185 | webpackProductionConfig.plugins = [ |
| 186 | new webpack.DefinePlugin({ |
| 187 | 'process.env': { |
| 188 | // This has effect on the react lib size |
| 189 | 'NODE_ENV': JSON.stringify('production') |
| 190 | }, |
| 191 | DEBUG: false, |
| 192 | DEV: false |
| 193 | }), |
| 194 | new webpack.optimize.DedupePlugin(), |
| 195 | new webpack.optimize.UglifyJsPlugin() |
| 196 | ]; |
| 197 | |
| 198 | // run production build |
| 199 | return prodTask({ |
| 200 | webpackProductionConfig, |
| 201 | outDir: 'dist/prod' |
| 202 | }) |
| 203 | .then(() => { |
| 204 | }) |
| 205 | .catch(err => { |
| 206 | if (err && err.stack) { |
| 207 | console.error(err, err.stack); |
| 208 | } |
| 209 | throw new Error('Webpack build FAILED'); |
| 210 | }); |
| 211 | }); |
| 212 | |
| 213 | gulp.task('webpack-dev-server', () => { |
| 214 | // modify some webpack config options for development |
| 215 | let myConfig = Object.create(webpackConfig); |
| 216 | |
| 217 | myConfig.devServer.setup = server => { |
| 218 | let fixture = require('./fixture/fixture'); |
| 219 | let proxy = require('http-proxy-middleware'); |
| 220 | let proxyConfigDefaults = { |
| 221 | changeOrigin: true, |
| 222 | secure: false, |
| 223 | onProxyRes: (proxyRes, req, res) => { |
| 224 | let setCookie = proxyRes.headers['set-cookie']; |
| 225 | if (setCookie) { |
| 226 | setCookie[0] = setCookie[0].replace(/\bSecure\b(; )?/, ''); |
| 227 | } |
| 228 | } |
| 229 | }; |
| 230 | |
| 231 | let middlewares = [ |
| 232 | (req, res, next) => { |
| 233 | let match = req.url.match(/^(.*)_en.js$/); |
| 234 | let newUrl = match && match[1] + '.js'; |
| 235 | if (newUrl) { |
| 236 | console.log(`REWRITING URL: ${req.url} -> ${newUrl}`); |
| 237 | req.url = newUrl; |
| 238 | } |
| 239 | next(); |
| 240 | }, |
| 241 | fixture({ |
| 242 | enabled: devConfig.useFixture |
| 243 | }) |
| 244 | ]; |
| 245 | |
| 246 | // standalon back-end (proxyTarget) has higher priority, so it should be first |
| 247 | if (devConfig.proxyTarget) { |
| 248 | middlewares.push( |
| 249 | proxy(['/api', '/onboarding-api', '/sdc1/feProxy/onboarding-api'], Object.assign({}, proxyConfigDefaults, { |
| 250 | target: devConfig.proxyTarget, |
| 251 | pathRewrite: { |
| 252 | '/sdc1/feProxy/onboarding-api': '/onboarding-api' |
| 253 | } |
| 254 | })) |
| 255 | ) |
| 256 | } |
| 257 | |
| 258 | // Ecorp environment (proxyATTTarget) has lower priority, so it should be second |
| 259 | if (devConfig.proxyATTTarget) { |
| 260 | middlewares.push( |
| 261 | proxy(['/sdc1', '/onboarding-api'], Object.assign({}, proxyConfigDefaults, { |
| 262 | target: devConfig.proxyATTTarget, |
| 263 | pathRewrite: { |
| 264 | // Workaround for some weird proxy issue |
| 265 | '/sdc1/feProxy/onboarding-api': '/sdc1/feProxy/onboarding-api', |
| 266 | '/onboarding-api': '/sdc1/feProxy/onboarding-api' |
| 267 | } |
| 268 | })) |
| 269 | ) |
| 270 | } |
| 271 | server.use(middlewares); |
| 272 | }; |
| 273 | |
| 274 | // Start a webpack-dev-server |
| 275 | let server = new WebpackDevServer(webpack(myConfig), myConfig.devServer); |
| 276 | server.listen(myConfig.devServer.port, '0.0.0.0', err => { |
| 277 | if (err) { |
| 278 | throw new Error('webpack-dev-server' + err); |
| 279 | } |
| 280 | }); |
| 281 | }); |
| 282 | |
| 283 | |
| 284 | gulp.task('gulp-css-usage', callback => { |
| 285 | return gulp.src('src/**/*.jsx').pipe(gulpCssUsage({css: 'dist/dev/css/style.css', babylon: ['objectRestSpread']})); |
| 286 | }); |
| 287 | |
| 288 | gulp.task('css-usage', callback => { |
| 289 | defineTasks('dev'); |
| 290 | runSequence('sass', 'gulp-css-usage'); |
| 291 | }); |
| 292 | |