var every = require('lodash/collection/every'); var fs = require('fs'); const sass = require('node-sass'); module.exports = function (grunt) { var lessDir = 'www/less'; var lessVendorDir = lessDir + '/lib'; var sassDir = 'www/scss'; // var sassVendorDir = sassDir + '/mixins'; var cssDir = 'www/css'; var jsDir = 'www/js'; var cssFiles = [ 'search', 'search-google', ]; var jsFiles = [ jsDir + '/search.js', ]; //TODO Update or remove for 5.0? var wdnMixinLibBaseUrl = 'https://raw.githubusercontent.com/unl/wdntemplates/4.1/wdn/templates_4.1/less/_mixins/'; var wdnMixins = [ 'breakpoints.less', 'colors.less', 'fonts.less', ]; var allMixinsExist = every(wdnMixins, function(value) { return fs.existsSync(lessVendorDir + '/' + value); }); // TODO: Import DCF and UNLedu 5.0 mixins and variables // var dcfMixinLibBaseUrl = 'https://raw.githubusercontent.com/d-c-n/dcf/master/assets/dist/scss/mixins/'; // var dcfMixins = [ // '_mixins.backgrounds.scss', // '_mixins.margins.scss', // '_mixins.padding.scss', // '_mixins.typography.scss' // ]; // var allMixinsExist = every(dcfMixins, function(value) { // return fs.existsSync(sassVendorDir + '/' + value); // }); var lessFiles = {}; cssFiles.forEach(function(file) { lessFiles[cssDir + '/' + file + '.css'] = lessDir + '/' + file + '.less'; }); var sassFiles = {}; cssFiles.forEach(function(file) { sassFiles[cssDir + '/' + file + '-5.0.css'] = sassDir + '/' + file + '.scss'; }); var builtJsFiles = {}; builtJsFiles[jsDir + '/search.min.js'] = jsFiles; var autoprefixPlugin = new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions"]}); var cleanCssPlugin = new (require('less-plugin-clean-css'))(); // load all grunt tasks matching the ['grunt-*', '@*/grunt-*'] patterns require('load-grunt-tasks')(grunt); grunt.initConfig({ 'curl-dir': { 'less-libs': { src: wdnMixins.map(function(file) { return wdnMixinLibBaseUrl + file; }), dest: lessVendorDir } // 'dcf-mixins': { // src: dcfMixins.map(function(file) { // return dcfMixinLibBaseUrl + file; // }), // dest: sassVendorDir // } // TODO: add UNLedu 5.0 mixins }, less: { all: { files: lessFiles, options: { paths: [lessDir], plugins: [ autoprefixPlugin, cleanCssPlugin ] } } }, sass: { all: { files: sassFiles, options: { implementation: sass, sourceMap: true // includePaths: [ // __dirname+'/node_modules/modularscale-sass/stylesheets' // ] } }, }, postcss: { options: { processors: [ require('autoprefixer'), require('cssnano')() // TODO: advanced config of cssnano ], map: true }, dist: { src: cssDir + '/*.css' } }, uglify: { options: { sourceMap: true }, all: { files: builtJsFiles } }, requirejs: { all: { options: { appDir: 'www/js/embed-src/', baseUrl: './', dir: 'www/js/embed/', optimize: 'uglify2', logLevel: 2, preserveLicenseComments: false, generateSourceMaps: true, paths: { 'requireLib': 'require' }, map: { "*": { css: 'require-css/css' } }, modules: [ { name: 'all', create: true, include: ['requireLib', 'require-css/css', 'ga', 'main'], exclude: ['require-css/normalize'] } ] } } }, clean: { lessCss: Object.keys(lessFiles).concat(lessVendorDir), // css: Object.keys(sassFiles).concat(sassVendorDir), sassCss: Object.keys(sassFiles), js: Object.keys(builtJsFiles).concat(jsDir + '/**/*.map') }, watch: { less: { files: lessDir + '/**/*.less', tasks: ['less'] }, sass: { files: sassDir + '/**/*.scss', tasks: ['sass', 'postcss'] } } }); // establish grunt default var defaultTasks = ['less', 'sass', 'postcss', 'uglify', 'requirejs']; var localTasks = defaultTasks.slice(); if (!allMixinsExist) { defaultTasks.unshift('curl-dir'); } grunt.registerTask('default', defaultTasks); grunt.registerTask('all-local', localTasks); // legacy targets from Makefile grunt.registerTask('all', ['default']); grunt.registerTask('js', ['uglify']); };