Source

src/compiler/gulpfile-compiler.ts

import * as gulp from "gulp";
import ts from "gulp-typescript";
import * as fs from "fs";
import upath from "upath";
import path from "path";
import log from "../compiler/log";
import process from "../compiler/process";
import core from "./core";

const root = process.root;

/**
 * compile and minify assets
 * @param item file full path
 */
export function compileAssets(item: string | Buffer, callback?: Function | any): any {
    const exists = fs.existsSync(item);
    if (exists) {
        item = item.toString();
        let config:
            | string
            | {
                  obfuscate: boolean;
              } = upath.normalizeSafe(root + "/src/MVC/config/" + item.replace(core.root(), ""));
        config = core.normalize(core.root() + config);
        config = config.replace(/\.(js|css)/s, ".json");
        if (fs.existsSync(config)) {
            config = require(config);
        }

        if (item.endsWith(".less") && !item.endsWith(".min.less")) {
            //console.log(`Compiling LESS ${core.filelog(item)}`);
            core.less(item);
        } else if (item.endsWith(".scss") && !item.endsWith(".min.scss")) {
            //console.log(`Compiling SCSS ${core.filelog(item)}`);
            core.scss(item);
        } else if (item.endsWith(".css") && !item.endsWith(".min.css")) {
            //console.log(`Minify CSS ${core.filelog(item)}`);
            core.minCSS(item);
        } else if (item.endsWith(".js") && !item.endsWith(".min.js") && !item.endsWith(".module.js")) {
            if (item.endsWith("browserify.js")) {
                console.log("Compile Browserify");
                // TODO: Compile Browserify
                core.browserify(item);
            } else if (!item.endsWith(".babel.js")) {
                //console.log(`Minify JS ${core.filelog(item)}`);
                core.minJS(item);
                let deleteObfuscated = false;
                if (typeof config == "object") {
                    if (config.hasOwnProperty("obfuscate")) {
                        if (config.obfuscate) {
                            //console.log(`Obfuscating JS ${core.filelog(item)}`);
                            core.obfuscate(item);
                        } else {
                            deleteObfuscated = true;
                        }
                    } else {
                        deleteObfuscated = true;
                    }
                }
                if (deleteObfuscated) {
                    const obfuscatedjs = item.replace(/\.js$/s, ".obfuscated.js");
                    const obfuscatedminjs = item.replace(/\.js$/s, ".obfuscated.min.js");
                    core.unlink(obfuscatedjs);
                    core.unlink(obfuscatedminjs);
                }
            }
        } else if (item.endsWith(".ts") && !item.endsWith(".d.ts")) {
            if (!/libs\/|libs\\/s.test(item)) {
                single_tsCompile(item);
            }
        }
    }
    if (typeof callback == "function") callback();
}

/**
 * Single Typescript Compiler
 * @param target
 * @todo universal-framework typescript compiler support
 */
export function single_tsCompile(target: string) {
    const targetlog = log.chalk().magentaBright(core.filelog(target));
    if (target.endsWith(".d.ts")) {
        log.log(`${targetlog} is declaration file`);
        return;
    }
    const dest = path.dirname(target);
    log.log(`${targetlog} > ${log.chalk().yellow(core.filelog(target.replace(/\.ts$/, ".js")))} start`);
    const tsProject = ts.createProject({
        declaration: false,
        skipLibCheck: true,
    });
    return gulp.src(target).pipe(tsProject()).on("error", console.log).pipe(gulp.dest(dest));
}