radixjs
Version:
RadixJS 3.0.0
665 lines (622 loc) • 22.3 kB
JavaScript
console.log("Default build system enhancement module added");
//Requires and declares
const gulp = require('gulp'),
gutil = require('gulp-util'),
path = require('path'),
rollup = require('gulp-rollup'),
rollupmep = require('gulp-rollup-mep'),
debug = require('gulp-debug'),
uglifyjs = require('gulp-uglify'),
concat = require('gulp-concat'),
sass = require('gulp-sass'),
sourcemaps = require('gulp-sourcemaps'),
rename = require("gulp-rename"),
minifyCss = require('gulp-cssnano'),
del = require('del'),
fs = require('fs'),
debounce = require('gulp-debounce'),
cwd = process.cwd(),
browserSync = require('browser-sync'),
nodemon = require('gulp-nodemon'),
typescript = require('gulp-typescript'),
pug = require('gulp-pug'),
bundling = require(path.join(cwd, './config/bundling.json')),
traceur = require('gulp-traceur'),
env = require(path.join(cwd, './config/environments.json')),
typescriptMainConfig = typescript.createProject('tsconfig.json'),
typescriptMultipleConfig = typescript.createProject('tsconfig.json'),
postcss = require('gulp-postcss'),
autoprefixer = require('autoprefixer'),
exec = require('child_process').exec,
cssnano = require('cssnano');
exports.before = (mod, ...args) => {
mod.settings = {};
};
exports.lex = {
for: {
length: 1,
handler: (mod, ...args) => {
mod.settings.environment = args[0];
}
},
debug: {
length: 0,
handler: (mod) => {
mod.settings.debug = true;
}
},
only: {
length: 1,
handler: (mod, ...args) => {
mod.settings.spec = args[0];
}
},
language: {
length: 1,
handler: (mod, ...args) => {
mod.settings.language = args[0];
}
},
build: {
length: 0,
handler: (mod, ...args) => {
mod.task = "build";
if (mod.settings.spec) {
mod.task += "-" + mod.settings.spec;
}
}
},
watch: {
length: 0,
handler: (mod, ...args) => {
mod.task = "watch";
if (mod.settings.spec) {
mod.task += "-" + mod.settings.spec;
}
}
},
serve: {
length: 0,
handler: (mod, ...args) => {
mod.task = "serve";
}
},
called: {
length: 1,
handler: (mod, ...args) => {
mod.settings.name = args[0];
}
},
path: {
length: 1,
handler: (mod, ...args) => {
mod.settings.path = args[0];
}
},
from: {
length: 1,
handler: (mod, ...args) => {
mod.settings.source = args[0];
}
},
generate: {
length: 1,
handler: require("./generate")
}
};
exports.after = (mod, ...args) => {
var node_env = mod.settings.environment = mod.settings.environment || "development";
mod.prefix = path.join(process.cwd(), "dist/", node_env.toString());
mod.environment = env[node_env];
};
io = {
server: {
in: [
'app/**/*.js',
'routers/**/*.js',
'models/**/*.js',
'hooks/**/*.js',
'node_modules/radixjs/server/**/*.js'
], out: '/'
},
independent: {
in: [
"package.json",
"radixfile.json",
'node_modules/radixjs/bs/ressources/launch.js'
],
out: "./"
},
config: {
in: "config/**/**",
out: "config/"
},
static: {
in: [
'assets/**/*',
//not stylesheets
'!assets/stylesheets/**/*.scss',
'!assets/stylesheets/**/*.sass',
'!assets/stylesheets/**/*.css',
//not multiple
"!assets/multiple/**/**.**",
//not js
"!assets/javascript/**/**.js"
],
out: '/public/'
},
stylesheets: {
in: [
'assets/stylesheets/**/*.scss',
'assets/stylesheets/**/*.sass',
'assets/stylesheets/**/*.css',
],
out: '/public/stylesheets/',
root: "/"
},
views: {
in: 'views/**/*',
out: '/views/'
},
javascript: {
in: "assets/javascript/**/**.js",
out: "/public/javascript",
root: "/"
},
multiple: {
in_js: "assets/multiple/**/**.js",
in_ts: "assets/multiple/**/**.ts",
in_pug: "assets/multiple/**/**.pug",
in_css: [
"assets/multiple/**/**.scss",
"assets/multiple/**/**.sass"
],
in_static: [
"assets/multiple/**/**.**",
"!assets/multiple/**/**.pug",
"!assets/multiple/**/**.scss",
"!assets/multiple/**/**.sass",
"!assets/multiple/**/**.ts",
"!assets/multiple/**/**.js"
],
out: "/public/multiple/"
},
typescript: {in: "assets/typescript/**/**.ts", out: "/public/javascript/compiled"}
};
//Create Void infrastructure
var mdir = function (path) {
try {
fs.mkdirSync(path);
} catch (e) {
//console.log(e);
}
};
function execute(command) {
return new Promise(function (resolve, reject) {
var pro = exec(command, function (error, stdout, stderr) {
resolve({
error,
stdout,
stderr
})
});
});
}
var writeToFile = function (filename, contents) {
return new Promise(function (resolve, reject) {
fs.writeFile(filename, contents, function (errors) {
if (errors) {
reject(errors);
} else {
resolve();
}
});
});
};
var readFile = function (path) {
return new Promise(function (resolve, reject) {
fs.readFile(path, 'utf8', function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
};
let watch = {
'server': [
'app/**/*.js',
'hooks/**/*.js',
'models/**/*.js',
'routers/**/*.js',
'radixFile.json',
"config/environments.json"
],
'dev': 'app/server/**/**.*',
'static': [
'public/**/*',
'radixFile.json'
],
'stylesheets': [
'assets/stylesheets/**/**.**',
"config/bundling.json"
],
'multiple': "assets/multiple/**/**",
'views': 'views/**/**',
'javascript': [
'assets/javascript/**/**.js',
"config/bundling.json"
],
'typescript': 'assets/typescript/**/**.ts',
};
exports.tasks = {
'build-arch': function (mod) {
let prefix = mod.prefix;
mdir("dist");
mdir(prefix);
mdir(path.join(prefix, "/uploads"));
mdir(path.join(prefix, "/suploads"));
var streamI = gulp.src(io.independent.in)
.pipe(gulp.dest(path.join(prefix, io.independent.out)));
var streamC = gulp.src(io.config.in)
.pipe(gulp.dest(path.join(prefix, io.config.out)));
return Promise.resolve();
},
'build-js': function (mod) {
let prefix = mod.prefix;
let bundles = bundling[mod.settings.environment || "development"] ? bundling[mod.settings.environment || "development"] : bundling.default || {};
if (bundling.global) {
bundles.js = bundles.js.concat(bundling.global.js || []);
}
let streams = [];
streams.push(new Promise(function (res, rej) {
gulp.src(io.javascript.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(sourcemaps.init())
//only uglifyjs if gulp is ran with '--type production'
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.javascript.out)))
.on('error', rej)
.on('end', res)
;
}));
for (let bundle of (bundles.js || [])) {
let files = bundle.files.map(file => path.join(cwd, file));
let asyncF = null;
if (bundle.async) {
asyncF = function (res, rej) {
gulp.src(files)
.pipe(sourcemaps.init())
.pipe(rollupmep({
format: "amd",
sourceMap: true
}))
.pipe(concat(bundle.output))
//only uglifyjs if gulp is ran with '--type production'
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.javascript.out)))
.on('error', rej)
.on('end', res)
};
} else {
asyncF = function (res, rej) {
gulp.src(files)
.pipe(sourcemaps.init())
.pipe(concat(bundle.output))
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.javascript.out)))
.on('error', rej)
.on('end', res)
};
}
streams.push((new Promise(asyncF)).then(_ => console.log(`
${mod.settings.environment} bundle ${bundle.output}
\t${bundle.files.join("\n\t")}
`)));
}
return Promise.all(streams).then(bsreload);
// stream.on('end', browserSync.reload);
},
'build-mjs': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
let stream = gulp.src(io.multiple.in_js)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(sourcemaps.init())
//only uglifyjs if gulp is ran with '--type production'
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.multiple.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-mts': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
var stream = gulp.src(io.multiple.in_ts)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(sourcemaps.init())
.pipe(typescript(typescriptMultipleConfig))
//only uglifyjs if gulp is ran with '--type production'
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.multiple.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-mviews': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
var stream = gulp.src(io.multiple.in_pug)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(pug())
.pipe(gulp.dest(path.join(prefix, io.multiple.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-mstatic': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
gulp.src(io.multiple.in_static)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(gulp.dest(path.join(prefix, io.multiple.out)))
.on('error', rej)
.on('end', res)
;
}).then(bsreload)
},
'build-mcss': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
var processors = [
autoprefixer(),
];
var stream = gulp.src(io.multiple.in_css)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(debounce({wait: 1000}))
.pipe(mod.settings.environment === 'production' ? gutil.noop() : sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(postcss(processors))
.pipe(mod.settings.environment === 'production' ? minifyCss() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? gutil.noop() : sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.multiple.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-serverPure': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
return gulp.src(io.server.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(sourcemaps.init())
.pipe(concat('index.js'))
// has to be fixed
// .pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
// //only uglifyjs if gulp is ran with '--type production'
// .pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.server.out)))
.on('error', rej)
.on('end', res)
;
});
},
'build-css': function (mod) {
let prefix = mod.prefix;
let bundles = bundling[mod.settings.environment || "development"] ? bundling[mod.settings.environment || "development"] : bundling.default || {};
if (bundling.global) {
bundles.css = bundles.css.concat(bundling.global.css || []);
}
var processors = [
autoprefixer(),
];
let streams = [];
streams.push(new Promise((res, rej) => {
gulp.src(io.stylesheets.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(debounce({wait: 1000}))
.pipe(mod.settings.environment === 'production' ? gutil.noop() : sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(postcss(processors))
.pipe(mod.settings.environment === 'production' ? minifyCss() : gutil.noop())
.pipe(mod.settings.environment ? gutil.noop() : sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.stylesheets.out)))
.on('error', rej)
.on('end', res)
}
));
for (let bundle of (bundles.css || [])) {
let files = bundle.files.map(file => path.join(cwd, io.stylesheets.root, file));
streams.push((new Promise((res, rej) => {
gulp.src(files)
.pipe(debounce({wait: 1000}))
.pipe(mod.settings.environment === 'production' ? gutil.noop() : sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(concat(bundle.output))
.pipe(postcss(processors))
.pipe(mod.settings.environment === 'production' ? minifyCss() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? gutil.noop() : sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.stylesheets.out)))
.on('error', rej)
.on('end', res)
;
}))
.then(_ => console.log(`
${mod.settings.environment} bundle ${bundle.output}
\t${bundle.files.join("\n\t")}
`)));
}
return Promise.all(streams).then(bsreload);
},
'build-ts': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
var stream = gulp.src(io.typescript.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(sourcemaps.init())
.pipe(typescript(typescriptMainConfig))
//only uglifyjs if gulp is ran with '--type production'
.pipe(mod.settings.environment === 'production' ? traceur() : gutil.noop())
.pipe(mod.settings.environment === 'production' ? uglifyjs() : gutil.noop())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(path.join(prefix, io.typescript.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-views': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
var stream = gulp.src(io.views.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(gulp.dest(path.join(prefix, io.views.out)))
.on('error', rej)
;
stream.on('end', res);
}).then(bsreload)
},
'build-static': function (mod) {
return new Promise(function (res, rej) {
let prefix = mod.prefix;
gulp.src(io.static.in)
.pipe(mod.settings.debug ? debug() : gutil.noop())
.pipe(gulp.dest(path.join(prefix, io.static.out)))
.on('error', rej)
.on('end', res)
;
}).then(bsreload)
},
'build-multiple': [
'build-mjs',
'build-mts',
'build-mviews',
'build-mstatic',
'build-mcss'
],
'build-server': ['build-arch', 'build-serverPure'],
'build-front': ['build-arch', 'build-js', 'build-static', 'build-css', 'build-views', 'build-ts'],
'build-all': ['build-front', 'build-server', 'build-multiple'],
//watch tasks
'watch-css': {
files: watch.stylesheets,
tasks: ["build-css"]
},
'watch-server': {
files: watch.server,
tasks: ['build-server']
},
'watch-server-dev': {
files: [...watch.server, watch.dev],
tasks: ['build-server']
},
'watch-js': {
files: watch.javascript,
tasks: ['build-js']
},
'watch-ts': {
files: watch.typescript,
tasks: ['build-ts']
},
'watch-views': {
files: watch.views,
tasks: ['build-views']
},
'watch-static': {
files: watch.static,
tasks: ['build-static']
},
'watch-multiple': {
files: watch.multiple,
tasks: ['build-multiple']
},
'watch-front': ['watch-static', 'watch-views', 'watch-js', 'watch-ts', 'watch-css'],
'watch-all': ['watch-front', 'watch-server', 'watch-multiple'],
'watch-dev': ['watch-front', 'watch-server', 'watch-server-dev'],
//Nodemon
'nodemonPure': function (mod) {
return new Promise((res, rej) => {
var started = false;
return nodemon({
script: 'radix.js',
ext: 'js',
args: ["launch", mod.settings.environment ? "in " + mod.settings.environment : ""],
watch: watch.server,
tasks: ['build-all']
}).on('start', function () {
res();
if (!started) {
started = true;
}
}).on('restart', function () {
});
});
},
'nodemon': ['watch-all', 'nodemonPure'],
//Nodemon dev
'nodemonPureDev': function (mod) {
var started = false;
return nodemon({
script: 'radix.js',
ext: 'js',
args: ["launch", mod.settings.environment ? "in " + mod.settings.environment : ""],
watch: [watch.server, watch.dev],
tasks: ['build-all']
}).on('start', function () {
if (!started) {
started = true;
}
}).on('restart', function () {
});
return Promise.resolve();
},
'nodemon-dev': ['watch-all', 'nodemonPureDev'],
//browser_sync
'browser-sync': function (mod) {
var env = require(path.join(process.cwd(), '/config/environments.json'));
var node_env = mod.settings.environment || 'development';
var _ = env[node_env];
browserSync.init(null, {
proxy: (_.https || _.http2 ? "https://localhost:" : "http://localhost:") + (_.port.toString()),
files: ["public/**/*.*"],
browser: _.browser || "",
port: _.bsport
});
return Promise.resolve();
},
'ltools': ["nodemon", "browser-sync"],
'ltools-dev': ['nodemon-dev', 'browser-sync'],
//serve
'serve-normal': {tasks: ['build-all', 'ltools'], sequence: true},
'serve-dev': {tasks: ['build-all', 'ltools-dev'], sequence: true}
};
exports.build = ['build-all'];
exports.watch = ['watch-all'];
exports.serve = ['serve-normal'];
var bsreload_monitor = true;
function bsreload() {
if (bsreload_monitor) {
bsreload_monitor = false;
setTimeout(function () {
browserSync.reload();
bsreload_monitor = true;
}, 1000);
}
}