wikimedia/mediawiki-extensions-VisualEditor

View on GitHub
Gruntfile.js

Summary

Maintainability
B
6 hrs
Test Coverage
/*!
 * Grunt file
 *
 * @package VisualEditor
 */

'use strict';

module.exports = function ( grunt ) {
    const conf = grunt.file.readJSON( 'extension.json' ),
        screenshotOptions = {
            reporter: 'spec',
            // TODO: Work out how to catch this timeout and continue.
            // For now just make it very long.
            timeout: 5 * 60 * 1000,
            require: [
                function () {
                    global.langs = [ grunt.option( 'lang' ) || 'en' ];
                }
            ]
        },
        screenshotOptionsAll = {
            reporter: 'spec',
            // TODO: Work out how to catch this timeout and continue.
            // For now just make it very long.
            timeout: 5 * 60 * 1000,
            require: [
                function () {
                    global.langs = require( './build/tasks/screenshotLangs.json' ).langs;
                }
            ]
        };

    grunt.loadNpmTasks( 'grunt-banana-checker' );
    grunt.loadNpmTasks( 'grunt-contrib-watch' );
    grunt.loadNpmTasks( 'grunt-eslint' );
    grunt.loadNpmTasks( 'grunt-image' );
    grunt.loadNpmTasks( 'grunt-mocha-test' );
    grunt.loadNpmTasks( 'grunt-stylelint' );
    grunt.loadNpmTasks( 'grunt-tyops' );
    grunt.loadTasks( 'lib/ve/build/tasks' );
    grunt.loadTasks( 'build/tasks' );

    grunt.initConfig( {
        mochaTest: {
            'screenshots-en': {
                options: screenshotOptions,
                src: [ 'build/screenshots.userGuide.js' ]
            },
            'screenshots-all': {
                options: screenshotOptionsAll,
                src: [ 'build/screenshots.userGuide.js' ]
            },
            'diff-screenshots-en': {
                options: screenshotOptions,
                src: [ 'build/screenshots.diffs.js' ]
            },
            'diff-screenshots-all': {
                options: screenshotOptionsAll,
                src: [ 'build/screenshots.diffs.js' ]
            }
        },
        image: {
            pngs: {
                options: {
                    zopflipng: true,
                    pngout: true,
                    optipng: true,
                    advpng: true,
                    pngcrush: true
                },
                'screenshots-en': {
                    expand: true,
                    src: 'screenshots/*-en.png'
                },
                'screenshots-all': {
                    expand: true,
                    src: 'screenshots/*.png'
                }
            },
            svgs: {
                options: {
                    svgo: [
                        '--pretty',
                        '--enable=removeRasterImages',
                        '--enable=sortAttrs',
                        '--disable=cleanupIDs',
                        '--disable=removeDesc',
                        '--disable=removeTitle',
                        '--disable=removeViewBox',
                        '--disable=removeXMLProcInst'
                    ]
                },
                expand: true,
                src: 'images/*.svg'
            }
        },
        tyops: {
            options: {
                typos: 'build/typos.json'
            },
            src: [
                '**/*.{js,json,less,css,txt,php,md,sh}',
                '!package-lock.json',
                '!build/typos.json',
                '!**/i18n/**/*.json',
                '**/i18n/**/en.json',
                '**/i18n/**/qqq.json',
                '!lib/**',
                '!{docs,node_modules,vendor}/**',
                '!.git/**'
            ]
        },
        eslint: {
            options: {
                cache: true,
                fix: grunt.option( 'fix' )
            },
            all: [ '.' ]
        },
        stylelint: {
            options: {
                reportNeedlessDisables: true
            },
            all: [
                '**/*.{css,less}',
                '!coverage/**',
                '!dist/**',
                '!docs/**',
                '!lib/**',
                '!node_modules/**',
                '!vendor/**'
            ]
        },
        banana: conf.MessagesDirs,
        watch: {
            files: [
                '.{stylelintrc,eslintrc}.json',
                '<%= eslint.all %>',
                '<%= stylelint.all %>'
            ],
            tasks: 'test'
        }
    } );

    grunt.registerTask( 'git-status', function () {
        const done = this.async();
        // Are there unstaged changes?
        require( 'child_process' ).exec( 'git ls-files --modified', ( err, stdout, stderr ) => {
            const ret = err || stderr || stdout;
            if ( ret ) {
                grunt.log.error( 'Unstaged changes in these files:' );
                grunt.log.error( ret );
                // Show a condensed diff
                require( 'child_process' ).exec( 'git diff -U1 | tail -n +3', ( err2, stdout2, stderr2 ) => {
                    grunt.log.write( err2 || stderr2 || stdout2 );
                    done( false );
                } );
            } else {
                grunt.log.ok( 'No unstaged changes.' );
                done();
            }
        } );
    } );

    grunt.registerTask( 'test', [ 'tyops', 'eslint', 'stylelint', 'banana' ] );
    grunt.registerTask( 'test-ci', [ 'git-status' ] );
    grunt.registerTask( 'screenshots', [ 'mochaTest:screenshots-en', 'image:pngs' ] );
    grunt.registerTask( 'screenshots-all', [ 'mochaTest:screenshots-all', 'image:pngs' ] );
    grunt.registerTask( 'default', 'test' );

    if ( process.env.JENKINS_HOME ) {
        grunt.renameTask( 'test', 'test-internal' );
        grunt.registerTask( 'test', [ 'test-internal', 'test-ci' ] );
    } else {
        grunt.registerTask( 'ci', [ 'test', 'image:svgs', 'test-ci' ] );
    }
};