Updating wikimedia/xmp-reader (0.7.0 => 0.8.0)
[mediawiki.git] / Gruntfile.js
blobe15b9897db8f2fab2a08f8b68d32442e447bc07e
1 /* eslint-env node */
2 module.exports = function ( grunt ) {
3         var wgServer = process.env.MW_SERVER,
4                 wgScriptPath = process.env.MW_SCRIPT_PATH,
5                 karmaProxy = {};
7         grunt.loadNpmTasks( 'grunt-banana-checker' );
8         grunt.loadNpmTasks( 'grunt-contrib-copy' );
9         grunt.loadNpmTasks( 'grunt-eslint' );
10         grunt.loadNpmTasks( 'grunt-karma' );
11         grunt.loadNpmTasks( 'grunt-stylelint' );
12         grunt.loadNpmTasks( 'grunt-svgmin' );
14         karmaProxy[ wgScriptPath ] = {
15                 target: wgServer + wgScriptPath,
16                 changeOrigin: true
17         };
19         grunt.initConfig( {
20                 eslint: {
21                         options: {
22                                 extensions: [ '.js', '.json', '.vue' ],
23                                 cache: true,
24                                 fix: grunt.option( 'fix' )
25                         },
26                         all: '.'
27                 },
28                 banana: {
29                         options: {
30                                 requireLowerCase: false,
31                                 disallowBlankTranslations: false
32                         },
33                         core: 'languages/i18n/',
34                         exif: 'languages/i18n/exif/',
35                         api: 'includes/api/i18n/',
36                         rest: 'includes/Rest/i18n/',
37                         installer: 'includes/installer/i18n/',
38                         paramvalidator: 'includes/libs/ParamValidator/i18n/'
39                 },
40                 stylelint: {
41                         options: {
42                                 reportNeedlessDisables: true
43                         },
44                         src: '{resources/src,mw-config}/**/*.{css,less,vue}'
45                 },
46                 svgmin: {
47                         options: {
48                                 js2svg: {
49                                         indent: '\t',
50                                         pretty: true
51                                 },
52                                 multipass: true,
53                                 plugins: [ {
54                                         cleanupIDs: false
55                                 }, {
56                                         removeDesc: false
57                                 }, {
58                                         removeRasterImages: true
59                                 }, {
60                                         removeTitle: false
61                                 }, {
62                                         removeViewBox: false
63                                 }, {
64                                         removeXMLProcInst: false
65                                 }, {
66                                         sortAttrs: true
67                                 } ]
68                         },
69                         all: {
70                                 files: [ {
71                                         expand: true,
72                                         cwd: 'resources/src',
73                                         src: [
74                                                 '**/*.svg'
75                                         ],
76                                         dest: 'resources/src/',
77                                         ext: '.svg'
78                                 } ]
79                         }
80                 },
81                 watch: {
82                         files: [
83                                 '.{stylelintrc,eslintrc.json}',
84                                 '**/*',
85                                 '!{docs,extensions,node_modules,skins,vendor}/**'
86                         ],
87                         tasks: 'test'
88                 },
89                 karma: {
90                         options: {
91                                 customLaunchers: {
92                                         ChromeCustom: {
93                                                 base: 'ChromeHeadless',
94                                                 // Chrome requires --no-sandbox in Docker/CI.
95                                                 // WMF CI images expose CHROMIUM_FLAGS which sets that.
96                                                 flags: ( process.env.CHROMIUM_FLAGS || '' ).split( ' ' )
97                                         }
98                                 },
99                                 proxies: karmaProxy,
100                                 files: [ {
101                                         pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export',
102                                         watched: false,
103                                         included: true,
104                                         served: false
105                                 } ],
106                                 logLevel: ( process.env.ZUUL_PROJECT ? 'DEBUG' : 'INFO' ),
107                                 frameworks: [ 'qunit' ],
108                                 reporters: [ 'mocha' ],
109                                 singleRun: true,
110                                 autoWatch: false,
111                                 // Some tests in extensions don't yield for more than the default 10s (T89075)
112                                 browserNoActivityTimeout: 60 * 1000,
113                                 // Karma requires Same-Origin (or CORS) by default since v1.1.1
114                                 // for better stacktraces. But we load the first request from wgServer
115                                 crossOriginAttribute: false
116                         },
117                         main: {
118                                 browsers: [ 'ChromeCustom' ]
119                         },
120                         firefox: {
121                                 browsers: [ 'FirefoxHeadless' ]
122                         }
123                 },
124                 copy: {
125                         jsduck: {
126                                 src: 'resources/**/*',
127                                 dest: 'docs/js/modules',
128                                 expand: true,
129                                 rename: function ( dest, src ) {
130                                         return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
131                                 }
132                         }
133                 }
134         } );
136         grunt.registerTask( 'assert-mw-env', function () {
137                 var ok = true;
138                 if ( !process.env.MW_SERVER ) {
139                         grunt.log.error( 'Environment variable MW_SERVER must be set.\n' +
140                                 'Set this like $wgServer, e.g. "http://localhost"'
141                         );
142                         ok = false;
143                 }
144                 if ( !process.env.MW_SCRIPT_PATH ) {
145                         grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
146                                 'Set this like $wgScriptPath, e.g. "/w"' );
147                         ok = false;
148                 }
149                 return ok;
150         } );
152         grunt.registerTask( 'minify', 'svgmin' );
153         grunt.registerTask( 'lint', [ 'eslint', 'banana', 'stylelint' ] );
154         grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );