Gruntfile.js 3.6 KB

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