@v4fire/core
Version:
V4Fire core library
96 lines • 3.71 kB
JavaScript
;
module.exports = function init(gulp) {
const fs = require('fs-extra');
const {
src,
monic
} = require('@config/config'),
{
resolve
} = require('@pzlr/build-core'),
{
replaceTscAliasPaths
} = require('tsc-alias'),
{
depsRgxpStr
} = include('build/const');
const h = include('build/helpers'),
$ = require('gulp-load-plugins')({
scope: ['optionalDependencies']
});
gulp.task('clean:server', () => require('del')(src.serverOutput()));
gulp.task('clean:standalone', () => require('del')(src.standaloneOutput()));
gulp.task('build:server', gulp.series([gulp.parallel(['build:tsconfig', 'clean:server']), build]));
gulp.task('build:standalone', gulp.series([gulp.parallel(['build:tsconfig', 'clean:standalone']), buildStandalone, buildDeclStandalone, replaceTscAliases]));
gulp.task('build:standalone-decl', gulp.series([buildDeclStandalone, replaceTscAliases]));
let filesToBuild;
gulp.task('build:server:rebuild', build);
gulp.task('build:standalone:rebuild', gulp.series([buildStandalone, replaceTscAliases]));
gulp.task('watch:server', gulp.series(['build:server', () => {
gulp.watch(filesToBuild, gulp.series(['build:server:rebuild']));
}]));
gulp.task('watch:standalone', gulp.series(['build:standalone', () => {
gulp.watch(filesToBuild, gulp.series(['build:standalone:rebuild']));
}]));
function baseBuild(opts = {}) {
opts = {
type: 'server',
...opts
};
const tsConfig = fs.readJSONSync(src.rel(`./${opts.type}.tsconfig.json`)),
enableSourcemaps = process.env.SOURCEMAPS;
const requireInitializer = `/* istanbul ignore next */(${h.redefineRequire.toString()})();\n`,
insertRequireInitializer = h.prependCode(requireInitializer);
return gulp.src(getFilesToBuild(tsConfig), {
base: './',
since: gulp.lastRun(`build:${opts.type}`)
}).pipe($.if(enableSourcemaps, $.sourcemaps.init())).pipe($.plumber()).pipe($.monic(Object.mixin(true, {}, monic().typescript, {
flags: {
node_js: true
},
sourceMaps: true
}))).pipe($.babel({
plugins: opts.type === 'server' ? [insertRequireInitializer] : [],
comments: false
})).pipe($.if(enableSourcemaps, $.sourcemaps.write('.'))).pipe(gulp.dest(file => dest(file, opts)));
}
function buildStandalone() {
return baseBuild({
type: 'standalone'
});
}
function buildDeclStandalone(opts) {
opts = {
type: 'standalone',
...opts
};
const tsConfig = fs.readJSONSync(src.rel(`./${opts.type}.tsconfig.json`)),
tsProject = $.typescript.createProject(`${opts.type}.tsconfig.json`);
const tsResult = gulp.src(getFilesToBuild(tsConfig)).pipe($.plumber()).pipe(tsProject());
return tsResult.dts.pipe(gulp.dest('lib'));
}
function dest(file, opts) {
const isPathInside = require('is-path-inside');
const isDep = new RegExp(`(^.*?(?:^|[\\/])(${depsRgxpStr}))(?:$|[\\/])`),
depDecl = isDep.exec(file.path);
if (depDecl) {
file.base = resolve.rootDependencies.find(el => isPathInside(fs.realpathSync(el), fs.realpathSync(depDecl[1])));
return src.lib(depDecl[2]);
}
file.base = src.src();
return src[`${opts.type}Output`]();
}
function getFilesToBuild(tsConfig) {
filesToBuild = [...(tsConfig.include || []), ...resolve.rootDependencies.map(el => `${el}/**/*.@(ts|js)`), '!src/**/*.spec.js'];
return filesToBuild;
}
function replaceTscAliases() {
return replaceTscAliasPaths({
configFile: src.rel('./standalone.tsconfig.json'),
outDir: src.rel('standaloneOutput')
});
}
function build() {
return baseBuild();
}
};