uktrade/directory-components

View on GitHub
gulpfile.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const path = require('path');
const gulp = require('gulp');
const gutil = require('gulp-util');
const cssnano = require('gulp-cssnano');
const sourcemaps = require('gulp-sourcemaps');
const del = require('del');
const rename = require('gulp-rename');
const runsequence = require('run-sequence');
const sass = require('gulp-sass');
const sassLint = require('gulp-sass-lint');
const autoprefixer = require('gulp-autoprefixer');

const PROJECT_DIR = path.resolve(__dirname);
const FLAGS_SRC = [
  `${PROJECT_DIR}/node_modules/flag-icon-css/**/*.svg`,
  `${PROJECT_DIR}/node_modules/flag-icon-css/**/*.min.css`,
];
const FLAGS_DEST = `${PROJECT_DIR}/directory_components/static/directory_components/vendor/flag-icons`;

// Sass lint -----------------------------

gulp.task('lint:sass', function () {
  return gulp.src('directory_components/export_elements/**/*.scss')
    .pipe(sassLint({
      options: {
        formatter: 'stylish',
        'merge-default-rules': true
      },
      configFile: 'sass-lint-config.yml'
    }))
    .pipe(sassLint.format())
    .pipe(sassLint.failOnError());
});


// Run tests -----------------------------

gulp.task('test', () => {
  runsequence(['lint:sass'], cb => {
    if (cb) {
      gutil.log(gutil.colors.red('!!!!!!!! Tests failed !!!!!!!!'));
    } else {
      gutil.log(gutil.colors.green('**** Tests finished with no errors ****'));
    }
  });
});

// Clean task ----------------------------
// Deletes the /directory_components/static/directory_components/export_elements directory
// ---------------------------------------

gulp.task('clean', () => {
  return del('directory_components/static/directory_components/export_elements');
});

// GovUK styles build task ---------------
// Compiles CSS from Sass
// Output both a minified and non-minified version into
// /directory_components/static/directory_components/export_elements/stylesheets/
// ---------------------------------------

gulp.task('styles:govuk', function() {
  return gulp.src('node_modules/govuk-elements/assets/sass/**/*.scss')
    .pipe(sourcemaps.init())
    .pipe(sass({
      includePaths: [
        'node_modules/govuk_frontend_toolkit/stylesheets',
      ],
      importer: require('./sass-importer.js')
    }).on('error', sass.logError))
    .pipe(autoprefixer({
      browsers: ['last 2 versions'],
      cascade: false
    }))
    .pipe(gulp.dest('directory_components/static/directory_components/export_elements/stylesheets'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(cssnano())
    .pipe(sourcemaps.write('./maps'))
    .pipe(gulp.dest('directory_components/static/directory_components/export_elements/stylesheets'));
});

// Export-elements-specific component styling

gulp.task('styles:components', () => {
  return gulp.src('directory_components/export_elements/sass/components/elements-components.scss')
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer({
      browsers: ['last 2 versions'],
      cascade: false
    }))
    .pipe(gulp.dest('directory_components/static/directory_components/export_elements/stylesheets'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(cssnano())
    .pipe(sourcemaps.write('./maps'))
    .pipe(gulp.dest('directory_components/static/directory_components/export_elements/stylesheets'));
});

// Flag icons

gulp.task('flags', function() {
  return gulp.src(FLAGS_SRC)
  .pipe(gulp.dest(FLAGS_DEST));
});

// Compile all styles

gulp.task('styles', [
  'styles:govuk',
  'styles:components',
]);

// Images build task ---------------------
// Copies images to /directory_components/static/directory_components/export_elements/images
// ---------------------------------------

gulp.task('images', () => {
  return gulp.src([
    'node_modules/govuk-elements/assets/images/**/*',
    'node_modules/govuk_frontend_toolkit/images/**/*'
  ])
    .pipe(gulp.dest('directory_components/static/directory_components/export_elements/images'));
});

// Build task ----------------------------
// Runs tasks that copy assets to the
// /directory_components/static/directory_components/export_elements directory.
// ---------------------------------------

gulp.task('build', cb => {
  runsequence('clean', ['styles', 'images', 'flags'], cb);
});

// Watch task ----------------------------
// When a file is changed, re-run the build task.
// ---------------------------------------

gulp.task('watch', () => {
  return gulp.watch([
    './directory_components/export_elements/**/*.scss'
  ], ['styles']);
});

// Default task --------------------------
// Lists out available tasks.
// ---------------------------------------

gulp.task('default', () => {
  const cyan = gutil.colors.cyan;
  const green = gutil.colors.green;

  gutil.log(green('----------'));

  gutil.log(('The following main ') + cyan('tasks') + (' are available:'));

  gutil.log(cyan('build') + ': compiles assets.');
  gutil.log(cyan('watch') + ': compiles assets and watches for changes.');
  gutil.log(cyan('test') + ': runs tests/lint.');

  gutil.log(green('----------'));
});