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' ] ); };