hawtio-console-assembly/gulpfile.js (244 lines of code) (raw):
const gulp = require('gulp');
const eventStream = require('event-stream');
const gulpLoadPlugins = require('gulp-load-plugins');
const map = require('vinyl-map');
const fs = require('fs');
const path = require('path');
const sequence = require('run-sequence');
const size = require('gulp-size');
const uri = require('urijs');
const s = require('underscore.string');
const argv = require('yargs').argv;
const logger = require('js-logger');
const hawtio = require('@hawtio/node-backend');
const tslint = require('gulp-tslint');
const tslintRules = require('./tslint.json');
const exec = require('child_process').exec;
const usemin = require('gulp-usemin');
const uglify = require('gulp-uglify');
const cleanCss = require('gulp-clean-css');
const rev = require('gulp-rev');
const preprocess = require("gulp-preprocess");
const plugins = gulpLoadPlugins({});
const config = {
proxyPort: argv.port || 8181,
targetPath: argv.path || '/hawtio/jolokia',
logLevel: argv.debug ? logger.DEBUG : logger.INFO,
keycloak: argv.keycloak ? 'true' : 'false',
app: 'app/',
src: 'app/src/',
srcLess: 'app/src/**/*.less',
srcTemplates: 'app/src/**/!(index|login).html',
docTemplates: '../@(CHANGES|FAQ).md',
templateModule: 'hawtio-console-assembly-templates',
temp: 'temp/',
dist: 'dist/',
distFonts: 'dist/fonts',
distImg: 'dist/img',
js: 'hawtio-console-assembly.js',
css: 'hawtio-console-assembly.css',
tsProject: plugins.typescript.createProject('tsconfig.json'),
tsLintOptions: {
rulesDirectory: './tslint-rules/'
},
sourceMap: argv.sourcemap
};
var normalSizeOptions = {
showFiles: true
}, gZippedSizeOptions = {
showFiles: true,
gzip: true
};
//------------------------------------------------------------------------------
// build tasks
//------------------------------------------------------------------------------
gulp.task('clean', function () {
return gulp.src(['dist', 'temp'], { read: false })
.pipe(plugins.clean());
});
gulp.task('tsc', function () {
return config.tsProject.src()
.pipe(plugins.debug({ title: 'tsc' }))
.pipe(plugins.if(config.sourceMap, plugins.sourcemaps.init()))
.pipe(config.tsProject())
.js
.pipe(plugins.ngAnnotate())
.pipe(plugins.debug({ title: 'tsc js' }))
.pipe(plugins.if(config.sourceMap, plugins.sourcemaps.write()))
.pipe(gulp.dest(config.temp));
});
gulp.task('template', function () {
return gulp.src(config.srcTemplates)
.pipe(plugins.debug({ title: 'template' }))
.pipe(plugins.angularTemplatecache({
filename: 'templates.js',
root: config.src,
standalone: true,
module: config.templateModule,
templateFooter: '}]); hawtioPluginLoader.addModule("' + config.templateModule + '");'
}))
.pipe(gulp.dest(config.temp));
});
gulp.task('template-docs', function () {
return gulp.src(config.docTemplates)
.pipe(plugins.angularTemplatecache({
filename: 'doc-templates.js',
root: 'plugins/help/doc',
standalone: true,
module: config.templateModule,
templateFooter: '}]); hawtioPluginLoader.addModule("' + config.templateModule + '");'
}))
.pipe(gulp.dest(config.temp));
});
gulp.task('concat', function () {
var gZipSize = size(gZippedSizeOptions);
var license = tslintRules.rules['license-header'][1];
return gulp.src(config.temp + '*.js')
.pipe(plugins.concat(config.js))
.pipe(plugins.header(license))
.pipe(size(normalSizeOptions))
.pipe(gZipSize)
.pipe(gulp.dest(config.temp));
});
gulp.task('less', function () {
return gulp.src(config.srcLess)
.pipe(plugins.less())
.pipe(plugins.concat(config.css))
.pipe(gulp.dest(config.temp));
});
gulp.task('usemin', function () {
return gulp.src(config.src + '@(index|login).html')
.pipe(preprocess())
.pipe(usemin({
libCss: [cleanCss, rev],
appCss: [() => cleanCss({ rebaseTo: 'css/css' }), rev],
libJs: [uglify, rev],
appJs: [uglify, rev],
jsAttributes: { defer: true }
}))
.pipe(plugins.debug({ title: 'usemin' }))
.pipe(gulp.dest(config.dist));
});
gulp.task('install-dependencies', function (cb) {
exec(`cd ${config.app} && yarn install --prod --flat --frozen-lockfile && cd ..`, function (error, stdout, stderr) {
if (error) {
console.log(stderr);
}
cb(error);
});
});
gulp.task('copy-fonts', function () {
return gulp.src('app/node_modules/patternfly/dist/fonts/*')
.pipe(plugins.debug({ title: 'copy-fonts' }))
.pipe(gulp.dest(config.distFonts));
});
gulp.task('copy-images', function () {
var hawtioDependencies = config.app + 'node_modules/@hawtio';
var dirs = fs.readdirSync(hawtioDependencies);
var patterns = [];
dirs.forEach(function (dir) {
var path = hawtioDependencies + '/' + dir + '/dist/img';
try {
if (fs.statSync(path).isDirectory()) {
console.log('found image dir: ', path);
var pattern = hawtioDependencies + '/' + dir + '/dist/img/**/*';
patterns.push(pattern);
}
} catch (e) {
// ignore, file does not exist
}
});
// Add PatternFly images package in dist
patterns.push(config.app + 'node_modules/patternfly/dist/img/**/*');
// Add Hawtio Console Assembly images
patterns.push(config.app + 'src/img/**/*');
// Copy images
return gulp.src(patterns)
.pipe(plugins.debug({ title: 'copy-images' }))
.pipe(gulp.dest(config.distImg));
});
gulp.task('404', function () {
return gulp.src(config.dist + 'index.html')
.pipe(plugins.rename('404.html'))
.pipe(gulp.dest(config.dist));
});
gulp.task('copy-config', function () {
return gulp.src(config.src + '*.json')
.pipe(gulp.dest(config.dist));
});
//------------------------------------------------------------------------------
// serve tasks
//------------------------------------------------------------------------------
gulp.task('connect', function () {
hawtio.setConfig({
logLevel: config.logLevel,
port: 2772,
proxy: '/hawtio/proxy',
staticProxies: [
{
proto: 'http',
port: config.proxyPort,
hostname: 'localhost',
path: '/hawtio/jolokia',
targetPath: config.targetPath
}
],
staticAssets: [{
path: '/hawtio/',
dir: './dist/'
}],
fallback: './dist/index.html',
liveReload: {
enabled: true
}
});
hawtio.use('/', (req, res, next) => {
if (!s.startsWith(req.originalUrl, '/hawtio/')
|| s.startsWith(req.originalUrl, '/hawtio/jvm/')
|| s.startsWith(req.originalUrl, '/hawtio/help')
|| s.startsWith(req.originalUrl, '/hawtio/preferences')) {
res.redirect('/hawtio/');
} else {
next();
}
});
hawtio.use('/hawtio/refresh', (req, res, next) => {
res.set('Content-Type', 'text/html;charset=UTF-8');
res.send('ok');
});
// used for hawtio-login
hawtio.use('/hawtio/auth/login', (req, res, next) => {
// login always succeeds
res.set('Content-Type', 'application/json');
res.send('{}');
});
// used for hawtio-login
hawtio.use('/hawtio/auth/logout', (req, res, next) => {
res.redirect('/hawtio/login.html');
});
// used for hawtio-login
hawtio.use('/hawtio/user', (req, res, next) => {
// login always succeeds
res.set('Content-Type', 'application/json');
res.send('"public"');
});
// used for hawtio-login
hawtio.use('/hawtio/keycloak/enabled', (req, res, next) => {
res.set('Content-Type', 'application/json');
res.send(config.keycloak);
});
// used for hawtio-login
hawtio.use('/hawtio/keycloak/client-config', (req, res, next) => {
res.set('Content-Type', 'application/json');
res.send(`
{
"clientId": "hawtio-client",
"url": "http://localhost:18080/auth",
"realm": "hawtio-demo"
}
`);
});
// used for hawtio-login
hawtio.use('/hawtio/keycloak/validate-subject-matches', (req, res, next) => {
res.set('Content-Type', 'application/json');
res.send('true');
});
hawtio.listen(function (server) {
var host = server.address().address;
var port = server.address().port;
console.log("started from gulp file at", host, ":", port);
});
});
gulp.task('watch', function () {
gulp.watch(config.src + '**/*', ['build']);
gulp.watch(config.dist + '*', ['reload']);
});
gulp.task('reload', function () {
gulp.src('dist/@(index|login).html')
.pipe(hawtio.reload());
});
//------------------------------------------------------------------------------
// main tasks
//------------------------------------------------------------------------------
gulp.task('build', callback => sequence('clean', 'tsc', 'template', 'template-docs', 'concat', 'less',
'install-dependencies', 'usemin', 'copy-fonts', 'copy-images', '404', 'copy-config', callback));
gulp.task('default', callback => sequence('build', ['connect', 'watch']));