var gulp = require('gulp'); var gutil = require('gulp-util'); var wrap = require('gulp-wrap'); var concat = require('gulp-concat'); var merge = require('merge-stream'); var extend = require('gulp-extend'); var del = require('del'); var fs = require('fs'); var webpack = require('webpack'); var WebpackDevServer = require('webpack-dev-server'); var services = require("./gulpfiles/services.json"); // Configuration var srcDir = './client'; var buildDir = './services/nginx/static'; var langs = ['es', 'en']; var modules = require('./spliting/modules.json'); var webpackConfig = require('./webpack.config.js'); // Main tasks gulp.task('default', function() { return gulp.start('services', 'client'); }); gulp.task('build', ['clean'], function() { return gulp.start('routes', 'locales', 'webpack'); }); gulp.task('client', ['clean'], function() { return gulp.start('watch', 'routes', 'locales', 'webpack-dev-server'); }); gulp.task('copy', function() { var streams = []; for (i = 0; i < services.services.length; i++) { var service = services.services[i]; for (j = 0; j < services.files.length; j++) { var file = services.files[j]; streams.push(gulp.src("./services/service/models/" + file) .pipe(gulp.dest(service + "/common/models/"))); } } return merge(streams); }); gulp.task('services', ['copy'], function() { require('./services/auth/server/server.js').start(); require('./services/salix/server/server.js').start(); require('./services/mailer/server.js').start(); for (i = 0; i < services.services.length; i++) { require(services.services[i] + "/server/server.js").start(); } }); gulp.task('clean', function() { return del([`${buildDir}/*`, `!${buildDir}/templates`, `!${buildDir}/images`], {force: true}); }); // Spliting var splitingFiles = './spliting/*'; gulp.task('spliting', function(cb) { var importTpl = fs.readFileSync('./spliting/import.tpl.js', 'utf8'); var requireTpl = fs.readFileSync('./spliting/require.tpl.js', 'utf8'); for (var modName in modules) { var deps = modules[modName]; var splitFile = `${srcDir}/${modName}/src/spliting.js`; try { fs.unlinkSync(splitFile); } catch (e) {} fs.appendFileSync(splitFile, importTpl); var i = deps.length; while (i--) fs.appendFileSync(splitFile, requireTpl.replace(/\$module/g, deps[i])); } cb(); }); // Webpack gulp.task('webpack', ['spliting'], function(cb) { var configCopy = Object.create(webpackConfig); var compiler = webpack(configCopy); compiler.run(function(err, stats) { if (err) throw new gutil.PluginError('webpack', err); gutil.log('[webpack]', stats.toString({colors: true})); cb(); }); }); gulp.task('webpack-dev-server', ['spliting'], function() { var configCopy = Object.create(webpackConfig); for (var entry in configCopy.entry) { configCopy.entry[entry] .unshift('webpack-dev-server/client?http://127.0.0.1:8081/'); } var compiler = webpack(configCopy); new WebpackDevServer(compiler, { publicPath: '/', contentBase: buildDir, quiet: false, noInfo: false, // hot: true, stats: { assets: true, colors: true, version: false, hash: false, timings: true, chunks: false, chunkModules: false } }).listen(8081, '127.0.0.1', function(err) { if (err) throw new gutil.PluginError('webpack-dev-server', err); }); }); // Locale var localeFiles = `${srcDir}/**/locale/*.json`; gulp.task('locales', function() { var streams = []; for (var mod in modules) for (var lang of langs) { var localeFiles = `./client/${mod}/**/locale/${lang}.json`; streams.push(gulp.src(localeFiles) .pipe(extend(`${lang}.json`)) .pipe(gulp.dest(`${buildDir}/locale/${mod}`))); } return merge(streams); }); // Routes var routeFiles = `${srcDir}/**/routes.json`; gulp.task('routes', function() { return gulp.src(routeFiles) .pipe(concat('routes.js', {newLine: ','})) .pipe(wrap('var routes = [<%=contents%>\n];')) .pipe(gulp.dest(buildDir)); }); // Watch gulp.task('watch', function() { gulp.watch(splitingFiles, ['spliting']); gulp.watch(routeFiles, ['routes']); gulp.watch(localeFiles, ['locales']); });