Update RELEASE-NOTES-1.35
[mediawiki.git] / Gruntfile.js
blob5c142506e3e2627382d6d9ad19a716a1c1e4fd4c
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                         src: '{resources/src,mw-config}/**/*.{css,less,vue}'
42                 },
43                 svgmin: {
44                         options: {
45                                 js2svg: {
46                                         indent: '\t',
47                                         pretty: true
48                                 },
49                                 multipass: true,
50                                 plugins: [ {
51                                         cleanupIDs: false
52                                 }, {
53                                         removeDesc: false
54                                 }, {
55                                         removeRasterImages: true
56                                 }, {
57                                         removeTitle: false
58                                 }, {
59                                         removeViewBox: false
60                                 }, {
61                                         removeXMLProcInst: false
62                                 }, {
63                                         sortAttrs: true
64                                 } ]
65                         },
66                         all: {
67                                 files: [ {
68                                         expand: true,
69                                         cwd: 'resources/src',
70                                         src: [
71                                                 '**/*.svg'
72                                         ],
73                                         dest: 'resources/src/',
74                                         ext: '.svg'
75                                 } ]
76                         }
77                 },
78                 watch: {
79                         files: [
80                                 '.{stylelintrc,eslintrc.json}',
81                                 '**/*',
82                                 '!{docs,extensions,node_modules,skins,vendor}/**'
83                         ],
84                         tasks: 'test'
85                 },
86                 karma: {
87                         options: {
88                                 customLaunchers: {
89                                         ChromeCustom: {
90                                                 base: 'ChromeHeadless',
91                                                 // Chrome requires --no-sandbox in Docker/CI.
92                                                 // WMF CI images expose CHROMIUM_FLAGS which sets that.
93                                                 flags: ( process.env.CHROMIUM_FLAGS || '' ).split( ' ' )
94                                         }
95                                 },
96                                 proxies: karmaProxy,
97                                 files: [ {
98                                         pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export',
99                                         watched: false,
100                                         included: true,
101                                         served: false
102                                 } ],
103                                 logLevel: ( process.env.ZUUL_PROJECT ? 'DEBUG' : 'INFO' ),
104                                 frameworks: [ 'qunit' ],
105                                 reporters: [ 'mocha' ],
106                                 singleRun: true,
107                                 autoWatch: false,
108                                 // Some tests in extensions don't yield for more than the default 10s (T89075)
109                                 browserNoActivityTimeout: 60 * 1000,
110                                 // Karma requires Same-Origin (or CORS) by default since v1.1.1
111                                 // for better stacktraces. But we load the first request from wgServer
112                                 crossOriginAttribute: false
113                         },
114                         main: {
115                                 browsers: [ 'ChromeCustom' ]
116                         },
117                         firefox: {
118                                 browsers: [ 'FirefoxHeadless' ]
119                         }
120                 },
121                 copy: {
122                         jsduck: {
123                                 src: 'resources/**/*',
124                                 dest: 'docs/js/modules',
125                                 expand: true,
126                                 rename: function ( dest, src ) {
127                                         return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
128                                 }
129                         }
130                 }
131         } );
133         grunt.registerTask( 'assert-mw-env', function () {
134                 var ok = true;
135                 if ( !process.env.MW_SERVER ) {
136                         grunt.log.error( 'Environment variable MW_SERVER must be set.\n' +
137                                 'Set this like $wgServer, e.g. "http://localhost"'
138                         );
139                         ok = false;
140                 }
141                 if ( !process.env.MW_SCRIPT_PATH ) {
142                         grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
143                                 'Set this like $wgScriptPath, e.g. "/w"' );
144                         ok = false;
145                 }
146                 return ok;
147         } );
149         grunt.registerTask( 'minify', 'svgmin' );
150         grunt.registerTask( 'lint', [ 'eslint', 'banana', 'stylelint' ] );
151         grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );