text: const sass = require('node-sass');
  
  module.exports = grunt => {
    require('load-grunt-tasks')(grunt);
  
    let port = grunt.option('port') || 8000;
    let root = grunt.option('root') || '.';
  
    if (!Array.isArray(root)) root = [root];
  
    // Project configuration
    grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      meta: {
        banner:
          '/*!\n' +
          ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
          ' * http://revealjs.com\n' +
          ' * MIT licensed\n' +
          ' *\n' +
          ' * Copyright (C) 2020 Hakim El Hattab, http://hakim.se\n' +
          ' */'
      },
  
      qunit: {
        files: ['test/*.html']
      },
  
      uglify: {
        options: {
          banner: '<%= meta.banner %>\n',
          ie8: true
        },
        build: {
          src: 'js/reveal.js',
          dest: 'js/reveal.min.js'
        }
      },
  
      sass: {
        options: {
          implementation: sass,
          sourceMap: false
        },
        core: {
          src: 'css/reveal.scss',
          dest: 'css/reveal.css'
        },
        themes: {
          expand: true,
          cwd: 'css/theme/source',
          src: ['*.sass', '*.scss'],
          dest: 'css/theme',
          ext: '.css'
        }
      },
  
      autoprefixer: {
        core: {
          src: 'css/reveal.css'
        }
      },
  
      cssmin: {
        options: {
          compatibility: 'ie9'
        },
        compress: {
          src: 'css/reveal.css',
          dest: 'css/reveal.min.css'
        }
      },
  
      jshint: {
        options: {
          curly: false,
          eqeqeq: true,
          immed: true,
          esnext: true,
          latedef: 'nofunc',
          newcap: true,
          noarg: true,
          sub: true,
          undef: true,
          eqnull: true,
          browser: true,
          expr: true,
          loopfunc: true,
          globals: {
            head: false,
            module: false,
            console: false,
            unescape: false,
            define: false,
            exports: false,
            require: false
          }
        },
        files: ['gruntfile.js', 'js/reveal.js']
      },
  
      connect: {
        server: {
          options: {
            port: port,
            base: root,
            livereload: true,
            open: true,
            useAvailablePort: true
          }
        }
      },
  
      zip: {
        bundle: {
          src: ['index.html', 'css/**', 'js/**', 'lib/**', 'images/**', 'plugin/**', '**.md'],
          dest: 'reveal-js-presentation.zip'
        }
      },
  
      watch: {
        js: {
          files: ['gruntfile.js', 'js/reveal.js'],
          tasks: 'js'
        },
        theme: {
          files: [
            'css/theme/source/*.sass',
            'css/theme/source/*.scss',
            'css/theme/template/*.sass',
            'css/theme/template/*.scss'
          ],
          tasks: 'css-themes'
        },
        css: {
          files: ['css/reveal.scss'],
          tasks: 'css-core'
        },
        test: {
          files: ['test/*.html'],
          tasks: 'test'
        },
        html: {
          files: root.map(path => path + '/*.html')
        },
        markdown: {
          files: root.map(path => path + '/*.md')
        },
        options: {
          livereload: true
        }
      }
    });
  
    // Default task
    grunt.registerTask('default', ['css', 'js']);
  
    // JS task
    grunt.registerTask('js', ['jshint', 'uglify', 'qunit']);
  
    // Theme CSS
    grunt.registerTask('css-themes', ['sass:themes']);
  
    // Core framework CSS
    grunt.registerTask('css-core', ['sass:core', 'autoprefixer', 'cssmin']);
  
    // All CSS
    grunt.registerTask('css', ['sass', 'autoprefixer', 'cssmin']);
  
    // Package presentation to archive
    grunt.registerTask('package', ['default', 'zip']);
  
    // Serve presentation locally
    grunt.registerTask('serve', ['connect', 'watch']);
  
    // Run tests
    grunt.registerTask('test', ['jshint', 'qunit']);
  };
  