generator-themeplate
Version:
A Yeoman Generator to kickstart WordPress theme development
248 lines (223 loc) • 6.48 kB
text/typescript
/* eslint-disable @typescript-eslint/no-var-requires */
import gulp from 'gulp';
import path from 'path';
import minimist from 'minimist';
import browserSync from 'browser-sync';
import File from 'vinyl';
const plugins = require('gulp-load-plugins')({ maintainScope: false });
const rollupEach = require('gulp-rollup-each');
const argv = minimist(process.argv.slice(2));
const pkg = require('./package.json');
const banner = [
'/*!',
' * <%%= pkg.title %> <%%= pkg.version %>',
' * Copyright (C) <%%= new Date().getFullYear() %> <%%= pkg.author.name %>',
' * Licensed under <%%= pkg.license %>.',
' */',
'',
'',
].join('\n');
const productionMode = argv.production;
process.env.NODE_ENV = productionMode ? 'production' : 'development';
const betterLastRun = function (file: File, task: string, force = false): number {
if (force) {
return 0;
}
const lastRun = gulp.lastRun(task);
const cTime = file.stat?.ctime.getTime() || 0;
if (lastRun >= cTime) {
return 0;
}
return lastRun;
};
gulp.task('rollup', () => rollup());
gulp.task('rollup:forced', () => rollup(true));
const rollup = (force = false): void => {
return gulp
.src(['src/js/**/*.+(j|t)s', '!src/js/**/_*.+(j|t)s'], {
since: (file) => betterLastRun(file, 'rollup', force),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(plugins.sourcemaps.init({ loadMaps: true }))
.pipe(rollupEach(require('./rollup.config.js')))
.pipe(plugins.header(banner, { pkg }))
.pipe(
plugins.rename(function (file: File) {
file.basename = file.basename.replace(path.extname(file.basename), '');
file.extname = file.extname.replace('t', 'j');
})
)
.pipe(plugins.sourcemaps.write('/'))
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/js'))
.pipe(browserSync.stream());
};
gulp.task('uglify', function () {
return gulp
.src(['assets/js/**/*.js', '!assets/js/**/*.min.js'], {
since: (file) => betterLastRun(file, 'uglify'),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(
plugins.uglify({
output: { comments: /^!/ },
})
)
.pipe(plugins.rename({ suffix: '.min' }))
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/js'))
.pipe(browserSync.stream());
});
if (productionMode) {
gulp.task('build:scripts', gulp.series('rollup', 'uglify'));
} else {
gulp.task('build:scripts', gulp.series('rollup'));
}
gulp.task('webp', function () {
return gulp
.src('src/images/**/*.{gif,jpg,png}', {
since: (file) => betterLastRun(file, 'webp'),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(plugins.webp({ quality: 100 }))
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/images'))
.pipe(browserSync.stream());
});
gulp.task('imagemin', function () {
return gulp
.src('src/images/**/*.{gif,jpg,png,svg}', {
since: (file) => betterLastRun(file, 'imagemin'),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(
plugins.imagemin([
plugins.imagemin.svgo({ plugins: [{ removeViewBox: true }] }),
plugins.imagemin.optipng({ optimizationLevel: 7 }),
plugins.imagemin.mozjpeg({ quality: 100 }),
plugins.imagemin.gifsicle({ interlaced: true }),
])
)
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/images'))
.pipe(browserSync.stream());
});
gulp.task('imagecopy', function () {
return gulp
.src('src/images/**/*.{gif,jpg,png,svg}', {
since: (file) => betterLastRun(file, 'imagecopy'),
})
.pipe(gulp.dest('assets/images'))
.pipe(browserSync.stream());
});
if (productionMode) {
gulp.task('build:images', gulp.series('webp', 'imagemin'));
} else {
gulp.task('build:images', gulp.series('webp', 'imagecopy'));
}
gulp.task('sass', () => sass());
gulp.task('sass:forced', () => sass(true));
const sass = (force = false): void => {
return gulp
.src('src/sass/**/*.s+(a|c)ss', {
since: (file) => betterLastRun(file, 'sass', force),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(plugins.sourcemaps.init())
.pipe(
plugins.sass(require('sass'))({
outputStyle: 'expanded',
includePaths: ['node_modules'],
})
)
.pipe(plugins.postcss({ minified: false }))
.pipe(plugins.header(banner, { pkg }))
.pipe(plugins.sourcemaps.write('/'))
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/css'))
.pipe(browserSync.stream());
};
gulp.task('cssnano', function () {
return gulp
.src(['assets/css/**/*.css', '!assets/css/**/*.min.css'], {
since: (file) => betterLastRun(file, 'cssnano'),
})
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(plugins.postcss({ minified: true }))
.pipe(plugins.rename({ suffix: '.min' }))
.pipe(plugins.plumber.stop())
.pipe(gulp.dest('assets/css'))
.pipe(browserSync.stream());
});
if (productionMode) {
gulp.task('build:styles', gulp.series('sass', 'cssnano'));
} else {
gulp.task('build:styles', gulp.series('sass'));
}
gulp.task('watch', function () {
gulp.watch('src/js/**/*.{js,ts}', gulp.series('build:scripts'));
gulp.watch('src/images/**/*.{gif,jpg,png,svg}', gulp.series('build:images'));
gulp.watch('src/sass/**/*.{scss,sass}', gulp.series('build:styles'));
gulp.watch('**/*.php', gulp.parallel('rollup:forced', 'sass:forced'));
});
gulp.task('browsersync', function () {
browserSync.init({
proxy: '<%= opts.localServer %>',
open: false,
notify: false,
});
});
gulp.task('serve', gulp.parallel('watch', 'browsersync'));
gulp.task('bump', function () {
return gulp
.src(['package.json', 'style.css'])
.pipe(
plugins.bump({
type: argv['to-type'],
version: argv['to-version'],
})
)
.pipe(gulp.dest('.'));
});
gulp.task('pot', function () {
return gulp
.src('**/*.php')
.pipe(
plugins.plumber({
errorHandler: plugins.notify.onError('Error: <%%= error.message %>'),
})
)
.pipe(
plugins.wpPot({
domain: '<%= opts.projectSlug %>',
package: '<%= opts.projectName %>',
})
)
.pipe(gulp.dest('languages/<%= opts.projectSlug %>.pot'));
});
gulp.task('build', gulp.parallel('build:images', 'build:scripts', 'build:styles'));
gulp.task('default', gulp.series('build', 'serve'));