dashboard/resources/build/compile.js

449 lines
13 KiB
JavaScript

'use strict';
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var rewrite = require('gulp-rewrite-css');
var concat = require('gulp-concat');
var lazypipe = require('lazypipe');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');
var cleancss = require('gulp-clean-css');
var sourcemaps = require('gulp-sourcemaps');
var path = require('path');
var gutil = require('gulp-util');
var autoprefixer = require('gulp-autoprefixer');
var prettify = require('gulp-prettify');
var fs = require('fs');
var build = require('./build');
var args = Object.assign({
'prod': false
}, gutil.env);
if (args['prod'] !== false) {
build.config.debug = false;
build.config.compile.jsUglify = true;
build.config.compile.cssMinify = true;
}
module.exports = {
config: Object.assign({}, {
debug: true,
compile: {
jsUglify: false,
cssMinify: false,
jsSourcemaps: true,
cssSourcemaps: true,
autoprefixer: true,
seedOnly: false
},
'path': {
'src': './src',
'node_modules': './node_modules'
},
'dist': {
'theme': {
'path': './dist'
}
}
}, build.config),
objectBuildTree: function (array, funcname, userdata) {
if (!array || typeof array !== 'object') {
return false;
}
if (typeof funcname !== 'function') {
return false;
}
for (var key in array) {
if (Object.prototype.toString.call(array[key]) === '[object Object]') {
var funcArgs = [array[key], funcname];
if (arguments.length > 2) {
funcArgs.push(userdata);
}
if (module.exports.objectBuildTree.apply(null, funcArgs) === false) {
return false;
}
}
try {
if (arguments.length > 2) {
funcname(array[key], key, userdata);
} else {
funcname(array[key], key);
}
} catch (e) {
return false;
}
}
return true;
},
jsOutput: function () {
var config = this.config.compile;
return lazypipe()
.pipe(function () {
return gulpif(config.jsSourcemaps, sourcemaps.init({
loadMaps: true,
debug: config.debug
}));
})
.pipe(function () {
return gulpif(config.jsUglify, uglify());
})
.pipe(function () {
return gulpif(config.jsSourcemaps, sourcemaps.write('./'));
});
},
cssOutput: function () {
var config = this.config.compile;
return lazypipe()
/* .pipe(function () {
return gulpif(config.cssSourcemaps, sourcemaps.init({loadMaps: true, debug: config.debug}));
}) */
.pipe(function () {
return gulpif(config.cssMinify, cleancss({
debug: config.debug
}));
})
.pipe(function () {
return gulpif(config.autoprefixer, autoprefixer({
browsers: ['last 2 versions']
}));
})
.pipe(function () {
return gulpif(config.cssSourcemaps, sourcemaps.write('./'));
});
},
outputStream: function (path, outputFile) {
if (typeof outputFile === 'undefined') outputFile = '';
var piping = lazypipe();
var outputPaths = [];
var regex = new RegExp(/\{\$.*?\}/);
var matched = path.match(regex);
if (matched) {
for (var app in build.config.dist) {
if (!build.config.dist.hasOwnProperty(app)) continue;
var output = build.config.dist[app].path;
outputPaths.push(path.replace(matched[0], output).replace(outputFile, ''));
}
}
outputPaths.forEach(function (output) {
(function (_output) {
piping = piping.pipe(function () {
return gulp.dest(_output);
});
})(output);
});
return piping;
},
streamPath: function (path) {
var regex = new RegExp(/\{\$(.*?)\}/);
var dot = function (obj, i) {
return obj[i];
};
var matched = path.match(regex);
if (matched) {
var realpath = matched[1].split('.').reduce(dot, build);
path = path.replace(matched[0], realpath);
return path;
}
return path;
},
streamPaths: function (paths) {
paths.forEach(function (path, i) {
paths[i] = module.exports.streamPath(path);
});
},
cssRewritePaths: function (folder) {
var imgRegex = new RegExp(/\.(gif|jpg|jpeg|tiff|png|ico)$/i);
//var fontRegex = new RegExp(/\.(otf|eot|svg|ttf|woff|woff2)$/i);
var config = this.config;
return lazypipe().pipe(function () {
// rewrite css relative path
return rewrite({
destination: folder,
debug: config.debug,
adaptPath: function (ctx) {
var isCss = ctx.sourceFile.match(/\.[css]+$/i);
// process css only
if (isCss[0] === '.css') {
var pieces = ctx.sourceDir.split('\\');
var vendor = pieces[pieces.indexOf('node_modules') + 1];
if (pieces.indexOf('node_modules') === -1) {
vendor = pieces[pieces.indexOf('vendors') + 1];
}
var file = module.exports.baseName(ctx.targetFile);
var extension = 'webfonts/';
if (imgRegex.test(file)) {
extension = 'img/';
}
return path.join(extension, file);
}
}
});
});
},
baseName: function (path) {
var maybeFile = path.split('/').pop();
if (maybeFile.indexOf('.') !== -1) {
return maybeFile;
}
return '';
},
bundle: function (bundle) {
var _self = this;
var tasks = [];
if (typeof bundle.src !== 'undefined' && typeof bundle.bundle !== 'undefined') {
// images and fonts for vendor
if ('required' in bundle.src && 'optional' in bundle.src) {
var vendors = {};
for (var key in bundle.src) {
if (!bundle.src.hasOwnProperty(key)) continue;
vendors = Object.assign(vendors, bundle.src[key]);
}
for (var vendor in vendors) {
if (!vendors.hasOwnProperty(vendor)) continue;
var vendorObj = vendors[vendor];
for (var type in vendorObj) {
if (!vendorObj.hasOwnProperty(type)) continue;
_self.streamPaths(vendorObj[type]);
switch (type) {
case 'fonts':
gulp.src(vendorObj[type])
.pipe(_self.outputStream(bundle.bundle.fonts)());
break;
case 'images':
gulp.src(vendorObj[type])
.pipe(_self.outputStream(bundle.bundle.images)());
break;
case 'json':
gulp.src(vendorObj[type])
.pipe(_self.outputStream(bundle.bundle.json)());
break;
case 'media':
gulp.src(vendorObj[type])
.pipe(_self.outputStream(bundle.bundle.media)());
break;
}
}
}
}
if (!('styles' in bundle.src) && !('scripts' in bundle.src)) {
var src = {
styles: [],
scripts: []
};
_self.objectBuildTree(bundle.src, function (paths, type) {
switch (type) {
case 'styles':
case 'scripts':
src[type] = src[type].concat(paths);
break;
}
});
bundle.src = src;
}
for (var type in bundle.src) {
if (!bundle.src.hasOwnProperty(type)) continue;
if (Object.prototype.toString.call(bundle.src[type]) !== '[object Array]') continue;
if (typeof bundle.bundle[type] === 'undefined') continue;
_self.streamPaths(bundle.src[type]);
var outputFile = _self.baseName(bundle.bundle[type]);
switch (type) {
case 'styles':
gulp.src(bundle.src[type])
.pipe(_self.cssRewritePaths(bundle.bundle[type])())
.pipe(concat(outputFile))
.pipe(sourcemaps.init())
.pipe(sassGlob())
.pipe(sass({
errLogToConsole: true
}).on('error', sass.logError))
.pipe(_self.cssOutput()())
.pipe(_self.outputStream(bundle.bundle[type], outputFile)());
break;
case 'scripts':
return gulp.src(bundle.src[type])
.pipe(concat(outputFile))
.pipe(_self.jsOutput()())
.pipe(_self.outputStream(bundle.bundle[type], outputFile)());
default:
break;
}
}
}
return tasks;
},
output: function (bundle) {
var _self = this;
if (typeof bundle.src !== 'undefined' && typeof bundle.output !== 'undefined') {
for (var type in bundle.src) {
if (!bundle.src.hasOwnProperty(type)) continue;
_self.streamPaths(bundle.src[type]);
switch (type) {
case 'styles':
gulp.src(bundle.src[type])
.pipe(sassGlob())
.pipe(sass({
errLogToConsole: true
}).on('error', sass.logError))
.pipe(_self.outputStream(bundle.output[type])());
break;
default:
gulp.src(bundle.src[type])
.pipe(_self.outputStream(bundle.output[type])());
break;
}
}
}
},
getDirs: function (dir) {
return fs.readdirSync(dir)
.filter(function (file) {
return fs.statSync(path.join(dir, file)).isDirectory();
});
},
formatOutput: function (_ref) {
var inputPath = _ref.inputPath,
outputPath = _ref.outputPath;
// prettify the generated hbs file
gulp.src(inputPath).pipe(prettify({
indent_handlebars: true,
end_with_newline: true,
max_preserve_newlines: 0,
brace_style: 'expand',
indent_char: ' ',
indent_size: 2
})).pipe(gulp.dest(outputPath, {
overwrite: true
}));
},
fillProperties: function (_ref2) {
var _self = this;
var groups = _ref2.groups,
seedOnly = _ref2.seedOnly,
parent = _ref2.parent,
result = [];
if (groups === undefined) {
return groups;
}
groups.forEach(function (group) {
group.text = group.text || group.title;
group.tags = group.tags || "";
if (parent === undefined) {
group.tags = "".concat( (group.title + " " + group.tags).toLowerCase().replace(/[, ]+/g, " ").trim() );
group.i18n = "nav.".concat(group.title.toLowerCase().split(' ').join('_'));
} else {
group.tags = "".concat(parent.tags, " ").concat( (group.title + " " + group.tags).toLowerCase().replace(/[, ]+/g, " ").trim() );
group.i18n = "".concat(parent.i18n, "_").concat(group.title.toLowerCase().split(' ').join('_'));
}
group.showOnSeed = group.showOnSeed === undefined ? true : group.showOnSeed;
group.items = _self.fillProperties({
groups: group.items,
seedOnly: seedOnly,
parent: group
});
if (!seedOnly || group.showOnSeed) {
result.push(group);
}
});
return result;
},
writeNavigation: function(menu, filePath) {
var lines = [];
lines.push('<ul id="js-nav-menu" class="nav-menu">');
menu.forEach(function (group) {
if (group.items) {
var groups = group.items.map(function (_ref3) {
var href = _ref3.href;
return path.parse(href).name;
}).filter(function (e) {
return e !== "javascript:void(0);";
});
group.items.forEach(function (item) {
var result = item.items && item.items.map(function (_ref4) {
var href = _ref4.href;
return path.parse(href).name;
}).filter(function (e) {
return e !== "javascript:void(0);";
});
if (result) {
groups = groups.concat(result);
}
});
lines.push("<li {{#is pagename \"in\" \"".concat(groups, "\"}}class=\"active open\"{{/is}}>"));
lines.push("<a href=\"#\" title=\"".concat(group.title, "\" data-filter-tags=\"").concat(group.tags, "\">"));
lines.push("<i class=\"".concat(group.icon, "\"></i>"));
lines.push("<span class=\"nav-link-text\" data-i18n=\"".concat(group.i18n, "\">").concat(group.text, "</span>"));
if (group.span) {
group.span.class = group.span.class || "";
lines.push("<span class=\"".concat(group.span.class, "\">").concat(group.span.text, "</span>"));
}
lines.push('</a>');
lines.push('<ul>');
group.items.forEach(function (item) {
var items = item.items && item.items.map(function (_ref5) {
var href = _ref5.href;
return path.parse(href).name;
}).filter(function (e) {
return e !== "javascript:void(0);";
});
if (item.disabled) {
lines.push("<li class=\"disabled\">");
} else {
if (items) {
lines.push("<li {{#is pagename \"in\" \"".concat(items, "\"}}class=\"active open\"{{/is}}>"));
} else {
lines.push("<li {{#is pagename \"===\" \"".concat(path.parse(item.href).name, "\"}}class=\"active\"{{/is}}>"));
}
}
lines.push("<a href=\"".concat(item.href, "\" title=\"").concat(item.title, "\" data-filter-tags=\"").concat(item.tags, "\">"));
lines.push("<span class=\"nav-link-text\" data-i18n=\"".concat(item.i18n, "\">").concat(item.text, "</span>"));
if (item.span) {
item.span.class = item.span.class || "";
lines.push("<span class=\"".concat(item.span.class, "\">").concat(item.span.text, "</span>"));
}
lines.push('</a>');
if (item.items) {
lines.push('<ul>');
item.items.forEach(function (subItem) {
var childs = subItem.items && subItem.items.map(function (_ref6) {
var href = _ref6.href;
return path.parse(href).name;
}).filter(function (e) {
return e !== "javascript:void(0);";
});
if (subItem.disabled) {
lines.push("<li class=\"disabled\">");
} else {
if (childs) {
lines.push("<li {{#is pagename \"in\" \"".concat(childs, "\"}}class=\"active open\"{{/is}}>"));
} else {
lines.push("<li {{#is pagename \"===\" \"".concat(path.parse(subItem.href).name, "\"}}class=\"active\"{{/is}}>"));
}
}
lines.push("<a href=\"".concat(subItem.href, "\" title=\"").concat(subItem.title, "\" data-filter-tags=\"").concat(subItem.tags, "\">"));
lines.push("<span class=\"nav-link-text\" data-i18n=\"".concat(subItem.i18n, "\">").concat(subItem.text, "</span>"));
lines.push('</a>');
lines.push('</li>');
});
lines.push('</ul>');
}
lines.push('</li>');
});
lines.push('</ul>');
lines.push('</li>');
} else {
lines.push("<li class=\"nav-title\">".concat(group.title, "</li>"));
}
});
lines.push('</ul>');
var dirname = path.dirname(filePath);
if (!fs.existsSync(dirname)) {
fs.mkdirSync(dirname);
}
fs.writeFileSync(filePath, lines.join('\n'));
}
};