123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /*
- * Copyright 2018 Scytl Secure Electronic Voting SA
- *
- * All rights reserved
- *
- * See our extended copyright notice in *file 'Copyright.txt' which is part of this source code package
- */
- /**
- * Js Tasks
- * @module tasks/compile-js
- */
- const gulp = require('gulp');
- const eslint = require('gulp-eslint');
- const cache = require('gulp-cached');
- const browserify = require('browserify');
- const babelify = require('babelify');
- const gutil = require('gulp-util');
- const gulpif = require('gulp-if');
- const uglify = require('gulp-uglify');
- const sourcemaps = require('gulp-sourcemaps');
- const source = require('vinyl-source-stream');
- const buffer = require('vinyl-buffer');
- const KarmaServer = require('karma').Server;
- const filesize = require('gulp-size');
- const addsrc = require('gulp-add-src');
- const concat = require('gulp-concat');
- const runSequence = require('run-sequence');
- const paths = require('../paths.json');
- const {
- getCommandArguments,
- notificationOnError,
- } = require('./helpers');
- const argv = getCommandArguments();
- const libBundle = browserify({
- entries : [paths.js.entryFile],
- debug : !argv.production || argv.debug,
- paths : [paths.js.src],
- cache : true,
- transform : [
- babelify.configure({
- presets : ['es2015'],
- sourceMaps : true,
- }),
- ],
- });
- /**
- * Checks and flags code that doesn't correspond to the
- * style guidelines configured under .eslintrc file
- *
- * @task js-lint
- */
- gulp.task('js-lint', (done) => {
- if (argv['skip-linting']) {
- console.log('[!] js-lint skipped [!]');
- done();
- return;
- }
- // ESLint ignores files with "node_modules" paths.
- // So, it's best to have gulp ignore the directory as well.
- // Also, Be sure to return the stream from the task;
- // Otherwise, the task may end before the stream has finished.
- return gulp.src([
- `${paths.js.src}/**/*.js`,
- ])
- .pipe(cache('js-lint', { optimizeMemory: true }))
- // eslint() attaches the lint output to the "eslint" property
- // of the file object so it can be used by other modules.
- .pipe(eslint())
- // eslint.format() outputs the lint results to the console.
- // Alternatively use eslint.formatEach() (see Docs).
- .pipe(eslint.format())
- // To have the process exit with an error code (1) on
- // lint error, return the stream and pipe to failOnError last.
- .pipe(gulpif(!argv.force, eslint.failAfterError()))
- .on('error', notificationOnError('\uD83D\uDE25 Linting errors found!', '<%= error.message %>'));
- });
- /**
- * Runs the unit tests test/unit folder
- *
- * @task unit-tests
- */
- gulp.task('unit-tests', (done) => {
- if (argv['skip-unit-tests']) {
- console.log('[!] unit-tests skipped [!]');
- done();
- return;
- }
- runSequence(
- 'unit-tests:all',
- // 'unit-tests:precompute',
- // 'unit-tests:proofs',
- done
- );
- });
- gulp.task('unit-tests:all', [], (done) => {
- new KarmaServer({
- configFile : __dirname + '/../karma.conf.js',
- singleRun : true,
- }, done).start();
- });
- gulp.task('unit-tests:precompute', (done) => {
- new KarmaServer({
- configFile : __dirname + '/../karma-precompute.conf.js',
- singleRun : true,
- }, done).start();
- });
- gulp.task('unit-tests:proofs', (done) => {
- new KarmaServer({
- configFile : __dirname + '/../karma-proofs.conf.js',
- singleRun : true,
- }, done).start();
- });
- /**
- * Bundles, minifies (if production flag is true), generates the
- * source maps and suffixes project's version to the resulted bundle file
- * for the provided browserify stream.
- *
- * @param {BrowserifyObject} browserifyStream
- * @param {String} bundleFilename The desired filename for the bundle
- */
- const compileBundle = (browserifyStream, bundleFilename, uglifyCode = true) => {
- return browserifyStream.bundle()
- .on('error', gutil.log)
- .pipe(source(bundleFilename))
- .pipe(buffer())
- .pipe(addsrc([`${paths.js.crypto}/forge.min.js`]))
- .pipe(addsrc([`${paths.js.crypto}/sjcl.js`]))
- .pipe(concat(uglifyCode ? paths.js.bundleMinFile : paths.js.bundleFile))
- .pipe(
- gulpif(
- (!argv.production || argv.debug),
- sourcemaps.init({ loadMaps: true })
- )
- )
- .pipe(gulpif(uglifyCode, uglify()))
- .pipe(
- gulpif(
- (!argv.production || argv.debug),
- sourcemaps.write('./', { includeContent: true, sourceRoot: '/ov-api' })
- )
- )
- .pipe(filesize({ showFiles: true }));
- }
- /**
- * Bundles, minifies (if production arg is true), generates the source maps
- * (if no production arg was passed or debug args is present along with production arg)
- * and suffixes project's version to the resulted bundle file for the provided browserify stream.
- *
- * @task build-js
- */
- gulp.task('build-js', ['build-js:include-sjcl', 'build-js:include-node-forge'], () => {
- return compileBundle(libBundle, paths.js.bundleFile)
- .pipe(gulp.dest(`${paths.js.dist}`));
- });
- gulp.task('build-js:include-node-forge', () => {
- return gulp.src(['./node_modules/node-forge/dist/forge.min.js'])
- .pipe(gulp.dest(paths.js.crypto));
- });
- gulp.task('build-js:include-sjcl', () => {
- return gulp.src(['./node_modules/sjcl/sjcl.js'])
- .pipe(gulp.dest(paths.js.crypto));
- });
- gulp.task('build-js:for-doc', () => {
- return compileBundle(libBundle, paths.js.bundleFile, false)
- .pipe(gulp.dest('./dist/doc/src'));
- });
- gulp.task('watch:js', () => {
- gulp.watch(
- [
- `${paths.js.src}/**/*.js`,
- `${paths.js.src}/**/*.coffee`,
- ],
- [
- 'build-js',
- ]
- );
- });
|