UNPKG

3.24 kBJavaScriptView Raw
1"use strict";
2
3/**
4 * Please use Node 7.0.0+ to run this script
5 */
6
7var gulp = require('gulp');
8var browserSync = require('browser-sync').create();
9var common = require('./common');
10var _ = require('lodash');
11var glob = require('glob');
12var utils = require('../utils');
13var fs = require('fs');
14var argv = require('optimist').argv;
15var is = require('is_js');
16
17function loadAppConfig(pkg, pkgRootDir, serveStaticMap, watchedFiles) {
18 if (pkg.routes) {
19 _.each(pkg.routes, routeItem => {
20 let route, routeDir;
21 if (is.array(routeItem)) {
22 [route, routeDir] = routeItem;
23 } else {
24 route = routeItem;
25 routeDir = 'build'
26 }
27 if (!route.startsWith('/')) route = '/web/' + route;
28 serveStaticMap[route] = serveStaticMap[route] || [];
29
30 //serve css directly from app' build folder - this makes CSS injection work and persist on browser reload
31 let path = '../' + pkgRootDir + '/' + routeDir;
32 serveStaticMap[route].push(path);
33 console.log(pkgRootDir + ' adds route:', `${route} => ${path}`);
34 });
35 }
36
37 if (pkg.watchedFiles) {
38 _.flatten([pkg.watchedFiles]).forEach(path => {
39 path = '../' + pkgRootDir + '/' + path;
40 console.log(pkgRootDir + ' adds watched path:', path);
41 watchedFiles.push(path);
42 });
43 }
44}
45
46let loadJsonConfig = function (fileName, filePath) {
47 let cfg;
48 fileName = filePath + '/' + fileName;
49 if (utils.exists(fileName)) {
50 try {
51 cfg = JSON.parse(fs.readFileSync(fileName, 'utf8'));
52 } catch (e) {
53 console.error('Failed parsing config file' + fileName + ':', e);
54 }
55 }
56 return cfg;
57};
58
59function loadApps(rootDir, config) {
60 let serveStaticMap = {};
61 let watchedFiles = [];
62
63 glob.sync(rootDir + '/*/').forEach(filePath => {
64 filePath = filePath.substring(0, filePath.length - 1);
65 let pkg = loadJsonConfig('package.json', filePath);
66 if (!pkg) return;
67 let pkgDir = filePath.split('/');
68 pkgDir = pkgDir[pkgDir.length - 1];
69 if (pkg.plugin && pkgDir !== argv.plugin) {
70 console.log(`ignoring plugin ${pkgDir} because it's not the requested one`);
71 return
72 }
73 let cfg = loadJsonConfig('portal-browser-sync.json', filePath);
74 if (cfg) loadAppConfig(cfg, pkgDir, serveStaticMap, watchedFiles);
75 });
76
77 let serveStatic = [];
78
79 _.forEach(serveStaticMap, (value, key) => {
80 serveStatic.push({route: key, dir: value});
81 });
82
83 config.files = watchedFiles;
84 config.serveStatic = serveStatic;
85}
86
87gulp.task('browsersync', () => {
88 let toProxy = (argv['proxied-host'] || 'localhost');
89 if (!toProxy.startsWith('https')) {
90 toProxy = toProxy + ':' + (argv['proxied-port'] || 8080);
91 }
92
93 let config = {
94 proxy: toProxy,
95 startPath: "/web/portal",
96 open: 'external',
97 ghostMode: false,
98 reloadDebounce: 500
99 };
100
101 if (argv.tunnel) config.tunnel = argv.tunnel;
102 if (common.port) config.port = common.port;
103
104 loadApps('..', config);
105
106 browserSync.init(config);
107});