lila/ui/site/gulpfile.js

164 lines
5.0 KiB
JavaScript

const gulp = require('gulp');
const source = require('vinyl-source-stream');
const buffer = require('vinyl-buffer');
const colors = require('ansi-colors');
const logger = require('fancy-log');
const watchify = require('watchify');
const browserify = require('browserify');
const terser = require('gulp-terser');
const size = require('gulp-size');
const tsify = require('tsify');
const concat = require('gulp-concat');
const exec = require('child_process').exec;
const fs = require('fs');
const path = require('path');
require('@build/cssProject')(__dirname);
const browserifyOpts = (entries, debug) => ({
entries: entries,
standalone: 'Lichess',
debug: debug
});
const destinationPath = '../../public/compiled/';
const destination = () => gulp.dest(destinationPath);
const fileBaseName = 'lichess.site';
const abFile = process.env.LILA_AB_FILE;
const jqueryFill = () => gulp.src('src/jquery.fill.js')
.pipe(buffer())
.pipe(terser({safari10: true}))
.pipe(gulp.dest('./dist'));
const ab = () => {
if (abFile) return gulp.src(abFile)
.pipe(buffer())
.pipe(terser({safari10: true}))
.pipe(gulp.dest('./dist'));
else {
logger.info(colors.yellow('Building without AB file'));
return gulp.src('.');
}
};
const hopscotch = () => gulp.src([
'dist/js/hopscotch.min.js',
'dist/**/*.min.css',
'dist/img/*'
], {
cwd: path.dirname(require.resolve('hopscotch/package.json')),
cwdbase: true
}).pipe(gulp.dest('../../public/vendor/hopscotch/'));
const jqueryBarRating = () => gulp.src([
'dist/jquery.barrating.min.js'
], {
cwd: path.dirname(require.resolve('jquery-bar-rating/package.json')),
cwdbase: true
}).pipe(gulp.dest('../../public/vendor/bar-rating/'));
const stockfishJs = () => gulp.src([
require.resolve('stockfish.js/stockfish.wasm.js'),
require.resolve('stockfish.js/stockfish.wasm'),
require.resolve('stockfish.js/stockfish.js')
]).pipe(gulp.dest('../../public/vendor/stockfish.js'));
const stockfishWasm = () => gulp.src([
require.resolve('stockfish.wasm/stockfish.js'),
require.resolve('stockfish.wasm/stockfish.wasm'),
require.resolve('stockfish.wasm/stockfish.worker.js')
]).pipe(gulp.dest('../../public/vendor/stockfish.wasm/'));
const stockfishMvWasm = () => gulp.src([
require.resolve('stockfish-mv.wasm/stockfish.js'),
require.resolve('stockfish-mv.wasm/stockfish.js.mem'),
require.resolve('stockfish-mv.wasm/stockfish.wasm'),
require.resolve('stockfish-mv.wasm/pthread-main.js')
]).pipe(gulp.dest('../../public/vendor/stockfish-mv.wasm/'));
const prodSource = () => browserify(browserifyOpts('src/index.ts', false))
.plugin(tsify)
.bundle()
.pipe(source(`${fileBaseName}.source.min.js`))
.pipe(buffer())
.pipe(terser({safari10: true}))
.pipe(gulp.dest('./dist'));
const devSource = () => browserify(browserifyOpts('src/index.ts', true))
.plugin(tsify)
.bundle()
.pipe(source(`${fileBaseName}.js`))
.pipe(destination());
function makeDependencies(filename) {
return function bundleDeps() {
return gulp.src([
'../../public/javascripts/vendor/jquery.min.js',
'./dist/jquery.fill.js',
'./dep/powertip.min.js',
'./dep/howler.min.js',
'./dep/mousetrap.min.js',
'./dist/consolemsg.js',
...(abFile ? ['./dist/ab.js'] : []),
])
.pipe(concat(filename))
.pipe(destination());
};
}
function makeBundle(filename) {
return function bundleItAll() {
return gulp.src([
destinationPath + 'lichess.deps.js',
'./dist/' + filename,
])
.pipe(concat(filename.replace('source.', '')))
.pipe(destination());
};
}
const gitSha = (cb) => exec("git rev-parse -q --short HEAD", function (err, stdout) {
if (err) throw err;
if (!fs.existsSync('./dist')) fs.mkdirSync('./dist');
var date = new Date().toISOString().split('.')[0];
fs.writeFileSync('./dist/consolemsg.js',
'window.lichess=window.lichess||{};console.info("Lichess is open source! https://github.com/ornicar/lila");' +
`lichess.info = "Assets built ${date} from sha ${stdout.trim()}";`);
cb();
});
const standalonesJs = () => gulp.src([
'util.js', 'trans.js', 'tv.js', 'puzzle.js', 'user.js', 'coordinate.js', 'captcha.js', 'embed-analyse.js'
].map(f => `src/standalones/${f}`))
.pipe(buffer())
.pipe(terser({safari10: true}))
.pipe(destination());
function singlePackage(file, dest) {
return () => browserify(browserifyOpts(file, false))
.bundle()
.pipe(source(dest))
.pipe(buffer())
.pipe(terser({safari10: false}))
.pipe(destination());
}
const userMod = singlePackage('./src/user-mod.js', 'user-mod.js');
const clas = singlePackage('./src/clas.js', 'clas.js');
const deps = makeDependencies('lichess.deps.js');
const tasks = [
gitSha, jqueryFill, ab, standalonesJs, userMod, clas,
stockfishWasm, stockfishMvWasm, stockfishJs,
deps,
hopscotch, jqueryBarRating
];
const dev = gulp.series(tasks.concat([devSource]));
gulp.task('prod', gulp.series(tasks, prodSource, makeBundle(`${fileBaseName}.source.min.js`)));
gulp.task('dev', gulp.series(tasks, dev));
gulp.task('default', gulp.series(tasks, dev, () => gulp.watch('src/**/*.js', dev)));