Gruntfile.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 = {};
  6. grunt.loadNpmTasks( 'grunt-banana-checker' );
  7. grunt.loadNpmTasks( 'grunt-contrib-copy' );
  8. grunt.loadNpmTasks( 'grunt-contrib-watch' );
  9. grunt.loadNpmTasks( 'grunt-eslint' );
  10. grunt.loadNpmTasks( 'grunt-jsonlint' );
  11. grunt.loadNpmTasks( 'grunt-karma' );
  12. grunt.loadNpmTasks( 'grunt-stylelint' );
  13. grunt.loadNpmTasks( 'grunt-webdriver' );
  14. karmaProxy[ wgScriptPath ] = {
  15. target: wgServer + wgScriptPath,
  16. changeOrigin: true
  17. };
  18. grunt.initConfig( {
  19. eslint: {
  20. all: [
  21. '**/*.js',
  22. '!docs/**',
  23. '!node_modules/**',
  24. '!resources/lib/**',
  25. '!resources/src/jquery.tipsy/**',
  26. '!resources/src/jquery/jquery.farbtastic.js',
  27. '!resources/src/mediawiki.libs/**',
  28. // Third-party code of PHPUnit coverage report
  29. '!tests/coverage/**',
  30. '!vendor/**',
  31. // Explicitly say "**/*.js" here in case of symlinks
  32. '!extensions/**/*.js',
  33. '!skins/**/*.js',
  34. // Skip functions aren't even parseable
  35. '!resources/src/mediawiki.hidpi-skip.js'
  36. ]
  37. },
  38. jsonlint: {
  39. all: [
  40. '**/*.json',
  41. '!{docs/js,extensions,node_modules,skins,vendor}/**'
  42. ]
  43. },
  44. banana: {
  45. options: {
  46. disallowBlankTranslations: false
  47. },
  48. core: 'languages/i18n/',
  49. api: 'includes/api/i18n/',
  50. installer: 'includes/installer/i18n/'
  51. },
  52. stylelint: {
  53. src: '{resources/src,mw-config}/**/*.{css,less}'
  54. },
  55. watch: {
  56. files: [
  57. '.{stylelintrc,eslintrc.json}',
  58. '**/*',
  59. '!{docs,extensions,node_modules,skins,vendor}/**'
  60. ],
  61. tasks: 'test'
  62. },
  63. karma: {
  64. options: {
  65. proxies: karmaProxy,
  66. files: [ {
  67. pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export',
  68. watched: false,
  69. included: true,
  70. served: false
  71. } ],
  72. logLevel: 'DEBUG',
  73. frameworks: [ 'qunit' ],
  74. reporters: [ 'mocha' ],
  75. singleRun: true,
  76. autoWatch: false,
  77. // Some tests in extensions don't yield for more than the default 10s (T89075)
  78. browserNoActivityTimeout: 60 * 1000,
  79. // Karma requires Same-Origin (or CORS) by default since v1.1.1
  80. // for better stacktraces. But we load the first request from wgServer
  81. crossOriginAttribute: false
  82. },
  83. main: {
  84. browsers: [ 'Chrome' ]
  85. },
  86. chromium: {
  87. browsers: [ 'Chromium' ]
  88. },
  89. firefox: {
  90. browsers: [ 'Firefox' ]
  91. }
  92. },
  93. copy: {
  94. jsduck: {
  95. src: 'resources/**/*',
  96. dest: 'docs/js/modules',
  97. expand: true,
  98. rename: function ( dest, src ) {
  99. return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
  100. }
  101. }
  102. },
  103. // Configure WebdriverIO task
  104. webdriver: {
  105. test: {
  106. configFile: './tests/selenium/wdio.conf.js'
  107. }
  108. }
  109. } );
  110. grunt.registerTask( 'assert-mw-env', function () {
  111. if ( !process.env.MW_SERVER ) {
  112. grunt.log.error( 'Environment variable MW_SERVER must be set.\n' +
  113. 'Set this like $wgServer, e.g. "http://localhost"'
  114. );
  115. }
  116. if ( !process.env.MW_SCRIPT_PATH ) {
  117. grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
  118. 'Set this like $wgScriptPath, e.g. "/w"' );
  119. }
  120. return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
  121. } );
  122. grunt.registerTask( 'lint', [ 'eslint', 'banana', 'stylelint' ] );
  123. grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
  124. grunt.registerTask( 'test', [ 'lint' ] );
  125. grunt.registerTask( 'default', 'test' );
  126. };