/* global module:false */ module.exports = function (grunt) { var port = grunt.option('port') || 8000; var 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) 2018 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: { 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 } }, 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' }, html: { files: root.map(path => path + '/*.html') }, markdown: { files: root.map(path => path + '/*.md') }, options: { livereload: true } }, retire: { js: ['js/reveal.js', 'lib/js/*.js', 'plugin/**/*.js'], node: ['.'] } }); // Dependencies grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-autoprefixer'); grunt.loadNpmTasks('grunt-retire'); grunt.loadNpmTasks('grunt-sass'); grunt.loadNpmTasks('grunt-zip'); // 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']); };