Gruntfile.js 3.1 KB

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