/*! * 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' ] ); } };