file-management-system/resources/_keenthemes/tools/gulp/compile.js

238 lines
8.0 KiB
JavaScript

import gulp from "gulp";
import rename from "gulp-rename";
import rtlcss from "gulp-rtlcss";
import sass from "gulp-dart-sass";
import merge from "merge-stream";
import _ from "lodash";
import {build as buildMaster} from "./build.js";
import {argv, getDemo, getTheme, objectWalkRecursive, dotPath, pathOnly, outputFunc, bundle, getFolders} from "./helpers.js";
import {cleanTask} from "./clean.js";
import fs from "fs";
import * as pathDir from 'path';
import {fileURLToPath} from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = pathDir.dirname(__filename);
// merge with default parameters
const args = Object.assign(
{
prod: false,
sourcemap: false,
rtl: "",
exclude: "",
theme: "",
path: "",
angular: false,
react: false,
vue: false,
suffix: false,
},
argv
);
var build = buildMaster;
const demo = getDemo();
let theme = '';
const tasks = [];
// merge gulp.config.json in release version
if (fs.existsSync(`${__dirname}/../gulp.config.json`)) {
var c = fs.readFileSync(`${__dirname}/../gulp.config.json`, 'utf8');
build = _.merge(build, JSON.parse(c));
} else {
// set theme
theme = getTheme();
// merge config for theme which have demo levels
const themeConfPath = `./../../../../themes/${theme}/html/tools/gulp.config.json`;
if (fs.existsSync(`${__dirname}/${themeConfPath}`)) {
var c = fs.readFileSync(`${__dirname}/${themeConfPath}`, 'utf8');
build = _.merge(build, JSON.parse(c));
}
// merge config for demo levels
const demoConfPath = `./../../../../themes/${theme}/html/${demo}/gulp.config.json`;
if (fs.existsSync(`${__dirname}/${demoConfPath}`)) {
var c = fs.readFileSync(`${__dirname}/${demoConfPath}`, 'utf8');
build = _.extend(build, JSON.parse(c));
}
}
// docs build option
let docsOption = Object.keys(argv).find((value) => {
return value.indexOf('docs-') !== -1;
});
if (typeof docsOption !== 'undefined') {
var l = docsOption.split('-');
theme = l[1];
if (theme === 'asp') {
theme += '.net-core'
}
build.config.path.src = '../../../themes/docs/{theme}/src';
build.config.dist = ['../../../themes/docs/{theme}/dist/assets'];
}
// set dist to demo folder
const dist = [];
build.config.dist.forEach((d) => {
dist.push(d.replace("{demo}", demo).replace("{theme}", theme));
});
build.config.dist = dist;
const path = {};
for (let key in build.config.path) {
if (!build.config.path.hasOwnProperty(key)) {
continue;
}
path[key] = build.config.path[key]
.replace("{demo}", demo)
.replace("{theme}", theme);
}
build.config.path = path;
if (args.prod !== false) {
// force disable debug for production
build.config.debug = false;
// force assets minification for production
build.config.compile.jsMinify = true;
build.config.compile.cssMinify = true;
}
if (args.sourcemap !== false) {
// force assets sourcemap
// build.config.compile.jsSourcemaps = true;
// build.config.compile.cssSourcemaps = true;
}
if (args.rtl) {
build.config.compile.rtl.enabled = true;
}
const rtlTask = (cb) => {
const streams = [];
let stream = null;
objectWalkRecursive(
build.build,
(val, key, userdata) => {
if (val.hasOwnProperty("src") && val.hasOwnProperty("dist")) {
if (["custom", "media", "api", "misc"].indexOf(key) !== -1) {
if (userdata.indexOf(key) === -1 && typeof val.styles !== "undefined") {
// rtl conversion in each plugins
for (let i in val.styles) {
if (!val.styles.hasOwnProperty(i)) {
continue;
}
const toRtlFile = dotPath(val.styles[i]);
// exclude scss file for now
if (toRtlFile.indexOf(".scss") === -1 && !/\*/.test(toRtlFile)) {
stream = gulp.src(toRtlFile, {allowEmpty: true})
.pipe(rtlcss())
.pipe(rename({suffix: ".rtl"}))
.pipe(gulp.dest(pathOnly(toRtlFile)));
streams.push(stream);
// convert rtl for minified
if (!/\.min\./i.test(toRtlFile)) {
stream = gulp.src(toRtlFile, {allowEmpty: true})
.pipe(
sass({outputStyle: "compressed"}).on("error", sass.logError)
)
.pipe(rename({suffix: args.suffix ? ".min.rtl" : ".rtl"}))
.pipe(gulp.dest(pathOnly(toRtlFile)));
streams.push(stream);
}
}
}
}
}
}
},
build.config.compile.rtl.skip
);
cb();
return merge(streams);
};
// task to bundle js/css
let buildBundleTask = (cb) => {
var streams = [];
objectWalkRecursive(build.build, function (val, key) {
if (val.hasOwnProperty("src") && val.hasOwnProperty("dist")) {
if (["custom", "media", "api", "misc"].indexOf(key) !== -1) {
outputFunc(val);
} else {
streams = bundle(val);
}
}
});
cb();
return merge(streams);
};
// don't clean assets if compile only 1 type
if (!args.sass && !args.js && !args.media) {
tasks.push(cleanTask);
}
if (typeof build.config.compile.rtl !== "undefined" && build.config.compile.rtl.enabled) {
tasks.push(rtlTask);
}
tasks.push(buildBundleTask);
if (args.presets && fs.existsSync(build.config.path.src + '/sass/presets')) {
const presets = fs.readdirSync(build.config.path.src + '/sass/presets');
objectWalkRecursive(build.build, function (val, key) {
if (val.hasOwnProperty("src") && val.hasOwnProperty("dist")) {
if (["custom", "media", "api", "misc"].indexOf(key) !== -1) {
} else {
// build for presets
if (typeof val.src.styles !== 'undefined') {
if (val.src.styles[0].indexOf('style.scss') !== -1) {
presets.forEach(preset => {
let buildStylePresetTask = (cb) => {
val.src.styles[0] = '{$config.path.src}/sass/presets/' + preset + '/style.scss';
val.dist.styles = '{$config.dist}/css/style.' + preset + '.bundle.css';
bundle(val);
cb();
};
tasks.push(buildStylePresetTask);
});
}
}
if (typeof val.src.override !== 'undefined' && val.src.override.styles[0].indexOf('plugins.scss') !== -1) {
presets.forEach(preset => {
let buildPluginPresetTask = (cb) => {
val.src.styles.forEach((file, i) => {
if (file.indexOf('plugins.scss') !== -1) {
val.src.styles[i] = '{$config.path.src}/sass/presets/' + preset + '/plugins.scss';
val.dist.styles = '{$config.dist}/plugins/global/plugins.' + preset + '.bundle.css';
bundle(val);
cb();
}
});
};
tasks.push(buildPluginPresetTask);
});
}
}
}
}, build.build);
}
// entry point
const compileTask = gulp.series(...tasks);
// Exports
export {
compileTask,
};