Initial commit
This commit is contained in:
237
resources/_keenthemes/tools/gulp/compile.js
Normal file
237
resources/_keenthemes/tools/gulp/compile.js
Normal file
@ -0,0 +1,237 @@
|
||||
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,
|
||||
};
|
Reference in New Issue
Block a user